v1.3.0

ai-job-search-dev/ai-job-searchv1.3.0Aug 3, 2026by MadsLorentzen

Upgrading?

AI Summary

Focuses on ATS compatibility and language requirements. CV dates are made ATS-safe, and the Language Gate checks posting requirements against user skills.

Key Highlights

  • CV dates changed from -- to - to be readable by ATS.
  • Language Gate implemented to filter postings by language requirements.
  • Fork reconciliation required for methodology files.

Breaking Changes

  • 01-candidate-profile.md structure changed (free-form Languages: line becomes a table).
  • cv/main_example.tex date fields changed from -- to -.

New Features

  • /upskill aggregate mode consumes gaps.
  • Salary Excel parsing improved for localized numbers.
  • Gitignore guard now enforces all personal-data rules.

Full Release Notes

## 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 `\cventry` date 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

- `/upskill` aggregate mode consumes the gaps `/rank` records instead of re-inferring them, completing the #258 pair (#264, thanks @NotAbdelrahmanelsayed)
- `tools/convert_salary_excel.py` parses 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.py` no longer fires a spurious fork-vs-self warning on lowercased clone URLs (#273), and SETUP.md section 8 now shows the `git remote add upstream` command 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](https://github.com/MadsLorentzen/ai-job-search/blob/master/CHANGELOG.md).

Related Repositories