---
name: cv-from-job
description: Create a tailored CV from job description. Use when user says "CV", "resume", "cv-from-job", "tailor my CV", or provides a job description to match against.
allowed-tools: Read Write Edit Bash Glob Grep WebSearch WebFetch
category: productivity
compatibility: claude-code
metadata:
  version: 1.0.0
---

You are helping create a tailored CV based on a job description. Follow these steps carefully:

## Step 1: Locate job description
- Ask the user which job description to use (they should provide the file name or path)
- The job description is typically stored in the user's vault under `Career/Job-Search/` as a markdown file with a `jbs - ` prefix
- Example: `jbs - [Company] - [Role].md`

## Step 2: Analyze the JD (critical step)

### 2a: Identify their problems
Job descriptions are signals to decode, not specs to match. The hiring manager prompted an LLM, tweaked it, handed it to a recruiter who distilled it further. Your job: figure out what problems this company is trying to solve.

Extract:
- **Core business problems** they're hiring to fix
- **Gaps in their current team** implied by the requirements
- **Urgency signals** (growth stage, transformation, new market, etc.)

### 2b: Extract non-generic must-haves
**Filter OUT these generic terms - ignore them completely:**
- team player, strong communication, fast-paced environment
- collaborative, excellent problem-solving, self-starter
- attention to detail, results-oriented, passionate

**Filter IN unique signals:**
- Specific technologies or platforms
- Domain expertise (payments, ads, privacy, healthcare, fintech, etc.)
- Scale indicators (user counts, revenue figures, team sizes)
- Unique company context (transformation, IPO, pivot, expansion)
- Specific methodologies if emphasized unusually

### 2c: Calculate match percentage
Estimate overlap between user's background and the extracted must-haves.
- **Above 70%**: Proceed normally
- **50-70%**: Note which areas are weaker, focus CV on strengths
- **Below 50%**: WARN the user - "Your background has approximately X% overlap with this role. Proceeding may require stretching claims. Consider whether this application is worth the effort."

### 2d: Research the company
Use WebSearch to find:
- Recent news (funding, launches, pivots, leadership changes)
- Public product/strategy signals (blog posts, press, earnings)
- Glassdoor/Blind themes (optional, for tone calibration)

Use 1-2 findings to sharpen the Summary in Step 5. Don't add a "Company Research" section to the CV; weave it into how you frame your relevance.

### 2e: Research the hiring manager (if name is available)
Ask: "Do you know who the hiring manager is? (Name and/or LinkedIn URL)"

If provided, use WebSearch and WebFetch (LinkedIn) to build a lightweight profile:
- **Values and interests**: What do they post/share about? What topics do they engage with?
- **Management style (inferred)**: From their posts, recommendations given/received, team culture signals
- **Career path**: Where they came from, what they've built; shared experiences = instant rapport
- **Shared connections**: Mutual LinkedIn connections who could be referral bridges
- **Hot takes or pet peeves**: Any public opinions on product management, hiring, process?

Save findings as a hidden block in the CV Obsidian note:
```html
<!-- hiring-manager-intel -->
**Hiring Manager:** [Name]
**LinkedIn:** [URL]
**Values/Interests:** [bullets]
**Inferred Style:** [1-2 sentences]
**Shared Connections:** [names]
**Conversation Hooks:** [2-3 topics you could naturally reference]
<!-- /hiring-manager-intel -->
```

Use these findings to:
1. Tune the Summary tone (e.g., if HM values data-driven decisions, lead with metrics)
2. Inform the cold outreach draft in Step 9 (reference something they care about)
3. Identify potential referral paths via shared connections

## Step 3: Fetch LinkedIn Profile
- First, try WebFetch with your LinkedIn profile URL (e.g., `https://www.linkedin.com/in/[your-handle]/`) to get current profile data
- If WebFetch fails or returns incomplete data, fall back to PDF method:
  - Look for `Profile*.pdf` files in `~/Downloads/`
  - Check the modification date - warn if older than 30 days
  - If too old, ask the user to download a fresh LinkedIn profile PDF before proceeding

