Skip to content

Phase 2: check CVs and cover letters against the persona and the ad - #24

Merged
coderback merged 2 commits into
mainfrom
feat/doc-checks
Oct 16, 2026
Merged

coderback merged 2 commits into
mainfrom
feat/doc-checks

Conversation

@coderback

Copy link
Copy Markdown
Owner

Summary

The first part of Phase 2 (CVs and cover letters): every tailored CV and cover letter is checked against the candidate's own data and the job ad, both while it's generated and in the job workspace.

  • Document check (api/app/doc_check.py, no model calls). For a CV or letter it reports:
    • the ad's technical terms, split into those the document shows, those the candidate has but it leaves out, and real gaps (never added);
    • numbers, technologies, employers and project names the persona doesn't contain, field by field (a letter may also quote the ad);
    • words recruiters read as machine-written;
    • the rendered PDF read back as plain text, as an ATS reads it: name, email and phone, section headings in order, every skill, role dates, page count.
  • POST /documents/check returns that report for the signed-in user.
  • Generation:
    • A tailored CV gets the ad's terms that are among the candidate's own skills added to the right skills row (profile spelling only).
    • When the check flags a claim or a word, one targeted revision runs on the CV text or the letter's paragraphs. It is kept only if it clears findings without adding new ones.
  • Job workspace: a Checks strip on the CV and cover-letter steps re-runs a moment after each edit. Its details list the keywords, each flagged claim and where it is, and every ATS read-back check.

Real-model run

Five stored jobs, against the real persona and model:

  • CVs: all 5 came back with no unsupported numbers, tools, employers or projects, on one page, and reading back cleanly from the PDF.
  • Cover letters: 2 of 5 had one flagged claim; the revision cleared both.

Testing

  • API suite: 680 passed. The new tests cover:
    • term and number matching, including ordinary words like "rest", years, dates and ranges;
    • the keyword split and the fact and style findings;
    • the endpoint;
    • the skills top-up;
    • revision kept, dropped when it invents something new, and dropped when the reply has the wrong shape;
    • letter revision.
  • The PDF read-back tests run in the API image, where WeasyPrint loads: 24 passed.
  • Frontend build and lint pass. The e2e mocks can now stream SSE, and a new smoke test walks the workspace from fit analysis to a checked CV: 10 passed.

A new doc_check module, with no model calls, reports for a CV or cover letter:
- the ad's technical terms the document shows, the ones the candidate has but
  it leaves out, and real gaps (never added);
- numbers, technologies, employers and project names the persona doesn't
  contain, field by field (a letter may also quote the ad);
- words recruiters read as machine-written;
- the rendered PDF read back as plain text, as an ATS reads it: name, contact,
  section headings in order, every skill, role dates, page count.
POST /documents/check returns the report for the signed-in user.

Generation uses it. A tailored CV gets the ad's terms that are among the
candidate's own skills added to the right skills row. When the check flags
a claim or a word, one targeted revision runs on the CV text or the letter's
paragraphs, and is kept only if it clears findings without adding new ones.
On the real model, 5 of 5 CVs came back clean and 2 of 5 letters had one
flagged claim, which the revision cleared.
The tailored CV and cover letter steps show a Checks strip that re-runs a
moment after each edit: keywords from the ad (CV only), claims to check and
whether the PDF reads cleanly in an ATS. Details list the keywords shown,
the ones you have but the CV leaves out, real gaps, each flagged claim with
where it is, and every ATS read-back check.

The e2e mocks can now reply with an event stream, and a new smoke test walks
the workspace from fit analysis to a checked tailored CV.
@coderback
coderback merged commit 4a9ce40 into main Oct 16, 2026
4 checks passed
@coderback
coderback deleted the feat/doc-checks branch October 16, 2026 01:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant