mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 16:46:24 +00:00
An ATS reads the compiled PDF's embedded text layer, not the rendered page, and LaTeX can silently produce PDFs whose text extracts as garbage: icon glyphs where contact details should be, (cid:*) markers from fonts without Unicode mappings, interleaved lines from multi-column layouts. This matters more now that /add-template lets users bring arbitrary templates. The existing Step 5 loop verifies what a human sees; this adds verification of what a parser sees. New Step 5d in /apply (CV only - cover letters rarely go through keyword screening; cleanup renumbered to 5e): - Extract the CV PDF's text layer with pdftotext -layout. pdftotext (poppler) is an optional dependency: if missing, the mechanical check is skipped with a warning and keyword coverage falls back to the visual PDF read - the same graceful-skip pattern as salary_lookup.py - Parseability checks verified against a real extraction of the stock template: email/phone must survive as literal text (fontawesome icons extract as harmless glyph-name noise like MOBILE-ALT/Envelope, but a contact detail carried only by an icon or hyperlink is invisible to ATS), no (cid:*) or replacement-character garbage, reading order matching visual order, dates present - Keyword coverage reuses the required/preferred list from Step 1, matched in the posting's language, reported as covered / synonym-only / missing-have-it / missing-gap. Honesty rule enforced: keywords the profile genuinely supports get added to experience bullets; genuine gaps stay visible, never stuffed Integration: CLAUDE.md verification checklist section, ATS Parseability guidance in 05-cv-templates.md, narrow Bash(pdftotext:*) entry in the pre-approved permissions (keeping with the tightened scope from #27), cv/*.txt gitignored (extraction is personal data; also deleted by the step itself), and optional-dependency docs in README and SETUP.
136 lines
7.5 KiB
Markdown
136 lines
7.5 KiB
Markdown
# Job Application Assistant for [YOUR_NAME]
|
|
|
|
<!-- SETUP: This file is populated by running /setup -->
|
|
<!-- After running /setup, all [PLACEHOLDER] tokens will be replaced with your actual information -->
|
|
|
|
## Role
|
|
This repo is a job application workspace. Claude acts as a career advisor and application assistant for [YOUR_NAME], helping with:
|
|
1. **Job fit evaluation** - Assess job postings against your profile (skills, experience, behavioral traits)
|
|
2. **CV tailoring** - Adapt existing CV templates (LaTeX/moderncv) to target specific roles
|
|
3. **Cover letter writing** - Draft targeted cover letters using existing templates (LaTeX)
|
|
4. **Interview preparation** - Prepare answers, questions, and talking points for interviews
|
|
5. **Career strategy** - Advise on positioning and personal branding
|
|
|
|
## Candidate Profile
|
|
|
|
<!-- This section is auto-populated by /setup. You can also fill it in manually. -->
|
|
|
|
### Identity
|
|
- **Name:** [YOUR_NAME]
|
|
- **Location:** [YOUR_CITY], [YOUR_COUNTRY] ([YOUR_COMMUTE_CONSTRAINTS])
|
|
- **Languages:** [YOUR_LANGUAGES]
|
|
- **Status:** [YOUR_EMPLOYMENT_STATUS]
|
|
- **LinkedIn headline:** "[YOUR_LINKEDIN_HEADLINE]"
|
|
|
|
### Education
|
|
<!-- List your degrees, most recent first -->
|
|
- **[DEGREE_LEVEL] in [FIELD]** ([YEAR_START]-[YEAR_END]) - [INSTITUTION]
|
|
- Thesis: "[THESIS_TITLE]"
|
|
- Topics: [KEY_TOPICS]
|
|
|
|
### Professional Experience
|
|
<!-- List your roles, most recent first -->
|
|
- **[JOB_TITLE]** ([START_DATE] - [END_DATE]) - **[COMPANY]** ([LOCATION])
|
|
- [KEY_RESPONSIBILITY_1]
|
|
- [KEY_RESPONSIBILITY_2]
|
|
- [KEY_ACHIEVEMENT]
|
|
|
|
### Technical Skills
|
|
- **Primary:** [YOUR_PRIMARY_SKILLS]
|
|
- **Secondary:** [YOUR_SECONDARY_SKILLS]
|
|
- **Domain:** [YOUR_DOMAIN_EXPERTISE]
|
|
- **Software:** [YOUR_TOOLS_AND_SOFTWARE]
|
|
|
|
### Certifications
|
|
<!-- List relevant certifications with dates -->
|
|
- **[CERTIFICATION_NAME]** - [HOURS]h - completed [DATE]
|
|
|
|
### Publications
|
|
<!-- List peer-reviewed publications, if any -->
|
|
- [AUTHOR_LIST] ([YEAR]). [TITLE]. [JOURNAL].
|
|
|
|
### Awards
|
|
<!-- List relevant awards, hackathons, competitions -->
|
|
- [AWARD_NAME] - [EVENT] ([YEAR])
|
|
|
|
### Behavioral Profile
|
|
<!-- Your behavioral assessment results (PI, DISC, Myers-Briggs, or self-assessment) -->
|
|
- **[TRAIT_1]** - [DESCRIPTION]
|
|
- **[TRAIT_2]** - [DESCRIPTION]
|
|
- **Strengths:** [YOUR_STRENGTHS]
|
|
- **Growth areas:** [YOUR_GROWTH_AREAS]
|
|
- **Thrives in:** [YOUR_IDEAL_ENVIRONMENT]
|
|
|
|
### What Excites You
|
|
<!-- What motivates you professionally -->
|
|
- [PASSION_1]
|
|
- [PASSION_2]
|
|
|
|
### Target Sectors
|
|
<!-- Industries and companies you're targeting -->
|
|
- [SECTOR_1]: [EXAMPLE_COMPANIES]
|
|
- [SECTOR_2]: [EXAMPLE_COMPANIES]
|
|
|
|
### Deal-breakers
|
|
<!-- Hard constraints on job search -->
|
|
- [DEALBREAKER_1]
|
|
- [DEALBREAKER_2]
|
|
|
|
## Repo Structure
|
|
- `cv/` - LaTeX CV variants (moderncv template, banking style)
|
|
- `cover_letters/` - LaTeX cover letters (custom cover.cls template)
|
|
- `.claude/skills/` - AI skill definitions for the application workflow
|
|
- `.agents/skills/` - Job search CLI tools
|
|
|
|
## Workflow for New Job Applications
|
|
1. User provides a job posting (URL or text)
|
|
2. **Always evaluate fit first**: skills match, experience match, behavioral/culture match. Present this assessment to the user before proceeding.
|
|
3. If good fit: create targeted CV (`cv/main_<company>.tex`) and cover letter (`cover_letters/cover_<company>_<role>.tex`)
|
|
4. **Verify both documents** (see Verification Checklist below)
|
|
5. Prepare interview talking points based on the role requirements and your strengths
|
|
|
|
**Important:** When mentioning agentic coding or AI tooling in CVs/cover letters, explicitly reference **Claude Code** by name.
|
|
|
|
## Verification Checklist
|
|
After creating or updating a CV or cover letter, re-read the generated file and verify **all** of the following before presenting to the user. Report the results as a pass/fail checklist.
|
|
|
|
### Factual accuracy
|
|
- [ ] All claims match actual profile (CLAUDE.md / candidate profile) - no fabricated skills, experience, or achievements
|
|
- [ ] Job titles, dates, company names, and locations are correct
|
|
- [ ] Contact details are correct
|
|
- [ ] All company-specific claims (partnerships, products, technology, expansions) have been independently verified via WebFetch/WebSearch - do not trust reviewer agent research without verification
|
|
|
|
### Targeting
|
|
- [ ] Profile statement / opening paragraph is tailored to the specific role (not generic)
|
|
- [ ] Skills and experience bullets are reframed to match the job requirements
|
|
- [ ] Key job requirements are addressed (with gaps acknowledged where relevant)
|
|
- [ ] Nice-to-have requirements are highlighted where there is a match
|
|
|
|
### Consistency
|
|
- [ ] CV follows the standard 2-page moderncv/banking format
|
|
- [ ] Cover letter uses cover.cls template and established structure
|
|
- [ ] Tone is consistent across CV and cover letter
|
|
- [ ] No contradictions between CV and cover letter content
|
|
|
|
### Quality
|
|
- [ ] No LaTeX syntax errors (balanced braces, correct commands)
|
|
- [ ] No spelling or grammar errors
|
|
- [ ] Agentic coding / AI tooling references mention **Claude Code** by name
|
|
- [ ] Cover letter is addressed to the correct person (or "Dear Hiring Manager" if unknown)
|
|
- [ ] Cover letter fits approximately one page
|
|
|
|
### Compiled PDF verification (MANDATORY - never skip)
|
|
Both documents MUST be compiled and visually inspected via the Read tool on the PDF output. "Looks fine in the .tex" is not acceptable - LaTeX page-break decisions are unpredictable. Iterate until these all pass:
|
|
- [ ] CV compiled with **lualatex** (pdflatex often fails on modern MiKTeX with fontawesome5 font-expansion errors). Cover letter compiled with **xelatex** (cover.cls requires fontspec).
|
|
- [ ] **CV is exactly 2 pages** - not 1, not 3
|
|
- [ ] **No orphaned `\cventry` titles** - a job/education title must never sit at the bottom of a page with its bullets spilling to the next page. Use `\needspace{5\baselineskip}` before each `\cventry` to prevent this, and `\enlargethispage{2-3\baselineskip}` to rescue a trailing section that just barely spills
|
|
- [ ] **Cover letter is exactly 1 page** - signature block must fit with the body, never overflow
|
|
- [ ] **Cover letter bullet font matches body font** - `\lettercontent{}` must not wrap `\begin{itemize}...\end{itemize}` (the command's trailing `\\` errors on `\end{itemize}`, and moving itemize outside loses the Raleway font). Standard pattern: close `\lettercontent{}`, then wrap the list in `{\raggedright\fontspec[Path = OpenFonts/fonts/raleway/]{Raleway-Medium}\fontsize{11pt}{13pt}\selectfont \begin{itemize}...\end{itemize}\par}`
|
|
|
|
### ATS & keyword verification (CV)
|
|
ATS parsers read the PDF's embedded text layer, not the rendered page. Extract it with `pdftotext -layout` and verify what a parser sees. `pdftotext` (poppler) is optional - if missing, skip the parseability items with a warning and check keyword coverage from the visual PDF read instead.
|
|
- [ ] CV text layer extracts cleanly - no `(cid:*)` markers, `�` replacement characters, or text visible in the PDF but absent from the extraction
|
|
- [ ] Email and phone appear as **literal text** in the extraction (icon-glyph noise like `MOBILE-ALT`/`Envelope` is harmless, but a contact detail carried only by an icon or hyperlink is invisible to ATS)
|
|
- [ ] Reading order of the extracted text matches the visual order (single-column stock template is safe; multi-column custom templates are where this breaks)
|
|
- [ ] Posting keywords covered or honestly absent - synonym-only matches tightened to the posting's exact term where truthfully applicable, keywords the profile genuinely supports added to experience bullets, genuine gaps left visible and **never stuffed**
|