Files
ai-job-search/.gitignore
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

74 lines
1.2 KiB
Plaintext

# Dependencies
node_modules/
bun.lock
# Python
__pycache__/
*.pyc
*.pyo
.venv/
venv/
# Compiled documents
*.pdf
*.aux
*.log
*.out
*.synctex.gz
*.fls
*.fdb_latexmk
# Personal data (never commit these)
salary_data.json
job_scraper/seen_jobs.json
job_scraper/*.md
*_BehavioralReport.pdf
linkedin_Profile.pdf
# Personal photos and signatures
*.jpg
*.jpeg
*.png
!cover_letters/OpenFonts/fonts/**
# OS files
.DS_Store
Thumbs.db
# Editor
.vscode/
.idea/
# Memory files (Claude Code user-specific)
.claude/projects/
# Skills lock (auto-generated)
skills-lock.json
# Personal application output files (generated by /apply — do not share)
cv/main_*.tex
!cv/main_example.tex
cv/*.txt
cover_letters/cover_*.tex
cover_letters/Cover_*.tex
# documents/ subfolder contents are personal — only README and folder structure are tracked
documents/cv/**
documents/linkedin/**
documents/diplomas/**
documents/references/**
documents/applications/**
!documents/**/.gitkeep
# Personal job search tracking
job_search_tracker.csv
# Upskill reports (personal output)
upskill/*.md
# Agent skills: track the source, ignore only deps and logs.
# (A blanket `.agents/` ignore silently drops the job-search CLI skills from the repo.)
.agents/**/node_modules/
.agents/**/*.log
.agents/usage/