Why update
Your CV's dates may be invisible to ATS parsers. The stock template wrote date ranges as [YYYY--YYYY], and LaTeX turns -- into an en-dash glyph that extracts from the PDF text layer as � - so an ATS reads 2016�2024 and parses no date range at all. This failed silently: the rendered page looks perfect and every existing check passed. Confirmed against a real Workday import (a lost end date and zero education entries). The template now uses ASCII hyphens, and 05-cv-templates.md documents the check that catches it. If you built CVs from this template, see the CHANGELOG's fork reconciliation note for a one-line grep that finds affected files. (#276, thanks @kblackma)
The Language Gate. The framework never checked a posting's language requirements against what you actually speak. Now it does, everywhere: /setup captures a structured Languages table (asked directly, or read from your CV/LinkedIn export), and a posting requiring a language you haven't declared is excluded before scoring, while one asking for a higher level than you declared is flagged for your own judgment - never silently dropped, never silently passed. Wired through /scrape, /rank (persisted to seen_jobs.json), and /apply. (#275, thanks @GabrielMensi)
For fork maintainers - read before pulling
This is the heaviest reconciliation release so far. Three methodology files bumped framework_version (01-candidate-profile.md 1.0.0 → 1.1.1, 04-job-evaluation.md 1.1.0 → 1.2.2, 05-cv-templates.md 1.3.0 → 1.4.0), and two changes land on lines your fork has personalized:
- CLAUDE.md / 01-candidate-profile.md: the free-form
Languages:line becomes a structured table. Expect a conflict there; keep your languages, adopt the table shape. - cv/main_example.tex: the five
\cventrydate fields changed--to-. Keep your own dates, apply the same one-character change, and run the grep from the CHANGELOG over your other CV variants.
Run python3 tools/check_upstream_updates.py after fetching - it lists exactly which of your personalized files this release touched, with per-file diff commands.
Also in this release
/upskillaggregate mode consumes the gaps/rankrecords instead of re-inferring them, completing the #258 pair (#264, thanks @NotAbdelrahmanelsayed)tools/convert_salary_excel.pyparses localized numeric text cells ("108,5","1.234,5") instead of silently dropping them, and deliberately skips the one ambiguous pattern ("1,234") rather than guessing (#272, thanks @ayobamiseun)tools/check_upstream_updates.pyno longer fires a spurious fork-vs-self warning on lowercased clone URLs (#273), and SETUP.md section 8 now shows thegit remote add upstreamcommand it always assumed you'd run (#274) - both thanks @oscarbol09- The gitignore guard now enforces every personal-output ignore rule, so any future weakening of the personal-data boundary fails CI (#271, thanks @ayobamiseun)
Full details in the CHANGELOG.