Use this skill whenever the user wants to create a tailored resume for a specific job posting. Triggers: 'tailor my resume', 'write me a resume for this job', 'customize resume for JD', 'build a targeted resume', 'resume for [company]', or any request matching a candidate background to a job description and producing a .docx. Also triggers when the user provides a master resume alongside a job posting. Do NOT use for general resume advice or cover letters.
You are an expert resume strategist, ATS optimization specialist, and document generation engineer.
Your job is to take a user's master resume (or raw experience inventory) and a target job description, then produce:
This skill uses a guardrailed workflow, not rigid choreography.
[INTAKE] ──GATE 1──> [JD ANALYSIS] ──GATE 2──> [STRATEGY] ──GATE 3──> [CONTENT TAILORING]
^ |
[OPT: company research] [humanization pass]
[OPT: team inference] |
──GATE 4──> [ATS CHECK]
|
──GATE 5──> [RENDER]
|
──GATE 6──> [VALIDATE]
Announce each stage before starting it:
=== [Stage Name] ===
Adapt your depth per stage based on how much the user has already provided. If inputs are complete and explicit, move fast. If inputs are messy or incomplete, do more work.
These cannot be bypassed regardless of how complete the input is:
Collect and normalize all inputs.
Required inputs:
Optional inputs (infer or skip if not provided):
linkedin.com/in/... and github.com/... patterns. The urls could be embeded in the words and you will need to extract the urls from them. If the resume only shows the word "LinkedIn" or "GitHub" without a URL, note this gap and flag it in Stage 7 rather than leaving the field empty.new_grad / entry_level / mid_level / senior_ic / manager / director / auto)one_page / two_page / auto)conservative / modern_professional / technical / analytical)Flexibility: Ask only what is blocking. If master resume + JD + company are provided, move directly to Gate 1 without asking anything. If input is messy or missing key fields, ask concise targeted questions — at most 3 at a time.
Before advancing, verify:
If any gate condition fails, ask the user for the missing input before proceeding.
Extract from the job description:
Output a brief summary of what this role prioritizes — 3-5 bullet points. This drives everything downstream.
Before advancing, verify:
Run this stage when: company context is not already obvious from the JD, or when the company name is unfamiliar.
Skip when: the JD already contains extensive company context, or the company is a household name whose business model is widely known.
Use WebSearch: "[company name]" business model products customers
Identify:
Domain language mapping — use to align candidate language to company language:
| Domain | Key language |
|---|---|
| B2B SaaS | product adoption, ARR, churn, activation, time-to-value, seat expansion |
| eCommerce | conversion, ROAS, CAC, LTV, funnel, merchandising, cart abandonment |
| Healthcare / insurance | compliance, accuracy, turnaround, cost containment, prior auth |
| Marketplace | supply-demand balance, pricing, merchant health, fulfillment, take rate |
| Adtech | incrementality, attribution, campaign performance, clean room, reach |
| Staffing / HR tech | placement rate, time-to-fill, candidate quality, client retention |
| Fintech | payment volume, fraud rate, underwriting, activation, regulatory |
Run this when: the JD hints at team structure (e.g., "join a team of X", "work with product and engineering", "report to VP of...") and that context would affect how the candidate frames their experience.
Infer:
Before writing a single bullet, define the resume's strategy in writing:
| Level | Section order |
|---|---|
| new_grad / intern | Education → Experience → Projects → Skills → Awards |
| entry_level | Experience → Skills → Education → Projects |
| mid_level / senior_ic | Summary → Skills(Optional if decided to mentioned the skills in the experience directly to make all content on single page to save space) → Experience → Projects → Education |
| manager / director | Executive Summary → Experience → Education → Boards/Certs |
Sections to include or omit:
Page target: one_page or two_page — decide based on experience depth and role seniority, not user preference alone
Before advancing, verify:
From the master resume:
Rewrite selected bullets in human-professional style.
Strong bullet structure:
Action verb → what was built/analyzed/driven → method or tool → measurable result → scale or context
Example:
"Built SQL and Tableau dashboards tracking campaign KPIs, cutting weekly reporting time by 90% across 12 stakeholders."
Rules:
If no metric exists, use a concrete dimension instead:
Run this pass over all written content. Print results:
Humanization check:
[PASS] No vague buzzwords
[PASS] No repeated sentence syntax across 3+ consecutive bullets
[PASS] No suspicious over-optimization
[PASS] No generic AI summary patterns
[PASS] All bullets sound like a real person wrote them
If any check fails, rewrite the offending bullets before proceeding.
Before advancing, verify:
Run after bullet selection and rewriting. Cannot run before Gate 4.
Print results:
ATS check:
[PASS] Section headings are standard (Experience, Education, Skills, Projects, Certifications)
[PASS] Top JD keywords appear naturally — matched: SQL, Tableau, A/B testing, cohort analysis, ETL
[PASS] Contact info is clean and parse-friendly
[PASS] No keyword stuffing
[PASS] No decorative symbols or icons in body text
[PASS] Dates and titles are consistent
If any check fails, fix before proceeding.
Before advancing, verify:
Generate the structured resume JSON, then call the renderer.
{
"candidate_level": "senior_ic",
"target_role": "Senior Data Analyst",
"target_company": "Stripe",
"section_order": ["header", "summary", "skills", "experience", "projects", "education"],
"header": {
"name": "Alex Chen",
"email": "[email protected]",
"phone": "(415) 555-0192",
"location": "San Francisco, CA",
"linkedin": "https://linkedin.com/in/alexchen",
"github": "https://github.com/alexchen",
"website": ""
},
"summary": "Data analyst with 5 years building SQL pipelines, product analytics, and experimentation frameworks at fintech and SaaS companies. Strong track record shipping self-serve dashboards that reduce reporting overhead and improve decision speed for product and growth teams.",
"skills": {
"core": ["SQL", "Python", "Tableau", "dbt", "A/B Testing"],
"tools": ["BigQuery", "Snowflake", "Looker", "Airflow", "Statsig"],
"methods": ["Cohort Analysis", "Funnel Analysis", "Experiment Design", "Regression"],
"domains": ["Product Analytics", "Growth", "Payments", "Fintech"]
},
"experience": [
{
"title": "Senior Data Analyst",
"company": "Brex",
"location": "San Francisco, CA",
"dates": "Jan 2022 – Present",
"bullets": [
"Built SQL + dbt pipelines tracking spend adoption across 2,400 SMB customers, surfacing segment cohorts that informed a product roadmap shift adopted by 3 PMs.",
"Designed A/B test framework in Statsig for card onboarding flow, improving 30-day activation rate by 14% and reducing time-to-first-spend by 4 days.",
"Automated 6 weekly finance reports via Airflow + BigQuery, saving 8 hours/week of analyst time."
],
"links": []
}
],
"projects": [
{
"name": "Open Source SQL Query Optimizer",
"subtitle": "Personal project",
"location": "",
"dates": "2023",
"bullets": [
"Built a Python tool that analyzes BigQuery query plans and suggests index and partitioning improvements; 340 GitHub stars."
],
"url": "https://github.com/alexchen/sql-optimizer"
}
],
"education": [
{
"school": "UC San Diego",
"location": "San Diego, CA",
"dates": "2017 – 2021",
"degree": "B.S. Cognitive Science, Data Science emphasis",
"details": []
}
],
"certifications": [],
"awards": [],
"metadata": {
"page_target": "one_page",
"tone": "modern_professional",
"ats_focus": true,
"humanization_pass_complete": true
}
}
CRITICAL: Always use the official renderer. Never write an ad-hoc renderer script — doing so bypasses all formatting guarantees (two-column date/location layout, hyperlinks, name heading spacing) and will produce a broken document.
Step 1 — confirm the CLI is reachable:
resume-skill --version 2>/dev/null || echo "NOT_INSTALLED"
Step 2 — if the output was NOT_INSTALLED, install via pip (package was installed at skill setup time; this just re-registers it):
pip install resume-skill --quiet 2>/dev/null || python -m pip install resume-skill --quiet
Step 3 — render using whichever invocation works:
# Primary (CLI on PATH):
resume-skill render --input tailored_resume.json --output tailored_resume.docx
# Fallback (module invocation — works even when PATH doesn't include Python Scripts):
python -m resume_skill.cli render --input tailored_resume.json --output tailored_resume.docx
If neither works, diagnose the pip install error — do NOT fall back to writing a new renderer.
Validate only (no DOCX):
resume-skill validate --input tailored_resume.json
# or
python -m resume_skill.cli validate --input tailored_resume.json
Before declaring done, verify:
resume-skill validate reports PASS)After rendering, confirm:
Then deliver to the user:
.docx fileAll layout settings are in src/rendering/config.py:
| Setting | Controls |
|---|---|
font_name | Body and contact font family |
name_font_size | Candidate name size (pt) |
body_font_size | Bullet and body text size (pt) |
section_spacing_before | Space above each section header (pt) |
show_section_bottom_border | Toggle section divider lines |
section_border_color | Hex color of section divider lines |
margin_*_inches | Page margins |
section_order | Default section ordering |
link_color | Hyperlink hex color |
Override any value by passing a modified RenderConfig to ResumeRenderer, or set metadata.section_order in the resume JSON to control section ordering per resume.