mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 08:36:25 +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.
74 lines
1.2 KiB
Plaintext
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/
|