**Setup note:** Before first use, replace the LinkedIn URL above with your own, or prompt for it on first run.

## Step 4: Find or create CV note
- Look for existing CV note in your vault's `Career/Job-Search/` folder
- Pattern: `CV - [Company Name] - [Position].md`
- If it doesn't exist, create a new one with this naming pattern

## Step 5: Create tailored CV in Obsidian markdown format

### YAML frontmatter (required):
```yaml
---
position: [Position Title]
company: [Company Name]
created: [YYYY-MM-DD]
status: draft
match_percentage: [estimated %]
---
```

### Structure:

#### 1. Header
Name, tagline, contact info (email, LinkedIn, phone, location) - all on one line separated by `|` - ALWAYS include phone number.

**Setup note:** Hardcode your own contact details here, or have the skill read them from a config block at the top of your vault's Job-Search folder.

#### 2. Summary (THIS IS THE WHOLE GAME - spend 60% of optimization effort here)
**The recruiter spends 5-7 seconds here. Everything that matters goes in these 3 lines.**

Use this template structure:
```
[X years] [specific field] leader | [domain expertise], [recognizable company names] | [quantified impact: revenue/users/scale] | [notable education if relevant]
```

Then 2-3 sentences proving you solve THEIR specific problems (from Step 2a). Not why you like them - why you fix their gaps.

**Kill these words in the summary:** passionate, driven, results-oriented, seasoned, dynamic, innovative. Replace with metrics.

#### 3. Professional experience
- Include only most relevant roles (typically last 3-5 positions)
- Use Title Case for all job titles
- For each role: company, dates, one-line context, 3-5 bullet points

**Bullet formulas (enforce strictly):**

Standard bullet:
`[Action Verb] + [Context] + [Result] + [Metric]`

Judgment bullet (use 1-2 per role for senior+ positions):
`[Chose/Prioritized/Killed] + [Decision context: X over Y] + [Reasoning signal] + [Outcome + Metric]`

For Director+ roles, at least 30% of bullets should show trade-offs and judgment, not just execution.

Good (standard): "Led cross-org initiative improving account security for 2B users, reducing breach incidents 40%"
Good (judgment): "Killed a 6-month feature initiative 3 weeks before launch after user research showed <2% adoption signal, redirecting team to payment flow redesign that lifted conversion 18%"
Bad: "Led a robust initiative to comprehensively improve our strategic security posture"

**Banned adjectives - never use these:**
robust, strategic, comprehensive, excellent, strong, incredible, innovative, dynamic, cutting-edge, world-class, best-in-class, state-of-the-art

**Stack-rank bullets:** Most relevant to THIS job at top. Don't rewrite - reorder. The bullet that proves you solve their #1 problem goes first.

#### 4. Leadership and community
Board positions, co-founder roles, advisory positions. Only if relevant to the role.

#### 5. Core competencies
Single paragraph format. Map directly to their non-generic must-haves from Step 2b.

#### 6. Education and certifications
Degrees and relevant certifications. One line per entry (institution, degree, year); no bullet descriptions unless the credential is directly load-bearing for the target role.

#### 7. Languages
One line with proficiency levels.

#### 8. Forwardable blurb (hidden section, not in PDF)

Write a 2-3 sentence blurb the user can give to a referrer for copy-paste forwarding. Format:

> [Name] is a [X-year] [domain] product leader at [Current Company]. She [1 specific proof of work relevant to this role]. She's looking at [Company] because [1 specific reason tied to company research from 2d].

Mark this section with `<!-- forwardable-blurb -->` HTML comment so it's visible in Obsidian but excluded from PDF generation.

### Six-bucket coverage check (run after drafting bullets)
Verify the CV has representation across ALL six categories:

