Resume Generator
Create a truthful, tailored resume for a technical job application. This skill uses a career-history YAML file as the sole source of candidate claims and uses RenderCV to generate the final PDF.
Scope and non-negotiable rules
- Use this skill only for software engineering and adjacent technical roles.
- Default the career-data input to
career.yaml; accept another path only when the user provides one.
- Use
reference-resume.yaml in this bundle as the RenderCV schema and layout reference.
- RenderCV is required. Do not write a final application artifact until a local RenderCV command is available.
- Job-description retrieval is read-only. Do not upload career data, job text, or personal details to third-party services.
- A URL is preferred. If it is inaccessible, authentication-gated, incomplete, or unreliable, request a pasted job description. Never assess a job from its title alone.
- Do not invent, strengthen, or imply technologies, metrics, scope, ownership, customer impact, or people-management experience.
- Do not keyword-stuff. A job requirement may appear in the tailored resume only when the career data explicitly supports it.
- Do not create a resume below the fit threshold or before explicit approval.
- Do not overwrite a prior application directory.
Required inputs
Collect or identify:
- Career-data YAML path. Default:
career.yaml.
- Job-description URL and/or pasted job description.
- Company and role, if they cannot be confidently extracted from the description.
- Any missing required profile details only when the career data and selected RenderCV sections require them.
The expected canonical career schema has top-level profile fields (name, email, website, social_networks, and summary), plus skills, employers, work_projects, personal_projects, education, and certifications.
Intake and source validation
- Parse the career YAML before making any recommendation. Report the file and YAML error when parsing fails.
- Read the job URL when it is accessible. If it cannot provide the full description, request pasted job description text and wait.
- Extract the target title, seniority, must-have requirements, preferred qualifications, responsibilities, domain context, and measurable outcomes expected by the employer.
- Check that every selected work project has a resolvable
employer_id. Do not guess an employer, position, or title when the reference is missing.
- Resolve a selected project to an employer position by date overlap. When overlapping positions make attribution unclear, show the ambiguity and ask the user rather than collapsing titles.
- Preserve
personal_projects as independent records. Include them only when their evidence strengthens the target role.
- Treat expired certifications accurately: exclude expired certifications by default, or label them as expired when their historical relevance is material.
- For duplicate project names, cite the project group, employer identifier when present, exact name, and description bullet index. Do not use a name alone as provenance.
Evidence mapping
Create a requirement-to-evidence table before calculating fit. Every positive row requires a source citation in one of these forms:
skills.<category>[<item>]
work_projects[<employer_id>/<project name>].description[<index>]
personal_projects[<project name>].description[<index>]
employers.<employer_id>.positions[<index>]
Classify each requirement as one of:
- Direct evidence: Explicitly named skill, responsibility, or outcome.
- Demonstrated evidence: Clearly performed in a cited project description, without broadening the claim.
- Weak or adjacent evidence: Related but insufficient for a direct match; it cannot be represented as a match on the resume.
- No evidence: Not supported by the career data.
Distinguish the candidate contribution from a team or organization result. Preserve supplied metrics exactly and never derive new numbers.
Evidence-based fit estimate
Read references/fit-rubric.md and present its 0–100 calculation. Call it an evidence-based fit estimate, never a prediction or guarantee of an interview.
The rubric weights are:
| Dimension |
Weight |
| Requirements match |
40 |
| Relevant impact |
25 |
| Seniority and scope |
20 |
| Evidence strength |
15 |
Rules:
- A missing must-have requirement prevents a 90/100 or higher estimate unless the job description explicitly identifies it as optional.
- Show the score for each dimension, the calculation, matched citations, and the uncertain or missing requirements.
- Keep preferred qualifications distinct from must-haves.
Below 90/100: stop
If the evidence-based fit estimate is below 90/100, do not propose a selected resume, do not create resumes/, and do not write YAML or PDF artifacts. Return:
- Overall and per-dimension score.
- Matched evidence and citations.
- Gaps categorized as missing experience or technology, weakly documented experience, or resume-presentation gaps.
- Honest next steps: document existing work better, gain the experience, build a learning project, or target a role with stronger evidence alignment.
Do not suggest fabricating experience or disguising a gap with vague terminology.
At least 90/100: propose, then wait
If the estimate is at least 90/100, show a proposal before writing files:
- The fit breakdown and citations.
- A one-paragraph tailored-summary direction based only on cited evidence.
- Selected employers, positions, projects, and exact description bullets.
- Tailored skills selected verbatim from career data.
- Education and certifications selected under the currency rule.
- The ATS simulation described below.
- The intended output path.
Ask for explicit approval of the proposed selection and wording. No resume.yaml, PDF, or destination directory may be created until the user gives explicit approval.
ATS simulation
Run a transparent ATS simulation as a coverage report, not as a vendor-specific score or a promise of passing an applicant-tracking system. Use standard section names from the RenderCV reference document and inspect the proposed resume content against extracted job requirements.
For every important job term, report one status:
- Supported and represented: Direct evidence appears in the proposed summary, skills, or experience.
- Supported but not selected: Career data supports the term, but the current proposed selection omits it; explain whether adding it would improve relevance.
- Missing evidence: Career data does not support the term; leave it out of the resume and include it in the gap report when material.
- Unsafe to add: The wording would overstate adjacent evidence or introduce an unsupported claim.
Favor readable, evidence-backed language over keyword density. Do not claim an ATS will rank, parse, or select the resume in a particular way.
Generate the RenderCV artifacts after approval
Confirm that RenderCV is installed and runnable locally. Prefer the repository virtual environment:
.venv/bin/python -m rendercv --version
Derive lowercase, filesystem-safe company-name and role slugs. Remove unsafe characters; if a safe slug cannot be derived, ask the user for an override.
Use exactly this destination shape:
resumes/<company-name>-<role>/<yyyy-mm-dd>/
Write resume.yaml and resume.pdf inside that directory.
Before creating the directory, check whether it exists. If it exists, stop and ask for direction. Never overwrite it.
Populate a new YAML file using reference-resume.yaml as the RenderCV-format guide:
- map profile data from the career YAML;
- use the approved summary direction and selected skills;
- group approved experience by employer and position, preserving date/title accuracy;
- use only approved project bullets and evidence-backed terms;
- include personal projects only when approved and relevant;
- include education and certifications according to the selection rules;
- preserve the reference document's
sb2nov theme unless the user requests a different theme.
Parse the generated YAML before rendering.
Render directly rather than invoking repository-wide build recipes:
.venv/bin/python -m rendercv render \
resumes/<company-name>-<role>/<yyyy-mm-dd>/resume.yaml \
--pdf-path resumes/<company-name>-<role>/<yyyy-mm-dd>/resume.pdf \
--output-folder <temporary-rendercv-directory>
Confirm the PDF exists and has nonzero size. Report both paths.
Failure behavior
| Condition |
Required response |
| Job URL cannot be read |
Request pasted job description text. |
| Career YAML is invalid |
Identify the file/error and stop. |
| Required profile value is absent |
Ask for only the missing value before generation. |
| Fit is below 90/100 |
Stop before file creation and provide the categorized gap report. |
| User has not approved |
Stop after proposal; do not create output. |
| Destination exists |
Stop; never overwrite. |
| RenderCV unavailable |
State the missing prerequisite and the required local setup; do not claim success. |
| RenderCV fails |
Preserve an approved YAML if already written, show the error, and do not claim the PDF exists. |
Final handoff
For every completed assessment, state:
- evidence-based fit estimate and rubric breakdown;
- ATS simulation statuses and unresolved gaps;
- selected source citations;
- whether the workflow stopped, awaits approval, or rendered successfully;
- artifact paths only after they exist;
- any remaining formatting or evidence questions.
Bundle validation
Run the repository-local validation before handing off changes to this skill:
.venv/bin/python -m unittest discover \
-s .agents/skills/resume-generator/tests \
-p 'validate_*.py'
git diff --check
The tests render reference-resume.yaml with the direct local RenderCV invocation and create only temporary smoke-test artifacts.
1---2name: resume-generator3description: Create an evidence-based, job-tailored RenderCV resume for software engineers and adjacent technical roles using career-history YAML. Assess fit and ATS coverage before generating artifacts; stop below 90/100 and require explicit approval before writing a resume.4license: MIT5---67# Resume Generator89Create a truthful, tailored resume for a technical job application. This skill uses a career-history YAML file as the sole source of candidate claims and uses RenderCV to generate the final PDF.1011## Scope and non-negotiable rules1213- Use this skill only for software engineering and adjacent technical roles.14- Default the career-data input to `career.yaml`; accept another path only when the user provides one.15- Use `reference-resume.yaml` in this bundle as the RenderCV schema and layout reference.16- RenderCV is required. Do not write a final application artifact until a local RenderCV command is available.17- Job-description retrieval is read-only. Do not upload career data, job text, or personal details to third-party services.18- A URL is preferred. If it is inaccessible, authentication-gated, incomplete, or unreliable, request a pasted job description. Never assess a job from its title alone.19- Do not invent, strengthen, or imply technologies, metrics, scope, ownership, customer impact, or people-management experience.20- Do not keyword-stuff. A job requirement may appear in the tailored resume only when the career data explicitly supports it.21- Do not create a resume below the fit threshold or before explicit approval.22- Do not overwrite a prior application directory.2324## Required inputs2526Collect or identify:27281. Career-data YAML path. Default: `career.yaml`.292. Job-description URL and/or pasted job description.303. Company and role, if they cannot be confidently extracted from the description.314. Any missing required profile details only when the career data and selected RenderCV sections require them.3233The expected canonical career schema has top-level profile fields (`name`, `email`, `website`, `social_networks`, and `summary`), plus `skills`, `employers`, `work_projects`, `personal_projects`, `education`, and `certifications`.3435## Intake and source validation36371. Parse the career YAML before making any recommendation. Report the file and YAML error when parsing fails.382. Read the job URL when it is accessible. If it cannot provide the full description, request pasted job description text and wait.393. Extract the target title, seniority, must-have requirements, preferred qualifications, responsibilities, domain context, and measurable outcomes expected by the employer.404. Check that every selected work project has a resolvable `employer_id`. Do not guess an employer, position, or title when the reference is missing.415. Resolve a selected project to an employer position by date overlap. When overlapping positions make attribution unclear, show the ambiguity and ask the user rather than collapsing titles.426. Preserve `personal_projects` as independent records. Include them only when their evidence strengthens the target role.437. Treat expired certifications accurately: exclude expired certifications by default, or label them as expired when their historical relevance is material.448. For duplicate project names, cite the project group, employer identifier when present, exact name, and description bullet index. Do not use a name alone as provenance.4546## Evidence mapping4748Create a requirement-to-evidence table before calculating fit. Every positive row requires a source citation in one of these forms:4950- `skills.<category>[<item>]`51- `work_projects[<employer_id>/<project name>].description[<index>]`52- `personal_projects[<project name>].description[<index>]`53- `employers.<employer_id>.positions[<index>]`5455Classify each requirement as one of:5657- **Direct evidence:** Explicitly named skill, responsibility, or outcome.58- **Demonstrated evidence:** Clearly performed in a cited project description, without broadening the claim.59- **Weak or adjacent evidence:** Related but insufficient for a direct match; it cannot be represented as a match on the resume.60- **No evidence:** Not supported by the career data.6162Distinguish the candidate contribution from a team or organization result. Preserve supplied metrics exactly and never derive new numbers.6364## Evidence-based fit estimate6566Read `references/fit-rubric.md` and present its 0–100 calculation. Call it an **evidence-based fit estimate**, never a prediction or guarantee of an interview.6768The rubric weights are:6970| Dimension | Weight |71| --- | ---: |72| Requirements match | 40 |73| Relevant impact | 25 |74| Seniority and scope | 20 |75| Evidence strength | 15 |7677Rules:7879- A missing must-have requirement prevents a 90/100 or higher estimate unless the job description explicitly identifies it as optional.80- Show the score for each dimension, the calculation, matched citations, and the uncertain or missing requirements.81- Keep preferred qualifications distinct from must-haves.8283### Below 90/100: stop8485If the evidence-based fit estimate is below 90/100, do not propose a selected resume, do not create `resumes/`, and do not write YAML or PDF artifacts. Return:86871. Overall and per-dimension score.882. Matched evidence and citations.893. Gaps categorized as missing experience or technology, weakly documented experience, or resume-presentation gaps.904. Honest next steps: document existing work better, gain the experience, build a learning project, or target a role with stronger evidence alignment.9192Do not suggest fabricating experience or disguising a gap with vague terminology.9394### At least 90/100: propose, then wait9596If the estimate is at least 90/100, show a proposal before writing files:97981. The fit breakdown and citations.992. A one-paragraph tailored-summary direction based only on cited evidence.1003. Selected employers, positions, projects, and exact description bullets.1014. Tailored skills selected verbatim from career data.1025. Education and certifications selected under the currency rule.1036. The ATS simulation described below.1047. The intended output path.105106Ask for explicit approval of the proposed selection and wording. No `resume.yaml`, PDF, or destination directory may be created until the user gives explicit approval.107108## ATS simulation109110Run a transparent ATS simulation as a coverage report, not as a vendor-specific score or a promise of passing an applicant-tracking system. Use standard section names from the RenderCV reference document and inspect the proposed resume content against extracted job requirements.111112For every important job term, report one status:113114- **Supported and represented:** Direct evidence appears in the proposed summary, skills, or experience.115- **Supported but not selected:** Career data supports the term, but the current proposed selection omits it; explain whether adding it would improve relevance.116- **Missing evidence:** Career data does not support the term; leave it out of the resume and include it in the gap report when material.117- **Unsafe to add:** The wording would overstate adjacent evidence or introduce an unsupported claim.118119Favor readable, evidence-backed language over keyword density. Do not claim an ATS will rank, parse, or select the resume in a particular way.120121## Generate the RenderCV artifacts after approval1221231. Confirm that RenderCV is installed and runnable locally. Prefer the repository virtual environment:124125 ```sh126 .venv/bin/python -m rendercv --version127 ```1281292. Derive lowercase, filesystem-safe `company-name` and `role` slugs. Remove unsafe characters; if a safe slug cannot be derived, ask the user for an override.1303. Use exactly this destination shape:131132 ```text133 resumes/<company-name>-<role>/<yyyy-mm-dd>/134 ```135136 Write `resume.yaml` and `resume.pdf` inside that directory.1374. Before creating the directory, check whether it exists. If it exists, stop and ask for direction. Never overwrite it.1385. Populate a new YAML file using `reference-resume.yaml` as the RenderCV-format guide:139 - map profile data from the career YAML;140 - use the approved summary direction and selected skills;141 - group approved experience by employer and position, preserving date/title accuracy;142 - use only approved project bullets and evidence-backed terms;143 - include personal projects only when approved and relevant;144 - include education and certifications according to the selection rules;145 - preserve the reference document's `sb2nov` theme unless the user requests a different theme.1466. Parse the generated YAML before rendering.1477. Render directly rather than invoking repository-wide build recipes:148149 ```sh150 .venv/bin/python -m rendercv render \151 resumes/<company-name>-<role>/<yyyy-mm-dd>/resume.yaml \152 --pdf-path resumes/<company-name>-<role>/<yyyy-mm-dd>/resume.pdf \153 --output-folder <temporary-rendercv-directory>154 ```1551568. Confirm the PDF exists and has nonzero size. Report both paths.157158## Failure behavior159160| Condition | Required response |161| --- | --- |162| Job URL cannot be read | Request pasted job description text. |163| Career YAML is invalid | Identify the file/error and stop. |164| Required profile value is absent | Ask for only the missing value before generation. |165| Fit is below 90/100 | Stop before file creation and provide the categorized gap report. |166| User has not approved | Stop after proposal; do not create output. |167| Destination exists | Stop; never overwrite. |168| RenderCV unavailable | State the missing prerequisite and the required local setup; do not claim success. |169| RenderCV fails | Preserve an approved YAML if already written, show the error, and do not claim the PDF exists. |170171## Final handoff172173For every completed assessment, state:174175- evidence-based fit estimate and rubric breakdown;176- ATS simulation statuses and unresolved gaps;177- selected source citations;178- whether the workflow stopped, awaits approval, or rendered successfully;179- artifact paths only after they exist;180- any remaining formatting or evidence questions.181182## Bundle validation183184Run the repository-local validation before handing off changes to this skill:185186```sh187.venv/bin/python -m unittest discover \188 -s .agents/skills/resume-generator/tests \189 -p 'validate_*.py'190git diff --check191```192193The tests render `reference-resume.yaml` with the direct local RenderCV invocation and create only temporary smoke-test artifacts.