Resume Tailor
Turn one master resume into a role-specific, ATS-readable resume that mirrors the JD's real language and shows the gaps instead of hiding them.
When to use
- User says "tailor my resume for this job," "optimize for ATS," "make a version for ."
- A pipeline row hits
status: tailoring. - The user pastes a JD and wants a matching resume.
Inputs
- Reads:
workspace/documents/master-resume.md– the single source of truth for real experience, titles, dates, and numbers.- The job description, from
workspace/pipeline/applications/<id>-company-role.md(the "Why this role" / job URL) or pasted directly. workspace/profile/target-roles.md– for level/track context if the JD is thin.templates/resume-template.md– output skeleton.docs/ats-guide.md– parser-safe formatting rules (see Rules).
- Needs from user:
- The JD text or URL (ask if neither is on file, and never guess the requirements).
- The application
id(so output lands as<id>-resume.md). If none exists yet, ask the tracker/setup step to mint one, or use a temporaryJxxxand flag it.
Workflow
- Locate the JD. Pull it from the
applications/<id>file or the pasted text. If missing, stop and ask. Do not draft against an assumed spec. - Extract the requirements ledger. From the JD, list:
- Hard requirements / must-haves (years, degrees, named tools, certifications).
- Nice-to-haves.
- Exact keyword phrasing the ATS scans: job title variants, skills, tools, methodologies, acronyms + their spelled-out forms (e.g. "ABM (account-based marketing)"). Copy the JD's spelling, not a synonym.
- Map each item to real evidence. For every requirement, find the line in
master-resume.mdthat proves it. Mark each as: Met (with the source bullet), Partial (adjacent experience), or Missing (no real evidence). Never invent a bullet to fill a Missing. - Draft the tailored resume from
templates/resume-template.mdintoworkspace/output/<id>-resume.md:- Rewrite the summary to name the target role and lead with the strongest Met proof.
- Reorder and rewrite experience bullets so the most JD-relevant land first. Lead with impact + quantified outcome pulled verbatim-in-spirit from the master (numbers unchanged).
- Mirror the JD's exact keywords only where true. Insert the spelled-out + acronym pairing so both forms are parseable.
- Cut anything irrelevant to this role. Relevance beats completeness. One page for under 10 years, two for senior. A tight one beats a padded two.
- Group the Skills section to front-load JD-named skills the candidate actually has.
- Run the ATS check (see rubric below) and write the coverage report + gap list into the output file.
- Slop gate. Run the
writing-qualityskill over the drafted resume to kill AI tells, hollow verbs, and filler. Resume prose is terse by nature, so the gate mostly catches summary-line slop and inflated adjectives. - Eval gate. Submit the resume to the
artifact-evalskill (resume spec). If it returns REVISE/FAIL, fix the named issues and re-submit. Do not mark final until PASS. - Log it. Update the
applications/<id>Materials section with the resume path, keywords targeted, and the gap list. Hand the status change (tailoring → appliedonce submitted) toapplication-tracker. This skill does not flip toappliedon its own, since a human still has to submit.
ATS check rubric
Run every tailored resume against this before it's final.
Keyword coverage
- Coverage % = (JD must-have keywords present in resume, truthfully) ÷ (total JD must-have keywords). Report the number.
- Target ≥ 75% on must-haves. Below that, the miss is usually a real gap, not a wording problem. Surface it, don't stuff.
- No keyword stuffing, no white-text tricks, no skills the candidate can't defend in an interview.
Formatting that breaks parsers (all must be false)
- No tables, multi-column layouts, or text boxes.
- No images, logos, icons, or charts.
- No content in headers/footers (many parsers drop them). Contact info goes in the body.
- Standard section headings only: Summary, Experience, Skills, Education, Certifications.
- Real selectable text (not a flattened or scanned PDF), reverse-chronological order.
- Simple round bullets, no wingding glyphs, and no nested tables for indentation.
- One standard font, consistent date format (
Mon YYYY).
Gap visibility (the honesty check)
- Every JD must-have with no real evidence appears in the "Must-haves NOT met" list.
- No bullet, number, title, date, or credential exists that isn't traceable to
master-resume.md.
Output
- Writes to:
workspace/output/<id>-resume.md(the tailored resume). - Appends to:
workspace/pipeline/applications/<id>-company-role.md, the Materials section (path, angle, keywords) and the gap list. - Format: the resume in
resume-template.mdstructure, followed by a fenced report block:## ATS Report: <id> Keyword coverage: N% (X of Y must-haves) Must-haves met: [...] Must-haves NOT met (gaps, human decides): [...] Formatting: PASS / issues: [...] writing-quality: PASS | artifact-eval: PASS (resume v<ver>, score N)
Rules & quality bar
- No fabrication. Not experience, not numbers, not titles, not dates, not credentials. If it isn't in the master resume, it doesn't go in.
- Gaps stay visible. The gap list is a feature. It tells the human where to expect pushback and whether to apply at all.
- Relevance > completeness. Cutting the wrong-fit bullets is the tailoring. a longer resume is not a better one.
- Mirror, don't parrot. Use the JD's exact terms only where they're genuinely true of the candidate.
- Human submits. This skill never auto-applies. It produces the file. A person sends it.
- One JD per pass. Don't blend two postings into a Frankenstein resume.
- Ends only after
writing-qualityPASS andartifact-eval(resume spec) PASS.
Related skills
job-fit-scoring– run first. Its fit breakdown pre-identifies the gaps you'll surface here.company-research– sharpens the summary line and which keywords actually matter.cover-letter– pairs with the tailored resume and shares the chosen angle.writing-quality– mandatory slop gate before final.artifact-eval– mandatory PASS (resume spec) before final.application-tracker– owns the status flip and stores the record.search-and-scale-os– orchestrator that calls this during the tailoring stage.