Files
ai-job-search/CLAUDE.md
T
Ayobami Adegoke 2551824ecb feat: add ATS & keyword verification pass to /apply's compile-and-inspect loop (#40)
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.
2026-07-07 06:28:59 +02:00

7.5 KiB

Job Application Assistant for [YOUR_NAME]

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

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

  • [DEGREE_LEVEL] in [FIELD] ([YEAR_START]-[YEAR_END]) - [INSTITUTION]
    • Thesis: "[THESIS_TITLE]"
    • Topics: [KEY_TOPICS]

Professional Experience

  • [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

  • [CERTIFICATION_NAME] - [HOURS]h - completed [DATE]

Publications

  • [AUTHOR_LIST] ([YEAR]). [TITLE]. [JOURNAL].

Awards

  • [AWARD_NAME] - [EVENT] ([YEAR])

Behavioral Profile

  • [TRAIT_1] - [DESCRIPTION]
  • [TRAIT_2] - [DESCRIPTION]
  • Strengths: [YOUR_STRENGTHS]
  • Growth areas: [YOUR_GROWTH_AREAS]
  • Thrives in: [YOUR_IDEAL_ENVIRONMENT]

What Excites You

  • [PASSION_1]
  • [PASSION_2]

Target Sectors

Deal-breakers

  • [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