# Job Application Tailoring

> >

- **Type:** Skill
- **Install:** `agentstack add skill-archiehzh0405-lang-resume-cover-letter-optimizer-resume-cover-letter-optimizer`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [archiehzh0405-lang](https://agentstack.voostack.com/s/archiehzh0405-lang)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** Apache-2.0
- **Upstream author:** [archiehzh0405-lang](https://github.com/archiehzh0405-lang)
- **Source:** https://github.com/archiehzh0405-lang/resume-cover-letter-optimizer

## Install

```sh
agentstack add skill-archiehzh0405-lang-resume-cover-letter-optimizer-resume-cover-letter-optimizer
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Job Application Tailoring Skill

This skill guides you through tailoring or generating a resume and/or cover letter for a specific job posting. It preserves the user's original document formatting when editing, generates polished new documents when starting from scratch, maximizes ATS keyword match, and provides strategic recommendations for the full application.

### CRITICAL: Preserve the Meaning of Every Bullet

**The #1 rule of this skill: a rewritten bullet must describe the SAME work the user actually did.** Minor wording improvements and polish are fine — changing what the bullet is about is not.

**What's OK (polish and clarity):**
- Stronger action verbs ("Led" → "Spearheaded", "Worked on" → "Developed")
- Adding JD keywords that genuinely describe what the user did (adding "A/B testing" to a bullet that already describes running experiments)
- Tightening wordy phrasing
- Minor embellishments to scope language ("projects" → "cross-functional projects") when clearly supported by context
- Reordering bullet content for better flow

**What's NOT OK (changing meaning):**
- **Swapping the domain/subject** — if the bullet is about fraud interventions, the rewrite must still be about fraud interventions, NOT about "growth" or "activation" or "product flows" just because the JD emphasizes those areas
- **Replacing the actual method with a different one** — if the user did A/B tests for fraud, don't rewrite it as "causal inference methods for growth decisions"
- **Changing the purpose/outcome** — if the user's goal was "measuring risk mitigation vs. user friction", don't change it to "measuring activation impact and informing growth decisions"
- **Inventing metrics** the user didn't provide — no fake percentages or dollar amounts. Ask the user or use placeholders like `[X%]`

**The test:** If someone read the original bullet and the rewrite side-by-side, they should say "yes, that's the same work, just described better" — never "wait, that's a completely different thing."

**Real example of what NOT to do:**
Original: "Leading the design and analysis of high-velocity A/B tests to optimize fraud interventions, ensuring statistical rigor in measuring the trade-off between risk mitigation and user friction to maintain user trust"
BAD rewrite: "Designing and executing rigorous A/B tests and non-inferiority experiments to optimize product flows, applying causal inference methods to measure activation impact and inform growth decisions across the product funnel"
↑ This changed fraud → product flows, risk/friction tradeoff → activation impact, user trust → growth decisions. The domain, method, and purpose are all different.

GOOD rewrite: "Designing and leading high-velocity A/B tests to optimize fraud intervention strategies, applying statistical rigor to quantify the trade-off between risk mitigation and user friction — balancing fraud prevention with seamless user experience"
↑ Same work, same domain, same purpose — just tighter and more impactful phrasing.

**When in doubt, ASK** — it is always better to ask the user "Did you actually do X?" than to guess. Present a draft bullet with a placeholder like `[X%]` or `[confirm detail]` and let the user fill in the truth.

---

## Phase 0: Gather Inputs

Before doing anything, confirm you have:
1. **The job description** — either a URL or pasted text. If a URL, try WebFetch first; if blocked, use WebSearch for the job title + company to find JD details.
2. **The user's resume** — as a `.docx` (preferred), `.pdf`, or pasted text/background info. See "Input Modes" below.
3. **The user's cover letter** (if applicable) — as a `.docx`.
4. **User instructions** — ask if they have specific bullets or sections they want to preserve or emphasize.

### Input Modes

**Mode A: Edit existing .docx (format-preserving)**
If the user provides a `.docx` file, or says "follow my structure" / "don't change the format", edit the original `.docx` XML directly rather than generating a new document. This is the default when a `.docx` is available.

**Mode B: Edit from PDF**
If the user provides a PDF only, use `pandoc` to extract text. Inform the user: "I can tailor the content but can't preserve PDF formatting — please attach a Word doc if you need the original layout preserved." If user cannot provide a `.docx`, proceed with Mode C using the extracted text.

**Mode C: Generate from scratch**
If the user provides only background information (text, bullet points, work history), generate a new tailored resume. Use the docx SKILL if available for professional formatting, or output as clean Markdown. This mode is ideal for:
- Users without an existing resume
- Career changers who need a fundamentally different structure
- Users who want a fresh start on their resume

---

## Phase 1: Extract and Analyze the JD

Parse the job description for:

- **Role title and seniority level**
- **Top 10–15 ATS keywords** — look for tools, skills, frameworks, and domain terms repeated or bolded (e.g., "DSPs", "MMPs", "attribution models", "A/B testing", "cross-functional", "roadmap", "MarTech")
- **3–5 core responsibilities** the role emphasizes most
- **Company signals** — tone (corporate vs. startup), mission language, product focus
- **Company Information** — use websearch tool to search company recent news, blog that relate to the JD. Additionally, search on LinkedIn to check users who share a similar title (for instance, if the role is Sr Data Scientist, search for any user whose current/past company is the same and whose title is Data Scientist / Sr Data Scientist / Staff Data Scientist / Lead Data Scientist etc.) and search their work experience to see if there's any additional accomplishments and job description context.

### Prioritize Requirements

Create a priority map:
- **Priority 1 (Critical)**: Deal-breaker requirements — years of experience, required skills, education
- **Priority 2 (Important)**: Strongly desired qualifications — key methodologies, domain expertise
- **Priority 3 (Nice-to-have)**: Bonus skills, preferred certifications, cultural fit indicators

Group keywords into categories: Technical Tools, Domain Expertise, Leadership/Process, Metrics.

---

## Phase 2: Audit the Resume

Extract the full text of the resume (use `pandoc  -t plain` or read directly from XML if unpacked, or use the pasted text for Mode C).

Check:
- Which JD keywords are already present → keep
- Which JD keywords are missing but clearly apply to the user's experience → candidates to inject
- Which bullets are weak (vague, no metric, no action verb) → rewrite targets
- ATS risks: typos, inconsistent hyphenation, missing sections

### Bullet Rewriting Formula

Every strong bullet follows: **Action verb + What you did + How (method/tool/scale) + Result (metric or impact)**

**Weak:** "Led marketing platform work at Loblaw"
**Strong:** "Architected AI-powered marketing platform automation, designing ML workflows that drive end-to-end creative production at scale for a 20M+ customer base"

Apply this to every bullet that lacks a metric or is vague.

**IMPORTANT — Preserve meaning when rewriting bullets:**
- **Keep the same domain and subject matter** — if a bullet is about fraud, the rewrite is about fraud. Don't swap in JD language that changes what the work was actually about.
- **Keep the same methods** — if the user ran A/B tests for X purpose, don't change it to causal inference for Y purpose.
- **Keep the same outcome/goal** — if the goal was risk mitigation, don't change it to growth optimization.
- If the original bullet has no metric, do NOT invent one. Instead, either:
  1. **Ask the user** for the real number: "Your bullet about the marketing platform — do you know the actual revenue impact or user count?"
  2. **Use qualitative scale words** that are clearly true from context: "at scale", "enterprise-wide", "across multiple channels" — but only if the user's description supports that scope
  3. **Use a placeholder** in the draft: "reducing processing time by [X%]" and flag it for the user to fill in
- Minor polish is fine: stronger verbs, tighter phrasing, adding a JD keyword that genuinely describes the work. Just don't change what the work IS.

### Mapping Experience to Requirements

For each JD requirement:
- Identify matching experience from candidate's background
- Find transferable skills if no direct match
- Note gaps that need to be addressed or de-emphasized
- Identify unique strengths to highlight

### Filling Experience Gaps

After auditing the resume against the JD, if there are core JD responsibilities with no matching bullet at all, don't just skip them. Ask the user: "The JD emphasizes [specific area] but I don't see that on your resume — have you done anything related in your roles, even informally?" People often have relevant experience they didn't think to include (e.g., they ran A/B tests but didn't call it "experimentation", or they coordinated across teams but didn't frame it as "cross-functional leadership"). If the user confirms they have relevant experience, help them craft a new bullet using the Action+What+How+Result formula and find the right place to insert it — usually under the role where it happened. If the gap is essential to the role and the user truly has no related experience, flag it honestly so they can address it in the cover letter or interview prep instead.

---

## Phase 3: Edit or Generate the Resume

### Mode A: Preserving Formatting (Edit .docx XML)

**Always edit the original `.docx` XML directly** when the user wants to preserve their formatting. Never use the `docx` npm package or generate a new document from scratch — this destroys fonts, spacing, and style.

#### Unpack Workflow

```bash
# Unpack the original docx
cp  /sessions/.../unpacked.docx
unzip /sessions/.../unpacked.docx -d /sessions/.../edit/

# Edit the XML
# File to edit: /sessions/.../edit/word/document.xml

# Repack
cd /sessions/.../edit && zip -r /tmp/output.docx . && cp /tmp/output.docx 
```

#### What to Edit in document.xml

- **`` elements** contain the text — edit these directly
- **Bullet structure** uses `` — don't touch this, just change the `` content
- **Bold runs** use `` in `` — preserve when editing bold phrases
- **Spacing paragraphs** — if the resume pushes to 2 pages after edits, find empty `` spacer paragraphs and reduce their `` value from 12 to 6 or 4
- **Special characters**: use `&#x2014;` for em dash, `&#x2019;` for right single quote/apostrophe, `&#x201C;`/`&#x201D;` for smart quotes

### Mode C: Generating from Scratch

When generating a new resume, structure it as follows:

**Professional Summary** (3-4 lines):
- Lead with years of experience in the target role/field
- Include top 3-4 required skills from job description
- Mention industry experience if relevant
- Highlight unique value proposition

**Technical/Core Skills Section**:
- Group skills by category matching job requirements
- List required tools and technologies first
- Use exact terminology from job description
- Only include skills you can substantiate with experience

**Professional Experience** (reverse chronological):
- For each role, emphasize responsibilities and achievements aligned with job requirements
- Use the Action+What+How+Result bullet formula
- Reorder bullet points to prioritize most relevant experience
- Use keywords naturally from job description

**Education**:
- List degrees, certifications relevant to position
- Include relevant coursework if early career
- Add certifications that match job requirements

**Optional Sections** (if applicable):
- Certifications & Licenses
- Publications or Speaking Engagements
- Awards & Recognition
- Projects (especially for technical roles)

**Page Guidelines**: 1 page for ` element (Mode A) or every line (Mode C) for common errors ("Scabble" → "Scalable", "to parses" → "to parse", "end to end" → "end-to-end")
2. **Page count** — open the `.docx` in LibreOffice if needed to visually estimate length, or count `` elements. If the resume is clearly running long (wall of text, very few spacer paragraphs), reduce spacer `` values.
3. **Keyword coverage** — confirm top 10 JD keywords appear at least once
4. **Bullet formula** — confirm every bullet has an action verb + result
5. **No redundancy** — if the section summary and first bullet say the same thing, merge or rewrite
6. **Meaning preservation check (CRITICAL)** — go through every rewritten bullet and compare it to the original. For each bullet, verify:
   - The **domain/subject** is the same (fraud → fraud, not fraud → growth)
   - The **methods** described are the same (A/B testing for X → A/B testing for X, not causal inference for Y)
   - The **purpose/outcome** is the same (risk mitigation → risk mitigation, not activation impact)
   - No metrics were invented — every number existed in the original or was provided by the user
   - If a rewrite changed the meaning of what the user did, revert it and rewrite preserving the original subject matter
7. **Formatting consistency** — consistent date formats, spacing, capitalization, bullet style

---

## Phase 5: Cover Letter Rewriting

Cover letters are **not a resume in paragraph form**. The core principle: tell the story behind the resume, not the facts on it.

### Structure (preserve the user's original structure)

Follow whatever structure is in the user's original cover letter — date, addressee, Re: line, greeting, intro paragraph, bullet section, closing paragraph, sign-off.

### Intro Paragraph

Should answer: **Why this company? Why this role? Why now?** Connect the company's mission/product to a genuine reason you care. Avoid generic openers like "I am excited to apply for..."

### Bullet Rewrites — Narrative, Not Metrics

Each bullet should follow this arc:
1. **Open with an insight or tension** — a problem you recognized or a belief you hold about the space
2. **Show how you acted on it** — what you built, changed, or navigated
3. **Close with why it matters here** — connect explicitly to what the role demands

**Don't do this (resume regurgitation):**
> "At Canadian Tire, I developed an 18-month roadmap managing $50M revenue with 100% YOY growth and led 15 people."

**Do this (narrative):**
> "Building a marketing platform that scales means understanding what marketers need to stop doing, not just what they need to do more of. At Canadian Tire, by making deliberate roadmap tradeoffs and aligning tightly with marketing leadership, I grew a greenfield retail media product into a $50M business at 100% YOY growth. At Loblaw, I took that lesson further—embedding AI and machine learning into creative workflows to remove production bottlenecks entirely. That's the platform thinking I'd bring to DraftKings' customer acquisition engine."

The resume proves you can do the job. The cover letter makes the hiring manager want to meet you.

### Length

Cover letter must fit on **one page**. If it runs long, trim bullet text first (middle sentences, not the opening insight or closing connection). The intro and closing paragraphs are usually not the problem — the bullets are.

### Cover Letter XML Editing

Same workflow as resume — edit `cl_edit/word/document.xml` directly to preserve formatting.

**Known gotcha**: If the original `.docx` was created from a Word template, `word/settings.xml` may contain `` referencing a local `.dotx` file. If the `.rels` file for settings doesn't have a corresponding `rId1` relationship (because the template is on a local machine), Word will throw a validation error. Fix: remove the `` element from `settings.xml`.

---

## Phase 6: Strategic Recommendations

After completing the resume (and cover letter if applicable), provide:

**Strengths Analysis**:
- What makes this candidate competitive for this specific role
- Unique qualifications to emphasize in interview

**Gap Analysis**:
- Requirements not fully met
- Suggestions for addressing gaps (courses, projects, reframing experience)

**Interview Pr

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [archiehzh0405-lang](https://github.com/archiehzh0405-lang)
- **Source:** [archiehzh0405-lang/resume-cover-letter-optimizer](https://github.com/archiehzh0405-lang/resume-cover-letter-optimizer)
- **License:** Apache-2.0

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-archiehzh0405-lang-resume-cover-letter-optimizer-resume-cover-letter-optimizer
- Seller: https://agentstack.voostack.com/s/archiehzh0405-lang
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
