career-ops-v1.36.0

career-ops-hq/career-opscareer-ops-v1.36.0Oct 10, 2026by career-ops-release[bot]

Upgrading?

AI Summary

This release significantly expands job sourcing by adding eight new ATS providers and improves CV handling for Applicant Tracking Systems through linting, structure checks, and ATS-variant PDF generation. It also introduces a new Singapore market mode and various web dashboard enhancements.

Key Highlights

  • Added eight new job sources: ADP Workforce Now, Dayforce, Taleo, UKG Pro, JazzHR, Gupy, startup.jobs, and PageUp
  • Enhanced CV/ATS compatibility with atsLint, structure checks, and ATS-variant PDF generation
  • Added Singapore market mode and support for multiple markets in language.modes_dir
  • Enhanced web dashboard with local scheduled scans, analytics views, and assistant context preservation
  • Added opt-in GDPR consent footer for CVs

New Features

  • ci: fail a PR while a dependency it names is still open
  • contacto: surface saved internal-referral contacts
  • contacts: extract a recruiter/interviewer contact from a pasted reply
  • cv-facts: flag scope-verb inflation
  • cv-templates: add atsLint
  • cv: add opt-in GDPR consent footer slot
  • dashboard: open the job posting from the report viewer
  • i18n: support language.modes_dir as a list of declared markets
  • providers: add JazzHR, startup.jobs, PageUp providers
  • modes: add Singapore market mode
  • pdf: add CV structure check
  • pdf: opt-in ATS variant
  • scan: add ADP Workforce Now, Dayforce, Gupy, Taleo, UKG Pro
  • web: add local scheduled scans
  • web: Analytics progress + insights views
  • web: preserve assistant conversations and earlier context

Full Release Notes

<!-- co:release-notes:career-ops-v1.36.0 -->
This release is about getting through the filter: eight more places to find openings, and a CV that applicant tracking systems read the way you wrote it.

### Highlights