| Bucket | Covered? | Example bullet |
|--------|----------|----------------|
| Product Development (building, launching, iterating) | | |
| Leadership & Execution (leading teams, driving outcomes) | | |
| Strategy & Planning (roadmaps, prioritization, vision) | | |
| Business & Marketing (GTM, revenue, market understanding) | | |
| Project Management (delivery, coordination, timelines) | | |
| Technical & Analytical (data, metrics, technical depth) | | |

If any bucket is empty, add a bullet or flag to user.

### Red flag scan (run before showing to user)
Check for and fix:
- [ ] Skills stuffing (keywords without outcomes) - remove or add proof
- [ ] Subjective adjectives without metrics - replace with numbers
- [ ] Important things buried at bottom - reorder
- [ ] Walls of text - break up
- [ ] Missing time blocks - add explanation or flag to user
- [ ] Banned adjectives present - replace

### Formatting rules:
- Use sentence case for ALL headings except job titles (which use Title Case)
- Include YAML frontmatter with position, company, created date, status, match_percentage
- No "Executive summary" - use "Summary"
- No unnecessary sections (no reflection questions, checklists, etc.)
- Keep it concise - aim for 2 pages when converted to PDF
- Use bullet points sparingly - only for key achievements
- Bold important achievements in bullet points
- NEVER use em dashes in CVs - use regular hyphens (-), semicolons, or commas instead
- NEVER use italics in the PDF

## Step 6: Review with user
- Show the match percentage and any warnings
- Show the six-bucket coverage table
- Show the user the created CV in Obsidian
- Ask if they want any changes before creating PDF

## Step 7: Create PDF (only after user confirmation)
- Ask: "CV created at [path]. Would you like me to create a PDF version?"
- Wait for explicit user confirmation
- When confirmed, create HTML intermediate file
- Use Chrome headless to generate PDF with `--no-pdf-header-footer` flag
- Save as: `CV - [Your Name] - [Position Title] - [Company Name].pdf` in your vault's Career/Job-Search/ folder
- Open the PDF for user review

## Step 8: Update Job Search Tracker
After creating the CV (whether PDF is created or not), update the tracker:
- Open `Career/Job-Search/Job Search Tracker.md` in your vault
- Add a new row to the "Active applications" table with:
  - Company name
  - Role/position
  - Status: "draft"
  - Applied: "-" (until user confirms they applied)
  - Result: "-"
  - JD link: link to the jbs file if it exists, otherwise "-"
  - CV link: link to the CV markdown file
- Update the Stats section at the bottom

**Setup note:** This step assumes a `Job Search Tracker.md` file exists in your Job-Search folder. Create one with an `## Active applications` table and `## Stats` section on first use, or skip this step.

## Step 9: Cold outreach draft (optional)
Ask: "Would you like a cold outreach message for the hiring manager?"

If yes:
- Use company research from Step 2d AND hiring manager intel from Step 2e
- If HM is known: address them by name, reference something specific they've posted or built
- If HM is unknown: reference a specific company product challenge
- Connect it to one concrete thing you've shipped or decided
- Keep under 100 words (LinkedIn message length)
- No "I'm passionate about" or "I'd love to pick your brain"
- End with a specific, low-friction ask ("Happy to share how we solved [X] at [Company] - worth a 15-min call?")

Save as a note block at the bottom of the CV Obsidian file, marked with `<!-- cold-outreach -->`.

## Step 10: Interview prep (optional)

See `references/interview-prep.md` for the full interview prep workflow (story mining, scoring rubric, 60-second pitch, and 3x3 concern sheet).

## Setup checklist (first-time users)

Before running this skill, personalize:
1. Your LinkedIn URL (Step 3)
2. Your header block: name, email, LinkedIn, phone, location (Step 5, #1 Header)
3. Your vault path for `Career/Job-Search/` (if different from Obsidian default)
4. A `Job Search Tracker.md` file with `## Active applications` table and `## Stats` section (Step 8), or remove Step 8
