mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-03 10:13:47 +10:00
* feat(ats): add ATS checker and replace resume analysis Adds a public, browser-only ATS checker at /ats-checker and an ATS Check section in the builder's right sidebar. PDFs are parsed locally: text extraction, reading order, contact and date recovery, section detection, and file-level readability are scored deterministically, with evidence cited per finding and skipped checks reported rather than counted as passes. Removes the AI-scored resume analysis it supersedes: the resume_analysis table (dropped via migration), the get_resume_analysis MCP tool, and POST /ai/analyze-resume. The replacement, POST /ai/ats-review, reviews extracted resume text and returns qualitative feedback with no score. Also bumps the version to 5.2.9 and adds the changelog entry. * chore(deps): bump workspace dependencies * fix(ats-checker): keep negation inside each 'what this does not do' bullet The three bullets were bare fragments whose negation came from the section heading, which translators never see. A dozen locales rendered them as affirmative assertions or imperatives, so the page claimed the checker enforces a one-page rule and predicts rejection -- the opposite of the source, and directly contradicted by the sentence beside it. Each bullet now carries its own negation, so the polarity cannot be lost in translation. Re-extracted and refilled across all 53 target locales.
ATS extraction fixtures
Minimal, hand-authored PDFs for src/ats-extraction.integration.test.tsx. Each one isolates a
single file-level defect the ATS checker claims to detect, so the test proves the claim against a
real PDF reader rather than against a hand-built extraction object.
They are written uncompressed, so cat shows the whole file. Nothing here came from a third party:
every byte was generated for this repository, and none of them contain personal data.
| File | What it is | What it proves |
|---|---|---|
image-only-scan.pdf |
One page, one image scaled to fill the page, no text operators. | The image-coverage measurement is real page area, and NO_TEXT_LAYER / IMAGE_ONLY_DOCUMENT fire together on a scan. |
type3-font.pdf |
One page of text set in a Type 3 font whose glyph procedure draws a rectangle. | isType3Font is read off the font object, and TYPE3_FONT caps the score. |
outlined-text.pdf |
672 filled rectangles laid out like lines of text, and no text operators at all. | Text converted to vector outlines looks like a page to a human and like nothing at all to a parser. |
Regenerating
There is no build step. To change one, edit the bytes directly or re-derive it: each file is a
five-to-seven object PDF with a correct xref table, and the offsets must be updated if the object
bodies change. Keep every fixture under 50 KB — they exist to make one assertion each, not to be
realistic resumes.