Tailoring a CV
The tailoring pipeline is a Claude Code skill, not a build script — the interesting parts are conversations, and two of them are approvals.
/sumisura:tailor-cvThree ways to start
Section titled “Three ways to start”| Input | What happens |
|---|---|
| A job description (pasted text or a URL) | Selection and Rewrite target that job; a cover letter is drafted too |
| A tracked Application (“the Acme backend role”) | Same, using the Job Description already saved, and the Generation is recorded back against that Application |
| Nothing (Default Mode) | A general-purpose CV from your strongest material — no cover letter |
The pipeline
Section titled “The pipeline”- Selection — which Entries belong on this one page.
- Rewrite — bullets re-worded toward the job’s language, your About me
(
summary) adapted the same way, and a row of at most ten of each Entry’s own tags picked for the job, and the headline and each employer’s role chosen from the options your profile lists. Plus a cover letter draft when there is a job, drawn from your Cover Letter Snippets if you have any. - Prose clean-up — the rewritten bullets and the cover letter go through the
clean-user-facing-textskill (an upstream skill pinned by commit and hash, downloaded on first use): a style score, a deterministic pass that removes invisible Unicode and typographic artefacts, and a rewrite only when the score is high, under the same no-new-facts rule. You see the scores and the cleaned text at Text Review. Needs Python 3.10+ (standard library only); without it the skill stops and asks you to install it. - Groundedness check — every rewritten bullet compared against its source.
- Text Review — you approve. CV and cover letter are approved independently. Nothing renders before this.
- Render — Typst produces the PDFs.
- PDF checks — page count, the ATS Report (see below), and the document language.
- Visual Review — you approve the rendered result.
The prose clean-up is the one step that changes text, and it does so before
Text Review, where you see the result. Checks are advisory by design: exit 0 clean, 1 flagged, 2 could not run.
They inform a checkpoint where you are already looking; they never block or
silently edit.
The ATS Report
Section titled “The ATS Report”Applicant tracking systems read a PDF’s text layer, not its layout. Every Generation keeps an ATS Report of what that layer says, for the CV and the cover letter:
- The extracted text, top to bottom, as a screener reads it.
- Field by field: your name, contact details (email, phone, LinkedIn, GitHub), each section header, each employer and project. Each one is found, missing or out of order. Anything missing or out of order turns the report into a warning.
- Job Description terms: which of the job’s terms that are also tags in your Master Data made it onto this CV. Only your own tags count, so the report never nudges you to claim a skill you don’t have. This part is for information and never raises a warning. It is left out in Default Mode.
The report is saved with the Generation, so you can reopen it right before you
send the CV, even after output/ is cleaned up. Open it from Open the ATS
Report at Visual Review, from an Application’s Generation history, or from
Generated CVs. A Generation made before reports were kept says so instead
of showing a pass.
Where the files go
Section titled “Where the files go”Every run gets its own directory, so a later run never overwrites an earlier one:
output/<label>-<UTC yyyymmdd-hhmmss>/├── cv.pdf├── cover-letter.pdf├── data.json # what the template rendered├── ats-report.json # the ATS Report└── selection.json # Entries chosen + every source→rewrite pairselection.json is what lets a groundedness verdict be re-derived later.
output/ is gitignored and safe to delete; Application records survive and show
a “no longer on disk” note.
Running a check by hand
Section titled “Running a check by hand”./plugins/sumisura/skills/tailor-cv/scripts/quality-check.sh \ groundedness --selection output/<slug>/selection.json
./plugins/sumisura/skills/tailor-cv/scripts/quality-check.sh \ pdf --pdf output/<slug>/cv.pdf --data output/<slug>/data.jsonBoth wrap backend/cmd/cvcheck, the same Go code the web app calls. Add
--json for machine-readable output. groundedness reads Master Data from
data/ unless you pass --data-dir <dir>. No running backend is needed.
pdf takes a few more options for the full ATS Report:
--job-description <file>adds Job Description term coverage. The tags come fromdata/, or from--data-dir <dir>.--cover-letter output/<slug>/cover-letter.pdf --cover-letter-data output/<slug>/cover-letter-data.jsonchecks the cover letter too.--report-out output/<slug>/ats-report.jsonwrites the report file the skill later attaches to the Generation record.
Rendering manually
Section titled “Rendering manually”typst compile --root . template/cv.typ output/<slug>/cv.pdf \ --input data=output/<slug>/data.jsonThe templates are pure presentation: they read one JSON file and lay it out.
Changing your CV’s look means editing template/cv.typ, not the pipeline.