Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Changelog

## [1.40.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.39.0...career-ops-v1.40.0) (2026-11-10)


### Features

* ask once for a star after the first report, and for the manifesto later (never together) ([#6700](https://github.com/career-ops-hq/career-ops/issues/6700)) ([bd7ef1a](https://github.com/career-ops-hq/career-ops/commit/bd7ef1aa8e1c9b341ad3800f23d86e950e1860fd))
* **cli:** Add Oh My Pi (omp) host support ([#5804](https://github.com/career-ops-hq/career-ops/issues/5804)) ([b273441](https://github.com/career-ops-hq/career-ops/commit/b273441036e8209a1ad125d4f800f09e22b55d3c))
* **cv-facts:** block bullets whose verb drifted from their source bullet ([#1411](https://github.com/career-ops-hq/career-ops/issues/1411)) ([#6630](https://github.com/career-ops-hq/career-ops/issues/6630)) ([cb3e38c](https://github.com/career-ops-hq/career-ops/commit/cb3e38c7223ed3738e9ce4e044caf108ecc3c21b))
* **cv-templates:** add renderLint, a warning for what the renderer silently drops ([#5943](https://github.com/career-ops-hq/career-ops/issues/5943)) ([40e0531](https://github.com/career-ops-hq/career-ops/commit/40e05312ba9b3dbfac92d1f52239f85882a12f62))
* **expand:** list document names in the GitHub evidence step ([#5728](https://github.com/career-ops-hq/career-ops/issues/5728)) ([#5729](https://github.com/career-ops-hq/career-ops/issues/5729)) ([38892bd](https://github.com/career-ops-hq/career-ops/commit/38892bd24007daba02a592e7f7d2bf2cdaa0344f))
* **i18n:** let i18n-drift fail CI with --fail-under ([#6771](https://github.com/career-ops-hq/career-ops/issues/6771)) ([c0d44f5](https://github.com/career-ops-hq/career-ops/commit/c0d44f5d3d5185880e0b006aafe0149f490ae095))
* **intake:** snapshot committed sources and diff changed ones ([#6552](https://github.com/career-ops-hq/career-ops/issues/6552)) ([24a8b95](https://github.com/career-ops-hq/career-ops/commit/24a8b95d15b2badb5a851f67d946426441453c6b))
* **linkedin:** add alert mail on the scan schedule ([#6112](https://github.com/career-ops-hq/career-ops/issues/6112)) ([51b16d3](https://github.com/career-ops-hq/career-ops/commit/51b16d38bc60e23898dc6b4577f748cb6dc6a264))
* **liveness:** check robots.txt before the headed-browser retry ([#6551](https://github.com/career-ops-hq/career-ops/issues/6551)) ([1d74416](https://github.com/career-ops-hq/career-ops/commit/1d7441680087835631644a86c1b7dc80ee390c56)), closes [#5776](https://github.com/career-ops-hq/career-ops/issues/5776)
* **oferta:** optional positioning_band beside the score ([#4720](https://github.com/career-ops-hq/career-ops/issues/4720)) ([#6789](https://github.com/career-ops-hq/career-ops/issues/6789)) ([d17680d](https://github.com/career-ops-hq/career-ops/commit/d17680d0a172085e212a62157ecb9f95fffe4576))
* **oferta:** warn before an evaluation when the GitHub evidence is stale ([#5674](https://github.com/career-ops-hq/career-ops/issues/5674)) ([#5675](https://github.com/career-ops-hq/career-ops/issues/5675)) ([16d01ad](https://github.com/career-ops-hq/career-ops/commit/16d01ad0dae54bb4bde3f2f73e42239be82c2d5b))
* **offer-prep:** contract-stage jurisdiction passes for agency licensing, classification and terminology ([#3641](https://github.com/career-ops-hq/career-ops/issues/3641)) ([#6504](https://github.com/career-ops-hq/career-ops/issues/6504)) ([b70bb8e](https://github.com/career-ops-hq/career-ops/commit/b70bb8e4e8d8ff17fc3bb69a0e7df067e1349f7e))
* **pdf:** add an opt-in --strict-fact-check flag ([#6769](https://github.com/career-ops-hq/career-ops/issues/6769)) ([5e514db](https://github.com/career-ops-hq/career-ops/commit/5e514dbfbc5be2bc8b12d6f5eb83b7ba89b7b7ae))
* **providers:** add HiBob provider ([#6502](https://github.com/career-ops-hq/career-ops/issues/6502)) ([a1b3e60](https://github.com/career-ops-hq/career-ops/commit/a1b3e606c47cd1d33a1ce5a24822b2eadcb3860c))
* **providers:** add HireHive provider ([#6503](https://github.com/career-ops-hq/career-ops/issues/6503)) ([7c46efe](https://github.com/career-ops-hq/career-ops/commit/7c46efe06c7238e6f9905b8525d7d07284c6fc93))
* **providers:** add Polymer careers API provider ([#6128](https://github.com/career-ops-hq/career-ops/issues/6128)) ([5910616](https://github.com/career-ops-hq/career-ops/commit/59106167e8228d6245b15dfc4d8d32b314750a0a))
* **providers:** add single-company provider for ALDI Nord ([#6529](https://github.com/career-ops-hq/career-ops/issues/6529)) ([9ecdc30](https://github.com/career-ops-hq/career-ops/commit/9ecdc30de6d452f1bd3437ae9d721fee580f011d))
* **providers:** add Tes, UK and international teaching jobs ([#6685](https://github.com/career-ops-hq/career-ops/issues/6685)) ([#6731](https://github.com/career-ops-hq/career-ops/issues/6731)) ([95a704b](https://github.com/career-ops-hq/career-ops/commit/95a704bf28d4aca376a7d3a0cf682dccb7042dbd))
* **providers:** add Trakstar Hire openings provider ([#6131](https://github.com/career-ops-hq/career-ops/issues/6131)) ([4fbb15e](https://github.com/career-ops-hq/career-ops/commit/4fbb15e9b1bf37504fc55c634a99e47342a585d6))
* **providers:** add TurboHire careers provider ([#6712](https://github.com/career-ops-hq/career-ops/issues/6712)) ([ef595b6](https://github.com/career-ops-hq/career-ops/commit/ef595b642bcb49954a375395f52eacbf3a4a8244))
* **providers:** allow posts_per_page on jobspresso feed URL ([#6694](https://github.com/career-ops-hq/career-ops/issues/6694)) ([#6738](https://github.com/career-ops-hq/career-ops/issues/6738)) ([264a13c](https://github.com/career-ops-hq/career-ops/commit/264a13cd6d915900dfbf9b920b9e82f2a96962a9))
* **providers:** consider reads the whole board through meta.sequence and retries temporary failures ([#6467](https://github.com/career-ops-hq/career-ops/issues/6467)) ([866aaac](https://github.com/career-ops-hq/career-ops/commit/866aaaca0ea5a92c4f08674db5daed2b3de30b0b))
* **providers:** generic employer job sitemap provider (provider: sitemap) ([#6631](https://github.com/career-ops-hq/career-ops/issues/6631)) ([7af08dc](https://github.com/career-ops-hq/career-ops/commit/7af08dccea7fc9bb5cf07b3acdb8fb4a2edb0516))
* **providers:** page through Google Careers results ([#6735](https://github.com/career-ops-hq/career-ops/issues/6735)) ([38c2091](https://github.com/career-ops-hq/career-ops/commit/38c20911b68b9050439cde1e18221be561d973ad))
* **providers:** read Remote's own ATS at apply.remote.com ([#6392](https://github.com/career-ops-hq/career-ops/issues/6392)) ([d5429eb](https://github.com/career-ops-hq/career-ops/commit/d5429eb6e4a92cee4aafe430204f077c8f2278a3))
* **providers:** talentlink reads Lumesse TalentLink career sites ([#6790](https://github.com/career-ops-hq/career-ops/issues/6790)) ([8387238](https://github.com/career-ops-hq/career-ops/commit/8387238c8a8b1ae4a40db6393c98e3454c9fdf5f))
* **router:** show scan and evaluation progress in the session title ([#6586](https://github.com/career-ops-hq/career-ops/issues/6586)) ([#6587](https://github.com/career-ops-hq/career-ops/issues/6587)) ([6555e50](https://github.com/career-ops-hq/career-ops/commit/6555e503fe112c0515ab5f150858f8d5de457ed8))
* **scan-ats-full:** sweep every Workable tenant from Workable's public XML job feed ([#6793](https://github.com/career-ops-hq/career-ops/issues/6793)) ([02e7607](https://github.com/career-ops-hq/career-ops/commit/02e76070bf09450ce54d19d3c89888b8a42a4f8f))
* **scan:** add --retain-days to detect-reposts.mjs ([#6770](https://github.com/career-ops-hq/career-ops/issues/6770)) ([f48fa4e](https://github.com/career-ops-hq/career-ops/commit/f48fa4e25e520f23bd9c68e3b0cb13a29d5266f7))
* **scan:** add ADP Recruiting Management (myjobs) provider ([#6678](https://github.com/career-ops-hq/career-ops/issues/6678)) ([7418757](https://github.com/career-ops-hq/career-ops/commit/741875724f7f3788147d8c68b3398d6098c45923))
* **scan:** add SEEK NZ keyword scanner ([#6488](https://github.com/career-ops-hq/career-ops/issues/6488)) ([9c53f00](https://github.com/career-ops-hq/career-ops/commit/9c53f002b50255aeef3c0b96fdfce89c4aa90dd3))
* **scan:** bring back --daterange and pagination in scan-seek ([#6694](https://github.com/career-ops-hq/career-ops/issues/6694)) ([#6750](https://github.com/career-ops-hq/career-ops/issues/6750)) ([a18ddb3](https://github.com/career-ops-hq/career-ops/commit/a18ddb303fbbdc7c2050cfafa0c4321b050676e6))
* **scan:** content_filter min_match and rescue_title_misses ([#6020](https://github.com/career-ops-hq/career-ops/issues/6020)) ([#6531](https://github.com/career-ops-hq/career-ops/issues/6531)) ([adeb800](https://github.com/career-ops-hq/career-ops/commit/adeb8002b06bd002774fd75b9130f5f23bd14bf3))
* **scan:** keep a posting close date and show it in the pipeline ([#6597](https://github.com/career-ops-hq/career-ops/issues/6597)) ([6360bbb](https://github.com/career-ops-hq/career-ops/commit/6360bbb4439ec915cfbad4147257360fcd52763f))
* **scan:** report partly-read boards as `partial`, not `reachable` ([#6636](https://github.com/career-ops-hq/career-ops/issues/6636)) ([7b0d9b1](https://github.com/career-ops-hq/career-ops/commit/7b0d9b1b4ad2a262448fb0948c1338d735b866c7))
* **scan:** retry boards that failed on a transient error once, after the sweep ([#6675](https://github.com/career-ops-hq/career-ops/issues/6675)) ([bf5d0fc](https://github.com/career-ops-hq/career-ops/commit/bf5d0fc9f8ca1e2cd7cfc3e658e2b43de5f97580))
* **templates:** add Norway (NO) rows to the fee, agency-licensing and prohibited-content tables ([#6628](https://github.com/career-ops-hq/career-ops/issues/6628)) ([fd922ee](https://github.com/career-ops-hq/career-ops/commit/fd922ee08c4c822cc26f9ddf5b8913d12aafc40c))
* **tracker:** add verify-tracker-url-match.mjs ([#6061](https://github.com/career-ops-hq/career-ops/issues/6061)) ([e3db0c9](https://github.com/career-ops-hq/career-ops/commit/e3db0c953a05a5efdf9bd26d5281560ec805d64d))
* **tracker:** import another tracker's CSV export with import-tracker.mjs ([#6170](https://github.com/career-ops-hq/career-ops/issues/6170)) ([ce9dbfd](https://github.com/career-ops-hq/career-ops/commit/ce9dbfd784d36dea78f56b7afe89bfd79f2a4ca1))
* **web:** sort the inbox and what's new by fit ([#6601](https://github.com/career-ops-hq/career-ops/issues/6601)) ([fd5de43](https://github.com/career-ops-hq/career-ops/commit/fd5de4343c2587051ec519e3d1335ab8e7311ece))


### Bug Fixes

* **adoption:** let the ladder workflow remove labels from pull requests ([#6732](https://github.com/career-ops-hq/career-ops/issues/6732)) ([893e406](https://github.com/career-ops-hq/career-ops/commit/893e40653fde57bedad37aa39c11696f6727c68e))
* **agent-inbox:** exit 1 on an unknown subcommand instead of printing usage at 0 ([#6207](https://github.com/career-ops-hq/career-ops/issues/6207)) ([dc514d4](https://github.com/career-ops-hq/career-ops/commit/dc514d441e3731f726ef6f5e2c2a539326193028))
* **apple:** keep the country on a location ([#6452](https://github.com/career-ops-hq/career-ops/issues/6452)) ([5b7e17a](https://github.com/career-ops-hq/career-ops/commit/5b7e17a414ba14a7c5672aec4d37db2c712c8647))
* **applicantpro:** read the close day from the tenant's validThrough shape ([#6716](https://github.com/career-ops-hq/career-ops/issues/6716)) ([0874073](https://github.com/career-ops-hq/career-ops/commit/087407306f38e8ab05f01fc008aebfc37e1b1fe7))
* **archive-posting:** refuse a Cloudflare challenge page instead of saving it as the JD ([#6724](https://github.com/career-ops-hq/career-ops/issues/6724)) ([dc53c8a](https://github.com/career-ops-hq/career-ops/commit/dc53c8adcf7a10dd5c680404ac44b957f1c811cc))
* **asks:** oferta keeps the whole star ask, drawing included ([#6734](https://github.com/career-ops-hq/career-ops/issues/6734)) ([9de9304](https://github.com/career-ops-hq/career-ops/commit/9de930414884bbf518133376b3d0a28285173852))
* **audit-portals:** apply an entry's max_response_mb when auditing a board ([#6510](https://github.com/career-ops-hq/career-ops/issues/6510)) ([05480a6](https://github.com/career-ops-hq/career-ops/commit/05480a60eb71ceb9323f7cc28c2baf0c3498d8a8))
* **audit-portals:** exit 1 instead of aborting on Windows after the audit ([#6543](https://github.com/career-ops-hq/career-ops/issues/6543)) ([7de768e](https://github.com/career-ops-hq/career-ops/commit/7de768eefa605d9019d67572d08656e3bfcbf492))
* **avature:** parse article--result cards without leading article class ([#6593](https://github.com/career-ops-hq/career-ops/issues/6593)) ([8e8a7c3](https://github.com/career-ops-hq/career-ops/commit/8e8a7c3914fafa36ad14c73601fd4f310e34136d))
* **batch-evaluate-gemini:** read --limit N and --help instead of running every offer ([#6333](https://github.com/career-ops-hq/career-ops/issues/6333)) ([b5de065](https://github.com/career-ops-hq/career-ops/commit/b5de065eefd1df64a1165b7a1998367de012b017))
* **batch:** read batch-state.tsv from the checkout in merge-tracker and reserve-report-num ([#6449](https://github.com/career-ops-hq/career-ops/issues/6449)) ([beded4a](https://github.com/career-ops-hq/career-ops/commit/beded4a7828f37afdf127bb63265edb5fcb8fefd))
* **batch:** serialize sync allocation across input aliases ([#5512](https://github.com/career-ops-hq/career-ops/issues/5512)) ([116faed](https://github.com/career-ops-hq/career-ops/commit/116faed213cd14cdad3baf63314b1609fc778e15))
* **batch:** take the state lock with flock where mkdir is not atomic ([#6545](https://github.com/career-ops-hq/career-ops/issues/6545)) ([6de681c](https://github.com/career-ops-hq/career-ops/commit/6de681cc866613a2a53ce5f6790d76c49d294979)), closes [#6362](https://github.com/career-ops-hq/career-ops/issues/6362)
* **browser-extract:** refuse a Cloudflare challenge page instead of emitting it as the JD ([#6798](https://github.com/career-ops-hq/career-ops/issues/6798)) ([48212e1](https://github.com/career-ops-hq/career-ops/commit/48212e115c952d7324157c0fb1e4db803a3f31b6))
* **check-jd-archive:** reject batch-prompt's unfilled JD placeholder ([#6490](https://github.com/career-ops-hq/career-ops/issues/6490)) ([57e339b](https://github.com/career-ops-hq/career-ops/commit/57e339bb19dab2f8c3f31d5e2bcd0666e7f37260))
* **ci:** keep signature-ci's failure reason on one line ([#6714](https://github.com/career-ops-hq/career-ops/issues/6714)) ([221714b](https://github.com/career-ops-hq/career-ops/commit/221714b55e0d58d047e127ccb97f478a11937347))
* **close:** read a close day whose offset has no colon ([#6717](https://github.com/career-ops-hq/career-ops/issues/6717)) ([281f6da](https://github.com/career-ops-hq/career-ops/commit/281f6da831a0fa583b8dc615fba6946c55869bb8))
* **community-asks:** draw the star ask with emoji that terminals show as emoji ([#6741](https://github.com/career-ops-hq/career-ops/issues/6741)) ([98418a5](https://github.com/career-ops-hq/career-ops/commit/98418a54eca0eb3cfd3bdea70e088ca39ddf3e70))
* **cover:** parse generate-cover-letter flags strictly and honor the … ([#6384](https://github.com/career-ops-hq/career-ops/issues/6384)) ([7e4a38a](https://github.com/career-ops-hq/career-ops/commit/7e4a38a5f42ef557454dc909359603453584f453))
* **cryptocurrencyjobs:** stop passing the feed's teaser as the job description ([#6746](https://github.com/career-ops-hq/career-ops/issues/6746)) ([5b242a9](https://github.com/career-ops-hq/career-ops/commit/5b242a93c080fe2c453d7fe9883c36121e3400d8))
* **cv-visual:** retry the snapshot apt install, not only the update ([#6556](https://github.com/career-ops-hq/career-ops/issues/6556)) ([6c2ac63](https://github.com/career-ops-hq/career-ops/commit/6c2ac6350343788f70b339edd2e76d66ecae1669))
* **cv:** bind structured facts to source records ([#6016](https://github.com/career-ops-hq/career-ops/issues/6016)) ([1aeab42](https://github.com/career-ops-hq/career-ops/commit/1aeab42c6e55a6073615798a1a6226abdae41dfd))
* **cv:** fail the build on any unresolved {{token}} ([#6408](https://github.com/career-ops-hq/career-ops/issues/6408)) ([49ae767](https://github.com/career-ops-hq/career-ops/commit/49ae7679678935890c9689faa7a5cfbd2cad42fe))
* **dashboard, cover:** treat an over-budget render as not delivered ([#6656](https://github.com/career-ops-hq/career-ops/issues/6656)) ([af8fa29](https://github.com/career-ops-hq/career-ops/commit/af8fa29fc769cb698c2800d59cb6b459b549f5f9))
* **dedup:** keep one row for one posting ([#6602](https://github.com/career-ops-hq/career-ops/issues/6602)) ([a0e4f0a](https://github.com/career-ops-hq/career-ops/commit/a0e4f0afe53a94883105f61fa92d29f42f11d80f))
* **detect-reposts:** fold regional subdomains only on known sites and Greenhouse aliases to one source ([#6190](https://github.com/career-ops-hq/career-ops/issues/6190)) ([d59f0d1](https://github.com/career-ops-hq/career-ops/commit/d59f0d1bd76e5815e77c6d37dd3adae44b2549fc))
* **discover-ats:** exit 0 instead of aborting on Windows after the probes ([#6687](https://github.com/career-ops-hq/career-ops/issues/6687)) ([01f8367](https://github.com/career-ops-hq/career-ops/commit/01f83674825abd4ab6b346593c5dc59147fe3543))
* **docs:** list every routed command in the published menus ([#6048](https://github.com/career-ops-hq/career-ops/issues/6048)) ([63154d4](https://github.com/career-ops-hq/career-ops/commit/63154d405caa604ba85d4812fcc0ac15b54308c8))
* **doctor:** report missing packages before loading them ([#5561](https://github.com/career-ops-hq/career-ops/issues/5561)) ([a6cac56](https://github.com/career-ops-hq/career-ops/commit/a6cac56d4b40910c36f85b01ff99212b4cca9a45))
* **eval:** archive source JDs and fail unsuccessful saves ([#3951](https://github.com/career-ops-hq/career-ops/issues/3951)) ([b4ce1d6](https://github.com/career-ops-hq/career-ops/commit/b4ce1d6e2bb6fbb4878915fc0c6d870c336dcf0b))
* **eval:** include the profile and send each JD only once ([#3950](https://github.com/career-ops-hq/career-ops/issues/3950)) ([024b626](https://github.com/career-ops-hq/career-ops/commit/024b626dbb1c6343e3c3cfdafc6b775e20b5cf63))
* **eval:** read .env from the data root in the model runners ([#6659](https://github.com/career-ops-hq/career-ops/issues/6659)) ([8bcee77](https://github.com/career-ops-hq/career-ops/commit/8bcee77f8e5666affd3343a48f79a6890334be6a))
* **eval:** reject OLLAMA_NUM_CTX and *_TIMEOUT_MS values that are not whole numbers in range ([#6662](https://github.com/career-ops-hq/career-ops/issues/6662)) ([b4b77ec](https://github.com/career-ops-hq/career-ops/commit/b4b77ecf139a6ae46101b866c7606a8cb2be6a11))
* **eval:** reserve report IDs against the configured data root ([#3948](https://github.com/career-ops-hq/career-ops/issues/3948)) ([93e6bf8](https://github.com/career-ops-hq/career-ops/commit/93e6bf8bd88edc85159cb51e4c47bce90a5bf1a7))
* **fetch-jd:** exit 1 on a miss instead of aborting on Windows ([#6462](https://github.com/career-ops-hq/career-ops/issues/6462)) ([744666a](https://github.com/career-ops-hq/career-ops/commit/744666a2f010cb10f430d70865180bc7781ddabf))
* **gemini-eval:** load each market's own evaluation file ([#6407](https://github.com/career-ops-hq/career-ops/issues/6407)) ([eb86aba](https://github.com/career-ops-hq/career-ops/commit/eb86aba9a6b4abf743c3f8c19081311f686101af))
* **getro:** warn when getro_max_pages cuts a board short ([#6433](https://github.com/career-ops-hq/career-ops/issues/6433)) ([382c29a](https://github.com/career-ops-hq/career-ops/commit/382c29a8cef918bd489f45cfa6b24bd5885fcf5e))
* **greenhouse:** fetch bodies for title-matched postings on an oversized board ([#6673](https://github.com/career-ops-hq/career-ops/issues/6673)) ([1120279](https://github.com/career-ops-hq/career-ops/commit/1120279ed1e6571a70e3c98b970027a046720376))
* **http:** do not retry a request that already spent its timeout ([#6132](https://github.com/career-ops-hq/career-ops/issues/6132)) ([92c1d88](https://github.com/career-ops-hq/career-ops/commit/92c1d88d39ac2d9785bf1b6ebe7f81bc9332cd61))
* **i18n:** align ru practice retracted-claims definition with en ([#6617](https://github.com/career-ops-hq/career-ops/issues/6617)) ([25ec103](https://github.com/career-ops-hq/career-ops/commit/25ec103fb42a00221a1ff98abb58285416505af5))
* **i18n:** layer localized modes on the English canon for scalar modes_dir ([#6728](https://github.com/career-ops-hq/career-ops/issues/6728)) ([b124a5a](https://github.com/career-ops-hq/career-ops/commit/b124a5a9bda4b1d693e7fbba738f7823d30d2316))
* initialize reverse scan pipeline under its shared lock ([#6022](https://github.com/career-ops-hq/career-ops/issues/6022)) ([b13837a](https://github.com/career-ops-hq/career-ops/commit/b13837aa44c280dcdda54b1d064ba2e559aa8efc))
* **interview-redflag:** skip practice sessions when scoring a company ([#6715](https://github.com/career-ops-hq/career-ops/issues/6715)) ([89d70f5](https://github.com/career-ops-hq/career-ops/commit/89d70f52c15e5ea9c02c539078dc33d6088defea))
* **interview:** check --dealbreaker for delimiters before debrief Step 10 runs ([#6541](https://github.com/career-ops-hq/career-ops/issues/6541)) ([#6590](https://github.com/career-ops-hq/career-ops/issues/6590)) ([45d43c4](https://github.com/career-ops-hq/career-ops/commit/45d43c4a376dd5b4fa4f4d773f72eaa91a26aa1f))
* **interview:** escape backslashes before inner double quotes in stated_priorities.quote rule ([#6588](https://github.com/career-ops-hq/career-ops/issues/6588)) ([51bdb79](https://github.com/career-ops-hq/career-ops/commit/51bdb79809d24b4ed0c9a1bfa30b08e046335358))
* **interview:** map the contact type to a value debrief-sync accepts ([#6548](https://github.com/career-ops-hq/career-ops/issues/6548)) ([4be763f](https://github.com/career-ops-hq/career-ops/commit/4be763f30b9a67df5ebaa4b76f2084a796492fea))
* **interview:** record each confirmed dealbreaker in debrief Step 10 ([#6542](https://github.com/career-ops-hq/career-ops/issues/6542)) ([#6591](https://github.com/career-ops-hq/career-ops/issues/6591)) ([8b92efb](https://github.com/career-ops-hq/career-ops/commit/8b92efba889ef5842d5a1aab4b6d2320a4afd531))
* **jd-capture:** give company and role names with no ASCII letters a non-empty capture slug ([#5689](https://github.com/career-ops-hq/career-ops/issues/5689)) ([af4b126](https://github.com/career-ops-hq/career-ops/commit/af4b126eab97186e4cd26a490d527a3397b23215))
* **jd-skill-gap:** read a markdown link's text, not its target, as CV evidence ([#6663](https://github.com/career-ops-hq/career-ops/issues/6663)) ([8d6298a](https://github.com/career-ops-hq/career-ops/commit/8d6298aea05c000971cade517bafd4f5e773e741))
* **jd-years:** stop a list item reading as a required heading ([#6463](https://github.com/career-ops-hq/career-ops/issues/6463)) ([05ceb99](https://github.com/career-ops-hq/career-ops/commit/05ceb992d25c7870fc89823c88e75fcb7464b135))
* **jibeapply:** accurate truncation warning at the page cap, opt-in page_size ([#6692](https://github.com/career-ops-hq/career-ops/issues/6692)) ([32b1bec](https://github.com/career-ops-hq/career-ops/commit/32b1becf84460a205c361f3ddb44ec2c09762458))
* **jobspresso, wp-job-manager:** pass the full post through so the scan filters can read it ([#6585](https://github.com/career-ops-hq/career-ops/issues/6585)) ([ba508d9](https://github.com/career-ops-hq/career-ops/commit/ba508d90ec11d7e757caa6c0ecdc6e5d3945fbd9))
* **keyword-match:** read a markdown CV's link text, not its targets ([#6664](https://github.com/career-ops-hq/career-ops/issues/6664)) ([6babdcc](https://github.com/career-ops-hq/career-ops/commit/6babdcc774fb40dab6e7b05371bf2537449d8c52))
* **linkedin:** keep a recognized place on an imported alert ([#6775](https://github.com/career-ops-hq/career-ops/issues/6775)) ([adf8ba4](https://github.com/career-ops-hq/career-ops/commit/adf8ba46a16de9a9fb0aeca2f6512c335f0c405b))
* **liveness:** read Eightfold's "job you are looking for may have closed" as expired ([#6670](https://github.com/career-ops-hq/career-ops/issues/6670)) ([f03cd3f](https://github.com/career-ops-hq/career-ops/commit/f03cd3ff2c75e11e3aaf5b854f33102cc1d7d467))
* **liveness:** stop a Norwegian "Sorter etter søknadsfrist" control hiding a closure banner ([#6788](https://github.com/career-ops-hq/career-ops/issues/6788)) ([#6810](https://github.com/career-ops-hq/career-ops/issues/6810)) ([7a377a4](https://github.com/career-ops-hq/career-ops/commit/7a377a4875269fcaed22eb03a99535b2a4ba6997))
* **liveness:** treat a Paylocity JobNotFound URL as expired ([#6599](https://github.com/career-ops-hq/career-ops/issues/6599)) ([64ea4e3](https://github.com/career-ops-hq/career-ops/commit/64ea4e3eeac0eaae359100136f511892410025ae))
* **merge-tracker:** keep the employer URL when an aggregator re-list ([#6657](https://github.com/career-ops-hq/career-ops/issues/6657)) ([ed3f2d1](https://github.com/career-ops-hq/career-ops/commit/ed3f2d17fe50cdcb9c006d7deaf8255774fcd96d)), closes [#6621](https://github.com/career-ops-hq/career-ops/issues/6621)
* **merge-tracker:** refuse headerless TSV additions by default ([#6062](https://github.com/career-ops-hq/career-ops/issues/6062)) ([64f6c53](https://github.com/career-ops-hq/career-ops/commit/64f6c5392ffde49fbbf3ce8faff7b0f208e40f66))
* **modes:** score ofertas, training and project against the user's profile ([#6283](https://github.com/career-ops-hq/career-ops/issues/6283)) ([819e9df](https://github.com/career-ops-hq/career-ops/commit/819e9dff89392a8b70c459e92a4a368f1930e644))
* **mokahr:** read the tenants the old robots.txt rule skipped ([#6694](https://github.com/career-ops-hq/career-ops/issues/6694)) ([#6726](https://github.com/career-ops-hq/career-ops/issues/6726)) ([0b958b1](https://github.com/career-ops-hq/career-ops/commit/0b958b1425791dab017f2cd462da3655e08534dd))
* name a missing data folder and fail unfinished doctor setup ([#6618](https://github.com/career-ops-hq/career-ops/issues/6618)) ([46f375f](https://github.com/career-ops-hq/career-ops/commit/46f375fa978803c53717aafbfb9294de59e8d92c))
* **nodesk:** decode the twice-escaped ampersand in titles ([#6584](https://github.com/career-ops-hq/career-ops/issues/6584)) ([996c356](https://github.com/career-ops-hq/career-ops/commit/996c356dbff62e0199798290dad2a3d7e0737459))
* **oferta:** show an unverified red-flag file as not evaluated ([#6787](https://github.com/career-ops-hq/career-ops/issues/6787)) ([09b8ab8](https://github.com/career-ops-hq/career-ops/commit/09b8ab8a0de04f815ffb3ce4879414edd0ba50c9))
* **openai-eval:** cap the completion with max_tokens to stop OpenRouter 402s ([#6676](https://github.com/career-ops-hq/career-ops/issues/6676)) ([5d47f94](https://github.com/career-ops-hq/career-ops/commit/5d47f9472c8d744341cd71ff5d7405ef0e170f11))
* **openai-tailor:** cap the completion with max_tokens, as openai-eval does ([#6762](https://github.com/career-ops-hq/career-ops/issues/6762)) ([5e7d26c](https://github.com/career-ops-hq/career-ops/commit/5e7d26cab7a7a2c51be9cd08a265fbf7b603be7f))
* **openai-tailor:** send OpenCode Go the session id and user agent it asks for ([#6800](https://github.com/career-ops-hq/career-ops/issues/6800)) ([594eaf9](https://github.com/career-ops-hq/career-ops/commit/594eaf9f8c9a4ec6421840b814fff675af4eead9))
* **openrouter-runner:** exit 1 when a command fails or is mistyped ([#6660](https://github.com/career-ops-hq/career-ops/issues/6660)) ([aacdf09](https://github.com/career-ops-hq/career-ops/commit/aacdf09c2cc6d199ba71ecb5034570f917631745))
* **openrouter-runner:** wait for the job description instead of a fixed 2 s ([#5809](https://github.com/career-ops-hq/career-ops/issues/5809)) ([#6169](https://github.com/career-ops-hq/career-ops/issues/6169)) ([74618c2](https://github.com/career-ops-hq/career-ops/commit/74618c2f0fc528093ea5dabbb67d60c66eb4b74f))
* **oraclecloud:** warn when max_pages truncates a board; allow opt-in up to 100 pages ([#6690](https://github.com/career-ops-hq/career-ops/issues/6690)) ([0f3c7ae](https://github.com/career-ops-hq/career-ops/commit/0f3c7aefaab3e177e036ec1b20f833842249287a))
* **outcome:** find a posting capture under the slug archive-posting wrote ([#6658](https://github.com/career-ops-hq/career-ops/issues/6658)) ([0e15bac](https://github.com/career-ops-hq/career-ops/commit/0e15bacebfe27f6e70be7ad9f1724d21db0e87e2))
* **pdf:** keep a warn-only page-budget overflow off the output path and out of the manifest ([#6458](https://github.com/career-ops-hq/career-ops/issues/6458)) ([c48d13e](https://github.com/career-ops-hq/career-ops/commit/c48d13e6e052b4846070963ffad9629556ea5412))
* **platsbanken:** mark a cut board truncated, not just warn on stderr ([#6804](https://github.com/career-ops-hq/career-ops/issues/6804)) ([d5dd137](https://github.com/career-ops-hq/career-ops/commit/d5dd137e29460ab09ad535c9f3e79e392b9eb795))
* **plugins:** apply the fetch timeout to the response body ([#6473](https://github.com/career-ops-hq/career-ops/issues/6473)) ([afc099a](https://github.com/career-ops-hq/career-ops/commit/afc099ae91c21fba9978ac9b6575f0c21b91618f))
* **plugins:** exit non-zero when a plugin run fails ([#6125](https://github.com/career-ops-hq/career-ops/issues/6125)) ([a77608b](https://github.com/career-ops-hq/career-ops/commit/a77608b77387b8fe97ab177a8d7d35d0654eb2cd))
* **plugins:** import the template smoke test's entry by file URL ([#6811](https://github.com/career-ops-hq/career-ops/issues/6811)) ([#6812](https://github.com/career-ops-hq/career-ops/issues/6812)) ([d6d17fa](https://github.com/career-ops-hq/career-ops/commit/d6d17fa6e9fe19e826546ad84e0fa8e52467426e))
* **portals:** repoint Runway to its Ashby board and enable it ([#6505](https://github.com/career-ops-hq/career-ops/issues/6505)) ([ea0bb9c](https://github.com/career-ops-hq/career-ops/commit/ea0bb9cfecd3bf7b78df2e7bbb476898fc64c2d9))
* **portals:** report why a board was not verified ([#6085](https://github.com/career-ops-hq/career-ops/issues/6085)) ([cc6f0a1](https://github.com/career-ops-hq/career-ops/commit/cc6f0a1d8a3051f92bda8566fad4c22d6c3bb7cd))
* preserve fetch method receiver when applying response cap ([#6801](https://github.com/career-ops-hq/career-ops/issues/6801)) ([65d9496](https://github.com/career-ops-hq/career-ops/commit/65d9496d5191d26ddf9a8e5690fcaf9bcbbcdab8))
* **protected-grounds:** correct the DE row's BAG case number ([#6748](https://github.com/career-ops-hq/career-ops/issues/6748)) ([a50c74e](https://github.com/career-ops-hq/career-ops/commit/a50c74eb2e1a59f208c59f91a24719431c45335e))
* **providers/ibm:** reject impossible dcdate like 2026-02-30 ([#6802](https://github.com/career-ops-hq/career-ops/issues/6802)) ([4deaa21](https://github.com/career-ops-hq/career-ops/commit/4deaa21133dcb936ebfbb50ff74f2bc0163112c5))
* **providers:** pass Arbeitnow description through so filters can see it ([#6439](https://github.com/career-ops-hq/career-ops/issues/6439)) ([798d956](https://github.com/career-ops-hq/career-ops/commit/798d95684ee5a8f6f6df4199d11bc7d36086a6ec))
* **providers:** propagate careers_url lang into ADP Workforce Now API calls ([#6679](https://github.com/career-ops-hq/career-ops/issues/6679)) ([c2d335b](https://github.com/career-ops-hq/career-ops/commit/c2d335b7982503f395fc3cb8e5e7b6e61499eb47))
* **providers:** read boards over the 10 MB body cap ([#6560](https://github.com/career-ops-hq/career-ops/issues/6560)) ([447ca06](https://github.com/career-ops-hq/career-ops/commit/447ca062654c1cd9b131a0ce1515f1f2d0cf9da8))
* **providers:** read CAREER_OPS_HTTP_TIMEOUT_MS on each request so it works from .env ([#6580](https://github.com/career-ops-hq/career-ops/issues/6580)) ([0d82fa2](https://github.com/career-ops-hq/career-ops/commit/0d82fa233c39074f19f44c88d01235a9de0db3e6))
* **providers:** read jobspresso's query-free feed path, robots.txt disallows /*? ([#6546](https://github.com/career-ops-hq/career-ops/issues/6546)) ([de6048f](https://github.com/career-ops-hq/career-ops/commit/de6048f86f3c5409f8a1d8bdf8c4526b3da75ab4)), closes [#5774](https://github.com/career-ops-hq/career-ops/issues/5774)
* **providers:** send Computrabajo's newest-first sort on every path ([#6694](https://github.com/career-ops-hq/career-ops/issues/6694)) ([#6739](https://github.com/career-ops-hq/career-ops/issues/6739)) ([e641424](https://github.com/career-ops-hq/career-ops/commit/e641424ae41422f1615fae7aaf846c078425b024))
* **providers:** walk the whole Jobicy feed; add geo/industry/tag filters ([#6612](https://github.com/career-ops-hq/career-ops/issues/6612)) ([90d0cde](https://github.com/career-ops-hq/career-ops/commit/90d0cde838c1c266d560a127957b9deecbdea748))
* **readme-badges:** answer --help instead of treating it as a badge name ([#6702](https://github.com/career-ops-hq/career-ops/issues/6702)) ([4e5dd7f](https://github.com/career-ops-hq/career-ops/commit/4e5dd7f26a1bfa04fd166f31ec9fdc79fb729727))
* **readme:** serve the Hired Wall, Discord and npm badges from the repo ([#6701](https://github.com/career-ops-hq/career-ops/issues/6701)) ([7c08d5d](https://github.com/career-ops-hq/career-ops/commit/7c08d5d76d96698c7b76a9b14851f40d020b6002))
* **registry:** report a pin after its latest release as ahead, not stale ([#6786](https://github.com/career-ops-hq/career-ops/issues/6786)) ([57f443b](https://github.com/career-ops-hq/career-ops/commit/57f443b977d8c9c582bac67496979eb97f8c8d22))
* **remoteok:** pass the description through so the scan filters can read it ([#6565](https://github.com/career-ops-hq/career-ops/issues/6565)) ([5bbd05d](https://github.com/career-ops-hq/career-ops/commit/5bbd05d50658dfe1655626890439492258d8d031))
* **remotive:** pass the description through so the scan filters can read it ([#6566](https://github.com/career-ops-hq/career-ops/issues/6566)) ([ced1bb4](https://github.com/career-ops-hq/career-ops/commit/ced1bb475b85a1a84ed4819e9dc24d8fba367b40))
* **repo:** catch CRLF blobs and unportable paths, ignore exported reports and CVs ([#6578](https://github.com/career-ops-hq/career-ops/issues/6578)) ([9c43348](https://github.com/career-ops-hq/career-ops/commit/9c433489b259b4b00c07b93988a6a704ffe00c73))
* **role-clarity:** read a "Reports to: X" label line as the reporting line ([#6576](https://github.com/career-ops-hq/career-ops/issues/6576)) ([70bc932](https://github.com/career-ops-hq/career-ops/commit/70bc93273a0c6b9a506429f33ebe40adda4f2373))
* **scan-hn:** fetch Hacker News through the shared HTTP context ([#6680](https://github.com/career-ops-hq/career-ops/issues/6680)) ([fd26764](https://github.com/career-ops-hq/career-ops/commit/fd267649f3522b9023186fa3ce24c2f518cfc27b))
* **scan:** a blocked Georgian city loses to the Georgia state name ([#6533](https://github.com/career-ops-hq/career-ops/issues/6533)) ([0aa6518](https://github.com/career-ops-hq/career-ops/commit/0aa6518c32447f63047c90e57aa74c1a900e1f79))
* **scan:** a portals.yml entry can raise its request timeout with timeout_ms ([#6582](https://github.com/career-ops-hq/career-ops/issues/6582)) ([07db6e3](https://github.com/career-ops-hq/career-ops/commit/07db6e336d8df506ae8608d1c5c5fadfe21f527d))
* **scan:** accept the documented --throttle=<ms> form ([#6491](https://github.com/career-ops-hq/career-ops/issues/6491)) ([5008e07](https://github.com/career-ops-hq/career-ops/commit/5008e07e665f5eb2403943fab53c321cb599a7a3))
* **scan:** accept worldwide labels in country-only filters ([#6553](https://github.com/career-ops-hq/career-ops/issues/6553)) ([d58bb54](https://github.com/career-ops-hq/career-ops/commit/d58bb549ae9c6f2e9b7daa146d50989979a24380))
* **scan:** apply scan_history.recheck_after_days in the admission gate and sibling scanners ([#5905](https://github.com/career-ops-hq/career-ops/issues/5905)) ([a38e953](https://github.com/career-ops-hq/career-ops/commit/a38e953421189b34edd01d188fba7c31ab1c8aef))
* **scan:** default to 10 concurrent companies and make both scan limits configurable ([#6573](https://github.com/career-ops-hq/career-ops/issues/6573)) ([2cda411](https://github.com/career-ops-hq/career-ops/commit/2cda41141fa6c9aa00e20a97e4df9f257141a69a))
* **scan:** gate conditional workplace geography before Inbox admission ([#6484](https://github.com/career-ops-hq/career-ops/issues/6484)) ([14bfd95](https://github.com/career-ops-hq/career-ops/commit/14bfd9534b3ea98afabeff84b943d80616a4d62b))
* **scan:** honor employer location decisions for board copies ([#6485](https://github.com/career-ops-hq/career-ops/issues/6485)) ([0d585b2](https://github.com/career-ops-hq/career-ops/commit/0d585b28342d750c286b9bee12fa92468283b6a8))
* **scan:** keep each allowed city when a workplace policy is set ([#6784](https://github.com/career-ops-hq/career-ops/issues/6784)) ([f4ebc45](https://github.com/career-ops-hq/career-ops/commit/f4ebc4598b7545b36b2679e5e791bebcf4b6b037))
* **scan:** match uppercase ISO codes in location lists case-sensitively ([#6616](https://github.com/career-ops-hq/career-ops/issues/6616)) ([4c413c2](https://github.com/career-ops-hq/career-ops/commit/4c413c27e86a6d4e850ea833d1db4b1690225d50))
* **scan:** name companies no provider claims ([#6088](https://github.com/career-ops-hq/career-ops/issues/6088)) ([cff21dd](https://github.com/career-ops-hq/career-ops/commit/cff21dd0ab53351168f4062fd7c72d2ff9725e52))
* **scan:** read the CryptocurrencyJobs teaser's eligibility clause ([#6765](https://github.com/career-ops-hq/career-ops/issues/6765)) ([d62f7d5](https://github.com/career-ops-hq/career-ops/commit/d62f7d5f30430b8147cd1830a23d9a4dc43c401c))
* **skill:** drop the undocumented user_invocable key from the router frontmatter ([#6695](https://github.com/career-ops-hq/career-ops/issues/6695)) ([28123e1](https://github.com/career-ops-hq/career-ops/commit/28123e12544c455fb56b2ee87e98292d416b44ab))
* stamp the local day, not UTC, in four more writers ([#6564](https://github.com/career-ops-hq/career-ops/issues/6564)) ([6882cd6](https://github.com/career-ops-hq/career-ops/commit/6882cd6a4f27ae103d761126e79bf77bbfb365f2))
* **startup-jobs:** stop passing the feed's teaser as the job description ([#6774](https://github.com/career-ops-hq/career-ops/issues/6774)) ([1374f8a](https://github.com/career-ops-hq/career-ops/commit/1374f8ab4c43968fdbf8daec3aa2aca4b0536266))
* **status:** map Lapsed to Discarded ([#6598](https://github.com/career-ops-hq/career-ops/issues/6598)) ([3031470](https://github.com/career-ops-hq/career-ops/commit/30314706aabdde3e150e27cf2554b97aad36957f))
* **telegram-channel:** read Habr Career links and positional employers ([#6363](https://github.com/career-ops-hq/career-ops/issues/6363)) ([9486e6a](https://github.com/career-ops-hq/career-ops/commit/9486e6a6d66db15b25cf00e3f25a2ddf49930a67))
* **tracker:** recognize the French, Italian and Turkish headers modes ship ([#6360](https://github.com/career-ops-hq/career-ops/issues/6360)) ([9b2ba6a](https://github.com/career-ops-hq/career-ops/commit/9b2ba6a5229851fea7f10d1534539e781dc72338))
* **tracker:** stop a placeholder or a URL spelling hiding which posting a row is ([#6390](https://github.com/career-ops-hq/career-ops/issues/6390)) ([abe49bb](https://github.com/career-ops-hq/career-ops/commit/abe49bbbbbc210d4135a9b86cd329060fc1395e1))
* **updater:** check --channel main falls back to git before reporting offline ([#2550](https://github.com/career-ops-hq/career-ops/issues/2550)) ([738d45c](https://github.com/career-ops-hq/career-ops/commit/738d45ca8b0d723439ec32b028bf3d29a95a0b23))
* **verify-ats:** decode every entity in the text keywords are searched in ([#6464](https://github.com/career-ops-hq/career-ops/issues/6464)) ([b34707a](https://github.com/career-ops-hq/career-ops/commit/b34707afacf4569e42cf93bef9f01c0909d4d481))
* **verify-ats:** recognize Norwegian Bokmål CV headings ([#6654](https://github.com/career-ops-hq/career-ops/issues/6654)) ([43eaaf5](https://github.com/career-ops-hq/career-ops/commit/43eaaf5a6d7d2a97cae86c790fcb001c24f75fcf)), closes [#6615](https://github.com/career-ops-hq/career-ops/issues/6615)
* **verify-ats:** recognize Vietnamese CV section headings ([#6652](https://github.com/career-ops-hq/career-ops/issues/6652)) ([8ce89bd](https://github.com/career-ops-hq/career-ops/commit/8ce89bdc492bd17698c72c6245d0638d7af78d39))
* **verify-cv-facts:** read link text, not link targets, when matching a claim to its source ([#6606](https://github.com/career-ops-hq/career-ops/issues/6606)) ([6a6884b](https://github.com/career-ops-hq/career-ops/commit/6a6884baeddb09c8a0898cf53aa98689169aa97a))
* **verify-cv-facts:** run scope-verb and adoption checks on Simplified Chinese CVs ([#6730](https://github.com/career-ops-hq/career-ops/issues/6730)) ([f0e546e](https://github.com/career-ops-hq/career-ops/commit/f0e546e8c566c4d02376fec5ffbc12c4d43580be))
* **verify-pipeline:** detect corporate-form duplicate companies ([#6528](https://github.com/career-ops-hq/career-ops/issues/6528)) ([1350f9d](https://github.com/career-ops-hq/career-ops/commit/1350f9dd5f08fc4f095c2c32fdfeca8732640c66))
* **verify-pipeline:** don't flag a re-evaluation one tracker row keeps on record ([#5985](https://github.com/career-ops-hq/career-ops/issues/5985)) ([abefa6d](https://github.com/career-ops-hq/career-ops/commit/abefa6dbdb57fd2971c0d24ec563f24de57477ca))
* **verify-portals:** check a board with its entry's timeout_ms and max_response_mb ([#6718](https://github.com/career-ops-hq/career-ops/issues/6718)) ([64e63d5](https://github.com/career-ops-hq/career-ops/commit/64e63d5e273d2713dfcd81902c3f403d5619a3df))
* **web:** rank the week's matches before paging them ([#6783](https://github.com/career-ops-hq/career-ops/issues/6783)) ([d5b579a](https://github.com/career-ops-hq/career-ops/commit/d5b579a6c31a369f07f4da6492c4d897edd8d5c5))
* **web:** read script-rendered JDs before the evaluate worker starts ([#6604](https://github.com/career-ops-hq/career-ops/issues/6604)) ([e56ab08](https://github.com/career-ops-hq/career-ops/commit/e56ab0833c00bc075c59f87fad026801b07bbf27))
* **web:** show the real PDF render failure, not the warnings printed before it ([#6624](https://github.com/career-ops-hq/career-ops/issues/6624)) ([d8f0ab5](https://github.com/career-ops-hq/career-ops/commit/d8f0ab551d5d4c1c19d073442ccd97751372b11e))
* **weworkremotely:** pass the description through so the scan filters can read it ([#6568](https://github.com/career-ops-hq/career-ops/issues/6568)) ([b03c44b](https://github.com/career-ops-hq/career-ops/commit/b03c44bb0e0f018870380ef89ec916399c874090))
* **workable:** keep telecommuting and a state-only place ([#6140](https://github.com/career-ops-hq/career-ops/issues/6140)) ([eeead8e](https://github.com/career-ops-hq/career-ops/commit/eeead8ebf9a65846caef1ef9076b798d6ea8f795))
* **workday:** ignore a slice's own applied facets when reading the true board size ([#6672](https://github.com/career-ops-hq/career-ops/issues/6672)) ([127b450](https://github.com/career-ops-hq/career-ops/commit/127b450c32263cf1374b5bf9e6fca809e5563a70))
* **workingnomads:** pass the description through so the scan filters can read it ([#6567](https://github.com/career-ops-hq/career-ops/issues/6567)) ([ea02d07](https://github.com/career-ops-hq/career-ops/commit/ea02d07b0264e47d51b7d52bd9e29759cd4c7740))


### Performance Improvements

* **archive-posting:** load playwright only when saving ([#6134](https://github.com/career-ops-hq/career-ops/issues/6134)) ([f3f25dc](https://github.com/career-ops-hq/career-ops/commit/f3f25dced6748b5c4afe7cd4915c454e7df2e7ac))
* **img-to-pdf:** load playwright only when rendering ([#6135](https://github.com/career-ops-hq/career-ops/issues/6135)) ([9711088](https://github.com/career-ops-hq/career-ops/commit/97110888bb42703167007c4d2392b64b37f4eed9))
* **scan:** fetch up to 32 companies, 10 per host ([#6133](https://github.com/career-ops-hq/career-ops/issues/6133)) ([975abe0](https://github.com/career-ops-hq/career-ops/commit/975abe0e393bdb60ac4bd0eb211b180070a88aee))

## [1.39.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.38.0...career-ops-v1.39.0) (2026-11-05)


### Features

* add UK Skilled Worker sponsor-licence cross-check (sponsor-check.mjs) ([#5790](https://github.com/career-ops-hq/career-ops/issues/5790)) ([97b6b33](https://github.com/career-ops-hq/career-ops/commit/97b6b3386a7310d9070c2669278647b3f364d32c))
* **apple:** note postings Apple labels PIPE ([#6196](https://github.com/career-ops-hq/career-ops/issues/6196)) ([39287a5](https://github.com/career-ops-hq/career-ops/commit/39287a556ea8d8cf8ef94abd790af8ef8418f3f0))
* **ats:** classify each ATS rule as structural or content-dependent ([#5939](https://github.com/career-ops-hq/career-ops/issues/5939)) ([fe40e51](https://github.com/career-ops-hq/career-ops/commit/fe40e51540bba379cd32ae213914ee5fc68d6783)), closes [#4798](https://github.com/career-ops-hq/career-ops/issues/4798)
* **ats:** give each auditAts check an id and a scope ([#5942](https://github.com/career-ops-hq/career-ops/issues/5942)) ([1ac71e4](https://github.com/career-ops-hq/career-ops/commit/1ac71e44a28a7d2e8603e14ca655f835672cee89)), closes [#5940](https://github.com/career-ops-hq/career-ops/issues/5940)
* **batch:** add optional single-pass CV-match evaluation mode (--mode match, [#5297](https://github.com/career-ops-hq/career-ops/issues/5297)) ([#5404](https://github.com/career-ops-hq/career-ops/issues/5404)) ([3d30cf1](https://github.com/career-ops-hq/career-ops/commit/3d30cf141bc5a7fbcaf8dcdf5832686865769a6d))
* **batch:** put the archived JD after Keyword Coverage in batch reports ([#6160](https://github.com/career-ops-hq/career-ops/issues/6160)) ([2287a10](https://github.com/career-ops-hq/career-ops/commit/2287a10200b2bf511db54d304ea6c265bf1075f6))
* **browser:** share the Chromium executable override across every launch site ([#6415](https://github.com/career-ops-hq/career-ops/issues/6415)) ([052ab80](https://github.com/career-ops-hq/career-ops/commit/052ab808164b8312bbc5f4e5ede2680dde875559))
* **cli:** infer numeric report number from filepath and extend plugin hook timeout ([#6152](https://github.com/career-ops-hq/career-ops/issues/6152)) ([5dbfba0](https://github.com/career-ops-hq/career-ops/commit/5dbfba07477067911aaada8834490e52b32d2315))
* **close-stale:** close long-silent Applied rows in bulk ([#5795](https://github.com/career-ops-hq/career-ops/issues/5795)) ([51a57a8](https://github.com/career-ops-hq/career-ops/commit/51a57a831a1a38efc55157486d91fd2d6e220997))
* **closing-soon:** warn when closing dates pile up on an interview day ([#5738](https://github.com/career-ops-hq/career-ops/issues/5738)) ([205fed9](https://github.com/career-ops-hq/career-ops/commit/205fed92b9c57c05e125bce88970dd3a3ecbe483))
* **cover:** add the {{RECIPIENT_BLOCK}} slot to the shipped cover-letter template ([#5938](https://github.com/career-ops-hq/career-ops/issues/5938)) ([3c44110](https://github.com/career-ops-hq/career-ops/commit/3c44110af0111b01a6b29d43a9526ebf2c3d0737)), closes [#5937](https://github.com/career-ops-hq/career-ops/issues/5937)
* **cv:** reject stock resume wording the candidate did not write ([#6178](https://github.com/career-ops-hq/career-ops/issues/6178)) ([f9ba76b](https://github.com/career-ops-hq/career-ops/commit/f9ba76ba5dcab44cd47170439778c09b5f7e395a))
* **dashboard:** y copies the selected application's CV PDF path to t… ([#6186](https://github.com/career-ops-hq/career-ops/issues/6186)) ([1bbc30b](https://github.com/career-ops-hq/career-ops/commit/1bbc30b9cac03b0a76e321f98aa2a1c5de66c261))
* **doctor:** warn about user templates that no longer resolve or have drifted ([#5957](https://github.com/career-ops-hq/career-ops/issues/5957)) ([5562051](https://github.com/career-ops-hq/career-ops/commit/556205187e56880f4c73d94a90703c4e89ff01aa))
* **expand:** propose updates for named repos with new GitHub activity ([#5677](https://github.com/career-ops-hq/career-ops/issues/5677)) ([#5680](https://github.com/career-ops-hq/career-ops/issues/5680)) ([f8a8aeb](https://github.com/career-ops-hq/career-ops/commit/f8a8aebefa9d6478946bb13ab50d4dd47ac474ae))
* **expand:** read READMEs of allowlisted private repos through gh ([#5426](https://github.com/career-ops-hq/career-ops/issues/5426)) ([#5427](https://github.com/career-ops-hq/career-ops/issues/5427)) ([41585db](https://github.com/career-ops-hq/career-ops/commit/41585db6854f570ae7a0aa8e2c93bb1c5abeb20d))
* **interview:** carry interviewer-stated role priorities into the next round ([#5801](https://github.com/career-ops-hq/career-ops/issues/5801)) ([eeb9865](https://github.com/career-ops-hq/career-ops/commit/eeb9865c8ce6c7348d65958ae1e9ed1216b9a820))
* **interview:** classify interview panelists from invite text (panelist-roles.mjs) ([#5799](https://github.com/career-ops-hq/career-ops/issues/5799)) ([fc137fd](https://github.com/career-ops-hq/career-ops/commit/fc137fd082906b97e9f693c76eb1d56da0d4b726))
* **invite-match:** draft a pre-interview clarification email for invites ([#6100](https://github.com/career-ops-hq/career-ops/issues/6100)) ([960cdd5](https://github.com/career-ops-hq/career-ops/commit/960cdd5d7a105bebf5bf9f97fa536f7eb941e0d2))
* **invite-match:** extract interview constraints (no-ai, recording, camera, panel...) ([#5734](https://github.com/career-ops-hq/career-ops/issues/5734)) ([3e7818c](https://github.com/career-ops-hq/career-ops/commit/3e7818c2e48756d4c90867167bb7ec78638598b4))
* **jd:** read UltiPro JDs from the record their page embeds, without a browser ([#6245](https://github.com/career-ops-hq/career-ops/issues/6245)) ([d7392c7](https://github.com/career-ops-hq/career-ops/commit/d7392c7344b12cdec10bd89d19c118b4e2ee2166))
* **keyword-match:** score CV against a posting URL ([#6191](https://github.com/career-ops-hq/career-ops/issues/6191)) ([2024a49](https://github.com/career-ops-hq/career-ops/commit/2024a49e9db169da1c5882ffc05bd49651f30692))
* **linkedin:** paste job alerts without a Google account ([#6096](https://github.com/career-ops-hq/career-ops/issues/6096)) ([5f96824](https://github.com/career-ops-hq/career-ops/commit/5f9682406a80da0e1bede04a1e6b1347e6362561))
* **oferta:** advisory role-clarity check and ask-before-you-commit draft ([#6095](https://github.com/career-ops-hq/career-ops/issues/6095)) ([91cdce9](https://github.com/career-ops-hq/career-ops/commit/91cdce925c9560bd09819dac54c6d747b42942c1))
* **pdf:** read the CV page budget from config/profile.yml ([#6325](https://github.com/career-ops-hq/career-ops/issues/6325)) ([#6328](https://github.com/career-ops-hq/career-ops/issues/6328)) ([daa4a7e](https://github.com/career-ops-hq/career-ops/commit/daa4a7e1a908264f3328ac877050119b87bf484f))
* **pdf:** warn when CV headline or PDF filename exceeds 64 characters ([#5630](https://github.com/career-ops-hq/career-ops/issues/5630)) ([e843469](https://github.com/career-ops-hq/career-ops/commit/e843469eb566ac699710b2acb43e8d3e310f975f))
* **plugin:** add a thin plugin for the Antigravity Marketplace ([#6335](https://github.com/career-ops-hq/career-ops/issues/6335)) ([086d8c3](https://github.com/career-ops-hq/career-ops/commit/086d8c376bf0373998756a681b168f2228b55ab1))
* **plugin:** add a thin plugin for the Claude plugin directory ([#6308](https://github.com/career-ops-hq/career-ops/issues/6308)) ([31906c1](https://github.com/career-ops-hq/career-ops/commit/31906c102d850db52070632a3d19c5e706e95792))
* **plugin:** add a thin plugin for the Cursor Marketplace ([#6330](https://github.com/career-ops-hq/career-ops/issues/6330)) ([681608b](https://github.com/career-ops-hq/career-ops/commit/681608b5039b724e27efa1e89f564fded38311b9))
* **plugin:** add a thin plugin for the OpenAI plugin directory ([#6323](https://github.com/career-ops-hq/career-ops/issues/6323)) ([74e6a2a](https://github.com/career-ops-hq/career-ops/commit/74e6a2ac2628ef0e503080bf66f3fcec40273a35))
* **plugin:** fill the Claude plugin directory listing fields ([#6316](https://github.com/career-ops-hq/career-ops/issues/6316)) ([f1e562b](https://github.com/career-ops-hq/career-ops/commit/f1e562bb033ba7b9d648afd087b67bb0c30f856a))
* **privacy:** add candidate contact redaction filter for LLM evaluator prompts ([#2427](https://github.com/career-ops-hq/career-ops/issues/2427)) ([fc774c7](https://github.com/career-ops-hq/career-ops/commit/fc774c7e6bd907107f51bb8a7fdbe2379a725df0))
* **privacy:** block protected PII in outbound LLM requests ([#5571](https://github.com/career-ops-hq/career-ops/issues/5571)) ([f637363](https://github.com/career-ops-hq/career-ops/commit/f6373636d05a3e4c59d35c5d85ea865a50432ca6))
* **providers:** add a generic WP Job Manager job_feed provider ([#5878](https://github.com/career-ops-hq/career-ops/issues/5878)) ([bdc837d](https://github.com/career-ops-hq/career-ops/commit/bdc837d26f51d792baa51d56dbfee5c9ee35fb11))
* **providers:** add apple (reads the server-rendered results page) ([#5496](https://github.com/career-ops-hq/career-ops/issues/5496)) ([e32a695](https://github.com/career-ops-hq/career-ops/commit/e32a695fbc02fc2d2bf58d8c4db31a2fe54e2b41))
* **providers:** add Bulldogjob (bulldogjob.pl) job board ([#6253](https://github.com/career-ops-hq/career-ops/issues/6253)) ([6f2d4cf](https://github.com/career-ops-hq/career-ops/commit/6f2d4cfab3d346c095f49afe42db162291e09a4c))
* **providers:** add ClearCompany careers API provider ([#5918](https://github.com/career-ops-hq/career-ops/issues/5918)) ([fea7d9b](https://github.com/career-ops-hq/career-ops/commit/fea7d9b62d3bc1368811e6d0d53f57ad7c8e25d8))
* **providers:** add Darwinbox careers provider ([#6416](https://github.com/career-ops-hq/career-ops/issues/6416)) ([5a2df0e](https://github.com/career-ops-hq/career-ops/commit/5a2df0e0a7d977a372d92c896687b2ba3856dce0))
* **providers:** add deel provider for jobs.deel.com tenant boards ([#6189](https://github.com/career-ops-hq/career-ops/issues/6189)) ([5e67cd5](https://github.com/career-ops-hq/career-ops/commit/5e67cd5163cda2aefe783180667a0141fc851d65))
* **providers:** add GermanTechJobs board-wide RSS provider ([#6346](https://github.com/career-ops-hq/career-ops/issues/6346)) ([938ee3d](https://github.com/career-ops-hq/career-ops/commit/938ee3d79b98c4996269962f7e72282a2fc4047b))
* **providers:** add Homerun per-tenant Atom feed provider ([#5785](https://github.com/career-ops-hq/career-ops/issues/5785)) ([53c905e](https://github.com/career-ops-hq/career-ops/commit/53c905e0ee1e2fd2f721e1328b183cd97e7cf3b9))
* **providers:** add jobs.cz and prace.cz keyword-search providers ([#5631](https://github.com/career-ops-hq/career-ops/issues/5631)) ([9b4be8c](https://github.com/career-ops-hq/career-ops/commit/9b4be8cda4723612b4b47103084debd8d2c65ec3))
* **providers:** add Keka careers provider ([#6199](https://github.com/career-ops-hq/career-ops/issues/6199)) ([a149e44](https://github.com/career-ops-hq/career-ops/commit/a149e44e91cdae0c197e4e9c82e44216d272db09))
* **providers:** add Notion careers-page provider ([#5616](https://github.com/career-ops-hq/career-ops/issues/5616)) ([192766e](https://github.com/career-ops-hq/career-ops/commit/192766e76382e49020cf256a0c7d2e83fc5c4809))
* **providers:** add Paylocity provider and scan:full source ([#5687](https://github.com/career-ops-hq/career-ops/issues/5687)) ([4b53e0e](https://github.com/career-ops-hq/career-ops/commit/4b53e0e547837a03160b51e7f422407b6c27cb68))
* **providers:** ApplicantPro / isolved Talent Acquisition ([#6252](https://github.com/career-ops-hq/career-ops/issues/6252)) ([2a25b46](https://github.com/career-ops-hq/career-ops/commit/2a25b46b59b68b46d0ac233c6a6b70b8e2e639a3))
* **providers:** join and getro cache board ids through a shared cachedLookup helper ([#5826](https://github.com/career-ops-hq/career-ops/issues/5826)) ([3d70a5c](https://github.com/career-ops-hq/career-ops/commit/3d70a5c2ad6b891365133750338388952720c960))
* **providers:** let an eightfold entry opt in one branded API host ([#6000](https://github.com/career-ops-hq/career-ops/issues/6000)) ([9ed1627](https://github.com/career-ops-hq/career-ops/commit/9ed16271401c4ae41c642e9ee228f5aa2735f3a5))
* **providers:** read careers sites hosted on Factorial's ATS ([#6394](https://github.com/career-ops-hq/career-ops/issues/6394)) ([15622c8](https://github.com/career-ops-hq/career-ops/commit/15622c878098a40568113d3500913db9b66a4441))
* **providers:** read careers sites hosted on Factorial's ATS ([#6394](https://github.com/career-ops-hq/career-ops/issues/6394)) ([3089d5e](https://github.com/career-ops-hq/career-ops/commit/3089d5e92126235bf1bbfcb09e3a22d82d1d498a))
* **providers:** read Zucchetti InRecruiting career pages ([#5984](https://github.com/career-ops-hq/career-ops/issues/5984)) ([f75baa8](https://github.com/career-ops-hq/career-ops/commit/f75baa8b55279fc0a1dc516af07266eccad6571c))
* **reports:** write the Machine Summary as the last report section ([#6157](https://github.com/career-ops-hq/career-ops/issues/6157)) ([89cccea](https://github.com/career-ops-hq/career-ops/commit/89cccea4744fb27dc712cdff0bc0782b1c244a6b))
* **salary-gap:** add third-party advertised source for unverified estimates ([#5742](https://github.com/career-ops-hq/career-ops/issues/5742)) ([6341b1f](https://github.com/career-ops-hq/career-ops/commit/6341b1f944099b2524f04e98786c7edfc05cb8ae))
* **scan-ats-full:** sweep join.com from its company sitemap, with a provider id cache for the join company id ([#5767](https://github.com/career-ops-hq/career-ops/issues/5767)) ([63030d5](https://github.com/career-ops-hq/career-ops/commit/63030d54d1c66830ce45d7efbdfe145825f6b511))
* **scan:** let a portals.yml entry set its own skip_tiers ([#5806](https://github.com/career-ops-hq/career-ops/issues/5806)) ([2d6ed58](https://github.com/career-ops-hq/career-ops/commit/2d6ed587e60cbb1aaaac7e3dd4a9f5b7b46a26af)), closes [#5778](https://github.com/career-ops-hq/career-ops/issues/5778)
* **scan:** optional years-of-experience filter read from the JD (closes [#6153](https://github.com/career-ops-hq/career-ops/issues/6153)) ([#6154](https://github.com/career-ops-hq/career-ops/issues/6154)) ([0c4b1e7](https://github.com/career-ops-hq/career-ops/commit/0c4b1e719bb760e2c210aa276b961a55e40f296e))
* **templates:** look up named templates in the data root's data/templates ([#5952](https://github.com/career-ops-hq/career-ops/issues/5952)) ([7cb0a02](https://github.com/career-ops-hq/career-ops/commit/7cb0a02641acaa5c4b96d68d15c88e72c6957577))
* **verify-pipeline:** print a one-line fix hint under every error and warning ([#5798](https://github.com/career-ops-hq/career-ops/issues/5798)) ([c7983bc](https://github.com/career-ops-hq/career-ops/commit/c7983bc6faf39719f21b556ab06db37cde955f00))
* **web:** undo a Skip or Applied from the Today decision cards ([#5769](https://github.com/career-ops-hq/career-ops/issues/5769)) ([47f236f](https://github.com/career-ops-hq/career-ops/commit/47f236f2fdfcdc2582ae3d7cccdf2ecd18471ddd))
* **zoho-recruit:** accept Zoho regional domains (.ca, .eu, .in, .com.au, .jp, .sa, .com.cn) ([#6003](https://github.com/career-ops-hq/career-ops/issues/6003)) ([7d68449](https://github.com/career-ops-hq/career-ops/commit/7d684491c9da3af3d846b44bd16b798bb97f53a9))


### Bug Fixes

* **add-entry:** serialize confirmed additions before reading user files ([#5915](https://github.com/career-ops-hq/career-ops/issues/5915)) ([9209b95](https://github.com/career-ops-hq/career-ops/commit/9209b954b3ae7467a3127b843dba3f550d3969b3))
* added md files for portuguese(brazil) ([#6418](https://github.com/career-ops-hq/career-ops/issues/6418)) ([eb0fffe](https://github.com/career-ops-hq/career-ops/commit/eb0fffefe7c45732bf53df878189e20cab1bebbc))
* **agent-inbox,apify:** stamp the local clock, not UTC ([#6212](https://github.com/career-ops-hq/career-ops/issues/6212)) ([8fecd51](https://github.com/career-ops-hq/career-ops/commit/8fecd510477cd4440e80c53813166daaab0aa26b))
* **arbeitsagentur:** make angebotsart configurable so Werkstudent/Praktikum searches return results ([#5788](https://github.com/career-ops-hq/career-ops/issues/5788)) ([652045a](https://github.com/career-ops-hq/career-ops/commit/652045ae5ade05e553ddd0059927ba26db832df8))
* **avature:** accept query-style /JobDetail?jobId=<id> links ([#6477](https://github.com/career-ops-hq/career-ops/issues/6477)) ([d5873cc](https://github.com/career-ops-hq/career-ops/commit/d5873cc74d1b2c8c6d0b3df3b656873b995e4607))
* **batch-tailor:** run an npm-installed claude on Windows ([#5919](https://github.com/career-ops-hq/career-ops/issues/5919)) ([5acc4e7](https://github.com/career-ops-hq/career-ops/commit/5acc4e7d99481a128dde228b6c0cc88f54298ac0))
* **batch:** call log_discard on every skipped state, so the discard log is written ([#6450](https://github.com/career-ops-hq/career-ops/issues/6450)) ([1068e73](https://github.com/career-ops-hq/career-ops/commit/1068e73f48facfcb1b32606a8da34757559135dd))
* **build-cv-html:** escape braces so candidate text never fills as a placeholder ([#5907](https://github.com/career-ops-hq/career-ops/issues/5907)) ([83db42a](https://github.com/career-ops-hq/career-ops/commit/83db42a47b3b99dc8c2b7ad77e70faebba47a962))
* **build-cv-html:** read a relative profile photo from the data root ([#5909](https://github.com/career-ops-hq/career-ops/issues/5909)) ([dcc2437](https://github.com/career-ops-hq/career-ops/commit/dcc2437602834b8c0059c79ab85380d8a66809c5))
* **build-cv-html:** warn when the chosen template has no slot for a populated section ([#5908](https://github.com/career-ops-hq/career-ops/issues/5908)) ([ed2bf72](https://github.com/career-ops-hq/career-ops/commit/ed2bf727f6b519e0659122deab97b5ac7829c3b5))
* **check-jd-archive:** reject every localized template placeholder, not only the English one ([#5926](https://github.com/career-ops-hq/career-ops/issues/5926)) ([33fc7d0](https://github.com/career-ops-hq/career-ops/commit/33fc7d06d035339489ce09f6b95031b0008abe76))
* **check-liveness:** --status selects the rows it names, or stops the run ([#5893](https://github.com/career-ops-hq/career-ops/issues/5893)) ([3be8310](https://github.com/career-ops-hq/career-ops/commit/3be831095a6e2e65345bbaf7de484781c5fced12))
* **clean-markers:** keep the joiners emoji, Persian and Indic text need, behind --keep-script-joiners ([#5268](https://github.com/career-ops-hq/career-ops/issues/5268)) ([#6267](https://github.com/career-ops-hq/career-ops/issues/6267)) ([87bd659](https://github.com/career-ops-hq/career-ops/commit/87bd659c266c81ee5f3ac6c5132ba6d6c2ded726))
* **cli:** handle --flag=value form in discover-new-companies, company-funded, prepare-application ([#5851](https://github.com/career-ops-hq/career-ops/issues/5851)) ([f5f867b](https://github.com/career-ops-hq/career-ops/commit/f5f867b8a6e6c2a8f08d67009c14585abb37d6cc))
* **cli:** handle --help and -h in fetch-jd and seed-fixture ([#5822](https://github.com/career-ops-hq/career-ops/issues/5822)) ([9329b08](https://github.com/career-ops-hq/career-ops/commit/9329b0842111d1987c11fcee4d452782bd01e122))
* **cli:** read --flag=value and reject unknown flags in tracker-sync-check and discard-analytics ([#6210](https://github.com/career-ops-hq/career-ops/issues/6210)) ([58d6190](https://github.com/career-ops-hq/career-ops/commit/58d6190f04a2faad3f48ef483806c99b70cbbc82))
* **close-stale:** a skip gate that cannot be read is not a gate that passed ([#5829](https://github.com/career-ops-hq/career-ops/issues/5829)) ([e71d9b4](https://github.com/career-ops-hq/career-ops/commit/e71d9b45c89429dc4d3a6f6ab750e5b096a51a8f))
* **close-stale:** skip rows when the interview company differs by a legal suffix ([#6007](https://github.com/career-ops-hq/career-ops/issues/6007)) ([ab65154](https://github.com/career-ops-hq/career-ops/commit/ab65154ffcb49599396fe42a6f87570ce74a59b1))
* **contact-extract:** date a saved contact with the local day, not UTC ([#5864](https://github.com/career-ops-hq/career-ops/issues/5864)) ([b4ef324](https://github.com/career-ops-hq/career-ops/commit/b4ef3241e5d5a0598018767d7214bb7bb2ca8a59))
* **contacts:** keep Unicode composition variants on one UID ([#6155](https://github.com/career-ops-hq/career-ops/issues/6155)) ([38dedab](https://github.com/career-ops-hq/career-ops/commit/38dedabd1a3fae879da721883d7d9c13c5ba07e7))
* **contacts:** update the authoritative duplicate row ([#5434](https://github.com/career-ops-hq/career-ops/issues/5434)) ([81270ef](https://github.com/career-ops-hq/career-ops/commit/81270ef939dce7b2486a6653261e84925a97b42c))
* **cover:** report every unresolved {{…}} token, not only UPPER_SNAKE… ([#6382](https://github.com/career-ops-hq/career-ops/issues/6382)) ([6be10b2](https://github.com/career-ops-hq/career-ops/commit/6be10b223e0c0687e89292daefc222d1ddfead6f))
* **cover:** run a letter through the text pass a CV gets ([#6361](https://github.com/career-ops-hq/career-ops/issues/6361)) ([1efc58e](https://github.com/career-ops-hq/career-ops/commit/1efc58e5f9acbfa469b09f85482c60dfec623cf1))
* **cover:** surface template resolution errors instead of rendering t… ([#6383](https://github.com/career-ops-hq/career-ops/issues/6383)) ([bacd824](https://github.com/career-ops-hq/career-ops/commit/bacd824103c2f793aed8fc27b8d4d83c7972ca93))
* **cover:** validate required string fields are non-empty strings ([#6372](https://github.com/career-ops-hq/career-ops/issues/6372)) ([#6385](https://github.com/career-ops-hq/career-ops/issues/6385)) ([74edf93](https://github.com/career-ops-hq/career-ops/commit/74edf934b776ebc03cdb527fa707071f4224558e))
* **cv-facts:** match titles against the ATS-normalized glyphs ([#6358](https://github.com/career-ops-hq/career-ops/issues/6358)) ([e02e8b3](https://github.com/career-ops-hq/career-ops/commit/e02e8b37e00196f3c05606adad0a93a3d40f973d))
* **cv-order:** read a month range in one year from its first month ([#6344](https://github.com/career-ops-hq/career-ops/issues/6344)) ([8ac9c33](https://github.com/career-ops-hq/career-ops/commit/8ac9c33aa05c64cba96750ab58b8457957006011))
* **cv-structure:** a payload that matches nothing in cv.md is unverified, not passed ([#5888](https://github.com/career-ops-hq/career-ops/issues/5888)) ([c4ef01d](https://github.com/career-ops-hq/career-ops/commit/c4ef01dc86fa97933e3ad66ac1719fe24774b013))
* **cv-sync-check:** match profile field values, not strings in comments ([#5746](https://github.com/career-ops-hq/career-ops/issues/5746)) ([bdddd8a](https://github.com/career-ops-hq/career-ops/commit/bdddd8a80a7e08688cbc6f01ee439dbef392c833))
* **cv-visual:** retry the snapshot apt fetch and fail on the real error ([#6018](https://github.com/career-ops-hq/career-ops/issues/6018)) ([282b2a0](https://github.com/career-ops-hq/career-ops/commit/282b2a0d5455168fbd0d51df404f0d1ea57d83a3))
* **cv:** keep Han characters in the PDF text layer ([#6184](https://github.com/career-ops-hq/career-ops/issues/6184)) ([86979c5](https://github.com/career-ops-hq/career-ops/commit/86979c50da59696cfef795933b9d35295796f0ba))
* **cv:** preserve source payloads on aliased render output ([#5527](https://github.com/career-ops-hq/career-ops/issues/5527)) ([5dfd45c](https://github.com/career-ops-hq/career-ops/commit/5dfd45cc3ac6857198c5178bfe30eef9fb45401c))
* **dashboard:** a "—" or "N/A" URL cell is not a posting URL ([#5872](https://github.com/career-ops-hq/career-ops/issues/5872)) ([3d61dd0](https://github.com/career-ops-hq/career-ops/commit/3d61dd0be3b4180e32d0230453c7a8fe6d4b99ad))
* **dashboard:** colour each fit-quality slice by its tier, not its position ([#5874](https://github.com/career-ops-hq/career-ops/issues/5874)) ([5d39900](https://github.com/career-ops-hq/career-ops/commit/5d39900070dad95f3c0ea376acc9318926e0f640))
* **dashboard:** cut a long TL;DR by characters, not bytes ([#6367](https://github.com/career-ops-hq/career-ops/issues/6367)) ([fbea51a](https://github.com/career-ops-hq/career-ops/commit/fbea51a057c89ad746d6da2eb994233e0764fc5f))
* **dashboard:** fit the pipeline to the terminal width ([#6050](https://github.com/career-ops-hq/career-ops/issues/6050)) ([7d3f0cd](https://github.com/career-ops-hq/career-ops/commit/7d3f0cd9102b0bb972517b5ef1cf1c96cf18e72f))
* **dashboard:** give unknown statuses their own pipeline tab ([#6142](https://github.com/career-ops-hq/career-ops/issues/6142)) ([01def0e](https://github.com/career-ops-hq/career-ops/commit/01def0ee05d9470cc9adae7dda439031b7f52999))
* **dashboard:** no average score in the headers when nothing is scored ([#5885](https://github.com/career-ops-hq/career-ops/issues/5885)) ([b31289c](https://github.com/career-ops-hq/career-ops/commit/b31289c2f068d99bb7fe89f2e80afc349fc0e4ea))
* **dashboard:** size the tracker row guard from the header, not a fixed 8 ([#5873](https://github.com/career-ops-hq/career-ops/issues/5873)) ([559b58e](https://github.com/career-ops-hq/career-ops/commit/559b58e9e6302e87fae984b92a23df297e28809e))
* **dashboard:** sort Hired first in the grouped view, as its group order says ([#6304](https://github.com/career-ops-hq/career-ops/issues/6304)) ([19af0ef](https://github.com/career-ops-hq/career-ops/commit/19af0ef8ea4493690943c9950cace503c399741d))
* **dashboard:** state the Go minimum go.mod actually requires ([#6279](https://github.com/career-ops-hq/career-ops/issues/6279)) ([f7c7ea7](https://github.com/career-ops-hq/career-ops/commit/f7c7ea73a847db408b0487b01ca257684396c11a))
* **dashboard:** strip terminal controls from tracker and report text ([#6049](https://github.com/career-ops-hq/career-ops/issues/6049)) ([951b37c](https://github.com/career-ops-hq/career-ops/commit/951b37c671e59e73867b7c0c7098a549101c7baf))
* **dashboard:** the POSTED column counts local calendar days on the dashboard's clock ([#5884](https://github.com/career-ops-hq/career-ops/issues/5884)) ([7373924](https://github.com/career-ops-hq/career-ops/commit/73739243ca8cd7d35efbc2f92ea919b5c5eaaa9c))
* **dashboard:** truncate preview TLDR to terminal width ([#6470](https://github.com/career-ops-hq/career-ops/issues/6470)) ([8e318c4](https://github.com/career-ops-hq/career-ops/commit/8e318c424236e9af76d9e9de5441d30501f48844))
* **dedup:** carry a posting URL the kept row lacks over from the removed row ([#5881](https://github.com/career-ops-hq/career-ops/issues/5881)) ([75cfdea](https://github.com/career-ops-hq/career-ops/commit/75cfdea2f392681eb80980791f70aa8088641f4c))
* **dedup:** promote a status without its bold or date, so the ledger reads it ([#5859](https://github.com/career-ops-hq/career-ops/issues/5859)) ([a46e314](https://github.com/career-ops-hq/career-ops/commit/a46e314c706615fcc8b78ef583e12a6ccb6b694e))
* **dedup:** read a row's posting URL from its report when it has no URL cell ([#5855](https://github.com/career-ops-hq/career-ops/issues/5855)) ([46a6ad2](https://github.com/career-ops-hq/career-ops/commit/46a6ad2e38ab12da07ff29c19f9213da5a5745b3))
* **detect-reposts:** count a repost only when the same source re-lists the role ([#6165](https://github.com/career-ops-hq/career-ops/issues/6165)) ([02718c0](https://github.com/career-ops-hq/career-ops/commit/02718c0505d3e89a4a6ed2dfe79599aa4248d903))
* **digest:** say an empty roll-up is interview notes, not a scan ([#6110](https://github.com/career-ops-hq/career-ops/issues/6110)) ([92d5fe7](https://github.com/career-ops-hq/career-ops/commit/92d5fe7113f9f86a6b423d390f45dfd4cca4b046))
* **discover-ats:** retain concurrent portal additions ([#5463](https://github.com/career-ops-hq/career-ops/issues/5463)) ([3346f40](https://github.com/career-ops-hq/career-ops/commit/3346f40abea2a053d33a406f66b2d18993503945))
* distinguish duplicate openings by requisition ID ([#6242](https://github.com/career-ops-hq/career-ops/issues/6242)) ([a309ccf](https://github.com/career-ops-hq/career-ops/commit/a309ccfda3afae871d39a124493dc66ea719c2ef))
* do not treat 1C ERP brand as a fabricated workflow count ([#4840](https://github.com/career-ops-hq/career-ops/issues/4840)) ([fef0e2a](https://github.com/career-ops-hq/career-ops/commit/fef0e2a4ccec053373cd9ca4e98f17e2ee374547))
* **docs:** point README customization at modes/_profile.md ([#6039](https://github.com/career-ops-hq/career-ops/issues/6039)) ([c7a2e3c](https://github.com/career-ops-hq/career-ops/commit/c7a2e3c9c2d6284892f240b6cf8d59138a3706bf))
* **docs:** show the arguments coverage-check requires ([#6047](https://github.com/career-ops-hq/career-ops/issues/6047)) ([d8610f5](https://github.com/career-ops-hq/career-ops/commit/d8610f571e9b4b6dddf978be776e3c6dec309c8c))
* **doctor:** do not assume claude when other CLIs are on PATH ([#6044](https://github.com/career-ops-hq/career-ops/issues/6044)) ([d6861bb](https://github.com/career-ops-hq/career-ops/commit/d6861bb5918cf65e31fbe5fa54890997426dc2c2))
* **doctor:** read plugins from the checkout, not the data root ([#6098](https://github.com/career-ops-hq/career-ops/issues/6098)) ([5584f44](https://github.com/career-ops-hq/career-ops/commit/5584f444cf6f02c8fc07a3e51d44f1d5b6be3bf3))
* **doctor:** stop naming the legacy Gemini CLI as ready to open ([#6051](https://github.com/career-ops-hq/career-ops/issues/6051)) ([8d0cfaa](https://github.com/career-ops-hq/career-ops/commit/8d0cfaab4b438a014d82e7985b74df330ec923c8))
* **eval:** pass modes/_custom.md to the standalone evaluators ([#5754](https://github.com/career-ops-hq/career-ops/issues/5754)) ([dbdc70c](https://github.com/career-ops-hq/career-ops/commit/dbdc70c6c7d712d311e79b0aa8ce4cf83a6f0cd0))
* **eval:** read bolded summary keys and skip the tracker row without one ([#6332](https://github.com/career-ops-hq/career-ops/issues/6332)) ([6f83274](https://github.com/career-ops-hq/career-ops/commit/6f83274452d7bfc8855a2a410ff148b426a13961))
* **fact-gate:** read French counts in generated CVs and cover letters ([#5725](https://github.com/career-ops-hq/career-ops/issues/5725)) ([e5d0596](https://github.com/career-ops-hq/career-ops/commit/e5d0596a83821e873a80bfc458d76e79673ef234))
* **facts:** bound address scans on long non-address tokens ([#5435](https://github.com/career-ops-hq/career-ops/issues/5435)) ([f5679b6](https://github.com/career-ops-hq/career-ops/commit/f5679b600a1ab457462ed396b3051a6ff5c00fa4))
* **followup-cadence:** resolve repo-root report links ([#6124](https://github.com/career-ops-hq/career-ops/issues/6124)) ([d071bf6](https://github.com/career-ops-hq/career-ops/commit/d071bf6edc2463db27742bebdf7c106307130025))
* **followups:** grant the headless sweep the tools it needs to write drafts ([#5660](https://github.com/career-ops-hq/career-ops/issues/5660)) ([68964db](https://github.com/career-ops-hq/career-ops/commit/68964db30f573bfeb51b369874153de8497ef760))
* **followups:** list the most overdue follow-up first within each urgency ([#6073](https://github.com/career-ops-hq/career-ops/issues/6073)) ([c75b240](https://github.com/career-ops-hq/career-ops/commit/c75b240b06104c0cbb28822c10b832b7f87b6bff))
* **followups:** run the sweep script with bash, so the cron recipe works without zsh ([#5653](https://github.com/career-ops-hq/career-ops/issues/5653)) ([5fed15c](https://github.com/career-ops-hq/career-ops/commit/5fed15ce6c94811965ed5a29f544467eed7aed1e))
* **funnel-velocity:** measure a re-application from its own Applied date ([#5708](https://github.com/career-ops-hq/career-ops/issues/5708)) ([5a820dd](https://github.com/career-ops-hq/career-ops/commit/5a820dd3e5f62a091c49b41ba3accc54b656de5b))
* **funnel:** drop follow-up nudges from report summaries when follow-ups are off ([#5710](https://github.com/career-ops-hq/career-ops/issues/5710)) ([4786a2f](https://github.com/career-ops-hq/career-ops/commit/4786a2f4bed87a08b3c1579543c436e1288a749b))
* **funnel:** drop retracted status-log transitions from stage recovery ([#5706](https://github.com/career-ops-hq/career-ops/issues/5706)) ([2486afe](https://github.com/career-ops-hq/career-ops/commit/2486afeb1f6d65ba2f6a17414add25b4544f5a18))
* **generate-pdf:** check facts against the cv.md this render reads ([#5867](https://github.com/career-ops-hq/career-ops/issues/5867)) ([54bf9cd](https://github.com/career-ops-hq/career-ops/commit/54bf9cd287ac7f1f61473a0ee9dab0156e55a131))
* **getro:** do not stop the walk at an old featured pin ([#6406](https://github.com/career-ops-hq/career-ops/issues/6406)) ([f2f0a72](https://github.com/career-ops-hq/career-ops/commit/f2f0a7239b9698ac87d103fed6bff30025552ecf))
* **hackernews:** prefer the posting link over the first URL in a comment ([#5784](https://github.com/career-ops-hq/career-ops/issues/5784)) ([61f1afa](https://github.com/career-ops-hq/career-ops/commit/61f1afa5bb88baab604f71f8c778e0299279dcb7))
* **hired-share:** select rows with the canonical parser and exact state match ([#5573](https://github.com/career-ops-hq/career-ops/issues/5573)) ([0561e13](https://github.com/career-ops-hq/career-ops/commit/0561e138bc8ccbc982f96175903c552e6d55b9bd))
* **html-to-text:** a prose `<` after decoding is text, not a tag ([#5868](https://github.com/career-ops-hq/career-ops/issues/5868)) ([12f8641](https://github.com/career-ops-hq/career-ops/commit/12f8641bc3d0af1330bf3cc537108946f01a243d))
* **i18n:** name the sources in localized exclusivity rules ([#2395](https://github.com/career-ops-hq/career-ops/issues/2395)) ([#6259](https://github.com/career-ops-hq/career-ops/issues/6259)) ([9a6160c](https://github.com/career-ops-hq/career-ops/commit/9a6160c9cf288b885c10211119afcfcd4853d396))
* **i18n:** sync Korean pipeline mode with canonical pipeline.md ([#5964](https://github.com/career-ops-hq/career-ops/issues/5964)) ([24e8a9c](https://github.com/career-ops-hq/career-ops/commit/24e8a9c29bdf8089a6ffa1f070df920666f00a8d))
* **icims:** read location labels that start with Location ([#6130](https://github.com/career-ops-hq/career-ops/issues/6130)) ([7a2abd5](https://github.com/career-ops-hq/career-ops/commit/7a2abd55eb91dba7d532b1b50aa0caa57ff52531))
* **ics-interview:** convert a Windows zone name through the file's VTIMEZONE ([#6241](https://github.com/career-ops-hq/career-ops/issues/6241)) ([6b9a6f9](https://github.com/career-ops-hq/career-ops/commit/6b9a6f95eed9517d9a8b69aa3de0e46de8539b85))
* **ics-interview:** give no Scheduled row for a cancelled invite ([#6240](https://github.com/career-ops-hq/career-ops/issues/6240)) ([eaa96bc](https://github.com/career-ops-hq/career-ops/commit/eaa96bcb2b5ef118c64414f8d70710a9cad56ca9))
* **ics-interview:** resolve DST transitions according to RFC 5545 ([#5914](https://github.com/career-ops-hq/career-ops/issues/5914)) ([dd54193](https://github.com/career-ops-hq/career-ops/commit/dd54193187ece8fe10bb604c6943e75272c6c21b))
* **image-pdf:** reserve output unless overwrite is explicit ([#5443](https://github.com/career-ops-hq/career-ops/issues/5443)) ([ed496f2](https://github.com/career-ops-hq/career-ops/commit/ed496f27a3fec8de20d32c7596191bb55d57c3a5))
* **intake:** reject unknown flags instead of scanning ([#6041](https://github.com/career-ops-hq/career-ops/issues/6041)) ([c57ac01](https://github.com/career-ops-hq/career-ops/commit/c57ac015b754b6e9d54946568e4fedd67c4359a0))
* **interview:** name --app in debrief Step 10 ([#6318](https://github.com/career-ops-hq/career-ops/issues/6318)) ([2efba39](https://github.com/career-ops-hq/career-ops/commit/2efba39de0d31232aee87817a05f292c987b285b))
* **jd-skill-gap:** "Basic/Minimum Qualifications" headings scanned zero skills ([#6255](https://github.com/career-ops-hq/career-ops/issues/6255)) ([#6257](https://github.com/career-ops-hq/career-ops/issues/6257)) ([05ae8c2](https://github.com/career-ops-hq/career-ops/commit/05ae8c2c6c400533df2d1b60f4aa79554de84ae2))
* **jd-years:** a line holding only a bullet marker is not a heading ([#6302](https://github.com/career-ops-hq/career-ops/issues/6302)) ([a86398e](https://github.com/career-ops-hq/career-ops/commit/a86398e9060da3e681d41effe6fa82f2cbf98c66))
* **jobicy:** decode HTML entities in the feed's text fields ([#6492](https://github.com/career-ops-hq/career-ops/issues/6492)) ([25846c9](https://github.com/career-ops-hq/career-ops/commit/25846c9433a1ea3c81f1ef70a2be9afd07305bf8))
* **jobvite:** fold locations that share one posting URL ([#6127](https://github.com/career-ops-hq/career-ops/issues/6127)) ([39239c7](https://github.com/career-ops-hq/career-ops/commit/39239c7c995d496ab18d123b1ede2bd5ff07b9cb))
* **justjoin:** date offers by lastPublishedAt, not the refresh date ([#6254](https://github.com/career-ops-hq/career-ops/issues/6254)) ([60ae5e5](https://github.com/career-ops-hq/career-ops/commit/60ae5e50b1d7c329af6419cb46fa012ce05fbbab))
* keep interview dealbreakers out of fenced report examples ([#6023](https://github.com/career-ops-hq/career-ops/issues/6023)) ([4105ff7](https://github.com/career-ops-hq/career-ops/commit/4105ff743747a86965b1b712406d69b9273ab8a8))
* **keyword-match:** handle backtick-wrapped keywords ([#5711](https://github.com/career-ops-hq/career-ops/issues/5711)) ([7cf9f70](https://github.com/career-ops-hq/career-ops/commit/7cf9f7066ec3075c8fcc2e53e7ae505e3d5e7b5d))
* **keyword-match:** honor --help and name the report file to pass ([#6123](https://github.com/career-ops-hq/career-ops/issues/6123)) ([20b9fd3](https://github.com/career-ops-hq/career-ops/commit/20b9fd3a9c86d28c847e021f4dbbe93ce9a39a00))
* **latex:** honor page_format instead of hardcoding letterpaper ([#6345](https://github.com/career-ops-hq/career-ops/issues/6345)) ([3462740](https://github.com/career-ops-hq/career-ops/commit/346274009a7971723dd5809eb2a5cbe71ebc55e2))
* **latex:** preserve CV bytes when patch writes fail ([#5747](https://github.com/career-ops-hq/career-ops/issues/5747)) ([93e04d6](https://github.com/career-ops-hq/career-ops/commit/93e04d6c8a41ac922b0c0e9d8c7f0cf9366c38de))
* **lever:** keep a remote workplace on the location ([#6138](https://github.com/career-ops-hq/career-ops/issues/6138)) ([755c1b8](https://github.com/career-ops-hq/career-ops/commit/755c1b80af61de1ba29faf70aff02bca499bf87e))
* **liveness:** --discard-expired closes a row only on closure evidence ([#5852](https://github.com/career-ops-hq/career-ops/issues/5852)) ([b61da4f](https://github.com/career-ops-hq/career-ops/commit/b61da4fef32168525c7ba55a000b3b94a1bcb065))
* **liveness:** a short page with no closure evidence is uncertain, not expired ([#5999](https://github.com/career-ops-hq/career-ops/issues/5999)) ([e342807](https://github.com/career-ops-hq/career-ops/commit/e34280768c652af0960d97523d03a5977e28b464))
* **liveness:** add an UltiPro rung, so closed postings read as expired, not uncertain ([#6090](https://github.com/career-ops-hq/career-ops/issues/6090)) ([ee0b5fb](https://github.com/career-ops-hq/career-ops/commit/ee0b5fb565c54eb15dc52fe74f48358ac43fb3ff))
* **liveness:** an HTTP 401 or 451 job page is unconfirmed, not expired ([#5879](https://github.com/career-ops-hq/career-ops/issues/5879)) ([eb52607](https://github.com/career-ops-hq/career-ops/commit/eb52607afc169cab6de11631827fe14fb17bf4f4))
* **liveness:** ask VDAB's own API whether a vacancy is published, so closed vacancies don't read as open ([#5703](https://github.com/career-ops-hq/career-ops/issues/5703)) ([f4d7477](https://github.com/career-ops-hq/career-ops/commit/f4d7477c8d25f81e6e4a952b724378913ea8c86e))
* **liveness:** read Bulgarian Apply buttons, so live dev.bg, zaplata.bg, jobtiger.bg and wherewework.bg postings are not dropped ([#6192](https://github.com/career-ops-hq/career-ops/issues/6192)) ([c222283](https://github.com/career-ops-hq/career-ops/commit/c222283da49648ad800a6d208156d93ffd857161))
* **liveness:** read the posting's own Apply link in the page header, so Tech in Asia postings are not dropped ([#5691](https://github.com/career-ops-hq/career-ops/issues/5691)) ([0292d76](https://github.com/career-ops-hq/career-ops/commit/0292d763feca744c7e999db6c7bc52ccee8479f8))
* **liveness:** reject unknown flags instead of checking them as URLs ([#6086](https://github.com/career-ops-hq/career-ops/issues/6086)) ([6220f54](https://github.com/career-ops-hq/career-ops/commit/6220f5411722ec49f94cc3fafdefa7b8d9b66fb2))
* **liveness:** treat Built In's "Sorry, this job was removed" banner as expired ([#6336](https://github.com/career-ops-hq/career-ops/issues/6336)) ([c4b965e](https://github.com/career-ops-hq/career-ops/commit/c4b965e71c0a0195c6600b0dafd94837025591bd)), closes [#6327](https://github.com/career-ops-hq/career-ops/issues/6327)
* **match-star:** read --jd=&lt;file&gt; and --top=&lt;n&gt;, and refuse an unknown flag ([#6451](https://github.com/career-ops-hq/career-ops/issues/6451)) ([f328a3f](https://github.com/career-ops-hq/career-ops/commit/f328a3f0207df5c24f157c022a9d341415120875))
* **merge-tracker:** --backfill-urls fills a "—" or "N/A" URL cell from the report ([#5877](https://github.com/career-ops-hq/career-ops/issues/5877)) ([399e795](https://github.com/career-ops-hq/career-ops/commit/399e79519aa7fedfe56605489c61b7bdfbc0cd0a))
* **merge-tracker:** --migrate-via labels the header on any recognized layout ([#5895](https://github.com/career-ops-hq/career-ops/issues/5895)) ([0e63473](https://github.com/career-ops-hq/career-ops/commit/0e63473f24771c488a44c5556e974a23188a63fa))
* **merge-tracker:** a header without a closing pipe keeps its last column ([#5865](https://github.com/career-ops-hq/career-ops/issues/5865)) ([c225581](https://github.com/career-ops-hq/career-ops/commit/c225581fd5ff02019090ffe646303ba39b702db6))
* **merge-tracker:** keep a refused TSV where the re-run it asks for will look ([#5862](https://github.com/career-ops-hq/career-ops/issues/5862)) ([1bebf1f](https://github.com/career-ops-hq/career-ops/commit/1bebf1f6e68f057fe2f335615b3e0c259f7111e7))
* **modes/tr:** write English report header labels and unfreeze is-ilani.md ([#3828](https://github.com/career-ops-hq/career-ops/issues/3828)) ([#5845](https://github.com/career-ops-hq/career-ops/issues/5845)) ([7d2588a](https://github.com/career-ops-hq/career-ops/commit/7d2588a0b0d30ef18f019bd78afd25195ef88ffb))
* **modes:** ask for the Machine Summary in the ar, ja, tr, zh and zh-TW templates ([#6161](https://github.com/career-ops-hq/career-ops/issues/6161)) ([ac5e06a](https://github.com/career-ops-hq/career-ops/commit/ac5e06a44426eafebff853884f7f6d169a85cfb4))
* **modes:** bring eleven localized evaluation modes to the A-H report structure ([#5843](https://github.com/career-ops-hq/career-ops/issues/5843)) ([#5844](https://github.com/career-ops-hq/career-ops/issues/5844)) ([23dc064](https://github.com/career-ops-hq/career-ops/commit/23dc064dd069742bb4a1cb0bfc6a9b5cfc614855))
* **modes:** embed the ATS keyword coverage block in six localized evaluation modes ([#5923](https://github.com/career-ops-hq/career-ops/issues/5923)) ([#5924](https://github.com/career-ops-hq/career-ops/issues/5924)) ([2340792](https://github.com/career-ops-hq/career-ops/commit/2340792e444c7772409fba487aca93b0349f926c))
* **modes:** pass posting values to archive and keyword commands as argv, not shell text ([#5853](https://github.com/career-ops-hq/career-ops/issues/5853)) ([#5927](https://github.com/career-ops-hq/career-ops/issues/5927)) ([78af0e3](https://github.com/career-ops-hq/career-ops/commit/78af0e3ed5826ea10c3daa9fde4d93ed429aae4a))
* **modes:** save application answers only to the report of the posting on screen ([#5854](https://github.com/career-ops-hq/career-ops/issues/5854)) ([#5922](https://github.com/career-ops-hq/career-ops/issues/5922)) ([faa9671](https://github.com/career-ops-hq/career-ops/commit/faa967113e55c5d3b6f290b88983576e393623f3))
* **modes:** trigger Writing Style calibration from cover and email ([#5958](https://github.com/career-ops-hq/career-ops/issues/5958)) ([c5f227d](https://github.com/career-ops-hq/career-ops/commit/c5f227da0ea2ba24d7d74c537757c37c1190f8f1))
* **modes:** use {company-slug} throughout the Turkish evaluation mode ([#6029](https://github.com/career-ops-hq/career-ops/issues/6029)) ([#6032](https://github.com/career-ops-hq/career-ops/issues/6032)) ([b31050f](https://github.com/career-ops-hq/career-ops/commit/b31050f28193bafc540cbe3c526987a448f7c29b))
* **openai-eval:** record the evaluation's token usage from the stream ([#6331](https://github.com/career-ops-hq/career-ops/issues/6331)) ([3e19b86](https://github.com/career-ops-hq/career-ops/commit/3e19b860d8b6c5e073a48e09b4c3e8f3cc1eac9b))
* **openai-eval:** send the session and user-agent headers OpenCode Go asks for ([#5825](https://github.com/career-ops-hq/career-ops/issues/5825)) ([adaa6aa](https://github.com/career-ops-hq/career-ops/commit/adaa6aa059cb6c4e7543835489d433be19657068))
* **openrouter-runner:** raise model timeout from 15 s to 120 s ([#6017](https://github.com/career-ops-hq/career-ops/issues/6017)) ([af40fc4](https://github.com/career-ops-hq/career-ops/commit/af40fc4b02b62295db435c490e24e87ff51e8838))
* **openrouter:** don't save or mark done a posting that wasn't read ([#5814](https://github.com/career-ops-hq/career-ops/issues/5814)) ([c61cd38](https://github.com/career-ops-hq/career-ops/commit/c61cd38e4097d3979799034bcc0b4dd749d2e3bf))
* **openrouter:** improve evaluation reliability ([#6027](https://github.com/career-ops-hq/career-ops/issues/6027)) ([20c5bb0](https://github.com/career-ops-hq/career-ops/commit/20c5bb0ddb42b22cbb5f5ec47bbefad105e26163))
* **openrouter:** tell the model it has no tools ([#5809](https://github.com/career-ops-hq/career-ops/issues/5809)) ([#5817](https://github.com/career-ops-hq/career-ops/issues/5817)) ([75ea69f](https://github.com/career-ops-hq/career-ops/commit/75ea69f514e33a32029e575d17fc90b5285a49e6))
* **outcome:** key the posting archive by report number and read the URL column ([#5882](https://github.com/career-ops-hq/career-ops/issues/5882)) ([4f09d9a](https://github.com/career-ops-hq/career-ops/commit/4f09d9aaeaade91187460e60d27c89f407f511fa))
* **outcome:** never record an outcome on a row the selector does not name ([#5861](https://github.com/career-ops-hq/career-ops/issues/5861)) ([08c0770](https://github.com/career-ops-hq/career-ops/commit/08c077041670ef750657d693226730ebdb8d0379))
* **patterns:** a via channel nothing went through has no advance rate ([#5886](https://github.com/career-ops-hq/career-ops/issues/5886)) ([9d94b41](https://github.com/career-ops-hq/career-ops/commit/9d94b41c01c9c2ec542f5930874911ae181a4aa7))
* **pdf:** honor PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH and document macOS fallback ([#6209](https://github.com/career-ops-hq/career-ops/issues/6209)) ([4d9bbd2](https://github.com/career-ops-hq/career-ops/commit/4d9bbd2ff4bcddd2e83bbf76d2e7573d4a022d35))
* **pdf:** isolate shared painters by workspace context ([#6164](https://github.com/career-ops-hq/career-ops/issues/6164)) ([1c5fc5a](https://github.com/career-ops-hq/career-ops/commit/1c5fc5a3dc66d78c60eb053b286642ac29e04851))
* **pdf:** replace the shared browser after disconnection ([#6163](https://github.com/career-ops-hq/career-ops/issues/6163)) ([2622650](https://github.com/career-ops-hq/career-ops/commit/2622650e97b13626c6f7dfff894d330008cd3f0f))
* **pdf:** resolve relative paths against the workspace ([#6082](https://github.com/career-ops-hq/career-ops/issues/6082)) ([1b0567b](https://github.com/career-ops-hq/career-ops/commit/1b0567b9c9b787ab25fe11e482277f347c9c7168))
* **pipeline:** process the CAREER_OPS_PIPELINE lane's inbox, not data/pipeline.md ([#6412](https://github.com/career-ops-hq/career-ops/issues/6412)) ([6a3be78](https://github.com/career-ops-hq/career-ops/commit/6a3be787363e04e72e951bc99714a05c50ca2cba))
* **plugins:** honor CAREER_OPS_PIPELINE when de-duplicating ingested leads ([#6378](https://github.com/career-ops-hq/career-ops/issues/6378)) ([75a2f59](https://github.com/career-ops-hq/career-ops/commit/75a2f59b778b3168658e26e68d0f5c762bd041c6))
* **plugins:** prevent unbounded memory growth on large plugin responses ([#6366](https://github.com/career-ops-hq/career-ops/issues/6366)) ([84ef4dd](https://github.com/career-ops-hq/career-ops/commit/84ef4dda03001200a3ec92aaa5db9d2286cb28f7))
* **plugins:** refuse the same addresses as the provider IP guard ([#6271](https://github.com/career-ops-hq/career-ops/issues/6271)) ([14b0ce6](https://github.com/career-ops-hq/career-ops/commit/14b0ce682abfc1633302ee96230a7bfbd7f38bc2))
* **plugins:** reject unknown flags and honor help and registry names ([#6097](https://github.com/career-ops-hq/career-ops/issues/6097)) ([3877747](https://github.com/career-ops-hq/career-ops/commit/38777479d5e7cb687f5cb8d50f80ed6b92e38e59))
* **plugins:** ship the template skill as skill.md.template so catalogs do not list it ([#6171](https://github.com/career-ops-hq/career-ops/issues/6171)) ([d5ac1a4](https://github.com/career-ops-hq/career-ops/commit/d5ac1a49baa2130f86b4c972da94993e3fa18693))
* **plugins:** stop listing plugins when plugins.yml will not parse ([#6117](https://github.com/career-ops-hq/career-ops/issues/6117)) ([f85d3e5](https://github.com/career-ops-hq/career-ops/commit/f85d3e51b5b55fa36f347911c925771b5eb5e7c0))
* **plugins:** stop waiting on a DNS lookup that never answers ([#6404](https://github.com/career-ops-hq/career-ops/issues/6404)) ([c514700](https://github.com/career-ops-hq/career-ops/commit/c5147005c8eb146d210319bf0078d643fae01793))
* **portals:** repoint example boards that went empty or were disabled after a move ([#6393](https://github.com/career-ops-hq/career-ops/issues/6393)) ([8b09cbd](https://github.com/career-ops-hq/career-ops/commit/8b09cbd3a70ac3af6fb7c124773cc878c579c0e8))
* **pracecz:** enforce hard max pages cap ([#6401](https://github.com/career-ops-hq/career-ops/issues/6401)) ([d7bd1d6](https://github.com/career-ops-hq/career-ops/commit/d7bd1d618ba3f2b6f76a4648ac196f5c8a4bf638))
* **precheck-duplicate:** match separator-less req IDs and location-suffixed titles ([#5998](https://github.com/career-ops-hq/career-ops/issues/5998)) ([69b144d](https://github.com/career-ops-hq/career-ops/commit/69b144d62d0875e053852fe11d2ce702ca3600c7))
* prefer MiniMax Flash in text evaluation ([#5531](https://github.com/career-ops-hq/career-ops/issues/5531)) ([a935197](https://github.com/career-ops-hq/career-ops/commit/a935197edabad2e8f6e1e0f5fc69e2977067164d))
* **prepare-application:** accept inline URL arguments ([#5850](https://github.com/career-ops-hq/career-ops/issues/5850)) ([98f86ce](https://github.com/career-ops-hq/career-ops/commit/98f86ced75a89daeb6cb0541a389462414fd7e6d))
* **prepare:** accept canonical Greenhouse job board hosts ([#6025](https://github.com/career-ops-hq/career-ops/issues/6025)) ([920ce05](https://github.com/career-ops-hq/career-ops/commit/920ce0586fdabcdde939f2a9548ce85716788bfc))
* **prepare:** read the candidate block in profile.yml ([#6083](https://github.com/career-ops-hq/career-ops/issues/6083)) ([5faf024](https://github.com/career-ops-hq/career-ops/commit/5faf02498b2e36d1af212472d390254f849e68db))
* **profile:** reject spend tier, language, and CV format values readers ignore ([#6119](https://github.com/career-ops-hq/career-ops/issues/6119)) ([3ca13e3](https://github.com/career-ops-hq/career-ops/commit/3ca13e387916361a6b6bd10ee77c246208e18a7a))
* **providers:** allow credentialed HTTP proxies on loopback under trusted egress ([#5529](https://github.com/career-ops-hq/career-ops/issues/5529)) ([#5819](https://github.com/career-ops-hq/career-ops/issues/5819)) ([b6b9e38](https://github.com/career-ops-hq/career-ops/commit/b6b9e381b016967ee28865090f2e24b17a8aad9b))
* **providers:** arbeitsagentur home-office filter, remote marker for 100 % home office, all posting locations ([#6006](https://github.com/career-ops-hq/career-ops/issues/6006)) ([1b99405](https://github.com/career-ops-hq/career-ops/commit/1b994051fd7af68ff37d5bf51d6f1dd12ebc7c78))
* **providers:** arbeitsagentur links and liveness for reference numbers with a slash ([#6499](https://github.com/career-ops-hq/career-ops/issues/6499)) ([ec496f0](https://github.com/career-ops-hq/career-ops/commit/ec496f0330cb7ffc4fa61817e17f035fa11de269))
* **providers:** cap fetchJson/fetchText response bodies ([#5575](https://github.com/career-ops-hq/career-ops/issues/5575)) ([e0a243a](https://github.com/career-ops-hq/career-ops/commit/e0a243aa99bd9c1629950d64ad2a8582b917c1a8))
* **providers:** cap, pace and retry IBM pagination ([#6273](https://github.com/career-ops-hq/career-ops/issues/6273)) ([bfe8b2c](https://github.com/career-ops-hq/career-ops/commit/bfe8b2c14118fcd6138326b2ac74920b69b19b93))
* **providers:** emit postedAt from remoteok, remotive, workingnomads and ibm ([#6274](https://github.com/career-ops-hq/career-ops/issues/6274)) ([3230f0c](https://github.com/career-ops-hq/career-ops/commit/3230f0c9a38e80acb514d372a4eee82a8ae679d3))
* **providers:** getro warning names the failed page and the real attempt count ([#6465](https://github.com/career-ops-hq/career-ops/issues/6465)) ([7be575f](https://github.com/career-ops-hq/career-ops/commit/7be575f98c3591493ad7beca82941e8c887bd248))
* **providers:** give the dover health probe a no-retry policy ([#5990](https://github.com/career-ops-hq/career-ops/issues/5990)) ([f73af7b](https://github.com/career-ops-hq/career-ops/commit/f73af7bbb633b02e6467b2080171e961dbbf0e31))
* **providers:** give the himalayas health probe a no-retry policy ([#6008](https://github.com/career-ops-hq/career-ops/issues/6008)) ([f24662e](https://github.com/career-ops-hq/career-ops/commit/f24662e8a1773c62123843fda25215dc4c082706))
* **providers:** join reads jobs from the public GraphQL list instead of the cached careers page ([#5753](https://github.com/career-ops-hq/career-ops/issues/5753)) ([0abe42c](https://github.com/career-ops-hq/career-ops/commit/0abe42c28412236d2f8b75491cdc163b2112a9f7))
* **providers:** read Greenhouse and Ashby board slugs from the parsed careers_url ([#5880](https://github.com/career-ops-hq/career-ops/issues/5880)) ([e1c8565](https://github.com/career-ops-hq/career-ops/commit/e1c8565f89c3162ca2ce16476f82470a512c8d22))
* **providers:** say when a blocked host looks like a DNS filter or sandbox ([#5810](https://github.com/career-ops-hq/career-ops/issues/5810)) ([74467b7](https://github.com/career-ops-hq/career-ops/commit/74467b7b88a5b83fb005d6252da9b226f74b89ea))
* **radancy:** read a bare location class in the legacy markup ([#5824](https://github.com/career-ops-hq/career-ops/issues/5824)) ([d3fd0f7](https://github.com/career-ops-hq/career-ops/commit/d3fd0f7338a0f806c161de75a22eaff8c1922488))
* **rank:** preserve the pipeline when saving annotations fails ([#5716](https://github.com/career-ops-hq/career-ops/issues/5716)) ([f853f7d](https://github.com/career-ops-hq/career-ops/commit/f853f7d1931ded7205b41670e876ad514f9e606b))
* **rank:** run npm-installed agent CLIs on Windows ([#5787](https://github.com/career-ops-hq/career-ops/issues/5787)) ([1a03532](https://github.com/career-ops-hq/career-ops/commit/1a03532c65adea6f563fb9f8ebb0c3470aa29108))
* **registry:** update Tavily plugin to v0.1.1 ([#6348](https://github.com/career-ops-hq/career-ops/issues/6348)) ([ea096c4](https://github.com/career-ops-hq/career-ops/commit/ea096c47d1247c7cc2905eda3f14a7c9997fb7c8))
* **registry:** update Tavily plugin to v0.1.2 ([#6461](https://github.com/career-ops-hq/career-ops/issues/6461)) ([5e00aab](https://github.com/career-ops-hq/career-ops/commit/5e00aab4d240d13f5b5f46688f37c9706e46cc2d))
* **rejection-latency:** match the interview company across legal forms ([#5987](https://github.com/career-ops-hq/career-ops/issues/5987)) ([f25b714](https://github.com/career-ops-hq/career-ops/commit/f25b714fac907202ebc147c39d9b88407630d87e))
* **rejection-latency:** the CLI counts from the local day, not the UTC day ([#5863](https://github.com/career-ops-hq/career-ops/issues/5863)) ([c092341](https://github.com/career-ops-hq/career-ops/commit/c09234159fb97d81a4b9044f2ba256e39b3c87bc))
* **reserve-report-num:** never hand out a tracker number the ledgers still name ([#5655](https://github.com/career-ops-hq/career-ops/issues/5655)) ([9f1913a](https://github.com/career-ops-hq/career-ops/commit/9f1913add4834d9637365f46fcb7bd005efbc6f8))
* **salary-gap:** keep the sample size beside each per-currency mean ([#5910](https://github.com/career-ops-hq/career-ops/issues/5910)) ([3c088c5](https://github.com/career-ops-hq/career-ops/commit/3c088c5feaa2b62e6dd7ffd356e23c921282e993))
* **scan-ats-full:** --resume after an outage stop no longer saves its matches twice ([#5871](https://github.com/career-ops-hq/career-ops/issues/5871)) ([e443613](https://github.com/career-ops-hq/career-ops/commit/e44361303d95659a2e70bc3a8e43fc8ab880173c))
* **scan-ats-full:** a malformed --limit is a usage error, not an unbounded sweep ([#5889](https://github.com/career-ops-hq/career-ops/issues/5889)) ([4331b1d](https://github.com/career-ops-hq/career-ops/commit/4331b1d78abfe7ca32161b4bfcb0ad2025116e99))
* **scan-history:** a Dayforce content, visa or country cut no longer pins its URL ([#5869](https://github.com/career-ops-hq/career-ops/issues/5869)) ([89e3095](https://github.com/career-ops-hq/career-ops/commit/89e3095162c092014a5697fae173feda7fe8e3ca))
* **scan-history:** every reader keeps the first row of a headerless file ([#5892](https://github.com/career-ops-hq/career-ops/issues/5892)) ([3f3a8a8](https://github.com/career-ops-hq/career-ops/commit/3f3a8a8eb6115ed6558aac3c57da433372010e06))
* **scan-hn:** one hn_hiring keyword written without brackets still filters ([#5890](https://github.com/career-ops-hq/career-ops/issues/5890)) ([4b9c53c](https://github.com/career-ops-hq/career-ops/commit/4b9c53c8bb122ac9bdcf03456073719c54c2dd26))
* **scan-hn:** record an HN post's own date, not the scan date ([#5891](https://github.com/career-ops-hq/career-ops/issues/5891)) ([62e35a7](https://github.com/career-ops-hq/career-ops/commit/62e35a7c2e35a711025a0689eece8e1c3849d20d))
* **scan-interamt, scan-dayforce:** record each skipped posting once per status, not once per run ([#5904](https://github.com/career-ops-hq/career-ops/issues/5904)) ([e642cc5](https://github.com/career-ops-hq/career-ops/commit/e642cc511f15b4e688b6cccaa2e091bc31c6d830))
* **scan:** a portals.yml entry can raise the response size cap with max_response_mb ([#6009](https://github.com/career-ops-hq/career-ops/issues/6009)) ([674c804](https://github.com/career-ops-hq/career-ops/commit/674c804d03e05c5809b2aa7ce83624d4a7335ce3))
* **scan:** deduplicate an unnamed employer's posting by URL, not ::title ([#5866](https://github.com/career-ops-hq/career-ops/issues/5866)) ([bc04629](https://github.com/career-ops-hq/career-ops/commit/bc04629d9d58abff32564951273d5a953859aecc))
* **scan:** exit 2 when every target failed ([#5720](https://github.com/career-ops-hq/career-ops/issues/5720)) ([965681c](https://github.com/career-ops-hq/career-ops/commit/965681cc098d10e6a69668e228b98dc959fd23a8))
* **scan:** reject a misspelled portals.yml key ([#6107](https://github.com/career-ops-hq/career-ops/issues/6107)) ([32863fd](https://github.com/career-ops-hq/career-ops/commit/32863fd6c717c38596c3e4d4dc9498a0b3740274))
* **set-status:** match a company when only the legal suffix differs ([#6043](https://github.com/career-ops-hq/career-ops/issues/6043)) ([7b8e9d2](https://github.com/career-ops-hq/career-ops/commit/7b8e9d22b2af97d0055085eab9b278e80075eef9))
* **set-status:** name the tracker path a first evaluation creates ([#6045](https://github.com/career-ops-hq/career-ops/issues/6045)) ([a6d7526](https://github.com/career-ops-hq/career-ops/commit/a6d7526c05861b1df9b70c011f8b1a84c44252ac))
* **set-status:** reject a list of tracker numbers with the one-row commands ([#6042](https://github.com/career-ops-hq/career-ops/issues/6042)) ([c551197](https://github.com/career-ops-hq/career-ops/commit/c5511972bafd3bf2e490b2ee5f80494ce36672e8))
* **skill-gap:** recognize Spanish requirement headings and CV sections ([#5664](https://github.com/career-ops-hq/career-ops/issues/5664)) ([7aaa6f7](https://github.com/career-ops-hq/career-ops/commit/7aaa6f72f426c7457ba0b2c6c30c50a7c85671b6))
* **skill:** guide a skill installed without career-ops to an install ([#6172](https://github.com/career-ops-hq/career-ops/issues/6172)) ([d8adac8](https://github.com/career-ops-hq/career-ops/commit/d8adac8b1a98d5c4a4ae460bd7db183c614d0900))
* **skill:** list every routed mode in the discovery menu, and call oferta A-H ([#6215](https://github.com/career-ops-hq/career-ops/issues/6215)) ([a0748a0](https://github.com/career-ops-hq/career-ops/commit/a0748a02b9f19e3ff3860d898024be1958877c2f))
* **smartrecruiters:** read releasedDate into postedAt so the age filters apply ([#6303](https://github.com/career-ops-hq/career-ops/issues/6303)) ([77d1114](https://github.com/career-ops-hq/career-ops/commit/77d1114df62701cbd7dec15be1c3e21f87cede7f))
* **stats:** count only enabled portal entries in the configured denominator ([#5715](https://github.com/career-ops-hq/career-ops/issues/5715)) ([f640ded](https://github.com/career-ops-hq/career-ops/commit/f640deda43b3331dd46b83240af3bdd405605367))
* **stats:** drop the cold breakdown from --summary while follow-ups are off ([#5899](https://github.com/career-ops-hq/career-ops/issues/5899)) ([eb76a1c](https://github.com/career-ops-hq/career-ops/commit/eb76a1c1db7791547652ee4f43bfda21b278c3a0))
* **stats:** print the denominator the portal coverage percentage divides by ([#5898](https://github.com/career-ops-hq/career-ops/issues/5898)) ([a5885eb](https://github.com/career-ops-hq/career-ops/commit/a5885eb63c9011e1e49b3a6be1a75aaa20c71fee))
* **status-hooks:** an Applied follow-up pin honours CAREER_OPS_FOLLOWUPS ([#5883](https://github.com/career-ops-hq/career-ops/issues/5883)) ([e1988a3](https://github.com/career-ops-hq/career-ops/commit/e1988a3b38a68a026f2316a1edc8325aebe7ad2a))
* **status:** report the detached archive runner's pid; test the bound through it ([#5931](https://github.com/career-ops-hq/career-ops/issues/5931)) ([#5932](https://github.com/career-ops-hq/career-ops/issues/5932)) ([e7d139a](https://github.com/career-ops-hq/career-ops/commit/e7d139a1e99af5becf3b8228d7cc6e5692a02e8b))
* **status:** start the detached JD archive without a console window on Windows ([#6004](https://github.com/career-ops-hq/career-ops/issues/6004)) ([fe7fb6a](https://github.com/career-ops-hq/career-ops/commit/fe7fb6a984f8d7d935f5c4bdf9335d4c31efdb42))
* **status:** strip a date from a status cell however it is written ([#5860](https://github.com/career-ops-hq/career-ops/issues/5860)) ([688f3a6](https://github.com/career-ops-hq/career-ops/commit/688f3a681017c659b4b6d515f8ec16c7ffae7ba8))
* strip ANSI codes from Playwright error messages ([#6185](https://github.com/career-ops-hq/career-ops/issues/6185)) ([c839c85](https://github.com/career-ops-hq/career-ops/commit/c839c8512a869030442eb4cabaecef109fea7cc1))
* **successfactors:** drop a trailing comma on a location ([#6139](https://github.com/career-ops-hq/career-ops/issues/6139)) ([c3f06cb](https://github.com/career-ops-hq/career-ops/commit/c3f06cb88d3ba0ea0124cfe04de800d19d5ea565))
* **sync-batch-input:** refuse unknown flags and read --flag=value ([#6343](https://github.com/career-ops-hq/career-ops/issues/6343)) ([c423da8](https://github.com/career-ops-hq/career-ops/commit/c423da8021a586a590b8ba54aaa5b131bc98af38))
* **templates:** honor profile font_family in the Arabic CV block ([#6431](https://github.com/career-ops-hq/career-ops/issues/6431)) ([7d8feb6](https://github.com/career-ops-hq/career-ops/commit/7d8feb6d5fcf9f225eb2dd8839ae4b131b703bf3))
* **templates:** T1 encoding so the LaTeX CV text layer keeps _ and ~ ([#6443](https://github.com/career-ops-hq/career-ops/issues/6443)) ([e59bc59](https://github.com/career-ops-hq/career-ops/commit/e59bc59f17c0f7e3a57598ad7d58c34493bf86e4))
* **test-all:** report a node:test suite killed for time as killed, not exit ? ([#5812](https://github.com/career-ops-hq/career-ops/issues/5812)) ([0f322bd](https://github.com/career-ops-hq/career-ops/commit/0f322bd39ef051a24f1c4480788d68afb20893b4))
* **tests:** name the data root in apply-scope instead of clearing it ([#6290](https://github.com/career-ops-hq/career-ops/issues/6290)) ([2cc4a59](https://github.com/career-ops-hq/career-ops/commit/2cc4a59e2b1f363b9c2f777b55ec429dfffc12ab))
* **tests:** require the intended rejection, not just any failed run ([#5577](https://github.com/career-ops-hq/career-ops/issues/5577)) ([d9502be](https://github.com/career-ops-hq/career-ops/commit/d9502bebdde0811f1d6f20a37e5649b0de6e23cc))
* **tests:** resolve a PATH-found bash to its absolute file before caching ([#5896](https://github.com/career-ops-hq/career-ops/issues/5896)) ([a7677d8](https://github.com/career-ops-hq/career-ops/commit/a7677d85473763a4f410d7fc52712b1f9b038def))
* **tracker-parse:** read a req id behind an id-parameter name ([#5782](https://github.com/career-ops-hq/career-ops/issues/5782)) ([7e3fcb7](https://github.com/career-ops-hq/career-ops/commit/7e3fcb72fd304235910c0aaaac44644e07f46c87))
* **tracker-sync-check:** prefer the one exact role match at the same employer ([#5988](https://github.com/career-ops-hq/career-ops/issues/5988)) ([599536b](https://github.com/career-ops-hq/career-ops/commit/599536bcbfa09c285411b835b338c0176dd64417))
* **tracker:** accept a bare tracker number in history ([#6040](https://github.com/career-ops-hq/career-ops/issues/6040)) ([61906d2](https://github.com/career-ops-hq/career-ops/commit/61906d26239676b21e57ef12fda25ca625e5eb22))
* **tracker:** build a new index's schema in one transaction ([#6456](https://github.com/career-ops-hq/career-ops/issues/6456)) ([d430f83](https://github.com/career-ops-hq/career-ops/commit/d430f8347155389c37c259d58614ec8f8cc5941b)), closes [#5514](https://github.com/career-ops-hq/career-ops/issues/5514)
* **tracker:** keep a balanced closing paren on a report URL token ([#5581](https://github.com/career-ops-hq/career-ops/issues/5581)) ([9ee1bff](https://github.com/career-ops-hq/career-ops/commit/9ee1bff815e5f3b15e150c1a168f7a2f01320474))
* **tracker:** keep historical numbers out of new merges ([#5980](https://github.com/career-ops-hq/career-ops/issues/5980)) ([ea9c129](https://github.com/career-ops-hq/career-ops/commit/ea9c1299b05b7d8b333f66677b9637d932345e13))
* **tracker:** list every subcommand's flags in top-level --help ([#6035](https://github.com/career-ops-hq/career-ops/issues/6035)) ([866e2a3](https://github.com/career-ops-hq/career-ops/commit/866e2a326d2a097ba65119cf894dca50435203ad))
* **tracker:** match a company query when only the legal suffix differs ([#6087](https://github.com/career-ops-hq/career-ops/issues/6087)) ([924090a](https://github.com/career-ops-hq/career-ops/commit/924090a4d28ba9e942920c015334e55c9465c22e))
* **triage:** skip a posting that says it was removed ([#6414](https://github.com/career-ops-hq/career-ops/issues/6414)) ([13f03cc](https://github.com/career-ops-hq/career-ops/commit/13f03ccfb3bfcb09341b108c5b88e887b95b3ff4))
* **validate-profile:** read --profile=path, reject unknown flags and a missing explicit profile ([#6211](https://github.com/career-ops-hq/career-ops/issues/6211)) ([825192c](https://github.com/career-ops-hq/career-ops/commit/825192c8b30a4df6b2f3e36097e0b90cde23513f))
* **verify-cv-facts:** do not require a source for a number about the addressed employer ([#5936](https://github.com/career-ops-hq/career-ops/issues/5936)) ([9fce9d6](https://github.com/career-ops-hq/career-ops/commit/9fce9d6c0760cd63ef7170bd76eb3db38691b6c0))
* **verify-cv-facts:** keep hyphenated words in claims (closes [#5632](https://github.com/career-ops-hq/career-ops/issues/5632)) ([#5792](https://github.com/career-ops-hq/career-ops/issues/5792)) ([6b11499](https://github.com/career-ops-hq/career-ops/commit/6b1149927df903e87c6af3d62e3750e236c5bae0))
* **verify-cv-facts:** read an employer named by "at &lt;Name&gt;, I ..." ([#6380](https://github.com/career-ops-hq/career-ops/issues/6380)) ([5264751](https://github.com/career-ops-hq/career-ops/commit/5264751ee13afc582bb51b82d2ce4921312045dd))
* **verify-cv-facts:** refuse a --source that does not exist ([#5887](https://github.com/career-ops-hq/career-ops/issues/5887)) ([ef89108](https://github.com/career-ops-hq/career-ops/commit/ef89108f766a77981f602e06271a4d41608565a8))
* **verify-pipeline:** don't flag anonymous rows from different agencies as duplicates ([#6070](https://github.com/career-ops-hq/career-ops/issues/6070)) ([70dc44f](https://github.com/career-ops-hq/career-ops/commit/70dc44f3008f3b0250816f7566eaa6f75635a051))
* **verify-pipeline:** honour --help and refuse unknown flags ([#6342](https://github.com/career-ops-hq/career-ops/issues/6342)) ([3e60bda](https://github.com/career-ops-hq/career-ops/commit/3e60bdaf37f15ce309b238c46e92301ced1337cf))
* **verify-portals:** probe Lever and Ashby boards with their provider's timeout ([#6507](https://github.com/career-ops-hq/career-ops/issues/6507)) ([580e1fd](https://github.com/career-ops-hq/career-ops/commit/580e1fd7061d1616ee055110a6adeaff8ed9b825))
* **web:** declare the full NODE_ENGINES range in web's engines ([#5993](https://github.com/career-ops-hq/career-ops/issues/5993)) ([5ba0cda](https://github.com/career-ops-hq/career-ops/commit/5ba0cda1757ad0d2bf22e58058c04042abdf97c3))
* **web:** state the project Node floor (22.13) in web's engines ([#5928](https://github.com/career-ops-hq/career-ops/issues/5928)) ([3f7a280](https://github.com/career-ops-hq/career-ops/commit/3f7a2802642d010797e667ac300672c174b57d91))
* **workday:** keep a fully remote workplace on the location ([#6143](https://github.com/career-ops-hq/career-ops/issues/6143)) ([2665a93](https://github.com/career-ops-hq/career-ops/commit/2665a934c0bd17d19f1bfbc293e926504f2488aa))


### Performance Improvements

* **check-liveness:** import playwright only when a URL needs the browser ([#6056](https://github.com/career-ops-hq/career-ops/issues/6056)) ([a15cc12](https://github.com/career-ops-hq/career-ops/commit/a15cc12ae348e9967e975663389f5c9dc5ab9057))
* **dedup:** build company and posting keys once per row ([#6094](https://github.com/career-ops-hq/career-ops/issues/6094)) ([91a1fd6](https://github.com/career-ops-hq/career-ops/commit/91a1fd669b55d20be62349487219792a68828a19))
* **pdf:** paint a batch of PDFs with one browser ([#6106](https://github.com/career-ops-hq/career-ops/issues/6106)) ([dd0eb97](https://github.com/career-ops-hq/career-ops/commit/dd0eb975cb929313e497d9f2783a6944ab4ac4e6))
* **scan-history:** parse history lines without building pair arrays ([#6055](https://github.com/career-ops-hq/career-ops/issues/6055)) ([498bf8e](https://github.com/career-ops-hq/career-ops/commit/498bf8e659401b8861d10c6b3be3a30eb1f7d55c))
* **scan:** reuse a board response from the last 15 minutes and recheck older ones with ETag ([#6105](https://github.com/career-ops-hq/career-ops/issues/6105)) ([7bd516b](https://github.com/career-ops-hq/career-ops/commit/7bd516b9eaeaf8e3918003240dfa75ca2577218f))
* **verify-ats:** keep the style scanner linear without per-char allocation ([#6442](https://github.com/career-ops-hq/career-ops/issues/6442)) ([6452019](https://github.com/career-ops-hq/career-ops/commit/64520190aeea7c8f065820c94e1a17d1149dbf14))

## [1.38.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.37.0...career-ops-v1.38.0) (2026-10-23)


### Features

* **assessment-log:** track take-home and demo assignments with deadlines ([#5736](https://github.com/career-ops-hq/career-ops/issues/5736)) ([60644df](https://github.com/career-ops-hq/career-ops/commit/60644dfb29b534a32fd652d9e2fe2295c0de0ed1))
* audit what title_filter.positive is actually doing ([#2731](https://github.com/career-ops-hq/career-ops/issues/2731)) ([0cb0052](https://github.com/career-ops-hq/career-ops/commit/0cb00521144736e46babdefa28d89266a4cdc020))
* **batch:** --company limits a run to named companies ([#5526](https://github.com/career-ops-hq/career-ops/issues/5526)) ([c87e0f0](https://github.com/career-ops-hq/career-ops/commit/c87e0f05a5bf3b0e7bff1f6c87fd0865191e7da7))
* **batch:** --status --summary prints the totals without the per-job table ([#5525](https://github.com/career-ops-hq/career-ops/issues/5525)) ([d69d76c](https://github.com/career-ops-hq/career-ops/commit/d69d76c32e75b2be3089b9922bae0e1093c29e70))
* **batch:** --thin-action chooses what to do when no JD text could be fetched ([#5547](https://github.com/career-ops-hq/career-ops/issues/5547)) ([bac59f7](https://github.com/career-ops-hq/career-ops/commit/bac59f7b2b4cec2cd44b4abbaeccbf005ace015b))
* **batch:** print a progress line as each offer finishes ([#5212](https://github.com/career-ops-hq/career-ops/issues/5212)) ([071a233](https://github.com/career-ops-hq/career-ops/commit/071a2336fadcd81722c6cc99fee666b4ffe748ec))
* **batch:** sync pipeline pending entries into batch-input.tsv ([#3442](https://github.com/career-ops-hq/career-ops/issues/3442)) ([c01c34d](https://github.com/career-ops-hq/career-ops/commit/c01c34d6dd7f2f9046999d6c1709b39044b369cc))
* **batch:** workers apply the dealbreaker gate and record a finished SKIP ([#5493](https://github.com/career-ops-hq/career-ops/issues/5493)) ([e2e99d6](https://github.com/career-ops-hq/career-ops/commit/e2e99d65d7202814f0114083097460beee478a77))
* **company-funded:** add siliconangle as an opt-in discovery source ([#5334](https://github.com/career-ops-hq/career-ops/issues/5334)) ([abda2b0](https://github.com/career-ops-hq/career-ops/commit/abda2b0c299e5922d635a4caeba1ebcd50f87a0b))
* **cv:** support locking specific CV sections from AI modification (closes [#2053](https://github.com/career-ops-hq/career-ops/issues/2053)) ([#2082](https://github.com/career-ops-hq/career-ops/issues/2082)) ([970cac7](https://github.com/career-ops-hq/career-ops/commit/970cac76009434c10ccca61368b9a5fa1f930c77))
* **debrief:** update score, contacts, and the next follow-up after a debrief ([#5509](https://github.com/career-ops-hq/career-ops/issues/5509)) ([43bd09e](https://github.com/career-ops-hq/career-ops/commit/43bd09e6860fbeb1300f582fffd34c5d666d7ae9))
* **expand:** count authored commits in the GitHub evidence step ([#5667](https://github.com/career-ops-hq/career-ops/issues/5667)) ([#5668](https://github.com/career-ops-hq/career-ops/issues/5668)) ([05a170b](https://github.com/career-ops-hq/career-ops/commit/05a170b53e7fe77536a60dbbf511a85da5ce3564))
* **expand:** optional GitHub evidence step from authored PRs ([#5295](https://github.com/career-ops-hq/career-ops/issues/5295)) ([#5343](https://github.com/career-ops-hq/career-ops/issues/5343)) ([abb4b86](https://github.com/career-ops-hq/career-ops/commit/abb4b869cf0b6109e3ba8370a96a5e584a4bcc1d))
* **i18n:** adopt Modes Turkish Localization ([#5325](https://github.com/career-ops-hq/career-ops/issues/5325)) ([#5366](https://github.com/career-ops-hq/career-ops/issues/5366)) ([82eabdf](https://github.com/career-ops-hq/career-ops/commit/82eabdf3fa7d78a9530915bc865c43adfb563884))
* **ics-interview:** read an interview .ics into an active-interviews row ([#5744](https://github.com/career-ops-hq/career-ops/issues/5744)) ([5cca74c](https://github.com/career-ops-hq/career-ops/commit/5cca74c787819e4e0490ac4161f9bd59fe14b0fd))
* **interview-scoring:** surface interview-process stages via culture_screen ([#3233](https://github.com/career-ops-hq/career-ops/issues/3233)) ([d9d8254](https://github.com/career-ops-hq/career-ops/commit/d9d8254b060e0f2151961356324dc819e1b77725))
* **jd:** support Workable in shared API-first JD fetching ([#5484](https://github.com/career-ops-hq/career-ops/issues/5484)) ([815fb4e](https://github.com/career-ops-hq/career-ops/commit/815fb4e6795924ca9bd4afa9d280a259015a098e))
* **latam:** fix ElEmpleo encoding, update Magneto URL, harden location filters & add Computrabajo ([#2650](https://github.com/career-ops-hq/career-ops/issues/2650)) ([57247d7](https://github.com/career-ops-hq/career-ops/commit/57247d79f227bfb947bb2cf4a36a7a2b74811ed1))
* **learn:** add learn.mjs check and apply, the gate for learned rules ([#5461](https://github.com/career-ops-hq/career-ops/issues/5461)) ([8a1c80e](https://github.com/career-ops-hq/career-ops/commit/8a1c80e75b9ce5e846611f0018a4bc757ea84590))
* **modes:** add retro, the end-of-session review that proposes rules through learn.mjs ([#5485](https://github.com/career-ops-hq/career-ops/issues/5485)) ([03d21b9](https://github.com/career-ops-hq/career-ops/commit/03d21b94142e84a5183c4dff8f03b6c9371d93c3))
* **modes:** stop before Block A when a JD breaks a hard rule ([#5466](https://github.com/career-ops-hq/career-ops/issues/5466)) ([ff645d1](https://github.com/career-ops-hq/career-ops/commit/ff645d19ddb9416b869e4c8eb5a655e9541092ba))
* **modes:** unattended runs apply each gate's default and close on one line ([#5476](https://github.com/career-ops-hq/career-ops/issues/5476)) ([69a0548](https://github.com/career-ops-hq/career-ops/commit/69a0548d37baedca91879d151641703f8f74cfc0))
* **oferta:** accommodation-notice signal (Ontario seed), [#2026](https://github.com/career-ops-hq/career-ops/issues/2026) member ([#5452](https://github.com/career-ops-hq/career-ops/issues/5452)) ([defcfa9](https://github.com/career-ops-hq/career-ops/commit/defcfa922b5e55df24ab2a822718e38f0e3f7076))
* **oferta:** add a Great Britain row to the candidate-paid fees table ([#5515](https://github.com/career-ops-hq/career-ops/issues/5515)) ([#5516](https://github.com/career-ops-hq/career-ops/issues/5516)) ([a490911](https://github.com/career-ops-hq/career-ops/commit/a4909110dfe337f793e437e218e4e58da46d9a0b))
* **oferta:** candidate-paid fees signal (Ontario seed), [#2026](https://github.com/career-ops-hq/career-ops/issues/2026) member ([#5450](https://github.com/career-ops-hq/career-ops/issues/5450)) ([9aef8cb](https://github.com/career-ops-hq/career-ops/commit/9aef8cbfc555f36bd4e172c068f8db438a79b3ba))
* **oferta:** unpaid-placement signal (Ontario seed), [#2026](https://github.com/career-ops-hq/career-ops/issues/2026) member ([#5447](https://github.com/career-ops-hq/career-ops/issues/5447)) ([042e729](https://github.com/career-ops-hq/career-ops/commit/042e7292e14cb775d99f069ce4633d68c1c105a6))
* **oferta:** vacancy-status disclosure signal (Ontario seed), [#2026](https://github.com/career-ops-hq/career-ops/issues/2026) member ([#5430](https://github.com/career-ops-hq/career-ops/issues/5430)) ([d33cbb2](https://github.com/career-ops-hq/career-ops/commit/d33cbb2dd6608d9c2861dcfa4c8e4cc960f6877f))
* **onboarding:** write profile and portals with one script call ([#5479](https://github.com/career-ops-hq/career-ops/issues/5479)) ([ecddedc](https://github.com/career-ops-hq/career-ops/commit/ecddedc13fbbee35bd6ac27d9bedf7bda2dc53e3))
* **pdf:** opt-in page_format: auto picks the paper size from the employer's country ([#5145](https://github.com/career-ops-hq/career-ops/issues/5145)) ([a078dda](https://github.com/career-ops-hq/career-ops/commit/a078ddab25d4e4abe70326c06744ca1a0ad97b36))
* **pipeline:** add an unreadable bucket to the run summary ([#5409](https://github.com/career-ops-hq/career-ops/issues/5409)) ([060b5a8](https://github.com/career-ops-hq/career-ops/commit/060b5a85eb62729273fcab04d154b1f2da87d30e))
* **profile:** prepare CV bullets from selected verified facts ([#5530](https://github.com/career-ops-hq/career-ops/issues/5530)) ([35b4851](https://github.com/career-ops-hq/career-ops/commit/35b485148708a2e9e0456af78afe69aed4b62c5a))
* **providers:** add atlassian (one public JSON feed) ([#5497](https://github.com/career-ops-hq/career-ops/issues/5497)) ([ce7c01d](https://github.com/career-ops-hq/career-ops/commit/ce7c01d9b825f6c543206128ddc88e7564ac2924))
* **providers:** add BWI GmbH careers-site provider ([#4000](https://github.com/career-ops-hq/career-ops/issues/4000)) ([9717a7f](https://github.com/career-ops-hq/career-ops/commit/9717a7f54bfafa1395d886994a24963b8f5f9cab))
* **providers:** add Dover careers-page provider ([#5565](https://github.com/career-ops-hq/career-ops/issues/5565)) ([b6e0c2d](https://github.com/career-ops-hq/career-ops/commit/b6e0c2dffdfe670eaaffa05d038697c3ba30dae3))
* **providers:** add zoho recruit career sites, with opt-in detail enrichment ([#5345](https://github.com/career-ops-hq/career-ops/issues/5345)) ([ffe58b5](https://github.com/career-ops-hq/career-ops/commit/ffe58b50d3f0dc99dcbc7d25d58fb632d5b85197))
* remember the agent CLI for doctor, the ranker and the web ([#5467](https://github.com/career-ops-hq/career-ops/issues/5467)) ([79965b3](https://github.com/career-ops-hq/career-ops/commit/79965b3c7878777d9b219d82efe7be2363197407))
* **reports:** show the decision line in translated reports ([#5500](https://github.com/career-ops-hq/career-ops/issues/5500)) ([fd16c50](https://github.com/career-ops-hq/career-ops/commit/fd16c50d9afedcd08e5a406d1b491541c7c65d75))
* reuse public job facts from local evaluation reports ([#4646](https://github.com/career-ops-hq/career-ops/issues/4646)) ([15f3087](https://github.com/career-ops-hq/career-ops/commit/15f3087b488d05ae152bc8243e2518bf631762a0))
* **scan-ats-full:** detect white-label SuccessFactors career sites ([#5740](https://github.com/career-ops-hq/career-ops/issues/5740)) ([d8886bf](https://github.com/career-ops-hq/career-ops/commit/d8886bf771d7c71a35031df82f16c41ab1cd30aa))
* **scan:** allow disabling remote-title location fallback ([#5490](https://github.com/career-ops-hq/career-ops/issues/5490)) ([43b39d8](https://github.com/career-ops-hq/career-ops/commit/43b39d81b38f7d9ff19341fe07b19570726abf4b))
* **scan:** print a timestamped progress line on stderr every 25 sources ([#5472](https://github.com/career-ops-hq/career-ops/issues/5472)) ([5be9678](https://github.com/career-ops-hq/career-ops/commit/5be967870969b4a5a2d17151f2a4a071b9a52efe))
* **scan:** record the titles the filter rejects ([#2732](https://github.com/career-ops-hq/career-ops/issues/2732)) ([cbc60da](https://github.com/career-ops-hq/career-ops/commit/cbc60da9d21531115771a53a8fe7288b07650fb6))
* **tracker:** add closing-soon.mjs to surface Evaluated rows closing soon ([#5417](https://github.com/career-ops-hq/career-ops/issues/5417)) ([9e4326b](https://github.com/career-ops-hq/career-ops/commit/9e4326b35a8ee716081b9169f44e83d232a99289))
* **tracker:** add query --csv for spreadsheet export ([#5624](https://github.com/career-ops-hq/career-ops/issues/5624)) ([7c7f3ae](https://github.com/career-ops-hq/career-ops/commit/7c7f3ae9b9bfe0714b966bd6813778f8827e58e3))
* **tracker:** add reeval-candidates.mjs to list rows scored before evidence changed ([#5672](https://github.com/career-ops-hq/career-ops/issues/5672)) ([c46179c](https://github.com/career-ops-hq/career-ops/commit/c46179cf0fd1cbddc8d84c71e55336bef6e492b5)), closes [#5669](https://github.com/career-ops-hq/career-ops/issues/5669)
* **tracker:** filter tracker query by --min-score ([#5560](https://github.com/career-ops-hq/career-ops/issues/5560)) ([1250467](https://github.com/career-ops-hq/career-ops/commit/125046764d25815ec488dd6b8d83d12522fec2b9))
* **tracker:** precheck-duplicate - read-only pre-apply duplicate check ([#5735](https://github.com/career-ops-hq/career-ops/issues/5735)) ([7ac802d](https://github.com/career-ops-hq/career-ops/commit/7ac802dcbd58219520dee8e51c4582d81fa2bc7e))
* **verify-portals:** --unmined finds companies stuck in search_queries ([#2730](https://github.com/career-ops-hq/career-ops/issues/2730)) ([d957bc6](https://github.com/career-ops-hq/career-ops/commit/d957bc6d25d2d6470043b05964a2e6495fe8a2e5))
* **web:** add npm run ui launcher script and server daemon ([#5357](https://github.com/career-ops-hq/career-ops/issues/5357)) ([feb5936](https://github.com/career-ops-hq/career-ops/commit/feb59365aecbb3084054ae03044d389f0108e19c))
* **web:** pdf-ready and follow-up seed actions for the apply checklist ([#5304](https://github.com/career-ops-hq/career-ops/issues/5304)) ([0818cae](https://github.com/career-ops-hq/career-ops/commit/0818cae8ce2120058078c8493edf01cdfb71fb83))
* **web:** scheduled scans on macOS and Linux ([#5401](https://github.com/career-ops-hq/career-ops/issues/5401)) ([02a5902](https://github.com/career-ops-hq/career-ops/commit/02a59029a7060fa0f9bbbf53413f3725e5e1747c))


### Bug Fixes

* **add-entry,fix-slugs:** replace cv.md and portals.yml atomically ([#5552](https://github.com/career-ops-hq/career-ops/issues/5552)) ([a3ff86b](https://github.com/career-ops-hq/career-ops/commit/a3ff86bf36f3b3293b11d50210d197349e425831))
* **analyze-patterns:** read the tracker through resolveTrackerPath() ([#5540](https://github.com/career-ops-hq/career-ops/issues/5540)) ([fa0ae21](https://github.com/career-ops-hq/career-ops/commit/fa0ae21a33916784dd30aa8ac7da63bf8b6429c3))
* **answers:** ignore archived fenced section headings ([#5436](https://github.com/career-ops-hq/career-ops/issues/5436)) ([7db28ef](https://github.com/career-ops-hq/career-ops/commit/7db28efa233e936ca8b0ed019c4534f92390fe8c))
* **apify:** write JD frontmatter with js-yaml instead of yamlEscape ([#4961](https://github.com/career-ops-hq/career-ops/issues/4961)) ([#5306](https://github.com/career-ops-hq/career-ops/issues/5306)) ([c2742ed](https://github.com/career-ops-hq/career-ops/commit/c2742edf4b8ce61ac0a645ae6c1555e913e0141e))
* **apply:** keep apply inside the project and off the user's Chrome ([#5499](https://github.com/career-ops-hq/career-ops/issues/5499)) ([60a68d4](https://github.com/career-ops-hq/career-ops/commit/60a68d4912db3d3f27a32be09b52db71b35db6da))
* **archive:** retain captures for distinct same-title postings ([#5271](https://github.com/career-ops-hq/career-ops/issues/5271)) ([9f322c0](https://github.com/career-ops-hq/career-ops/commit/9f322c07d332a002cf2b27a897c73c9f53781023))
* **artifacts:** place default bundles under the configured data root ([#5277](https://github.com/career-ops-hq/career-ops/issues/5277)) ([91112c1](https://github.com/career-ops-hq/career-ops/commit/91112c1388b10067539e372960c677e552a29581))
* **batch-tailor:** propagate failed worker exits ([#5438](https://github.com/career-ops-hq/career-ops/issues/5438)) ([57de348](https://github.com/career-ops-hq/career-ops/commit/57de348c5989eaf92984505590d8b1a67acb5316))
* **batch:** add grok workers, a worker time limit, and closed stdin ([#5473](https://github.com/career-ops-hq/career-ops/issues/5473)) ([9ee02dd](https://github.com/career-ops-hq/career-ops/commit/9ee02dd7b9d5d07fdbabf6a3944435649e76ab7d))
* **batch:** add the Runtime profile block only when CAREER_OPS_PROFILE is set ([#5567](https://github.com/career-ops-hq/career-ops/issues/5567)) ([a0fa30b](https://github.com/career-ops-hq/career-ops/commit/a0fa30bc9115925ac6cbe01a8ffeae689c282fd2))
* **batch:** check the rate-limit throttle again before launching the next offer ([#5522](https://github.com/career-ops-hq/career-ops/issues/5522)) ([ea3bc9c](https://github.com/career-ops-hq/career-ops/commit/ea3bc9ce9e57f26a15487b39764c8ffb0de2497e))
* **batch:** drop stray bot comments from Gemini report headers ([#5550](https://github.com/career-ops-hq/career-ops/issues/5550)) ([56d2e74](https://github.com/career-ops-hq/career-ops/commit/56d2e74aa69f12c9a7b68e2d14d7929cc93f2b09))
* **batch:** keep --company off shared ATS domains and single-dash values ([#5750](https://github.com/career-ops-hq/career-ops/issues/5750)) ([ef717fe](https://github.com/career-ops-hq/career-ops/commit/ef717fe722e668b7584911f92cfbf58ab18923d7))
* **batch:** keep headless workers out of the user's rule files ([#5455](https://github.com/career-ops-hq/career-ops/issues/5455)) ([8fb6cc4](https://github.com/career-ops-hq/career-ops/commit/8fb6cc426ef687d23e76bead668ab94a2c44b337))
* **batch:** let --dry-run list the queue without the agent CLI ([#5559](https://github.com/career-ops-hq/career-ops/issues/5559)) ([46fb5ac](https://github.com/career-ops-hq/career-ops/commit/46fb5aca63361f1a608cc39603149087a196dda6))
* **batch:** put the report number in the batch worker's CV file names ([#5391](https://github.com/career-ops-hq/career-ops/issues/5391)) ([0348310](https://github.com/career-ops-hq/career-ops/commit/0348310aebaf45b8375368fc379d884f2b1fd91f))
* **batch:** read batch-state.tsv rows without collapsing empty cells ([#5338](https://github.com/career-ops-hq/career-ops/issues/5338)) ([ab3782b](https://github.com/career-ops-hq/career-ops/commit/ab3782bab075c55c4ac26a09e47a71ef0d54bdc3))
* **batch:** recover a thin JD from the page's structured data before falling back to WebFetch ([#5521](https://github.com/career-ops-hq/career-ops/issues/5521)) ([cb34471](https://github.com/career-ops-hq/career-ops/commit/cb3447127532514e38fd0056b5726efde956871a))
* **batch:** resolve the profile through path-resolver so CAREER_OPS_PROFILE reaches batch runs ([#5544](https://github.com/career-ops-hq/career-ops/issues/5544)) ([ac648cb](https://github.com/career-ops-hq/career-ops/commit/ac648cb4e64f3bdae7a37d3b39a787bcc4c24fc1))
* **batch:** route economy spend tier to Haiku 5.5 ([#5289](https://github.com/career-ops-hq/career-ops/issues/5289)) ([d564122](https://github.com/career-ops-hq/career-ops/commit/d5641226a03314ad300898e9d81aae32a78cb0d9))
* **browser-extract:** tell a taken-down posting from an unrendered page ([#5296](https://github.com/career-ops-hq/career-ops/issues/5296)) ([c8fb06d](https://github.com/career-ops-hq/career-ops/commit/c8fb06deb8287582fa01de00e2a5b34a3e6d55fd))
* **ci:** keep the upgrade gate off the GitHub ref API ([#5387](https://github.com/career-ops-hq/career-ops/issues/5387)) ([5b3bc4e](https://github.com/career-ops-hq/career-ops/commit/5b3bc4e1be5eb3a7b660d2fa11f0de366fec7b75))
* **ci:** put a time limit on the test workflow's jobs ([#5578](https://github.com/career-ops-hq/career-ops/issues/5578)) ([af665e6](https://github.com/career-ops-hq/career-ops/commit/af665e650129045fdd71ea6cc55f375cb5b36a79))
* **cli:** read --flag=value in doctor, upskill and update-system ([#5673](https://github.com/career-ops-hq/career-ops/issues/5673)) ([bd3578d](https://github.com/career-ops-hq/career-ops/commit/bd3578d67949f73e060d77e316fae4d9f28aa779))
* **comeet:** recover valid hosted posting URLs ([#5039](https://github.com/career-ops-hq/career-ops/issues/5039)) ([b3cffc3](https://github.com/career-ops-hq/career-ops/commit/b3cffc3a12b7a1390915c293200a07d52f9f2054))
* **cover-letter:** count the candidate's answers as fact sources ([#5495](https://github.com/career-ops-hq/career-ops/issues/5495)) ([3e9ebf8](https://github.com/career-ops-hq/career-ops/commit/3e9ebf87da85795190d4aa05366f0dd6dcde6df8))
* **coverage-check:** survive a stray % in the URL and a missing portals.yml ([#5339](https://github.com/career-ops-hq/career-ops/issues/5339)) ([d172d2e](https://github.com/career-ops-hq/career-ops/commit/d172d2e3ddfa36fbdde7fd8d4eae4f3d09979909))
* **cv-sync-check:** stop reading time windows as hardcoded metrics ([#5470](https://github.com/career-ops-hq/career-ops/issues/5470)) ([f95c4ed](https://github.com/career-ops-hq/career-ops/commit/f95c4ed089dba182c34f3110f5325f0e6c95ecca))
* **dashboard:** keep tracker pipe rows whose notes contain a tab ([#5651](https://github.com/career-ops-hq/career-ops/issues/5651)) ([4eb33ba](https://github.com/career-ops-hq/career-ops/commit/4eb33bacbbe5be1884f228108c03638a45daa7bd))
* **dashboard:** read only the report header when filling in missing job URLs ([#5489](https://github.com/career-ops-hq/career-ops/issues/5489)) ([81fc911](https://github.com/career-ops-hq/career-ops/commit/81fc911773c082505646555736793aa2987a1abf))
* **dashboard:** render only the visible pipeline rows ([#5506](https://github.com/career-ops-hq/career-ops/issues/5506)) ([d927f93](https://github.com/career-ops-hq/career-ops/commit/d927f937b423ca5f4fe0f906148d07088b42dc0a))
* **dashboard:** show work modes through the language catalog ([#5557](https://github.com/career-ops-hq/career-ops/issues/5557)) ([328eb1a](https://github.com/career-ops-hq/career-ops/commit/328eb1abe38ab4b1a85af27db93652ccf06ede61))
* **dedup:** match corporate-form suffix twins in dedup-tracker.mjs ([#4487](https://github.com/career-ops-hq/career-ops/issues/4487)) ([fe9705f](https://github.com/career-ops-hq/career-ops/commit/fe9705f63a55fefdffbcf33d619fb4793ba065e1))
* **discover-new-companies:** skip companies tracked by board ([#5539](https://github.com/career-ops-hq/career-ops/issues/5539)) ([bccf15b](https://github.com/career-ops-hq/career-ops/commit/bccf15b60c338879858564b8735c63639bd7a24f))
* **discover-new-companies:** stop cutting piped output at 64 KiB ([#5541](https://github.com/career-ops-hq/career-ops/issues/5541)) ([8795fe8](https://github.com/career-ops-hq/career-ops/commit/8795fe82b9d46e76ed4a65ab5e5520b1ba772c2b))
* **discover:** respect data/blacklist.md in discover-new-companies and discover-ats ([#5333](https://github.com/career-ops-hq/career-ops/issues/5333)) ([26d6331](https://github.com/career-ops-hq/career-ops/commit/26d63315d10e8c6ab52a5b26f16cd9ad3b19156e))
* **docker:** let ./cops bash -c '...' run the script ([#5638](https://github.com/career-ops-hq/career-ops/issues/5638)) ([7fe62e8](https://github.com/career-ops-hq/career-ops/commit/7fe62e80812da7f4570d998cb09416735df67faf))
* **docker:** make ./cops rebuild refresh the node_modules volume ([#5639](https://github.com/career-ops-hq/career-ops/issues/5639)) ([1876161](https://github.com/career-ops-hq/career-ops/commit/1876161f48b9847acbf742376586f1418c36ba53))
* **docker:** verify the Go tarball's SHA-256 before installing it ([#5665](https://github.com/career-ops-hq/career-ops/issues/5665)) ([a58ec93](https://github.com/career-ops-hq/career-ops/commit/a58ec93e87ed7ac13e5b6574a53fb4f08054556d))
* **docs:** resolve user-layer paths and tracker TSVs against the data root ([#5347](https://github.com/career-ops-hq/career-ops/issues/5347)) ([306b924](https://github.com/career-ops-hq/career-ops/commit/306b9244607679ed9d37e9e9d8ddd4a072ca98b7)), closes [#5346](https://github.com/career-ops-hq/career-ops/issues/5346)
* **doctor,update:** clear errors from a copy with no node_modules or no .git ([#5658](https://github.com/career-ops-hq/career-ops/issues/5658)) ([16d6fc1](https://github.com/career-ops-hq/career-ops/commit/16d6fc16bf3599e2d3ed84e3e9bb6d822e43b2c5))
* **doctor:** diagnose half-filled profile sections using core sectionState ([#5126](https://github.com/career-ops-hq/career-ops/issues/5126)) ([#5311](https://github.com/career-ops-hq/career-ops/issues/5311)) ([afefa44](https://github.com/career-ops-hq/career-ops/commit/afefa4408e9fb4357340c26a5b0b2180a2c6774a))
* **doctor:** flag an empty profile as unpersonalized and compare against the checkout template ([#5340](https://github.com/career-ops-hq/career-ops/issues/5340)) ([#5344](https://github.com/career-ops-hq/career-ops/issues/5344)) ([b21181c](https://github.com/career-ops-hq/career-ops/commit/b21181cfc5f607270c82118c77fd754239138442))
* **doctor:** only suggest renaming the experience heading when none was found ([#5562](https://github.com/career-ops-hq/career-ops/issues/5562)) ([4e5ca36](https://github.com/career-ops-hq/career-ops/commit/4e5ca36726bcb8f2418531f169d29cfbb94ac356))
* **doctor:** report why Chromium failed to launch instead of "not installed" ([#5676](https://github.com/career-ops-hq/career-ops/issues/5676)) ([1718c28](https://github.com/career-ops-hq/career-ops/commit/1718c28515350b67fe5ea1d6237455dbde4f89dc))
* **eval:** archive the verbatim JD in gemini, batch-gemini and openrouter reports ([#5671](https://github.com/career-ops-hq/career-ops/issues/5671)) ([868f0f5](https://github.com/career-ops-hq/career-ops/commit/868f0f5d5047e575ee70f99ff635494ee7e42022))
* **expand:** normalize candidate.github to a username before the API call ([#5341](https://github.com/career-ops-hq/career-ops/issues/5341)) ([6146f6e](https://github.com/career-ops-hq/career-ops/commit/6146f6e4e184c45fa4948f426d35b52d2a131a7d))
* **expand:** read every page of the repo list and skip forks ([#5342](https://github.com/career-ops-hq/career-ops/issues/5342)) ([a475ec0](https://github.com/career-ops-hq/career-ops/commit/a475ec0ea894cb1c13793e6de60ecb18a1c3e7c3))
* **fact-gate:** run the gate on every CV renderer and read respelled and structured claims ([#5348](https://github.com/career-ops-hq/career-ops/issues/5348)) ([#5351](https://github.com/career-ops-hq/career-ops/issues/5351)) ([68a78bf](https://github.com/career-ops-hq/career-ops/commit/68a78bf13166a8b76f47dac64cba792548f88eb3))
* **fix-slugs:** find a company block by its parsed name when quoted or followed by a comment ([#5322](https://github.com/career-ops-hq/career-ops/issues/5322)) ([dc3f40e](https://github.com/career-ops-hq/career-ops/commit/dc3f40e98c9029df724dbe9cbb3ac68268604ba9))
* **followup-cadence:** read the apply date from status-log.tsv ([#5469](https://github.com/career-ops-hq/career-ops/issues/5469)) ([c2e553c](https://github.com/career-ops-hq/career-ops/commit/c2e553cc5d9413717f544761673baf62feacc364))
* **followups:** skip the launchd sweep when follow-ups are off ([#5312](https://github.com/career-ops-hq/career-ops/issues/5312)) ([630c8c8](https://github.com/career-ops-hq/career-ops/commit/630c8c82bb8534313c197248102ed79ba580bfc6))
* **gem:** strip markup before decoding entities in job descriptions ([#5549](https://github.com/career-ops-hq/career-ops/issues/5549)) ([7c5c205](https://github.com/career-ops-hq/career-ops/commit/7c5c205f884d5ab8012d02a1c362f914b25ea41e))
* **generate-pdf:** find locked sections under an H1 title in cv.md ([#5749](https://github.com/career-ops-hq/career-ops/issues/5749)) ([0e541d3](https://github.com/career-ops-hq/career-ops/commit/0e541d39756c9258f4c9f5a43464cd63793a83f0))
* **generate-pdf:** render markdown italic in CVs as &lt;em&gt; ([#5619](https://github.com/career-ops-hq/career-ops/issues/5619)) ([f3950bc](https://github.com/career-ops-hq/career-ops/commit/f3950bc8236e4d0bb63e3bb79eee192c074b3b12))
* **generate-pdf:** replace the pdf atomically so a failed write keeps the old one ([#5259](https://github.com/career-ops-hq/career-ops/issues/5259)) ([37cd9ec](https://github.com/career-ops-hq/career-ops/commit/37cd9ec466505374167b32254f2ae9e850b96679))
* **gitignore:** ignore a personal .hermes.md ([#5607](https://github.com/career-ops-hq/career-ops/issues/5607)) ([6a6467c](https://github.com/career-ops-hq/career-ops/commit/6a6467cde442120643b2de4767260ef7c5c402b3))
* **himalayas:** follow bounded cursor pagination ([#5042](https://github.com/career-ops-hq/career-ops/issues/5042)) ([c2b5d14](https://github.com/career-ops-hq/career-ops/commit/c2b5d14b779eebe084e33e63ff0074afbf8c787f))
* **hired-share:** retain concurrent never-share decisions ([#5274](https://github.com/career-ops-hq/career-ops/issues/5274)) ([12310ad](https://github.com/career-ops-hq/career-ops/commit/12310adb2f1987201594bca94e903fffd1a63872))
* **intake:** preserve concurrent confirmed-source commits ([#5275](https://github.com/career-ops-hq/career-ops/issues/5275)) ([f7d9402](https://github.com/career-ops-hq/career-ops/commit/f7d9402b7a99c25914d9f539b59dfb8c1d647b35))
* **invites:** recognize requisition labels without a separator ([#5091](https://github.com/career-ops-hq/career-ops/issues/5091)) ([338fb4f](https://github.com/career-ops-hq/career-ops/commit/338fb4f637ed34306fab5e19593b4f13cf038660))
* **jd-archive:** do not credit a section that says it is a paraphrase ([#5180](https://github.com/career-ops-hq/career-ops/issues/5180)) ([a859a91](https://github.com/career-ops-hq/career-ops/commit/a859a9101e715252923468e7b8cf82e2f07dd5f3))
* **jd-skill-gap:** read numbered requirement items and full-width inline headers ([#5293](https://github.com/career-ops-hq/career-ops/issues/5293)) ([1011fe2](https://github.com/career-ops-hq/career-ops/commit/1011fe29452941a238b078ca581969ec81b8f4bc))
* **jobstreet:** improve pagination coverage and report partial scans ([#5395](https://github.com/career-ops-hq/career-ops/issues/5395)) ([d7733a5](https://github.com/career-ops-hq/career-ops/commit/d7733a556616adc14d3250fb34222561ace29472))
* **keyword-match:** honour fence indentation when closing a fence ([#5453](https://github.com/career-ops-hq/career-ops/issues/5453)) ([98ccc76](https://github.com/career-ops-hq/career-ops/commit/98ccc761c685137287010a6925eefee7638b669e)), closes [#5362](https://github.com/career-ops-hq/career-ops/issues/5362)
* **keyword-match:** read the keyword list shapes reports actually use ([#5362](https://github.com/career-ops-hq/career-ops/issues/5362)) ([1fbd455](https://github.com/career-ops-hq/career-ops/commit/1fbd45590f248fd6b4ea5ea0b488cfec72b979bf))
* **latex:** reject repeated patch IDs before rewriting CV prose ([#5437](https://github.com/career-ops-hq/career-ops/issues/5437)) ([9c9f08b](https://github.com/career-ops-hq/career-ops/commit/9c9f08b3fd2707bca50203da6230870afbbf64e9))
* **latex:** reject stale extracted slots before writing output ([#5037](https://github.com/career-ops-hq/career-ops/issues/5037)) ([05b883c](https://github.com/career-ops-hq/career-ops/commit/05b883c67cca3cd5d6128ec339a7189358801ae8))
* **ledgers:** start an append on a fresh line when the last row has no newline ([#5398](https://github.com/career-ops-hq/career-ops/issues/5398)) ([5bcf5ef](https://github.com/career-ops-hq/career-ops/commit/5bcf5ef2b7a4a76cacad8ebfd08dc6eb87d2a7a9))
* **liveness:** add a No Fluff Jobs API rung, so live postings are kept and closed ones are not ([#5428](https://github.com/career-ops-hq/career-ops/issues/5428)) ([ff95ef0](https://github.com/career-ops-hq/career-ops/commit/ff95ef076dcca002f4bbae40712e1fa1db79d3fc))
* **liveness:** add API rungs for Tencent, Meituan and Alibaba ([#5486](https://github.com/career-ops-hq/career-ops/issues/5486)) ([530e24f](https://github.com/career-ops-hq/career-ops/commit/530e24f994034a4eec2288160143ae2757c1ba41))
* **liveness:** detect Polish closure banners on pracuj.pl ([#5617](https://github.com/career-ops-hq/career-ops/issues/5617)) ([09a5548](https://github.com/career-ops-hq/career-ops/commit/09a554802d4254942aeaf151682e3c824fc2684b))
* **liveness:** fetch each Ashby board once per check-liveness run ([#5491](https://github.com/career-ops-hq/career-ops/issues/5491)) ([e27c501](https://github.com/career-ops-hq/career-ops/commit/e27c501b999f2536cb6c40e7b918dff91767e58c))
* **liveness:** read CareerViet's Apply button, and the deadline on a closed posting ([#5367](https://github.com/career-ops-hq/career-ops/issues/5367)) ([5a9738d](https://github.com/career-ops-hq/career-ops/commit/5a9738d4b97fcac398b2d5e24c2d5858c5a83878))
* **liveness:** read getManfred's Apply button, and the date on a closed posting ([#5350](https://github.com/career-ops-hq/career-ops/issues/5350)) ([9155d1a](https://github.com/career-ops-hq/career-ops/commit/9155d1a140b9fb0134a87b6db201a6bdb06cbdab))
* **liveness:** read HiringRoom's Apply button, so live postings are not dropped ([#5535](https://github.com/career-ops-hq/career-ops/issues/5535)) ([9fe2313](https://github.com/career-ops-hq/career-ops/commit/9fe23130f490ff68790f1ad736dc874f9dba78ce))
* **liveness:** read the No Fluff Jobs 404 body before closing a posting ([#5533](https://github.com/career-ops-hq/career-ops/issues/5533)) ([d12550c](https://github.com/career-ops-hq/career-ops/commit/d12550c0af5581ed076a656ada4e6aa072b6e9b4))
* **liveness:** resolve plain-http gh_jid pages via API, retry slow pages once, space throttle per host, count DNS-blocked trackers ([#5392](https://github.com/career-ops-hq/career-ops/issues/5392)) ([f2d1de1](https://github.com/career-ops-hq/career-ops/commit/f2d1de1dfe0ce54461efcdfc7710735a36d10a36))
* **liveness:** the skipped_expired row no longer re-escapes a title, company or location starting with = + - @ ([#5376](https://github.com/career-ops-hq/career-ops/issues/5376)) ([a4feed3](https://github.com/career-ops-hq/career-ops/commit/a4feed36a732b46081b1fec7f922517f6089ccb4))
* **locks:** one directory-lock protocol in lib/dir-lock.mjs, used by every core lock ([#5389](https://github.com/career-ops-hq/career-ops/issues/5389)) ([30ae797](https://github.com/career-ops-hq/career-ops/commit/30ae797adb36a3d6b8e0baec913b3349998b4223))
* **merge-tracker:** keep same-titled postings apart on a tracker with no url column ([#5518](https://github.com/career-ops-hq/career-ops/issues/5518)) ([b8aca95](https://github.com/career-ops-hq/career-ops/commit/b8aca95188fca4ff0d1602ddc34638b615c518cc))
* **merge-tracker:** stop statting every tracker row's report in the same-file tier ([#5488](https://github.com/career-ops-hq/career-ops/issues/5488)) ([41817e5](https://github.com/career-ops-hq/career-ops/commit/41817e5976b488d7fb97e7039bd48f29b1a85990))
* **modes/fr:** write report header labels without a space before the colon ([#5644](https://github.com/career-ops-hq/career-ops/issues/5644)) ([6823811](https://github.com/career-ops-hq/career-ops/commit/6823811478c5afe7d71a2ff99d93dd684ff0ff33))
* **modes:** add the required JD archive section to six localized evaluation modes ([#5654](https://github.com/career-ops-hq/career-ops/issues/5654)) ([e1bb2a2](https://github.com/career-ops-hq/career-ops/commit/e1bb2a2d380ee9933e4b363b64c3925a61a6b26d))
* **modes:** stop es/ru/ja/tr apply modes writing answers into Block G ([#5648](https://github.com/career-ops-hq/career-ops/issues/5648)) ([88b9eb1](https://github.com/career-ops-hq/career-ops/commit/88b9eb1b5cd82c24ff8147aa7d00ee119c6c4fbe))
* **normalize-statuses:** normalize tab-delimited tracker rows in place ([#5574](https://github.com/career-ops-hq/career-ops/issues/5574)) ([0a8595c](https://github.com/career-ops-hq/career-ops/commit/0a8595cb82cea4434aad8386fa281783365882a7))
* **outcome:** journal a status only after tracker confirmation ([#5272](https://github.com/career-ops-hq/career-ops/issues/5272)) ([5f5fd50](https://github.com/career-ops-hq/career-ops/commit/5f5fd500d7b314d5383355663079783031a7de9f))
* **outcome:** reject a missing explicitly selected CV artifact ([#5273](https://github.com/career-ops-hq/career-ops/issues/5273)) ([fb2a14c](https://github.com/career-ops-hq/career-ops/commit/fb2a14cf0476c5840eff7eafc41ae257def886dc))
* **paths:** read the profile through one CAREER_OPS_PROFILE-aware helper in the remaining core modules ([#5095](https://github.com/career-ops-hq/career-ops/issues/5095)) ([8e2ec93](https://github.com/career-ops-hq/career-ops/commit/8e2ec9374b78053e3c9a09e990ebac3995b3228e))
* **paths:** resolve the profile through one CAREER_OPS_PROFILE-aware helper ([#5087](https://github.com/career-ops-hq/career-ops/issues/5087)) ([ee2532e](https://github.com/career-ops-hq/career-ops/commit/ee2532e5c76a0bfe8e127daf73bbe55ac7a1e3f1))
* **pdf,latex:** include report number in temp and output CV paths ([#5394](https://github.com/career-ops-hq/career-ops/issues/5394)) ([a1c0cc0](https://github.com/career-ops-hq/career-ops/commit/a1c0cc0f053c86e3fa301f7eb5dfb9d668b48973))
* **pipeline:** share the localized pending and processed headings across scan, sync and reconcile ([#5520](https://github.com/career-ops-hq/career-ops/issues/5520)) ([19818b5](https://github.com/career-ops-hq/career-ops/commit/19818b58cd78375ff5c28acf3409b574b9070236))
* **plugins:** build the export snapshot from the resolved tracker via tracker-parse ([#5537](https://github.com/career-ops-hq/career-ops/issues/5537)) ([1e339a0](https://github.com/career-ops-hq/career-ops/commit/1e339a045f93a3a9b95a2b735d7b45cc96d0528f))
* **plugins:** name community plugin authors and explain an empty h1b-sponsor run ([#5475](https://github.com/career-ops-hq/career-ops/issues/5475)) ([7d63e03](https://github.com/career-ops-hq/career-ops/commit/7d63e0306e070a27735ed0ed935417d919d9595d))
* **plugins:** point the serper registry entry at its renamed owner ([#5451](https://github.com/career-ops-hq/career-ops/issues/5451)) ([a8a29cf](https://github.com/career-ops-hq/career-ops/commit/a8a29cf8f2285228bab6f1aa3841b87843464c45)), closes [#4186](https://github.com/career-ops-hq/career-ops/issues/4186)
* **plugins:** reject traversal-shaped ids in remove before rmSync ([#5524](https://github.com/career-ops-hq/career-ops/issues/5524)) ([8dfa557](https://github.com/career-ops-hq/career-ops/commit/8dfa557a557064f64e3a9c1a2495d90e50b70e51))
* **portals:** fold provider plugins into every provider map ([#5551](https://github.com/career-ops-hq/career-ops/issues/5551)) ([280e415](https://github.com/career-ops-hq/career-ops/commit/280e415a2c82db507ab0a09ac2ffb56dea5ba234))
* **postinstall:** warn instead of failing npm install when Chromium can't download ([#5597](https://github.com/career-ops-hq/career-ops/issues/5597)) ([139d2b3](https://github.com/career-ops-hq/career-ops/commit/139d2b3bf38814821b2081dc7803adaf128a9dfd))
* **prepare:** read valid quoted and commented profile YAML ([#5276](https://github.com/career-ops-hq/career-ops/issues/5276)) ([13ba8a9](https://github.com/career-ops-hq/career-ops/commit/13ba8a9f5db9f1f2355a4754fe6882e3c0ec4e0f))
* **providers:** tag page-cap and failed-page truncation on eightfold, jibeapply, phenom, rippling, pageup, join ([#5327](https://github.com/career-ops-hq/career-ops/issues/5327)) ([fd35521](https://github.com/career-ops-hq/career-ops/commit/fd35521998a4bdf5df9d9a8a3d8d62e77a297cbd))
* put the _custom.md read rule where every agent reads it ([#5457](https://github.com/career-ops-hq/career-ops/issues/5457)) ([c48b87e](https://github.com/career-ops-hq/career-ops/commit/c48b87e88c71398b05a9558e86924fb53a44da35))
* **rank:** ask for one tool-free answer, bounded, and name unranked rows ([#5480](https://github.com/career-ops-hq/career-ops/issues/5480)) ([85568d9](https://github.com/career-ops-hq/career-ops/commit/85568d985edc98835237c718f91f5ee69b402d0c))
* **rank:** reject invalid explicit limits before CLI calls ([#5004](https://github.com/career-ops-hq/career-ops/issues/5004)) ([7510060](https://github.com/career-ops-hq/career-ops/commit/75100607ef7f738fa4ad54d780f70f56ce946e62))
* **reconcile:** read the pdf flag from the path, not the english words ([#5519](https://github.com/career-ops-hq/career-ops/issues/5519)) ([4b57696](https://github.com/career-ops-hq/career-ops/commit/4b576963c5ffe11a0075334f4b9b4dda4cbf9efe))
* **rippling:** propagate first-page fetch failures ([#5038](https://github.com/career-ops-hq/career-ops/issues/5038)) ([b8fb226](https://github.com/career-ops-hq/career-ops/commit/b8fb226b9a0b4a4c4b3051fa4d5d6144fb8923ea))
* **role-matcher:** keep titles apart when they differ only by a short capitalised code ([#5688](https://github.com/career-ops-hq/career-ops/issues/5688)) ([134057b](https://github.com/career-ops-hq/career-ops/commit/134057b8629d7b104cad20b32cd9513cadae7aa0))
* **router:** give expand, interview-redflag and update a context-loading rule ([#5697](https://github.com/career-ops-hq/career-ops/issues/5697)) ([521555a](https://github.com/career-ops-hq/career-ops/commit/521555ab948c977ea2720dd5e2ad91094f34a6d2))
* **scaffolder:** say which ref init installs, and when it fell back to main ([#5584](https://github.com/career-ops-hq/career-ops/issues/5584)) ([b1af602](https://github.com/career-ops-hq/career-ops/commit/b1af602136544041117cb62bb520a4a7c7bd7a82))
* **scan:** admit scan-hn, interamt, openrouter and plugin postings through one shared gate ([#5481](https://github.com/career-ops-hq/career-ops/issues/5481)) ([7933fb3](https://github.com/career-ops-hq/career-ops/commit/7933fb3e21ef5312ae3699f4c93561523a263f06))
* **scan:** stop pinning skipped_no_apply_control rows in scan-history ([#4866](https://github.com/career-ops-hq/career-ops/issues/4866)) ([05a1129](https://github.com/career-ops-hq/career-ops/commit/05a112968f1f09bb4975d086424d0a6b683c6d97))
* **set-status:** warn when a row leaves a terminal state ([#5211](https://github.com/career-ops-hq/career-ops/issues/5211)) ([090f787](https://github.com/career-ops-hq/career-ops/commit/090f787e2499f4fd29b615272946c99dfcab1c28))
* **status:** run set-status's hooks for reply-watch and dedup-tracker status changes ([#5536](https://github.com/career-ops-hq/career-ops/issues/5536)) ([#5538](https://github.com/career-ops-hq/career-ops/issues/5538)) ([8cfe9cb](https://github.com/career-ops-hq/career-ops/commit/8cfe9cb346efcaf706397cda5c68de8057df00ab))
* **status:** stop web and dashboard Interview moves timing out on the JD archive ([#5487](https://github.com/career-ops-hq/career-ops/issues/5487)) ([e017968](https://github.com/career-ops-hq/career-ops/commit/e017968947152c9cc08186193e7b64816e17666e))
* **story-provenance:** check story-bank figures by unit and sentence, and keep user-cannot-confirm figures out of negotiation, ATS and interview output ([#5355](https://github.com/career-ops-hq/career-ops/issues/5355)) ([55a5165](https://github.com/career-ops-hq/career-ops/commit/55a51658d17332c23b1d5383bc093e0a17b5df9f))
* **tailor:** keep generated CVs distinct per application report ([#5439](https://github.com/career-ops-hq/career-ops/issues/5439)) ([bb9a786](https://github.com/career-ops-hq/career-ops/commit/bb9a786579f85bd8da0ca7d9a86562c37eea684f))
* **test-all:** keep the assertion message of a failed suite on node 22 ([#5353](https://github.com/career-ops-hq/career-ops/issues/5353)) ([9580d88](https://github.com/career-ops-hq/career-ops/commit/9580d8817fd46fb65bc0681bba9ece5458745b15))
* **test-harness:** guard the user files resolved from the checkout ([#5279](https://github.com/career-ops-hq/career-ops/issues/5279)) ([5c697b5](https://github.com/career-ops-hq/career-ops/commit/5c697b5be887d27246e66956d4901621787e878b)), closes [#5207](https://github.com/career-ops-hq/career-ops/issues/5207)
* **test:** keep substituted paths single args in pdf-ats-variant test ([#5411](https://github.com/career-ops-hq/career-ops/issues/5411)) ([1c612e9](https://github.com/career-ops-hq/career-ops/commit/1c612e9950c7de2f703493ac384b6f3c0da271b1)), closes [#5410](https://github.com/career-ops-hq/career-ops/issues/5410)
* **tests:** "this command must fail" must mean it ran and failed ([#5402](https://github.com/career-ops-hq/career-ops/issues/5402)) ([b2d1c7d](https://github.com/career-ops-hq/career-ops/commit/b2d1c7dee78aa17fb8d5269bbb785a2a2ca3e5e3))
* **tests:** fail the absolute-path check when git grep itself fails ([#5576](https://github.com/career-ops-hq/career-ops/issues/5576)) ([35a0c30](https://github.com/career-ops-hq/career-ops/commit/35a0c300da5369138fa526cd47287a3e6c732800))
* **tests:** read the smoke loop's declared expectExit ([#5579](https://github.com/career-ops-hq/career-ops/issues/5579)) ([3b4b0ee](https://github.com/career-ops-hq/career-ops/commit/3b4b0ee8f80f9ff1858f1f5527d2642f964e649a))
* **tests:** seal git config out of suites whose fixtures inherit process.env ([#5582](https://github.com/career-ops-hq/career-ops/issues/5582)) ([3c3c740](https://github.com/career-ops-hq/career-ops/commit/3c3c740a472f29f1d4dd460a2eaafbc417c90501))
* **tracker:** derive history from status-log.tsv so a rebuilt index loses nothing ([#5555](https://github.com/career-ops-hq/career-ops/issues/5555)) ([#5556](https://github.com/career-ops-hq/career-ops/issues/5556)) ([b161516](https://github.com/career-ops-hq/career-ops/commit/b1615163cee7acf60e543de83c3785cd5905e492))
* **tracker:** Go and Node agree on the lock directory on Windows ([#5365](https://github.com/career-ops-hq/career-ops/issues/5365)) ([f0e8392](https://github.com/career-ops-hq/career-ops/commit/f0e8392dd60d73751c30bf715c126594c6aaeb63))
* **tracker:** preserve last cell when migrating Via ([#5090](https://github.com/career-ops-hq/career-ops/issues/5090)) ([2596f85](https://github.com/career-ops-hq/career-ops/commit/2596f85540048763dafe3b8c482c8834f00fd626))
* **tracker:** read report links through the shared parser so parentheses survive ([#5482](https://github.com/career-ops-hq/career-ops/issues/5482)) ([#5483](https://github.com/career-ops-hq/career-ops/issues/5483)) ([ea3ede6](https://github.com/career-ops-hq/career-ops/commit/ea3ede6e94ca61a96bfa1ebdd967788473d5dcda))
* **tracker:** resolve report links from a symlinked tracker's own folder ([#5374](https://github.com/career-ops-hq/career-ops/issues/5374)) ([#5375](https://github.com/career-ops-hq/career-ops/issues/5375)) ([c96fa19](https://github.com/career-ops-hq/career-ops/commit/c96fa19b1eb5bc5829d70b06fbcebe5e79e6f7de))
* **tracker:** unwrap report URL tokens before trailing punctuation ([#5309](https://github.com/career-ops-hq/career-ops/issues/5309)) ([be40c3e](https://github.com/career-ops-hq/career-ops/commit/be40c3e64a258c2d74ad746996167e06a86e0bad))
* treat comment-only YAML config as empty instead of crashing ([#5464](https://github.com/career-ops-hq/career-ops/issues/5464)) ([9769f2a](https://github.com/career-ops-hq/career-ops/commit/9769f2ad4c49dc5e141079551a8dcb5b63b09c63))
* **ui:** say web dependencies are missing instead of blaming the port ([#5471](https://github.com/career-ops-hq/career-ops/issues/5471)) ([17fa286](https://github.com/career-ops-hq/career-ops/commit/17fa286479c1afc0b94d15a0a57dc4e09c2c48ee))
* **update mode:** restore CLAUDE.md additions only when apply removed them ([#5650](https://github.com/career-ops-hq/career-ops/issues/5650)) ([df88e5f](https://github.com/career-ops-hq/career-ops/commit/df88e5f5a7cdaebc17d376becd1c868c9cff5270))
* **update-system:** fail loudly on a failed npm install, and reinstall on rollback ([#5656](https://github.com/career-ops-hq/career-ops/issues/5656)) ([902dcf4](https://github.com/career-ops-hq/career-ops/commit/902dcf40fd1ed194ff11899757d273841133568d))
* **update-system:** keep the local-edits scan and scoped commits under the argv limit ([#5119](https://github.com/career-ops-hq/career-ops/issues/5119)) ([667b5e7](https://github.com/career-ops-hq/career-ops/commit/667b5e788ff53308de73eef48d2d6390d7b224b6))
* **update-system:** put back what a failed update had checked out ([#5349](https://github.com/career-ops-hq/career-ops/issues/5349)) ([f21836e](https://github.com/career-ops-hq/career-ops/commit/f21836eab89e6911b4a83489910e85e40546847f))
* **update-system:** rebuild the dashboard on go.mod/go.sum changes, as career-dashboard.exe on Windows ([#5637](https://github.com/career-ops-hq/career-ops/issues/5637)) ([aa1ba62](https://github.com/career-ops-hq/career-ops/commit/aa1ba62a83f6d7f66bd3ad18fb72256c6afa1e3a))
* **updater:** check system paths out in a few batched runs, not one per entry ([#5508](https://github.com/career-ops-hq/career-ops/issues/5508)) ([b1b7c60](https://github.com/career-ops-hq/career-ops/commit/b1b7c60adf0f5c3ae925f661033f40c2967580db))
* **updater:** do not commit the auto-update onto a non-default branch ([#3923](https://github.com/career-ops-hq/career-ops/issues/3923)) ([ed2ca41](https://github.com/career-ops-hq/career-ops/commit/ed2ca418b30c9f38ed4cfb062aa99cf95a8606c2))
* **updater:** preserve ignored local file collisions ([#5088](https://github.com/career-ops-hq/career-ops/issues/5088)) ([829d5d5](https://github.com/career-ops-hq/career-ops/commit/829d5d542009cf3b4008f854e41b558b6cb95636))
* **upskill:** resolve report links through a symlinked data root ([#5542](https://github.com/career-ops-hq/career-ops/issues/5542)) ([e90ae5d](https://github.com/career-ops-hq/career-ops/commit/e90ae5d46b8e5be330c1ee01d07225fbe9a1204b))
* **url-key:** two scripts of one language are two postings, not one ([#5370](https://github.com/career-ops-hq/career-ops/issues/5370)) ([1de4ec1](https://github.com/career-ops-hq/career-ops/commit/1de4ec1b5b350bed781bba0b7cc7171572553832))
* **validate-portals:** flag `enabled: no`/`off`/"false" and bare-string title_filter lists ([#5377](https://github.com/career-ops-hq/career-ops/issues/5377)) ([c4ab65b](https://github.com/career-ops-hq/career-ops/commit/c4ab65b46bb5458822816edf0ee0e98d47ec2933))
* **verify-portals:** probe entries through a bounded pool ([#5657](https://github.com/career-ops-hq/career-ops/issues/5657)) ([cb2f1fa](https://github.com/career-ops-hq/career-ops/commit/cb2f1fa9798acf5561c65bceb4d75b7c5c6dd86c))
* **web:** keep an extracted posting url intact ([#5149](https://github.com/career-ops-hq/career-ops/issues/5149)) ([d91bbf2](https://github.com/career-ops-hq/career-ops/commit/d91bbf296aa10f95c6f0d3d219d258f384ec3ac9))
* **web:** move the scheduled-jobs and chat locks onto the shared directory-lock protocol ([#5390](https://github.com/career-ops-hq/career-ops/issues/5390)) ([ca5e70b](https://github.com/career-ops-hq/career-ops/commit/ca5e70b9321daf4765f5143a4aa4d2d135f0d397))
* **web:** name the resolved profile path in agent prompts under CAREER_OPS_PROFILE ([#5588](https://github.com/career-ops-hq/career-ops/issues/5588)) ([ec35d1b](https://github.com/career-ops-hq/career-ops/commit/ec35d1b470e22d531a94cce33fa71d37612a470f))
* **web:** read and write the profile CAREER_OPS_PROFILE names ([#5096](https://github.com/career-ops-hq/career-ops/issues/5096)) ([a7f3edf](https://github.com/career-ops-hq/career-ops/commit/a7f3edf3139f4bffd0ae6718e96ca811a4edc6fd))
* **workday:** skip placeholder detail GETs for titles the scan drops ([#5507](https://github.com/career-ops-hq/career-ops/issues/5507)) ([9b5f7f8](https://github.com/career-ops-hq/career-ops/commit/9b5f7f8a1b54583c851694a5063ce715e00e4f7b))


### Performance Improvements

* **scan:** fetch successfactors csb pages six at a time ([#5176](https://github.com/career-ops-hq/career-ops/issues/5176)) ([4cfa7e4](https://github.com/career-ops-hq/career-ops/commit/4cfa7e449a67dc1bfc58cb74365defacfeb8f7e0))
* **web:** send inbox postings only to the pipeline inbox tab ([#5221](https://github.com/career-ops-hq/career-ops/issues/5221)) ([602a3d5](https://github.com/career-ops-hq/career-ops/commit/602a3d525456c174b8628663041947c9a68c34c2))

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


### Features

* add Assessment lifecycle and follow-up status controls ([#4317](https://github.com/career-ops-hq/career-ops/issues/4317)) ([8cb0161](https://github.com/career-ops-hq/career-ops/commit/8cb0161f73d1e6012976bdf2ba79dee6b91f40d1))
* add strong local listing identity schema ([#4642](https://github.com/career-ops-hq/career-ops/issues/4642)) ([b19d16c](https://github.com/career-ops-hq/career-ops/commit/b19d16cb1b977572c805fab93bd0d1dd688b8213))
* **coverage-check:** explain why the scanners missed a posting found by hand ([#4849](https://github.com/career-ops-hq/career-ops/issues/4849)) ([ebcf15a](https://github.com/career-ops-hq/career-ops/commit/ebcf15aa52ddbda1249b6808230cc794997caad7))
* **cv:** render the build payload to markdown with --markdown ([#4868](https://github.com/career-ops-hq/career-ops/issues/4868)) ([2dc4837](https://github.com/career-ops-hq/career-ops/commit/2dc4837cbad81cbdf480a5c36c5a662de3d5f465))
* **facts:** read German count claims in the fact gate ([#5074](https://github.com/career-ops-hq/career-ops/issues/5074)) ([e8e7794](https://github.com/career-ops-hq/career-ops/commit/e8e7794c03a333e1961504257068445b4c51db95))
* **followups:** let users turn off follow-ups ([#5164](https://github.com/career-ops-hq/career-ops/issues/5164)) ([0a388c8](https://github.com/career-ops-hq/career-ops/commit/0a388c87ab647140e10fe36a2db0c9ae3956ed97))
* **latex:** opt-in local LaTeX engine installer so the latex path compiles out of the box ([#5133](https://github.com/career-ops-hq/career-ops/issues/5133)) ([0137039](https://github.com/career-ops-hq/career-ops/commit/0137039fe217a111e251640ca1e312304fec238a))
* **liveness:** check the postings of open tracker rows ([#5177](https://github.com/career-ops-hq/career-ops/issues/5177)) ([93a9f47](https://github.com/career-ops-hq/career-ops/commit/93a9f477048b82712cabcd32c545e2fd35b90cba))
* **liveness:** discard expired Evaluated tracker rows ([#5241](https://github.com/career-ops-hq/career-ops/issues/5241)) ([c510bad](https://github.com/career-ops-hq/career-ops/commit/c510badd6f6a25d277f50f614d8cc95ed408afc2))
* **nix:** make the flake dev shell work on a fresh NixOS clone ([#5073](https://github.com/career-ops-hq/career-ops/issues/5073)) ([389995f](https://github.com/career-ops-hq/career-ops/commit/389995f7782eec91c7482544aa8a82992c05ff11))
* **oferta:** add Block G Signal 18, recruiter identity verification ([#5080](https://github.com/career-ops-hq/career-ops/issues/5080)) ([0ab7352](https://github.com/career-ops-hq/career-ops/commit/0ab73521d1bdff3df9f91f30d19e6911b8494cca))
* **oferta:** add the Verdict (lead) block the report contract has been missing ([#3960](https://github.com/career-ops-hq/career-ops/issues/3960)) ([a2213ab](https://github.com/career-ops-hq/career-ops/commit/a2213abc39483d125a2631d51bf9849b116439ae))
* **plugins:** expose aggregatorPostingId through ctx ([#5070](https://github.com/career-ops-hq/career-ops/issues/5070)) ([e5adfad](https://github.com/career-ops-hq/career-ops/commit/e5adfad4b5370305e5f4a753abab3e477b1cbc2e))
* **plugins:** register read-only workspace MCP plugin ([#5102](https://github.com/career-ops-hq/career-ops/issues/5102)) ([9d711dc](https://github.com/career-ops-hq/career-ops/commit/9d711dc83b0fdfc9825997999f44b1768f315c98))
* **portals:** Latin America and cybersecurity sections in the example ([#4858](https://github.com/career-ops-hq/career-ops/issues/4858)) ([93d4e52](https://github.com/career-ops-hq/career-ops/commit/93d4e527193d880a26ce7c65b658c6f916625272))
* **providers:** add google (first results page only, per robots.txt) ([#4078](https://github.com/career-ops-hq/career-ops/issues/4078)) ([c7f70e5](https://github.com/career-ops-hq/career-ops/commit/c7f70e56f5e87a77ea57f9d029f9c64b66163924))
* **providers:** add Kalibrr and Tech in Asia providers for SEA ([#4420](https://github.com/career-ops-hq/career-ops/issues/4420)) ([13d0e0c](https://github.com/career-ops-hq/career-ops/commit/13d0e0c3f7cc8c8eb017bbfe487d78cc47bcabdb))
* **providers:** add platsbanken — Sweden's national job board (JobTech Dev API) ([#5069](https://github.com/career-ops-hq/career-ops/issues/5069)) ([f170088](https://github.com/career-ops-hq/career-ops/commit/f170088cc76ea23fd1f0fec0f1e8e089ee206716))
* **providers:** allow CAREER_OPS_HTTP_TIMEOUT_MS to raise the fetch budget ([#4187](https://github.com/career-ops-hq/career-ops/issues/4187)) ([868a2a5](https://github.com/career-ops-hq/career-ops/commit/868a2a54a30b73b238d80d8b7dd9b04c850e11be))
* **providers:** ashby opt-in embed source for boards with the API disabled ([#4298](https://github.com/career-ops-hq/career-ops/issues/4298)) ([2310b0e](https://github.com/career-ops-hq/career-ops/commit/2310b0edd40ac09e5c1f6ba0e6a614112d7469df))
* **providers:** Personio language versions from the careers page ([#5044](https://github.com/career-ops-hq/career-ops/issues/5044)) ([c7e5ba5](https://github.com/career-ops-hq/career-ops/commit/c7e5ba59f01994a23cf0dcc70ea5832cb1e14f77))
* **providers:** recruitee reads requirements, publish date and salary ([#5260](https://github.com/career-ops-hq/career-ops/issues/5260)) ([76c53a0](https://github.com/career-ops-hq/career-ops/commit/76c53a0148928b588b880d57d36879d157f48926))
* **providers:** recruitee returns the language versions of its offers ([#5264](https://github.com/career-ops-hq/career-ops/issues/5264)) ([a0317de](https://github.com/career-ops-hq/career-ops/commit/a0317de3aad6b5c09b3ccf57cfbd5d55c607bf95))
* **reply-watch:** review local status proposals ([#4645](https://github.com/career-ops-hq/career-ops/issues/4645)) ([f9ae4a0](https://github.com/career-ops-hq/career-ops/commit/f9ae4a0dc81eccf3e6a8d5783eb5acf8ce14218b))
* **router:** rename the session after the posting once its JD is read ([#5303](https://github.com/career-ops-hq/career-ops/issues/5303)) ([#5305](https://github.com/career-ops-hq/career-ops/issues/5305)) ([4647bcf](https://github.com/career-ops-hq/career-ops/commit/4647bcfb04d22fa6bdfd98ff137f828844392c37))
* **scan:** language-aware URL dedup for language versions served at one URL ([#4789](https://github.com/career-ops-hq/career-ops/issues/4789)) ([66314d3](https://github.com/career-ops-hq/career-ops/commit/66314d3aebe16f3e94ef6a54d7e4ce71ce9e5ccc))
* **scan:** preferred_languages picks the language version of a posting the scan keeps ([#5285](https://github.com/career-ops-hq/career-ops/issues/5285)) ([ff09231](https://github.com/career-ops-hq/career-ops/commit/ff092313d33922d2341902c2a071550605d44ad6))
* **test-all:** run discovered suites in parallel with --jobs N ([#5076](https://github.com/career-ops-hq/career-ops/issues/5076)) ([#5077](https://github.com/career-ops-hq/career-ops/issues/5077)) ([0026e40](https://github.com/career-ops-hq/career-ops/commit/0026e40bead771ea9041f8c9e717fac71c74d401))
* **test-all:** run the inline sections alongside the discovered suites ([#5146](https://github.com/career-ops-hq/career-ops/issues/5146)) ([#5150](https://github.com/career-ops-hq/career-ops/issues/5150)) ([9a2f8d2](https://github.com/career-ops-hq/career-ops/commit/9a2f8d2c5e594cb99f19178adcfa87a4c6994daa))
* **upskill:** show the requirements behind your recent skips ([#5242](https://github.com/career-ops-hq/career-ops/issues/5242)) ([f541063](https://github.com/career-ops-hq/career-ops/commit/f54106321286e0af1331577c6858ed1c57d08065))
* **web:** add the cv studio edit model and api for tailored cvs ([#5232](https://github.com/career-ops-hq/career-ops/issues/5232)) ([1fcd8d1](https://github.com/career-ops-hq/career-ops/commit/1fcd8d1586fa506610c3bc6cf3fa4d7f90afb2c6))
* **web:** ATS keyword coverage on the report view ([#4579](https://github.com/career-ops-hq/career-ops/issues/4579)) ([886b834](https://github.com/career-ops-hq/career-ops/commit/886b834a9989e449587cf1ae9ae2ab39e50cab1e))
* **web:** company evidence card on the report (and fix the data root it reads from) ([#4581](https://github.com/career-ops-hq/career-ops/issues/4581)) ([bcfdcdc](https://github.com/career-ops-hq/career-ops/commit/bcfdcdcb37691a921e5c4a3bebb66366d16d3a1e))
* **web:** expand Analytics into progress and search stats ([#4310](https://github.com/career-ops-hq/career-ops/issues/4310)) ([6e0cd23](https://github.com/career-ops-hq/career-ops/commit/6e0cd23ac6b27faf22e39c16705e1da58316892e))
* **web:** recurring skill gaps on the CV page ([#4583](https://github.com/career-ops-hq/career-ops/issues/4583)) ([85fdac2](https://github.com/career-ops-hq/career-ops/commit/85fdac23d93ecb9e2c0246e03ffec5d0a52aeba3))
* **web:** show the posting url in the tracker view ([#5130](https://github.com/career-ops-hq/career-ops/issues/5130)) ([d79024c](https://github.com/career-ops-hq/career-ops/commit/d79024c32d7004c88db68d64da52047a3bfca960))


### Bug Fixes

* **analytics:** count only in-flight rows as active applications ([#5186](https://github.com/career-ops-hq/career-ops/issues/5186)) ([ed10c7a](https://github.com/career-ops-hq/career-ops/commit/ed10c7aaa391d8a1784830904515541b50b9d095))
* **answers:** preserve subsequent Markdown sections on update ([#5036](https://github.com/career-ops-hq/career-ops/issues/5036)) ([3b900f9](https://github.com/career-ops-hq/career-ops/commit/3b900f9cad67f0d56272c678c0bdaf3a0dbfe511))
* **archive:** recognize tracker-linked PDF and text captures ([#5041](https://github.com/career-ops-hq/career-ops/issues/5041)) ([0376995](https://github.com/career-ops-hq/career-ops/commit/03769950f2bc74b6fa7df0b42f497c1f635c62cc))
* **batch-runner:** stop when the report number reservation fails instead of launching a worker without one ([#5054](https://github.com/career-ops-hq/career-ops/issues/5054)) ([e978e0b](https://github.com/career-ops-hq/career-ops/commit/e978e0b52ef799f30e79c293f48d9f962d67d4e2))
* **batch:** detect worker reports without compgen ([#5068](https://github.com/career-ops-hq/career-ops/issues/5068)) ([e84972f](https://github.com/career-ops-hq/career-ops/commit/e84972f1a4d6aa041e5c6a8d256105bfa71588a3))
* **batch:** don't treat the report reservation sentinel as a worker artifact on an agency hold ([#4934](https://github.com/career-ops-hq/career-ops/issues/4934)) ([7c129af](https://github.com/career-ops-hq/career-ops/commit/7c129af2a003e5209588b7c7f4b9afc6b95d0a94)), closes [#4933](https://github.com/career-ops-hq/career-ops/issues/4933)
* **batch:** give node a Windows path for PROJECT_DIR under Git Bash ([#5051](https://github.com/career-ops-hq/career-ops/issues/5051)) ([83fe8be](https://github.com/career-ops-hq/career-ops/commit/83fe8bed87adbe6559852fe633ba337b80840e02)), closes [#4910](https://github.com/career-ops-hq/career-ops/issues/4910)
* **batch:** try fetch-jd.mjs before WebFetch when the prefetched JD file is empty ([#4246](https://github.com/career-ops-hq/career-ops/issues/4246)) ([2f1a548](https://github.com/career-ops-hq/career-ops/commit/2f1a548b419e1787142e600a058e76e547a5cbee))
* **cli:** --help was discarded, so the script ran instead ([#3998](https://github.com/career-ops-hq/career-ops/issues/3998)) ([f3357ef](https://github.com/career-ops-hq/career-ops/commit/f3357efe2701b0573d4132b9e8cc2e74a1c72605))
* **cli-flags:** reject empty value in --flag= form when requireOperand is set ([#5127](https://github.com/career-ops-hq/career-ops/issues/5127)) ([#5255](https://github.com/career-ops-hq/career-ops/issues/5255)) ([460a0ea](https://github.com/career-ops-hq/career-ops/commit/460a0eae5701f2257ae80b24376a2d3919d412a3))
* **cli:** handle help before exporting ATS text ([#5046](https://github.com/career-ops-hq/career-ops/issues/5046)) ([f28cd70](https://github.com/career-ops-hq/career-ops/commit/f28cd708aa3c680aa18e170fb67a2c083ce7de6b))
* **cli:** reject recognized short flags as missing operands ([#5086](https://github.com/career-ops-hq/career-ops/issues/5086)) ([b5d94b0](https://github.com/career-ops-hq/career-ops/commit/b5d94b03be9be501006c495ec0d565be61c68eab))
* **cli:** tracker.mjs delete runs for real when --dry-run is mistyped: validate each subcommand's flags ([#4630](https://github.com/career-ops-hq/career-ops/issues/4630)) ([03e9f5a](https://github.com/career-ops-hq/career-ops/commit/03e9f5a864063337334ab8cca72b20d612172633))
* **cli:** validate scan migration flags before accessing history ([#5047](https://github.com/career-ops-hq/career-ops/issues/5047)) ([2cae1cb](https://github.com/career-ops-hq/career-ops/commit/2cae1cb9f160b424a564f9195d72397c56bacdf8))
* **cli:** validate-portals.mjs rejects a mistyped flag and gains --help ([#4601](https://github.com/career-ops-hq/career-ops/issues/4601)) ([#4874](https://github.com/career-ops-hq/career-ops/issues/4874)) ([036df14](https://github.com/career-ops-hq/career-ops/commit/036df145619830c2c5da0507574fae20ff82a4eb))
* **company-funded:** discoverFundedCompanies takes opts.now, so its test no longer depends on today's date ([#5302](https://github.com/career-ops-hq/career-ops/issues/5302)) ([81f4c4e](https://github.com/career-ops-hq/career-ops/commit/81f4c4e5d226549edf34d930550e4e2c0a0c1c1c))
* **consider:** run the CSRF handshake through ctx.fetchResponse ([#4925](https://github.com/career-ops-hq/career-ops/issues/4925)) ([9b8e92d](https://github.com/career-ops-hq/career-ops/commit/9b8e92db1bc7889019b283cf6ad7cab5a74ab9d4))
* **contacts:** anchor the --vcf write guard to the data root, not the script directory ([#5265](https://github.com/career-ops-hq/career-ops/issues/5265)) ([38af581](https://github.com/career-ops-hq/career-ops/commit/38af58112cd1e7b2f23ba001e37f8a15f7524e9a))
* **cv-facts:** check the tools a dot, a second trigger, or a connector hid from the gate ([#5011](https://github.com/career-ops-hq/career-ops/issues/5011)) ([87f8771](https://github.com/career-ops-hq/career-ops/commit/87f8771929d0b9414395fa4ede67aecc4688612d))
* **cv-markdown:** boldLineText rejects a line holding several bold runs ([#5267](https://github.com/career-ops-hq/career-ops/issues/5267)) ([ac2a9ae](https://github.com/career-ops-hq/career-ops/commit/ac2a9ae5cf2b1f2c14d9e30338bf48d03d6c0ea6))
* **cv:** drop the summary block when the summary is empty ([#5021](https://github.com/career-ops-hq/career-ops/issues/5021)) ([8b5d677](https://github.com/career-ops-hq/career-ops/commit/8b5d677f99503802a5ba8aaa7fcf3d5ee439eb0a))
* **dashboard:** 0.0% rates in red before the user has applied to anything ([#4941](https://github.com/career-ops-hq/career-ops/issues/4941)) ([fe143cb](https://github.com/career-ops-hq/career-ops/commit/fe143cb5c46952f5cea7efc40e2b3b61d37dac38)), closes [#4940](https://github.com/career-ops-hq/career-ops/issues/4940)
* **dashboard:** a relative CAREER_OPS_ROOT resolved against cwd, so the dashboard could read a different tracker than the scripts write ([#4956](https://github.com/career-ops-hq/career-ops/issues/4956)) ([bd4ed43](https://github.com/career-ops-hq/career-ops/commit/bd4ed436bf53baf916bde502f2fb63712cc82289)), closes [#4955](https://github.com/career-ops-hq/career-ops/issues/4955)
* **dashboard:** an unreadable tracker was reported as a missing one, and broke the screen silently on reload ([#4939](https://github.com/career-ops-hq/career-ops/issues/4939)) ([5a24ce5](https://github.com/career-ops-hq/career-ops/commit/5a24ce5b936d0344ca253f8cdd450a8f47bde4ec)), closes [#4937](https://github.com/career-ops-hq/career-ops/issues/4937)
* **dashboard:** exclude cover letters from CV manifest lookups ([#4975](https://github.com/career-ops-hq/career-ops/issues/4975)) ([8879652](https://github.com/career-ops-hq/career-ops/commit/88796524c38c6fea0cf95382e635e78d20246c74))
* **dashboard:** read batch-input.tsv and batch-state.tsv from the checkout ([#5254](https://github.com/career-ops-hq/career-ops/issues/5254)) ([878228e](https://github.com/career-ops-hq/career-ops/commit/878228e3094f9b11624abae69497b95b4feeb532))
* **dashboard:** resolve every states.yml spelling the way Node does ([#4926](https://github.com/career-ops-hq/career-ops/issues/4926)) ([1416bf5](https://github.com/career-ops-hq/career-ops/commit/1416bf5f5b5a7bf06572ddb2153c83381189292b))
* **dashboard:** resolve PDF index from the tracker workspace ([#4974](https://github.com/career-ops-hq/career-ops/issues/4974)) ([73f38d6](https://github.com/career-ops-hq/career-ops/commit/73f38d607f44a874e46fee375acf9f80b9a20763))
* **dashboard:** run PDF generation from the code checkout ([#4973](https://github.com/career-ops-hq/career-ops/issues/4973)) ([1db6517](https://github.com/career-ops-hq/career-ops/commit/1db6517a0e8187bf5d4936073fb258faa3fb5c28))
* **dashboard:** the language key cannot reach Spanish, and strands a Spanish user in English ([#4944](https://github.com/career-ops-hq/career-ops/issues/4944)) ([163a5ee](https://github.com/career-ops-hq/career-ops/commit/163a5eeedff7ad3ada5757597509a57fe0d8ce45)), closes [#4943](https://github.com/career-ops-hq/career-ops/issues/4943)
* **data-root:** keep the code root and the data root apart in openrouter-runner and batch-runner ([#5116](https://github.com/career-ops-hq/career-ops/issues/5116)) ([0d67933](https://github.com/career-ops-hq/career-ops/commit/0d67933baae09a6c3a14c33bd2424cafb425c323)), closes [#5115](https://github.com/career-ops-hq/career-ops/issues/5115)
* **dedup-tracker:** keep rows whose requisition ids differ ([#4985](https://github.com/career-ops-hq/career-ops/issues/4985)) ([ce9da50](https://github.com/career-ops-hq/career-ops/commit/ce9da5093dde1d5834ae82eebf37641bcab5942c))
* **dedup-tracker:** rank every status through states.yml and stop when it cannot be read ([#5108](https://github.com/career-ops-hq/career-ops/issues/5108)) ([898c1ec](https://github.com/career-ops-hq/career-ops/commit/898c1ecb4c06b6abf14e3f8ecb87a353491066fa))
* **dedup-tracker:** rank status aliases like their canonical state so an Applied-or-later row is never removed ([#4986](https://github.com/career-ops-hq/career-ops/issues/4986)) ([ec288ad](https://github.com/career-ops-hq/career-ops/commit/ec288ad87a8b404b251f124b412ff90e79f87bc9))
* **dedup:** keep the removed repost's report link in the keeper notes ([#5185](https://github.com/career-ops-hq/career-ops/issues/5185)) ([ffb9b60](https://github.com/career-ops-hq/career-ops/commit/ffb9b602fa9febc3b3508c07af50db8f0e5982ea))
* **discover-ats:** keep portals.yml valid when --write adds companies ([#5053](https://github.com/career-ops-hq/career-ops/issues/5053)) ([f462465](https://github.com/career-ops-hq/career-ops/commit/f4624657259d73871c8587d7ccc3440a0859f582))
* **doctor:** detect the active CLI and user-level MCP config for OpenCode ([#5105](https://github.com/career-ops-hq/career-ops/issues/5105)) ([9695a8d](https://github.com/career-ops-hq/career-ops/commit/9695a8d72a357e79b313c303a7da09ad18d3b758))
* **doctor:** look for portals and pipeline where the scanner reads them ([#5166](https://github.com/career-ops-hq/career-ops/issues/5166)) ([42f42a8](https://github.com/career-ops-hq/career-ops/commit/42f42a8f914b3a039f5911a88f11937067112291))
* **doctor:** report a title_filter positive its own negatives veto ([#4882](https://github.com/career-ops-hq/career-ops/issues/4882)) ([2532155](https://github.com/career-ops-hq/career-ops/commit/253215598b893624f04e233f11ac9e778282d93b)), closes [#4873](https://github.com/career-ops-hq/career-ops/issues/4873)
* **doctor:** say setup is not finished when user files are missing ([#5170](https://github.com/career-ops-hq/career-ops/issues/5170)) ([0ece057](https://github.com/career-ops-hq/career-ops/commit/0ece0576b6687a2909f0840f9473ca7ae797d692))
* **doctor:** warn when a CLI skill entrypoint is a symlink-target stub ([#4589](https://github.com/career-ops-hq/career-ops/issues/4589)) ([#4734](https://github.com/career-ops-hq/career-ops/issues/4734)) ([ae72f5b](https://github.com/career-ops-hq/career-ops/commit/ae72f5b1d5d22658f18cbcd5c256d94e7871e6f6))
* **eval:** preserve candidate source-of-truth rules during compression ([#5033](https://github.com/career-ops-hq/career-ops/issues/5033)) ([d0b73f2](https://github.com/career-ops-hq/career-ops/commit/d0b73f24df9baea4c4034861ad33040f76729b2e))
* **extract:** read the content root with the most rendered text, not the first ([#4905](https://github.com/career-ops-hq/career-ops/issues/4905)) ([b54c484](https://github.com/career-ops-hq/career-ops/commit/b54c484e592bba35dcd399629e7a60d44312d36b))
* **fact-gate:** extend German count nouns, pin remaining coverage gap ([#5125](https://github.com/career-ops-hq/career-ops/issues/5125)) ([#5148](https://github.com/career-ops-hq/career-ops/issues/5148)) ([6825c88](https://github.com/career-ops-hq/career-ops/commit/6825c88adb62add1e4f35fb48cdcc43874b8765e))
* **followup-seed:** bind the JSON error contract to makeCliFailWith ([#5225](https://github.com/career-ops-hq/career-ops/issues/5225)) ([1ac4e97](https://github.com/career-ops-hq/career-ops/commit/1ac4e97377f26581e53ed3cb7db5a3428258f55c))
* **followups:** canonicalize follow-up lock paths ([#5002](https://github.com/career-ops-hq/career-ops/issues/5002)) ([e58dff2](https://github.com/career-ops-hq/career-ops/commit/e58dff2c92f4a6e019dd1145b47e6c615992dd8b))
* **followups:** honor legacy history when seeding ([#5003](https://github.com/career-ops-hq/career-ops/issues/5003)) ([b30abd7](https://github.com/career-ops-hq/career-ops/commit/b30abd71de35a7ead14c428cb61e78cf59341b26))
* **followups:** reject malformed cadence integers ([#4971](https://github.com/career-ops-hq/career-ops/issues/4971)) ([2cebe96](https://github.com/career-ops-hq/career-ops/commit/2cebe963eaea8187db78a0ef636cdf6186c74da6))
* **followups:** treat an empty tracker as a first run, not a failure ([#5168](https://github.com/career-ops-hq/career-ops/issues/5168)) ([c2abeec](https://github.com/career-ops-hq/career-ops/commit/c2abeec33a4b80e67ed64e1c5c393321d87fe268))
* **generate-pdf:** take the pipeline lock and write atomically when updating pdf-index.tsv ([#4987](https://github.com/career-ops-hq/career-ops/issues/4987)) ([3d8fae9](https://github.com/career-ops-hq/career-ops/commit/3d8fae9db664d40ca51407e789bbfd9606d3bf42))
* **github:** point CODEOWNERS and copilot-instructions at paths that exist ([#5061](https://github.com/career-ops-hq/career-ops/issues/5061)) ([1407b74](https://github.com/career-ops-hq/career-ops/commit/1407b7470d063a46be58b8df2357ff6c60982c31)), closes [#5058](https://github.com/career-ops-hq/career-ops/issues/5058)
* **gitignore:** keep nested user data ignored ([#4945](https://github.com/career-ops-hq/career-ops/issues/4945)) ([1bcfeb5](https://github.com/career-ops-hq/career-ops/commit/1bcfeb53c36ad0bf728b7b775cdbf304ddc5345e))
* **gmail:** trust only Gmail's own DMARC verdict, decode quoted-printable parts ([#3873](https://github.com/career-ops-hq/career-ops/issues/3873)) ([080a236](https://github.com/career-ops-hq/career-ops/commit/080a236d7517759ec5976d5cc5cbc67492bdd75d)), closes [#3731](https://github.com/career-ops-hq/career-ops/issues/3731)
* **invites:** match complete requisition IDs ([#4976](https://github.com/career-ops-hq/career-ops/issues/4976)) ([af9897b](https://github.com/career-ops-hq/career-ops/commit/af9897b13e320536acb71debcaa0cc562167d6fe))
* **jd-skill-gap:** keep multi-word skills whole and flag unread Chinese requirements ([#5294](https://github.com/career-ops-hq/career-ops/issues/5294)) ([1edbbec](https://github.com/career-ops-hq/career-ops/commit/1edbbec1a83f032f28b7201207b15c4cf8405c12)), closes [#5292](https://github.com/career-ops-hq/career-ops/issues/5292)
* **jd-skill-gap:** match Simplified Chinese requirement headings ([#5032](https://github.com/career-ops-hq/career-ops/issues/5032)) ([a600dc9](https://github.com/career-ops-hq/career-ops/commit/a600dc92c8851c3eee00e6de358d71eb057ee7cc))
* **keyword-match:** score the archived JD when a report has no keyword section ([#5282](https://github.com/career-ops-hq/career-ops/issues/5282)) ([9e01ac6](https://github.com/career-ops-hq/career-ops/commit/9e01ac6e1aae00bb65e98abcc93849bbc703e91a))
* **liveness-api:** resolve Ashby postings whose org slug contains a space ([#5020](https://github.com/career-ops-hq/career-ops/issues/5020)) ([84eceef](https://github.com/career-ops-hq/career-ops/commit/84eceefb63b10fc9a45378713a1f5eac974b7824)), closes [#5018](https://github.com/career-ops-hq/career-ops/issues/5018)
* **liveness:** a DNS failure on the posting's own host no longer drops it for good ([#5075](https://github.com/career-ops-hq/career-ops/issues/5075)) ([b7d9fbe](https://github.com/career-ops-hq/career-ops/commit/b7d9fbe700087e1593a53f38ccf7436151d089dc))
* **liveness:** a failed browser launch no longer ends the batch ([#5111](https://github.com/career-ops-hq/career-ops/issues/5111)) ([6b51ed4](https://github.com/career-ops-hq/career-ops/commit/6b51ed4f51d17c310d27bd857366f0ea51988cb6))
* **liveness:** a failed page load no longer fails every check after it ([#5299](https://github.com/career-ops-hq/career-ops/issues/5299)) ([15a13bf](https://github.com/career-ops-hq/career-ops/commit/15a13bffc2606d576fa26829324621e52e57b1f6))
* **liveness:** a page still empty when the poll ends is uncertain, not expired ([#4927](https://github.com/career-ops-hq/career-ops/issues/4927)) ([3613707](https://github.com/career-ops-hq/career-ops/commit/36137074767443efc1698c101221838bc481e719))
* **liveness:** a tracker blocked by a DNS filter no longer drops the posting ([#5015](https://github.com/career-ops-hq/career-ops/issues/5015)) ([64e7b3b](https://github.com/career-ops-hq/career-ops/commit/64e7b3b8775d58bfaf268a2b122ed67f99536bf1))
* **liveness:** add the Workable API rung ([#5110](https://github.com/career-ops-hq/career-ops/issues/5110)) ([5dd1e1a](https://github.com/career-ops-hq/career-ops/commit/5dd1e1abdbe053235157f89e68e3bbbcf9533c5b))
* **liveness:** expire cached DNS failures ([#4972](https://github.com/career-ops-hq/career-ops/issues/4972)) ([e48dabd](https://github.com/career-ops-hq/career-ops/commit/e48dabd90d959f465aa7696e1029199789c91d4e))
* **liveness:** keep npm packages out of what the web loads from liveness-browser ([#5251](https://github.com/career-ops-hq/career-ops/issues/5251)) ([d2ab42c](https://github.com/career-ops-hq/career-ops/commit/d2ab42c85fcf2adb084dd70bc15838aff05ccfa1))
* **liveness:** read custom-element buttons, so live UltiPro postings are not dropped ([#4928](https://github.com/career-ops-hq/career-ops/issues/4928)) ([8ef009b](https://github.com/career-ops-hq/career-ops/commit/8ef009b70811c6667ed5a6c14cae942ec1fdd31d))
* **liveness:** read Dutch Apply buttons, so live VDAB and Recruitee postings are not dropped ([#5244](https://github.com/career-ops-hq/career-ops/issues/5244)) ([6caf821](https://github.com/career-ops-hq/career-ops/commit/6caf821f1b852f27a63b297484617784c47b8b2a))
* **liveness:** read the 'can't view this job' closure sentence as expired ([#5112](https://github.com/career-ops-hq/career-ops/issues/5112)) ([753bd08](https://github.com/career-ops-hq/career-ops/commit/753bd080e2aa9dcb82dfc0ed20d82c418eca8c69))
* **modes:** select the row by report id when marking an application applied ([#5204](https://github.com/career-ops-hq/career-ops/issues/5204)) ([5397072](https://github.com/career-ops-hq/career-ops/commit/539707287ed967a531c1385d8964a4522655234d))
* **openai-eval:** pass modes/_profile.md to buildBudgetedPrompt ([#5202](https://github.com/career-ops-hq/career-ops/issues/5202)) ([7e3eabb](https://github.com/career-ops-hq/career-ops/commit/7e3eabbb2f2b33e77ebc33dd91d99c1a4c32479b))
* **openrouter:** reset a model's 429 count when it answers, so only consecutive 429s blacklist it ([#4913](https://github.com/career-ops-hq/career-ops/issues/4913)) ([e46e656](https://github.com/career-ops-hq/career-ops/commit/e46e656d1a0f8f76a93ab210c2561e65dbd62735))
* **paste-reply:** serialize concurrent appends so no reply candidate is dropped ([#4922](https://github.com/career-ops-hq/career-ops/issues/4922)) ([34beb13](https://github.com/career-ops-hq/career-ops/commit/34beb1360dfe5c87f15f83790e656bb0f84ed035))
* **pdf:** keep the catalan l·l intact when normalizing cv text ([#5165](https://github.com/career-ops-hq/career-ops/issues/5165)) ([ce2d0f3](https://github.com/career-ops-hq/career-ops/commit/ce2d0f3f7f2ee73cf9f6f64d82ed95faa9819cb5))
* **pdf:** pass the image decode timeout as options ([#4977](https://github.com/career-ops-hq/career-ops/issues/4977)) ([441c652](https://github.com/career-ops-hq/career-ops/commit/441c652b1e2fc0ee06d6975796e5c7b9e5faf529))
* **pdf:** read a local candidate.photo path only when config/profile.yml names it ([#5094](https://github.com/career-ops-hq/career-ops/issues/5094)) ([#5143](https://github.com/career-ops-hq/career-ops/issues/5143)) ([88d6e2f](https://github.com/career-ops-hq/career-ops/commit/88d6e2fbcc0e734752648835a104537549c0da8e))
* **pdf:** run the fact gate on every --batch manifest entry ([#5060](https://github.com/career-ops-hq/career-ops/issues/5060)) ([e90f50b](https://github.com/career-ops-hq/career-ops/commit/e90f50b39eb2b6ca91814d73b97c489e18b3f44d)), closes [#5057](https://github.com/career-ops-hq/career-ops/issues/5057)
* **plugins:** avoid duplicate localhost in capability card ([#4997](https://github.com/career-ops-hq/career-ops/issues/4997)) ([ae21138](https://github.com/career-ops-hq/career-ops/commit/ae211382110743ee1ca7dff108fb737edf9c58ec))
* **plugins:** collapse one posting's urls at ingest with postingKey ([#5236](https://github.com/career-ops-hq/career-ops/issues/5236)) ([ebf36d0](https://github.com/career-ops-hq/career-ops/commit/ebf36d06905621c15d4ef2d9b1019709b8b6a12e))
* **plugins:** explain a drifted local plugin in the tamper warning ([#5027](https://github.com/career-ops-hq/career-ops/issues/5027)) ([#5028](https://github.com/career-ops-hq/career-ops/issues/5028)) ([04d3afc](https://github.com/career-ops-hq/career-ops/commit/04d3afc41fd7fe884d4091ea34b29a9f0200f809))
* **plugins:** pass the data root to plugins through ctx, so gmail and apify write under it ([#5139](https://github.com/career-ops-hq/career-ops/issues/5139)) ([d4cbcc3](https://github.com/career-ops-hq/career-ops/commit/d4cbcc31a8f3e460a00c80999d1464a32ed8a20f)), closes [#5138](https://github.com/career-ops-hq/career-ops/issues/5138)
* **portals:** point moved example boards at their new ATS and disable dead ones ([#5224](https://github.com/career-ops-hq/career-ops/issues/5224)) ([6caec73](https://github.com/career-ops-hq/career-ops/commit/6caec73abd8e66d7a92fc26cdfc3dc9da13ec71e))
* **providers/lever:** filter on the full posting text, not the intro ([#4932](https://github.com/career-ops-hq/career-ops/issues/4932)) ([7e0a3d0](https://github.com/career-ops-hq/career-ops/commit/7e0a3d0babbb5ed5eeb599cd7dac8708866fdd13))
* **providers:** raise zh-CN page caps to 100 and warn on truncation ([#5246](https://github.com/career-ops-hq/career-ops/issues/5246)) ([db0410d](https://github.com/career-ops-hq/career-ops/commit/db0410dda10d7c20ee29ed3266650f36234efd48))
* **providers:** retire torre, search API rejects every request with HTTP 400 ([#4871](https://github.com/career-ops-hq/career-ops/issues/4871)) ([9570926](https://github.com/career-ops-hq/career-ops/commit/95709261abfd3679b7cbc91f53f6e486d41cffa7))
* **rank:** bind batch scores to original row occurrences ([#4970](https://github.com/career-ops-hq/career-ops/issues/4970)) ([2bbd662](https://github.com/career-ops-hq/career-ops/commit/2bbd6628085f00f753478509876af0a3d659dd92))
* **rank:** forward model selection to Codex and OpenCode ([#4969](https://github.com/career-ops-hq/career-ops/issues/4969)) ([bff0474](https://github.com/career-ops-hq/career-ops/commit/bff047456b4194ca5458df70e9aa48c6c8c996df))
* **rank:** prefer the CAREER_OPS_CLI agent over auto-detection ([#5226](https://github.com/career-ops-hq/career-ops/issues/5226)) ([5af4f57](https://github.com/career-ops-hq/career-ops/commit/5af4f573d49245d5ffe15220479219aa181b698d))
* **rank:** show why the cli failed without echoing the prompt ([#5175](https://github.com/career-ops-hq/career-ops/issues/5175)) ([60ee16f](https://github.com/career-ops-hq/career-ops/commit/60ee16f6849d601cd68634be287f6205c8ff3eb1))
* **reconcile:** read batch state from the code checkout ([#5005](https://github.com/career-ops-hq/career-ops/issues/5005)) ([ccd864b](https://github.com/career-ops-hq/career-ops/commit/ccd864b345e03d8694c1cfeeed7cf57be52cf0fc))
* **reply-watch:** bind legacy review consent to unchanged tracker identities ([#5034](https://github.com/career-ops-hq/career-ops/issues/5034)) ([3460748](https://github.com/career-ops-hq/career-ops/commit/3460748ae13f43f81c859e4b763b7d0f4a20921a))
* **repo:** renormalize tests/upskill-known-skills.test.mjs to LF ([#5301](https://github.com/career-ops-hq/career-ops/issues/5301)) ([ab47db6](https://github.com/career-ops-hq/career-ops/commit/ab47db6b6a47fd4db6d77f8627d863b8a4885426))
* **reserve-report-num:** reject unrecognized arguments instead of reserving a number ([#4914](https://github.com/career-ops-hq/career-ops/issues/4914)) ([2e2db29](https://github.com/career-ops-hq/career-ops/commit/2e2db29b583f28e64de479e7a18e7b4fb565f4b7))
* **role-matcher:** keep sibling requisitions apart when each title has a content word the other lacks ([#5266](https://github.com/career-ops-hq/career-ops/issues/5266)) ([11d2c1c](https://github.com/career-ops-hq/career-ops/commit/11d2c1cb5fac1488d37d1321a8874b6926e75fdc))
* **scaffolder:** the usage text names the published package ([#4938](https://github.com/career-ops-hq/career-ops/issues/4938)) ([c40cfd0](https://github.com/career-ops-hq/career-ops/commit/c40cfd03d5ff7076d5e8ac42fba1b94a00854674))
* **scan-ats-full:** a later-page iCIMS failure is not a dead-board miss ([#5045](https://github.com/career-ops-hq/career-ops/issues/5045)) ([fec9e6c](https://github.com/career-ops-hq/career-ops/commit/fec9e6c9facb9ec554ba13f9b8d9338db1b64ef1))
* **scan-ats-full:** refuse --resume when a portals.yml filter changed since the checkpoint ([#5084](https://github.com/career-ops-hq/career-ops/issues/5084)) ([0b7e8bc](https://github.com/career-ops-hq/career-ops/commit/0b7e8bc8125665fb94848b2595b4225feec29c60))
* **scan-ats-full:** release each board's connections in per-tenant-host stages ([#4841](https://github.com/career-ops-hq/career-ops/issues/4841)) ([b03db0a](https://github.com/career-ops-hq/career-ops/commit/b03db0a4b47ec81f7f08cf19cb37c35f6afc7952))
* **scan-hn:** fail on an unparseable portals.yml instead of scanning with the default keyword ([#4921](https://github.com/career-ops-hq/career-ops/issues/4921)) ([#4923](https://github.com/career-ops-hq/career-ops/issues/4923)) ([e44aae6](https://github.com/career-ops-hq/career-ops/commit/e44aae6c25e3a6f996d7c20823bab0b0b260669f))
* **scan-hn:** look postings up in the seen set by their normalized URL ([#5324](https://github.com/career-ops-hq/career-ops/issues/5324)) ([6205e85](https://github.com/career-ops-hq/career-ops/commit/6205e8563be586a968e13be1d5d85fceb45b25ca))
* **scan:** collapse whitespace before matching title keywords ([#5161](https://github.com/career-ops-hq/career-ops/issues/5161)) ([a7fcd6d](https://github.com/career-ops-hq/career-ops/commit/a7fcd6d17ae9dbc93782e4a0bfc6b60dad92f3ea))
* **scan:** reject softgarden and csb dates past the end of the month ([#5206](https://github.com/career-ops-hq/career-ops/issues/5206)) ([5fe1c8a](https://github.com/career-ops-hq/career-ops/commit/5fe1c8a0205a1aac238722d75c09c8d4c85566ec))
* **scan:** stop reading a trailing country code as a us state ([#5159](https://github.com/career-ops-hq/career-ops/issues/5159)) ([fa5d18f](https://github.com/career-ops-hq/career-ops/commit/fa5d18f25913408f8d4debfc8a778146b2a57953))
* **scan:** strip trailing gender tags from the role dedup key ([#5190](https://github.com/career-ops-hq/career-ops/issues/5190)) ([9e0cbb1](https://github.com/career-ops-hq/career-ops/commit/9e0cbb1f979c44931c705f0032e957d7f59e83cd))
* **set-status:** anchor the first follow-up on the apply day, not the evaluation date ([#5192](https://github.com/career-ops-hq/career-ops/issues/5192)) ([08ad070](https://github.com/career-ops-hq/career-ops/commit/08ad0708eb2b3a106e19e098f69604bcab2b8c0f))
* **skill-gap:** read a requirements list written on the header line ([#5173](https://github.com/career-ops-hq/career-ops/issues/5173)) ([b5a3a47](https://github.com/career-ops-hq/career-ops/commit/b5a3a47ef7703e21974734525edc375639e8613a))
* **skill-gap:** read Competencies headings as a skills section ([#5281](https://github.com/career-ops-hq/career-ops/issues/5281)) ([4c27d89](https://github.com/career-ops-hq/career-ops/commit/4c27d895c64f8662f65df703134fd0794a88c88e))
* **skill-gap:** read requirements copied without list markers ([#5280](https://github.com/career-ops-hq/career-ops/issues/5280)) ([aefe68c](https://github.com/career-ops-hq/career-ops/commit/aefe68cc7ec91640eefeb3dc86ab8162091bf0e0))
* **smartrecruiters:** keep special characters inside fallback posting IDs ([#5321](https://github.com/career-ops-hq/career-ops/issues/5321)) ([31daebb](https://github.com/career-ops-hq/career-ops/commit/31daebb11cc56d97e85ecfd3d740d0f9aa12e25d))
* **stats:** read transition history beside the selected tracker ([#5035](https://github.com/career-ops-hq/career-ops/issues/5035)) ([05cc706](https://github.com/career-ops-hq/career-ops/commit/05cc7067e1ab09bd4f90fcd2be5bb0d5667038cf))
* **successfactors:** page csb boards by date and resweep when short ([#5189](https://github.com/career-ops-hq/career-ops/issues/5189)) ([44b5a50](https://github.com/career-ops-hq/career-ops/commit/44b5a507511c24d8995ba21be24a62aeb9b44523))
* **successfactors:** read csb posting dates in the query locale order ([#5191](https://github.com/career-ops-hq/career-ops/issues/5191)) ([5ce8b74](https://github.com/career-ops-hq/career-ops/commit/5ce8b74f02ce81bc2623ad75469f9427d3af707a))
* **sync-pdf-flags:** set the PDF flag only while the CV PDF is on disk ([#4777](https://github.com/career-ops-hq/career-ops/issues/4777)) ([#4565](https://github.com/career-ops-hq/career-ops/issues/4565)) ([11ad8db](https://github.com/career-ops-hq/career-ops/commit/11ad8db7d90b0e5493c6969cfcf0218cd67ecccf))
* **test-harness:** link the dependency tree a worktree inherits, in both suites ([#5055](https://github.com/career-ops-hq/career-ops/issues/5055)) ([b528fe5](https://github.com/career-ops-hq/career-ops/commit/b528fe59fc139769d22f537b2dd25012d263ad76))
* **test-harness:** run the suite against a scratch data root and guard the real one ([#5137](https://github.com/career-ops-hq/career-ops/issues/5137)) ([2bebe32](https://github.com/career-ops-hq/career-ops/commit/2bebe32826d6f504652fb473c22e4df7124972a3))
* **tests:** grade tracked CLIs only in help-flag-handled, not plugins.local/ ([#5307](https://github.com/career-ops-hq/career-ops/issues/5307)) ([#5308](https://github.com/career-ops-hq/career-ops/issues/5308)) ([68ab94f](https://github.com/career-ops-hq/career-ops/commit/68ab94f06ca52c1a2caed642e185a7c696acf57a))
* **tracker:** a language param on one URL is not proof of two postings ([#5283](https://github.com/career-ops-hq/career-ops/issues/5283)) ([cd2e05b](https://github.com/career-ops-hq/career-ops/commit/cd2e05bc12f8acac657175b2ffc994ee20bf9a6e))
* **tracker:** delete backs the tracker up before removing a row ([#5066](https://github.com/career-ops-hq/career-ops/issues/5066)) ([3ef8930](https://github.com/career-ops-hq/career-ops/commit/3ef8930693fa51f3a6d3b898dee27e60dfbaf12d)), closes [#5064](https://github.com/career-ops-hq/career-ops/issues/5064)
* **tracker:** keep the pdf check when a re-eval's prior pdf is still on disk ([#5128](https://github.com/career-ops-hq/career-ops/issues/5128)) ([d204b1e](https://github.com/career-ops-hq/career-ops/commit/d204b1ecd0b8086c243de6f04dbeaa0775ff0f7a))
* **tracker:** read a decimal-comma score instead of truncating it ([#5199](https://github.com/career-ops-hq/career-ops/issues/5199)) ([bd4fa7c](https://github.com/career-ops-hq/career-ops/commit/bd4fa7c8e7fdbe24c5b68e563b2d45c30363950b))
* **tracker:** read decimal-comma scores in merge and dedup ([#5208](https://github.com/career-ops-hq/career-ops/issues/5208)) ([6e47ae1](https://github.com/career-ops-hq/career-ops/commit/6e47ae13e724196172084e324a04fd95156f169e))
* **tracker:** resolve status aliases through states.yml in analyze-patterns and tracker-sync-check ([#5065](https://github.com/career-ops-hq/career-ops/issues/5065)) ([1ad52da](https://github.com/career-ops-hq/career-ops/commit/1ad52da6ba47c4782a565ecaaedc8dd79112a75f)), closes [#5063](https://github.com/career-ops-hq/career-ops/issues/5063)
* **update-system:** make apply() verify the target it is about to install ([#3805](https://github.com/career-ops-hq/career-ops/issues/3805)) ([74c6226](https://github.com/career-ops-hq/career-ops/commit/74c6226cc1370722bb76024ccc9f1af26fecf9b9))
* **update-system:** read the profile directly when a cv-templates import is missing ([#5043](https://github.com/career-ops-hq/career-ops/issues/5043)) ([f4840b7](https://github.com/career-ops-hq/career-ops/commit/f4840b7d4810b905ad2c61cd40a3f1f203bc2e42))
* **update-system:** rollback reads the failed update's own target manifest ([#3782](https://github.com/career-ops-hq/career-ops/issues/3782)) ([9ce2bcd](https://github.com/career-ops-hq/career-ops/commit/9ce2bcde33694689a994053c01ce9de32c6c962a))
* **updater:** skip unpaired backups on rollback ([#5135](https://github.com/career-ops-hq/career-ops/issues/5135)) ([#5256](https://github.com/career-ops-hq/career-ops/issues/5256)) ([77027cc](https://github.com/career-ops-hq/career-ops/commit/77027cc5cb22f588ecba56a4d834afa58c8695ae))
* **updater:** walk REEXEC_FALLBACK_FILES' own imports in the self-reexec checkout ([#5001](https://github.com/career-ops-hq/career-ops/issues/5001)) ([4b81bc5](https://github.com/career-ops-hq/career-ops/commit/4b81bc52b3de4b0bbd0ce7fb6367c6e8aac4465c)), closes [#4999](https://github.com/career-ops-hq/career-ops/issues/4999)
* **validate-portals:** accept title_filter_full keys in by_title_keyword ([#4931](https://github.com/career-ops-hq/career-ops/issues/4931)) ([5e96f22](https://github.com/career-ops-hq/career-ops/commit/5e96f22dc6f979ee4d6f76aa47c0e8cdc4b5aa39))
* **verify-ats:** read a white declaration with CSS whitespace ([#4924](https://github.com/career-ops-hq/career-ops/issues/4924)) ([0709815](https://github.com/career-ops-hq/career-ops/commit/0709815a51a8a4e8f7fd5863da7a1215207e2f95))
* **verify-cv-facts:** check tool names after a leading "a" or "an" ([#5085](https://github.com/career-ops-hq/career-ops/issues/5085)) ([2cda069](https://github.com/career-ops-hq/career-ops/commit/2cda069c9b60e1c5c68fe939bb3aa9be0879b278)), closes [#5023](https://github.com/career-ops-hq/career-ops/issues/5023)
* **verify-cv-facts:** normalize tool fragments instead of dropping them ([#5030](https://github.com/career-ops-hq/career-ops/issues/5030)) ([5f17799](https://github.com/career-ops-hq/career-ops/commit/5f17799f3cb6f1fc111b7bcec23df28d84c4369d))
* **verify-cv-facts:** treat a bare "building" as prose, pin the [#4394](https://github.com/career-ops-hq/career-ops/issues/4394) limits ([#4395](https://github.com/career-ops-hq/career-ops/issues/4395)) ([4f5df07](https://github.com/career-ops-hq/career-ops/commit/4f5df07b9e0aaeaa272166b93d805a17f5abfee8))
* **web:** deny Write/Bash when evaluating untrusted JDs ([#3629](https://github.com/career-ops-hq/career-ops/issues/3629)) ([a98717e](https://github.com/career-ops-hq/career-ops/commit/a98717ebaa75ace696db58cc7e77e94f9c8c856a))
* **web:** preserve company evidence scope and source certainty ([#5007](https://github.com/career-ops-hq/career-ops/issues/5007)) ([33c927c](https://github.com/career-ops-hq/career-ops/commit/33c927ca63fb4aea1e3f924444a74f0e3c3bc244))
* **web:** reject private URLs in Apply session ([#3627](https://github.com/career-ops-hq/career-ops/issues/3627)) ([3444fdd](https://github.com/career-ops-hq/career-ops/commit/3444fddf20307e7f7ef15c42493871594a12c719))


### Performance Improvements

* **batch:** run 3 claude workers by default and drop to 1 after a rate limit ([#5237](https://github.com/career-ops-hq/career-ops/issues/5237)) ([444ba28](https://github.com/career-ops-hq/career-ops/commit/444ba28d08dfa7f3f8be86fac24d6dea7ac0beba))
* **modes:** load block g signals 8 to 17 only when their trigger holds ([#5229](https://github.com/career-ops-hq/career-ops/issues/5229)) ([915ee56](https://github.com/career-ops-hq/career-ops/commit/915ee567ce4828daeea980b5c23de7894e135cb1))
* **scan-ats-full:** rule Greenhouse boards out from a body-less listing first ([#4850](https://github.com/career-ops-hq/career-ops/issues/4850)) ([3985818](https://github.com/career-ops-hq/career-ops/commit/3985818f52b6b524b3a538c3124672509c9c3518))
* **scan:** fetch feishu job pages four at a time ([#5174](https://github.com/career-ops-hq/career-ops/issues/5174)) ([e4fae2c](https://github.com/career-ops-hq/career-ops/commit/e4fae2cd13cd61389d1fe251c4ee61818e35e52c))
* **test-all:** check syntax in one process instead of one per file ([#5078](https://github.com/career-ops-hq/career-ops/issues/5078)) ([#5147](https://github.com/career-ops-hq/career-ops/issues/5147)) ([206e5f2](https://github.com/career-ops-hq/career-ops/commit/206e5f2852095499dd88b3dd19038010a61f7899))

## [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](https://github.com/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/&lt;Category&gt;/&lt;id&gt;/ 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))

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


### Features

* add Hermes Agent headless CLI support ([#4623](https://github.com/career-ops-hq/career-ops/issues/4623)) ([a6b867a](https://github.com/career-ops-hq/career-ops/commit/a6b867adbc634cb61cc103ac8af350932878baf3))
* add reviewed master career profile import ([#4456](https://github.com/career-ops-hq/career-ops/issues/4456)) ([221880c](https://github.com/career-ops-hq/career-ops/commit/221880c60db9efcd2b1c5ff40933534a5d03b8d3))
* **cli:** register Pi as a supported CLI host ([#4157](https://github.com/career-ops-hq/career-ops/issues/4157)) ([#4157](https://github.com/career-ops-hq/career-ops/issues/4157)) ([74c5d17](https://github.com/career-ops-hq/career-ops/commit/74c5d178a631540a9966122fef29db02b28918dc))
* **cv:** optional professional-title headline slot under the name ([#3763](https://github.com/career-ops-hq/career-ops/issues/3763)) ([c95d62c](https://github.com/career-ops-hq/career-ops/commit/c95d62c97160d49ead74ab8bf934a5c26c10f266))
* **dashboard:** add posted-date sort mode ([#3648](https://github.com/career-ops-hq/career-ops/issues/3648)) ([c952926](https://github.com/career-ops-hq/career-ops/commit/c952926eb746f5c6f8d611116df9ed584224a96d))
* **explorer:** free banded title-vs-profile fit hint on discovery cards ([#3261](https://github.com/career-ops-hq/career-ops/issues/3261)) ([b080539](https://github.com/career-ops-hq/career-ops/commit/b0805395cc8d462bc9a6a36c0b2ea8921c522e50))
* **local-parser:** pass an optional postedAt through ([#4057](https://github.com/career-ops-hq/career-ops/issues/4057)) ([ac5db3a](https://github.com/career-ops-hq/career-ops/commit/ac5db3a65ca135d695e926da39abfb19384f2d38))
* **oferta:** opt-in Brazil PcD-quota check (Lei 8.213/91) as a Block A signal ([#2779](https://github.com/career-ops-hq/career-ops/issues/2779)) ([da8abc3](https://github.com/career-ops-hq/career-ops/commit/da8abc3ae167641c6890f12c4504e684ca19fcfb))
* **patterns:** report predicted discard reasons separately ([#4110](https://github.com/career-ops-hq/career-ops/issues/4110)) ([3342f9d](https://github.com/career-ops-hq/career-ops/commit/3342f9dcf635a2269b1857f12b07f05574eebb45))
* **pdf:** add optional `context` line to CV experience entries ([#4049](https://github.com/career-ops-hq/career-ops/issues/4049)) ([5fde93e](https://github.com/career-ops-hq/career-ops/commit/5fde93e31013921585d92c26c8550739bf8c36ea))
* **pdf:** guard CV work experience against non-chronological order ([#4489](https://github.com/career-ops-hq/career-ops/issues/4489)) ([b069f62](https://github.com/career-ops-hq/career-ops/commit/b069f629f77570eb758bff6fe7379e95b979460e))
* **plugins:** expose the canonical posting-URL key through ctx ([#4332](https://github.com/career-ops-hq/career-ops/issues/4332)) ([ac2696e](https://github.com/career-ops-hq/career-ops/commit/ac2696e01f40e7a771f2605b382c573667d8a8a0)), closes [#4218](https://github.com/career-ops-hq/career-ops/issues/4218)
* **providers:** add applitrack, neogov, redrover and schoolspring for K-12 and college boards ([#4360](https://github.com/career-ops-hq/career-ops/issues/4360)) ([0d3d669](https://github.com/career-ops-hq/career-ops/commit/0d3d669342da1143fa7a665c99e956ccd717f52a))
* **providers:** add BambooHR as a 6th scan:full source ([#4365](https://github.com/career-ops-hq/career-ops/issues/4365)) ([2ef2184](https://github.com/career-ops-hq/career-ops/commit/2ef21846ccfa683519faae2bad1d14b53c5ddb14))
* **providers:** add HiringRoom provider (legacy /jobs and JSON-LD /portal/jobs) ([#4460](https://github.com/career-ops-hq/career-ops/issues/4460)) ([c7e5648](https://github.com/career-ops-hq/career-ops/commit/c7e5648eb3bf19f13b6886c060c220ca2030fc90))
* **providers:** OCC Mundial — Mexico's dominant job board ([#3748](https://github.com/career-ops-hq/career-ops/issues/3748)) ([5118d35](https://github.com/career-ops-hq/career-ops/commit/5118d355553c25c6deb5f557f16930b9a9552b62))
* **scan:** add Eploy provider ([#4055](https://github.com/career-ops-hq/career-ops/issues/4055)) ([d5f680b](https://github.com/career-ops-hq/career-ops/commit/d5f680b030f9c4477e27121b9dcd3c34e85e0435))
* **scan:** add PeopleSoft Candidate Gateway provider ([#3739](https://github.com/career-ops-hq/career-ops/issues/3739)) ([addd6e4](https://github.com/career-ops-hq/career-ops/commit/addd6e460a0c21fbef1d562846a60d29c70ff23e))
* **scan:** add PrevueAPS provider (providers/prevueaps.mjs) ([#3919](https://github.com/career-ops-hq/career-ops/issues/3919)) ([dbdf2b6](https://github.com/career-ops-hq/career-ops/commit/dbdf2b689f09f2dc78390b86d24b9e5322d14e4e))
* **scan:** bridge scan-history → discover-ats (auto-propose scanned-but-untracked companies) ([#4182](https://github.com/career-ops-hq/career-ops/issues/4182)) ([3321861](https://github.com/career-ops-hq/career-ops/commit/3321861a6d5df148707a3d35af04d7439730a4a1))
* **ui:** stream matched job cards into results during scan ([#4200](https://github.com/career-ops-hq/career-ops/issues/4200)) ([78e13ca](https://github.com/career-ops-hq/career-ops/commit/78e13ca707a567d2d6b2dc5df5c65828104ee20a))
* **update-system:** add status command and local_sha to check output ([#3883](https://github.com/career-ops-hq/career-ops/issues/3883)) ([#3897](https://github.com/career-ops-hq/career-ops/issues/3897)) ([a3ca457](https://github.com/career-ops-hq/career-ops/commit/a3ca4573cbf46b7705000cf20e22b4857b7052fc))
* **validate-profile:** config/profile.yml is never validated, so a misspelled key silently does nothing ([#3981](https://github.com/career-ops-hq/career-ops/issues/3981)) ([#3982](https://github.com/career-ops-hq/career-ops/issues/3982)) ([3421cb6](https://github.com/career-ops-hq/career-ops/commit/3421cb62a2059eb45639304417ab419af98b7bdf))


### Bug Fixes

* **analyze-patterns:** validate threshold and vendor flags ([#4007](https://github.com/career-ops-hq/career-ops/issues/4007)) ([66d6252](https://github.com/career-ops-hq/career-ops/commit/66d625287f3e21f54243c52c6828938f34671f38))
* **application-answers:** find the draft block by a trailing (draft) marker ([#4432](https://github.com/career-ops-hq/career-ops/issues/4432)) ([ffe3325](https://github.com/career-ops-hq/career-ops/commit/ffe33257f2f804c87783a3e0d5ed2a37c582e16d))
* **application-answers:** parse Block H when its heading is localized ([#4400](https://github.com/career-ops-hq/career-ops/issues/4400)) ([271f23f](https://github.com/career-ops-hq/career-ops/commit/271f23fecddc634fd67472c36929998607434c06))
* **avature:** read article--jobs cards, titled from the h3 anchor ([#4559](https://github.com/career-ops-hq/career-ops/issues/4559)) ([fbed00a](https://github.com/career-ops-hq/career-ops/commit/fbed00a51e59a914d9147c2b43baa3f6bfdc7757))
* **batch-evaluate:** _profile.md and tracker-additions resolve to the code root ([#4347](https://github.com/career-ops-hq/career-ops/issues/4347)) ([#4348](https://github.com/career-ops-hq/career-ops/issues/4348)) ([5dea657](https://github.com/career-ops-hq/career-ops/commit/5dea6575cb2f8d62c44d9aa46a482ff703a3445b))
* **batch:** fail closed on no-op workers and archive the verbatim JD ([#4422](https://github.com/career-ops-hq/career-ops/issues/4422)) ([b78e5f8](https://github.com/career-ops-hq/career-ops/commit/b78e5f80e413b39f360d2e7a8085b5fc174869b8)), closes [#4421](https://github.com/career-ops-hq/career-ops/issues/4421)
* **batch:** resolve batch-prompt.md placeholders to stable labels ([#4517](https://github.com/career-ops-hq/career-ops/issues/4517)) ([b556085](https://github.com/career-ops-hq/career-ops/commit/b556085975ff8129d8fa9d0acd0637ce00babbe4))
* canonical states, data-root paths, pipeline parser, and link regex ([#3559](https://github.com/career-ops-hq/career-ops/issues/3559)) ([#3561](https://github.com/career-ops-hq/career-ops/issues/3561)) ([5f7819f](https://github.com/career-ops-hq/career-ops/commit/5f7819ffd78cf8569b5444aefd40ae9f8ecdc828))
* **ci:** pin the upgrade gate to the main channel so it stays hermetic ([#4470](https://github.com/career-ops-hq/career-ops/issues/4470)) ([43e3ee0](https://github.com/career-ops-hq/career-ops/commit/43e3ee07075e61d2da65906e67ef2877920c10ad))
* **cli:** scan-hn.mjs delegates --help and unknown flags to lib/cli-flags.mjs ([#4627](https://github.com/career-ops-hq/career-ops/issues/4627)) ([80e6dc0](https://github.com/career-ops-hq/career-ops/commit/80e6dc097c4fc2988717cbed77e869cb48d08dfa)), closes [#4598](https://github.com/career-ops-hq/career-ops/issues/4598)
* **cli:** validate scan-interamt flags before a live scan ([#4629](https://github.com/career-ops-hq/career-ops/issues/4629)) ([a0cfa60](https://github.com/career-ops-hq/career-ops/commit/a0cfa606e6376170404051501e546af839151d79)), closes [#4599](https://github.com/career-ops-hq/career-ops/issues/4599)
* **cover:** fill {{RECIPIENT_BLOCK}} so pack cover templates render ([#4043](https://github.com/career-ops-hq/career-ops/issues/4043)) ([8e16594](https://github.com/career-ops-hq/career-ops/commit/8e1659496d40acd0db73a78b13c2570490408412))
* **dashboard:** stop level-code digits from shadowing the real Pay figure ([#4626](https://github.com/career-ops-hq/career-ops/issues/4626)) ([cfc92c0](https://github.com/career-ops-hq/career-ops/commit/cfc92c065d2e4206a4b80b000c1adfa1ff96d98f))
* **dashboard:** target the correct tracker file, row, and status cell ([#3932](https://github.com/career-ops-hq/career-ops/issues/3932)) ([64f1a7d](https://github.com/career-ops-hq/career-ops/commit/64f1a7d258a5199a09e212fa58a231ed4a705d3b))
* **data-root:** generate-pdf and set-status resolve the tracker from the code directory ([#4486](https://github.com/career-ops-hq/career-ops/issues/4486)) ([d4d2186](https://github.com/career-ops-hq/career-ops/commit/d4d2186910eb88c7c2b9f1160da6ff48b83b6dc5))
* **data-root:** hired-share, reply-watch and paste-reply resolve the configured data root ([#4571](https://github.com/career-ops-hq/career-ops/issues/4571)) ([ffe6353](https://github.com/career-ops-hq/career-ops/commit/ffe6353c79b2a6f2f0e4711ce9656b15a4bbfd7a))
* **doctor:** checkDependencies and checkTrackedBakFiles read the code root ([#4138](https://github.com/career-ops-hq/career-ops/issues/4138)) ([a379ff4](https://github.com/career-ops-hq/career-ops/commit/a379ff4624382466122e264d30d18680d5639a0c))
* **doctor:** make Git diagnostics locale independent ([#4501](https://github.com/career-ops-hq/career-ops/issues/4501)) ([8cda54a](https://github.com/career-ops-hq/career-ops/commit/8cda54ac0e7cb4705b825f94b676b335e44e2736))
* **eval:** date reports with the local calendar day, not the UTC one ([#4227](https://github.com/career-ops-hq/career-ops/issues/4227)) ([6f6ccd2](https://github.com/career-ops-hq/career-ops/commit/6f6ccd291186f7cf2ef66cbe2be5842c252e4d7c))
* **followup-cadence:** don't read word-glued #N tags as row cross-references ([#4461](https://github.com/career-ops-hq/career-ops/issues/4461)) ([89cf7bf](https://github.com/career-ops-hq/career-ops/commit/89cf7bf3d74d6dda635851b6a0929f8c4cd12b2b))
* **followup-cadence:** parseAppliedDate matches gapped ATS phrasing ([#4143](https://github.com/career-ops-hq/career-ops/issues/4143)) ([fc12587](https://github.com/career-ops-hq/career-ops/commit/fc12587d60904280c5530e5a23a7ff39f4c490e6))
* **generate-latex:** --help is read as a filename, and a mistyped flag becomes the output path ([#4446](https://github.com/career-ops-hq/career-ops/issues/4446)) ([b811a93](https://github.com/career-ops-hq/career-ops/commit/b811a933ee0db60104a874a20aa5bb8d38face1a))
* **generate-pdf:** key the PDF manifest on report number and artifact kind ([#3959](https://github.com/career-ops-hq/career-ops/issues/3959)) ([10e789a](https://github.com/career-ops-hq/career-ops/commit/10e789a0363eba9f1aa73f8a1962e84e219aeb8d))
* **generate-pdf:** recognize Spanish section titles in the section-order guard ([#4476](https://github.com/career-ops-hq/career-ops/issues/4476)) ([4eaf2da](https://github.com/career-ops-hq/career-ops/commit/4eaf2dab0143145e80c35c18b5d0b8a4c3d3e5ca))
* **gitignore:** ignore data/agent-inbox.md ([#4503](https://github.com/career-ops-hq/career-ops/issues/4503)) ([e00b1ba](https://github.com/career-ops-hq/career-ops/commit/e00b1ba268da5c64ba62171bbe96e1d5339933d1))
* **gitignore:** ignore symlinked user-layer directories ([#4555](https://github.com/career-ops-hq/career-ops/issues/4555)) ([9b461d8](https://github.com/career-ops-hq/career-ops/commit/9b461d8a73e1de2f683a4e7d813bb062ed0f7d23))
* **i18n:** teach the headed tracker-addition TSV in localized prompts ([#3702](https://github.com/career-ops-hq/career-ops/issues/3702)) ([#3813](https://github.com/career-ops-hq/career-ops/issues/3813)) ([07b4df4](https://github.com/career-ops-hq/career-ops/commit/07b4df4ceb651f1d6c6e6816ab58ec0beeefe01b))
* **lock:** clamp the retry backoff to the per-holder deadline ([#4402](https://github.com/career-ops-hq/career-ops/issues/4402)) ([ffc2a7a](https://github.com/career-ops-hq/career-ops/commit/ffc2a7afd8df8a66f2c93e4f7c2940d4f94a7578))
* **merge-tracker:** a one-sided req number no longer merges into a duplicate row ([#4276](https://github.com/career-ops-hq/career-ops/issues/4276)) ([368c28f](https://github.com/career-ops-hq/career-ops/commit/368c28fa0505aabf055112cfc3f7dde4216fdddf))
* **merge-tracker:** match on identical report file, ahead of the company guard ([#4507](https://github.com/career-ops-hq/career-ops/issues/4507)) ([a55d765](https://github.com/career-ops-hq/career-ops/commit/a55d76511090a87e0365c1353617db2a0f773019))
* **merge-tracker:** reject entry matches across req IDs ([#4556](https://github.com/career-ops-hq/career-ops/issues/4556)) ([b41a04a](https://github.com/career-ops-hq/career-ops/commit/b41a04a1305f00a6d1ad6cdaa9100a6ae4b3e572))
* **outcome,tracker:** stamp the local calendar day, not the UTC one ([#3989](https://github.com/career-ops-hq/career-ops/issues/3989)) ([#3990](https://github.com/career-ops-hq/career-ops/issues/3990)) ([cbdddfc](https://github.com/career-ops-hq/career-ops/commit/cbdddfcec1d0688f57677c6b97e469a70049e9d4))
* **paths:** resolve user-layer files via the data root in batch-tailor, cv-templates and openrouter-runner ([#4570](https://github.com/career-ops-hq/career-ops/issues/4570)) ([cda5b0a](https://github.com/career-ops-hq/career-ops/commit/cda5b0aa75ed601307f90e4810d26dcf20758259))
* **pdf:** drop optional sections that arrive as a bare header ([#3997](https://github.com/career-ops-hq/career-ops/issues/3997)) ([94fcdbb](https://github.com/career-ops-hq/career-ops/commit/94fcdbb4dc9c002656c2591f469e242072ef7a84))
* **pdf:** use workspace styling for batch and imported renders ([#4111](https://github.com/career-ops-hq/career-ops/issues/4111)) ([f7e9708](https://github.com/career-ops-hq/career-ops/commit/f7e970846e8160d29eabe143d4e5a955608fade4))
* **pipeline:** preserve unknown scores when reconciling reports ([#3969](https://github.com/career-ops-hq/career-ops/issues/3969)) ([1e273a1](https://github.com/career-ops-hq/career-ops/commit/1e273a19def7f3902ccf85a163acbf27888b41de))
* **portals:** read the data root's portals.yml in fix-slugs and validate-portals ([#4287](https://github.com/career-ops-hq/career-ops/issues/4287)) ([814e0ca](https://github.com/career-ops-hq/career-ops/commit/814e0caa8ebddc1d015b4f4bc6ef42b89dc934fa))
* **postinstall:** drop --with-deps, which fails on non-Debian/Ubuntu Linux ([#4233](https://github.com/career-ops-hq/career-ops/issues/4233)) ([428619d](https://github.com/career-ops-hq/career-ops/commit/428619dabb77fb77b44b4f38f1bc699b9b68e316))
* **providers:** detect dead Workday boards via Workday's own maintenance/outage signals ([#4467](https://github.com/career-ops-hq/career-ops/issues/4467)) ([5ed8af5](https://github.com/career-ops-hq/career-ops/commit/5ed8af58957626f8ae30f69001504a876f7ab91d))
* **providers:** filter Pinpoint/Recruitee seeded demo postings ([#4190](https://github.com/career-ops-hq/career-ops/issues/4190)) ([#4217](https://github.com/career-ops-hq/career-ops/issues/4217)) ([62fc722](https://github.com/career-ops-hq/career-ops/commit/62fc72209ebc11c7ac558d66705926ced9d92ad2))
* **providers:** fold country into the primary location on Ashby, Recruitee and Breezy ([#4628](https://github.com/career-ops-hq/career-ops/issues/4628)) ([e1ebeff](https://github.com/career-ops-hq/career-ops/commit/e1ebeff5b775993561475c34a88a4099e57b975e))
* **providers:** read greenhouse embed slug, support myworkdaysite boards ([#4515](https://github.com/career-ops-hq/career-ops/issues/4515)) ([3e028d9](https://github.com/career-ops-hq/career-ops/commit/3e028d9b108eb8705bd06cb83a37e46732e3aee9))
* **providers:** recruitee joins multi-location offers, drops title-less rows ([#4414](https://github.com/career-ops-hq/career-ops/issues/4414)) ([8c9aae3](https://github.com/career-ops-hq/career-ops/commit/8c9aae34244ec2f79d1d21c05a34c5de608e7747))
* **providers:** refuse redirects by default in _http.mjs ([#4080](https://github.com/career-ops-hq/career-ops/issues/4080)) ([5e115ba](https://github.com/career-ops-hq/career-ops/commit/5e115ba58c4e07ff5119c1a81c97a5490c515247))
* **providers:** rippling switches to the v2 same-origin board API ([#4353](https://github.com/career-ops-hq/career-ops/issues/4353)) ([fd0a0fb](https://github.com/career-ops-hq/career-ops/commit/fd0a0fb5270b2c07c3f309f48ea6f7df165615ee))
* **providers:** support MokaHR's international hire-r1.mokahr.com host ([#4606](https://github.com/career-ops-hq/career-ops/issues/4606)) ([8fb1756](https://github.com/career-ops-hq/career-ops/commit/8fb1756ad56000db8723260b0b5b719e2936a652))
* **providers:** telegram-channel stops reading a multi-pipe tag as the employer ([#4479](https://github.com/career-ops-hq/career-ops/issues/4479)) ([492efa4](https://github.com/career-ops-hq/career-ops/commit/492efa42d588d09a80790628ff9de9b39ae8db20))
* **rejection-latency:** the company key deletes combining marks ([#4349](https://github.com/career-ops-hq/career-ops/issues/4349)) ([#4350](https://github.com/career-ops-hq/career-ops/issues/4350)) ([d62a74f](https://github.com/career-ops-hq/career-ops/commit/d62a74f3f93b90c7d626e962167640d43747ad75))
* **reports:** stamp local date in stats.mjs and analyze-patterns.mjs report headers ([#4608](https://github.com/career-ops-hq/career-ops/issues/4608)) ([c03d27a](https://github.com/career-ops-hq/career-ops/commit/c03d27ae2f6d2343d39b83a35f1fe3ff58939871))
* reserve-report-num.mjs skip batch-state "failed" report numbers ([#4391](https://github.com/career-ops-hq/career-ops/issues/4391)) ([8aa8ed4](https://github.com/career-ops-hq/career-ops/commit/8aa8ed44964477c67c172bd32c64aea905badca7))
* **role-matcher:** keep one-sided level siblings distinct ([#4060](https://github.com/career-ops-hq/career-ops/issues/4060)) ([b2abe2a](https://github.com/career-ops-hq/career-ops/commit/b2abe2a581da4c182d1b02c9ad1743e02f4eb07f))
* route zh/zh-TW pipeline report numbering through reserve-report-num.mjs ([#3991](https://github.com/career-ops-hq/career-ops/issues/3991)) ([b23dbd2](https://github.com/career-ops-hq/career-ops/commit/b23dbd2adc7e8bf75d16cf53f1dffeed595401a3))
* **scaffolder:** run npm install on Windows without spawning npm.cmd ([#4572](https://github.com/career-ops-hq/career-ops/issues/4572)) ([fe289aa](https://github.com/career-ops-hq/career-ops/commit/fe289aa2c99fa8f66faf3bf91d9b2bd8f14e9cd8))
* **scan-hn:** report Gemini errors instead of zero offers ([#4504](https://github.com/career-ops-hq/career-ops/issues/4504)) ([150b39e](https://github.com/career-ops-hq/career-ops/commit/150b39e900485c015adba627028c60614de71bcd))
* **scan:** close companyMatch corporate-form follow-ups from [#3957](https://github.com/career-ops-hq/career-ops/issues/3957) ([#4491](https://github.com/career-ops-hq/career-ops/issues/4491)) ([48715f4](https://github.com/career-ops-hq/career-ops/commit/48715f41697add7e7b271c726fd60496cc77f02c))
* **scan:** detect astral word edges in location keywords on Node 26 ([#4478](https://github.com/career-ops-hq/career-ops/issues/4478)) ([#4480](https://github.com/career-ops-hq/career-ops/issues/4480)) ([f327137](https://github.com/career-ops-hq/career-ops/commit/f327137f77c30ef4a5417eeb72b405fa10a29667))
* **scan:** fold diacritics on both sides of the title filter ([#4458](https://github.com/career-ops-hq/career-ops/issues/4458)) ([aa453bd](https://github.com/career-ops-hq/career-ops/commit/aa453bd8969445a42ce1837605ae1faebc089e7d))
* **scan:** migrate scan-runs.tsv onto the current schema ([#4427](https://github.com/career-ops-hq/career-ops/issues/4427)) ([483a100](https://github.com/career-ops-hq/career-ops/commit/483a1004b532ca71bb25745e7a6c44ae8ba4d260))
* **scan:** strip CJK/Korean corporate-form markers in companyMatch ([#2570](https://github.com/career-ops-hq/career-ops/issues/2570)) ([#3957](https://github.com/career-ops-hq/career-ops/issues/3957)) ([5d1a638](https://github.com/career-ops-hq/career-ops/commit/5d1a6380dc4a43f21b633e2494da5e0c866da3f2))
* **scan:** strip pipe-delimited location suffixes from role dedupe keys ([#4621](https://github.com/career-ops-hq/career-ops/issues/4621)) ([374e97f](https://github.com/career-ops-hq/career-ops/commit/374e97fa29519289824e852030d144559415d762))
* **scripts:** resolve user-layer files against the data root, not the checkout ([#4314](https://github.com/career-ops-hq/career-ops/issues/4314)) ([db76028](https://github.com/career-ops-hq/career-ops/commit/db76028dcfc6902b8aab60a9af9ee5f0097dc284))
* **set-status:** the canonical tracker write path cannot find a configured tracker ([#3987](https://github.com/career-ops-hq/career-ops/issues/3987)) ([#3988](https://github.com/career-ops-hq/career-ops/issues/3988)) ([4bd53be](https://github.com/career-ops-hq/career-ops/commit/4bd53bee98ca7c2d3c51bd786d5e72294d724e78))
* **stats:** stop counting failure streaks from portals no longer probed ([#4323](https://github.com/career-ops-hq/career-ops/issues/4323)) ([361f792](https://github.com/career-ops-hq/career-ops/commit/361f79299dee2fc99f41c0f8c780c786da2ab597))
* **telegram-channel:** preserve employer and title fields in hashtag posts ([#3928](https://github.com/career-ops-hq/career-ops/issues/3928)) ([277ceef](https://github.com/career-ops-hq/career-ops/commit/277ceef5e932e15a1ba33c644d7819af254e4c49))
* **tests:** a killed test run leaves no trap for the next one ([#3968](https://github.com/career-ops-hq/career-ops/issues/3968)) ([d83a81d](https://github.com/career-ops-hq/career-ops/commit/d83a81d8dbd669480b57789f3fd9e0f98b6b378a))
* **tracker:** migrate missing URL column ([#4099](https://github.com/career-ops-hq/career-ops/issues/4099)) ([04c9edc](https://github.com/career-ops-hq/career-ops/commit/04c9edc7981873153e8383531672846e20b1b4aa))
* **tracker:** recognize localized headers across Node, web, and Go ([#3931](https://github.com/career-ops-hq/career-ops/issues/3931)) ([a827945](https://github.com/career-ops-hq/career-ops/commit/a827945b4a957976969b0a585019634f448ca44e))
* **update-system:** a preserved directory with an unreadable upstream lookup no longer aborts the whole update ([#3824](https://github.com/career-ops-hq/career-ops/issues/3824)) ([#3955](https://github.com/career-ops-hq/career-ops/issues/3955)) ([c4e5ecf](https://github.com/career-ops-hq/career-ops/commit/c4e5ecfd0563d8d7ece0472b025bb8885e22e062))
* **upskill:** add testing + observability terms to the skill vocabulary ([#4343](https://github.com/career-ops-hq/career-ops/issues/4343)) ([f226408](https://github.com/career-ops-hq/career-ops/commit/f226408efb63541d728f85ea1e551bcbb2b6ded9))
* use model-aware MiniMax context budgets ([#4650](https://github.com/career-ops-hq/career-ops/issues/4650)) ([5517ba0](https://github.com/career-ops-hq/career-ops/commit/5517ba0d1471d0d76f2e551bea2d8a7f114a129a))
* validate rank pipeline CLI flags ([#4625](https://github.com/career-ops-hq/career-ops/issues/4625)) ([0717a4d](https://github.com/career-ops-hq/career-ops/commit/0717a4d86db1fabeb5f60d6589649565114bd054))
* **validate-portals:** warn on a provider config block that sets no filter ([#4619](https://github.com/career-ops-hq/career-ops/issues/4619)) ([c77db08](https://github.com/career-ops-hq/career-ops/commit/c77db089743672769501a597f3d1d500931e6f52))
* **verify-ats:** recognize section headings in every language the repo ships ([#4306](https://github.com/career-ops-hq/career-ops/issues/4306)) ([f814dbf](https://github.com/career-ops-hq/career-ops/commit/f814dbf441c8d7bbc002b3187d640b23df6f6d28))
* **verify-cv-facts:** don't flag a cited posting requirement as a personal metric claim ([#3917](https://github.com/career-ops-hq/career-ops/issues/3917)) ([dbcf073](https://github.com/career-ops-hq/career-ops/commit/dbcf0737d13013a4fd12aa36ad09d61aee555c8e))
* **verify-cv-facts:** stop reading a CV's own reworded prose as a tool claim ([#4006](https://github.com/career-ops-hq/career-ops/issues/4006)) ([e27c7b7](https://github.com/career-ops-hq/career-ops/commit/e27c7b75207182dce1db3599df613dd67ffa092e))
* **verify-pipeline:** don't flag same company+role reports that carry distinct posting URLs ([#4636](https://github.com/career-ops-hq/career-ops/issues/4636)) ([96ff254](https://github.com/career-ops-hq/career-ops/commit/96ff2540656a522d39430cf3f54aad42ed0741be))
* **verify-pipeline:** stop counting a SKIP row as a submission channel ([#3978](https://github.com/career-ops-hq/career-ops/issues/3978)) ([#4415](https://github.com/career-ops-hq/career-ops/issues/4415)) ([6a6443a](https://github.com/career-ops-hq/career-ops/commit/6a6443aea6f324496216abb1bf4f166c2bcb460f))
* **verify-portals:** report a live alternate the identity gate refused ([#4334](https://github.com/career-ops-hq/career-ops/issues/4334)) ([9e69056](https://github.com/career-ops-hq/career-ops/commit/9e6905625e2d3586f560bdc643eca9ded45e382c))
* **web:** the web tracker reader drops the Apply Link and Follow-up columns ([#3603](https://github.com/career-ops-hq/career-ops/issues/3603)) ([4be56a3](https://github.com/career-ops-hq/career-ops/commit/4be56a388dc53990015a17786c49453ac8d50b0f))
* **workday:** skip the sequential retry when a board hit a structural limit ([#4336](https://github.com/career-ops-hq/career-ops/issues/4336)) ([8b587cf](https://github.com/career-ops-hq/career-ops/commit/8b587cfe97be2cda3fa58109538a844680b25de9))
* **zh-minimal:** preserve ATS text extraction order + strip empty certifications section ([#2202](https://github.com/career-ops-hq/career-ops/issues/2202)) ([91e523d](https://github.com/career-ops-hq/career-ops/commit/91e523da962309f64383a2820e77800b24ec983e))

## [1.34.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.33.0...career-ops-v1.34.0) (2026-09-24)


### Features

* **cli:** add --help to cv-sync-check.mjs ([#4376](https://github.com/career-ops-hq/career-ops/issues/4376)) ([86a5cd3](https://github.com/career-ops-hq/career-ops/commit/86a5cd3300d5b826fd8b16f0b11101dc8dbeb8f3)), closes [#3565](https://github.com/career-ops-hq/career-ops/issues/3565)
* **liveness:** check additional posting URLs through public APIs ([#4444](https://github.com/career-ops-hq/career-ops/issues/4444)) ([4bc53fc](https://github.com/career-ops-hq/career-ops/commit/4bc53fce68a89c420c0a68ec645ea6ad4523a4c7))
* **providers:** add generalist-world board provider ([e85ff79](https://github.com/career-ops-hq/career-ops/commit/e85ff797ad7a0c3d97fd895072ad81cf44a0330a))
* **providers:** add Python.org Jobs scanner provider ([24557b2](https://github.com/career-ops-hq/career-ops/commit/24557b2fbc713685b16071068601a61591eab319))
* **providers:** support explicit personio tenant pin ([a639b15](https://github.com/career-ops-hq/career-ops/commit/a639b15404b042be03e71851dbd2a46ba0856b43))
* **readme:** README v2 with a Sponsors section, welcoming SerpApi as sponsor ([6634b81](https://github.com/career-ops-hq/career-ops/commit/6634b81b2a57bd2bc1c1ec68df68d1ee1f98d2e4))
* **scan:** add domain-level aggregator repost detection ([#4263](https://github.com/career-ops-hq/career-ops/issues/4263)) ([fe53d0b](https://github.com/career-ops-hq/career-ops/commit/fe53d0b6bfeb161e3c124b78e752708e9e77b0f9))
* **scan:** opt-in location_filter.strict fails closed on empty locations ([#3276](https://github.com/career-ops-hq/career-ops/issues/3276)) ([#4033](https://github.com/career-ops-hq/career-ops/issues/4033)) ([98e62de](https://github.com/career-ops-hq/career-ops/commit/98e62de48483c61b06b8477cd7f63949d93e89c8))
* **stats:** suggest portal pruning from observed history ([#4373](https://github.com/career-ops-hq/career-ops/issues/4373)) ([dbaffdf](https://github.com/career-ops-hq/career-ops/commit/dbaffdf46f7b3bfc5ae1ef807681960e30735102))
* **update-system:** resolve to the latest release tag by default, not main ([#3845](https://github.com/career-ops-hq/career-ops/issues/3845)) ([ab18203](https://github.com/career-ops-hq/career-ops/commit/ab182031204794073beed66bee84da78e10c0517))


### Bug Fixes

* **agents:** stop quoting an injection example that blocks scanner-based hosts ([#4137](https://github.com/career-ops-hq/career-ops/issues/4137)) ([2f637a2](https://github.com/career-ops-hq/career-ops/commit/2f637a2a5d2279c96114ffe0826da80784d8f477))
* align global score instructions across evaluation paths ([#4451](https://github.com/career-ops-hq/career-ops/issues/4451)) ([f0f1b8e](https://github.com/career-ops-hq/career-ops/commit/f0f1b8e961951708e2077137fb7c549d43c95e23))
* **analyze-patterns:** an empty tracker is a new user, not a failed command ([727fae3](https://github.com/career-ops-hq/career-ops/commit/727fae3133f403b520f64ea370fb353fc9ed1c86))
* **apply:** hand off Ashby submission to system browser ([#4443](https://github.com/career-ops-hq/career-ops/issues/4443)) ([41b212a](https://github.com/career-ops-hq/career-ops/commit/41b212a4646e6357f6af091cbb5eab4b3276bcbc))
* **apply:** validate answers against live field limits ([#4442](https://github.com/career-ops-hq/career-ops/issues/4442)) ([77ec81b](https://github.com/career-ops-hq/career-ops/commit/77ec81bc71a003418ea00acd070020188c8779e7))
* **ashby:** read the salary range from compensationTiers[].components[] ([#4331](https://github.com/career-ops-hq/career-ops/issues/4331)) ([71563c7](https://github.com/career-ops-hq/career-ops/commit/71563c71e333e65c0798cca4a2cc50147d6ad23a))
* **audit-portals:** load providers/ from the checkout, not the data root ([#4240](https://github.com/career-ops-hq/career-ops/issues/4240)) ([88e2d93](https://github.com/career-ops-hq/career-ops/commit/88e2d93fefc170a180b8c444f0b04b49c3689b6a)), closes [#4171](https://github.com/career-ops-hq/career-ops/issues/4171)
* **batch:** add adaptive rate-limit backoff ([#4370](https://github.com/career-ops-hq/career-ops/issues/4370)) ([0291477](https://github.com/career-ops-hq/career-ops/commit/029147719d5946fafdba7576cbb31dc869bccd82))
* **batch:** escape ampersands in offer URLs ([d2cd237](https://github.com/career-ops-hq/career-ops/commit/d2cd23785a3364ab49d69481ecf8fd04e82f0c0a))
* **batch:** give the worker a Windows-resolvable JD file path under Git Bash ([5d5729e](https://github.com/career-ops-hq/career-ops/commit/5d5729e4ccee258451c8a004a0084fcb51453d76))
* **batch:** give the worker a Windows-resolvable JD file path under Git Bash ([d4ce630](https://github.com/career-ops-hq/career-ops/commit/d4ce63022162b515fcc1b99754a0f8b56bd2a475))
* **batch:** parse scores locale-independently in batch-runner ([f24eac2](https://github.com/career-ops-hq/career-ops/commit/f24eac20c424aaaf11d038f9e00818ce6f6f631d))
* **batch:** reject explicit zero offer limits ([#4308](https://github.com/career-ops-hq/career-ops/issues/4308)) ([455c006](https://github.com/career-ops-hq/career-ops/commit/455c006f826c2c276d695716b5395f93eb6b9750))
* **batch:** require parent confirmation for delegated agency postings ([#4371](https://github.com/career-ops-hq/career-ops/issues/4371)) ([be0b54f](https://github.com/career-ops-hq/career-ops/commit/be0b54f35845d277aacf1cd87d83708c38590f4e))
* **browser-extract:** normalize JSON-LD length comparison, reset stale title, accept IRI [@type](https://github.com/type) ([27c3325](https://github.com/career-ops-hq/career-ops/commit/27c3325230a0f677d03755c750a4912ed89d76c4))
* **browser-extract:** read schema.org JobPosting when the DOM has no body ([5fefe46](https://github.com/career-ops-hq/career-ops/commit/5fefe460eb75084cccc4dac6cef0bdc4f3d5a146))
* **browser-extract:** read schema.org JobPosting when the DOM has no body ([8b5c5be](https://github.com/career-ops-hq/career-ops/commit/8b5c5bee657c41f63abefd27f89405cb0bc47980))
* **build-cv-html:** render each project bullets item as its own block ([#4300](https://github.com/career-ops-hq/career-ops/issues/4300)) ([39090cd](https://github.com/career-ops-hq/career-ops/commit/39090cdc703fe1c23824ba9d4c294e4a604c0332))
* **ci:** check out base before running labeler ([eaf10ad](https://github.com/career-ops-hq/career-ops/commit/eaf10adb3b34c79554f5b422c8bc9b9c5eaf23ac))
* **ci:** pr-triage workflow_run finds fork PRs by head owner:branch, skips main ([#4407](https://github.com/career-ops-hq/career-ops/issues/4407)) ([2dd0148](https://github.com/career-ops-hq/career-ops/commit/2dd0148ad7a7e4f5ab0e9907f6b383ffc602d45a))
* **clean-markers:** add -h/--help and reject unrecognized flags ([43f8dfb](https://github.com/career-ops-hq/career-ops/commit/43f8dfb003a5b103dd5e21268d0efc8d92c0fdd7))
* **cv-latex:** keep %, #, ~ and & in CV links, escaped for hyperref ([#4288](https://github.com/career-ops-hq/career-ops/issues/4288)) ([8790f97](https://github.com/career-ops-hq/career-ops/commit/8790f97ae8df254715222a4e617aa8bb5de9a724))
* **dashboard:** neutralize control characters in the help-bar flash ([ff2945c](https://github.com/career-ops-hq/career-ops/commit/ff2945c98dea92754b7d270bf03aea0bc53c6ac3))
* **dashboard:** stats panels overflow their column, and "evaluated" labels three different numbers ([#4075](https://github.com/career-ops-hq/career-ops/issues/4075)) ([e150d3a](https://github.com/career-ops-hq/career-ops/commit/e150d3a21c6b066115cbc5a63ca1e9602959346e))
* **dashboard:** surface open failures in the UI instead of stderr ([6ac8531](https://github.com/career-ops-hq/career-ops/commit/6ac8531a9013f04ad6c29170d9eef2cdd119eb13))
* **discover-ats:** SmartRecruiters' phantom empty board no longer outranks a real not-found ([cd72ef8](https://github.com/career-ops-hq/career-ops/commit/cd72ef83d1ef654b33eab7a1e278932b56fd686e))
* **doctor:** find scan extractor in code checkout ([#4438](https://github.com/career-ops-hq/career-ops/issues/4438)) ([2b92bab](https://github.com/career-ops-hq/career-ops/commit/2b92babea207b8e2f0c47ce4bb7cfb5d5912496e))
* **followup-cadence:** emit cadenceDefaults when the tracker is empty ([#4009](https://github.com/career-ops-hq/career-ops/issues/4009)) ([5c97c24](https://github.com/career-ops-hq/career-ops/commit/5c97c24e092871cd6374c2122ee7f021d69d3d6e))
* **gitignore:** cover reports/ subdirectories, not just the top level ([#4174](https://github.com/career-ops-hq/career-ops/issues/4174)) ([54c57ef](https://github.com/career-ops-hq/career-ops/commit/54c57ef9590ee8c60b0661140ded286f7fd2e0f7))
* **gitignore:** ignore node_modules whatever its file type ([#4419](https://github.com/career-ops-hq/career-ops/issues/4419)) ([47d731d](https://github.com/career-ops-hq/career-ops/commit/47d731d629e52ed775dc18ca7365e525b77d406d))
* **icims:** stop doubling the careers- prefix on iCIMS board hosts ([444fedd](https://github.com/career-ops-hq/career-ops/commit/444fedd9932581cc8844795118ad10d980b247ca))
* improve error message for missing cv.md ([602ac8b](https://github.com/career-ops-hq/career-ops/commit/602ac8b635ecf48b5c9068214666fa0c5c283ba2))
* **jd-archive:** ignore report reservation sentinels ([#4096](https://github.com/career-ops-hq/career-ops/issues/4096)) ([5c8b222](https://github.com/career-ops-hq/career-ops/commit/5c8b222a70ba41209c0907461431008bbea80b73))
* **jd-skill-gap:** improve error message for missing cv.md ([f783f0a](https://github.com/career-ops-hq/career-ops/commit/f783f0a64e1cf6b57db43dc36af762ec476b9e13))
* **jd-skill-gap:** recognize bolded and uncontracted requirements headings ([#4285](https://github.com/career-ops-hq/career-ops/issues/4285)) ([d459180](https://github.com/career-ops-hq/career-ops/commit/d4591808f0ea2b05282980be0b2afa071e54fd35))
* **liveness:** inspect embedded ATS before closing posting ([#4439](https://github.com/career-ops-hq/career-ops/issues/4439)) ([3bb6894](https://github.com/career-ops-hq/career-ops/commit/3bb68949e111d7109bbcb20871201b70337bde62))
* **liveness:** move bare "Job Expired" banner to a soft tier + guard closed-loop compounds ([5358534](https://github.com/career-ops-hq/career-ops/commit/535853476587795fdb0a14ec7691e3b3dcf85a45))
* **liveness:** recognize "role/position is closed" and bare "Job Expired" banners ([cb41016](https://github.com/career-ops-hq/career-ops/commit/cb4101614fa7701539a8faa0e1955710cccc3268))
* **pdf:** give paper size one owner so the CV body and the sheet agree ([#4405](https://github.com/career-ops-hq/career-ops/issues/4405)) ([56b69a2](https://github.com/career-ops-hq/career-ops/commit/56b69a269f98b5f5f2275dd84c6143fb5e0951c2))
* **pdf:** preserve template text reading order ([#4440](https://github.com/career-ops-hq/career-ops/issues/4440)) ([bce3656](https://github.com/career-ops-hq/career-ops/commit/bce3656e528f685156b35e9f4edd7b15da2e4bdf))
* **pipeline:** route CV output on cv.output_format instead of the PDF score gate ([#3944](https://github.com/career-ops-hq/career-ops/issues/3944)) ([1d4993d](https://github.com/career-ops-hq/career-ops/commit/1d4993dc1b7b1eb472455609a5e0425c7006ae34))
* **providers:** avature preserves facet filters across pages, flags broken parses ([#4252](https://github.com/career-ops-hq/career-ops/issues/4252)) ([0674308](https://github.com/career-ops-hq/career-ops/commit/0674308f55f240427386003466fa946066f6ab9c))
* **providers:** build SEEK job links per market host + opt-in appendWorkType ([#3436](https://github.com/career-ops-hq/career-ops/issues/3436)) ([8f345f3](https://github.com/career-ops-hq/career-ops/commit/8f345f38002bc58670208568fd9e4641c63f616b))
* **providers:** give the Lever board feed a 30s timeout, not the 10s default ([#4284](https://github.com/career-ops-hq/career-ops/issues/4284)) ([70f5a0a](https://github.com/career-ops-hq/career-ops/commit/70f5a0abf031f70eb4102e395731fdcebd875df5)), closes [#4177](https://github.com/career-ops-hq/career-ops/issues/4177)
* **providers:** match inner class tokens and fail loud on unusable generalist-world cards ([#4264](https://github.com/career-ops-hq/career-ops/issues/4264)) ([4ef31bd](https://github.com/career-ops-hq/career-ops/commit/4ef31bdbb2c825eb6d55d4fa47a428d1f7cad894))
* **providers:** oraclecloud drops 12% of a board on a short middle page ([98380e7](https://github.com/career-ops-hq/career-ops/commit/98380e74b4baf59619a33ccf0b16ccfa640ffddb))
* **providers:** oraclecloud drops 12% of a board on a short middle page ([78d21e2](https://github.com/career-ops-hq/career-ops/commit/78d21e2d18a4963dafe063e5f301d687a1519c55))
* **providers:** pass redirect:'error' on deutschebahn requests ([74d7ab2](https://github.com/career-ops-hq/career-ops/commit/74d7ab2174323bdc6fae4145427efa7d6c0cbd73))
* **providers:** retry transient aborts in deutschebahn and manfred ([54b9bbb](https://github.com/career-ops-hq/career-ops/commit/54b9bbb33f877f3652e792f81962464a521d451e))
* **providers:** retry transient aborts in deutschebahn and manfred ([b4e9aa7](https://github.com/career-ops-hq/career-ops/commit/b4e9aa7a810c71186b08e9e35d5d7ceb01d13ae4))
* resolve MCP config from launch checkout ([#4377](https://github.com/career-ops-hq/career-ops/issues/4377)) ([e2e442c](https://github.com/career-ops-hq/career-ops/commit/e2e442cf680094717a9724f22515243ab9c2638e))
* **role-matcher:** split one-sided level with two-sided vocabulary gap ([#4058](https://github.com/career-ops-hq/career-ops/issues/4058)) ([1cd3633](https://github.com/career-ops-hq/career-ops/commit/1cd36333f4dd33e3bda5347bd03217d3a0172c89))
* run the web test suite on the minimum supported Node ([#4065](https://github.com/career-ops-hq/career-ops/issues/4065)) ([533a4a8](https://github.com/career-ops-hq/career-ops/commit/533a4a8dc0802fffc5a87afb3d380776bde6da14))
* **scaffolder:** do not report "ready" when npm install failed ([ca94dcc](https://github.com/career-ops-hq/career-ops/commit/ca94dccbc274a75cf16b8d0a65bf3e5501768171))
* **scaffolder:** do not report "ready" when npm install failed ([1b1cdcd](https://github.com/career-ops-hq/career-ops/commit/1b1cdcd65bc9cbd9068e950401712568da14a965))
* **scan:** distinguish unverified zero results ([#4441](https://github.com/career-ops-hq/career-ops/issues/4441)) ([05a9f5d](https://github.com/career-ops-hq/career-ops/commit/05a9f5dcad398b4af6bfc5085229e33dc4026e1d))
* **scan:** honor blacklist domain scope ([#4169](https://github.com/career-ops-hq/career-ops/issues/4169)) ([d0288b7](https://github.com/career-ops-hq/career-ops/commit/d0288b79aa79c559cfe601d32cad8f597b0f0cb0))
* **scan:** keep same-titled postings apart when their requisitions differ ([#4267](https://github.com/career-ops-hq/career-ops/issues/4267)) ([a0da806](https://github.com/career-ops-hq/career-ops/commit/a0da806a909684893a2c0945b6e40d4ce31cf801))
* **scan:** recheck_after_days frees a row, then pipeline.md pins it again ([#3958](https://github.com/career-ops-hq/career-ops/issues/3958)) ([8ef3a4e](https://github.com/career-ops-hq/career-ops/commit/8ef3a4e7beef12092aa99e375c70a50e8cf3e968))
* **scan:** warn about stale websearch targeting ([#4369](https://github.com/career-ops-hq/career-ops/issues/4369)) ([61414b6](https://github.com/career-ops-hq/career-ops/commit/61414b631b176748a39f04b62c730543602eb8d2))
* **set-status:** add --help/-h and list the canonical states in usage ([#4066](https://github.com/career-ops-hq/career-ops/issues/4066)) ([8c47fbc](https://github.com/career-ops-hq/career-ops/commit/8c47fbcc6c8175530b662dfde25d65fad7d78953))
* **templates:** honor profile styles in Chinese Minimal CVs ([#4112](https://github.com/career-ops-hq/career-ops/issues/4112)) ([efd4a8b](https://github.com/career-ops-hq/career-ops/commit/efd4a8b4081f09073becda38753c3cb2ebd05f4d))
* **test-all:** stop flagging 7 files that legitimately credit the maintainer ([#4144](https://github.com/career-ops-hq/career-ops/issues/4144)) ([a6c4057](https://github.com/career-ops-hq/career-ops/commit/a6c405747038343dce0bce3124fa1b6ab5c22fbc))
* **tests:** skip web-argv static half when web/ is not installed ([946b741](https://github.com/career-ops-hq/career-ops/commit/946b74180be0826eda3cca1b6667cf3261bc2a1e))
* **tests:** support core-only argv contract checks ([66eb559](https://github.com/career-ops-hq/career-ops/commit/66eb5592e887a2f95b984d9f895f75fd6db2f58a))
* **update-system:** exempt generated per-application CVs/covers from templates/ prune ([#3638](https://github.com/career-ops-hq/career-ops/issues/3638)) ([279bbf7](https://github.com/career-ops-hq/career-ops/commit/279bbf755d6b57e610484a267d1193d4dee60bd7)), closes [#3636](https://github.com/career-ops-hq/career-ops/issues/3636)
* **update-system:** keep an upstream negation ahead of newly appended rules ([#4142](https://github.com/career-ops-hq/career-ops/issues/4142)) ([749950a](https://github.com/career-ops-hq/career-ops/commit/749950a8757200f1617671260ef8009d0a4c4f0e))
* **update-system:** never prune a file upstream has not shipped ([#3974](https://github.com/career-ops-hq/career-ops/issues/3974)) ([03908fe](https://github.com/career-ops-hq/career-ops/commit/03908fe4a7f28fad995f625fd2001905a9f50ccb))
* **updater:** drop SIGNATURES.md from SYSTEM_PATHS so a new signature stops reading as system drift ([#4074](https://github.com/career-ops-hq/career-ops/issues/4074)) ([2f10500](https://github.com/career-ops-hq/career-ops/commit/2f1050088a10ed473617fe6a849985a2963fd983))
* **verifiers:** resolve provider plugins like the scanner ([#4026](https://github.com/career-ops-hq/career-ops/issues/4026)) ([#4046](https://github.com/career-ops-hq/career-ops/issues/4046)) ([c8e595a](https://github.com/career-ops-hq/career-ops/commit/c8e595aead66411db8542c4e9ec785406baffeed))
* **verify-ats:** brace the escape for a character above the BMP ([#4305](https://github.com/career-ops-hq/career-ops/issues/4305)) ([3417faf](https://github.com/career-ops-hq/career-ops/commit/3417faf22c29ed0a3f20b79c1e276a67ab7f3f09))
* **verify-ats:** stop the shipped template's own CSS from docking 15 points ([#4270](https://github.com/career-ops-hq/career-ops/issues/4270)) ([eb9d5f1](https://github.com/career-ops-hq/career-ops/commit/eb9d5f161cb6676262be50528c6f7071638d1b85))
* **verify-ats:** trim CSS whitespace, so U+00A0 cannot hide a font name ([#4283](https://github.com/career-ops-hq/career-ops/issues/4283)) ([c9e00e6](https://github.com/career-ops-hq/career-ops/commit/c9e00e6c2d20289c8f87ef576b24670f24e54374))
* **verify-cv-facts:** also strip single-asterisk italic emphasis ([97932d0](https://github.com/career-ops-hq/career-ops/commit/97932d01c4331d4bf3cac059ad53ee8a92a46336))
* **verify-cv-facts:** consolidate markdown emphasis stripping (**, __, *) ([da5cc25](https://github.com/career-ops-hq/career-ops/commit/da5cc257279068b13c4d70de088dce08c588dd14))
* **verify-cv-facts:** recognize bolded metrics in stripMarkup ([f1ae257](https://github.com/career-ops-hq/career-ops/commit/f1ae2576ef57f5e822121b67a526acb9e0283a07))
* **verify-cv-facts:** revert boundary-guarded italic regex, it broke the LaTeX star-command test ([10cfbd2](https://github.com/career-ops-hq/career-ops/commit/10cfbd2ba3f59452d25321ea7a4fe890eeaf28de))
* **verify-cv-facts:** the fabrication gate read neither its sources nor its config from the data root ([#4208](https://github.com/career-ops-hq/career-ops/issues/4208)) ([dd18eb5](https://github.com/career-ops-hq/career-ops/commit/dd18eb5e516ea6e41e3733529795a3470b95c637))
* **verify-portals:** --help no longer falls through to the full network sweep ([#4254](https://github.com/career-ops-hq/career-ops/issues/4254)) ([e2baa19](https://github.com/career-ops-hq/career-ops/commit/e2baa1911da58ac014be23c755d4aaf321e771f9))
* **verify-portals:** reject a missing or swallowed --file operand ([#4280](https://github.com/career-ops-hq/career-ops/issues/4280)) ([bd4dc0d](https://github.com/career-ops-hq/career-ops/commit/bd4dc0da74fbb976a30e70a82b6cb9f286c8b702))
* **web/explore:** honest, configurable scan timeout with partial results ([#4191](https://github.com/career-ops-hq/career-ops/issues/4191)) ([220ecd8](https://github.com/career-ops-hq/career-ops/commit/220ecd876bcb49152068ecc098f55e5be0f8b542))
* **web:** a failed atomic write leaves a full copy of cv.md behind, unignored ([#3245](https://github.com/career-ops-hq/career-ops/issues/3245)) ([#3246](https://github.com/career-ops-hq/career-ops/issues/3246)) ([2d37f77](https://github.com/career-ops-hq/career-ops/commit/2d37f77fb6b29db1c43970e39df5f5f918ddc7e6))
* **web:** make CLI choices fully clickable ([977bb11](https://github.com/career-ops-hq/career-ops/commit/977bb1144fec223f98b66984a9dfeb508d73f08f))
* **workday:** resolve "N Locations" placeholders from the detail endpoint ([4e5a812](https://github.com/career-ops-hq/career-ops/commit/4e5a8123cc015b6af7372d4459c6927d183c4d27))

## [1.33.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.32.0...career-ops-v1.33.0) (2026-09-16)


### Features

* **batch:** add --cli flag for multi-CLI batch evaluation (opencode, gemini, qwen) ([6255cc2](https://github.com/career-ops-hq/career-ops/commit/6255cc200be7aabe45bf1d5c2ec2e6f52337fd7f))
* **browser-extract:** read Greenhouse, Lever and Ashby JDs from their public APIs, and add fetch-jd.mjs ([#3654](https://github.com/career-ops-hq/career-ops/issues/3654)) ([1923ee1](https://github.com/career-ops-hq/career-ops/commit/1923ee14b2edc635e6ea59a447d0f4fbce02ad48)), closes [#2582](https://github.com/career-ops-hq/career-ops/issues/2582)
* **cv:** render an education entry's location on the HTML CV ([#3776](https://github.com/career-ops-hq/career-ops/issues/3776)) ([8e5c65d](https://github.com/career-ops-hq/career-ops/commit/8e5c65dfaedfe5d10d31926a72d79c0d9fef4a10)), closes [#3773](https://github.com/career-ops-hq/career-ops/issues/3773)
* **oferta/pdf:** enforce JD archival in every report ([4726e05](https://github.com/career-ops-hq/career-ops/commit/4726e05312e40a1a9e2d61b2e4ccf6851fbd5a4e))
* **portals:** audit board content, not just reachability ([#3610](https://github.com/career-ops-hq/career-ops/issues/3610)) ([9b896b5](https://github.com/career-ops-hq/career-ops/commit/9b896b50a426dd4c07b342f7b79253296aeea684))
* **providers:** add the Gem Job Board REST API as a verified-URL mode alongside the GraphQL provider ([#3783](https://github.com/career-ops-hq/career-ops/issues/3783)) ([0e5a95c](https://github.com/career-ops-hq/career-ops/commit/0e5a95c57d5a6fd40057d1ff7717e509c3524036))
* **providers:** telegram-channel, public channel posts via t.me/s/ (zero-auth) ([#3668](https://github.com/career-ops-hq/career-ops/issues/3668)) ([ab4e5e4](https://github.com/career-ops-hq/career-ops/commit/ab4e5e4821ced4464f468b7a4f7687234d3c4e31))
* **scan:** add Collage HR public job provider ([#3787](https://github.com/career-ops-hq/career-ops/issues/3787)) ([bf2b647](https://github.com/career-ops-hq/career-ops/commit/bf2b64779d659f19df24d82ccd768ab09432d389))
* **scan:** one machine-findable marker line above every scan summary ([#3747](https://github.com/career-ops-hq/career-ops/issues/3747)) ([339ee57](https://github.com/career-ops-hq/career-ops/commit/339ee57e5ac8e31baeb1ea09a12bab1ce3c1d6f6)), closes [#3560](https://github.com/career-ops-hq/career-ops/issues/3560)
* **scan:** per-company title_filter_overrides for scan-ats-full.mjs ([#3710](https://github.com/career-ops-hq/career-ops/issues/3710)) ([5fb18d7](https://github.com/career-ops-hq/career-ops/commit/5fb18d7cd2c2f3aa6d5c836eb1416be1d0d3cf5a)), closes [#3708](https://github.com/career-ops-hq/career-ops/issues/3708)
* **web:** opt-in origin allowlist for the local dashboard API ([#3597](https://github.com/career-ops-hq/career-ops/issues/3597)) ([0754973](https://github.com/ca