Build a Resume
Produce an evidence-based resume readable by humans and reliably extractable by modern applicant tracking systems. There is no universal ATS score or format guaranteed to pass every system.
Contract
- Input: Supported profile/ facts, selected project evidence, brand/ guidance and an optional research/opportunities/ role.
- Scope: Author or tailor a truthful resume; do not alter career facts to match the vacancy or submit an application.
- Output: Resume sources/exports in assets/drafts/resumes/; explicitly approved versions in assets/staged/resumes/, with verification and intentional tailoring recorded.
Steps
-
Read an existing resume, verified career profile or supplied experience. Accept a partial source: do not require a canonical repository. Identify target role, location, language, job description and desired length/format when available. If a configured career source path no longer resolves, use
validate-workspacewhen installed for that specific mapping; otherwise continue from available evidence or propose a path correction. -
Identify the strongest relevant evidence. Build a career narrative with correct role names, organizations, dates, responsibilities and contributions. Treat approximate achievements as approximate; ask or flag when important factual evidence is missing.
-
Write a concise summary and accomplishment-oriented experience bullets. Use language from a supplied job posting naturally only where supported by evidence. Differentiate individual contribution from team outcomes.
-
Structure the resume with conventional headings, single-column reading order, selectable text and usable links. Write
resume.jsonin the output folder using only facts supported by the records from steps 1–3. Takenameandcontactfromprofile/contact.md; when it is missing or has no name, ask the user for the name and the contact lines to show, and never use a placeholder. Each field holds one kind of fact; dates go indates, never insideorganization:{"name": "Full Name", "headline": "Target role", "contact": ["City, Country", {"text": "site.example", "url": "https://site.example"}], "sections": [{"title": "Summary", "text": "..."}, {"title": "Experience", "entries": [{"title": "Role", "organization": "Employer", "dates": "Mar 2021 – present", "location": "City", "bullets": ["..."]}]}, {"title": "Skills", "lines": [{"label": "Cloud", "items": ["Azure", "Terraform"]}]}]}Then run, adding
--brand <root>/brand/identity.mdwhen that file exists:python3 <skill-dir>/scripts/build_resume.py <out>/resume.json --out-dir <out> --brand <root>/brand/identity.md --jsonThe script applies colours and fonts from the identity file's brand-tokens block (format) only when its status is
approved. Pending tokens: ask the user whether to use them (--allow-pending) or keep the neutral default. Report thebrandfield and every font or colour warning; never write or approve tokens here.<out>isassets/drafts/resumes/<name>/inside the career workspace root (next to itsREADME.md). Fix every entry inwarningsthat is a data mistake; ask the user for a missing name instead of using a placeholder. The script writesresume.tex(built from the blocks intemplates/career-resume.sty), a Markdown copy, and compiles a PDF with the first engine found:tectonic,latexmk,xelatex,lualatexorpdflatex. If the user wants another layout, edit the generated.texor the copied.styand re-run the engine; keep the blocks. -
Read the script's JSON status. Exit
0: a PDF exists and was checked (pages,text_extracted); look at page 1 as an image when you can (for examplepdftoppm -png -r 80 -f 1 -l 1). Exit3: no TeX engine, so only.texand.mdexist; say so, give the install hint, and do not claim a PDF. Exit2: show the error and fix the.tex. Exit1: fixresume.json. Then validate claim provenance, chronology, spelling, length, relevance, links and reading order, and name the checks you could not run. -
Report meaningful changes and unresolved evidence gaps. Never silently modify the canonical professional profile as part of tailoring.
Output
Resume source and requested exports when possible, plus a concise validation summary: relevance choices, verified key claims, format checks and any unresolved assumptions.
When the workspace has a root README.md index, add a link to each new record under Records.
Done when
- No fabricated title, skill, certification, metric or business impact appears.
- Target keywords appear only where truthful, without keyword stuffing.
- Resume remains scannable for a human and reasonably parseable by text extraction.
- A PDF is reported only when
build_resume.pyexited0; otherwise the.texand.mdare delivered with the reason no PDF exists. - Material career evidence is not silently dropped merely to hit a page count.
- Limitations are described instead of asserting an unsupported ATS success percentage.