- **Eight new job sources.** ADP Workforce Now, Dayforce, Taleo and UKG Pro by @Schlaflied (#3729, #3734, #3743, #3733), JazzHR by @ilyakanevskiy (#4307), Gupy by @felipe-NR (#4550), startup.jobs by @phozzy (#4704) and PageUp by @williamchong (#4693). Eightfold boards now return their jobs instead of zero, by @kellymmcgrath (#4297).
- **A CV the ATS reads correctly.** `pdf --ats` writes a plain ATS variant next to the styled CV, by @vliggio (#4909). `atsLint` checks a template against ATS rules kept as data in `templates/ats-rules.yml`, by @rubicon (#3900). A CV structure check by @euskode (#3472), a title-consistency check by @Schlaflied (#2678), and a flag for inflated scope verbs and unsourced adoption claims by @MannXo (#3784). Hyphenated terms like "go-to-market" no longer split across lines in the PDF, by @Kevin-Boyle (#4911).
- **More markets.** A Singapore market mode by @jpelaez-23blocks (#4687), and `language.modes_dir` can now list several markets at once, by @Schlaflied (#3798).
- **The web dashboard.** Local scheduled scans by @aselekoglu (#2628), Analytics progress and insights read from the core by @abankar1 (#4576), and assistant conversations that keep their earlier context by @luochen211 (#4495).
- **Optional GDPR consent footer** for CVs (`{{CONSENT}}`), by @drawski (#4286).

Your agent offers this update at the start of your next session. If it doesn't, run this once in your career-ops folder:

```
node update-system.mjs apply --confirm
```

Your CV, profile, tracker and reports are not touched.

### Thank you

This release carries 211 pull requests from 68 people, 20 of them contributing for the first time.

- @vliggio: #3422, #3765, #3854, #3916, #4737, #4738, #4745, #4757, #4760, #4763, #4764, #4781, #4782, #4803, #4880, #4888, #4889, #4894, #4897, #4898, #4904, #4906, #4909
- @luochen211: #4374, #4381, #4445, #4452, #4494, #4495, #4500, #4640, #4641, #4643, #4644, #4647, #4648, #4669, #4670, #4733, #4740, #4741, #4742, #4762, #4865, #4869
- @Schlaflied: #2678, #3700, #3729, #3733, #3734, #3743, #3798, #3912, #4016, #4363, #4524, #4527, #4528, #4535, #4536, #4692, #4696, #4749, #4751, #4826
- @rubicon: #3653, #3900, #3904, #3905, #4008, #4069, #4094, #4403, #4404, #4406, #4412, #4533, #4567, #4651, #4800, #4802
- @abankar1: #3985, #3993, #4540, #4542, #4544, #4546, #4548, #4576, #4586, #4767
- @artemtrofymenko: #4511, #4519, #4739, #4747, #4756, #4779, #4806, #4814, #4884, #4892
- @ilyakanevskiy: #4307, #4569, #4613, #4633, #4711, #4714, #4778, #4790, #4804
- @roydonsequeira (first contribution): #4725, #4726, #4755, #4761, #4771, #4810, #4833
- @IaroslavMazur: #3304, #4195, #4321, #4666, #4671
- @Kevin-Boyle: #4821, #4823, #4900, #4911
- @maxmilian: #4563, #4699, #4815, #4863
- @Wizarck: #3789, #4705, #4706, #4707
- @felipe-NR: #4549, #4550, #4846
- @KusalPabasara (first contribution): #4688, #4744, #4746
- @MdRaf1: #4715, #4716, #4723
- @pmgwee: #4338, #4473, #4701
- @ronanime-arch: #4346, #4409, #4697
- @williamchong: #4689, #4690, #4693
- @AdilAzhariOmsan: #3522, #4638
- @jpelaez-23blocks (first contribution): #4686, #4687
- @kellymmcgrath: #4076, #4297
- @miteshanshu (first contribution): #4728, #4807
- @nikolaysm: #3716, #3947
- @phozzy (first contribution): #4704, #4765
- @sloemo01: #4333, #4341
- @SulimanAbdulrazzaq: #4885, #4912
- @Zoubeir23: #4214, #4557
- @aselekoglu (first contribution): #2628
- @badukucuk (first contribution): #4791
- @Bekon0700: #4685
- @brian8759 (first contribution): #4730
- @davidnunez: #2739
- @DennyHo0917 (first contribution): #4664
- @drawski (first contribution): #4286
- @egurnov: #4774
- @euskode: #3472
- @gunjanjaswal: #3191
- @huiq777 (first contribution): #4678
- @idontwannarock (first contribution): #4663
- @jduffey1990: #4817
- @MadhurJ10 (first contribution): #4812
- @MannXo: #3784
- @mbrow190: #4107
- @mkriegl: #4617
- @mrbese: #4703
- @nikitacometa: #3834
- @obielin: #4684
- @peterbussch: #4428
- @prasta1: #4851
- @pwilinchery: #4302
- @rahulnainala (first contribution): #4673
- @readyagentsdev (first contribution): #4677
- @SamanPandey-in: #4847
- @samintisar: #4578
- @santichausis: #4659
- @scs0209 (first contribution): #4792
- @sghanna (first contribution): #4770
- @Shaamak: #3898
- @sonukhobragade: #2760
- @Souptik96: #4368
- @SparshGarg999: #4088
- @sundarshankar: #4102
- @SunilKumarPradhan (first contribution): #4813
- @tahakotil (first contribution): #4661
- @TianHengZhuang: #4878
- @WJiangH: #2690
- @ybai08: #4672
- @Yi-111-a (first contribution): #4635
<!-- /co:release-notes -->

## [1.36.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.35.0...career-ops-v1.36.0) (2026-10-10)


### Features

* **ci:** fail a PR while a dependency it names is still open ([#4403](https://github.com/career-ops-hq/career-ops/issues/4403)) ([71bb57d](https://github.com/career-ops-hq/career-ops/commit/71bb57df7a4f12eadf51ab0af4cf212912d49f7e))
* **contacto:** surface saved internal-referral contacts before cold search ([#4692](https://github.com/career-ops-hq/career-ops/issues/4692)) ([3957d70](https://github.com/career-ops-hq/career-ops/commit/3957d70040c74424ee9477484059e05a53315537))
* **contacts:** extract a recruiter/interviewer contact from a pasted reply ([#4363](https://github.com/career-ops-hq/career-ops/issues/4363)) ([1934b3e](https://github.com/career-ops-hq/career-ops/commit/1934b3e76af46173097a7eba4e6e5cde3468a8a9))
* **cv-facts:** flag scope-verb inflation and unsourced adoption claims ([#3784](https://github.com/career-ops-hq/career-ops/issues/3784)) ([06f6452](https://github.com/career-ops-hq/career-ops/commit/06f6452d44877ccd923dc94722bc392315ea34b7))
* **cv-templates:** add atsLint, with the ATS rules as data in templates/ats-rules.yml ([#3900](https://github.com/career-ops-hq/career-ops/issues/3900)) ([6f1a74e](https://github.com/career-ops-hq/career-ops/commit/6f1a74e8e37119f01a68a397187025e7dacc804a))
* **cv:** add opt-in GDPR consent footer slot ({{CONSENT}}) ([#4286](https://github.com/career-ops-hq/career-ops/issues/4286)) ([5c0e765](https://github.com/career-ops-hq/career-ops/commit/5c0e76561eeb4a0256f5baf7ec487d43e814371d))
* **dashboard:** open the job posting from the report viewer with `o` ([#4821](https://github.com/career-ops-hq/career-ops/issues/4821)) ([024f059](https://github.com/career-ops-hq/career-ops/commit/024f059c78b21c48cb61a03b5933de12f7f5b8c5))
* **discover-ats:** flag resolved boards with very few postings ([#4869](https://github.com/career-ops-hq/career-ops/issues/4869)) ([8af2aef](https://github.com/career-ops-hq/career-ops/commit/8af2aefddf0b76e4da989c6473bd7232ca2b750e))
* explain evidence confidence behind evaluation scores ([#4452](https://github.com/career-ops-hq/career-ops/issues/4452)) ([1a9a76b](https://github.com/career-ops-hq/career-ops/commit/1a9a76bc4730ef7ff0368f4034dda24c1ab83ede))
* **gojobs:** add offline GO Jobs HTML import ([#4016](https://github.com/career-ops-hq/career-ops/issues/4016)) ([d35cf64](https://github.com/career-ops-hq/career-ops/commit/d35cf64daa16e86be9845fd6ab9a186097449d28))
* **i18n:** report structural drift across translated modes ([#4643](https://github.com/career-ops-hq/career-ops/issues/4643)) ([a8a71f5](https://github.com/career-ops-hq/career-ops/commit/a8a71f51ab86cf4f28369ddb46460b179d715758))
* **i18n:** support language.modes_dir as a list of declared markets ([#3798](https://github.com/career-ops-hq/career-ops/issues/3798)) ([d31a138](https://github.com/career-ops-hq/career-ops/commit/d31a138e8b3dc1971a43e15931623112c8a83246))
* **liveness:** read Workday's 403 S22 as a withdrawn posting ([#4633](https://github.com/career-ops-hq/career-ops/issues/4633)) ([23a8ecf](https://github.com/career-ops-hq/career-ops/commit/23a8ecfafcdc0c644399a144d0f1998951a8a8ee))
* **local-parser:** pass a parser's extra job fields through ([#3438](https://github.com/career-ops-hq/career-ops/issues/3438)) ([#4697](https://github.com/career-ops-hq/career-ops/issues/4697)) ([034ca77](https://github.com/career-ops-hq/career-ops/commit/034ca77013a6b2eb4fe6f76ea9ddbbd612c7f874))
* **modes:** add Singapore market mode (modes/sg/) ([#4687](https://github.com/career-ops-hq/career-ops/issues/4687)) ([963d8bf](https://github.com/career-ops-hq/career-ops/commit/963d8bfe07711de537a1a748fe9bdafd028c27f6))
* **oferta/apply:** surface fixed-term contract duration at apply time ([#4535](https://github.com/career-ops-hq/career-ops/issues/4535)) ([a156d4d](https://github.com/career-ops-hq/career-ops/commit/a156d4dfa18cbc3a10da6ebf2a3466ed57e681f8))
* **patterns:** close the discard_reasons vocabulary ([#4549](https://github.com/career-ops-hq/career-ops/issues/4549)) ([f14202f](https://github.com/career-ops-hq/career-ops/commit/f14202f785970548be77644d9a77dc9502f9a313)), closes [#2785](https://github.com/career-ops-hq/career-ops/issues/2785)
* **pdf:** add CV structure check; land as a warning per maintainer feedback ([#3472](https://github.com/career-ops-hq/career-ops/issues/3472)) ([f6d38b9](https://github.com/career-ops-hq/career-ops/commit/f6d38b9394ce4cce14094bb8f0c5dd55906c2c24))
* **pdf:** opt-in `pdf --ats` emits an ATS variant alongside the styled CV ([#3853](https://github.com/career-ops-hq/career-ops/issues/3853)) ([#4909](https://github.com/career-ops-hq/career-ops/issues/4909)) ([72650c1](https://github.com/career-ops-hq/career-ops/commit/72650c1c47541d58b272c3384875910e359dd56f))
* **providers:** add JazzHR zero-auth provider ([#4307](https://github.com/career-ops-hq/career-ops/issues/4307)) ([a18a644](https://github.com/career-ops-hq/career-ops/commit/a18a644d36c178822e1d5f23d16823b3cdeb9c71))
* **providers:** add startup.jobs RSS provider ([#4704](https://github.com/career-ops-hq/career-ops/issues/4704)) ([b64b6c3](https://github.com/career-ops-hq/career-ops/commit/b64b6c32fc712437f576d3e9c856101ed12a81ca))
* **providers:** capture the ATS-native posting and requisition ids ([#4076](https://github.com/career-ops-hq/career-ops/issues/4076)) ([6b4cd44](https://github.com/career-ops-hq/career-ops/commit/6b4cd4474a61b032c00237dd404ffbfae5bca584))
* **providers:** eightfold reads PCSX tenants instead of returning zero jobs ([#4297](https://github.com/career-ops-hq/career-ops/issues/4297)) ([1601693](https://github.com/career-ops-hq/career-ops/commit/16016935574db46ebd7a2f7c8e27431ee100e358))
* **providers:** PageUp — vendor-hosted careers sites ([#4693](https://github.com/career-ops-hq/career-ops/issues/4693)) ([9493bc8](https://github.com/career-ops-hq/career-ops/commit/9493bc8e33529ab8beb694ca2c6c1f7c02c4d228))
* **registry:** check pins against published releases on a schedule ([#4651](https://github.com/career-ops-hq/career-ops/issues/4651)) ([c731c69](https://github.com/career-ops-hq/career-ops/commit/c731c6977755fb603a46ea375aee9153724d9155)), closes [#4573](https://github.com/career-ops-hq/career-ops/issues/4573)
* **reply-matcher:** date-guarded company-wide rejections ([#4826](https://github.com/career-ops-hq/career-ops/issues/4826)) ([ccdc4d3](https://github.com/career-ops-hq/career-ops/commit/ccdc4d3de549d9d628a81f2a41417428f7f76bf7))
* **salary-gap:** relocation purchasing-power comparison ([#4694](https://github.com/career-ops-hq/career-ops/issues/4694)) ([#4696](https://github.com/career-ops-hq/career-ops/issues/4696)) ([ef00bb0](https://github.com/career-ops-hq/career-ops/commit/ef00bb0146605d16fc4134de779acee20565b31c))
* **scan-ats-full:** gate boards on domain relevance before title-filtering ([#3304](https://github.com/career-ops-hq/career-ops/issues/3304)) ([55694d7](https://github.com/career-ops-hq/career-ops/commit/55694d7a1d40455503af3b77d592927a7b9e6fb8))
* **scan:** add ADP Workforce Now provider ([#3729](https://github.com/career-ops-hq/career-ops/issues/3729)) ([b67e254](https://github.com/career-ops-hq/career-ops/commit/b67e2546fe3a59782f2c582091f77a791d96a497))
* **scan:** add Dayforce scanner (scan-dayforce.mjs, Playwright-based) ([#3734](https://github.com/career-ops-hq/career-ops/issues/3734)) ([b4de1df](https://github.com/career-ops-hq/career-ops/commit/b4de1df785d19ba56870f2236f746518ba56daf2))
* **scan:** add Gupy board-wide provider ([#4550](https://github.com/career-ops-hq/career-ops/issues/4550)) ([04a80be](https://github.com/career-ops-hq/career-ops/commit/04a80beca6d9129d8d8f0572494d6df443132132))
* **scan:** add Taleo public career-section provider ([#3743](https://github.com/career-ops-hq/career-ops/issues/3743)) ([b922c8c](https://github.com/career-ops-hq/career-ops/commit/b922c8c1d4c019bf0529215c8fa78d483a4e1350))
* **scan:** add UKG Pro/UltiPro provider ([#3733](https://github.com/career-ops-hq/career-ops/issues/3733)) ([76e0616](https://github.com/career-ops-hq/career-ops/commit/76e0616b68a0034fea92f70d87ec67c341add88f))
* **scan:** internationalize visa_filter sponsorship vocabulary ([#4686](https://github.com/career-ops-hq/career-ops/issues/4686)) ([c73574a](https://github.com/career-ops-hq/career-ops/commit/c73574a6d8b07e89d11b901ac863982b850b11be))
* **scan:** let a target declare which field its whitelist reads ([#3438](https://github.com/career-ops-hq/career-ops/issues/3438)) ([#4346](https://github.com/career-ops-hq/career-ops/issues/4346)) ([4df96ab](https://github.com/career-ops-hq/career-ops/commit/4df96ab9071d69e9a642bb9dc05b7774671fc7ad))
* **scan:** record what the location and posting-age filters drop ([#4321](https://github.com/career-ops-hq/career-ops/issues/4321)) ([b17e77c](https://github.com/career-ops-hq/career-ops/commit/b17e77cef9ec317d480de085b55e8714045631b3))
* **scan:** seed ATS sweep from application history ([#3912](https://github.com/career-ops-hq/career-ops/issues/3912)) ([43910e4](https://github.com/career-ops-hq/career-ops/commit/43910e4447401730aea6458a661291b7e42627a1))
* **scan:** SmartRecruiters requisition ids and opt-in language-aware dedup ([#4613](https://github.com/career-ops-hq/career-ops/issues/4613)) ([f3846b0](https://github.com/career-ops-hq/career-ops/commit/f3846b0bec6fc5e66734adde612e64890c2d5ce1))
* **session-activity:** advisory in-progress claims for concurrent sessions ([#4536](https://github.com/career-ops-hq/career-ops/issues/4536)) ([b02a8d6](https://github.com/career-ops-hq/career-ops/commit/b02a8d6a3bc3024f5c6b0c038b99ac2342f8b108))
* **set-status:** archive the JD automatically on the transition into Interview ([#4524](https://github.com/career-ops-hq/career-ops/issues/4524)) ([c3b501a](https://github.com/career-ops-hq/career-ops/commit/c3b501a02f3745fbf5549b929d260b8ab43f89e3))
* **templates:** let a template pack declare the sections it owns ([#3852](https://github.com/career-ops-hq/career-ops/issues/3852)) ([#3916](https://github.com/career-ops-hq/career-ops/issues/3916)) ([261d3c5](https://github.com/career-ops-hq/career-ops/commit/261d3c53bd836c14016cb93b6092180bca13f686))
* **templates:** opt-in project_break_inside, for the one-word widow above a tech line ([#4723](https://github.com/career-ops-hq/career-ops/issues/4723)) ([023558e](https://github.com/career-ops-hq/career-ops/commit/023558ecca567f42a0fcaaaef1ed5ef3a51fcf58))
* **tracker:** fix-report-links.mjs repairs rows whose report link is dead ([#4750](https://github.com/career-ops-hq/career-ops/issues/4750)) ([#4751](https://github.com/career-ops-hq/career-ops/issues/4751)) ([24745c5](https://github.com/career-ops-hq/career-ops/commit/24745c5f8a6b2ee56d7c25176d05c4dfe97c5b3b))
* **tracker:** render the URL column as a markdown link ([#3516](https://github.com/career-ops-hq/career-ops/issues/3516)) ([#3854](https://github.com/career-ops-hq/career-ops/issues/3854)) ([c5e1c4f](https://github.com/career-ops-hq/career-ops/commit/c5e1c4ffa793d7c0db2a3944ed4de9005ee5cd2b))
* **verify-pipeline:** surface check-jd-archive.mjs's findings as Check 17 ([#4527](https://github.com/career-ops-hq/career-ops/issues/4527)) ([9fd8747](https://github.com/career-ops-hq/career-ops/commit/9fd87474bac8e89177247caeddfef6af77b1d585))
* **web:** add local scheduled scans ([#2628](https://github.com/career-ops-hq/career-ops/issues/2628)) ([85b67f5](https://github.com/career-ops-hq/career-ops/commit/85b67f527c14ebd08c8aa00bedeff28182499978))
* **web:** Analytics progress + insights views, read from the core ([#4576](https://github.com/career-ops-hq/career-ops/issues/4576)) ([2d38488](https://github.com/career-ops-hq/career-ops/commit/2d38488012c172a1fbbb2d025d7b51eed8a3bbcb))
* **web:** preserve assistant conversations and earlier context ([#4495](https://github.com/career-ops-hq/career-ops/issues/4495)) ([f9e9139](https://github.com/career-ops-hq/career-ops/commit/f9e91394657a229b351df7ff451f6b6d59b08967))
* **web:** surface post-interview silence on the Follow-ups page ([#4586](https://github.com/career-ops-hq/career-ops/issues/4586)) ([9f0b533](https://github.com/career-ops-hq/career-ops/commit/9f0b5333fd6b2bf44a851814fe85b18c0c0b4a5e))
* zero-LLM CV title-consistency check for pdf.md tailoring ([#2678](https://github.com/career-ops-hq/career-ops/issues/2678)) ([9f0eec7](https://github.com/career-ops-hq/career-ops/commit/9f0eec7536b16579e465fe5d29770922770403e9))


### Bug Fixes

* **agent-docs:** align API-first verification and CLI-only script checks ([#4779](https://github.com/career-ops-hq/career-ops/issues/4779)) ([9644e28](https://github.com/career-ops-hq/career-ops/commit/9644e2811477ba0dbe862a45c83c286159da7ba9))
* **agent-inbox:** number resolve against file position, not the pending view ([#2739](https://github.com/career-ops-hq/career-ops/issues/2739)) ([93fd89a](https://github.com/career-ops-hq/career-ops/commit/93fd89a20a337e2fabb91e6bc85fe79975469f3e))
* **agents:** scope onboarding and keep diagnostics read-only ([#4428](https://github.com/career-ops-hq/career-ops/issues/4428)) ([2aeb555](https://github.com/career-ops-hq/career-ops/commit/2aeb5555fad84cb0f30ffa8e034391de11d40c06))
* **apply:** source form fields from the tailored CV instead of cv.md ([#4412](https://github.com/career-ops-hq/career-ops/issues/4412)) ([c2681c6](https://github.com/career-ops-hq/career-ops/commit/c2681c6de156be4624aca8d2298cc60a9d331742))
* **archive-posting,application-answers:** date records by the local calendar ([#4544](https://github.com/career-ops-hq/career-ops/issues/4544)) ([ec16f68](https://github.com/career-ops-hq/career-ops/commit/ec16f680ee3372e35b214c541c1d1e4d3171bf58))
* **archive-posting:** refuse to save a non-content capture (login wall/404/paywall) ([#4528](https://github.com/career-ops-hq/career-ops/issues/4528)) ([91d7df9](https://github.com/career-ops-hq/career-ops/commit/91d7df936ca5956dd64dd7f977b518d352cc88d1))
* **batch:** merge into the locked pipeline.md instead of overwriting it with the start-of-run snapshot ([#4912](https://github.com/career-ops-hq/career-ops/issues/4912)) ([7fb9437](https://github.com/career-ops-hq/career-ops/commit/7fb94378bcb7803e26b0262341be8fc94c86119d))
* **batch:** route standard and premium spend tiers to Sonnet 5.5 and Opus 5.5 ([#4703](https://github.com/career-ops-hq/career-ops/issues/4703)) ([b4e9a14](https://github.com/career-ops-hq/career-ops/commit/b4e9a14e774bb4b617780d5ac9b5c9130f020c08))
* **ci:** cover batch/ in the no-user-data guard ([#4533](https://github.com/career-ops-hq/career-ops/issues/4533)) ([0e4aeae](https://github.com/career-ops-hq/career-ops/commit/0e4aeae5dcee91190d9558d33cf0cd62dfee38b1))
* **ci:** grant ci-approve.yml the contents: read it needs to check out ([#4635](https://github.com/career-ops-hq/career-ops/issues/4635)) ([49d99e4](https://github.com/career-ops-hq/career-ops/commit/49d99e4469abd5efd5eba19310716a65876c8b7a)), closes [#4616](https://github.com/career-ops-hq/career-ops/issues/4616)
* **ci:** no-user-data guard blocks documents/, modes/_brief.md and other drifted user paths ([#4891](https://github.com/career-ops-hq/career-ops/issues/4891)) ([#4894](https://github.com/career-ops-hq/career-ops/issues/4894)) ([7c19718](https://github.com/career-ops-hq/career-ops/commit/7c197187582afb2d02bc60ebd5412d0894766142))
* **cli:** merge-tracker.mjs merges for real when --dry-run is mistyped: delegate to lib/cli-flags.mjs ([#4678](https://github.com/career-ops-hq/career-ops/issues/4678)) ([4c1a5fa](https://github.com/career-ops-hq/career-ops/commit/4c1a5fa24187e092504333cb33d41228d823075c))
* **cover:** give {{DATELINE}} the date when an address block renders ([#4069](https://github.com/career-ops-hq/career-ops/issues/4069)) ([a800863](https://github.com/career-ops-hq/career-ops/commit/a800863aea3313189c8473aafd79c067e7341e3c))
* **cv-checks:** read Pandoc-style cv.md; never ✅ on zero compared ([#4879](https://github.com/career-ops-hq/career-ops/issues/4879)) ([#4880](https://github.com/career-ops-hq/career-ops/issues/4880)) ([2b3fb67](https://github.com/career-ops-hq/career-ops/commit/2b3fb6782d64d182dd0fe41935c71fd06d09e767))
* **cv-facts:** read a spelled-out magnitude as part of the number ([#4878](https://github.com/career-ops-hq/career-ops/issues/4878)) ([ede8fe8](https://github.com/career-ops-hq/career-ops/commit/ede8fe8f453bd9253336fbb695edc1d346cc5509)), closes [#4872](https://github.com/career-ops-hq/career-ops/issues/4872)
* **dashboard:** DATE column shows the latest status change, not the eval date ([#4817](https://github.com/career-ops-hq/career-ops/issues/4817)) ([8675128](https://github.com/career-ops-hq/career-ops/commit/8675128374ff2a8940bf3d818185bd4908e1c2d5))
* **dashboard:** preserve status lifecycle side effects ([#4644](https://github.com/career-ops-hq/career-ops/issues/4644)) ([3c1aebd](https://github.com/career-ops-hq/career-ops/commit/3c1aebdcbecb98df041e12a0aef9f94725150c64))
* **dashboard:** render unevaluated rows as the sentinel, not "0.0" ([#2760](https://github.com/career-ops-hq/career-ops/issues/2760)) ([2511791](https://github.com/career-ops-hq/career-ops/commit/2511791c1c47e0f67a1c563dd8e863fa75351af4))
* **dashboard:** show explicit tracker and Notes locations ([#4852](https://github.com/career-ops-hq/career-ops/issues/4852)) ([#4863](https://github.com/career-ops-hq/career-ops/issues/4863)) ([38d9fb3](https://github.com/career-ops-hq/career-ops/commit/38d9fb3d58722988de5855741a1d05cc7981e43e))
* **dedup-tracker:** a posting-URL conflict blocks a merge ([#4578](https://github.com/career-ops-hq/career-ops/issues/4578)) ([3688b7f](https://github.com/career-ops-hq/career-ops/commit/3688b7f4c75f175f26f8fbd57a770ab95c784a13))
* **docker:** install a Go that satisfies dashboard/go.mod ([#4889](https://github.com/career-ops-hq/career-ops/issues/4889)) ([b2d631e](https://github.com/career-ops-hq/career-ops/commit/b2d631e9b5d464a66d91efc7ba636aa0b306156d))
* **doctor:** check that each dependency resolves, not that node_modules exists ([#4782](https://github.com/career-ops-hq/career-ops/issues/4782)) ([b5e61c4](https://github.com/career-ops-hq/career-ops/commit/b5e61c4b3a3005643d5b2a480d59e967605f2079))
* **doctor:** detect Playwright MCP servers configured in ~/.claude.json ([#4563](https://github.com/career-ops-hq/career-ops/issues/4563)) ([47b0d49](https://github.com/career-ops-hq/career-ops/commit/47b0d49a79214cc97fc91f3ea747a0c7bbb501f1))
* **fetch-jd:** read JDs from company-careers gh_jid links and SmartRecruiters ([#4673](https://github.com/career-ops-hq/career-ops/issues/4673)) ([350bde3](https://github.com/career-ops-hq/career-ops/commit/350bde3481d3fb3a1b49063d511023a7e6998cba))
* **funnel:** retain replies and historical stages across surfaces ([#4374](https://github.com/career-ops-hq/career-ops/issues/4374)) ([ead56e8](https://github.com/career-ops-hq/career-ops/commit/ead56e8c158ea8353636f85600062b0b1102cdb4))
* **gem:** fold the isoCountry name into the location string ([#4774](https://github.com/career-ops-hq/career-ops/issues/4774)) ([d26fcde](https://github.com/career-ops-hq/career-ops/commit/d26fcde780b5cf9dd9c28942696b1bee2667a986))
* **generate-pdf:** derive workspace root before canonicalizing the tracker ([#3169](https://github.com/career-ops-hq/career-ops/issues/3169)) ([#3191](https://github.com/career-ops-hq/career-ops/issues/3191)) ([91ee04c](https://github.com/career-ops-hq/career-ops/commit/91ee04c8215ccfc096c4259c7235f6a52f0f4614))
* **gitignore:** ignore the .career-ops-data marker ([#4663](https://github.com/career-ops-hq/career-ops/issues/4663)) ([6a9b252](https://github.com/career-ops-hq/career-ops/commit/6a9b2524084f4a3039a6640436dc28daaa5fd46b))
* **gitignore:** pair each anchored user-layer rule with a directory negation ([#4567](https://github.com/career-ops-hq/career-ops/issues/4567)) ([e6a0933](https://github.com/career-ops-hq/career-ops/commit/e6a093310432f89cc8490715caf1093990ec49fc))
* **greenhouse:** resolve legacy boards.greenhouse.io careers_url ([#4195](https://github.com/career-ops-hq/career-ops/issues/4195)) ([5367abb](https://github.com/career-ops-hq/career-ops/commit/5367abb46918bdbb79950ca40795a2eb86dd8236))
* **gupy:** follow the API to portal.gupy.io and send the filter names it reads ([#4833](https://github.com/career-ops-hq/career-ops/issues/4833)) ([b5ba43f](https://github.com/career-ops-hq/career-ops/commit/b5ba43f3b0fd4d7480877d2b22956a9a0389333b)), closes [#4831](https://github.com/career-ops-hq/career-ops/issues/4831)
* handle dead postings in batch evaluation ([#4381](https://github.com/career-ops-hq/career-ops/issues/4381)) ([bd24097](https://github.com/career-ops-hq/career-ops/commit/bd24097db73e1d680552a78d5be771423345b3bb))
* **harness:** the web-unit batch discards its child's output, so a Windows failure names 100 files and explains none ([#4767](https://github.com/career-ops-hq/career-ops/issues/4767)) ([d31844c](https://github.com/career-ops-hq/career-ops/commit/d31844c4a1843975570fc92a57abc34ffbf9acb6)), closes [#4766](https://github.com/career-ops-hq/career-ops/issues/4766)
* **higheredjobs:** a walled feed is a named error, not an empty board ([#4511](https://github.com/career-ops-hq/career-ops/issues/4511)) ([388bc68](https://github.com/career-ops-hq/career-ops/commit/388bc68baa5b1fd1b6e8e7d4d5a1854aa4d34425)), closes [#3637](https://github.com/career-ops-hq/career-ops/issues/3637)
* **hired-share,intake:** an unreadable state file is not a first run ([#4540](https://github.com/career-ops-hq/career-ops/issues/4540)) ([b9ad633](https://github.com/career-ops-hq/career-ops/commit/b9ad63339f3dfa4f40235232ee0f98c0c702b86c))
* **hired-wall:** require --rebuild or --add before writing ([#4896](https://github.com/career-ops-hq/career-ops/issues/4896)) ([#4898](https://github.com/career-ops-hq/career-ops/issues/4898)) ([56f8ddb](https://github.com/career-ops-hq/career-ops/commit/56f8ddb7df60cd03a169b4d68ea7a7609b8cde6a))
* honor TTL ceiling for advisory session claims ([#4740](https://github.com/career-ops-hq/career-ops/issues/4740)) ([07c9bb1](https://github.com/career-ops-hq/career-ops/commit/07c9bb1fd3079d2e7527a8e95c7acab21dda1502))
* **keyword-match:** find the keyword section under the heading each mode writes ([#4725](https://github.com/career-ops-hq/career-ops/issues/4725)) ([bfdcae5](https://github.com/career-ops-hq/career-ops/commit/bfdcae537d68c1c70d3eac1fa5ccbd86cec2b2cd))
* **keyword-match:** match acronym plurals and reach their synonym groups ([#4726](https://github.com/career-ops-hq/career-ops/issues/4726)) ([181713a](https://github.com/career-ops-hq/career-ops/commit/181713aec01acafa85f44313225ed1609325f974))
* **keyword-match:** read the ## Extracted Keywords heading batch workers write ([#4851](https://github.com/career-ops-hq/career-ops/issues/4851)) ([fd659a7](https://github.com/career-ops-hq/career-ops/commit/fd659a72d7e63950a43838d697c60d75a45e4a6c))
* **licenses:** ship OFL text with bundled fonts and LICENSE with the npm package ([#4888](https://github.com/career-ops-hq/career-ops/issues/4888)) ([1adcdfb](https://github.com/career-ops-hq/career-ops/commit/1adcdfb77b285edbaf4b3979aaa8a23c934e1a0f)), closes [#4886](https://github.com/career-ops-hq/career-ops/issues/4886)
* **liveness:** a banner on its own line is not part of the line above ([#4810](https://github.com/career-ops-hq/career-ops/issues/4810)) ([880a1cb](https://github.com/career-ops-hq/career-ops/commit/880a1cb426c1a86176ee964a90987d750ff8fbaa))
* **liveness:** a posting that says how it will close is still open ([#4771](https://github.com/career-ops-hq/career-ops/issues/4771)) ([c0264e7](https://github.com/career-ops-hq/career-ops/commit/c0264e7cb053898ea915f39db6b8ba71c5ff16ca))
* **liveness:** poll the page while it hydrates instead of one read after a fixed 2s ([#4804](https://github.com/career-ops-hq/career-ops/issues/4804)) ([95728c6](https://github.com/career-ops-hq/career-ops/commit/95728c6ff4d737dfadad71bdd59aa1eb280f9d40))
* **liveness:** record the expired verdict so a dead posting stops resurfacing ([#3905](https://github.com/career-ops-hq/career-ops/issues/3905)) ([1a68591](https://github.com/career-ops-hq/career-ops/commit/1a6859146193413307c496895a408fc620779b19))
* **liveness:** retry BambooHR once before calling expired ([#4569](https://github.com/career-ops-hq/career-ops/issues/4569)) ([7c81270](https://github.com/career-ops-hq/career-ops/commit/7c8127079d36b0df3b44984c5c7c72b619a263ca))
* **merge-tracker:** an aggregator URL is not a requisition identity ([#3652](https://github.com/career-ops-hq/career-ops/issues/3652)) ([#3653](https://github.com/career-ops-hq/career-ops/issues/3653)) ([bdcf7a0](https://github.com/career-ops-hq/career-ops/commit/bdcf7a0583c7fffaf169da6491356d388e2dd243))
* **merge-tracker:** explain a failed report number that a completed row reused ([#4519](https://github.com/career-ops-hq/career-ops/issues/4519)) ([b86b33c](https://github.com/career-ops-hq/career-ops/commit/b86b33ce93998fe0951635ecd0ed372bdb18765e))
* **merge-tracker:** warn when a report link points at a missing file ([#4749](https://github.com/career-ops-hq/career-ops/issues/4749)) ([c9d88c3](https://github.com/career-ops-hq/career-ops/commit/c9d88c3159e49d5062aeb976776426939c6409ba))
* **node:** raise the Node floor to 22.13 and test it in CI ([#4801](https://github.com/career-ops-hq/career-ops/issues/4801)) ([#4803](https://github.com/career-ops-hq/career-ops/issues/4803)) ([3b9bd64](https://github.com/career-ops-hq/career-ops/commit/3b9bd6463cf1fac9d5fd02602a840e298fe305e2))
* **pdf:** keep hyphenated words on one line so the PDF text keeps the term ([#4911](https://github.com/career-ops-hq/career-ops/issues/4911)) ([02bd978](https://github.com/career-ops-hq/career-ops/commit/02bd978fa193038658096dc18dde61f8b739fbd5)), closes [#4908](https://github.com/career-ops-hq/career-ops/issues/4908)
* **pipeline-lock:** make OWNERLESS_GRACE_MS env-overridable, fixing flaky test 16 ([#4557](https://github.com/career-ops-hq/career-ops/issues/4557)) ([31005eb](https://github.com/career-ops-hq/career-ops/commit/31005ebea478a9fa9cf55f4602f4b73c1f6fb14f))
* **pipeline:** break sort ties on the row number, so newest-first reorders a date ([#4333](https://github.com/career-ops-hq/career-ops/issues/4333)) ([c4f2c3f](https://github.com/career-ops-hq/career-ops/commit/c4f2c3fcbd22979143a0e6115bd2718a820ac41b))
* **pipeline:** stop retrying unavailable LinkedIn job descriptions ([#4641](https://github.com/career-ops-hq/career-ops/issues/4641)) ([a39dc76](https://github.com/career-ops-hq/career-ops/commit/a39dc7632a785894ee7e37d5e76d5d3b7c1a1d7f))
* **pipeline:** take the pipeline lock in reconcile-pipeline.mjs ([#4895](https://github.com/career-ops-hq/career-ops/issues/4895)) ([#4897](https://github.com/career-ops-hq/career-ops/issues/4897)) ([df0d613](https://github.com/career-ops-hq/career-ops/commit/df0d6134f2e81e48135be93ba51d103673037c94))
* **plugins:** resolve user config from data root ([#4688](https://github.com/career-ops-hq/career-ops/issues/4688)) ([7ddbd86](https://github.com/career-ops-hq/career-ops/commit/7ddbd868af235e6ab9f091c16742b0b89cc5196e))
* **providers:** address post-merge review on startup-jobs ([#4765](https://github.com/career-ops-hq/career-ops/issues/4765)) ([08fe5d0](https://github.com/career-ops-hq/career-ops/commit/08fe5d065121e19f07e484ac8e6e8459e0c2eb05))
* **providers:** amazon lists every city of a multi-city req ([#4900](https://github.com/career-ops-hq/career-ops/issues/4900)) ([fb8e232](https://github.com/career-ops-hq/career-ops/commit/fb8e232cbfa73a23be7bf871a0fb227dff92b4cf))
* **providers:** deutschebahn returns 0 postings — an unrenderable db.jobs posting blanks the first score-sorted page ([#4714](https://github.com/career-ops-hq/career-ops/issues/4714)) ([40c3739](https://github.com/career-ops-hq/career-ops/commit/40c37397aedc90d2134e47a42cce3c01cfbf3641))
* **providers:** end csod and avature paging on the rows the source returned ([#4885](https://github.com/career-ops-hq/career-ops/issues/4885)) ([d52a0e9](https://github.com/career-ops-hq/career-ops/commit/d52a0e93593de3aed3fea6b899242ef4bdbdaae5))
* **providers:** move // `@ts-check` to line 1 in six providers ([#4790](https://github.com/career-ops-hq/career-ops/issues/4790)) ([5062c3e](https://github.com/career-ops-hq/career-ops/commit/5062c3e2b4ecf04b504dd9ad12db34aa1e0487d5))
* **providers:** pair undici fetch with its proxy agent so trusted proxy egress works on Node 26 ([#4812](https://github.com/career-ops-hq/career-ops/issues/4812)) ([cce560f](https://github.com/career-ops-hq/career-ops/commit/cce560f7d5fdd8d48652621c1944d8bdc3b67d8b)), closes [#4808](https://github.com/career-ops-hq/career-ops/issues/4808)
* **providers:** skipIds covers an explicit provider: field too ([#4884](https://github.com/career-ops-hq/career-ops/issues/4884)) ([acd9d00](https://github.com/career-ops-hq/career-ops/commit/acd9d00d74e405c089c3c2c76bc66bfe139614c9))
* **radancy:** read a sibling job-location element in the legacy markup ([#4689](https://github.com/career-ops-hq/career-ops/issues/4689)) ([cf31a93](https://github.com/career-ops-hq/career-ops/commit/cf31a93932b470515126353961154fc4f0672988))
* **reply-matcher:** count combining marks when measuring a company name ([#4542](https://github.com/career-ops-hq/career-ops/issues/4542)) ([20897ea](https://github.com/career-ops-hq/career-ops/commit/20897eabe82beb6e2487fecb7f416a263e462b8b))
* **salary-gap:** resolve column 1 as a tracker#, not a report# ([#4368](https://github.com/career-ops-hq/career-ops/issues/4368)) ([2fd2ccf](https://github.com/career-ops-hq/career-ops/commit/2fd2ccf62363811e31524733c057451c257b1737))
* **scan-dayforce:** report interactive challenges as a named error and stop ([#4685](https://github.com/career-ops-hq/career-ops/issues/4685)) ([2dede5c](https://github.com/career-ops-hq/career-ops/commit/2dede5c3bc8ed618c7e5d2ef0b3f06d610483cda)), closes [#4675](https://github.com/career-ops-hq/career-ops/issues/4675)
* **scan:** keep the first row of a headerless scan-history.tsv ([#4807](https://github.com/career-ops-hq/career-ops/issues/4807)) ([6554b64](https://github.com/career-ops-hq/career-ops/commit/6554b64139d0f5b93f9e3e3b28ebc7a5be2b7766))
* **scan:** make scan-history formula escaping reversible ([#4778](https://github.com/career-ops-hq/career-ops/issues/4778)) ([8fae375](https://github.com/career-ops-hq/career-ops/commit/8fae3759ba6da304494593b1148759288357ff7e))
* **scan:** support trusted proxy egress for provider requests ([#4445](https://github.com/career-ops-hq/career-ops/issues/4445)) ([c034621](https://github.com/career-ops-hq/career-ops/commit/c0346214b367b1edf1577b2e2b8103b7b6143da3))
* **scan:** verify offers via APIs before launching Chromium ([#4640](https://github.com/career-ops-hq/career-ops/issues/4640)) ([82dd887](https://github.com/career-ops-hq/career-ops/commit/82dd887fe3d4bf224c820b4cdd86fd131696bc6e))
* **shared:** let _profile.md define the archetypes, and allow "none of these" ([#2690](https://github.com/career-ops-hq/career-ops/issues/2690)) ([d4b2f8e](https://github.com/career-ops-hq/career-ops/commit/d4b2f8e0984e54c541f392e9a5b700432e8f1ebb))
* **skill-extract:** count "fine-tuning" only where it names the ML skill ([#4761](https://github.com/career-ops-hq/career-ops/issues/4761)) ([23d3457](https://github.com/career-ops-hq/career-ops/commit/23d34579ee6ceceffc5588aeb5acc26d1e3315ec))
* **skill-extract:** read the other spellings of AI/ML skills a CV uses ([#4755](https://github.com/career-ops-hq/career-ops/issues/4755)) ([3bbf2ae](https://github.com/career-ops-hq/career-ops/commit/3bbf2ae9e4ddecb942370c325a8dac4f38fd8373))
* **skill:** route triage, calibrate, intake and ats from the router ([#4811](https://github.com/career-ops-hq/career-ops/issues/4811)) ([#4815](https://github.com/career-ops-hq/career-ops/issues/4815)) ([eeede80](https://github.com/career-ops-hq/career-ops/commit/eeede80b21af51cec70a436bf94d72873e63df53))
* **smartrecruiters:** keep the configured slug in fallback job links ([#4770](https://github.com/career-ops-hq/career-ops/issues/4770)) ([2877692](https://github.com/career-ops-hq/career-ops/commit/287769262e53839147f9876c423ac2e3fc077b6a))
* **story-bank:** stories an evaluation adds aren't invisible to npm run star anymore ([#4684](https://github.com/career-ops-hq/career-ops/issues/4684)) ([2f0e32c](https://github.com/career-ops-hq/career-ops/commit/2f0e32c761c5ba9b67514cb7ebc4f47483377346))
* **story-bank:** three readers, three roots — and a safety gate split across two ([#3985](https://github.com/career-ops-hq/career-ops/issues/3985)) ([cbae0bd](https://github.com/career-ops-hq/career-ops/commit/cbae0bd5589f42673bccbaac4a4fd2b0dc54bf6b))
* **story-provenance:** anchor the Provenance marker to the start of its line ([#4865](https://github.com/career-ops-hq/career-ops/issues/4865)) ([352e6d3](https://github.com/career-ops-hq/career-ops/commit/352e6d3cf6c8579496fe733c6b9862291aacfbfb))
* **successfactors:** resolve a /go/// careers_url to the tenant root ([#4659](https://github.com/career-ops-hq/career-ops/issues/4659)) ([4e151da](https://github.com/career-ops-hq/career-ops/commit/4e151daa8856c8a358980b081ca4a9001a1359bf)), closes [#4655](https://github.com/career-ops-hq/career-ops/issues/4655)
* **templates:** keep the contact separator from starting a wrapped line ([#4715](https://github.com/career-ops-hq/career-ops/issues/4715)) ([b075484](https://github.com/career-ops-hq/career-ops/commit/b0754849e8d7763595257cf35715a7159ef8592d))
* **templates:** make job_break_inside an opt-in style token ([#3789](https://github.com/career-ops-hq/career-ops/issues/3789)) ([dc49e6b](https://github.com/career-ops-hq/career-ops/commit/dc49e6bd5161ddae6f7386d3b4316e54d200eace))
* **test-harness:** linkRepoPackage resolves packages the way Node does, so worktrees work ([#4781](https://github.com/career-ops-hq/career-ops/issues/4781)) ([356d9d7](https://github.com/career-ops-hq/career-ops/commit/356d9d77120857210887dc8e24f922250ac14708))
* **tests:** guard the sandbox node_modules link ([#4406](https://github.com/career-ops-hq/career-ops/issues/4406)) ([9085052](https://github.com/career-ops-hq/career-ops/commit/90850526c92fc0261a8e60bdb829fc0d6b195a10))
* **tests:** keep the fresh-install pipeline test out of a real CAREER_OPS_PIPELINE ([#4707](https://github.com/career-ops-hq/career-ops/issues/4707)) ([88a2ea1](https://github.com/career-ops-hq/career-ops/commit/88a2ea12d3ebcf1c44afb43867cbdef029ffea5d))
* **tests:** keep the suite out of a real CAREER_OPS_TRACKER ([#4892](https://github.com/career-ops-hq/career-ops/issues/4892)) ([f882516](https://github.com/career-ops-hq/career-ops/commit/f882516bf3d029017e40e9112cba5a85b9a1bb9c))
* **tests:** skip title-fit when web/ is absent ([#4706](https://github.com/career-ops-hq/career-ops/issues/4706)) ([a5e762d](https://github.com/career-ops-hq/career-ops/commit/a5e762d3973eb6da2f1fa971c8e5b873ba8b8f89))
* **title-filter:** treat CJK characters as word boundaries for short keywords ([#4690](https://github.com/career-ops-hq/career-ops/issues/4690)) ([7d0e312](https://github.com/career-ops-hq/career-ops/commit/7d0e31233d808d8962e9375c2e660809abb299ba))
* **tracker:** allow correcting stale notes without hand-editing ([#4494](https://github.com/career-ops-hq/career-ops/issues/4494)) ([5385f3a](https://github.com/career-ops-hq/career-ops/commit/5385f3a2e9c2dc873b56744856a2dbe4f6fcf153))
* **tracker:** resolve tracker paths via resolveTrackerPath(DATA_ROOT) across CLI tools ([#4087](https://github.com/career-ops-hq/career-ops/issues/4087)) ([#4088](https://github.com/career-ops-hq/career-ops/issues/4088)) ([151be63](https://github.com/career-ops-hq/career-ops/commit/151be63d92d70592d9d904a3a120b1a77c3b9f57))
* **update-system:** exempt a user-configured named template variant from the templates/ prune ([#3700](https://github.com/career-ops-hq/career-ops/issues/3700)) ([65ee5ea](https://github.com/career-ops-hq/career-ops/commit/65ee5ead2c9ca1d603b7d2b8eaccfc2437bf1c24))
* **update-system:** insert new gitignore rules before the fixtures negation ([#4214](https://github.com/career-ops-hq/career-ops/issues/4214)) ([182c28c](https://github.com/career-ops-hq/career-ops/commit/182c28c1770aa06e287fa2650e3202a97b14ae79))
* **update-system:** keep protecting a customization an update preserved ([#4341](https://github.com/career-ops-hq/career-ops/issues/4341)) ([a395e67](https://github.com/career-ops-hq/career-ops/commit/a395e6790f1debba66de54fde3d5d81f5151b273))
* **update-system:** refuse manifest entries that name the user layer ([#3947](https://github.com/career-ops-hq/career-ops/issues/3947)) ([625a82c](https://github.com/career-ops-hq/career-ops/commit/625a82c29ab96747355f8717dc63ce359a3c75e4))
* **updater:** apply updates on main when run from a linked worktree ([#4738](https://github.com/career-ops-hq/career-ops/issues/4738)) ([ad66a6a](https://github.com/career-ops-hq/career-ops/commit/ad66a6a4a2958470be6b939e929eacf7199f0cdc))
* **updater:** ship user-directory scaffolds safely ([#4741](https://github.com/career-ops-hq/career-ops/issues/4741)) ([136e93f](https://github.com/career-ops-hq/career-ops/commit/136e93f1290f343f28b44118fbb8c7595b0b0afb))
* **validate-profile:** commented-out example sections are not unknown keys ([#4705](https://github.com/career-ops-hq/career-ops/issues/4705)) ([1d85279](https://github.com/career-ops-hq/career-ops/commit/1d85279ce332ce171105b4d45fcffc810ebaf35b))
* **validate-profile:** read opt-in keys the example ships commented out ([#4737](https://github.com/career-ops-hq/career-ops/issues/4737)) ([8dbf0b9](https://github.com/career-ops-hq/career-ops/commit/8dbf0b9e94e6f13ee41de2291c4b6c558fcf810e)), closes [#4736](https://github.com/career-ops-hq/career-ops/issues/4736)
* **verify-ats:** stop reading a white background as hidden white text ([#4802](https://github.com/career-ops-hq/career-ops/issues/4802)) ([6959490](https://github.com/career-ops-hq/career-ops/commit/6959490155401c3d29122ead623faf8f9242327b))
* **verify-cv-facts:** do not read standard identifiers as count claims ([#4666](https://github.com/career-ops-hq/career-ops/issues/4666)) ([3362de5](https://github.com/career-ops-hq/career-ops/commit/3362de59d3f19d889daec6b1b23970effeea5a3b))
* **verify-pipeline:** warn about a report that could not be inspected ([#4814](https://github.com/career-ops-hq/career-ops/issues/4814)) ([0b07775](https://github.com/career-ops-hq/career-ops/commit/0b07775da797ce07eb2f3a3e65bb99079230a9f2))
* **workable:** a posting listed in several countries keeps all of them ([#4806](https://github.com/career-ops-hq/career-ops/issues/4806)) ([b07171d](https://github.com/career-ops-hq/career-ops/commit/b07171d16b77daf123efc03c0c033a3684d5c9bb))
* **workday:** collapse the -N disambiguator on a hyphenated requisition base ([#3882](https://github.com/career-ops-hq/career-ops/issues/3882)) ([#4409](https://github.com/career-ops-hq/career-ops/issues/4409)) ([6a3e1eb](https://github.com/career-ops-hq/career-ops/commit/6a3e1eb00440322d12f4002555ac667f59dda082))


web: 0.14.0

## [0.14.0](https://github.com/career-ops-hq/career-ops/compare/web-v0.13.0...web-v0.14.0) (2026-10-10)


### Features

* **cv-templates:** add atsLint, with the ATS rules as data in templates/ats-rules.yml ([#3900](https://github.com/career-ops-hq/career-ops/issues/3900)) ([6f1a74e](https://github.com/career-ops-hq/career-ops/commit/6f1a74e8e37119f01a68a397187025e7dacc804a))
* **i18n:** support language.modes_dir as a list of declared markets ([#3798](https://github.com/career-ops-hq/career-ops/issues/3798)) ([d31a138](https://github.com/career-ops-hq/career-ops/commit/d31a138e8b3dc1971a43e15931623112c8a83246))
* **templates:** let a template pack declare the sections it owns ([#3852](https://github.com/career-ops-hq/career-ops/issues/3852)) ([#3916](https://github.com/career-ops-hq/career-ops/issues/3916)) ([261d3c5](https://github.com/career-ops-hq/career-ops/commit/261d3c53bd836c14016cb93b6092180bca13f686))
* **web:** add local scheduled scans ([#2628](https://github.com/career-ops-hq/career-ops/issues/2628)) ([85b67f5](https://github.com/career-ops-hq/career-ops/commit/85b67f527c14ebd08c8aa00bedeff28182499978))
* **web:** add route-aware loading feedback ([#4338](https://github.com/career-ops-hq/career-ops/issues/4338)) ([e049608](https://github.com/career-ops-hq/career-ops/commit/e04960897029429c2dd23cc0a3bd3a8996d26ef1))
* **web:** Analytics progress + insights views, read from the core ([#4576](https://github.com/career-ops-hq/career-ops/issues/4576)) ([2d38488](https://github.com/career-ops-hq/career-ops/commit/2d38488012c172a1fbbb2d025d7b51eed8a3bbcb))
* **web:** edit application status inline in Pipeline ([#4701](https://github.com/career-ops-hq/career-ops/issues/4701)) ([b89ef7e](https://github.com/career-ops-hq/career-ops/commit/b89ef7e27ca7ccf8380c8a8571dbd8732b26b845))
* **web:** keep context during loading transitions ([#4473](https://github.com/career-ops-hq/career-ops/issues/4473)) ([e691fa6](https://github.com/career-ops-hq/career-ops/commit/e691fa68693abbed25eb301532c0294408e5edb9))
* **web:** preserve assistant conversations and earlier context ([#4495](https://github.com/career-ops-hq/career-ops/issues/4495)) ([f9e9139](https://github.com/career-ops-hq/career-ops/commit/f9e91394657a229b351df7ff451f6b6d59b08967))
* **web:** surface post-interview silence on the Follow-ups page ([#4586](https://github.com/career-ops-hq/career-ops/issues/4586)) ([9f0b533](https://github.com/career-ops-hq/career-ops/commit/9f0b5333fd6b2bf44a851814fe85b18c0c0b4a5e))


### Bug Fixes

* **funnel:** retain replies and historical stages across surfaces ([#4374](https://github.com/career-ops-hq/career-ops/issues/4374)) ([ead56e8](https://github.com/career-ops-hq/career-ops/commit/ead56e8c158ea8353636f85600062b0b1102cdb4))
* **liveness:** record the expired verdict so a dead posting stops resurfacing ([#3905](https://github.com/career-ops-hq/career-ops/issues/3905)) ([1a68591](https://github.com/career-ops-hq/career-ops/commit/1a6859146193413307c496895a408fc620779b19))
* **pipeline:** break sort ties on the row number, so newest-first reorders a date ([#4333](https://github.com/career-ops-hq/career-ops/issues/4333)) ([c4f2c3f](https://github.com/career-ops-hq/career-ops/commit/c4f2c3fcbd22979143a0e6115bd2718a820ac41b))
* **web/apply:** never hand the planner a ref to a submit control, and guard every action by element facts ([#3834](https://github.com/career-ops-hq/career-ops/issues/3834)) ([a6637dd](https://github.com/career-ops-hq/career-ops/commit/a6637ddf9a8025118187ac85c5af425fd80a6b55))
* **web:** bind the dashboard to loopback by default ([#3716](https://github.com/career-ops-hq/career-ops/issues/3716)) ([7062ed5](https://github.com/career-ops-hq/career-ops/commit/7062ed507ba07d3c876dc07f759897be8a4d82ea))
* **web:** confirm paid assistant fan-out with cost estimates ([#4746](https://github.com/career-ops-hq/career-ops/issues/4746)) ([b3b62b4](https://github.com/career-ops-hq/career-ops/commit/b3b62b4cdce4e982697547f1f3e961a33b0843a3))
* **web:** count cached input in usage meter ([#4744](https://github.com/career-ops-hq/career-ops/issues/4744)) ([088d0dd](https://github.com/career-ops-hq/career-ops/commit/088d0ddd1c90a07eb9df650dec7f7fec2f079e65))
* **web:** fall back from a stale saved cliId on every AI route, not just Run ([#4638](https://github.com/career-ops-hq/career-ops/issues/4638)) ([431f593](https://github.com/career-ops-hq/career-ops/commit/431f5933bcb14d178cdff47cc6faa2bcc600407b))
* **web:** pre-fill apply answers from the CV attached to the same form ([#4404](https://github.com/career-ops-hq/career-ops/issues/4404)) ([414ff23](https://github.com/career-ops-hq/career-ops/commit/414ff238679a186e74bcd3b0415f3fb4e49dce38))
* **web:** read the whole of modes/_profile.md, not just the managed block ([#4008](https://github.com/career-ops-hq/career-ops/issues/4008)) ([f4c52d1](https://github.com/career-ops-hq/career-ops/commit/f4c52d19a29c805ca7ad2e1f4ce767e6c70b8708))
* **web:** require confirmed worker stream completion ([#4107](https://github.com/career-ops-hq/career-ops/issues/4107)) ([7860d2f](https://github.com/career-ops-hq/career-ops/commit/7860d2f146769a730e185cbda808020d18d6723b))
* **web:** update vulnerable dependencies ([#4670](https://github.com/career-ops-hq/career-ops/issues/4670)) ([077ff80](https://github.com/career-ops-hq/career-ops/commit/077ff80bd0391db2df74dd57ee78002a580bc859))
* **web:** validate profile updates before writing ([#4500](https://github.com/career-ops-hq/career-ops/issues/4500)) ([b208464](https://github.com/career-ops-hq/career-ops/commit/b2084646acdc2bc34ad48ed8b7292d48c3aa3561))

<!-- co:release-sponsors:career-ops-v1.36.0 -->
## Sponsors

[SerpApi](https://serpapi.com/career-ops-org) sponsors career-ops through its fiscal host, Open Source Collective.
<!-- /co:release-sponsors -->

Related Repositories