cv-craft
Skill0 starsChanged 8 days agoMITView on GitHub
Maintain a canonical master CV in Markdown and produce tailored, ATS-friendly resumes, recruiter-screen prep packs and interview story banks. Seven modes. bootstrap (build master via interview), sync (import an existing resume, optional standalone rewrite), check (fit and eligibility against a JD, no CV written), tailor (CV matched to a JD), screen-prep (first recruiter-call answers), linkedin-align (profile vs master), and evidence (audit git, PRs, tickets and production data into an evidence catalog, ownership audit, story bank and question map). Use when the user asks to update, rewrite or tailor a CV, check a job description or whether a role is worth applying to, prep a recruiter screen or interview, build interview stories, verify CV claims against real evidence, prepare after a rejection, align LinkedIn, import a resume PDF/docx, or runs /cv-craft.
- Installs packages
1 other project uses a version of this.
Adopted by
Most recently taken up by
- thestratcore/My-skillstheir own version, first seen Jul 10, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- thestratcore/My-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository31 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- ai-estimateSkill
- aso-craftSkill
- audit-reportSkill
- babysit-prsSkill
- blueprintSkill
- brag-docSkill
- business-briefSkill
- cagan-checkSkill
- code-craftSkill
- commit-reportSkill
- compassSkill
- dev-flowSkill
- grill-meSkill
- implementation-reviewSkill
- llm-wikiSkill
- parallel-worktreesSkill
- periscopeSkill
- portfolio-syncSkill
- pr-craftSkill
- problem-solvingSkill
- publish-skillSkill
- review-passSkill
- security-auditSkill
- semverSkill
- sentinelSkill
- seoSkill
- testing-philosophySkill
- to-prdSkill
- write-a-skillSkill
- wstg-security-testingSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
28 rules. About 0 are common, 19 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈19
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Read before every mode. Violating these destroys candidate credibility in interviews.
- Very specific: line 15
Never fabricate metrics: If the source has no number and none can be reasonably estimated from surrounding text, write the bullet …
- Distinctive: line 18
Surface inferred target profile: When no JD is supplied (sync standalone rewrite, bootstrap polish), infer role / seniority / …
- Very specific: line 29
Read or create cv-master.md per MASTER_TEMPLATE.md.
- Distinctive: line 30
Run the per-mode flow below.
- Very specific: line 37
If found, derive paths from <dir>:
- Distinctive: line 47
After the user answers, save a memory reference entry so future runs do not re-prompt.
- Very specific: line 63
If the master file does not exist at the resolved path and the user is not in bootstrap mode, ask whether to bootstrap or sync first — do …
- Very specific: line 80
Use the schema in MASTER_TEMPLATE.md.
- Distinctive: line 82
After all sections collected, run a lite audit before final write: categories 2 (XYZ compliance), 3 (structure), 5 (voice) from the ATS …
- Distinctive: line 94
Run a section-by-section diff: show what is new, what is updated, what is removed.
- Distinctive: line 96
Run the lite audit (categories 2, 3, 5) on the merged result before final write.
- Distinctive: line 104
Group small side projects under company experience: instead of separate section, unless Projects threshold met.
- Distinctive: line 111
Run full ATS audit. Render score.
- Distinctive: line 128
Identify the gate: Every role has one thing that decides it.
- Distinctive: line 136
Compare against other live roles: when the user is running several, and say where the preparation hours pay off best.
- Distinctive: line 153
Check what this company already saw: If an earlier application to the same company carried a number or wording that has since been …
- Distinctive: line 163
Hard gate: if score < 80, do not write.
- Distinctive: line 164
After score ≥ 80 (or override): show the user JD requirements → covered master entries.
- Very specific: line 168
Record what was sent: When the user confirms the application went out, add a row to career-evidence/README.md's "what each live process has …
- Distinctive: line 191
Always confirm before writing.
- Distinctive: line 193
After writing, update the gap ledger with anything from the "Gaps and risks" section.
- Distinctive: line 211
Do not claim to know LinkedIn's live ranking weights.
- Very specific: line 217
Read-only on every source.
- Distinctive: line 221
Scope and identity: Ask which employers, repos and date range to cover, and any interview feedback to answer (quote it at the top of the …
- Very specific: line 268
After writing cv-master.md (sync / bootstrap), any tailored CV (tailor), or any standalone rewrite (sync (b)), offer to render a paired …
- Distinctive: line 272
The portal states a preference: use it.
- Very specific: line 286
Check pandoc is available: pandoc --version.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
cv-craft
Maintain a master CV in Markdown and produce tailored CVs + recruiter-screen prep packs from it. Path-agnostic: the user picks where files live, the skill remembers it.
Non-negotiable rules
Read before every mode. Violating these destroys candidate credibility in interviews.
- Never fabricate metrics. If the source has no number and none can be reasonably estimated from surrounding text, write the bullet qualitatively. Mark missing metrics inline with
[DADO AUSENTE: qual era X?]. Mark inferred-but-reasonable metrics with[ESTIMADO]. - Never delete information silently. Anything removed from the source goes into the post-CV change log with a one-line justification. The candidate can restore it on the next pass.
- Never alter facts. Job titles, employers, dates, technologies, and accomplishments must match the source exactly. Rewrite form, not content.
- Surface inferred target profile. When no JD is supplied (sync standalone rewrite, bootstrap polish), infer role / seniority / specialization / company type from the source. Declare it in the post-CV section so the candidate can correct.
- Never claim more ownership, status or certainty than the evidence shows. "Own X end to end" when a teammate has more commits, "shipped" for something on staging, or a ratio from one smoke test all fall apart on the first follow-up question. Use the ownership ladder, a status as of a date, and a provenance line for every number.
See REFERENCE.md — Data integrity and Post-CV section template.
Quick start
- Detect mode from the user's request:
bootstrap|sync|check|tailor|screen-prep|linkedin-align|evidence. Ask if ambiguous.- A pasted JD with "check this", "what do you think", "should I apply", "am I a fit", or no instruction at all is
check, nottailor. Do not write a CV until asked. - "Build my interview stories", "audit my CV claims", "what did I actually own", or interview feedback after a rejection is
evidence.
- A pasted JD with "check this", "what do you think", "should I apply", "am I a fit", or no instruction at all is
- Resolve the CV directory (see Path resolution below). All artifacts live there.
- Read or create
cv-master.mdper MASTER_TEMPLATE.md. - Run the per-mode flow below. Always preview, wait for confirmation, then write.
Path resolution
The skill is path-agnostic. Resolve in this order before any read or write:
- Check memory for a
reference-type entry naming the user's CV directory (look for an entry withcv-craftorCV directoryin its name/description). - If found, derive paths from
<dir>:- Master:
<dir>/cv-master.md - Tailored:
<dir>/cv-{company}-{role-slug}.md - Screen-prep:
<dir>/screen-prep-{company}-{role-slug}.md - Stylesheet:
<dir>/cv-style.css - Gap ledger:
<dir>/gap-ledger.md(see Gap ledger) - Career evidence:
<dir>/career-evidence/(see evidence)
- Master:
- If not in memory, ask the user:
- In
sync/tailor/screen-prep: "Where is your master CV? (paste an absolute path, or tell me the folder it lives in)" - In
bootstrap: "Where should I create your master CV? (paste an absolute folder path; I'll putcv-master.mdand outputs there)"
- In
- After the user answers, save a memory reference entry so future runs do not re-prompt. Format:
And add a one-line pointer to--- name: cv-craft directory description: Where cv-craft stores the user's master CV, tailored CVs, screen-prep packs, and stylesheet type: reference --- CV directory: `<absolute-path>` - Master: `<dir>/cv-master.md` - Stylesheet: `<dir>/cv-style.css` - Tailored CVs: `<dir>/cv-{company}-{role-slug}.md` - Screen-prep: `<dir>/screen-prep-{company}-{role-slug}.md` - Gap ledger: `<dir>/gap-ledger.md`MEMORY.md. - If the master file does not exist at the resolved path and the user is not in
bootstrapmode, ask whether to bootstrap or sync first — do not invent content.
Modes
bootstrap — new master from scratch
Interview the user one section at a time, with concrete prompts and an example answer. Save the partial draft to cv-master.md after each section so progress is preserved. Sections (in order):
- Contact, location, work authorization
- Headline (role + years experience)
- Summary (3–5 sentence pitch — Identity / Scale / Complexity layers, see REFERENCE.md)
- Skills (grouped by category — Languages, Frameworks, Databases, Cloud/DevOps, Tools. No ratings, see REFERENCE.md)
- Professional experience (per role: company, title, dates, location, 3–6 bullets, stack; for unknown employers add company context line)
- Education
- Side projects worth listing (only if Projects threshold met)
- Languages, certifications, awards (optional)
Use the schema in MASTER_TEMPLATE.md. Apply XYZ method to every bullet at write-time. For missing metrics use [DADO AUSENTE: qual era X?]; for reasonable inferences use [ESTIMADO] (see Data integrity).
After all sections collected, run a lite audit before final write: categories 2 (XYZ compliance), 3 (structure), 5 (voice) from the ATS rubric. Skip categories 1 and 4 (no JD yet, length is uncapped on master). Report bullets needing a metric and any anti-pattern hits; ask before fixing.
sync — import an existing resume (and optional standalone rewrite)
Accept any input format. Read with the Read tool — it handles .md, .txt, .pdf. For .docx, ask the user to paste the text or convert to PDF first.
Two sub-flows:
(a) Merge into master (default when cv-master.md exists, or user wants ongoing maintenance):
Map the source into the master schema. Where the source omits a field, insert <!-- TODO: ask user --> and ask the user to fill it after the initial import.
Run a section-by-section diff: show what is new, what is updated, what is removed. Wait for confirmation per section before merging.
Run the lite audit (categories 2, 3, 5) on the merged result before final write. Source resumes often carry weak verbs, AI-tell words, and em-dashes — surface them and offer rewrites.
(b) Standalone rewrite (user uploads a CV and wants a polished version without a JD, or asks "rewrite my CV"):
- Infer target profile from the source: most likely role, seniority (Junior / Mid / Senior / Staff / Principal), specialization, target company type (early-stage startup / scale-up / big tech). Use this internally to prioritize emphasis. See REFERENCE.md — Inferred target profile.
- Rewrite bullets with the formula: strong action verb + specific technical context + measurable impact. Use the three-tier metric system: existing metric → use directly; estimable → mark
[ESTIMADO]; missing → write qualitatively and append[DADO AUSENTE: qual era X?]. Never invent. - Rewrite summary per three-layer structure (Identity / Scale / Complexity). Banned vague buzzwords list applies.
- Consolidate Skills into single grouped section (Languages · Frameworks · Databases · Cloud/DevOps · Tools). Drop ratings entirely. Drop tech that appears nowhere in experience.
- Group small side projects under company experience instead of separate section, unless Projects threshold met.
- Add context lines for non-globally-known employers (see REFERENCE.md — Company context).
- Group same-company promotions under one header; flag acquisitions explicitly (see REFERENCE.md — Career progression).
- Strict length per REFERENCE.md — Length: 1 page under 5 years; 1 page by default at 5–7 years, 2 only when content fills them; max 2 at 8+; never a partial second page. Section order: Summary → Experience → Technical Skills → Education → Projects (if applicable).
- Strip
Stack:lines per role from output. Tech context belongs inline in bullets or in the consolidated Technical Skills section. - Achievement re-pass on every bullet. Re-read each asking "what changed because this was built?" If only "the feature exists", rewrite to name an outcome (REFERENCE.md — Achievements over tasks) or tag
[DADO AUSENTE: ...]. - Prune obsolete / low-relevance tech from Skills given the inferred profile. Log removed items in post-CV §B.
- Run full ATS audit. Render score. Below 80 → list failures, propose fixes, ask before write.
- Write the rewritten CV to
<dir>/cv-rewrite-{YYYYMMDD}.md(do not overwrite master). Then append the Post-CV section in Brazilian Portuguese. - Offer export (DOCX + PDF, see Export).
check — fit assessment before committing to an application
Answers "is this worth applying to, and what will they push on?" Produces no CV file. The only thing written is the gap ledger. Output is a conversational assessment in the chat.
Runs before tailor most of the time. When the user then asks to tailor, reuse this analysis rather than redoing it.
Steps:
- Check eligibility first, before anything else. Location, work authorization, employment structure (EOR, W2, contractor), timezone-overlap requirements. If the role is structurally closed to the user, say so in the first line and stop the deep analysis. Nothing else matters if they cannot be hired.
- Predict the knockout questions. The instant, no-human-review rejections come from screening questions the recruiter configures on the application form (work authorization, country, years of X, willingness to work a timezone, notice period), not from the resume file. List the ones this JD implies and the honest answer to each. A resume cannot rescue a wrong form answer, and an honest "no" on a hard requirement means stop.
- Ask about a referral path, right after eligibility and before any CV work. In Ashby's data across 38M applications, referrals are 1 to 2% of applications but reach interview at about 40%, against about 3% for cold inbound. No resume change comes close. Ask: does the user know anyone there, or two steps away? Who at the company posts about the team (engineering manager, recruiter)? If a path exists, the next move is a short message to that person, drafted but never sent without approval; the CV follows. Record the answer so
tailordoes not re-ask. - Search the CV directory for prior artifacts for this company before assessing:
cv-{company}-*,screen-prep-{company}-*,application-*{company}*,cover-*{company}*, and any take-home or design doc naming them. A prior application changes the entire conversation and missing one is a serious error. If found, read it, say when it was sent, and ask what the outcome was. - Extract JD signals per REFERENCE.md — JD signal extraction.
- Identify the gate. Every role has one thing that decides it. It is either:
- Stated — an explicit disqualifier ("walk us through an agentic system you shipped; if you can't, this isn't the role"). Check it directly and say plainly whether the user clears it.
- Unstated — implied by scale claims, customer names, or funding language ("millions of requests", "$35M ARR"). These are more dangerous precisely because they do not read as requirements until the interview. Name which kind it is. This distinction is usually the single most useful thing in the assessment.
- Weigh the company's own hiring process, when the JD describes it. A process that scores an asynchronous design exercise discounts missing operating history; a process built on resume screening does not. The same gap costs different amounts at different companies, and that changes the recommendation.
- Map requirements to evidence in three buckets: strong (with the specific artifact), partial (and what is actually missing), gap (zero). Pull from the master and the portfolio archive if one exists — strong material is often sitting outside the master.
- Give a verdict with a number (x/10) and a one-line reason. Do not hedge into uselessness.
- Separate closeable gaps from unwinnable ones. For closeable, name the specific move and an estimate in hours. For unwinnable by a side project (production volume at scale, GPU fleets, formal oncall), say so plainly rather than prescribing a grind.
- Compare against other live roles when the user is running several, and say where the preparation hours pay off best.
- Name the honest answer for each weak point, in the words the user should actually say. The deliverable is not just "you have a gap", it is what to say when asked about it.
- Update the gap ledger.
- Offer
tailorandscreen-prepas next steps. Do not run them unprompted.
Flag red flags from the JD too (unpaid take-homes, vague comp, unrealistic stack breadth, pace language implying unacknowledged on-call). Surface comp guidance without inventing numbers: if no band is posted, say so and advise making them name it first.
tailor — CV matched to a job description
Required inputs (ask if missing): job description (text, URL, or file), company name, role title.
If check already ran on this JD, reuse its analysis. Do not re-derive the gate, the requirement mapping, the knockout answers, or the gaps. If check did not run, still ask the eligibility and referral questions from check steps 1 and 2 first, in two lines, then tailor.
Steps:
- Extract from JD: required skills, preferred skills, responsibilities, seniority, domain, company keywords. Build the requirement set
Kfor scoring, must-haves marked. - From
cv-master.md, select and rephrase matching experiences and bullets — never invent. Rewrite each kept bullet with strong action verb + specific technical context + measurable impact (XYZ method — see REFERENCE.md). Apply the three-tier metric system — flag[ESTIMADO]or[DADO AUSENTE: ...]when needed.- If
<dir>/career-evidence/exists, it outranks the master. Check every kept bullet againstownership-audit.md(the verb matches what was the user's),cv-audit.md(no Fix or Tighten item comes back), and the catalog's provenance and status lines. Prefer bullets backed by a story card: a bullet that leads into a rehearsed 90-second story is worth more than one that doesn't. Every number on the CV gets its provenance line in post-CV §C. - Check what this company already saw. If an earlier application to the same company carried a number or wording that has since been corrected, use the corrected form and put the correction line in post-CV §C.
- If
- Consolidate Skills into single section grouped by category (Languages · Frameworks · Databases · Cloud/DevOps · Tools). Lead each category with JD-relevant items the user actually has. No ratings. Match JD vocabulary verbatim where the user has the underlying skill, and make sure every must-have also appears in a bullet that shows it in use. AI-assisted review grades per requirement and reviewers tend to follow the grade, so a must-have that lives only in the Skills list is a weak spot (see REFERENCE.md — Tailoring rules).
- Rewrite the summary per three-layer structure (Identity / Scale / Complexity), 3–5 lines, aligned to the role. Apply voice rules — banned-buzzword list, no em-dashes, no AI-tell words.
- Strict length per REFERENCE.md — Length: 1 page under 5 years; 1 page by default at 5–7 years, 2 only when content fills them; max 2 at 8+; never a partial second page. Drop weakest bullets first when trimming.
- Add context lines for non-globally-known employers. Group promotions under one header. Flag acquisitions explicitly. See Company context and Career progression.
- Group small side projects under company experience instead of separate section, unless Projects threshold met.
- Strip
Stack:lines per role from output. Tech context belongs inline in the bullet or in the consolidated Technical Skills section, not duplicated under every role. Master keeps Stack lines; tailored output does not. - Achievement re-pass on every bullet. Re-read each kept bullet asking "what changed because this was built?" If the answer is only "the feature exists", rewrite to name an outcome (see REFERENCE.md — Achievements over tasks) or tag
[DADO AUSENTE: ...]. - Prune obsolete / low-relevance tech from Skills given the inferred profile. Log removed items in the post-CV §B change log so the candidate can restore.
- Score the draft against the ATS rubric. Render the full score block (5 categories, breakdown, failing items). Auto-apply fixes for em-dashes, AI-tell words, and bullet rewrites; surface gap-skills and missing-metric bullets to the user.
- Hard gate: if score < 80, do not write. Show the failing items, propose fixes, ask the user to approve fixes or override the gate.
- After score ≥ 80 (or override): show the user JD requirements → covered master entries; remaining gaps. Wait for confirmation. Write to the tailored output path. Append the Post-CV section in Brazilian Portuguese, including a defense line for every metric kept (REFERENCE.md — Every number needs a defense).
- Update the gap ledger with every requirement the master could not support, including the ones deliberately left off the CV. Same turn, not a follow-up offer.
- Offer export (DOCX + PDF, see Export).
- Offer a cover letter when the portal accepts one and the fit is strong. In the one large field experiment found (n=7,287 applications), tailored cover letters raised callbacks about 53% over none. Three short paragraphs: why this company (specific), the one proof point that maps to their gate, the logistics line (location, timezone, contract model). Same voice rules, same no-invention rule.
- Record what was sent. When the user confirms the application went out, add a row to
career-evidence/README.md's "what each live process has seen" table (numbers, ownership wording, stories used), if that folder exists.
Written application questions ("hardest problem you solved", "most ambitious thing you shipped") are short story cards: use the card's headline and 60-second version, cut to the field limit, with the check and the user's own mistake kept in. Short outreach to a recruiter keeps the outcome and drops the method (STORIES.md).
ATS-safe formatting rules in REFERENCE.md.
screen-prep — recruiter-call Q&A pack
Required inputs: JD, company name, role title.
Output sections, in this order:
- Logistics knockouts first. Work authorization and contract model (contractor / EOR / W2), location and the timezone-overlap window the user can commit to, English level, notice period, start date. One tight, honest line each. For a remote international candidate these end calls faster than any technical question, so they lead the pack.
- 30-second intro pitch: first-person, aligned to the role.
- Why this company / role: 3 sentences from JD signals; ask the user for any personal angle.
- Top 8 likely first-call questions with draft answers in the user's voice, each ≤ 120 words. Calls are often transcribed and auto-summarized for people who were not on them; each answer carries one concrete fact that survives the summary. When
career-evidence/exists, build each answer from the mapped story card ininterview-question-map.md(answer, me, context, decision, check, result) instead of from scratch, and name the card (S4) so the user can rehearse the long version. - Ownership line: the one sentence from
ownership-audit.mdfor "what did you personally own?", if that file exists. It is the question most likely to follow any project answer. - Metric defense: for each number on the CV sent to this company, the one-sentence answer to "how did you measure that, and what was yours?" Pull from the tailored CV's post-CV §C. If this company saw an older, corrected form of a number, put the correction line first.
- Salary expectation, two branches (see REFERENCE.md — Voice rules): range posted → anchor in the upper half of it; no range → ask the user for their range, never guess, and prep a line asking them to share the band first.
- Gaps and risks: JD requirements the master does not cover, with honest framings.
- Consistency and authenticity check: CV and LinkedIn dates and titles match exactly (run
linkedin-alignif unsure), camera on for the first video call, a verifiable reference or public trail ready. Employers now screen remote candidates for identity fraud (DOJ and FBI have issued alerts on fake remote IT workers), and an ID check or a "move your camera" request is standard process, not an accusation. A genuine candidate clears these by being consistent. - Async or AI-run interview note, only if the process includes one: expect timed on-screen questions, answer in STAR shape, check camera, audio, and lighting beforehand. Describe the format; do not rely on vendor-specific tips, which go stale fast.
- Questions to ask the recruiter: 4 thoughtful, non-generic.
Always confirm before writing. Recruiter prep is high-stakes. Never invent experience.
After writing, update the gap ledger with anything from the "Gaps and risks" section.
linkedin-align — profile cross-check
Answers "does my LinkedIn tell the same story as my CV, and will a recruiter searching for my target role find it?" LinkedIn Recruiter search standardizes profiles to canonical titles and skills, and LinkedIn's Hiring Assistant agent reads the full profile plus the resume for evidence, so the profile is read by both a search engine and an agent before any human.
Required input: the user's LinkedIn profile as pasted text or a data export (Settings → Data privacy → Get a copy of your data). Never scrape or log in on the user's behalf. Optional: target role or a JD.
Steps:
- Consistency diff against the master. Employers, titles, and start/end dates (month and year) for every role. Every mismatch is a finding, because recruiters cross-check and remote-hiring fraud screening makes an unexplained mismatch look worse than it used to. The master is not automatically right: ask which side is correct.
- Headline. Does it contain the target role title in the words recruiters search ("Senior Full-stack Engineer"), plus 2 to 3 core stack terms? Propose one or two options within LinkedIn's length limit.
- About. Same rules as the CV summary (voice rules, no buzzwords, one concrete result). First-person is fine here.
- Skills list. Target-role must-haves the user genuinely has should be in the profile's skills and attached to the roles where they were used. Flag listed skills the master cannot back.
- Location and availability. Location set to where the user actually is. For remote international search, say remote and the contract model in the headline or About rather than faking a location.
- Open to Work. Present it as a decision, not a default: the public frame vs recruiters-only visibility. The trade-off is reach against signalling to the current employer's network. Do not quote effect-size figures for it; the circulating ones trace to career blogs.
- Report as a findings list (consistency first, then discoverability), each with the proposed text. Write nothing to LinkedIn. The user edits the profile; this mode only drafts.
Do not claim to know LinkedIn's live ranking weights. They are not public; coach consistency and search-term coverage, not "beating the algorithm".
evidence — career evidence and interview stories
Answers "what can I prove I did, and how do I tell it in 90 seconds?" Builds <dir>/career-evidence/ from the user's real work: git history, PRs and review threads, design docs, PM-tool threads, production data and coding-agent transcripts. Run it before a final round, after a rejection with feedback, or when the master has grown faster than anyone has checked it. Full method in STORIES.md; read it first.
Read-only on every source. The only writes are inside career-evidence/. The CV is never edited by this mode; proposed changes go in cv-audit.md, and the user applies them or asks you to.
Steps:
- Scope and identity. Ask which employers, repos and date range to cover, and any interview feedback to answer (quote it at the top of the readiness file). Collect the user's verified git identities; attribute nothing to an ambiguous name.
- Gather and catalog (STORIES.md Steps 1 and 2). One
E-NNentry per piece of work, every claim labeled VF / RI / UR with a reference. Search beyond git: PM threads (including cached tool results in old agent transcripts), production ledgers and logs, agent transcripts for proposals the user rejected. - Ownership audit (Step 3): four columns per project and one defensible ownership sentence.
- Provenance and status (Steps 4 and 5): for every number on the master, the source, sample, environment and date; re-derive any ratio that came from a smoke test. Every item gets a status as of a date.
- Story bank (Step 6): 12 to 20 A-to-H cards with a coverage table; make sure the eight named story types are covered or listed as missing. For AI-native targets, grade "agent was wrong" cases separately.
- Question map (Step 7): framework, question to story map, honest-boundary lines, follow-up drills.
- CV audit (Step 8): Fix / Tighten / OK per claim in the master and in every CV a live process has seen, plus overlooked accomplishments. For each corrected claim, a correction pack sorted by priority and the correction line.
- Open questions (Step 9): ask them one at a time with context and a suggested answer; record answers and update the other files in the same turn.
- Readiness assessment: per competency area, the strongest evidence, weakest point, and what to do, in hours. No numeric scores. Separate what a side project can close from what it can't.
- Report in the chat: the three findings most likely to have cost the user an offer, the top five fixes ranked by expected value, and the open questions. Offer to apply the CV diff; don't apply it unasked.
Gap ledger
<dir>/gap-ledger.md is a running, cross-JD record of requirements the master cannot support. It exists because a gap named once is noise and a gap named in four job descriptions is quietly deciding outcomes — and that pattern is invisible if gaps only ever live in the post-CV section of individual tailored CVs.
When to update it: any time a JD is assessed. That includes tailor, screen-prep, and a bare fit check (user pastes a JD and asks "check this" without naming a mode). Update it as part of the same turn, not as a follow-up offer.
How to update:
- Gap already in the ledger → append the company to its Seen in line and re-rank if its count changed. Do not duplicate the entry.
- New gap → add an entry in the format below.
- Gap that has closed (user shipped the thing) → move it to the
## Closedsection with the date and what closed it. Never delete. - Bump
Last updatedto today's date.
Organize by gap, never by company. Recurrence is the whole point of the file.
Entry format:
### N. {Gap name}
**Seen in:** {Company A, Company B, ...}
**They ask for:** {the requirement in their words}
**You have:** {the honest current state, including the closest analogue}
**Closing move:** {the specific, concrete thing that would close it}
**Estimate:** {N to M hours}Rules:
- Estimates in hours, never days.
- Never soften the "You have" line. The ledger is the one document where the gap is stated plainly; tailored CVs handle presentation, this handles truth.
- Mark gaps that are not closeable by a side project as such (production volume at scale, GPU fleets, formal oncall). Telling the user to grind at something unwinnable is worse than naming it honestly.
- Maintain a short "projects that close the most" section. Prefer one project that closes four gaps over four projects that close one each, and say which single project has the best ratio.
- Single-occurrence gaps can live in a compact table rather than full entries, and get promoted to a full entry on their second sighting.
Export
After writing cv-master.md (sync / bootstrap), any tailored CV (tailor), or any standalone rewrite (sync (b)), offer to render a paired .docx and .pdf next to the .md. Skip for screen-prep (internal prep doc).
Neither format is "the ATS-safe one". No 2024–2026 vendor documentation prefers either; what fails is an image-only or scanned file. So render both and pick per submission:
- The portal states a preference: use it.
- Agency or staffing recruiter: DOCX. They edit and reformat CVs before forwarding.
- Direct company portal, or email to a hiring manager: PDF, after it passes
verify-pdf.py. Layout survives.
Critical: the rendered output (DOCX or PDF) must contain only the CV body in English with no review markers. Three things get stripped before rendering:
- Post-CV PT-BR section — everything from the first
---separator onward (review notes for the candidate). [DADO AUSENTE: ...]markers — entire bracketed phrase, including any preceding space and the period before it if it terminates the sentence.[ESTIMADO]markers — entire bracketed phrase, including any preceding space.
Markers live in the .md source as review notes; they never appear in the submitted document.
Steps:
- Check pandoc is available:
pandoc --version. If missing, instruct the user to install (winget install --id JohnMacFarlane.Pandocon Windows,brew install pandocon macOS,apt install pandocon Linux) and stop. - Strip the post-CV PT-BR section AND all review markers into a temp file, then render. Run from
<dir>:
Theawk '/^---$/{exit} {print}' <file>.md | sed -E 's/ *\[DADO AUSENTE:[^]]*\]//g; s/ *\[ESTIMADO\]//g' > <file>.cv-only.md pandoc <file>.cv-only.md -o <file>.docx --reference-doc=cv-reference.docx rm <file>.cv-only.md--reference-docis optional. If<dir>/cv-reference.docxdoes not exist, drop the flag — pandoc uses its sensible defaults (single column, Calibri, ATS-safe). - Suggested filename for final submission:
FirstName_LastName_Resume.docx/.pdf. - Output is
<file>.docxnext to the source.md. - Render the PDF (below), then report both paths in one sentence. Do not open them automatically.
PDF: same strip-then-render pattern:
awk '/^---$/{exit} {print}' <file>.md | sed -E 's/ *\[DADO AUSENTE:[^]]*\]//g; s/ *\[ESTIMADO\]//g' > <file>.cv-only.md
npx --yes md-to-pdf <file>.cv-only.md --stylesheet cv-style.css --launch-options '{"args":["--no-sandbox"]}'
mv <file>.cv-only.pdf <file>.pdf
rm <file>.cv-only.mdThen verify the PDF actually extracts as text, every time. A CV can look perfect and still parse as gibberish, and the failure is invisible on screen:
py -3 "<skill-dir>/verify-pdf.py" <file>.pdfwhere <skill-dir> is this skill's own directory, reported as its base directory when the skill loads (~/.claude/skills/cv-craft on a Claude install, ~/.agents/skills/cv-craft under pi). Do not hardcode either path.
It prints SEND IT or FIX BEFORE SENDING and exits non-zero on a problem, naming the exact words an ATS would fail to match. Use python3 instead of py -3 off Windows; if pypdf is missing, pip install pypdf. Do not hand-check with pdftotext — it silently normalises ligatures and reports a broken file as clean.
What each failure means:
| Check | Failure means |
| ligature glyphs | cv-style.css is missing the font-variant-ligatures: none rule. Cloudflare will not match an ATS keyword search. |
| leaked markers | The strip step did not run or the --- separator is missing. The PDF contains PT-BR review notes. Do not send it. |
| glued words | Font embedding dropped spaces. Re-render, and if it persists switch the font-family to a plain Arial, sans-serif. |
| injection | The text contains an instruction addressed to an AI screener. Remove it; never send a CV that carries one (see REFERENCE.md — ATS-safe formatting). |
| page fill (warning) | The last page is under two-thirds full. Fill it with earned content or cut back a page, per REFERENCE.md — Length. The script's page count is the measurement; never estimate pages from word count. |
DOCX is not affected by the ligature problem: it stores literal characters, so extraction is exact. That makes it the safe fallback if a PDF keeps failing the check.
The user can re-render after manual edits with the same command.
Confirmation discipline
Show a diff or preview before every write. Wait for explicit user confirmation. After writing, report what changed in one sentence — do not re-print the full file.
Reference
- MASTER_TEMPLATE.md — master CV schema and field rules
- REFERENCE.md — ATS rules, bullet conventions, market best practices
- EXAMPLES.md — sample tailored CV and sample screen-prep pack
- verify-pdf.py — post-render check that a PDF extracts as text (ligatures, leaked review markers, glued words, AI-screener injection, partial last page)
- EVIDENCE.md — sources and confidence behind the rules, from the 2026-09 research pass; read before changing a rule
- STORIES.md —
evidencemode method: identity, evidence catalog, ownership audit, metric provenance, status, story cards, question map, correction propagation
Humanize the written prose (if available)
Before writing generated prose to a file, if the humanizer skill is installed, run it on the drafted text so the created document reads naturally and free of AI tells; skip silently if it is not available. Apply it to the human-facing document body only, never to code, frontmatter, file paths, IDs, or literal templates.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

