# 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=<file> and --top=<n>, 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 <Name>, 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 <em> ([#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/<Category>/<id>/ 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/career-ops-hq/career-ops/commit/075497329a55d7c1e5184cfffb21fd0efeaf13ba)) * **wttj:** server-side Algolia filters so a scan can be exhaustive ([#3757](https://github.com/career-ops-hq/career-ops/issues/3757)) ([c1df875](https://github.com/career-ops-hq/career-ops/commit/c1df875c768071369045caaf8c79f06a2fbf3059)) ### Bug Fixes * **analysis:** funnel-velocity, calibrate and weekly-digest read the configured data root ([#3715](https://github.com/career-ops-hq/career-ops/issues/3715)) ([d7ff406](https://github.com/career-ops-hq/career-ops/commit/d7ff4062269f4f1afa38c6615561288ff314f343)), closes [#3714](https://github.com/career-ops-hq/career-ops/issues/3714) * **analyze-patterns:** parse report headers written in French ([#3808](https://github.com/career-ops-hq/career-ops/issues/3808)) ([29f065f](https://github.com/career-ops-hq/career-ops/commit/29f065f1bed9872574c8999343b0102e698b25f4)), closes [#3807](https://github.com/career-ops-hq/career-ops/issues/3807) * **analyze-patterns:** read archetype headers from every localized mode ([#3866](https://github.com/career-ops-hq/career-ops/issues/3866)) ([9d182a9](https://github.com/career-ops-hq/career-ops/commit/9d182a9c2360fbabcfbb9e043fa96b359ef9255e)), closes [#3865](https://github.com/career-ops-hq/career-ops/issues/3865) * **check-jd-archive:** credit jds/ captures named by a tracker row ([5bcaddc](https://github.com/career-ops-hq/career-ops/commit/5bcaddc7fb2cceed869780b4fe36e2786a42e7d3)) * **check-jd-archive:** credit jds/ captures named by a tracker row ([3f9a3fc](https://github.com/career-ops-hq/career-ops/commit/3f9a3fc846ffcbb5b06b5c79e1e61d312ad5681a)) * **check-jd-archive:** reject login-wall/404/paywall/JS-shell text as non-content ([#3837](https://github.com/career-ops-hq/career-ops/issues/3837)) ([3834b91](https://github.com/career-ops-hq/career-ops/commit/3834b91843b903734447633f66fdefd41a42a3d1)), closes [#3829](https://github.com/career-ops-hq/career-ops/issues/3829) * **cli:** validate analyze-patterns flags through lib/cli-flags.mjs ([#3848](https://github.com/career-ops-hq/career-ops/issues/3848)) ([4d82beb](https://github.com/career-ops-hq/career-ops/commit/4d82beb4d3fc40baaef5a1f5d5817b9f797879a8)), closes [#2979](https://github.com/career-ops-hq/career-ops/issues/2979) * **cv:** render the ATS template's contact row ([#3838](https://github.com/career-ops-hq/career-ops/issues/3838)) ([e1aebed](https://github.com/career-ops-hq/career-ops/commit/e1aebed5bb6fd6d55e1cf47808bded623a0e4b48)), closes [#3775](https://github.com/career-ops-hq/career-ops/issues/3775) * **dashboard:** serve:dashboard respects CAREER_OPS_DATA_DIR ([#3929](https://github.com/career-ops-hq/career-ops/issues/3929)) ([b4bd6aa](https://github.com/career-ops-hq/career-ops/commit/b4bd6aa27582f1659085a5804f3c8cd5751eff18)), closes [#3924](https://github.com/career-ops-hq/career-ops/issues/3924) * **discover-ats:** a refused redirect is an answer, not a status to re-run ([#3804](https://github.com/career-ops-hq/career-ops/issues/3804)) ([80885c9](https://github.com/career-ops-hq/career-ops/commit/80885c9c45d288e3a86fa043db635d755afb1630)) * **doctor:** detect project-scoped Playwright MCP plugin installs ([#3711](https://github.com/career-ops-hq/career-ops/issues/3711)) ([719d1a4](https://github.com/career-ops-hq/career-ops/commit/719d1a4c64735fec4eb6f5f4b1616db4d181476c)) * **doctor:** keep git's "not a git repository" off stderr in --json ([#3722](https://github.com/career-ops-hq/career-ops/issues/3722)) ([8058eba](https://github.com/career-ops-hq/career-ops/commit/8058ebac18f248a36efa1dedcfac0a8ea9779b99)), closes [#3721](https://github.com/career-ops-hq/career-ops/issues/3721) * **doctor:** make CLI-resolution tests hermetic against a repo .env ([#2617](https://github.com/career-ops-hq/career-ops/issues/2617)) ([95225c1](https://github.com/career-ops-hq/career-ops/commit/95225c1be267116f44d5758b85e20c029602d33b)) * **eval:** parse the score in gemini-eval instead of concatenating it ([#3799](https://github.com/career-ops-hq/career-ops/issues/3799)) ([eedc6d9](https://github.com/career-ops-hq/career-ops/commit/eedc6d921c2988cfc26fca930044f731292db2c0)), closes [#3707](https://github.com/career-ops-hq/career-ops/issues/3707) * **eval:** persist openai/ollama evaluations as tracker additions ([#3797](https://github.com/career-ops-hq/career-ops/issues/3797)) ([090c2b4](https://github.com/career-ops-hq/career-ops/commit/090c2b4b89b762e32b53e191da06883d82e1f559)) * **followup-cadence:** accept --json, the flag both web follow-up routes pass ([#3862](https://github.com/career-ops-hq/career-ops/issues/3862)) ([57de2ea](https://github.com/career-ops-hq/career-ops/commit/57de2ea1c9dd9d891959926d5e00c2411c05ff60)) * four defects invisible in the maintainer's own checkout ([7f72883](https://github.com/career-ops-hq/career-ops/commit/7f72883d3965430db6aacb264a18be77c5e8358d)) * **garena:** route id encoding through _safe-url so one bad posting drops, not the page ([7bee848](https://github.com/career-ops-hq/career-ops/commit/7bee8480f4a3571d47fd9b2ba888122a21e52c0c)) * **gemini-eval:** write the **URL:** report header so its rows reach the URL dedup key ([#3876](https://github.com/career-ops-hq/career-ops/issues/3876)) ([f8e9201](https://github.com/career-ops-hq/career-ops/commit/f8e9201f2cd0f55f82291482ca57ea313037a8c5)), closes [#3795](https://github.com/career-ops-hq/career-ops/issues/3795) * **gitignore:** ignore the tracker and follow-ups file in the legacy root layout ([#3718](https://github.com/career-ops-hq/career-ops/issues/3718)) ([fc8ee60](https://github.com/career-ops-hq/career-ops/commit/fc8ee60419a56804924f00e7cde7f040a4effc41)), closes [#3717](https://github.com/career-ops-hq/career-ops/issues/3717) * **icims:** read every jobLocation entry when picking the location ([#3728](https://github.com/career-ops-hq/career-ops/issues/3728)) ([d5a5bc9](https://github.com/career-ops-hq/career-ops/commit/d5a5bc90a84e128ad095ad0775535187c73dcf05)), closes [#3727](https://github.com/career-ops-hq/career-ops/issues/3727) * **invite-match:** extract company names in any script, not just ASCII ([#3864](https://github.com/career-ops-hq/career-ops/issues/3864)) ([48513e7](https://github.com/career-ops-hq/career-ops/commit/48513e7951765161ce9ea5c51bc5d43222abd33a)), closes [#3861](https://github.com/career-ops-hq/career-ops/issues/3861) * **invite-match:** resolve set-status.mjs from the code root, not the data root ([cfc6b01](https://github.com/career-ops-hq/career-ops/commit/cfc6b0190eac5a1c919aefeb28a008a97b4d8864)) * **invite-match:** resolve set-status.mjs from the code root, not the data root ([5c65257](https://github.com/career-ops-hq/career-ops/commit/5c652575fd43e818ee0f1be7dc0aff646a3e773e)) * **jd-skill-gap:** resolve cv.md against the data root ([680f847](https://github.com/career-ops-hq/career-ops/commit/680f847d9c58486240141c8b5002b26797ea7e2d)) * **jd-skill-gap:** resolve cv.md against the data root ([#4209](https://github.com/career-ops-hq/career-ops/issues/4209)) ([4795dc1](https://github.com/career-ops-hq/career-ops/commit/4795dc19b8b9a232860c29d8c89210f2efa97277)) * **linkedin-join:** use the real people-search route ([#3811](https://github.com/career-ops-hq/career-ops/issues/3811)) ([b2aa0a9](https://github.com/career-ops-hq/career-ops/commit/b2aa0a976926952e874e7f5bf264ad3e3bdce072)) * **liveness:** stop reusing the headed page after its browser closes ([0baa692](https://github.com/career-ops-hq/career-ops/commit/0baa692755d2d3c1aa3d747910853683dcfbd0f9)) * **liveness:** stop reusing the headed page after its browser closes ([17d83e9](https://github.com/career-ops-hq/career-ops/commit/17d83e942502e90a41abe459f5b86f65ef747114)), closes [#4176](https://github.com/career-ops-hq/career-ops/issues/4176) * **merge-tracker:** --help exits early and post-merge hooks resolve from the code root under an external data root ([#3761](https://github.com/career-ops-hq/career-ops/issues/3761)) ([7a75b99](https://github.com/career-ops-hq/career-ops/commit/7a75b994cb1136513c1353403cd571e30cca9f69)) * **merge-tracker:** a corporate-form merge keeps the row's employer name and prefers an exact company match ([#3812](https://github.com/career-ops-hq/career-ops/issues/3812)) ([fd6cf93](https://github.com/career-ops-hq/career-ops/commit/fd6cf935776fcf8b15be0ad94475747aac55053e)) * **meta:** point CITATION.cff and package.json at career-ops.org, and stop the blurb drifting across five files ([2c76ca4](https://github.com/career-ops-hq/career-ops/commit/2c76ca434555dee6bf6236573225f257bbbdca24)) * **ollama-eval:** stream the response and make num_ctx configurable via OLLAMA_NUM_CTX ([#3922](https://github.com/career-ops-hq/career-ops/issues/3922)) ([fe06051](https://github.com/career-ops-hq/career-ops/commit/fe06051ba57c78934b89355bebe2c67f3a5cdb14)) * **pdf:** recognize Chinese section titles in SECTION_ALIASES ([#3803](https://github.com/career-ops-hq/career-ops/issues/3803)) ([49b6586](https://github.com/career-ops-hq/career-ops/commit/49b6586e5212e7d5e8553e6189f8978484a05387)), closes [#3658](https://github.com/career-ops-hq/career-ops/issues/3658) * **plugin-install:** add --help and reject unknown flags ([#3857](https://github.com/career-ops-hq/career-ops/issues/3857)) ([45f11b7](https://github.com/career-ops-hq/career-ops/commit/45f11b7b9058ec035a3bf3ba251322a2d9fdb392)) * **providers:** a lone surrogate in one id/slug no longer aborts the whole page ([7cdd684](https://github.com/career-ops-hq/career-ops/commit/7cdd6845278948b4d8379fb2fcebf39304e54994)) * **providers:** a lone surrogate in one id/slug no longer aborts the whole page ([d76bea0](https://github.com/career-ops-hq/career-ops/commit/d76bea0e1c3f9a8f3aab20ce583812774ceda23c)) * **providers:** apply default headers case-insensitively ([b12016b](https://github.com/career-ops-hq/career-ops/commit/b12016be15aeddf780ffc30a0010371a140c4319)) * **providers:** coerce before the try; drop tkms encode of the config locale ([94eebce](https://github.com/career-ops-hq/career-ops/commit/94eebced04e524572e201ee65df275a60f370771)) * **providers:** pin accept-encoding so zstd bodies are not truncated ([2049537](https://github.com/career-ops-hq/career-ops/commit/2049537c420e396d08425c6950203718cc55567c)) * **providers:** pin accept-encoding so zstd bodies are not truncated ([3b3a80d](https://github.com/career-ops-hq/career-ops/commit/3b3a80dfdbc14be9be17dd869b036c1a42537e6f)) * **providers:** radancy stops trusting totalResults, cache-busts JSON, retries every fetch ([#3839](https://github.com/career-ops-hq/career-ops/issues/3839)) ([4086d45](https://github.com/career-ops-hq/career-ops/commit/4086d4546b16b00d1de7b0b320933a83c7355835)) * **providers:** route feishu-jobs and mokahr id encoding through _safe-url ([fd3966a](https://github.com/career-ops-hq/career-ops/commit/fd3966aa50fbe8e2b603cf6a226c8b8ae777f3e1)) * **rejection-latency:** report placeholder-employer applications instead of dropping them silently ([#3712](https://github.com/career-ops-hq/career-ops/issues/3712)) ([d9fe917](https://github.com/career-ops-hq/career-ops/commit/d9fe9174d051a551dfd8b26ac4ece5445a509849)) * **rheinmetall:** guard the slug-fallback decode against a malformed percent-escape ([6efda1c](https://github.com/career-ops-hq/career-ops/commit/6efda1c1003188d70a1323685d44fd3882e6c3ed)) * **scan:** opt-in location-aware company+role dedupe ([#3751](https://github.com/career-ops-hq/career-ops/issues/3751)) ([ae97912](https://github.com/career-ops-hq/career-ops/commit/ae979122628b3c3b1746213c29af3a91f1b7f8ce)), closes [#3750](https://github.com/career-ops-hq/career-ops/issues/3750) * **scan:** prioritize configured locations in Workday facet recovery ([#3851](https://github.com/career-ops-hq/career-ops/issues/3851)) ([efede1c](https://github.com/career-ops-hq/career-ops/commit/efede1ce24257411629c37084e5e6c44428bf4e5)), closes [#3850](https://github.com/career-ops-hq/career-ops/issues/3850) * **templates:** make the CV template's second hardcoded color themeable ([#3699](https://github.com/career-ops-hq/career-ops/issues/3699)) ([351f7f5](https://github.com/career-ops-hq/career-ops/commit/351f7f5240b8ef1e7231cee7f906a583b7073834)), closes [#3695](https://github.com/career-ops-hq/career-ops/issues/3695) * **test-all:** discovered-suite guards ignore calls mentioned only in comments ([363b990](https://github.com/career-ops-hq/career-ops/commit/363b990eed503dca486c0e54b79358ebaa37ef2c)) * **test-all:** discovered-suite guards ignore calls mentioned only in comments ([e5c985d](https://github.com/career-ops-hq/career-ops/commit/e5c985d7d6f1dbf47f89bf4432bda890b117288f)) * **tests:** guard subtree-anchored walkers against nested checkouts ([#3792](https://github.com/career-ops-hq/career-ops/issues/3792)) ([5726853](https://github.com/career-ops-hq/career-ops/commit/5726853924fd5d2885413667fbbc0d06809cc3e9)) * **tests:** pass --confirm to apply in the local-paths regression leg ([#3755](https://github.com/career-ops-hq/career-ops/issues/3755)) ([e979d4e](https://github.com/career-ops-hq/career-ops/commit/e979d4e04c35807a3905ebfb3cc87f8d621192ce)) * **tests:** skip nested checkouts by marker, not by the name .git ([#3681](https://github.com/career-ops-hq/career-ops/issues/3681)) ([35a7cdb](https://github.com/career-ops-hq/career-ops/commit/35a7cdb22cd25fcb0ad59795606dfe660baf91c5)), closes [#3499](https://github.com/career-ops-hq/career-ops/issues/3499) * **tkms:** re-encode the config locale, hoisted out of the row loop to fail loud ([5b8f1f0](https://github.com/career-ops-hq/career-ops/commit/5b8f1f0d6cf5900c1cc557bd9c391239801fe4ff)) * **token-tracker:** add MiniMax-M3 and MiniMax-M2.7 rates ([#3800](https://github.com/career-ops-hq/career-ops/issues/3800)) ([8aef9e0](https://github.com/career-ops-hq/career-ops/commit/8aef9e057472972987edca0e3b36fd23c865e283)) * **tracker:** carry the tracker layout through the export round-trip ([#3794](https://github.com/career-ops-hq/career-ops/issues/3794)) ([4f12d84](https://github.com/career-ops-hq/career-ops/commit/4f12d845ed347766a808a1995f2a8bfdf1e6b48e)), closes [#3703](https://github.com/career-ops-hq/career-ops/issues/3703) * **tracker:** map "fecha" to the date column ([#3767](https://github.com/career-ops-hq/career-ops/issues/3767)) ([843d179](https://github.com/career-ops-hq/career-ops/commit/843d179624e09c5b9bc9ec372a2b21dd338ef94e)), closes [#3705](https://github.com/career-ops-hq/career-ops/issues/3705) * **tracker:** resolve addition columns by name so score and status cannot transpose ([00b0296](https://github.com/career-ops-hq/career-ops/commit/00b0296c6071eb955f38404e60a10ceaccad45b5)) * **tracker:** strip invisible control characters at the cell sanitizer ([#3902](https://github.com/career-ops-hq/career-ops/issues/3902)) ([dadc8f6](https://github.com/career-ops-hq/career-ops/commit/dadc8f645388678ae64e38300363586fd3a9fc24)), closes [#3892](https://github.com/career-ops-hq/career-ops/issues/3892) * **triage:** weights sum to 1.00 and a test pins prose against the formula ([#3831](https://github.com/career-ops-hq/career-ops/issues/3831)) ([6a8e876](https://github.com/career-ops-hq/career-ops/commit/6a8e8762168f1302daaa6928460dd027a7c06596)), closes [#3738](https://github.com/career-ops-hq/career-ops/issues/3738) * **update:** resolve preserved files before staging so :(exclude) never reaches --literal-pathspecs ([#3742](https://github.com/career-ops-hq/career-ops/issues/3742)) ([bbfae51](https://github.com/career-ops-hq/career-ops/commit/bbfae511a84964177022bcf44cf7d93aa385390e)), closes [#3740](https://github.com/career-ops-hq/career-ops/issues/3740) * **url-key:** preserve existing fragment comparison params ([02e632e](https://github.com/career-ops-hq/career-ops/commit/02e632e634280ef7224ec268279adbbe9f0650ce)) * **url-key:** preserve hash-route posting identity ([52f314c](https://github.com/career-ops-hq/career-ops/commit/52f314cd268bd0b2de56b71ba236ce288138dac0)) * **url-key:** preserve hash-route posting identity ([965fff3](https://github.com/career-ops-hq/career-ops/commit/965fff30149eff1da2f6b1a937ca3738260b9a2e)) * **verify-cv-facts:** a proposed plan horizon is not a metric claim ([#3656](https://github.com/career-ops-hq/career-ops/issues/3656)) ([ad2e6e8](https://github.com/career-ops-hq/career-ops/commit/ad2e6e8cc41329855645bc5f2a07f6f3af0d49e3)) * **verify-cv-facts:** require a real word, not a bare capital letter, for a title claim ([#3909](https://github.com/career-ops-hq/career-ops/issues/3909)) ([914cac3](https://github.com/career-ops-hq/career-ops/commit/914cac3605dd2473d7765c31a7add127c3a1781d)), closes [#3907](https://github.com/career-ops-hq/career-ops/issues/3907) * **verify-cv-facts:** stop flagging ordinary prose as tool claims ([#3643](https://github.com/career-ops-hq/career-ops/issues/3643)) ([6043ef8](https://github.com/career-ops-hq/career-ops/commit/6043ef811f2c3449ddfe1e658419526fe7aaeda2)), closes [#3639](https://github.com/career-ops-hq/career-ops/issues/3639) * **verify-cv-facts:** tell a disabled fact gate apart from one that ran clean ([#3901](https://github.com/career-ops-hq/career-ops/issues/3901)) ([60f0146](https://github.com/career-ops-hq/career-ops/commit/60f014696822c1744794816c12e51f1bc1d840f2)), closes [#3894](https://github.com/career-ops-hq/career-ops/issues/3894) * **web:** detect a real tailored CV/cover on disk, not just the tracker flag ([0fb2080](https://github.com/career-ops-hq/career-ops/commit/0fb2080db1a5c90b3655bff7fdf74593026adf04)) * **web:** don't let a failed fetch become a scored report ([#3826](https://github.com/career-ops-hq/career-ops/issues/3826)) ([10ede60](https://github.com/career-ops-hq/career-ops/commit/10ede60522f1abd71dfd8c93266f9176180213ac)) * **web:** fence agent CLIs at the spawn boundary ([1d2cb1e](https://github.com/career-ops-hq/career-ops/commit/1d2cb1e125ea3034ff01b464e9a5e2628c0e315f)) * **web:** give grok a parser, and make the token fold per-CLI ([#2689](https://github.com/career-ops-hq/career-ops/issues/2689)) ([c7549fb](https://github.com/career-ops-hq/career-ops/commit/c7549fb3593f9ee456d7118beb80b0ee6e76747c)) * **web:** identify the verdict block by its heading, not by the letter ([#3502](https://github.com/career-ops-hq/career-ops/issues/3502)) ([0ef1bfb](https://github.com/career-ops-hq/career-ops/commit/0ef1bfbe2385551af415e05858900710d0aadd23)) * **web:** parseCliJson misses set-status.mjs's pretty-printed success ([#3602](https://github.com/career-ops-hq/career-ops/issues/3602)) ([848ca44](https://github.com/career-ops-hq/career-ops/commit/848ca440fb2d243ae08205ab3d0bc12903a36c65)) * **web:** resolve the tailored cover for THIS application, not the company's newest ([8fc2bb4](https://github.com/career-ops-hq/career-ops/commit/8fc2bb41db2aad7bf50902ad8a26e726c9637eec)) * **workday:** tag a split whose chosen facet under-covers the board ([#3874](https://github.com/career-ops-hq/career-ops/issues/3874)) ([51a45d9](https://github.com/career-ops-hq/career-ops/commit/51a45d9c3802b0d8ab0de052dc723b2afd33df06)) ## [1.32.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.31.0...career-ops-v1.32.0) (2026-09-03) ### Features * **discard:** add discard-log analytics and tuning summary ([#3443](https://github.com/career-ops-hq/career-ops/issues/3443)) ([8827f40](https://github.com/career-ops-hq/career-ops/commit/8827f4064bf6afe3e8922ec0b99ef74e74c7c99a)), closes [#3392](https://github.com/career-ops-hq/career-ops/issues/3392) * **oferta:** add evidence-tiered requirement importance to Block B ([#3596](https://github.com/career-ops-hq/career-ops/issues/3596)) ([14710e2](https://github.com/career-ops-hq/career-ops/commit/14710e29a6a801ea3ae52bb3f15756dc9ada7d29)) * **plugin:** add h1b-sponsor for DOL sponsorship history on US roles ([#2635](https://github.com/career-ops-hq/career-ops/issues/2635)) ([11ae621](https://github.com/career-ops-hq/career-ops/commit/11ae621cc505a21d835abc751fa0e2ac8ac9959d)) * **providers:** add Built In aggregator provider ([#3645](https://github.com/career-ops-hq/career-ops/issues/3645)) ([291c301](https://github.com/career-ops-hq/career-ops/commit/291c301051f54936dd14d65200a1fd06db6c2989)) * **providers:** add Feishu Jobs and MokaHR scanner providers ([#3491](https://github.com/career-ops-hq/career-ops/issues/3491)) ([1696bec](https://github.com/career-ops-hq/career-ops/commit/1696bec4d021768e7359f9aad6b329cba883da20)) * **providers:** add Garena careers provider ([#3567](https://github.com/career-ops-hq/career-ops/issues/3567)) ([d88cfe1](https://github.com/career-ops-hq/career-ops/commit/d88cfe160cfc1637fe5b5562726726d00a020974)) * **scan:** add a durable machine-readable scan receipt ([#3532](https://github.com/career-ops-hq/career-ops/issues/3532)) ([26f47d2](https://github.com/career-ops-hq/career-ops/commit/26f47d2972b6a2bcf00c2aa707744691a0f0ec63)) * **scan:** remember permanently dead ATS boards ([#2869](https://github.com/career-ops-hq/career-ops/issues/2869)) ([bf54f20](https://github.com/career-ops-hq/career-ops/commit/bf54f20eaf295808a037cac0c5dec2810798f4e9)), closes [#2840](https://github.com/career-ops-hq/career-ops/issues/2840) * **templates:** CJK support for the LaTeX/Overleaf CV path via tectonic ([#3554](https://github.com/career-ops-hq/career-ops/issues/3554)) ([1b58724](https://github.com/career-ops-hq/career-ops/commit/1b5872460bf57cd810807ac33957c2f5104dd61c)), closes [#3553](https://github.com/career-ops-hq/career-ops/issues/3553) * **updater:** require confirmation before installation ([#2866](https://github.com/career-ops-hq/career-ops/issues/2866)) ([f33b8e2](https://github.com/career-ops-hq/career-ops/commit/f33b8e2dfa88b02b13460332c3d09e152d8e3a7b)), closes [#2865](https://github.com/career-ops-hq/career-ops/issues/2865) ### Bug Fixes * **agent-inbox:** lock resolve rewrites so a concurrent add is never dropped ([#3479](https://github.com/career-ops-hq/career-ops/issues/3479)) ([e26a8cc](https://github.com/career-ops-hq/career-ops/commit/e26a8cc23ca0dc5c4e7d00873347e690e2b6b2e6)), closes [#3478](https://github.com/career-ops-hq/career-ops/issues/3478) * **analyze-patterns:** stop counting Applied as positive ([#3667](https://github.com/career-ops-hq/career-ops/issues/3667)) ([f4df0c6](https://github.com/career-ops-hq/career-ops/commit/f4df0c6ab0325ed42403759c7724456eba3b5c9f)) * **calibrate:** resolve the tracker colmap from the line array, not the header line ([#3496](https://github.com/career-ops-hq/career-ops/issues/3496)) ([abaf075](https://github.com/career-ops-hq/career-ops/commit/abaf07565ba888d181cf8d1d094610f3c0c3e1f1)), closes [#3495](https://github.com/career-ops-hq/career-ops/issues/3495) * **cv:** block delegated authorship escalation ([#3657](https://github.com/career-ops-hq/career-ops/issues/3657)) ([08bdb3f](https://github.com/career-ops-hq/career-ops/commit/08bdb3f184f4abf7b355915609a71985d30c1881)) * **cv:** reject CV payloads whose section keys the builders never read ([#3524](https://github.com/career-ops-hq/career-ops/issues/3524)) ([9f6efb5](https://github.com/career-ops-hq/career-ops/commit/9f6efb5c73d890675c269099fd1b182d3d6ddb42)), closes [#3523](https://github.com/career-ops-hq/career-ops/issues/3523) * **dashboard:** match company slugs at hyphen boundaries so Meta cannot open Metabase's CV ([#3483](https://github.com/career-ops-hq/career-ops/issues/3483)) ([f5e2753](https://github.com/career-ops-hq/career-ops/commit/f5e27531e866514441bcd6f9e03b56db93b93c91)) * **data-root:** resolve templates/states.yml from the codebase, not the data root ([#3503](https://github.com/career-ops-hq/career-ops/issues/3503)) ([be61f60](https://github.com/career-ops-hq/career-ops/commit/be61f60be88aed8277cef2f498140c098517e65e)) * **email:** align fit points with the tailored CV via the pdf-index row ([#3473](https://github.com/career-ops-hq/career-ops/issues/3473)) ([d08aac2](https://github.com/career-ops-hq/career-ops/commit/d08aac29e33775245f70d1f5b9a781103f40777d)), closes [#3460](https://github.com/career-ops-hq/career-ops/issues/3460) * **fact-gate:** count education and training nouns as metrics ([#3646](https://github.com/career-ops-hq/career-ops/issues/3646)) ([12b1a4a](https://github.com/career-ops-hq/career-ops/commit/12b1a4a2f54cdabfa33faf35519c55e255899155)) * **funnel-velocity:** fold status-log history into calibration rates ([#3494](https://github.com/career-ops-hq/career-ops/issues/3494)) ([369db53](https://github.com/career-ops-hq/career-ops/commit/369db538ccf4c62eff5de890433a9e00805b6d41)), closes [#3493](https://github.com/career-ops-hq/career-ops/issues/3493) * **gemini:** resolve encoding mojibake on Windows and route localized modes ([#1443](https://github.com/career-ops-hq/career-ops/issues/1443)) ([3f54486](https://github.com/career-ops-hq/career-ops/commit/3f54486e540a74ef1a6eca81f2bda9ab59bc7ca4)) * **gitignore:** the tracker's derived SQLite index is unignored outside data/ ([#3468](https://github.com/career-ops-hq/career-ops/issues/3468)) ([bc5771a](https://github.com/career-ops-hq/career-ops/commit/bc5771a12fab34ce28b66856be54ece6504b6e3a)) * **gmail:** skip page assets so logos stop landing as job leads ([#3649](https://github.com/career-ops-hq/career-ops/issues/3649)) ([c172fd8](https://github.com/career-ops-hq/career-ops/commit/c172fd8993862f5ad99dfdf6dc67f3cc650d087f)) * harden context budget prompt assembly ([#3591](https://github.com/career-ops-hq/career-ops/issues/3591)) ([1be498d](https://github.com/career-ops-hq/career-ops/commit/1be498d177cf8a52e6f7affe2d00f12baf552394)) * **invite-match:** stop extractReqId backtracking quadratically ([#3463](https://github.com/career-ops-hq/career-ops/issues/3463)) ([637e7eb](https://github.com/career-ops-hq/career-ops/commit/637e7eb718d7ac1a2bb19706b892b07e7f636b78)) * **jd-skill-gap:** recognize Traditional and Simplified Chinese requirement headings ([#3631](https://github.com/career-ops-hq/career-ops/issues/3631)) ([08e8747](https://github.com/career-ops-hq/career-ops/commit/08e8747fe0a77756db54b0f88bd3e8dc45b8c58a)) * **merge-tracker:** a corporate-suffix variant is the same employer ([#3666](https://github.com/career-ops-hq/career-ops/issues/3666)) ([a4f5276](https://github.com/career-ops-hq/career-ops/commit/a4f52765f1920c353933984ff5ed71da50bedf36)), closes [#3665](https://github.com/career-ops-hq/career-ops/issues/3665) * **merge-tracker:** two '?' rows with no Via silently merge, overwriting one ([#3466](https://github.com/career-ops-hq/career-ops/issues/3466)) ([8f22538](https://github.com/career-ops-hq/career-ops/commit/8f22538a1458ee7fe5ad0da70183facf72361d90)), closes [#3410](https://github.com/career-ops-hq/career-ops/issues/3410) * **oferta:** lead Block B with the decisive columns and freeze their order ([#3660](https://github.com/career-ops-hq/career-ops/issues/3660)) ([abc5a89](https://github.com/career-ops-hq/career-ops/commit/abc5a893a61b752b1e410d5145c044b82638f0d2)) * **openai-eval:** stream the evaluation call instead of a single buffered response ([#3501](https://github.com/career-ops-hq/career-ops/issues/3501)) ([ee6e8f6](https://github.com/career-ops-hq/career-ops/commit/ee6e8f63ce6f1a62d64e22a9fb37c28b2a000429)) * **openrouter:** write scan-history and pipeline through the shared locked writers ([#3462](https://github.com/career-ops-hq/career-ops/issues/3462)) ([81e27c5](https://github.com/career-ops-hq/career-ops/commit/81e27c5e9b6225b73383dea4f9fe464977821123)) * **pdf:** accept the canonical modes/pdf.md tailoring order in validateCvSectionOrder ([#3642](https://github.com/career-ops-hq/career-ops/issues/3642)) ([a9c957c](https://github.com/career-ops-hq/career-ops/commit/a9c957caedea5dbdc17d165d072dd66d330b42d4)) * **pdf:** run the fact gate before rendering a CV ([#3647](https://github.com/career-ops-hq/career-ops/issues/3647)) ([1b299fa](https://github.com/career-ops-hq/career-ops/commit/1b299faa659c782d2385c4119191c382a0b01dea)) * **plugins:** a YAML typo in plugins.yml no longer destroys the whole config ([#3593](https://github.com/career-ops-hq/career-ops/issues/3593)) ([00f185d](https://github.com/career-ops-hq/career-ops/commit/00f185d672dd7bf2499f5a3ae7ee7be340493da3)), closes [#3592](https://github.com/career-ops-hq/career-ops/issues/3592) * **portals:** sweep and validate job_boards, not only tracked_companies ([#3448](https://github.com/career-ops-hq/career-ops/issues/3448)) ([2c5894e](https://github.com/career-ops-hq/career-ops/commit/2c5894e0a4a74146bf04b8c8532e338d45a131ea)) * **reply-matcher:** a partial role-word match must be a whole word ([#3535](https://github.com/career-ops-hq/career-ops/issues/3535)) ([90d311f](https://github.com/career-ops-hq/career-ops/commit/90d311f25684ed66180825d679ce78c38adb62e7)) * **reserve-report-num:** handle --help/-h explicitly ([#3569](https://github.com/career-ops-hq/career-ops/issues/3569)) ([84693b4](https://github.com/career-ops-hq/career-ops/commit/84693b407326e0ae65274e2eebaf613de890f515)) * **role-matcher:** a level stated on both sides of a title must agree ([#3651](https://github.com/career-ops-hq/career-ops/issues/3651)) ([dfeb2fc](https://github.com/career-ops-hq/career-ops/commit/dfeb2fccd4a0c2a27e666969823150b61ee91159)) * **scaffolder:** restore the published npm package name ([5e2bf5b](https://github.com/career-ops-hq/career-ops/commit/5e2bf5b9726097413294f3acffb3a2025ae9570f)) * **scan-ats-full:** collapse a Workday requisition served under several sites of one tenant ([#3446](https://github.com/career-ops-hq/career-ops/issues/3446)) ([5c26e4a](https://github.com/career-ops-hq/career-ops/commit/5c26e4af43b89a11f79caa7592a1a2e03caeb55d)) * **scan-ats-full:** send the progress counter to stderr under --json ([fa6a84f](https://github.com/career-ops-hq/career-ops/commit/fa6a84f48d949bd75ff5d94839494a1ef7a70a20)) * **scan:** do not block Dublin OH as Ireland ([#3633](https://github.com/career-ops-hq/career-ops/issues/3633)) ([56429bf](https://github.com/career-ops-hq/career-ops/commit/56429bfaa07ec695581500fbfd12184e9ba43723)) * **scan:** resolve scanner user data against the data root, not the cwd ([#3511](https://github.com/career-ops-hq/career-ops/issues/3511)) ([7d7b0f9](https://github.com/career-ops-hq/career-ops/commit/7d7b0f97d447a2d1c72b7b3a24c9c99ebc9a5d7a)), closes [#3510](https://github.com/career-ops-hq/career-ops/issues/3510) * **set-status:** a transition into Applied seeds the follow-up from set-status itself ([#3470](https://github.com/career-ops-hq/career-ops/issues/3470)) ([9312da7](https://github.com/career-ops-hq/career-ops/commit/9312da7ee49e24f496dcb81adec86530de644051)), closes [#3459](https://github.com/career-ops-hq/career-ops/issues/3459) * **skill-extract:** recognize marketing/GTM skills and stop reporting tracked employers as gaps ([#3537](https://github.com/career-ops-hq/career-ops/issues/3537)) ([f8de04e](https://github.com/career-ops-hq/career-ops/commit/f8de04e20444fbd80d034c0d37fd3d47a82b0501)) * **templates:** honor profile font_family in the Traditional Chinese CV block ([#3525](https://github.com/career-ops-hq/career-ops/issues/3525)) ([f0d2082](https://github.com/career-ops-hq/career-ops/commit/f0d2082a4f2b7668e825016bccb18e219b3c982d)), closes [#3154](https://github.com/career-ops-hq/career-ops/issues/3154) * **templates:** keep CJK fallback fonts active for ja, zh-CN and ko ([#3531](https://github.com/career-ops-hq/career-ops/issues/3531)) ([f3b7c60](https://github.com/career-ops-hq/career-ops/commit/f3b7c60f18ff25e8122a3cea6d1e22c4005acae3)) * **tests:** answer gitignore probes that cross a user-layer symlink ([#3598](https://github.com/career-ops-hq/career-ops/issues/3598)) ([aa8832f](https://github.com/career-ops-hq/career-ops/commit/aa8832f2c1795f2ae9e802d9eb5d20fb807f3e00)) * **tests:** stop the photo suite writing cv-preview.html into the user's data root ([#3599](https://github.com/career-ops-hq/career-ops/issues/3599)) ([f1b7a8e](https://github.com/career-ops-hq/career-ops/commit/f1b7a8e582c385254539488fb7c82224a333a49a)) * **tracker:** reject malformed application IDs instead of coercing them ([#3485](https://github.com/career-ops-hq/career-ops/issues/3485)) ([c68a7d4](https://github.com/career-ops-hq/career-ops/commit/c68a7d46b6fe1e5869b8316b0814cc4c0675cd95)) * **tracker:** resolve templates/states.yml from the module, not the cwd ([#3509](https://github.com/career-ops-hq/career-ops/issues/3509)) ([08b7f31](https://github.com/career-ops-hq/career-ops/commit/08b7f317b596fa010d06cd28f8a9b53799c02fd1)), closes [#3508](https://github.com/career-ops-hq/career-ops/issues/3508) * **tracker:** resolve the derived index path at call time, not at import ([#3507](https://github.com/career-ops-hq/career-ops/issues/3507)) ([9bd4445](https://github.com/career-ops-hq/career-ops/commit/9bd4445e25e1308aefe44e6f04c1750c373edaff)) * **tracker:** sort the applications table by # ascending on write ([#3515](https://github.com/career-ops-hq/career-ops/issues/3515)) ([372cd04](https://github.com/career-ops-hq/career-ops/commit/372cd043b35e8d07cd522fec955a65252c0906db)) * **triage:** fall back to Playwright when WebFetch finds nothing ([#3571](https://github.com/career-ops-hq/career-ops/issues/3571)) ([10b93a5](https://github.com/career-ops-hq/career-ops/commit/10b93a5f6e4444332243fefaef65b8b153835fc1)) * **update-system:** apply() cannot commit when a path it stages is ignored or never tracked ([ae6909f](https://github.com/career-ops-hq/career-ops/commit/ae6909f718c9316a0d1424379e1688f438a07706)) * **update:** point the updater at the repository's new home ([9063495](https://github.com/career-ops-hq/career-ops/commit/9063495036e253668e42d6bbbd4234e750b25782)) * **updater:** back up self-bootstrap edits before checkout ([#3474](https://github.com/career-ops-hq/career-ops/issues/3474)) ([203c90b](https://github.com/career-ops-hq/career-ops/commit/203c90b79e632209e3a55068499f8ca5cbea489e)) * **updater:** scope commits to shipped files ([#3688](https://github.com/career-ops-hq/career-ops/issues/3688)) ([455bf37](https://github.com/career-ops-hq/career-ops/commit/455bf375a84508a955acd58819392fa9f7a07bd0)) * **verify-cv-facts:** bind a count to the nearest metric noun, not the farthest ([#3465](https://github.com/career-ops-hq/career-ops/issues/3465)) ([53620d3](https://github.com/career-ops-hq/career-ops/commit/53620d3bfaf10652bb8d746c73758ad5cda8fe5c)) * **web,dashboard:** point two user-facing references at the repository's new home ([6c0e68d](https://github.com/career-ops-hq/career-ops/commit/6c0e68d472d4ee1e0082fd861c133778f262ecfe)) * **web:** a company with no usable slug must not match every tailored CV ([#3214](https://github.com/career-ops-hq/career-ops/issues/3214)) ([880c58b](https://github.com/career-ops-hq/career-ops/commit/880c58b999033b7f38439f20246943e9342e7fdf)) * **web:** enable apply from the generated pdf index ([ac761fa](https://github.com/career-ops-hq/career-ops/commit/ac761fa612fc943b1ef9458f704fefd653954955)) * **web:** find Grok in its default install dirs, not only on PATH ([77657dc](https://github.com/career-ops-hq/career-ops/commit/77657dcd0bcb7c2e9a9950148d337d160aa5b459)) * **web:** order the Today action queue before truncating it ([3a067ee](https://github.com/career-ops-hq/career-ops/commit/3a067ee580b7982cf5dd6edf7895112e4e99600b)) * **web:** preserve a malformed portals.yml instead of overwriting it with the example ([07ed4f3](https://github.com/career-ops-hq/career-ops/commit/07ed4f31295bee9d03ce1ab61d6d59c835431ff7)) * **web:** rank "Awaiting your decision" by every EVALUATED alias, not an English prefix ([d7573e1](https://github.com/career-ops-hq/career-ops/commit/d7573e189193993c56d19c9216313f0fd4cebee2)) * **web:** require the cv- prefix so the tailored-CV resolvers stop returning the cover letter ([#2156](https://github.com/career-ops-hq/career-ops/issues/2156)) ([414d340](https://github.com/career-ops-hq/career-ops/commit/414d340b4425bf199ddad36dfc0a551da4e99fe0)) * **web:** resolve the tailored CV for THIS application, not the newest for the company ([ca11627](https://github.com/career-ops-hq/career-ops/commit/ca116279d3a5ba9a18e57e3f03f056066c178649)) * **web:** self-host the production fonts so the app starts without Google ([a2e46c3](https://github.com/career-ops-hq/career-ops/commit/a2e46c329fa9819ca6748a437c4ecdbdac4a6ec2)) * **web:** tell the beta reporter's user when the dupe search could not run ([77bf490](https://github.com/career-ops-hq/career-ops/commit/77bf4906abc5c5f63ac07a6c27a7f24c1d03683d)) * **workday:** recover offset-clamped tenants with a facet split ([#3310](https://github.com/career-ops-hq/career-ops/issues/3310)) ([e268a5a](https://github.com/career-ops-hq/career-ops/commit/e268a5a226b15c8e695db923b85416423490bf65)) * **workday:** resolve a CXS-form URL as the endpoint, not as a careers page ([#3505](https://github.com/career-ops-hq/career-ops/issues/3505)) ([0dbe4a9](https://github.com/career-ops-hq/career-ops/commit/0dbe4a9129d3c3a5dbaec1c883320b327958f5ca)) ## [1.31.0](https://github.com/santifer/career-ops/compare/career-ops-v1.30.0...career-ops-v1.31.0) (2026-08-31) ### Features * **application-answers:** read the evaluation's Block H draft answers ([778d5bf](https://github.com/santifer/career-ops/commit/778d5bf15ceccbffab13284b7e5752d68aafd44e)) * **cv:** add "text" output_format — tailored markdown CV, no PDF ([#3342](https://github.com/santifer/career-ops/issues/3342)) ([13de717](https://github.com/santifer/career-ops/commit/13de7175b176742573f31ca8221fa46acc3a92da)) * **cv:** ATS-friendliness check — score a generated CV for parseability ([#2064](https://github.com/santifer/career-ops/issues/2064)) ([6d4e4c7](https://github.com/santifer/career-ops/commit/6d4e4c75b1a60a2e907c648e667dea4d4d2b2a9d)) * external data directory via CAREER_OPS_ROOT ([#524](https://github.com/santifer/career-ops/issues/524)) — lands [#1444](https://github.com/santifer/career-ops/issues/1444) ([9159ec6](https://github.com/santifer/career-ops/commit/9159ec6b34cdd1a3226d03c10d6f34c370175e56)) * **hired-wall:** a quiet chevron with the exact remainder says the strip continues ([87e3188](https://github.com/santifer/career-ops/commit/87e3188712ff5dda72013bb6ceffd9ca333d5bd7)) * **hired-wall:** the audit line speaks to the person mid-search ([c74dfc3](https://github.com/santifer/career-ops/commit/c74dfc32a83e1c36aa3e264f887dc97efea6b0be)) * **hired-wall:** the badge is the title — self-identifying label, own share line, tighter audit line ([7280a48](https://github.com/santifer/career-ops/commit/7280a48731f337563435c756e2ec0754b5115d4c)) * **portals:** profession-agnostic examples in portals.example.yml ([b8614f8](https://github.com/santifer/career-ops/commit/b8614f802a67bf6e7d2fcc402435c14464e5c005)) * **providers:** JobsDB Hong Kong via the existing jobstreet provider ([6fa8279](https://github.com/santifer/career-ops/commit/6fa8279797e3b4dc90dfab38dad62359b1d0dc65)) * **web:** add a global "Back to Top" button ([#2821](https://github.com/santifer/career-ops/issues/2821)) ([e5e786b](https://github.com/santifer/career-ops/commit/e5e786b1116e6c5e4c5bd2020f3bc1f6e5dd2058)) * wire reply-watch into status-log.tsv ([#1582](https://github.com/santifer/career-ops/issues/1582)) ([f88df83](https://github.com/santifer/career-ops/commit/f88df83934503418d77a8cbce4dc5942c5e18bb8)) ### Bug Fixes * **coverage:** exclude the local-paths declaration file so a fork can commit it ([280044e](https://github.com/santifer/career-ops/commit/280044e1fe14e9b25f067324bf7a87ba9828649f)) * **cv-sync-check:** resolve prompt paths from CODE_ROOT instead of an undefined projectRoot ([d6df7a2](https://github.com/santifer/career-ops/commit/d6df7a290581d186f46f94969c1b52fa1a68f8aa)) * **cv-sync-check:** stop allowFail from excusing an uncaught crash ([a19da42](https://github.com/santifer/career-ops/commit/a19da42dc6f71c17f52d5b907ea7980429576851)) * **dashboard:** read job URLs from the tracker before the legacy enrichment tiers ([c124fb6](https://github.com/santifer/career-ops/commit/c124fb668e594f92d78d6ff8d178a48ffa90f908)) * **deps:** refresh web lockfile for Next update ([2ca6c00](https://github.com/santifer/career-ops/commit/2ca6c00fa9d18cb45caef99fea0b97b05971bf55)) * **doctor:** survive a null entry in installed_plugins.json ([0a137a1](https://github.com/santifer/career-ops/commit/0a137a14c936d83a81f537661417e04ada2e37a5)) * **harness:** make the syntax gate recursive, shared with npm run lint ([43f846c](https://github.com/santifer/career-ops/commit/43f846ca49587a8507af2db5c8af76d7a11ba7b5)) * **hired-share:** suggest outcome.mjs's real syntax in the no-Hired-row error ([4a69583](https://github.com/santifer/career-ops/commit/4a69583146723b5dd753185ae0d0ca029e03534c)) * **providers/icims:** fill a missing location from the posting's JSON-LD ([20ec88f](https://github.com/santifer/career-ops/commit/20ec88fdacec63a9a3d29ca3b5ed9c07e33dfaea)) * **scan:** Level 1 runs Playwright sequentially, matching the shared-session rule ([77eebc9](https://github.com/santifer/career-ops/commit/77eebc95877d993fddca4c30aeee7eeff439bc65)) * **scan:** opt-in word:/stem: anchoring for content_filter keywords ([ce3ac16](https://github.com/santifer/career-ops/commit/ce3ac16bdd2438f5f4eea05ec8f03f8305e7f36c)) * **tests:** scope the profile pin and move the last hand-registered suites ([0bcd0fa](https://github.com/santifer/career-ops/commit/0bcd0fae30165b8c13d6b7fd6d28eda8e2fe367a)) * **update-system:** refuse to run when the install is not its own git toplevel ([aecae53](https://github.com/santifer/career-ops/commit/aecae537fe7cf52b1da92ff05aaa5976cf85d18f)) * **updater:** parse git status with -z so quoted paths and renames match real files ([79152e7](https://github.com/santifer/career-ops/commit/79152e732ecddf587d6f4011903139b9fd06c612)) * **verify-pipeline:** recover a report number from a link target written with backslashes ([8177808](https://github.com/santifer/career-ops/commit/81778084cff5341a62026a936ccf616821a524de)) * **web:** honour language.modes_dir and language.output on web-triggered runs ([#3253](https://github.com/santifer/career-ops/issues/3253)) ([316906e](https://github.com/santifer/career-ops/commit/316906e64cc779d7580122b1d345c4c06f503a4b)) * **web:** ignore nonfatal CLI stderr on clean run exit ([#1974](https://github.com/santifer/career-ops/issues/1974)) ([7f430ee](https://github.com/santifer/career-ops/commit/7f430eeab07b8bd514295fd02aec571c42699d1e)) * **web:** only surface follow-ups that are actually due ([#2157](https://github.com/santifer/career-ops/issues/2157)) ([82e1055](https://github.com/santifer/career-ops/commit/82e10559beb8c80d8a50bcd456e1a893e8ba76f8)) * **web:** regenerate the nested web/ lockfile on postcss bumps ([dba2a2e](https://github.com/santifer/career-ops/commit/dba2a2ed7e6317e5962be51c2fe680376221e0de)) * **web:** show a cause-specific hint on job failure instead of an always-auth prompt ([#2158](https://github.com/santifer/career-ops/issues/2158)) ([d372908](https://github.com/santifer/career-ops/commit/d37290897f15f5284788c34cafcdabd3bd56f5bf)) * **web:** show Via attribution for confidential employers ([f749939](https://github.com/santifer/career-ops/commit/f7499392ff75bf966693bdae535f785743ad300d)) * **web:** stop evaluation tables collapsing to one word per line ([#3254](https://github.com/santifer/career-ops/issues/3254)) ([b3c1e12](https://github.com/santifer/career-ops/commit/b3c1e127e02c588aeefb8d02d14759706ecf1fc2)) * **web:** stop tracing runtime data paths ([0a9d71f](https://github.com/santifer/career-ops/commit/0a9d71fe94286bfe26cdd99e5d7b3d50b27a948a)) * **web:** tab label spacing and report table word-breaking ([#3160](https://github.com/santifer/career-ops/issues/3160)) ([102560b](https://github.com/santifer/career-ops/commit/102560bb904f5d107338719f8ce3bdce8d9399e5)) * **web:** use next/link for decision-card report link ([#1931](https://github.com/santifer/career-ops/issues/1931)) ([e7b38b3](https://github.com/santifer/career-ops/commit/e7b38b3e086540060f5f5704afd55ea5fa4a4a3c)) ## [1.30.0](https://github.com/santifer/career-ops/compare/career-ops-v1.29.0...career-ops-v1.30.0) (2026-08-27) ### Features * add /calibrate — check evaluation scores against real outcomes ([#3315](https://github.com/santifer/career-ops/issues/3315)) ([4934985](https://github.com/santifer/career-ops/commit/493498572b54c8fed6081281a1190690c01e3f55)) * **apply:** recover previous answers through --read --strict at the CLI seam ([75d6b2c](https://github.com/santifer/career-ops/commit/75d6b2c64315a0820b4a78b254b1c649f3386aa3)) * **artifacts:** ATS form copy-paste plain-text exporter ([#2887](https://github.com/santifer/career-ops/issues/2887)) ([9f79f09](https://github.com/santifer/career-ops/commit/9f79f0921ee0ad2a62b55ab63456057a43831168)) * clean-markers — audit/strip hidden Unicode from generated text outputs ([5fde72f](https://github.com/santifer/career-ops/commit/5fde72f80094c17a3539ecfc34b391c545b682a4)) * **cli:** add help flags to check-liveness ([#2576](https://github.com/santifer/career-ops/issues/2576)) ([4f5934b](https://github.com/santifer/career-ops/commit/4f5934b9152098f2e6bfc66d1ca57fced9d6a07e)) * **cli:** application-artifacts.mjs honours --help ([#2774](https://github.com/santifer/career-ops/issues/2774)) ([c265217](https://github.com/santifer/career-ops/commit/c265217791abf606ee206d37f12ccb687e5c1739)) * **community:** PR adoption ladder for quiet PRs ([c86841b](https://github.com/santifer/career-ops/commit/c86841b87eb4e7f6cbdfcf3bc76672d9b7af8fb8)) * **community:** the Hired Wall, a verifiable ledger of people hired with career-ops ([#3372](https://github.com/santifer/career-ops/issues/3372)) ([542491f](https://github.com/santifer/career-ops/commit/542491fb65811331057987e6dc2734783a070464)) * **cv:** add optional Interests section to the HTML CV template ([2e7f1df](https://github.com/santifer/career-ops/commit/2e7f1dfcc8a1082f9ab6a4e7c2a8ca9d86f1feab)) * **doctor:** detect personalization files still carrying template content ([#2691](https://github.com/santifer/career-ops/issues/2691)) ([0cdd935](https://github.com/santifer/career-ops/commit/0cdd935c0d8a71a58121a625e2c18f5a2b86d8f0)) * **hired-wall:** anonymous cards carry sector · location, mirroring the credited-card hierarchy ([9f226e0](https://github.com/santifer/career-ops/commit/9f226e00bf4c98cae8ad30a070ecec1b15372e37)) * **hired-wall:** verified-hires framing, one CTA line, anonymous silhouette, months parsing ([fb8d6a5](https://github.com/santifer/career-ops/commit/fb8d6a5acae19cffb53239b0f486a8407d8b00a7)) * **outcome:** add --clean-output to archive-then-remove tailored CVs ([#2653](https://github.com/santifer/career-ops/issues/2653)) ([6ab969d](https://github.com/santifer/career-ops/commit/6ab969dade42de66b5b32badcb2dd5cca2ea6b00)) * **plugins:** register career-ops-plugin-xquik (X hiring posts via Xquik, BYO-key) ([88b325c](https://github.com/santifer/career-ops/commit/88b325c13026c14ab926398f5c7d451ce62a6cd5)) * **providers/getonbrd:** scan multiple categories per entry ([#3330](https://github.com/santifer/career-ops/issues/3330)) ([2cc140a](https://github.com/santifer/career-ops/commit/2cc140a7a86d99ea7e005339295bb825770dce76)) * **providers:** add ITviec provider — first Vietnamese job source ([#230](https://github.com/santifer/career-ops/issues/230)) ([ecc9bdc](https://github.com/santifer/career-ops/commit/ecc9bdc3f20dc1e5036146ec684b38986dbb8ca6)) * **providers:** add Torre opportunity-search provider ([#3328](https://github.com/santifer/career-ops/issues/3328)) ([086c75a](https://github.com/santifer/career-ops/commit/086c75a4c3b4a032b84c1d5bb95b3bc7d0ea3681)) * **providers:** CareerViet, second Vietnamese job source ([#3378](https://github.com/santifer/career-ops/issues/3378)) ([e3d372b](https://github.com/santifer/career-ops/commit/e3d372b732424100faf39e37edc4a395e1d1dd98)) * **templates:** add ATS-friendly single-column CV template pack ([c958462](https://github.com/santifer/career-ops/commit/c9584625e860f1f3bc00b93bc202afcf52de3502)) * **templates:** discover template packs by name ([#3202](https://github.com/santifer/career-ops/issues/3202)) ([29e72bc](https://github.com/santifer/career-ops/commit/29e72bc41d16db0a66be7bdf0a14b75af020f6f4)) * **title-filter:** a stem: prefix, for the half a plain keyword gives away ([77c7007](https://github.com/santifer/career-ops/commit/77c70077c6273ab65ffbcd6dafb43bd633c19632)) ### Bug Fixes * **browser-extract:** read Workday JDs from the CXS API, and fail loudly on an empty JD ([#3256](https://github.com/santifer/career-ops/issues/3256)) ([55af9fc](https://github.com/santifer/career-ops/commit/55af9fc715eeb50825f3f710774a96a950e65726)) * **build-cv-latex:** render markdown bold in bullets as \textbf ([#3351](https://github.com/santifer/career-ops/issues/3351)) ([f1cc17b](https://github.com/santifer/career-ops/commit/f1cc17bdb7938a29fa64f5fa28ec5bbac43c3ff4)) * **calibrate:** read all 14 outcome spellings outcome.mjs writes ([#3322](https://github.com/santifer/career-ops/issues/3322)) ([9db4458](https://github.com/santifer/career-ops/commit/9db4458b8f9abba9d0f5c994e3b2a766854d0a56)) * **cli:** validate flag values in detect-reposts via the shared safeIntFlag ([50944e3](https://github.com/santifer/career-ops/commit/50944e35e174410508d3369fed075a2e4ac456ea)) * **contacto:** stop searching for contacts the mode never uses ([17f5557](https://github.com/santifer/career-ops/commit/17f55577fe315392ca557419bace93d2b2c53ff6)) * **cv,pdf:** address CodeRabbit review feedback for [#2213](https://github.com/santifer/career-ops/issues/2213) ([8c08b76](https://github.com/santifer/career-ops/commit/8c08b765fd8a4a0e77b671d8e4b2fb2c47653888)) * **dates:** weekly-digest and rejection-latency read the local day, not the UTC day ([c8200cb](https://github.com/santifer/career-ops/commit/c8200cbbd0757fe9ed7594192daac049f443add3)) * **doctor:** surface tracked .bak backup files as a warning ([228e7b8](https://github.com/santifer/career-ops/commit/228e7b8078804d82c92f2497ea2ec340b7fc0cae)) * **fact-gate:** a non-English CV inflating headcount returns 'pass' — say so instead ([#3320](https://github.com/santifer/career-ops/issues/3320)) ([fa13474](https://github.com/santifer/career-ops/commit/fa13474f5a74d3d66af5dfb57f9cdf6f8fadc39c)) * **followup:** stop reporting the candidate's own address as a contact to chase ([c0fe77e](https://github.com/santifer/career-ops/commit/c0fe77e2e497552ff1b994a79f9d7d6f9ab182d0)) * **followup:** stop truncating plus-addressed emails at the plus ([9d4817c](https://github.com/santifer/career-ops/commit/9d4817c07f944b352ffba6f68131c10b3902fe82)) * **gfi-claims:** reply when /assign is used outside the claim pool ([f0b24df](https://github.com/santifer/career-ops/commit/f0b24dfa5198d3ecf5c7394ff9777b20872b8950)) * handle quoted angle brackets while stripping HTML tags ([702a2ae](https://github.com/santifer/career-ops/commit/702a2ae4c590f28a140b5fa845818a356b57c22f)) * **hired-wall:** ellipsize single-line card rows instead of clipping at the viewBox ([61dd811](https://github.com/santifer/career-ops/commit/61dd8113a096488933603bc576a47c763b6cf97e)) * **hired-wall:** honor both permission wordings and default public stories to full credit ([f65ba5e](https://github.com/santifer/career-ops/commit/f65ba5ed0a358cd600c621234c284be162f9a670)) * **i18n:** preserve safety guardrails in localized modes ([3afc54d](https://github.com/santifer/career-ops/commit/3afc54d1f7921a0ab99fcb02b5fc383014ec956d)) * **jobbankca:** count raw entries for pagination ([#3249](https://github.com/santifer/career-ops/issues/3249)) ([19b7314](https://github.com/santifer/career-ops/commit/19b7314d06a1a03a2ab3f8bbcafd20b06d83e4c6)) * **merge-tracker:** --backfill-urls rebuilds unfillable rows to full header width ([#3381](https://github.com/santifer/career-ops/issues/3381)) ([d6435ef](https://github.com/santifer/career-ops/commit/d6435efe6e73b05629b1cddb6f4ba734c5b29191)) * **outcome:** a tracker edit forks the append-only journal, and directory order decides which half counts ([#3325](https://github.com/santifer/career-ops/issues/3325)) ([ba2b409](https://github.com/santifer/career-ops/commit/ba2b409d1dbd55160499f5f1c69731bc5bd8e61d)) * **pdf:** enforce workspace boundary in direct renderer ([a4706e3](https://github.com/santifer/career-ops/commit/a4706e3b9f6ef4ce2bc6a470ccfb1e60e56c4c82)) * **pdf:** run the CLI when reached through a symlink ([#3170](https://github.com/santifer/career-ops/issues/3170)) ([3c2fa60](https://github.com/santifer/career-ops/commit/3c2fa6083976777bd69ecb24d697d5ebc3551a09)) * **pipeline:** use browser-first LinkedIn extraction ([e0f0f33](https://github.com/santifer/career-ops/commit/e0f0f33630e713401c907e4123feb7edd070a3c8)) * **plugins:** isolate cmdRun results to the requested plugin id ([#2354](https://github.com/santifer/career-ops/issues/2354)) ([f0044f8](https://github.com/santifer/career-ops/commit/f0044f8c7890bd7069a64a61639a90130c86c67b)) * **plugins:** scale export hook timeout with tracker size ([a8cbb2d](https://github.com/santifer/career-ops/commit/a8cbb2df20ec61227dc5cd50dbeaed2526893b70)) * **portals.example:** drop retired EchoJobs block ([3254ea3](https://github.com/santifer/career-ops/commit/3254ea39d585c609dde826051237529c93ee7691)) * **providers:** a16z treats a non-positive total_pages as absent, not as one page ([002307f](https://github.com/santifer/career-ops/commit/002307f6ade85e805a486e6a9847b1014f1bb1ad)) * **providers:** total_pages outranks a short page in the a16z sweep loop ([#2547](https://github.com/santifer/career-ops/issues/2547)) ([e34be83](https://github.com/santifer/career-ops/commit/e34be83bd409c0e240aacfd4c31241472953707a)) * **reconcile-pipeline:** validate CLI flags via the shared helper ([b4384a7](https://github.com/santifer/career-ops/commit/b4384a797556250a2e73a23e40b3a0a8e13f332a)) * resolve skill paths from project root ([#3332](https://github.com/santifer/career-ops/issues/3332)) ([68bee94](https://github.com/santifer/career-ops/commit/68bee943ccd7e502807c38c5998f060cbb71cdea)) * **salary-gap:** decide which separator is the decimal point before deleting either ([17f44f9](https://github.com/santifer/career-ops/commit/17f44f977fbdd1e62a7f32241f8dc0f21aba410c)) * **scan:** three scanners stamp first_seen in UTC, the reader measures it in local ([#3070](https://github.com/santifer/career-ops/issues/3070)) ([cc241ea](https://github.com/santifer/career-ops/commit/cc241eab47dc40e6ecb7e3c5a9b25884a7ff61ae)) * **stats,calibrate:** ledger-aware funnel + calibration ([#1428](https://github.com/santifer/career-ops/issues/1428), [#1724](https://github.com/santifer/career-ops/issues/1724)) ([34e5547](https://github.com/santifer/career-ops/commit/34e5547ada30afac4b536abe2de84bb04dadc019)) * **stats,calibrate:** reject malformed status ledger rows ([#3350](https://github.com/santifer/career-ops/issues/3350)) ([0f645d2](https://github.com/santifer/career-ops/commit/0f645d2fd60f37348587f1626861da650f4887a4)) * **stats:** stop reporting a neighbouring counter when scan-runs.tsv drifts ([5eb71d5](https://github.com/santifer/career-ops/commit/5eb71d5db82ad50de20f35e14823c33bef9fcc4f)) * **story-provenance:** make the context matcher script-aware, not ASCII-only ([2d7521e](https://github.com/santifer/career-ops/commit/2d7521e9d753a6ccceadec9599d98a6c4e55811b)) * **update-system:** never prune a file the update just preserved, or an asset it references ([c8afb5d](https://github.com/santifer/career-ops/commit/c8afb5d041a5d10d4634c4d28abd20dfe8efaf58)) * **update:** drop the duplicate prune loop that deleted stale files twice ([#3208](https://github.com/santifer/career-ops/issues/3208)) ([e50fbad](https://github.com/santifer/career-ops/commit/e50fbad8ca5bc7f91ef568dc72c56c31b7285d52)) * **verify:** a check that could not run is a failure, not a warning ([5ae4337](https://github.com/santifer/career-ops/commit/5ae433780e5db2ad43a9365ae560bf3ae7a4f204)) * **web:** classify a tracker-lock filesystem failure as itself, not as contention ([#3138](https://github.com/santifer/career-ops/issues/3138)) ([cf880eb](https://github.com/santifer/career-ops/commit/cf880eb55945019663e1b423499041097cb24ccd)) * **web:** key company logos with the Unicode-aware normalizer so non-Latin names don't collide ([#3134](https://github.com/santifer/career-ops/issues/3134)) ([7b9f858](https://github.com/santifer/career-ops/commit/7b9f8588f57d3313265c49f37d2055bb533a7d08)) * **web:** salvage truncated JSON at each prefix's own depth, not one global pad ([#3142](https://github.com/santifer/career-ops/issues/3142)) ([a308bc5](https://github.com/santifer/career-ops/commit/a308bc5cc96197f3ed84ac75493d75c45a770f02)) * **web:** stop hiding an employer's whole board after one evaluation ([b56cde5](https://github.com/santifer/career-ops/commit/b56cde551d84ad5c28d7ea8b99edcc450a2b8b4c)) * **web:** stop killing evaluate runs at 285s and misreporting the kill ([#3124](https://github.com/santifer/career-ops/issues/3124)) ([8a245ed](https://github.com/santifer/career-ops/commit/8a245edd677598aa539e74c7565be44b7676e4ab)) ## [1.29.0](https://github.com/santifer/career-ops/compare/career-ops-v1.28.0...career-ops-v1.29.0) (2026-08-25) ### Features * **anti-fabrication:** tier the Source-of-Truth boundary and add story-provenance-check ([#2947](https://github.com/santifer/career-ops/issues/2947)) ([498dd11](https://github.com/santifer/career-ops/commit/498dd112eb6fa35333aa6c00cef3f8cbce6944d0)) * **contacts:** linkedin-join.mjs — warm-intro finder from a LinkedIn connections export ([ba1a3dd](https://github.com/santifer/career-ops/commit/ba1a3dd0b6630198b86bedad4ff642d88dc69ecb)) * **cv:** optional url support for projects in HTML and LaTeX ([93e256c](https://github.com/santifer/career-ops/commit/93e256c416ced0127f22c8c4ae0302a6d7724a6f)) * **detect-reposts:** skip multi-employer aggregator boards, and say why ([d6ac988](https://github.com/santifer/career-ops/commit/d6ac988c6655c64f2fcb1170a4561640562b624c)) * **pdf:** declare CV section order in config/profile.yml ([#2533](https://github.com/santifer/career-ops/issues/2533)) ([c90b139](https://github.com/santifer/career-ops/commit/c90b13975c7e0ff3c724744608652929678e88a0)) * **providers:** add jobbankca, Canada's federal Job Bank ([7e9feb4](https://github.com/santifer/career-ops/commit/7e9feb4a43b26e0b63aea66425195b7f85062dbd)) * **providers:** job.description for recruitee, ashby, and opt-in smartrecruiters ([#3175](https://github.com/santifer/career-ops/issues/3175)) ([83d3ac6](https://github.com/santifer/career-ops/commit/83d3ac6afbd945cd101b319f4af3b885f445134d)) * **providers:** mycareersfuture, Singapore's national job bank ([#230](https://github.com/santifer/career-ops/issues/230)) ([a726f53](https://github.com/santifer/career-ops/commit/a726f538b17f0d6f237295f5429be2fab3f4365d)) * **scan:** add Hacker News scanner with optional AI enhancement ([f93b6e9](https://github.com/santifer/career-ops/commit/f93b6e9b3baf4122475e1492850591c917951eda)) * **scan:** opt-in anchored keyword matching ([82be449](https://github.com/santifer/career-ops/commit/82be44956a41dcc7c406073902dd2ddcdc0338c8)) * **verify-pipeline:** flag a malformed follow-ups.md instead of reading it as empty ([#2971](https://github.com/santifer/career-ops/issues/2971)) ([a5ffae2](https://github.com/santifer/career-ops/commit/a5ffae2accf300366df24cd9e853475f3d9bf22b)) * **web:** restrict the local dashboard API to same-origin and loopback ([b3974e6](https://github.com/santifer/career-ops/commit/b3974e6104d83c2714fd0d071898a7c7b9f68726)) ### Bug Fixes * **add-entry:** delegate flag validation to shared validateFlags ([3507239](https://github.com/santifer/career-ops/commit/3507239f8fb495025c5d0d7abdcd5b17f7e57490)) * **agent-inbox:** seed the queue under the lock, not before it ([e585853](https://github.com/santifer/career-ops/commit/e585853f60db86abd9802a53e6f3c10862e038e6)) * **ashby:** stop retrying a permanent failure, and honour a clamped Retry-After ([#3072](https://github.com/santifer/career-ops/issues/3072)) ([27fcd48](https://github.com/santifer/career-ops/commit/27fcd48e60a3cf34edd97742e0656b2534c2b5af)) * **ashby:** surface remote work model in the location string ([878e068](https://github.com/santifer/career-ops/commit/878e068bd1ba7fe8e0f2ca74909fc89096ca3f48)) * **batch:** keep JD word count machine-readable under FORCE_COLOR ([bf9a6ae](https://github.com/santifer/career-ops/commit/bf9a6aec0713cfe067bd913355637924114006dc)) * **classify-tier:** Associate + an academic rank is not entry-level ([#3178](https://github.com/santifer/career-ops/issues/3178)) ([ef347fb](https://github.com/santifer/career-ops/commit/ef347fb26c636a4d7dd84727744f34356311217e)) * **cli:** close the missing-operand hole for value-taking flags ([#3087](https://github.com/santifer/career-ops/issues/3087)) ([201aeca](https://github.com/santifer/career-ops/commit/201aeca286784829062430e680089268e66d29e4)) * **cli:** validate browser-extract flags and honour both value forms ([cfe50c3](https://github.com/santifer/career-ops/commit/cfe50c3458377f60754d52f684f25fb8f1a650f4)) * **cli:** validate fix-slugs flags ([c4a0cc2](https://github.com/santifer/career-ops/commit/c4a0cc22306599dd7f238d6e3cf325f332011f12)) * **cv:** honor Korean profile font theme ([70a062c](https://github.com/santifer/career-ops/commit/70a062cbfc1abe810b747773778feada524315de)) * **dates:** seven more today-gates resolve in UTC ([2e4458e](https://github.com/santifer/career-ops/commit/2e4458ed8e067fb8af53f167e2324e25ad284c74)) * **deps:** update web npm dependencies (major) ([1207eae](https://github.com/santifer/career-ops/commit/1207eae4b5799cb92602c99737fd2f0cee1319c9)) * **detect-reposts:** concurrent openings were reported as reposts ([18ff33d](https://github.com/santifer/career-ops/commit/18ff33d92ad5e2a2b9a9af90b2018977fb845548)) * **followup-cadence:** validate CLI flags via the shared helper ([#3196](https://github.com/santifer/career-ops/issues/3196)) ([ec800a2](https://github.com/santifer/career-ops/commit/ec800a2c7539ee394b89eb6d6434a3f2f61de84a)) * **greenhouse:** populate job.description from the boards API content field ([#3175](https://github.com/santifer/career-ops/issues/3175)) ([f1c1c65](https://github.com/santifer/career-ops/commit/f1c1c6540f7f510bf8e7bce9ae9e9f00e75567fe)) * **liveness:** a dead third-party host must not poison the whole verdict ([1389e6c](https://github.com/santifer/career-ops/commit/1389e6cb6186facf2fc847666d9ae85d2723d568)) * **liveness:** add a LinkedIn rung so LinkedIn postings get a real verdict ([#3179](https://github.com/santifer/career-ops/issues/3179)) ([255bfc9](https://github.com/santifer/career-ops/commit/255bfc940479574da5ab363665b6a64a8dfdeadd)) * **locks:** one recovery judgment, imported by all three copies ([638fdc4](https://github.com/santifer/career-ops/commit/638fdc4edf2dbce2e6e59c998520ce5962a23d47)) * **locks:** share the waiting half of the protocol with the three lock copies ([39f87cd](https://github.com/santifer/career-ops/commit/39f87cd7ad40825649ef930e2103911b88407f51)) * **pdf:** name both sides when the lexical containment check fires ([#3162](https://github.com/santifer/career-ops/issues/3162)) ([98cc650](https://github.com/santifer/career-ops/commit/98cc6501e739d992e83436b366020cebc1592819)) * **pdf:** name canonicalization failure separately from a real workspace escape ([e4a21ba](https://github.com/santifer/career-ops/commit/e4a21ba91c2dbbd96f01722b516a120cc7d56df2)) * **pdf:** stop the batch-evaluate fixture leaking its tracker env ([#3162](https://github.com/santifer/career-ops/issues/3162)) ([328fd38](https://github.com/santifer/career-ops/commit/328fd387df5b7f8f9ede17562c2dd7d932db7247)) * **pipeline-lock:** a vanished lock is not a lock you may delete ([680419f](https://github.com/santifer/career-ops/commit/680419f9d5316c0b8ec07f35fecfaa6c21b73e2b)) * **pipeline-lock:** carry the judged directory's identity to the rm ([7ada146](https://github.com/santifer/career-ops/commit/7ada14663a2e91d9cd927120f9f6e23e14df141f)) * **plugins:** discover a plugin directory that is symlinked into a plugin root ([b9fe775](https://github.com/santifer/career-ops/commit/b9fe7758af5e75b104be2c82d070e60f482f1dde)) * **portals.example:** name the support ROLE, not the whole domain ([d57a243](https://github.com/santifer/career-ops/commit/d57a24371113ef41d5caaf15b58490c84d7a1a44)) * **providers/lever:** fold categories.allLocations into location ([e3260d8](https://github.com/santifer/career-ops/commit/e3260d8a4aeca5cae8d486d1f3dbd61a0a583a1f)) * **providers:** retire echojobs, feed is gone behind bot protection ([2c42733](https://github.com/santifer/career-ops/commit/2c42733852db7cf6e779547e6b10df9bb7a3e7fc)) * **providers:** validate resolved addresses before connecting (DNS rebinding guard) ([#3096](https://github.com/santifer/career-ops/issues/3096)) ([d8d4d94](https://github.com/santifer/career-ops/commit/d8d4d94a550d18aea45c137a3afbd6475586b8d6)) * **rename-sync:** migrate 5 vulnerable call sites to renameSyncWithRetry ([#3046](https://github.com/santifer/career-ops/issues/3046)) ([213c281](https://github.com/santifer/career-ops/commit/213c2815a53560cc9764295c3a298a4e53d7f7fa)) * **salary-gap:** treat a period as thousands grouping, not a decimal point ([#3174](https://github.com/santifer/career-ops/issues/3174)) ([b8e5bcb](https://github.com/santifer/career-ops/commit/b8e5bcb3d81ae68b3dd8055e71c2c248ebd21867)) * **set-status:** resolve --report links from the Notes cell on customized layouts ([#3075](https://github.com/santifer/career-ops/issues/3075)) ([ae70a41](https://github.com/santifer/career-ops/commit/ae70a410bc77552b6a52ad15ab1ecb78f41f2fa3)) * **templates:** extend profile font_family override to ja and zh blocks ([5291cc7](https://github.com/santifer/career-ops/commit/5291cc79755caf249a73313b949b6763ef16e260)) * **templates:** keep a project's tech line with the description above it ([676efcd](https://github.com/santifer/career-ops/commit/676efcd32a26aa83d635098608851b0b2c986945)) * **tests:** assert flag echo by substring, not by unescaped RegExp ([6c2220f](https://github.com/santifer/career-ops/commit/6c2220fc6114cba3df74e9f1cb743afe60fef833)) * **tests:** assert the flag echo with includes instead of an unescaped RegExp ([743622d](https://github.com/santifer/career-ops/commit/743622d382c415761172ec0c5b304a62bf3ae70c)) * **tests:** guard the web/ mirror import behind existsSync ([e09e3cd](https://github.com/santifer/career-ops/commit/e09e3cd5cc98b42dd6040bfa7731b308cc4c6e8e)) * **tests:** keep the end of a failing script's output, not just the head ([#3035](https://github.com/santifer/career-ops/issues/3035)) ([a0f4622](https://github.com/santifer/career-ops/commit/a0f46223372a01730b74e16e7c0f89c26d1c41ea)) * **tests:** make the suite symlink-aware for externalized user layers ([7d97d14](https://github.com/santifer/career-ops/commit/7d97d147da0c0cc542a50dcbe174d57d71d196be)) * **update:** refuse non-canonical paths in the local declaration file ([764f20f](https://github.com/santifer/career-ops/commit/764f20f87df9a8c413b74d82626cc4c9c83209d6)) * **updater:** parse the SYSTEM_PATHS array instead of scraping it with a regex ([#3099](https://github.com/santifer/career-ops/issues/3099)) ([61f8850](https://github.com/santifer/career-ops/commit/61f8850d14e828567a3cc7f7a665e9e440c4eed0)) * **updater:** settle same-version SHA mismatch on tree content, not SHAs ([b00619d](https://github.com/santifer/career-ops/commit/b00619d6b562879f44798e9fa70cf67ecd1a696f)) * **update:** stop misreading upstream's own content as a local edit ([#3094](https://github.com/santifer/career-ops/issues/3094)) ([50c5400](https://github.com/santifer/career-ops/commit/50c54008c078b339e4da4f4427b5a253e28c95a1)) * **verify-portals:** decode the HTML entities a board page serves in its title ([eb20257](https://github.com/santifer/career-ops/commit/eb20257394f6164b7795dc3426412c11e7a0ed65)) * **verify-portals:** stop the slug repair path adopting a stranger's board ([d3b830d](https://github.com/santifer/career-ops/commit/d3b830d18c46f727dd07158828e9e11a421f9183)) * **web:** give the methodology link a real tap target and a new-tab cue ([#3023](https://github.com/santifer/career-ops/issues/3023)) ([344a116](https://github.com/santifer/career-ops/commit/344a116de15fd98c1e1d48aae9bf08bbdc4f067e)) * **web:** keep child stderr out of the status response on the crash path ([#3022](https://github.com/santifer/career-ops/issues/3022)) ([883ebec](https://github.com/santifer/career-ops/commit/883ebec33c1c775bb295c4b4eecca31fc53066da)) * **web:** keep the query string in the Explore dedup key so distinct postings don't collapse ([#3082](https://github.com/santifer/career-ops/issues/3082)) ([275e213](https://github.com/santifer/career-ops/commit/275e2137fb804a762caed8bed34194c5920b71c4)) * **web:** keep the run stream alive during silent agent phases ([#3026](https://github.com/santifer/career-ops/issues/3026)) ([aaeb114](https://github.com/santifer/career-ops/commit/aaeb114238283ce3cc44b7b3e2168ed2d22c56a8)) * **web:** report the uncapped weekly match count while keeping the render bounded ([#2662](https://github.com/santifer/career-ops/issues/2662)) ([6e9f029](https://github.com/santifer/career-ops/commit/6e9f0299dff6fc0903b97b349390408d1f859571)) * **web:** stamp pipeline first_seen with the local day, not UTC ([#3081](https://github.com/santifer/career-ops/issues/3081)) ([809e93b](https://github.com/santifer/career-ops/commit/809e93b419094dcc77c8f3d3f1a1c31c578a547a)) ## [1.28.0](https://github.com/santifer/career-ops/compare/career-ops-v1.27.0...career-ops-v1.28.0) (2026-08-20) ### Features * **application-answers:** parse a rendered section back into a snapshot ([3313515](https://github.com/santifer/career-ops/commit/331351566605ba68c8115c2a99a00290edcb4a68)) * **batch:** native Node.js batch evaluator for Gemini ([#1650](https://github.com/santifer/career-ops/issues/1650)) ([153414f](https://github.com/santifer/career-ops/commit/153414fd2ae5293b8d1276b70a5f6bff5c5f42f4)) * **company-history:** emit no-response-friction signal per RFC [#1506](https://github.com/santifer/career-ops/issues/1506) schema v1 ([#2787](https://github.com/santifer/career-ops/issues/2787)) ([a74237e](https://github.com/santifer/career-ops/commit/a74237e1c59cfeeffe55e1552d08c350e13002cf)) * **cv:** make Work Experience an optional section ([#2504](https://github.com/santifer/career-ops/issues/2504)) ([74dc716](https://github.com/santifer/career-ops/commit/74dc71688d5d715aa975aa11b91a236eef662b19)) * **discover-ats:** probe the long-tail ATS vendors, not just the big three ([2d6f188](https://github.com/santifer/career-ops/commit/2d6f188c3a7ba4ac19c08fe98aa7bc558803018b)) * **doctor:** emit the Gemini Node 20+ verdict instead of leaving it in prose ([#3032](https://github.com/santifer/career-ops/issues/3032)) ([e98bc6b](https://github.com/santifer/career-ops/commit/e98bc6ba9bb29ac625256b38ee548bbd588e0985)) * **followups:** export withFollowupsLock so other writers can share the lock ([fba3bb2](https://github.com/santifer/career-ops/commit/fba3bb2029af81c0193adf7b6cb0adcc0cec840b)) * **oferta:** AI-screening disclosure signal — Block G Signal 15 ([#2892](https://github.com/santifer/career-ops/issues/2892)) ([537b687](https://github.com/santifer/career-ops/commit/537b687a4bda9ec4f783d8fd8afda5b2f110c7b9)) * **portals:** add Wellfound search queries to the example template ([12db45e](https://github.com/santifer/career-ops/commit/12db45eb8b252894832cfeec1e42a97d21c508f1)) * **providers:** add yourator job board provider ([c664576](https://github.com/santifer/career-ops/commit/c664576dec4185e140518d9bc1fd2beaf299f901)) * **reports:** add reports_to to the Machine Summary schema ([8cf3dac](https://github.com/santifer/career-ops/commit/8cf3dac5a0f7df0e815d9b57d7337ba7ae3eeea9)) * **scan-ats-full:** optional title_filter_full override for the full-board sweep ([#3089](https://github.com/santifer/career-ops/issues/3089)) ([442084c](https://github.com/santifer/career-ops/commit/442084cbd691539e2bff3c14d47f6baf69527f7e)) * **titles:** let the mode retire a keyword, not only add one ([#2751](https://github.com/santifer/career-ops/issues/2751)) ([0cb2d70](https://github.com/santifer/career-ops/commit/0cb2d70b0a8f113518db9bc6aff1695ac1c8185c)) ### Bug Fixes * **add-entry:** exact-match dedup keys so a prefix cannot false-positive ([f3ae221](https://github.com/santifer/career-ops/commit/f3ae2215d5239db75e0fdeef0ecab972bec88432)) * **archive-posting:** reject mistyped flags via the shared helper ([#2977](https://github.com/santifer/career-ops/issues/2977)) ([84f152c](https://github.com/santifer/career-ops/commit/84f152cbccd4a8b44e86c871a91532af6549aa3f)) * **batch-runner:** curl pre-fetch JD file to avoid empty $jd_file fallback ([#2492](https://github.com/santifer/career-ops/issues/2492)) ([46dc0f4](https://github.com/santifer/career-ops/commit/46dc0f4fdbe62783c435a7203700a301a9004f07)) * **batch-runner:** emit the JD word count color-independently ([#3097](https://github.com/santifer/career-ops/issues/3097)) ([6b61dee](https://github.com/santifer/career-ops/commit/6b61dee175bcebedffb88973df3ac87f8b59211a)) * **classify-tier:** validate CLI flags and add a usage block ([#2870](https://github.com/santifer/career-ops/issues/2870)) ([010ccc5](https://github.com/santifer/career-ops/commit/010ccc5eb6be486335c2b973a80605cbfc0eaf45)) * **consider:** perform GET /jobs CSRF handshake before the POST ([#2764](https://github.com/santifer/career-ops/issues/2764)) ([f058fbe](https://github.com/santifer/career-ops/commit/f058fbeb9babe6447e91af70eb3cac63fe3d5b1f)) * **contacts:** add -h/--help and reject unrecognized flags ([#2829](https://github.com/santifer/career-ops/issues/2829)) ([0aa3299](https://github.com/santifer/career-ops/commit/0aa3299b2e4d6a1d1b1d88fb8a52dc688e902afb)) * **cover-letter:** preserve --out subdirectories inside the output root ([2cc0682](https://github.com/santifer/career-ops/commit/2cc068226407ba193e844a72549cc65572216089)) * **cv:** an empty Skills section no longer deletes the sections after it ([199b7d6](https://github.com/santifer/career-ops/commit/199b7d68941362134e8ba9ae08d68c1d7c117b08)) * **funnel-velocity:** validate CLI flags via the shared helper ([b6ebe08](https://github.com/santifer/career-ops/commit/b6ebe08bad2a5609d3a98b064da7761f9d2e6ede)) * **intake:** treat a nonzero version probe as present, not missing ([c1df672](https://github.com/santifer/career-ops/commit/c1df6725eba487be0a2e39f734d5994b1b7082aa)) * **liveness:** read same-origin iframes so embedded postings aren't false negatives ([#2884](https://github.com/santifer/career-ops/issues/2884)) ([bd36aa5](https://github.com/santifer/career-ops/commit/bd36aa5990beac49bc9dd24549fffc6b765c5997)) * **locks:** the other two copies of the protocol had the same Windows bug ([#3033](https://github.com/santifer/career-ops/issues/3033)) ([1f73f2e](https://github.com/santifer/career-ops/commit/1f73f2eabbbf4376a9103cc1619a98a72682512b)) * **merge-tracker:** don't let an unscoreable (N/A) re-eval overwrite a real score ([#2803](https://github.com/santifer/career-ops/issues/2803)) ([3c66092](https://github.com/santifer/career-ops/commit/3c6609262286a9283923767a736b15e081bf2a9e)) * **merge-tracker:** write rows at the header's actual width on customized trackers ([8668ac1](https://github.com/santifer/career-ops/commit/8668ac1a0d37676a8540be54724333b57240ec6d)) * **pipeline-lock:** an unreadable owner stamp is not an ownerless lock ([bb537c6](https://github.com/santifer/career-ops/commit/bb537c630f46174d7dc452c21d5b804f628cb5ff)) * **pipeline-lock:** time out a wedged holder, not an unlucky waiter ([098bad0](https://github.com/santifer/career-ops/commit/098bad01b899c4ce3c3d3946957d654379b9a5c7)) * **pipeline:** serialize browser-backed extraction so workers never share a session ([#2551](https://github.com/santifer/career-ops/issues/2551)) ([3bc0053](https://github.com/santifer/career-ops/commit/3bc0053368f202bb22c83e9422f6b533a5fa9b1d)) * **portals:** block German student and support postings in the example title filter ([6a3dbc2](https://github.com/santifer/career-ops/commit/6a3dbc290d3c1d5805bc40002d2d0010aa876666)) * **portals:** refresh example board URLs after ATS migrations ([44e8a69](https://github.com/santifer/career-ops/commit/44e8a69290cf6e01d91e09c21405df118c4fc66a)) * **providers:** raise inter-page pacing to 250 ms on the eight providers still at 150 ([#3095](https://github.com/santifer/career-ops/issues/3095)) ([3416f64](https://github.com/santifer/career-ops/commit/3416f64237c9ad01f4d24861cd791c37d3345a2a)) * **providers:** senjob was the fifth private entity decoder, and the weakest — it emitted C0 controls ([aa21e92](https://github.com/santifer/career-ops/commit/aa21e9296e2c1c54b82887641ed7b843c3e3cf37)) * **scan:** add block_hard tier so always_allow cannot discard an explicit block ([9073af7](https://github.com/santifer/career-ops/commit/9073af7042d209533eb6375731647d89ab3bde94)) * **set-status:** rejects today's date east of UTC, logs tomorrow's west of it ([2461b3b](https://github.com/santifer/career-ops/commit/2461b3b979fcd6d361a8be555f1cb9fc96728251)) * **stats:** validate CLI flags via the shared helper ([#3003](https://github.com/santifer/career-ops/issues/3003)) ([9002602](https://github.com/santifer/career-ops/commit/9002602032ab660e692ecd09b4dc75a84959865a)) * **test-all:** tolerate Windows EPERM on fixture cleanup so a green run stays green ([b21bf47](https://github.com/santifer/career-ops/commit/b21bf4705eee48f69ca64d9d80fae87c28574671)) * **tracker:** treat Windows rename contention as contention, not death ([#2777](https://github.com/santifer/career-ops/issues/2777)) ([474ffc4](https://github.com/santifer/career-ops/commit/474ffc4f4c5f05929863a9d9f8528d32c0375c1a)) * **trust-validator:** a company with an accent in its name is flagged for being on its own domain ([5adc39f](https://github.com/santifer/career-ops/commit/5adc39fad7dfcb391642e74b7909942b10b462fe)) * **updater:** detect tree drift and prune retired system files ([#2630](https://github.com/santifer/career-ops/issues/2630), [#2532](https://github.com/santifer/career-ops/issues/2532)) ([6242527](https://github.com/santifer/career-ops/commit/624252731d34c78773efbced2ff256e04c1c4c93)) * **updater:** parse git status paths from untrimmed output ([5091202](https://github.com/santifer/career-ops/commit/50912023e92a144f3b058e4b2e45c90441c74672)) * **upskill:** validate CLI flags via the shared helper ([841390c](https://github.com/santifer/career-ops/commit/841390c9c49ef5417f3e7504cbc67561ffd503b1)) * **verify-cv-facts:** catch fabricated headcounts outside software ([5cdb445](https://github.com/santifer/career-ops/commit/5cdb44516d9882614748bd9c4382351693ac1b04)) * **verify-portals:** --add probes slugs that cannot exist for an accented company name ([8bd65eb](https://github.com/santifer/career-ops/commit/8bd65ebeb9750ef20d503cfd8e281ecf90f5353c)) * **web:** block_hard survives the Explore round-trip — type, URL params, seed and serializer ([#3102](https://github.com/santifer/career-ops/issues/3102)) ([89d6b1b](https://github.com/santifer/career-ops/commit/89d6b1b708454cca863bcf11464c87b76400b14e)) * **web:** persist the only installed CLI so jobs can start ([#2966](https://github.com/santifer/career-ops/issues/2966)) ([e80bf7e](https://github.com/santifer/career-ops/commit/e80bf7e60ce95e92dcd7501f97fda092b60b8f95)) * **web:** resolve 27 unmapped states.yml aliases and fix the Turkish status fold ([#2918](https://github.com/santifer/career-ops/issues/2918)) ([360ce49](https://github.com/santifer/career-ops/commit/360ce490c2e8d610a76767261679ed6b02880c9c)) * **web:** resolve company logos by name, not one guessed domain ([#2942](https://github.com/santifer/career-ops/issues/2942)) ([6096fc9](https://github.com/santifer/career-ops/commit/6096fc9497f3d8bd920d2eaa83c13c30fa989f3d)) * **web:** safe Codex AI-search exec with mtime-keyed capability cache ([#2361](https://github.com/santifer/career-ops/issues/2361)) ([699f506](https://github.com/santifer/career-ops/commit/699f506f62427cdb5a93bef8247eb6c1fd6418ef)) * **web:** stop first-run from claiming no setup ([#2965](https://github.com/santifer/career-ops/issues/2965)) ([f028012](https://github.com/santifer/career-ops/commit/f0280129e63a063a88b00598cc09747cd70bc19e)) * **web:** take the core followups lock so web writes cannot race the seeder ([#3034](https://github.com/santifer/career-ops/issues/3034)) ([3b761b0](https://github.com/santifer/career-ops/commit/3b761b09b2979eedf4eadbd9d3c24b9d61462f04)) * **web:** Today primary action opens the report ([#2967](https://github.com/santifer/career-ops/issues/2967)) ([74781e6](https://github.com/santifer/career-ops/commit/74781e6d66784bff97e15c507db7383a7fa2ab59)) * **workspace:** keep artifacts and PDF metadata in the tracker's workspace ([d3dbd63](https://github.com/santifer/career-ops/commit/d3dbd63bf915a9a17efdc055f0a675b6163a1269)) ## [1.27.0](https://github.com/santifer/career-ops/compare/career-ops-v1.26.0...career-ops-v1.27.0) (2026-08-18) ### Features * **cli:** add --help / -h usage block to stats.mjs ([#2556](https://github.com/santifer/career-ops/issues/2556)) ([3d8b53d](https://github.com/santifer/career-ops/commit/3d8b53dcf41917d889deff8435e869a5a53c6550)) * **cli:** shared flag-validation helper, migrate 3 fixed scripts, fix scan.mjs ([#2778](https://github.com/santifer/career-ops/issues/2778)) ([f05fc0f](https://github.com/santifer/career-ops/commit/f05fc0fe8013a28468f0cab69adb281a36c8d37b)), closes [#2775](https://github.com/santifer/career-ops/issues/2775) * **dashboard:** add a POSTED column showing requisition age ([#2692](https://github.com/santifer/career-ops/issues/2692)) ([a229727](https://github.com/santifer/career-ops/commit/a22972772f2bba7334334550b5eca630d3f26d51)) * **dashboard:** add Stats analytics view with score quality & seniority mix charts ([#2960](https://github.com/santifer/career-ops/issues/2960)) ([9f0c3c3](https://github.com/santifer/career-ops/commit/9f0c3c39f203e29fb742749aef642e122ff8f822)) * **intake:** read documents/ locally to propose source-annotated profile additions ([87abc32](https://github.com/santifer/career-ops/commit/87abc322ab5686cd6c4fd7d91aa3154258d77dcd)) * **invite-match:** distinguish AI-interviewer platforms from human calls ([#2676](https://github.com/santifer/career-ops/issues/2676)) ([7fa3b1d](https://github.com/santifer/career-ops/commit/7fa3b1d2f362f65a3d346a09fd7ba609fffe3eb7)), closes [#2673](https://github.com/santifer/career-ops/issues/2673) * **negotiation:** ROI-based salary-negotiation talking points from verified achievements ([#2950](https://github.com/santifer/career-ops/issues/2950)) ([03b440f](https://github.com/santifer/career-ops/commit/03b440f15104f1d7545fb8a0b316038f563ba2f0)) * **pdf:** batch render path reusing one Chromium across N CVs ([#2747](https://github.com/santifer/career-ops/issues/2747)) ([7bb5c32](https://github.com/santifer/career-ops/commit/7bb5c3279baad31a4215988576d0a6e99350e774)) * **providers:** Eightfold AI talent-acquisition boards ([#2684](https://github.com/santifer/career-ops/issues/2684)) ([e991d58](https://github.com/santifer/career-ops/commit/e991d5853fdf708639721124c9bac17ff291f2b0)) * **providers:** extend getro with auto-resolve, salary, retry and remote-detect ([#2640](https://github.com/santifer/career-ops/issues/2640)) ([85c0928](https://github.com/santifer/career-ops/commit/85c0928871be11df54c4769a73a5069bbef6b152)), closes [#2602](https://github.com/santifer/career-ops/issues/2602) * **providers:** senjob — the scanner's first African source, Senegal ([#2962](https://github.com/santifer/career-ops/issues/2962)) ([db9bd6a](https://github.com/santifer/career-ops/commit/db9bd6aefb45c8297184eaa38cd1c1f006cd7ed8)) * **rank:** opt-in LLM relevance re-ranker for pipeline.md ([#2579](https://github.com/santifer/career-ops/issues/2579)) ([03fc92b](https://github.com/santifer/career-ops/commit/03fc92bb04e1fc8821ff4ec71b26bcc6f0da1182)) * **scan:** AND-groups in title_filter.positive ([#2552](https://github.com/santifer/career-ops/issues/2552)) ([5483083](https://github.com/santifer/career-ops/commit/548308354899de91be27fa2df8fefd176ef88e01)) * **scan:** record failed runs in scan-runs.tsv so trends exclude survivorship bias ([713a6b0](https://github.com/santifer/career-ops/commit/713a6b0c928be43ed2fc1201d3cf140457f8c6cf)) * **skill-extract:** recognize certifications, not just engineering tools ([#2603](https://github.com/santifer/career-ops/issues/2603)) ([4c6a1d2](https://github.com/santifer/career-ops/commit/4c6a1d254d9933c0fd0ff3c200b900f7c928547a)) * **templates:** five named CV templates + a contract test for template variants ([#2954](https://github.com/santifer/career-ops/issues/2954)) ([314cbb5](https://github.com/santifer/career-ops/commit/314cbb5f00a5e5e8a5bbcf875948e9f4c9cb8915)) * **tracker-sync-check:** flag applications.md rows that active-interviews.md has already moved past ([a1304a4](https://github.com/santifer/career-ops/commit/a1304a42181ed6a735b2bfcc19db938134061ed3)) * **update:** declare fork-local paths outside the system layer ([#2793](https://github.com/santifer/career-ops/issues/2793)) ([b082ec6](https://github.com/santifer/career-ops/commit/b082ec6a9c4765cebf51d1038ab9a2195caeb434)) * **update:** restore locally deleted system files instead of preserving the deletion ([#2448](https://github.com/santifer/career-ops/issues/2448)) ([bfcaaba](https://github.com/santifer/career-ops/commit/bfcaaba7ba5662cd815b4e573757e9920515e7af)) * **web:** give the Apply page a way back and a way to record that you applied ([#2735](https://github.com/santifer/career-ops/issues/2735)) ([05cc972](https://github.com/santifer/career-ops/commit/05cc972c2d45471ba45a8457c83f488915fc4fa6)) ### Bug Fixes * **add-entry:** key non-Latin headings and dedup keys faithfully ([#2850](https://github.com/santifer/career-ops/issues/2850)) ([27757e4](https://github.com/santifer/career-ops/commit/27757e4896e5213a69440ecf17e54e0a413cbe06)) * **add-entry:** reject mistyped flags instead of reading them as data ([f4c4fda](https://github.com/santifer/career-ops/commit/f4c4fda5b3b31ee78070ea3884d1bc4b0570fc7f)) * **agent-inbox:** give concurrent add() a burst-sized lock timeout ([#2825](https://github.com/santifer/career-ops/issues/2825)) ([513f07a](https://github.com/santifer/career-ops/commit/513f07a2582c7e6dc03644733e796f4aec749f21)), closes [#2824](https://github.com/santifer/career-ops/issues/2824) * **agent-inbox:** serialize concurrent adds through the shared lock ([#2777](https://github.com/santifer/career-ops/issues/2777)) ([a7f65b6](https://github.com/santifer/career-ops/commit/a7f65b6a63e90560270c4afb213204bab57981ab)) * **agent-inbox:** stop dropping requests queued during an add ([#2614](https://github.com/santifer/career-ops/issues/2614)) ([ad382c0](https://github.com/santifer/career-ops/commit/ad382c0b7f1fc2d4fc9a32094a49931c114e2a4b)) * **archive:** key JD captures to report numbers so they resolve after capture day ([#2701](https://github.com/santifer/career-ops/issues/2701)) ([81d7b06](https://github.com/santifer/career-ops/commit/81d7b069a8a726468d9ca76ebb2d9e768b470f01)) * **assessment-log:** reject unknown flags ([#2802](https://github.com/santifer/career-ops/issues/2802)) ([ce56efe](https://github.com/santifer/career-ops/commit/ce56efe8ae6902924256c8257fe8b1b3ab3fdff7)) * **batch-tailor:** --min-score 4.5 was silently ignored, and the worker's pdf mode path was cwd-relative ([#2961](https://github.com/santifer/career-ops/issues/2961)) ([f306801](https://github.com/santifer/career-ops/commit/f30680152a54db92bf996120f08a91893a51db44)) * **batch:** retry state updates and lock reservations to prevent worker silent drops ([#2417](https://github.com/santifer/career-ops/issues/2417)) ([5404185](https://github.com/santifer/career-ops/commit/5404185deff59f8604014c63060458d0b22c640c)) * **build-cv-html:** render numeric year/date scalars instead of dropping them ([#2641](https://github.com/santifer/career-ops/issues/2641)) ([949a690](https://github.com/santifer/career-ops/commit/949a6900602d5df31aa2b7d1b7b40279de5b1fae)) * **build-cv-latex:** numeric year/date scalars are still dropped — [#2641](https://github.com/santifer/career-ops/issues/2641) fixed only the HTML mirror ([#2916](https://github.com/santifer/career-ops/issues/2916)) ([94eb334](https://github.com/santifer/career-ops/commit/94eb334a03a9837f4a98893e431f61b98264b609)) * **check-table-freshness:** validate CLI flags and add a usage block ([#2873](https://github.com/santifer/career-ops/issues/2873)) ([a12dd6b](https://github.com/santifer/career-ops/commit/a12dd6b355282f4801cd948f063525605c1545ed)), closes [#2855](https://github.com/santifer/career-ops/issues/2855) * **ci:** only greet a first-time contributor when it is actually their first ([a0d45aa](https://github.com/santifer/career-ops/commit/a0d45aaaf4cf2770d702be8e1a3d7e115944aeb2)) * **ci:** skip the upgrade leg when nothing managed changed, instead of failing ([#2697](https://github.com/santifer/career-ops/issues/2697)) ([9dcfd2f](https://github.com/santifer/career-ops/commit/9dcfd2f668628879539c2ccfb3f17ce67f2824eb)) * **classify-tier:** an incidental senior word outranked an explicit intern marker ([#2737](https://github.com/santifer/career-ops/issues/2737)) ([cc2b1ce](https://github.com/santifer/career-ops/commit/cc2b1ce1edbc253f286da33ab9475adb9b46f22e)) * **cli:** a one-letter typo returned a false all-clear at exit 0 in 4 reporting CLIs ([#2920](https://github.com/santifer/career-ops/issues/2920)) ([d65d024](https://github.com/santifer/career-ops/commit/d65d0247183a10d115cedbf6dbda83dccf0fa765)) * **company-history:** record response dates via --on, not --note free text ([9b17a8a](https://github.com/santifer/career-ops/commit/9b17a8ac97b398a496b38e423ae24e433b43254f)) * **contacto:** LinkedIn connection-request limit is 200 on free tier, not 300 ([#2951](https://github.com/santifer/career-ops/issues/2951)) ([9c242c5](https://github.com/santifer/career-ops/commit/9c242c575ed0bd4d8e9591a3546b255464303f20)) * **csod:** replay bootstrap session cookies and repair fetchResponse() ([#2769](https://github.com/santifer/career-ops/issues/2769)) ([7aee3b9](https://github.com/santifer/career-ops/commit/7aee3b9f3bb44b8d4c34adf46a473afcc71ac97f)) * **cv-facts:** treat a k/M/B magnitude suffix as part of the number ([#2612](https://github.com/santifer/career-ops/issues/2612)) ([18d245a](https://github.com/santifer/career-ops/commit/18d245aa9edbfb99a6df90d5df8b6c63c971e549)) * **cv:** Korean and Traditional Chinese CVs had no font rule ([#2616](https://github.com/santifer/career-ops/issues/2616)) ([994552d](https://github.com/santifer/career-ops/commit/994552dc5d3faecacdf23f56e21e1b845fbf1aa7)) * **dedup-tracker:** reject unrecognized flags instead of silently live-running ([#2746](https://github.com/santifer/career-ops/issues/2746)) ([429b0dc](https://github.com/santifer/career-ops/commit/429b0dc8aa2418480c7c3548d7e67612564b960d)) * **deps:** make js-yaml imports work on both 4.x and 5.x ([#2656](https://github.com/santifer/career-ops/issues/2656)) ([6466b18](https://github.com/santifer/career-ops/commit/6466b18382aa2cb9390f5d2425a63ae36bcea085)) * **deps:** patch both HIGH advisories in web (js-yaml 4.3.1, nanoid 3.3.18) ([a094ec9](https://github.com/santifer/career-ops/commit/a094ec9ddbe8f21e8db6dba87f548532af2a820e)) * **deps:** raise the js-yaml floor to ^4.3.1 and guard it ([#2767](https://github.com/santifer/career-ops/issues/2767)) ([5b18a96](https://github.com/santifer/career-ops/commit/5b18a960da803477a475a1856138561f83edc035)) * **doctor:** detect Playwright MCP servers provided by Claude Code plugins ([#2753](https://github.com/santifer/career-ops/issues/2753)) ([49d20f2](https://github.com/santifer/career-ops/commit/49d20f26dff1b1f1d7d9c783bac714076ebc7444)) * **doctor:** validate CLI flags and add a usage block ([#2874](https://github.com/santifer/career-ops/issues/2874)) ([d4c31be](https://github.com/santifer/career-ops/commit/d4c31be403453249abe039c3ebc50cb7e56f7539)), closes [#2856](https://github.com/santifer/career-ops/issues/2856) * **eval:** merge openrouter tracker TSVs and send Ollama options to the native /api/chat ([#2647](https://github.com/santifer/career-ops/issues/2647)) ([a86f776](https://github.com/santifer/career-ops/commit/a86f776a252ec1fa608dcd3ab61c4f6f1b678754)) * **find:** print the one USAGE constant on the empty-query path too ([f0dd6ed](https://github.com/santifer/career-ops/commit/f0dd6edb9387f1b8ff4bbb4b69e62f8982fc3f7c)) * **find:** reject mistyped flags instead of searching for them ([9265e08](https://github.com/santifer/career-ops/commit/9265e08188719bbf06891c8efc2ae10fa0991b63)) * **followup-cadence:** parse annotated pins, and add a retire directive ([#2514](https://github.com/santifer/career-ops/issues/2514)) ([b4f6b2d](https://github.com/santifer/career-ops/commit/b4f6b2dd4b55c8172e56ef776f1e4fd82bce4acf)) * **followup-seed:** resolve "today" in local time, not UTC ([#2765](https://github.com/santifer/career-ops/issues/2765)) ([15aa769](https://github.com/santifer/career-ops/commit/15aa7697292d3afe2fc557626beda74a12a4523a)) * **followup:** ignore an apply date cited about another row ([#2610](https://github.com/santifer/career-ops/issues/2610)) ([53808a9](https://github.com/santifer/career-ops/commit/53808a91745594685be3118e1792aa4ad0e6ee51)), closes [#2607](https://github.com/santifer/career-ops/issues/2607) * **invite-match:** validate CLI flags and add usage ([#2958](https://github.com/santifer/career-ops/issues/2958)) ([34b1d58](https://github.com/santifer/career-ops/commit/34b1d58ff954b83f7cb797317c1bbc5aaafdacd8)) * **jd-similarity:** add --help and reject unknown flags instead of reading them as paths ([#2819](https://github.com/santifer/career-ops/issues/2819)) ([ce1f321](https://github.com/santifer/career-ops/commit/ce1f321388b4f2c36f2dd112da2e7d99abdc44ba)), closes [#2772](https://github.com/santifer/career-ops/issues/2772) * **jd-similarity:** the seniority gate fired on JD boilerplate ([#2661](https://github.com/santifer/career-ops/issues/2661)) ([772ea35](https://github.com/santifer/career-ops/commit/772ea35153f88a101c3d22da1741cb79804fae4d)) * **jd-skill-gap:** recognize all six markdown heading levels ([#2721](https://github.com/santifer/career-ops/issues/2721)) ([2a3bd2f](https://github.com/santifer/career-ops/commit/2a3bd2f1f75580824ee0be1f26e93d54f0be18af)) * **jd-skill-gap:** recognize sentence-form requirement headings ([#2686](https://github.com/santifer/career-ops/issues/2686)) ([fd9ca41](https://github.com/santifer/career-ops/commit/fd9ca41d372886b1c095b8ba689e48950da6260f)) * **jobvite:** migrate to the public XML feed after the JSON API retirement ([#2623](https://github.com/santifer/career-ops/issues/2623)) ([0c7522b](https://github.com/santifer/career-ops/commit/0c7522b408f0f62d334972a34fcf1ece2a55541c)) * **keys:** stop the dotted-I fix from collapsing Polish, Lithuanian and Maltese ([5df43e7](https://github.com/santifer/career-ops/commit/5df43e7133745ad814421f2dd4c5afce2e75c0e1)) * **keys:** stop the Turkish dotted capital from splitting one employer in two ([462d276](https://github.com/santifer/career-ops/commit/462d27653eda17c3305dfe74f2ecdc5b21fb79e6)) * **liveness:** classify a rate-limited posting as uncertain, not expired ([#2613](https://github.com/santifer/career-ops/issues/2613)) ([c65afe6](https://github.com/santifer/career-ops/commit/c65afe6f508105d84da75fddb026b077afd9bbc0)) * **liveness:** treat an api.lever.co 404 as inconclusive, not proof of removal ([#2649](https://github.com/santifer/career-ops/issues/2649)) ([84fe20f](https://github.com/santifer/career-ops/commit/84fe20f0cebc6500fc85939752ff946dc43e1de7)) * **locks:** treat Windows rm/stat contention as contention, not death ([#2984](https://github.com/santifer/career-ops/issues/2984)) ([2743281](https://github.com/santifer/career-ops/commit/27432818d29faf67103714e12f6777bf39239c67)) * **match-star:** score a non-English story bank against a question in its own language ([#2848](https://github.com/santifer/career-ops/issues/2848)) ([fa5926d](https://github.com/santifer/career-ops/commit/fa5926df06c348e18459a6c8f5328c93c8641d5a)) * **merge-tracker:** deterministic dedup on the posting URL ([#1298](https://github.com/santifer/career-ops/issues/1298)) ([a0426bb](https://github.com/santifer/career-ops/commit/a0426bb9ef06744f59d67e17014dd4c7fda59e17)) * **merge-tracker:** match inline URL headers so URL dedup activates for doc-style rows ([#2926](https://github.com/santifer/career-ops/issues/2926)) ([c078513](https://github.com/santifer/career-ops/commit/c078513127aa13bd02edb2a2cbadad34da20615b)) * **merge-tracker:** re-eval no longer inherits the superseded report's checkmark ([#2595](https://github.com/santifer/career-ops/issues/2595)) ([c85d02f](https://github.com/santifer/career-ops/commit/c85d02fda92f93d3d97fe273b05059397be1ab87)) * **ollama:** include profile context in evaluations ([#2664](https://github.com/santifer/career-ops/issues/2664)) ([ef2a82f](https://github.com/santifer/career-ops/commit/ef2a82f6970302733c35ebba9b3a30ec5fac65f1)) * **oraclecloud:** accept Oracle's numbered tenant apexes (oraclecloud1-99.com) ([#2683](https://github.com/santifer/career-ops/issues/2683)) ([a23ebc1](https://github.com/santifer/career-ops/commit/a23ebc1a2f88a16db98af9f3a16e8c4041b5bded)) * **patterns:** rate denominators counted rows that could never contribute ([#2783](https://github.com/santifer/career-ops/issues/2783)) ([e2dbbbf](https://github.com/santifer/career-ops/commit/e2dbbbfcd79c205a5589be0907921d846e299ddb)) * **pipeline-lock:** a non-EEXIST mkdir refusal is contention, not a fatal error ([#2838](https://github.com/santifer/career-ops/issues/2838)) ([bca798f](https://github.com/santifer/career-ops/commit/bca798f8a61b1bbcd93da17c04d17eccbba627b6)), closes [#2777](https://github.com/santifer/career-ops/issues/2777) * **pipeline-lock:** jitter the retry so a starved writer costs a retry, not an item ([c7dbf0d](https://github.com/santifer/career-ops/commit/c7dbf0d9b7fed227129340055655303a955b567b)) * **plugin-audit:** validate CLI arguments and add a usage block ([#2813](https://github.com/santifer/career-ops/issues/2813)) ([588139c](https://github.com/santifer/career-ops/commit/588139c629eab04c69a868469b921cb01b013ae3)), closes [#2771](https://github.com/santifer/career-ops/issues/2771) * **process-quality:** three undisclosed employers were reported as disclosed ([#3005](https://github.com/santifer/career-ops/issues/3005)) ([b5acfa5](https://github.com/santifer/career-ops/commit/b5acfa513bc16896f0310affaa835c4a1bb21f04)) * **providers:** decode HTML entities in titles before matching so encoded ampersands stop dropping jobs ([#2923](https://github.com/santifer/career-ops/issues/2923)) ([37f4c11](https://github.com/santifer/career-ops/commit/37f4c11b4ad5e3aca94aa389453806b3a6210535)) * **providers:** fill in the docs and vendor-detection gaps ([#2658](https://github.com/santifer/career-ops/issues/2658)) ([7152907](https://github.com/santifer/career-ops/commit/7152907e88fd2daa05c83f8351ea873f8296e072)) * **providers:** harden workable with retry, headers, and serialization ([#2675](https://github.com/santifer/career-ops/issues/2675)) ([feabcd4](https://github.com/santifer/career-ops/commit/feabcd45b3615af6d8871f89f17246dbbab3a811)) * **providers:** isRetryableError no longer misclassifies a refused redirect ([#2657](https://github.com/santifer/career-ops/issues/2657)) ([f8feaa5](https://github.com/santifer/career-ops/commit/f8feaa53c3f7bb8cf0cc33196d0ca3bf999951da)) * **providers:** make themuse resilient to per-page fetch failures ([#2682](https://github.com/santifer/career-ops/issues/2682)) ([a83800f](https://github.com/santifer/career-ops/commit/a83800feac3c15017365c6d6b6acb69509757f20)) * **providers:** personio falls back to HTML scrape when the XML feed is disabled ([5fe2784](https://github.com/santifer/career-ops/commit/5fe27841b7839d7b8ea5a7f5c753408b4f24f03c)) * **providers:** phenom pagination/retry fixes, drop dead auto-detection ([#2669](https://github.com/santifer/career-ops/issues/2669)) ([1331ebf](https://github.com/santifer/career-ops/commit/1331ebfcb805d3714d2e6c81b2b9e22395b80540)) * **providers:** reject numeric entities outside the XML 1.0 Char set ([#2713](https://github.com/santifer/career-ops/issues/2713)) ([a050631](https://github.com/santifer/career-ops/commit/a0506312b67a26560022415b5b5abdf3a99ca8ad)) * **providers:** route seven RSS decoders through the shared safe entity decoder ([#2818](https://github.com/santifer/career-ops/issues/2818)) ([5b00081](https://github.com/santifer/career-ops/commit/5b00081f1a74354c1924177985d1576e50ddcef1)), closes [#2790](https://github.com/santifer/career-ops/issues/2790) * **providers:** route softgarden and radancy through the shared entity decoder ([#2487](https://github.com/santifer/career-ops/issues/2487)) ([96b1de6](https://github.com/santifer/career-ops/commit/96b1de6806dd2630f4c26b19cf37c6ca98638d07)) * **reply-matcher:** require corroboration for partial role-title matches ([#2672](https://github.com/santifer/career-ops/issues/2672)) ([3215fa3](https://github.com/santifer/career-ops/commit/3215fa309d5158d2ea51a97a5074792e1d9138d7)) * **reply-matcher:** the '?' unknown-employer placeholder matched everything ([#3001](https://github.com/santifer/career-ops/issues/3001)) ([86e653d](https://github.com/santifer/career-ops/commit/86e653d5b08bbf81781c0f84b6c567dbe79e571f)) * **reply-watch:** reject unrecognized CLI flags instead of treating them as a path ([#2745](https://github.com/santifer/career-ops/issues/2745)) ([ba2b634](https://github.com/santifer/career-ops/commit/ba2b6340d8802125789203e5f2deb5084c04857b)) * **reserve-report-num:** do not read a bare date file as a report number ([#2759](https://github.com/santifer/career-ops/issues/2759)) ([6d6524b](https://github.com/santifer/career-ops/commit/6d6524b30694c7a870df3aacdf7075ce524c4ee8)), closes [#2757](https://github.com/santifer/career-ops/issues/2757) * **role-matcher:** tokenize non-Latin role titles and scope the mark fold ([#2782](https://github.com/santifer/career-ops/issues/2782)) ([6704dd6](https://github.com/santifer/career-ops/commit/6704dd6cf4fc957c9a4a085459ee64ba73fc8f7c)), closes [#2781](https://github.com/santifer/career-ops/issues/2781) * **scan-ats-full:** cap single-host ATS sweeps at their own concurrency ([#2839](https://github.com/santifer/career-ops/issues/2839)) ([5ef0676](https://github.com/santifer/career-ops/commit/5ef0676a3b304e48325031070358d547d65b70de)) * **scan:** locate the URL anywhere in a pipeline.md entry ([#2605](https://github.com/santifer/career-ops/issues/2605)) ([c0413e3](https://github.com/santifer/career-ops/commit/c0413e3ce374b2e6be628a46f9b28422e26d3e85)) * **scan:** take the shared lock for scan-history.tsv appends ([#2639](https://github.com/santifer/career-ops/issues/2639)) ([8e264c4](https://github.com/santifer/career-ops/commit/8e264c4b24a04fc6f0799b2e5c9a0479ed4e16e0)) * **set-status:** stop the --role guard from folding every non-Latin title to the same key ([#2736](https://github.com/santifer/career-ops/issues/2736)) ([437da7a](https://github.com/santifer/career-ops/commit/437da7aa2cfaacb0ca9161303627ea7f3ee85569)) * **states:** aliases the engine accepts were missing from states.yml ([#2615](https://github.com/santifer/career-ops/issues/2615)) ([04ef492](https://github.com/santifer/career-ops/commit/04ef4925c8271112cfcd9711405b7bbc3ae3025f)) * **status:** fold Turkish dotted capitals so uppercase tracker rows resolve to canonical states ([0834e72](https://github.com/santifer/career-ops/commit/0834e7224b99a130ac09ea6a076f585aac85e85d)) * **tests:** contain a discovered suite that throws at import ([#2830](https://github.com/santifer/career-ops/issues/2830)) ([51e8f19](https://github.com/santifer/career-ops/commit/51e8f19513d5cc9e9f26b3a27442f32cebf9e678)) * **theme-style:** a `$`-pattern in a profile style value splices the body into the CV's <head> ([1798f3a](https://github.com/santifer/career-ops/commit/1798f3a45e5ec8eb44af634dce5f6703a9c6d874)) * **update:** commit the index so file-mode changes are not dropped ([#2629](https://github.com/santifer/career-ops/issues/2629)) ([4b1d66b](https://github.com/santifer/career-ops/commit/4b1d66b22249506442906e673405bcfed7c58a57)) * **update:** ignore CRLF/LF-only differences when detecting local system edits ([#2820](https://github.com/santifer/career-ops/issues/2820)) ([9c06337](https://github.com/santifer/career-ops/commit/9c0633733c74453da0062a66e4dca3b76ba96741)), closes [#2817](https://github.com/santifer/career-ops/issues/2817) * **update:** reconcile .gitignore on apply so new ignore rules reach existing installs ([#2857](https://github.com/santifer/career-ops/issues/2857)) ([2728cd0](https://github.com/santifer/career-ops/commit/2728cd0d40f0f640856e898aadc6999d05a8d2ba)) * **velocity:** count a web-written transition as an observation ([#2898](https://github.com/santifer/career-ops/issues/2898)) ([2e36380](https://github.com/santifer/career-ops/commit/2e363807429322c6f660b011d4b56b3222e3c3cb)) * **verify-cv-facts:** fold allow_metrics through the same noun synonyms ([#2720](https://github.com/santifer/career-ops/issues/2720)) ([5352f38](https://github.com/santifer/career-ops/commit/5352f380c550a0551165cb9f9c7194f0fd15dfdb)) * **verify-cv-facts:** treat a period as a thousands separator too ([#2722](https://github.com/santifer/career-ops/issues/2722)) ([dceaddb](https://github.com/santifer/career-ops/commit/dceaddb3739173ca9f526851c16cdfa6cd717db1)) * **voice-dna:** make voice-dna.md private via the template pattern ([#2952](https://github.com/santifer/career-ops/issues/2952)) ([10a9c55](https://github.com/santifer/career-ops/commit/10a9c55147fb1a3ae6a7741f41fad59b68c79722)) * **web:** add Grok Build CLI to the web runtime picker ([#2688](https://github.com/santifer/career-ops/issues/2688)) ([af0d818](https://github.com/santifer/career-ops/commit/af0d8183937a43397a127e75967b906fece86364)) * **web:** analytics tells an offer-holder they have 0 interviews (and nudges them to try harder) ([#2410](https://github.com/santifer/career-ops/issues/2410)) ([8f2b415](https://github.com/santifer/career-ops/commit/8f2b41505997c0f15d86ee617304701239328a12)) * **web:** anchor the fallback stderr classifier so a word can't fail a run ([#2882](https://github.com/santifer/career-ops/issues/2882)) ([be62e3e](https://github.com/santifer/career-ops/commit/be62e3ef28fcbcc18f1cddec3269c8da00be645c)) * **web:** carry the posted: segment so web evaluations reach the POSTED column ([#2899](https://github.com/santifer/career-ops/issues/2899)) ([6eece73](https://github.com/santifer/career-ops/commit/6eece731b36ea91286e984289518839d9ab5c342)) * **web:** detect OpenCode in its default install directory ([#1794](https://github.com/santifer/career-ops/issues/1794)) ([c10b887](https://github.com/santifer/career-ops/commit/c10b88764a793e4176688f60aa066e96eff1c3a4)) * **web:** emit the posting URL in the tracker-additions TSV so web runs join the dedup ([#2833](https://github.com/santifer/career-ops/issues/2833)) ([3c68721](https://github.com/santifer/career-ops/commit/3c68721fc28b98fc127ff9f5a36ac71188215750)) * **web:** enforce that no runtime grants itself blanket write permission ([#2875](https://github.com/santifer/career-ops/issues/2875)) ([9ba6ebf](https://github.com/santifer/career-ops/commit/9ba6ebf2f94dbd2772af9b32572af25429b303fc)) * **web:** finish Unicode company keys for explore + registry ([#2668](https://github.com/santifer/career-ops/issues/2668)) ([c294242](https://github.com/santifer/career-ops/commit/c294242dbb6a78a03bac738f397c568c02316971)) * **web:** fold Turkish dotted capitals in status keys, and stop hand-copying the state list ([#2786](https://github.com/santifer/career-ops/issues/2786)) ([e1a0961](https://github.com/santifer/career-ops/commit/e1a09616818d2dd84b249a7805078bbfeefae669)) * **web:** keep Codex JSONL + exit code authoritative for web scoring ([#2102](https://github.com/santifer/career-ops/issues/2102)) ([2d43601](https://github.com/santifer/career-ops/commit/2d436019b60484e97576dd36e9ce324d2585cd6a)) * **web:** let the pipeline table scroll horizontally instead of clipping on narrow screens ([#2363](https://github.com/santifer/career-ops/issues/2363)) ([632031c](https://github.com/santifer/career-ops/commit/632031c9cb8ae95311a36310bb6cd2713497136c)) * **web:** make the tracker reader agree with parseTrackerRow on row shape ([#2565](https://github.com/santifer/career-ops/issues/2565)) ([4fea438](https://github.com/santifer/career-ops/commit/4fea43835e940be62011f12afab4f35cb265c4ac)) * **web:** prevent Codex run jobs from waiting on stdin ([#1973](https://github.com/santifer/career-ops/issues/1973)) ([9a139a2](https://github.com/santifer/career-ops/commit/9a139a2aac44ae5e8da8e372a587a322ba99f149)) * **web:** read target_roles with the shape it is actually written in ([#2750](https://github.com/santifer/career-ops/issues/2750)) ([5f5c06d](https://github.com/santifer/career-ops/commit/5f5c06d4b257b4ef55dfedc2f1d1c0eb26bc9789)) * **web:** show the retry card, not the update-checkout panel, for runtime scan errors ([#1904](https://github.com/santifer/career-ops/issues/1904)) ([29c0d69](https://github.com/santifer/career-ops/commit/29c0d69cb0e2c2c3507e2712eaf04f1633244722)) * **web:** skip {n}-RESERVED.md sentinels when looking up reports ([#1967](https://github.com/santifer/career-ops/issues/1967)) ([5f4842e](https://github.com/santifer/career-ops/commit/5f4842e513fe45092395254ba51bc220676e598a)) * **web:** stop the 16-chip cap from truncating the user's own portals.yml ([#2749](https://github.com/santifer/career-ops/issues/2749)) ([a5af949](https://github.com/santifer/career-ops/commit/a5af94900b981105f2560ee271e22a00479093a9)) * **web:** strip the author letter from any lettered block, not just A-G ([#2420](https://github.com/santifer/career-ops/issues/2420)) ([630709a](https://github.com/santifer/career-ops/commit/630709a3cad0297b7305752cfdf6ed5b0469b4d8)) * **web:** take the core tracker lock in POST /api/status ([#2903](https://github.com/santifer/career-ops/issues/2903)) ([d9c4fd0](https://github.com/santifer/career-ops/commit/d9c4fd0a0fa191717f1f68663b5eaa11c0351ea6)) * **workday:** key the cap-hit warning on entry provenance, not on --since ([#2763](https://github.com/santifer/career-ops/issues/2763)) ([7f067bc](https://github.com/santifer/career-ops/commit/7f067bce916a964411e27948b06227c4ca39bfd2)) ### Performance Improvements * **analytics:** drop redundant existsSync probes before report reads ([#2655](https://github.com/santifer/career-ops/issues/2655)) ([f06cbf8](https://github.com/santifer/career-ops/commit/f06cbf81bba797bc1cd758bca3d71866c80d9b9e)) * **scan:** read each dedup source once per scan run ([d68c4c9](https://github.com/santifer/career-ops/commit/d68c4c963592787df3b7a34d4e5f9bb48010415b)) ## [1.26.0](https://github.com/santifer/career-ops/compare/career-ops-v1.25.0...career-ops-v1.26.0) (2026-08-10) ### Features * **cover:** optional letter.signature sign-off block ([#2513](https://github.com/santifer/career-ops/issues/2513)) ([449c1df](https://github.com/santifer/career-ops/commit/449c1df4a235205bb1907c7c572d2fa09a9321b9)), closes [#2510](https://github.com/santifer/career-ops/issues/2510) * **cv:** strip the Core Competencies section when it has no entries ([#2512](https://github.com/santifer/career-ops/issues/2512)) ([f1b2bc6](https://github.com/santifer/career-ops/commit/f1b2bc6eb7f553c60d60d43b672c7004a4a6b0ef)), closes [#2509](https://github.com/santifer/career-ops/issues/2509) * **doctor:** warn when an API key is overriding the Claude subscription ([ccb7b0d](https://github.com/santifer/career-ops/commit/ccb7b0d86a8de28c5858c9276529b56a448cf7b7)) * **followup:** rejection-latency signal, courtesy-threshold only ([#2014](https://github.com/santifer/career-ops/issues/2014)) ([70e6152](https://github.com/santifer/career-ops/commit/70e615283794e450a0105ddeaf14d6ff844ecdec)) * **invite-match:** recognize rejection emails, not just interview invites ([#2100](https://github.com/santifer/career-ops/issues/2100)) ([9bbdd9b](https://github.com/santifer/career-ops/commit/9bbdd9b495974ce3be7d5713f8d0614a1957aec3)) * **oferta:** minimum-wage lawyer question, arithmetic-only ([#2027](https://github.com/santifer/career-ops/issues/2027)) ([0118404](https://github.com/santifer/career-ops/commit/0118404946260fa68b449399042bf0eb351d4aaf)) * **oferta:** pay-transparency range-width check, self-computed only ([#2021](https://github.com/santifer/career-ops/issues/2021)) ([9482765](https://github.com/santifer/career-ops/commit/948276555b0e0449d4415ad39b61f8016bbf90b8)) * **offer-prep:** sub-statutory terms route to lawyer, no floors table ([#2042](https://github.com/santifer/career-ops/issues/2042)) ([51ae334](https://github.com/santifer/career-ops/commit/51ae334b2faf2ae9e1d256139d83a0f7f144829c)) * **providers:** add join.com SSR __NEXT_DATA__ parser ([#2527](https://github.com/santifer/career-ops/issues/2527)) ([2b64bf5](https://github.com/santifer/career-ops/commit/2b64bf55f3821fe86990e57362f1740ccd1f9d77)) * **providers:** add remotli — Swiss remote job board ([#2464](https://github.com/santifer/career-ops/issues/2464)) ([dca9418](https://github.com/santifer/career-ops/commit/dca94180f9666dfc93b8dff4ff41bad97e58588d)) * **scan:** add getro, consider and joinup zero-auth providers ([#825](https://github.com/santifer/career-ops/issues/825)) ([c0a259a](https://github.com/santifer/career-ops/commit/c0a259a900eab439d95d9787eb093b445425d6bb)) * **scan:** make the pipeline and scan-history paths env-overridable ([#2568](https://github.com/santifer/career-ops/issues/2568)) ([402e798](https://github.com/santifer/career-ops/commit/402e7988d33962ae3e9eb7f76afa2e55ddc37f1c)), closes [#2271](https://github.com/santifer/career-ops/issues/2271) ### Bug Fixes * **a16z-speedrun:** retry a transient page failure instead of aborting the whole board ([#2506](https://github.com/santifer/career-ops/issues/2506)) ([50ce177](https://github.com/santifer/career-ops/commit/50ce17718c3ca5fc36103d41b48b30027eac44d8)) * **arbeitsagentur:** move to the v6 Jobsuche API ([#2494](https://github.com/santifer/career-ops/issues/2494)) ([a713ed5](https://github.com/santifer/career-ops/commit/a713ed5de2850d6e3f5acb5677f198a31483271a)) * **cover:** fail on an unresolved template token instead of shipping it into the letter ([#2586](https://github.com/santifer/career-ops/issues/2586)) ([3733414](https://github.com/santifer/career-ops/commit/3733414d6440c3f9c6834c4c2ac73245ef25d778)) * **cv:** drop empty Skills section instead of rendering a bare header ([#2516](https://github.com/santifer/career-ops/issues/2516)) ([60c4db9](https://github.com/santifer/career-ops/commit/60c4db955d19f7267e1722d9b2a8216843ba3cb3)) * **cv:** pair _EMPTY fallbacks with their block so mixed rows stay aligned ([#2486](https://github.com/santifer/career-ops/issues/2486)) ([57af06b](https://github.com/santifer/career-ops/commit/57af06ba78515eb22c835adfef65ce5b45cc94eb)) * **cv:** pass a replacer function so $-patterns in candidate text stay literal ([#2588](https://github.com/santifer/career-ops/issues/2588)) ([097dac0](https://github.com/santifer/career-ops/commit/097dac0c8b811e2145449b6392e56b5d3f2a7fa5)) * **dedup:** use the shared Unicode-aware company key instead of a local ASCII copy ([#2587](https://github.com/santifer/career-ops/issues/2587)) ([130e3fa](https://github.com/santifer/career-ops/commit/130e3fa073e37655178566312ea741bfba24866c)) * **dedup:** write the blind-via key prefix as an escape, not a raw NUL byte ([1b57bb6](https://github.com/santifer/career-ops/commit/1b57bb65f30a1614dbd55e6dd6729357a767b7a7)) * **doctor:** treat the cloud billing switches as opt-in, not merely present ([#2593](https://github.com/santifer/career-ops/issues/2593)) ([acbd060](https://github.com/santifer/career-ops/commit/acbd06061d1ef90eef09a3a81cd4e3d6b7467247)), closes [#2592](https://github.com/santifer/career-ops/issues/2592) * extend the backup-file ignore to .npmignore and pin it with a test ([#2560](https://github.com/santifer/career-ops/issues/2560)) ([f0e7a5d](https://github.com/santifer/career-ops/commit/f0e7a5db4fd0b0952492723227f62fb51741cbd6)) * **http:** consolidate duplicated User-Agent strings into a shared module ([#2536](https://github.com/santifer/career-ops/issues/2536)) ([c8e9a6f](https://github.com/santifer/career-ops/commit/c8e9a6f7bee926a92a9f8cf16ef9403be8b9942e)) * **invite-match:** non-Latin company names returned zero candidates ([#2517](https://github.com/santifer/career-ops/issues/2517)) ([df43774](https://github.com/santifer/career-ops/commit/df43774c4df0c24acd48791ea513e41598af3757)) * **jd-skill-gap:** CRLF-terminated JDs extracted zero skills ([fa16f09](https://github.com/santifer/career-ops/commit/fa16f095f02605009e7bd603bba94149b99fef96)) * **merge-tracker:** write a lower-scored re-evaluation through instead of discarding it ([9036809](https://github.com/santifer/career-ops/commit/90368097c57f9f6ad5ee60efa67415f19d1e54db)) * **providers:** hackernews thread lookup filters by the whoishiring tag ([3aa5e15](https://github.com/santifer/career-ops/commit/3aa5e159d7c135c7e40f4677475f4b6cbc8583bd)) * **providers:** move The Hub to the v2 jobsandfeatured API ([6b33fc4](https://github.com/santifer/career-ops/commit/6b33fc45f3d4abe15be300fd0b3c9cf4999c57ff)) * **providers:** resize a16z page budgets for the 50-job page size ([36d0c44](https://github.com/santifer/career-ops/commit/36d0c444534f518fc127d70b81590aa1d2a3bf1a)) * **repo:** add .gitattributes so Windows checkouts stop producing whole-file diffs ([80d104f](https://github.com/santifer/career-ops/commit/80d104f994ba1e64a09b7a92a0d86641308cf64a)) * **scan:** read --company/--posted-after/--posted-before in =value form too ([#2589](https://github.com/santifer/career-ops/issues/2589)) ([b629ca0](https://github.com/santifer/career-ops/commit/b629ca09ae9cd4ea7e0ba871513229fee3bb7545)) * **scan:** Unicode-aware keys for role dedup and company matching ([#2569](https://github.com/santifer/career-ops/issues/2569)) ([08cda71](https://github.com/santifer/career-ops/commit/08cda7110a0ba5095ddbcb03857382aa07f3a261)) * **seeds:** walk every YC page instead of stopping after page 1 ([#2526](https://github.com/santifer/career-ops/issues/2526)) ([6cf9e41](https://github.com/santifer/career-ops/commit/6cf9e41952dbe41e4fbe4751558d3107cf3a6924)), closes [#2525](https://github.com/santifer/career-ops/issues/2525) * **seeds:** walk every YC page instead of stopping after page 1 ([#2558](https://github.com/santifer/career-ops/issues/2558)) ([9424577](https://github.com/santifer/career-ops/commit/9424577c320016ef1ba13406182e5096facf9724)) * **update-system:** apply .gitattributes before the files it governs ([b630da2](https://github.com/santifer/career-ops/commit/b630da27e682d326f6ec809c71e0928a8f469680)) * **web:** derive company matching keys from the core, not an ASCII-only copy ([#2667](https://github.com/santifer/career-ops/issues/2667)) ([9b6582c](https://github.com/santifer/career-ops/commit/9b6582c01c381e6ab22ed674be7f7ef9f13d48df)) * **web:** re-read states.yml when it changes instead of caching it for the process lifetime ([#2590](https://github.com/santifer/career-ops/issues/2590)) ([2a2e09e](https://github.com/santifer/career-ops/commit/2a2e09e61275e18a2331c1fee39bec3225f9f01c)) * **web:** route Today's "See all N" link to the fresh-matches view ([#1790](https://github.com/santifer/career-ops/issues/1790)) ([5fcc727](https://github.com/santifer/career-ops/commit/5fcc72773b711be59f8212536df27ea6fd79f88d)) * **web:** take Write/Edit away from the dashboard's pdf mode ([#2508](https://github.com/santifer/career-ops/issues/2508)) ([1301ed4](https://github.com/santifer/career-ops/commit/1301ed4ccc4b1ead8b7eca024135ad4d1d63932c)) ## [1.25.0](https://github.com/santifer/career-ops/compare/career-ops-v1.24.0...career-ops-v1.25.0) (2026-08-04) ### Features * add company:funded — review-first funded-company discovery from public RSS sources ([#2117](https://github.com/santifer/career-ops/issues/2117)) ([7ab92ab](https://github.com/santifer/career-ops/commit/7ab92abb139ccd0e8712d62b2fff4211c551fd33)) * **cv:** add optional Awards / Honors section to HTML + LaTeX CV templates ([#2220](https://github.com/santifer/career-ops/issues/2220)) ([59df4bb](https://github.com/santifer/career-ops/commit/59df4bb11a278bfacd23dcdec15e4b9cfc401782)) * **i18n:** add Italian translations for interview modes ([#2335](https://github.com/santifer/career-ops/issues/2335)) ([8127c93](https://github.com/santifer/career-ops/commit/8127c932f0c14200e7e519495ce52d033ab3a3f6)) * **pdf:** opt-in hiring-manager audit pass — adversarial, research-grounded CV review ([#2239](https://github.com/santifer/career-ops/issues/2239)) ([3024413](https://github.com/santifer/career-ops/commit/3024413f54e683728b581ec1f251fc89c0b60d5a)) * **providers:** getManfred board-wide feed (Spanish/EU tech, salaries published) ([9474ff1](https://github.com/santifer/career-ops/commit/9474ff12b56b87700cad42dc1ace545ac1f9b3e2)) * **reposts:** add --help usage block to detect-reposts ([6ec8e15](https://github.com/santifer/career-ops/commit/6ec8e157639a6f2b53e3c3ad9a051ed3c69ea5f8)) * **scan:** add --since, a relative posted-date bound that also stops paging early ([1d9ff63](https://github.com/santifer/career-ops/commit/1d9ff6343239dfb2dae9d91e091685e6c2641c9d)) * **test:** dynamic upgrade PR gate — old install applies the commit under test ([#2358](https://github.com/santifer/career-ops/issues/2358)) ([aa57dcb](https://github.com/santifer/career-ops/commit/aa57dcb1803a8a8ae41f60f587308738f9626e3a)) * **web:** Follow-up Tracker page with logging, history, and cadence settings ([#1422](https://github.com/santifer/career-ops/issues/1422)) ([6554de6](https://github.com/santifer/career-ops/commit/6554de6dcd28b95556e95ae220aebc719cc7a2a0)) * **weekly-digest:** weekly interview digest aggregator ([#2130](https://github.com/santifer/career-ops/issues/2130)) ([37a5184](https://github.com/santifer/career-ops/commit/37a5184ba0bbcb590f5e17cfbf6a718db1527460)) ### Bug Fixes * **batch-runner:** tab-IFS collapse recorded score "-" for every successful offer ([5b312bf](https://github.com/santifer/career-ops/commit/5b312bf57e49147e8273b2e8f3986155f134b109)) * **cli:** --flag=value was silently ignored in five scripts ([37055d7](https://github.com/santifer/career-ops/commit/37055d7de76bf400eb8aa8ed399efca293deadf2)) * **company-funded:** catch the layoff spellings [#2404](https://github.com/santifer/career-ops/issues/2404) left through ([aca8b71](https://github.com/santifer/career-ops/commit/aca8b71de30d2a883b9ac8013801bb3d6f4d2a3c)) * **company-funded:** the cuts N% layoff exclusion never matched ([#2404](https://github.com/santifer/career-ops/issues/2404)) ([476b21b](https://github.com/santifer/career-ops/commit/476b21be740ee2399a5c0209641c91a4c8d6bd41)) * **company-history:** count a hire as a company response ([#2297](https://github.com/santifer/career-ops/issues/2297)) ([c6220bf](https://github.com/santifer/career-ops/commit/c6220bf1e414b37e9fb0aec6bc6e68c47189b94b)) * **cv-facts:** the anti-fabrication gate saw nothing in five shipped locales ([599dd82](https://github.com/santifer/career-ops/commit/599dd820fcb73e67eee20b46e88d516f3b349acc)) * **cv-facts:** the employer/title gate only matched lowercase triggers ([a05c270](https://github.com/santifer/career-ops/commit/a05c270ec21b025f75f072751ae0a4acc65c02e0)) * **cv-latex:** single mailto: scheme + escape OT1-unsafe glyphs ([#2378](https://github.com/santifer/career-ops/issues/2378)) ([654dce2](https://github.com/santifer/career-ops/commit/654dce2120e342ea9f1fb89e94a2fd597d47cf29)) * **dashboard:** localize the hired status label and buffer split stream openers ([#2295](https://github.com/santifer/career-ops/issues/2295)) ([8f5d10d](https://github.com/santifer/career-ops/commit/8f5d10d6aa97438a4ac3908814456df5a8cf4083)) * **dashboard:** the progress funnel dropped Hired from every stage ([#2406](https://github.com/santifer/career-ops/issues/2406)) ([aac93e8](https://github.com/santifer/career-ops/commit/aac93e82809a345430c6e7fe89263cfb6aa86416)) * **dedup:** use Unicode-aware Via key for blind-employer grouping ([#2397](https://github.com/santifer/career-ops/issues/2397)) ([fe4561b](https://github.com/santifer/career-ops/commit/fe4561b0686b8e2829d5cf6c8d7bbdedb9bfb7cd)) * **deps:** update npm dependencies (+ Dockerfile playwright pins, web lockfile sync) ([f154f59](https://github.com/santifer/career-ops/commit/f154f5938fed43a37ab5e57efee1c45d664cdc3f)) * **doctor:** detect Playwright MCP in JSONC OpenCode configs ([#2252](https://github.com/santifer/career-ops/issues/2252)) ([ead7985](https://github.com/santifer/career-ops/commit/ead7985f9fa2f2770cc6738443662549ff16e1e9)) * **fingerprint:** non-Latin employers no longer collapse to the same company key ([#2501](https://github.com/santifer/career-ops/issues/2501)) ([9326a04](https://github.com/santifer/career-ops/commit/9326a04102e5b8ef517532f4dea94f8688727332)) * git-ignore article-digest.md and guard the user layer against tracking ([#2365](https://github.com/santifer/career-ops/issues/2365)) ([e8a33cf](https://github.com/santifer/career-ops/commit/e8a33cf4ca26971b3e26050346800caec43b81fe)) * **jd-skill-gap:** warn when zero skills are classified instead of printing a clean summary ([#2341](https://github.com/santifer/career-ops/issues/2341)) ([9e3586d](https://github.com/santifer/career-ops/commit/9e3586da3e4a54291e2ddab07e218e09cbd76b92)) * **liveness:** classify transient 5xx as uncertain, not expired ([#2371](https://github.com/santifer/career-ops/issues/2371)) ([6958d84](https://github.com/santifer/career-ops/commit/6958d848085cbecae4adc800e75eebce3eca35b7)) * **merge-tracker:** collapse placeholder Notes to the re-eval marker ([#2483](https://github.com/santifer/career-ops/issues/2483)) ([0df8a41](https://github.com/santifer/career-ops/commit/0df8a416117cfd66a3e747ad1a602c0a995380ed)) * **merge-tracker:** four silent data-loss paths in the merge loop, with Unicode-safe company matching ([#2399](https://github.com/santifer/career-ops/issues/2399)) ([7bcae6b](https://github.com/santifer/career-ops/commit/7bcae6be777d029fe9bc6cfb3048a80f9c2bea96)) * **providers:** a16z speedrun feed silently truncates to 50 jobs ([4abcb32](https://github.com/santifer/career-ops/commit/4abcb3224c506ea05cccf8d67acc4610f8a2a4bc)) * **providers:** dead boards throw instead of reading as live-but-empty ([#2379](https://github.com/santifer/career-ops/issues/2379)) ([3c331e4](https://github.com/santifer/career-ops/commit/3c331e43662226464fcbfb1dc32985e4646afc5b)) * resolve the PDF manifest from the tracker, not the install dir ([#2471](https://github.com/santifer/career-ops/issues/2471)) ([bc73c7f](https://github.com/santifer/career-ops/commit/bc73c7fd75192edf8d4927de7339c6cbb6eeaa05)) * **scan-ats-full:** --since -5 silently scanned nothing and called it a clean run ([#2498](https://github.com/santifer/career-ops/issues/2498)) ([8a10c01](https://github.com/santifer/career-ops/commit/8a10c010f29052f2a252f103ab1f6950aa9ba172)) * **scan-ats-full:** keep the checkpoint when a resolver outage stops a sweep ([#2283](https://github.com/santifer/career-ops/issues/2283)) ([5764c35](https://github.com/santifer/career-ops/commit/5764c35778b7ce82a8787ceb31d0fec703b077c6)) * **set-status:** close the report-less-row blind spot and add explicit --row/--report selectors ([#2347](https://github.com/santifer/career-ops/issues/2347)) ([292f55d](https://github.com/santifer/career-ops/commit/292f55d49dc10deaa6e96975634b650143eb08e4)) * show actual LinkedIn URL as cover-letter link text, not the word "LinkedIn" ([#2338](https://github.com/santifer/career-ops/issues/2338)) ([f04b40e](https://github.com/santifer/career-ops/commit/f04b40e1d1bfbad4a329d2fcc8c24251a8285553)) * strip GitHub URL scheme case-insensitively in cover letters ([#2340](https://github.com/santifer/career-ops/issues/2340)) ([0157284](https://github.com/santifer/career-ops/commit/0157284500925b7042707184e547a862da0406fe)) * **sync-pdf:** reject unknown options ([a9b986b](https://github.com/santifer/career-ops/commit/a9b986b78ab68c32b12373b7cd47b4ae839fcca1)) * **tailor:** prompt-cache the openai-tailor.mjs static system prefix ([#2432](https://github.com/santifer/career-ops/issues/2432)) ([1ec3320](https://github.com/santifer/career-ops/commit/1ec33201f80f94d7affb49a9c61193444d3c90aa)) * **test-all:** the states.yml freeze guarded 6 of 9 ids ([#2408](https://github.com/santifer/career-ops/issues/2408)) ([d3acdad](https://github.com/santifer/career-ops/commit/d3acdad1d9db5a053a6be436905efa8c5a12d9a9)) * **test:** forbid finish() in discovered suites — it forges the global verdict ([cd346d3](https://github.com/santifer/career-ops/commit/cd346d3f0e746aeadcafd2e64dcb0afaaec47d15)) * **test:** report the Windows-unobservable lock contention signal instead of failing ([d2b4ccd](https://github.com/santifer/career-ops/commit/d2b4ccd3847aafd5fea71da453080bfaf5c1fcb3)) * **tests:** budget harness waits for slow runners and preserve crashed-script diagnostics ([#2332](https://github.com/santifer/career-ops/issues/2332)) ([e439792](https://github.com/santifer/career-ops/commit/e439792bc58740f83fb153807f02929f500f0759)) * **tests:** find Git Bash under Scoop and name the fallback shell in failures ([#2366](https://github.com/santifer/career-ops/issues/2366)) ([bff961c](https://github.com/santifer/career-ops/commit/bff961c4756b1f0d9c1baa149ed2af75756a485a)) * **tests:** isolate tracker-columns fixtures from the real reports/ directory ([0f79901](https://github.com/santifer/career-ops/commit/0f79901a756903335fef9e50aa23a248a5135002)) * **test:** stop test-all silently passing when a node:test suite fails ([#2463](https://github.com/santifer/career-ops/issues/2463)) ([7e02444](https://github.com/santifer/career-ops/commit/7e02444aff702ad3b1d5063c5835b53e44d4a9ff)) * **test:** use a junction on Windows for the node_modules link ([241bcfd](https://github.com/santifer/career-ops/commit/241bcfd93a3a0a11242c45fad5483f57806ef019)) * **tracker:** non-Latin company names all keyed to empty string, silently overwriting each other ([#2429](https://github.com/santifer/career-ops/issues/2429)) ([f589ce8](https://github.com/santifer/career-ops/commit/f589ce8306c4b3fcaee15619daca337ede7ce60e)) * **tracker:** rank Hired in dedup, canonicalize its aliases, stop bare tracker-number merges across roles ([#2377](https://github.com/santifer/career-ops/issues/2377)) ([83cde52](https://github.com/santifer/career-ops/commit/83cde5259131ee075e485a0418dbe8f8912a9539)) * **verify-cv-facts:** stop the modifier count from deciding whether a claim exists ([#2279](https://github.com/santifer/career-ops/issues/2279)) ([11493bf](https://github.com/santifer/career-ops/commit/11493bfabe2ee9df2e85162bde0857ec18bf2ab4)) * **verify-pipeline:** orphan check masks and invents orphans ([#1425](https://github.com/santifer/career-ops/issues/1425)) ([b4309a0](https://github.com/santifer/career-ops/commit/b4309a00b0c4dd504689e9a6fe08788be82441de)) * **verify-pipeline:** Unicode-aware keys for company/role/Via grouping ([00a839f](https://github.com/santifer/career-ops/commit/00a839fe8611607ba8c21f871e11a5132a8066c6)) * **web:** render PDFs from the backend instead of the spawned agent ([#2182](https://github.com/santifer/career-ops/issues/2182)) ([fef3ff2](https://github.com/santifer/career-ops/commit/fef3ff2e228cc14e55df4ced958e4b0aa630ec65)) * **weekly-digest:** --from=… was silently ignored, digesting the wrong week ([#2402](https://github.com/santifer/career-ops/issues/2402)) ([43af8c6](https://github.com/santifer/career-ops/commit/43af8c64b29d5110b679f0d5accfb7532baee508)) * **workable:** use the public widget API so large accounts are scanned ([5ab8425](https://github.com/santifer/career-ops/commit/5ab8425ce824a885af1724522319af46ad52c265)) ### Performance Improvements * **detect-reposts:** bucket titles instead of comparing every pair ([#2389](https://github.com/santifer/career-ops/issues/2389)) ([a42a0bf](https://github.com/santifer/career-ops/commit/a42a0bf43b2b14235187c315898257252e0f5b03)) * **fingerprint:** popcount table + hoisted loop state in findCrossListings ([#2388](https://github.com/santifer/career-ops/issues/2388)) ([f2ffc7a](https://github.com/santifer/career-ops/commit/f2ffc7a065862f6e508b59e12cf1f1dad593cb68)) * **tests:** fix the dead SSRF DNS stub and cut three fixed costs from test-all ([#2390](https://github.com/santifer/career-ops/issues/2390)) ([2f21fe7](https://github.com/santifer/career-ops/commit/2f21fe7722bb78b9ff322b7d208fc8ebfef56e08)) ## [1.24.0](https://github.com/santifer/career-ops/compare/career-ops-v1.23.0...career-ops-v1.24.0) (2026-07-30) ### Features * **compliance:** check-table-freshness.mjs — staleness validator for jurisdiction tables (closes [#2036](https://github.com/santifer/career-ops/issues/2036)) ([1e83f67](https://github.com/santifer/career-ops/commit/1e83f6711e5e1587fc1d220b40eb925b8ef73542)) * **contacts:** company-history.mjs, employer silence and repost facts ([#1712](https://github.com/santifer/career-ops/issues/1712)) ([af21577](https://github.com/santifer/career-ops/commit/af2157747b730284e97c99936f2d15d3fa2977f9)), closes [#1711](https://github.com/santifer/career-ops/issues/1711) * **contacts:** job-search phonebook with vCard export ([#1719](https://github.com/santifer/career-ops/issues/1719)) ([8bba0ee](https://github.com/santifer/career-ops/commit/8bba0ee59b2cb584ab06d9379a6a02e537841508)) * **cv:** block unsupported employer, title, and tool claims in cover letters ([10a2e75](https://github.com/santifer/career-ops/commit/10a2e75526feb0db9162994b19ea6ebaba8b587e)) * **cv:** recommend CV reuse for similar JDs — deterministic jd-similarity helper ([07a7d9f](https://github.com/santifer/career-ops/commit/07a7d9f7edae960b274d3c9f9ca2e15af4d86f62)) * **doctor:** CLI-aware Playwright MCP detection + OpenCode config support ([#2247](https://github.com/santifer/career-ops/issues/2247)) ([960d00b](https://github.com/santifer/career-ops/commit/960d00b3a45a8213db9e7279727d9422887329a6)) * **interview-prep:** detect call platform (phone/Zoom/Teams/Meet) from invite text ([9acfec1](https://github.com/santifer/career-ops/commit/9acfec10cac786013826a93d668e732b6595e7d3)) * **interview-redflag:** protected-grounds question detection with jurisdiction table ([#2030](https://github.com/santifer/career-ops/issues/2030)) ([6b25cdd](https://github.com/santifer/career-ops/commit/6b25cddfbddef406b31b9d89d9527b9d2434483c)) * **interview/debrief:** correct contradicted facts in the prep file in place ([e8e912b](https://github.com/santifer/career-ops/commit/e8e912b777bad303f430ffa9e1eb03950157c15b)) * **interview/plan:** wire in interview-prep's sourced-question research before Block 4 ([3ceb404](https://github.com/santifer/career-ops/commit/3ceb404d5ff15edacab2755325b9571f96f045f6)) * **interview:** debrief directly from an existing transcript ([#2122](https://github.com/santifer/career-ops/issues/2122)) ([5cb7f0a](https://github.com/santifer/career-ops/commit/5cb7f0af9c6709505c1b85c0641f46825bc8d02b)) * **ledger:** set-status transition log + mode wiring ([#1695](https://github.com/santifer/career-ops/issues/1695)) ([2af59e6](https://github.com/santifer/career-ops/commit/2af59e6e2f3b734fd7487b8fca62790671c9bb5a)) * **oferta/apply:** immigration-status requirement overreach — jurisdiction table + posting signal + form warning ([2a681d1](https://github.com/santifer/career-ops/commit/2a681d129a5ad2fb1b191072dac74a0a90ea6cb5)) * **oferta/apply:** jurisdiction-prohibited content signal — table + Block G + apply-form warning ([d8dac75](https://github.com/santifer/career-ops/commit/d8dac7589b228051abe79ca3acf4014cf8b9c6fb)) * **oferta:** agency licensing check — jurisdiction table + registry pointer for agency-mediated postings (closes [#2037](https://github.com/santifer/career-ops/issues/2037)) ([10bf77f](https://github.com/santifer/career-ops/commit/10bf77fb7c5c2f8eb6ca1a03ba91736f5bf95ca3)) * **offer-prep:** jurisdiction-aware restrictive-covenant notes ([#2029](https://github.com/santifer/career-ops/issues/2029)) ([6eb7778](https://github.com/santifer/career-ops/commit/6eb7778b68dad59990694f32e86c9527fd222343)) * **outcome:** outcome recording and application archiving, phase 1 ([#2248](https://github.com/santifer/career-ops/issues/2248)) ([6d60073](https://github.com/santifer/career-ops/commit/6d600736ca316182283d3c669d9b4c77f91d0964)) * **portals:** standalone fix-slugs.mjs — auto-write ATS slug fixes to portals.yml ([7ab1a1d](https://github.com/santifer/career-ops/commit/7ab1a1d6e30ccb02a53adde031e6bd6ae648d4c4)) * **providers:** a16z speedrun talent network board-wide feed ([#2231](https://github.com/santifer/career-ops/issues/2231)) ([1b785a9](https://github.com/santifer/career-ops/commit/1b785a93e2082830ea1d73eb1328cb05c93644bd)) * **providers:** add iCIMS to the reverse-ATS full sweep ([#2141](https://github.com/santifer/career-ops/issues/2141)) ([b9cd65e](https://github.com/santifer/career-ops/commit/b9cd65e8ddba9448c9590c25f45288cf61c1c1c7)), closes [#2137](https://github.com/santifer/career-ops/issues/2137) * **providers:** cryptocurrencyjobs — Web3 job board via public RSS, zero-auth ([3310855](https://github.com/santifer/career-ops/commit/331085540ad2330c158619f1e7e3bf4dc40db21e)) * **radancy:** support legacy TalentBrew markup and the JSON results fragment ([a3e6df9](https://github.com/santifer/career-ops/commit/a3e6df971c563405c67deaf63bfcc27d8cb44bbb)) * **scan-history:** additive normalized-company column for reliable repost keying ([#2243](https://github.com/santifer/career-ops/issues/2243)) ([a4575a6](https://github.com/santifer/career-ops/commit/a4575a64a550608ecca3386851f6ad76aa592205)) * **scan:** add Playwright scanner for Interamt.de ([2a132d0](https://github.com/santifer/career-ops/commit/2a132d0348bff2381f75d0aa13a3173391968bfb)) * **scan:** country-eligibility filter for remote postings ([#2095](https://github.com/santifer/career-ops/issues/2095)) ([79ba55d](https://github.com/santifer/career-ops/commit/79ba55d7f66863eb6e7e8ce213fb8dd98b30de49)), closes [#2093](https://github.com/santifer/career-ops/issues/2093) * **scan:** negative-cache resolver refusals and stop the sweep on a resolver outage ([#2266](https://github.com/santifer/career-ops/issues/2266)) ([ebaed15](https://github.com/santifer/career-ops/commit/ebaed15abd5d445bb86ae6e8988abc816cc9b9b2)) * **scan:** pace DNS lookups so a full sweep can't trip a resolver's rate limit ([e03719b](https://github.com/santifer/career-ops/commit/e03719b417b5e5f4de4153e4927a90fbba5ea5a0)) * **stats:** wire followup-cadence's cold classification into activeApps ([52a2be8](https://github.com/santifer/career-ops/commit/52a2be88a567133276cd917323646c2228860579)) * **test:** seed-fixture.mjs + era-appropriate install fixtures ([#2032](https://github.com/santifer/career-ops/issues/2032)) ([0c5d146](https://github.com/santifer/career-ops/commit/0c5d1469e865c0a1720b8e0002469e8a05f874c2)) * **triage:** standalone two-pass triage mode to cut evaluation tokens ([#1550](https://github.com/santifer/career-ops/issues/1550)) ([7f281d8](https://github.com/santifer/career-ops/commit/7f281d829676fadadd7a934376469fea26394f16)) * versioned application CV artifact schema — bundles with flat-path coexistence ([1c7a7cb](https://github.com/santifer/career-ops/commit/1c7a7cbd3dd3a8cbd1e51f38abadfa123a45d7cd)) ### Bug Fixes * **analyze-patterns:** use symbol-safe lookarounds so C++, C# and .NET stop vanishing from tech gaps ([#2227](https://github.com/santifer/career-ops/issues/2227)) ([85cb018](https://github.com/santifer/career-ops/commit/85cb018a4c5ec06a806384e965b77e2374bace6b)) * **batch:** don't mark a worker-reported failure as completed ([c7b9519](https://github.com/santifer/career-ops/commit/c7b951907930a90d3a58888b89aa002f77a3477c)) * **ci:** a fork signature's valid check must not go red when the ack comment can't post ([5d7b625](https://github.com/santifer/career-ops/commit/5d7b62569cab62dbf05e25942bc8d480c8f7056b)) * **cover:** prevent double comma in achievement bullets ([#2254](https://github.com/santifer/career-ops/issues/2254)) ([31ddafb](https://github.com/santifer/career-ops/commit/31ddafb5c52d3ef368469046011a6d3cadc48358)) * **dashboard:** pin the row's own status to the top of the status picker ([f214d03](https://github.com/santifer/career-ops/commit/f214d0355118735939fcf3339b263d7769514f19)) * **dashboard:** stop reading funding and valuation figures as Pay ([#2139](https://github.com/santifer/career-ops/issues/2139)) ([581374f](https://github.com/santifer/career-ops/commit/581374f25ca971d7b8161ca94d34fc9de9236cd5)) * **dashboard:** the 'hired' status renders with no colour in the pipeline list ([8465462](https://github.com/santifer/career-ops/commit/8465462c9dd82ef9ced62395126f2c8455871cb6)) * **echojobs:** keep hybrid roles distinguishable from remote ([#2258](https://github.com/santifer/career-ops/issues/2258)) ([0ef7c23](https://github.com/santifer/career-ops/commit/0ef7c23672a572abc8dc54d53cdefd5f065e086b)) * **followup-seed:** age out an orphaned recover guard so it can't permanently disable stale-lock recovery ([799b3f8](https://github.com/santifer/career-ops/commit/799b3f86c2e40edec980d44704aa92f512312e13)) * **followup:** accept an estimated apply date and report which date the age came from ([14a4003](https://github.com/santifer/career-ops/commit/14a40030f51891e93c5a026ab388a0253aca0250)) * **followup:** recognise name-only outreach so an empty contact list means no contact ([6d32f33](https://github.com/santifer/career-ops/commit/6d32f33589608a7d8e0e95c6a48d6dd8e198b2f8)) * **jd-skill-gap:** canonicalize CV and JD tokens through skill-extract ([#2226](https://github.com/santifer/career-ops/issues/2226)) ([dbaa761](https://github.com/santifer/career-ops/commit/dbaa761d10abaf34e52684e04fb996a0625e70fc)) * **merge-tracker:** stop sibling-req clobber when the qualifier is a slashed acronym ([#2166](https://github.com/santifer/career-ops/issues/2166)) ([4910e73](https://github.com/santifer/career-ops/commit/4910e7398fb16442357db6a1cbe055afb1c28652)) * **pipeline-lock:** floor the ownerless stale check, harden the timeout tests ([4720e20](https://github.com/santifer/career-ops/commit/4720e20f45c34c14d3fff807880ff9e0e23a0ef4)) * **role-matcher:** fold accented Latin letters before tokenizing role titles ([#2209](https://github.com/santifer/career-ops/issues/2209)) ([830fe51](https://github.com/santifer/career-ops/commit/830fe511d04dce244b1ea20941a94b26a9d38d97)), closes [#2207](https://github.com/santifer/career-ops/issues/2207) * **scaffolder:** materialize the Kimi skill entrypoint on symlink-less filesystems ([#2259](https://github.com/santifer/career-ops/issues/2259)) ([06da05c](https://github.com/santifer/career-ops/commit/06da05c67283ce2c18c4c52e25ea7aee2d89d5ea)) * **scan:** a title-stated remote role survives a city-only location ([8c3e806](https://github.com/santifer/career-ops/commit/8c3e806201fa12d7780c4a085c4d8108e5c4b7ad)) * **scan:** ignore StepStone's volatile rltr param when deduping posting URLs ([#1982](https://github.com/santifer/career-ops/issues/1982)) ([b1ae044](https://github.com/santifer/career-ops/commit/b1ae0443d8eec1a1468cc603dc36c3f7e1344fe4)) * **scan:** portal-health cross-process lock + resolve PORTAL_HEALTH_PATH from cwd ([96c578b](https://github.com/santifer/career-ops/commit/96c578b689fc138811dd40ec296ae8c3eca497e7)) * **scan:** record auth, server and unknown fetch errors in portal-health instead of reachable ([#2236](https://github.com/santifer/career-ops/issues/2236)) ([2328f46](https://github.com/santifer/career-ops/commit/2328f469ce6575d1582964f35e6265216e045ff6)) * **test:** accept a materialized skill entrypoint, not just a symlink ([#2273](https://github.com/santifer/career-ops/issues/2273)) ([741fadf](https://github.com/santifer/career-ops/commit/741fadf65e1810645e816fa83d6ffa40ea645e6f)) * **tracker-utils, followup-seed:** floor the ownerless stale-lock check so a just-created lock can't be stolen ([cfc791d](https://github.com/santifer/career-ops/commit/cfc791d53513c8ab96ac29b76f4b705244b56365)) * **tracker:** a data row containing --- is invisible to merge-tracker dedup ([#2267](https://github.com/santifer/career-ops/issues/2267)) ([2333a0f](https://github.com/santifer/career-ops/commit/2333a0fa4221111d975cd0a2d51d498f853f6d1c)) * **web:** add Hired to the states.ts FALLBACK so the degraded path accepts it ([#2282](https://github.com/santifer/career-ops/issues/2282)) ([fd112c9](https://github.com/santifer/career-ops/commit/fd112c972d23cf0028e0411f36f67b1adf5520db)) * **web:** label-aware pipeline.md reader — posted:/trust:/note: never misread as columns ([6c75d9a](https://github.com/santifer/career-ops/commit/6c75d9aa03c919803ffe6939b2ba6f1cf7238db6)) * **web:** propagate the Hired terminal-success state across the whole dashboard ([#2250](https://github.com/santifer/career-ops/issues/2250)) ([29503dc](https://github.com/santifer/career-ops/commit/29503dca07c4f1725675299db48685565f159acb)) ## [1.23.0](https://github.com/santifer/career-ops/compare/career-ops-v1.22.0...career-ops-v1.23.0) (2026-07-28) ### Features * **batch:** add batch-tailor.mjs for bulk CV tailoring of high-scoring roles ([#1882](https://github.com/santifer/career-ops/issues/1882)) ([d5384ef](https://github.com/santifer/career-ops/commit/d5384efd43d2d73c88e4267ab2f5ec7099e95df1)), closes [#1836](https://github.com/santifer/career-ops/issues/1836) * **cli:** add Cursor as a supported CLI host ([#2115](https://github.com/santifer/career-ops/issues/2115)) ([119d75c](https://github.com/santifer/career-ops/commit/119d75ceec5b5182b9380f0c9b48919c73245206)) * **cv:** support declarative section HTML partials from disk ([#2184](https://github.com/santifer/career-ops/issues/2184)) ([aefed14](https://github.com/santifer/career-ops/commit/aefed14a625bb078218fb197a7e2430d826beca7)), closes [#2183](https://github.com/santifer/career-ops/issues/2183) * **dashboard:** add a RESPONDED filter tab to the pipeline screen ([#2000](https://github.com/santifer/career-ops/issues/2000)) ([eff33e6](https://github.com/santifer/career-ops/commit/eff33e66367279803a0c737444481e283e6d6edb)), closes [#1999](https://github.com/santifer/career-ops/issues/1999) * **dashboard:** build the pay-span regex from an explicit currency list ([#2201](https://github.com/santifer/career-ops/issues/2201)) ([37f20ab](https://github.com/santifer/career-ops/commit/37f20ab86dac507a8885068c89746e27f8c6892f)) * **eval:** token-budget-aware context compression for the Gemini and OpenAI evaluators ([#2060](https://github.com/santifer/career-ops/issues/2060)) ([4a9281b](https://github.com/santifer/career-ops/commit/4a9281b5c75d3ed5fa5ce39c2c13e3f38aaec00b)), closes [#2077](https://github.com/santifer/career-ops/issues/2077) * **i18n:** add Dutch (nl) modes ([#1970](https://github.com/santifer/career-ops/issues/1970)) ([0099c42](https://github.com/santifer/career-ops/commit/0099c420c6efc39b2a4b687c62ff55a94b807b73)) * **latex-tex:** support resumeItemWithoutTitle bullets and resumeSubItem skills ([#2120](https://github.com/santifer/career-ops/issues/2120)) ([0d4fa4d](https://github.com/santifer/career-ops/commit/0d4fa4d1b70f2c3bf7a8cd2907a2eb9fc64faed0)) * **oferta:** flag explicit no-sponsorship as a hard blocker ([#2017](https://github.com/santifer/career-ops/issues/2017)) ([933aa01](https://github.com/santifer/career-ops/commit/933aa019199fd96f7c62497d32dab1c08d4b7720)), closes [#2016](https://github.com/santifer/career-ops/issues/2016) * **pdf:** dynamic CSS theming from a profile.yml style block ([#1862](https://github.com/santifer/career-ops/issues/1862)) ([6271e6d](https://github.com/santifer/career-ops/commit/6271e6d9cd6ad9f2a98fb934e02f8bcb6e632886)), closes [#1837](https://github.com/santifer/career-ops/issues/1837) * **providers:** add Flowxtra board-wide job provider ([c9671e0](https://github.com/santifer/career-ops/commit/c9671e08f92ebc7d01aba0b41d084dd5322afd18)) * **providers:** add VDAB zero-auth provider ([#2084](https://github.com/santifer/career-ops/issues/2084)) ([6164384](https://github.com/santifer/career-ops/commit/6164384768fa47b7e164e2c36f53e86b2fd620cc)) * **scan:** discover-ats.mjs — resolve a company list to scannable ATS boards ([#1865](https://github.com/santifer/career-ops/issues/1865)) ([50874d1](https://github.com/santifer/career-ops/commit/50874d109ebc7adb35e7e67100687e4d96f42cce)), closes [#1864](https://github.com/santifer/career-ops/issues/1864) * **skills:** extract the shared skill tokenizer into skill-extract.mjs ([#2003](https://github.com/santifer/career-ops/issues/2003)) ([c110825](https://github.com/santifer/career-ops/commit/c110825a539d29c8dde25ad0d036babcaffefb18)) * **upskill:** learning plan on the aggregate gap heatmap ([#2217](https://github.com/santifer/career-ops/issues/2217)) ([f20d3e2](https://github.com/santifer/career-ops/commit/f20d3e27080217eb9a48dccdc79843d27da319fb)), closes [#1740](https://github.com/santifer/career-ops/issues/1740) ### Bug Fixes * **agentic-jobs:** replace the broken HTML scraper with the documented REST API ([#2167](https://github.com/santifer/career-ops/issues/2167)) ([3aee274](https://github.com/santifer/career-ops/commit/3aee27462bf9000df9b366ad493ae579d962804f)), closes [#2143](https://github.com/santifer/career-ops/issues/2143) * **agents:** compress AGENTS.md ~20% with zero semantic loss ([#2094](https://github.com/santifer/career-ops/issues/2094)) ([bd7b377](https://github.com/santifer/career-ops/commit/bd7b3771dbb72bbc38d4e80fc281b25442d9bbaf)) * **batch:** update Claude tier mapping to the current model lineup ([867e374](https://github.com/santifer/career-ops/commit/867e374e1fa7839944c90fc55d3dc6c5e3d1a768)) * **cv:** add GitHub contact link to the HTML CV pipeline ([38efd59](https://github.com/santifer/career-ops/commit/38efd59f91b3b0a82e02c3f0b30a26e28c9f6cbd)) * **dashboard:** persist status changes from viewer Discard/SKIP and stale rows ([#1849](https://github.com/santifer/career-ops/issues/1849)) ([3f4f947](https://github.com/santifer/career-ops/commit/3f4f947ca55b4b64a2893c8077e8e20c1106a554)) * **dedup:** merge notes from removed entries instead of dropping them ([#1883](https://github.com/santifer/career-ops/issues/1883)) ([a91aebf](https://github.com/santifer/career-ops/commit/a91aebf974304fb284b8e7c8e7719d6a9222d2b0)), closes [#1833](https://github.com/santifer/career-ops/issues/1833) * **deps:** update dependency next to v16.2.11 [security] ([#2198](https://github.com/santifer/career-ops/issues/2198)) ([b6d1c87](https://github.com/santifer/career-ops/commit/b6d1c871d985c278af51d26fa51ef09274c1076b)) * **deps:** update module golang.org/x/sys to v0.47.0 ([#2194](https://github.com/santifer/career-ops/issues/2194)) ([f8bac6e](https://github.com/santifer/career-ops/commit/f8bac6e6514acf9ad4fec5ff8e212ff14b0f2890)) * **doctor:** treat missing user prerequisites as non-fatal setup warnings ([#2083](https://github.com/santifer/career-ops/issues/2083)) ([a3cf654](https://github.com/santifer/career-ops/commit/a3cf6541d2104e4cad307ffbe93713ef18d31655)) * **funnel-velocity:** count non-canonical Applied rows in the waiting backlog ([#2152](https://github.com/santifer/career-ops/issues/2152)) ([1e38216](https://github.com/santifer/career-ops/commit/1e38216ffe42ef8647e8985fbe9970b9e1d7b51e)) * **jd-skill-gap:** recognize real-world requirement headers, stop at benefits ([3ce5718](https://github.com/santifer/career-ops/commit/3ce5718243003f6eaad1030fd71fbf6a0621ce71)) * **liveness:** normalize typographic punctuation and accents before matching ([#2163](https://github.com/santifer/career-ops/issues/2163)) ([105ec60](https://github.com/santifer/career-ops/commit/105ec606737cce5c626aaa1f1ab7448acb860d9f)), closes [#2162](https://github.com/santifer/career-ops/issues/2162) * **liveness:** treat the SPA "has been filled" phrasing as expired ([#2212](https://github.com/santifer/career-ops/issues/2212)) ([112298c](https://github.com/santifer/career-ops/commit/112298c84181884613646c40bc4e90251c86696a)), closes [#2211](https://github.com/santifer/career-ops/issues/2211) * **match-star:** tokenize tag matches so short tokens do not substring-collide ([#2153](https://github.com/santifer/career-ops/issues/2153)) ([360bb8c](https://github.com/santifer/career-ops/commit/360bb8cbe3700100e2c080020c36e473f5e0a6a7)) * **normalize-statuses:** use header-mapped columns instead of fixed indices ([cf0bf4f](https://github.com/santifer/career-ops/commit/cf0bf4f0ad9a85106dc107ee0bb9b6ac89ef343a)) * **opencode:** add missing /career-ops command router ([#2204](https://github.com/santifer/career-ops/issues/2204)) ([74bd6f2](https://github.com/santifer/career-ops/commit/74bd6f2085c350e1d53eeba0e6143df65d537279)), closes [#2191](https://github.com/santifer/career-ops/issues/2191) * **patterns:** recognize the canonical Hired status in analyze-patterns ([#2145](https://github.com/santifer/career-ops/issues/2145)) ([283b2a0](https://github.com/santifer/career-ops/commit/283b2a0cee5fbb76f286d4983648dbf37a01b763)) * **pdf:** apply the CV section-order check to non-English CVs ([#2088](https://github.com/santifer/career-ops/issues/2088)) ([9a82618](https://github.com/santifer/career-ops/commit/9a8261871df0c8cbdc1dc18eee9312e45d24a3e5)) * **pipeline:** lock appendToPipeline() against concurrent read-modify-write ([#2189](https://github.com/santifer/career-ops/issues/2189)) ([3c04b43](https://github.com/santifer/career-ops/commit/3c04b43c9dde809e1bda5a8d6d667c4124cf58ce)), closes [#2188](https://github.com/santifer/career-ops/issues/2188) * **plugin:** mirror plugin.json at .github/plugin/ for the awesome-copilot validator ([11fd356](https://github.com/santifer/career-ops/commit/11fd3565f7b449f44775a6d0e9efb668ffd945fb)) * **providers:** guard decodeEntities against out-of-range code points ([#2150](https://github.com/santifer/career-ops/issues/2150)) ([0448748](https://github.com/santifer/career-ops/commit/0448748ddca5da85aeeca59722fd399a3ee938cf)) * **reply-matcher:** decide rejections before offers to stop mis-typing ([#2151](https://github.com/santifer/career-ops/issues/2151)) ([1d56897](https://github.com/santifer/career-ops/commit/1d5689776de81dfef7548dbf0e7001ad07b21881)) * **reply-matcher:** sanitize domains harvested from tracker notes ([#2135](https://github.com/santifer/career-ops/issues/2135)) ([adc04fb](https://github.com/santifer/career-ops/commit/adc04fb0586e5b50d9d2dbacea3526f90c2174f3)), closes [#2134](https://github.com/santifer/career-ops/issues/2134) * restore empty-Certifications section stripping lost in the v1.22.0 refactor ([#2119](https://github.com/santifer/career-ops/issues/2119)) ([708c53d](https://github.com/santifer/career-ops/commit/708c53de87374863e621187c0b43e4c374194b59)), closes [#2118](https://github.com/santifer/career-ops/issues/2118) * restore the Kimi SKILL.md entrypoint as a real symlink ([82e86a0](https://github.com/santifer/career-ops/commit/82e86a0e8ec7e4985028ac26e87f71a55968d430)) * **role-matcher:** stop collapsing leveled variants into the bare title ([fd8f721](https://github.com/santifer/career-ops/commit/fd8f72191f8db255638015902c7439b1982643fe)) * **role-matcher:** strip the "Member of Technical Staff" prefix before tokenizing ([#1933](https://github.com/santifer/career-ops/issues/1933)) ([a113766](https://github.com/santifer/career-ops/commit/a113766b7877ab1b2711348dec7802df30a865df)), closes [#1965](https://github.com/santifer/career-ops/issues/1965) * **role-matcher:** treat 'product' as a baseline token so PM sibling specialties stay distinct ([#2164](https://github.com/santifer/career-ops/issues/2164)) ([37c0e99](https://github.com/santifer/career-ops/commit/37c0e99978203027b43d129bda5786d31e485ce7)) * **salary-gap:** parse US ranges with the currency symbol on both bounds ([#2200](https://github.com/santifer/career-ops/issues/2200)) ([9d77fd4](https://github.com/santifer/career-ops/commit/9d77fd49e3ea185f352d29869a773b7263f5f059)), closes [#2190](https://github.com/santifer/career-ops/issues/2190) * **scan:** keep body consumption inside the fetch timeout window ([#2138](https://github.com/santifer/career-ops/issues/2138)) ([643478f](https://github.com/santifer/career-ops/commit/643478f39880b51f9eb1be22112e722fead5902b)), closes [#2136](https://github.com/santifer/career-ops/issues/2136) * **scan:** lowercase the path in normalizeUrlForDedup to catch cross-source duplicates ([#2089](https://github.com/santifer/career-ops/issues/2089)) ([9c05638](https://github.com/santifer/career-ops/commit/9c0563831cea28816a6aea9051768805483f9d8f)) * **scan:** recover Greenhouse office cities when location.name is a work model ([#2104](https://github.com/santifer/career-ops/issues/2104)) ([b24b99f](https://github.com/santifer/career-ops/commit/b24b99f1b46b3bffb8d42bcf52191a00f968acda)) * **scan:** word-boundary location keywords + URL location fallback ([#2087](https://github.com/santifer/career-ops/issues/2087)) ([8a1ba8a](https://github.com/santifer/career-ops/commit/8a1ba8accac0d5d1f6ef725780709fb205355240)) * **set-status:** fail closed when a lone company row contradicts --role ([#2108](https://github.com/santifer/career-ops/issues/2108)) ([c05ce51](https://github.com/santifer/career-ops/commit/c05ce51566e4a377810119be6eb83d87db967a7a)), closes [#2009](https://github.com/santifer/career-ops/issues/2009) * **skill:** routing drift + discoverable metadata across the agent surface ([8ac6261](https://github.com/santifer/career-ops/commit/8ac6261e6ce75700727bf830def1af2bc78b6249)) * **successfactors:** preserve brand path for multi-brand RMK tenants ([#2099](https://github.com/santifer/career-ops/issues/2099)) ([b623271](https://github.com/santifer/career-ops/commit/b62327145a789c966978f2e0a9ec03c1ca431af6)), closes [#2010](https://github.com/santifer/career-ops/issues/2010) * sync the PDF and scan summary output ([#2213](https://github.com/santifer/career-ops/issues/2213)) ([c47094b](https://github.com/santifer/career-ops/commit/c47094bfe50004c34657b202417d02b2915ba191)) * **test:** make the SYSTEM_PATHS coverage guard actually run in CI ([#2240](https://github.com/santifer/career-ops/issues/2240)) ([b2f3fda](https://github.com/santifer/career-ops/commit/b2f3fda4493677918bb44abee7b15706518c0d37)) * **tracker:** set SQLite busy_timeout to avoid SQLITE_BUSY under concurrent access ([#2206](https://github.com/santifer/career-ops/issues/2206)) ([696a3a8](https://github.com/santifer/career-ops/commit/696a3a85108039527d746b326c752d816b49a4a7)), closes [#1957](https://github.com/santifer/career-ops/issues/1957) * **tracker:** sync the PDF column from data/pdf-index.tsv ([#1969](https://github.com/santifer/career-ops/issues/1969)) ([85a894c](https://github.com/santifer/career-ops/commit/85a894c2555090c480067e0c819b53234f5ced3f)), closes [#1429](https://github.com/santifer/career-ops/issues/1429) * **update-system:** rollback removes additions left behind under a directory pathspec ([#2110](https://github.com/santifer/career-ops/issues/2110)) ([fc0cf74](https://github.com/santifer/career-ops/commit/fc0cf74c59846282205f173f7c288f193ad81507)), closes [#2015](https://github.com/santifer/career-ops/issues/2015) * **update-system:** verify the target manifest materialized instead of reporting success ([#2111](https://github.com/santifer/career-ops/issues/2111)) ([e1fd205](https://github.com/santifer/career-ops/commit/e1fd205bd8916ccc0e1060017259405c63af9ad3)), closes [#1998](https://github.com/santifer/career-ops/issues/1998) * **verify-cv-facts:** detect metric claims the pattern was silently missing ([1bf9148](https://github.com/santifer/career-ops/commit/1bf9148190978327daf97f6abbeffe74cec6d4ea)) * **web:** resolve nested postcss and sharp advisories via overrides ([#2216](https://github.com/santifer/career-ops/issues/2216)) ([ec02af8](https://github.com/santifer/career-ops/commit/ec02af816abc81b500475f81bf1c2753727a1e79)) ### Performance Improvements * **scan:** cache DNS lookups in-process to stop resolver floods ([#2155](https://github.com/santifer/career-ops/issues/2155)) ([bd7d1a8](https://github.com/santifer/career-ops/commit/bd7d1a80dc437f80e112f41a427c244d5edf8a90)), closes [#2154](https://github.com/santifer/career-ops/issues/2154) ## [1.22.0](https://github.com/santifer/career-ops/compare/career-ops-v1.21.0...career-ops-v1.22.0) (2026-07-21) ### Features * **cv:** Chinese minimal CV template ([#1990](https://github.com/santifer/career-ops/issues/1990)) ([7cefd61](https://github.com/santifer/career-ops/commit/7cefd616da4700984982b325d9fa817cf5c1eee9)) * **cv:** improve profile-photo configuration and preview ([#1991](https://github.com/santifer/career-ops/issues/1991)) ([7e90f46](https://github.com/santifer/career-ops/commit/7e90f46c1ce9cbb1bdcf679d6d5b249c0f3eaaa0)) * **expand:** add /expand mode to discover missing CV competencies ([#1533](https://github.com/santifer/career-ops/issues/1533)) ([1ea5ee6](https://github.com/santifer/career-ops/commit/1ea5ee6379a90dfb1bec17b01aa538a624953848)), closes [#1521](https://github.com/santifer/career-ops/issues/1521) * **gemini-eval:** static prefix as systemInstruction for implicit caching ([#1840](https://github.com/santifer/career-ops/issues/1840)) ([bb748d8](https://github.com/santifer/career-ops/commit/bb748d8c6064127ca4ce23b55d59f58984fac2d2)) * **i18n:** Simplified Chinese interview modes (plan/practice/debrief) ([#1977](https://github.com/santifer/career-ops/issues/1977)) ([1634f01](https://github.com/santifer/career-ops/commit/1634f0163a666da438c0b828b7efbbca38d3a3b5)) * **oferta:** Block G signal 9 — third-party platform location tag mismatch ([#1938](https://github.com/santifer/career-ops/issues/1938)) ([add8497](https://github.com/santifer/career-ops/commit/add849703ec66fc64633c519c3e1fc46f93b7386)) * **openai-eval:** host-gated prompt-cache breakpoint for the static prefix ([#1839](https://github.com/santifer/career-ops/issues/1839)) ([4aad129](https://github.com/santifer/career-ops/commit/4aad1292b7767ce2ce10c749b7368d7f1181d394)) * **pdf:** first-class zh-CN typography support ([#1989](https://github.com/santifer/career-ops/issues/1989)) ([ed487f2](https://github.com/santifer/career-ops/commit/ed487f280fbd6dfd6c1cfefe3d80fa5e4cebf28b)) * **pdf:** warn on rendered page overflow, --strict-pages opt-in hard limit ([#1797](https://github.com/santifer/career-ops/issues/1797)) ([f630914](https://github.com/santifer/career-ops/commit/f630914e8b557f1385fb7c98bdc3442b93c058df)) * **pipeline:** per-step token breakdown at end of run ([#2022](https://github.com/santifer/career-ops/issues/2022)) ([8fca469](https://github.com/santifer/career-ops/commit/8fca469745aa99f77da6cc8b64f8f6cf0eb9565d)) * **providers:** add Alibaba Group careers provider ([#2055](https://github.com/santifer/career-ops/issues/2055)) ([cc2e567](https://github.com/santifer/career-ops/commit/cc2e567c3ccff885e24a462d1b1074819b3f7d63)) * **providers:** add Gem scanner provider ([#2024](https://github.com/santifer/career-ops/issues/2024)) ([6579bdf](https://github.com/santifer/career-ops/commit/6579bdfa9ec24c3d038ce283ab7ca25950facd3a)) * **providers:** add Jobvite zero-auth provider ([#1572](https://github.com/santifer/career-ops/issues/1572)) ([be07d6b](https://github.com/santifer/career-ops/commit/be07d6b8c903225e652ba0436f6f1fd24a2904e7)) * **providers:** add Welcome to the Jungle and Agentic Engineering Jobs providers ([#1808](https://github.com/santifer/career-ops/issues/1808)) ([e0a8dc7](https://github.com/santifer/career-ops/commit/e0a8dc73a2f882fd3b078ea24beb2df3927e2860)) * **scan:** --posted-after/--posted-before absolute posting-date filters ([#2067](https://github.com/santifer/career-ops/issues/2067)) ([e8ba1a4](https://github.com/santifer/career-ops/commit/e8ba1a42beec3a638f34a862d238f5e42174dcb1)) * **scan:** add visa_filter for surfacing visa-sponsoring roles ([#1662](https://github.com/santifer/career-ops/issues/1662)) ([995c1dd](https://github.com/santifer/career-ops/commit/995c1ddab6eb1b3aba2fb7ef3e41ff2eb601cc6b)), closes [#2057](https://github.com/santifer/career-ops/issues/2057) ### Bug Fixes * **arbeitsagentur:** only tag nationwide-remote when homeofficetyp is VOLLSTAENDIG ([#1981](https://github.com/santifer/career-ops/issues/1981)) ([b3b466c](https://github.com/santifer/career-ops/commit/b3b466ca69ca8bb6eb9d7e6484ed340faa10a607)) * drop stale plugins-registry.json from updater path manifests ([#2070](https://github.com/santifer/career-ops/issues/2070)) ([44bf9f6](https://github.com/santifer/career-ops/commit/44bf9f68159fadabb871ce00b2c5e5bafb6918ab)) * honor output language in headless evaluators ([#1916](https://github.com/santifer/career-ops/issues/1916)) ([c2384cd](https://github.com/santifer/career-ops/commit/c2384cdd17335c6bfec9b19ce655ea9cfe784c18)) * **ollama-eval:** move temperature into options where Ollama reads it ([#1842](https://github.com/santifer/career-ops/issues/1842)) ([77864e5](https://github.com/santifer/career-ops/commit/77864e537cdc7f08c6b888e13916e4c215529d84)) * **pdf:** drop empty Education section instead of rendering a bare header ([#2063](https://github.com/santifer/career-ops/issues/2063)) ([46d1585](https://github.com/santifer/career-ops/commit/46d15851a868d8b89c90437f7f8ed4cdf0029883)) * **pdf:** harden optional-section boundaries, extract shared cv-sections-core ([#2072](https://github.com/santifer/career-ops/issues/2072)) ([90c1ed4](https://github.com/santifer/career-ops/commit/90c1ed4c281cb30f2d49a31889984b730762100f)) * **pipeline:** recognize [#1799](https://github.com/santifer/career-ops/issues/1799) score sentinels in verify-pipeline ([#2069](https://github.com/santifer/career-ops/issues/2069)) ([df26599](https://github.com/santifer/career-ops/commit/df2659949fda33f71cceded4782cb592e93f7edd)) * **providers:** build public SmartRecruiters URLs without /postings/ ([#2047](https://github.com/santifer/career-ops/issues/2047)) ([4624242](https://github.com/santifer/career-ops/commit/4624242367056d7c118249279c80b8bb8da62b04)) * **scan-ats-full:** wire content_filter into reverse scans ([#1848](https://github.com/santifer/career-ops/issues/1848)) ([f710ce9](https://github.com/santifer/career-ops/commit/f710ce992758cb6d3644565e818cb6920fdc1cb2)) * **scan:** hide unconfigured salary/content filter summaries ([#1947](https://github.com/santifer/career-ops/issues/1947)) ([b5659a1](https://github.com/santifer/career-ops/commit/b5659a1754c1f90c0e1eaadae3ec08fd8c54000a)) * **scan:** normalize cosmetic URL variants for dedup ([#2079](https://github.com/santifer/career-ops/issues/2079)) ([9ba7f2e](https://github.com/santifer/career-ops/commit/9ba7f2e0fce55ef6c5c63810162413edf185bee5)) * **scan:** seed the company+role dedupe key from all three seen-sources ([#2080](https://github.com/santifer/career-ops/issues/2080)) ([9c2b426](https://github.com/santifer/career-ops/commit/9c2b426d7473b49c7f9562413f9c3c75b675a06e)) * serialize all tracker writers through the shared lock ([#1912](https://github.com/santifer/career-ops/issues/1912)) ([a953da2](https://github.com/santifer/career-ops/commit/a953da2ade0c2585c80832ef77d4fe718ef69afa)) * **test:** keep discovered suites from terminating the run mid-suite ([32dcee0](https://github.com/santifer/career-ops/commit/32dcee07472795cc94258753411861ca0365e322)) * **tracker:** recognize the Hired canonical status in merge-tracker and stats ([#2050](https://github.com/santifer/career-ops/issues/2050)) ([feabcb4](https://github.com/santifer/career-ops/commit/feabcb45003875c6f0bbd1e3e88676a539744e8d)) * **verify-cv-facts:** stop a bare '<' from swallowing source evidence ([#1995](https://github.com/santifer/career-ops/issues/1995)) ([050828b](https://github.com/santifer/career-ops/commit/050828b339f27cc398bf335d6f1c2b8ff2712145)) ## [1.21.0](https://github.com/santifer/career-ops/compare/career-ops-v1.20.0...career-ops-v1.21.0) (2026-07-17) ### Features * **apply:** warn before reapplying to a repeat company ([#1921](https://github.com/santifer/career-ops/issues/1921)) ([6cdca85](https://github.com/santifer/career-ops/commit/6cdca856bfeb6017abbb826afeb0f7282d9dc6f9)), closes [#1920](https://github.com/santifer/career-ops/issues/1920) * **cover-letter:** support --format and --report CLI arguments ([#1830](https://github.com/santifer/career-ops/issues/1830)) ([88c75cf](https://github.com/santifer/career-ops/commit/88c75cf47a35ea9c41ed803d89f1d288989f2699)), closes [#1828](https://github.com/santifer/career-ops/issues/1828) * **dashboard:** manifesto shortcut, help entry and footer link ([64e81de](https://github.com/santifer/career-ops/commit/64e81dee1ee0be48475d32248b26d928089f5d50)) * **email:** add confirmed-time no-show follow-up variant ([#1860](https://github.com/santifer/career-ops/issues/1860)) ([c77d138](https://github.com/santifer/career-ops/commit/c77d138faf84e22422d8cb80195d8b4f524eff23)), closes [#1859](https://github.com/santifer/career-ops/issues/1859) * **interview-prep:** cross-reference coffee chat notes against interview intel ([#1941](https://github.com/santifer/career-ops/issues/1941)) ([2692051](https://github.com/santifer/career-ops/commit/269205162c4af846ca216b611b32d71ff920e012)), closes [#1940](https://github.com/santifer/career-ops/issues/1940) * **interview-redflag:** flag scope/compensation mismatch as a separate fifth dimension ([#1943](https://github.com/santifer/career-ops/issues/1943)) ([ea57b82](https://github.com/santifer/career-ops/commit/ea57b82652cd7b261935f80001c80b3984843e0f)), closes [#1942](https://github.com/santifer/career-ops/issues/1942) * **interview-redflag:** suggest a ready-to-copy blacklist row at Reconsider level ([#1856](https://github.com/santifer/career-ops/issues/1856)) ([b645e69](https://github.com/santifer/career-ops/commit/b645e69ab96af5fe5483938da390108bfd816070)), closes [#1854](https://github.com/santifer/career-ops/issues/1854) * **interview/plan:** wire the existing Panel Intel table into multi-panelist rounds ([#1858](https://github.com/santifer/career-ops/issues/1858)) ([a8ceed2](https://github.com/santifer/career-ops/commit/a8ceed2b79c102cc33c0309f7201b385ec8ab091)), closes [#1857](https://github.com/santifer/career-ops/issues/1857) * **ledger:** immutable n: ordinal per signature + first-contribution question for new signers ([8ec80b5](https://github.com/santifer/career-ops/commit/8ec80b50d87c0ed3f145a74d62ce7f6771d929d1)) * **liveness:** add Workday to the zero-token ATS liveness API rung ([#1928](https://github.com/santifer/career-ops/issues/1928)) ([f6afdf9](https://github.com/santifer/career-ops/commit/f6afdf97c745de3fe9b6bdc3bb3198a6f412f3b0)) * **oferta:** Block G signal for benefits terminology country mismatch ([#1936](https://github.com/santifer/career-ops/issues/1936)) ([3f0985d](https://github.com/santifer/career-ops/commit/3f0985d3eaea97d6c3d6bc1468e092bcb0bc4ec3)), closes [#1935](https://github.com/santifer/career-ops/issues/1935) * **onboarding:** route to the manifesto from the README and the first successful scan ([e3a82e0](https://github.com/santifer/career-ops/commit/e3a82e07dff4955d23dd97ea61aeccfc10810a9c)) * **pdf:** add role name to the tailored PDF filename for multi-role tracking ([#1890](https://github.com/santifer/career-ops/issues/1890)) ([e878096](https://github.com/santifer/career-ops/commit/e8780965d93f4d699d79b8d86d8e0c1f68f66437)) * **providers:** add Oracle Recruiting Cloud zero-auth provider ([#1929](https://github.com/santifer/career-ops/issues/1929)) ([52db048](https://github.com/santifer/career-ops/commit/52db0484b7a506173b055bf23edcba4593233bb9)) * **reports:** unified Risk Summary block joining the five company-risk signals ([#1738](https://github.com/santifer/career-ops/issues/1738)) ([f0c742a](https://github.com/santifer/career-ops/commit/f0c742a835dd03411b193d28540a3dd300cb2dc0)), closes [#1737](https://github.com/santifer/career-ops/issues/1737) * **salary-gap:** track compensation figures stated per interview round ([#1853](https://github.com/santifer/career-ops/issues/1853)) ([8308cd1](https://github.com/santifer/career-ops/commit/8308cd1bbdf2231c743085062e049f0c751c1727)), closes [#1852](https://github.com/santifer/career-ops/issues/1852) * **scan:** persist and surface the scanner trust signal to pipeline and history ([#1765](https://github.com/santifer/career-ops/issues/1765)) ([16c8497](https://github.com/santifer/career-ops/commit/16c84976b1d39187edd22f6610c48049d00c79d6)), closes [#1743](https://github.com/santifer/career-ops/issues/1743) * **scan:** track portal health over time and surface coverage decay ([#1768](https://github.com/santifer/career-ops/issues/1768)) ([9bc82e2](https://github.com/santifer/career-ops/commit/9bc82e28620d1db6702b075f651a4ff991208bed)), closes [#1744](https://github.com/santifer/career-ops/issues/1744) ### Bug Fixes * **cv-template:** keep role header with its bullets when a location line is present ([#1903](https://github.com/santifer/career-ops/issues/1903)) ([66b1024](https://github.com/santifer/career-ops/commit/66b102490943d93ed3afd384b6fbc1e47c5d7d48)) * **doctor:** warn when Node is below 22.5 instead of passing silently ([#1831](https://github.com/santifer/career-ops/issues/1831)) ([30e470d](https://github.com/santifer/career-ops/commit/30e470dea58f06e077d920c0cf1f70f24f74bbbc)), closes [#1829](https://github.com/santifer/career-ops/issues/1829) * **envrc:** only load the Nix flake when Nix is installed ([#1863](https://github.com/santifer/career-ops/issues/1863)) ([ca23af6](https://github.com/santifer/career-ops/commit/ca23af67b40d83bac3f705467f1fb322a7cefe54)) * **interview-redflag:** drop GitHub PR references from candidate-facing output templates ([aa35162](https://github.com/santifer/career-ops/commit/aa35162f47b09f92e892cb0d6aa9c59dffb8673b)) * **ledger-bot:** make the first-contribution confirmation copy match what ships ([89e1741](https://github.com/santifer/career-ops/commit/89e17418bcf8d177f27a768c5282f0ecdb81cd85)) * **ledger-bot:** restore the 'done' confirmation now that the certificate render is live ([9c033d2](https://github.com/santifer/career-ops/commit/9c033d20f319b412e879539cee4aef864582084a)) * **onboarding:** relay the manifesto note in agent-mediated updates ([0a3abed](https://github.com/santifer/career-ops/commit/0a3abeddfa66ceb2f3e63f5f951fbbcb85481a4b)) * **pdf:** drop empty Projects section instead of rendering a bare header ([#1879](https://github.com/santifer/career-ops/issues/1879)) ([a64d590](https://github.com/santifer/career-ops/commit/a64d59063d234ed65175491da37f83a47f0a35b4)) * **role-matcher:** keep base titles distinct from specialized-suffix siblings ([#1922](https://github.com/santifer/career-ops/issues/1922)) ([723f727](https://github.com/santifer/career-ops/commit/723f727f739e56fe8ad147c124f01851d1649f4d)), closes [#1881](https://github.com/santifer/career-ops/issues/1881) * **scan-ats-full:** respect data/blacklist.md ([#1914](https://github.com/santifer/career-ops/issues/1914)) ([6512870](https://github.com/santifer/career-ops/commit/65128701a062d30c7754405c687eef4a710a49c8)), closes [#1911](https://github.com/santifer/career-ops/issues/1911) * **scan:** quiet dotenv so --json stdout stays parseable ([#1907](https://github.com/santifer/career-ops/issues/1907)) ([2e0b29e](https://github.com/santifer/career-ops/commit/2e0b29ebd1a8a2e67c249c65aa132749c99098f9)), closes [#1906](https://github.com/santifer/career-ops/issues/1906) * unify atomic report number allocation ([#1910](https://github.com/santifer/career-ops/issues/1910)) ([3b265cb](https://github.com/santifer/career-ops/commit/3b265cb765ed7f85aded5ef2daa30ffec0bf42f3)), closes [#1733](https://github.com/santifer/career-ops/issues/1733) [#1801](https://github.com/santifer/career-ops/issues/1801) [#1835](https://github.com/santifer/career-ops/issues/1835) [#1895](https://github.com/santifer/career-ops/issues/1895) * **update-system:** attribute the post-update manifesto link (utm_source=updater) ([a363ec4](https://github.com/santifer/career-ops/commit/a363ec45ec2fd101d80ca9cf5ba2f882f65cb029)) * **update-system:** surface commit failures instead of silently swallowing them ([#1855](https://github.com/santifer/career-ops/issues/1855)) ([2ad3453](https://github.com/santifer/career-ops/commit/2ad3453980d49a44ce10470b21cd2434db9701fa)), closes [#1844](https://github.com/santifer/career-ops/issues/1844) * **upskill:** keep fetched JD text as a string in the targeted --url-text path ([#1917](https://github.com/santifer/career-ops/issues/1917)) ([c7e9ff5](https://github.com/santifer/career-ops/commit/c7e9ff5993026131c67fa69077f0b54c293bb059)), closes [#1894](https://github.com/santifer/career-ops/issues/1894) ## [1.20.0](https://github.com/santifer/career-ops/compare/career-ops-v1.19.0...career-ops-v1.20.0) (2026-07-14) ### Features * **onboarding:** surface the CareerOps Manifesto after updates and setup ([84f2e53](https://github.com/santifer/career-ops/commit/84f2e534dfba7ac3831f0fda670bc6c3eaced788)) ### Bug Fixes * **upskill:** correct inverted known-skill suppression in targeted mode ([#1851](https://github.com/santifer/career-ops/issues/1851)) ([4d95d70](https://github.com/santifer/career-ops/commit/4d95d70704762dabcc540fe1f0b93cc9a2d78c41)) ## [1.19.0](https://github.com/santifer/career-ops/compare/career-ops-v1.18.0...career-ops-v1.19.0) (2026-07-13) ### Features * **batch:** apply compensation reliability checks to batch workers ([#1588](https://github.com/santifer/career-ops/issues/1588)) ([d6cbb2a](https://github.com/santifer/career-ops/commit/d6cbb2a126ef3e9361cb8ff331413df7db8ebd58)) * **browser-extract:** configurable jd-mode text cap via --max-chars ([#1810](https://github.com/santifer/career-ops/issues/1810)) ([7b13dc9](https://github.com/santifer/career-ops/commit/7b13dc9fc0fa5aaf5e8086fa38fd72c629fde080)) * **calibration:** funnel-velocity.mjs — own funnel vs market benchmarks ([#1693](https://github.com/santifer/career-ops/issues/1693), part 1) ([#1694](https://github.com/santifer/career-ops/issues/1694)) ([ff6a022](https://github.com/santifer/career-ops/commit/ff6a02258a25a8b7f6105a5c2104f9baf6acdf70)) * **cv:** fact validator — block invented metrics in generated CVs ([#682](https://github.com/santifer/career-ops/issues/682)) ([b9decee](https://github.com/santifer/career-ops/commit/b9decee90eb00140b89912681deb34d7ecf48f94)) * **dashboard:** add Spanish (es) locale to the i18n catalog ([#1783](https://github.com/santifer/career-ops/issues/1783)) ([2ddb9ce](https://github.com/santifer/career-ops/commit/2ddb9ce548667a0a8adb68e2bdac098d3b3310ff)), closes [#1764](https://github.com/santifer/career-ops/issues/1764) * **dashboard:** discard reason picker with learning loop ([#1465](https://github.com/santifer/career-ops/issues/1465)) ([7845b11](https://github.com/santifer/career-ops/commit/7845b11efc8d3dc58f1978096e6d4cd7c1cbc650)), closes [#1380](https://github.com/santifer/career-ops/issues/1380) * **dashboard:** i18n extraction for the Go TUI (split from [#1666](https://github.com/santifer/career-ops/issues/1666)) ([#1672](https://github.com/santifer/career-ops/issues/1672)) ([3b5ef4f](https://github.com/santifer/career-ops/commit/3b5ef4f1052ae2029a2b3f0a024a57809ac36189)) * **email:** ATS-broken fallback scenario — recover a stuck application ([#1741](https://github.com/santifer/career-ops/issues/1741)) ([#1745](https://github.com/santifer/career-ops/issues/1745)) ([4caabf0](https://github.com/santifer/career-ops/commit/4caabf04cf68036039b2112177ca95a4e06aa6f9)) * **i18n:** add Traditional Chinese (zh-TW) modes ([#1371](https://github.com/santifer/career-ops/issues/1371)) ([#1760](https://github.com/santifer/career-ops/issues/1760)) ([d9c338d](https://github.com/santifer/career-ops/commit/d9c338db88b868bb63549f2c998ae2dbb5d71ad7)) * **i18n:** Chinese salary reliability checks — zh mirror of the compensation tiers ([#1589](https://github.com/santifer/career-ops/issues/1589)) ([5771478](https://github.com/santifer/career-ops/commit/5771478c808435fff1ec0666bc0245dc7213d162)) * **img-to-pdf:** convert a screenshot into a PDF for ATS uploads ([#1730](https://github.com/santifer/career-ops/issues/1730)) ([#1731](https://github.com/santifer/career-ops/issues/1731)) ([6b3b4e8](https://github.com/santifer/career-ops/commit/6b3b4e824c480e8d1e3204c4a5a34c75d114e9f0)) * **interview-prep:** URL entry path for a role that was never evaluated ([#1817](https://github.com/santifer/career-ops/issues/1817)) ([b9b54b8](https://github.com/santifer/career-ops/commit/b9b54b8205515e66a41dc3461381dc895f4d9b2f)), closes [#1816](https://github.com/santifer/career-ops/issues/1816) * **invite-match:** fuzzy-match interview-invite emails to tracker entries ([#1495](https://github.com/santifer/career-ops/issues/1495)) ([10de9d4](https://github.com/santifer/career-ops/commit/10de9d4ab48130d7c794028f00604ae8b9f56223)) * language.output preference — output language decoupled from market modes ([#1035](https://github.com/santifer/career-ops/issues/1035)) ([4f512fb](https://github.com/santifer/career-ops/commit/4f512fbdfa67057d7c06a37437a67f6f55428d45)) * **latex:** opt-in latex-tex in-place tailoring of user-owned .tex CVs ([#695](https://github.com/santifer/career-ops/issues/695)) ([d7128ad](https://github.com/santifer/career-ops/commit/d7128adfc877c39a82bc0f8edef83b4a5bc0bc0c)) * make CLAUDE.md a thin @AGENTS.md wrapper — single canonical agent spec ([#272](https://github.com/santifer/career-ops/issues/272)) ([09528a3](https://github.com/santifer/career-ops/commit/09528a34c46a9914a255489729bdc79b0940ae9b)) * **modes:** wire the opt-in CLI extractor into the oferta + auto-pipeline JD paths ([#1804](https://github.com/santifer/career-ops/issues/1804)) ([3cb7c5b](https://github.com/santifer/career-ops/commit/3cb7c5bdac2ada5ead4edb5bdadd1c2d769ac3f4)) * **oferta:** Block G signal 7 — AI-buzzword vs infrastructure mismatch ([#1683](https://github.com/santifer/career-ops/issues/1683)) ([#1685](https://github.com/santifer/career-ops/issues/1685)) ([7dda430](https://github.com/santifer/career-ops/commit/7dda4302bbadd376444734bed36925072d0c3b97)) * **oferta:** company-type + compensation-reliability tiers in evaluations ([#1587](https://github.com/santifer/career-ops/issues/1587)) ([160093c](https://github.com/santifer/career-ops/commit/160093cbcc4b44cc22af34160a17422bd58a88b5)) * **openrouter:** prompt-cache the static system prefix via cache_control ([#1766](https://github.com/santifer/career-ops/issues/1766)) ([4dacfc8](https://github.com/santifer/career-ops/commit/4dacfc8b172653ecd99ea2223489cdf0c09df192)) * **pdf:** deterministic HTML CV renderer to cut PDF-step token burn ([#557](https://github.com/santifer/career-ops/issues/557)) ([#1681](https://github.com/santifer/career-ops/issues/1681)) ([1e08297](https://github.com/santifer/career-ops/commit/1e082972be2368d61937a05c681f7f0737b91eb9)) * **pdf:** JD skill-gap checker before CV generation, zero-LLM ([#1559](https://github.com/santifer/career-ops/issues/1559)) ([8afdf0b](https://github.com/santifer/career-ops/commit/8afdf0be0e3d8fa3e0fb351750a34fb08fcf3e39)), closes [#1558](https://github.com/santifer/career-ops/issues/1558) * **pipeline:** openai-tailor.mjs — headless CV tailoring for the no-agent path ([#1669](https://github.com/santifer/career-ops/issues/1669)) ([#1671](https://github.com/santifer/career-ops/issues/1671)) ([4abce71](https://github.com/santifer/career-ops/commit/4abce712a3809aebabd30750d288c758dfad9d2b)) * **providers:** 4dayweek auto-detect with spoof-safe host matching ([#1657](https://github.com/santifer/career-ops/issues/1657) follow-up) ([333d620](https://github.com/santifer/career-ops/commit/333d6203f770efcd52c5a7cf05ce5d5cb0811337)) * **providers:** add LaraJobs zero-auth RSS provider ([0f046b5](https://github.com/santifer/career-ops/commit/0f046b5bd7f24a7ec13ba4a027183ca765d869ca)) * **providers:** add Meituan careers provider ([#1818](https://github.com/santifer/career-ops/issues/1818)) ([0f6b096](https://github.com/santifer/career-ops/commit/0f6b0966ab0f3fef22209513d1af3c949abdd787)) * **providers:** add Tencent careers zero-auth provider ([#230](https://github.com/santifer/career-ops/issues/230)) ([95ba35c](https://github.com/santifer/career-ops/commit/95ba35cfe3f7b6163959d21a493ba156bf524536)) * **registry:** register serper and theirstack provider plugins ([#1645](https://github.com/santifer/career-ops/issues/1645), [#1697](https://github.com/santifer/career-ops/issues/1697)) ([2958a2c](https://github.com/santifer/career-ops/commit/2958a2c4b8d3c851758728b6e17e5b739d077c09)) * **registry:** split plugins-registry.json into per-plugin files ([#1401](https://github.com/santifer/career-ops/issues/1401)) ([6d08316](https://github.com/santifer/career-ops/commit/6d08316722f96af88f74959992d8bbab8c1d4228)) * **reply-watch:** paste-reply.mjs manual input path for users without Gmail ([#1803](https://github.com/santifer/career-ops/issues/1803)) ([4f9e924](https://github.com/santifer/career-ops/commit/4f9e9244ef556286993d9ef6bc8c49cd59f98275)), closes [#1802](https://github.com/santifer/career-ops/issues/1802) * **scan:** data/blacklist.md — user-owned do-not-apply list ([#1742](https://github.com/santifer/career-ops/issues/1742)) ([#1748](https://github.com/santifer/career-ops/issues/1748)) ([9867d0e](https://github.com/santifer/career-ops/commit/9867d0e7fa33fce009511acebe526755e326c244)) * **scan:** opt-in max_posting_age_days freshness gate ([#1578](https://github.com/santifer/career-ops/issues/1578)) ([8b60a8c](https://github.com/santifer/career-ops/commit/8b60a8cfbe487ce0254432695bab1c2989041df9)) * **scan:** persist provider postedAt to pipeline and scan-history ([#1578](https://github.com/santifer/career-ops/issues/1578)) ([300b6cb](https://github.com/santifer/career-ops/commit/300b6cb613aff388eea632960c3d15110ee9411b)) * **scan:** suppress duplicate roles via company aliases ([#1750](https://github.com/santifer/career-ops/issues/1750)) ([b203ea4](https://github.com/santifer/career-ops/commit/b203ea4183d78b22ca57045a9f9f94d716ef6036)) * spend_tier config for model-agnostic model routing + batch pre-screen gate ([#1007](https://github.com/santifer/career-ops/issues/1007)) ([4dec7eb](https://github.com/santifer/career-ops/commit/4dec7eb2da549ad4712111eaece4719390efbe94)) * **templates:** config-selectable CV and cover-letter templates ([#1690](https://github.com/santifer/career-ops/issues/1690)) ([#1691](https://github.com/santifer/career-ops/issues/1691)) ([7576cfd](https://github.com/santifer/career-ops/commit/7576cfd8deb28eb0b7dd1a7c96cae8f44a91091d)) * **tracker:** assessment-log.mjs — skills-assessment events with staleness signal ([#1684](https://github.com/santifer/career-ops/issues/1684)) ([#1687](https://github.com/santifer/career-ops/issues/1687)) ([d1be88b](https://github.com/santifer/career-ops/commit/d1be88bb7b15839a4ee89841ee6ae582df7eb0ee)) * **tracker:** recognize "—"/"-" as valid score-cell N/A sentinels ([#1800](https://github.com/santifer/career-ops/issues/1800)) ([7280df2](https://github.com/santifer/career-ops/commit/7280df2b84e734a2080552d77d9d1afefe8b67cb)), closes [#1799](https://github.com/santifer/career-ops/issues/1799) * **upskill:** aggregate skill-gap analysis from tracked reports ([#1520](https://github.com/santifer/career-ops/issues/1520), phase 1) ([fd1f3c9](https://github.com/santifer/career-ops/commit/fd1f3c957b4ab138850c0ceccef7c4d3a9720093)) * **upskill:** targeted <URL> single-posting mode with SSRF-guarded fetch ([#1796](https://github.com/santifer/career-ops/issues/1796)) ([72e5983](https://github.com/santifer/career-ops/commit/72e59839f8cce573f41031f41499ed63104b1d57)), closes [#1739](https://github.com/santifer/career-ops/issues/1739) ### Bug Fixes * **analyzer:** resolve report paths relative to the tracker file ([#1679](https://github.com/santifer/career-ops/issues/1679)) ([568025c](https://github.com/santifer/career-ops/commit/568025c4677772b0882afbce3609c30ac1a3f7e8)) * **cover:** resolve the cover-letter template through the shared resolver ([#1777](https://github.com/santifer/career-ops/issues/1777)) ([7e1775c](https://github.com/santifer/career-ops/commit/7e1775c483c70da7dc4e63cd9e78cbb286d7c8cf)) * gitignore data/active-interviews.md (user interview data) ([267dfb7](https://github.com/santifer/career-ops/commit/267dfb7079877e2beb2a949eb7b404b7bd257332)) * ignore logo cache directory ([#1577](https://github.com/santifer/career-ops/issues/1577)) ([f51b948](https://github.com/santifer/career-ops/commit/f51b948fb9a7902d4da017840ea83e9dd1d21f6c)) * **liveness:** treat off-posting redirects as uncertain, not active ([c1cd458](https://github.com/santifer/career-ops/commit/c1cd4586606f67aa87f263ee21bc165443851bca)) * load profile and custom rules deterministically in all mode paths ([#1736](https://github.com/santifer/career-ops/issues/1736)) ([#1759](https://github.com/santifer/career-ops/issues/1759)) ([738a5c7](https://github.com/santifer/career-ops/commit/738a5c7969ffc51ec4546e0e8b33a9cbe6cf0fe0)) * **merge-tracker:** preserve empty interior cells in tracker-row parsing ([#1824](https://github.com/santifer/career-ops/issues/1824)) ([a477638](https://github.com/santifer/career-ops/commit/a477638b30a19d95a4a47db5938fb600fb0f75da)) * **pdf:** clean temporary HTML when browser launch fails ([#1786](https://github.com/santifer/career-ops/issues/1786)) ([2c17f04](https://github.com/santifer/career-ops/commit/2c17f04b842910725ae34ff93bdd62c7aeabd7d7)) * **pdf:** render markdown bold in CV summary as <strong> (ATS-safe) ([b12cf41](https://github.com/santifer/career-ops/commit/b12cf41016974d5edce45e346021b3b3861a7fde)) * **portals:** validator accepts provider-plugin ids like the runtime does ([#1756](https://github.com/santifer/career-ops/issues/1756)) ([eee7ec0](https://github.com/santifer/career-ops/commit/eee7ec0546e319ca93140608fc125669fbb737b2)) * **providers:** support explicit api: override for ashby/lever with host-pinned guards ([6e010fe](https://github.com/santifer/career-ops/commit/6e010fe9613ae16fa08b6a291473128c1097af2e)) * **reserve-report-num:** support report numbers past 999 ([#1785](https://github.com/santifer/career-ops/issues/1785)) ([e53b08e](https://github.com/santifer/career-ops/commit/e53b08e9ba7a48ed50da69bb58d7a463318821ea)) * **scan:** restore browser-like headers on Workday CXS requests ([#1813](https://github.com/santifer/career-ops/issues/1813)) ([14022de](https://github.com/santifer/career-ops/commit/14022de87cdfa858c137553e4cd1f8b61a02f755)), closes [#1811](https://github.com/santifer/career-ops/issues/1811) * **templates:** allowlist the template format to prevent path traversal ([#1776](https://github.com/santifer/career-ops/issues/1776)) ([54fc973](https://github.com/santifer/career-ops/commit/54fc9733ba167228460cc1d6b346e61b030ab08b)) * **test:** normalize CRLF at read time for doc assertions ([#1771](https://github.com/santifer/career-ops/issues/1771)) ([#1772](https://github.com/santifer/career-ops/issues/1772)) ([b7a1ea1](https://github.com/santifer/career-ops/commit/b7a1ea12f3c079b17dee61d9f77f47c36b462ed8)) * **tests:** close CodeQL command-injection findings in the test harness ([9cd6dbc](https://github.com/santifer/career-ops/commit/9cd6dbc0c0dc17361d0babdece2803979f183069)) * **tests:** skip web-reader tests when web/ is absent on core-only installs ([#1675](https://github.com/santifer/career-ops/issues/1675)) ([32dde78](https://github.com/santifer/career-ops/commit/32dde7849b117f2c7c37205327af313f31dc7a5c)) * **tracker:** detect and prevent duplicate tracker # numbers ([#1704](https://github.com/santifer/career-ops/issues/1704)) ([d9cc272](https://github.com/santifer/career-ops/commit/d9cc272c76f69cbf9708477dfadc813abc8d6e23)) * **update-system:** add .claude/hooks/ to USER_PATHS ([#1676](https://github.com/santifer/career-ops/issues/1676)) ([e9bacc4](https://github.com/santifer/career-ops/commit/e9bacc484185f56cec210ea821bf1774e989acea)) * **update-system:** keep the updater self-loading to survive old→new re-exec ([#1706](https://github.com/santifer/career-ops/issues/1706)) ([ce72879](https://github.com/santifer/career-ops/commit/ce7287960b3d16224f8af17ea2f5a5e5e7590543)) ## [1.18.0](https://github.com/santifer/career-ops/compare/career-ops-v1.17.0...career-ops-v1.18.0) (2026-07-07) ### Features * classify application replies and generate review digest ([#1620](https://github.com/santifer/career-ops/issues/1620)) ([f33f9e7](https://github.com/santifer/career-ops/commit/f33f9e74a5bffcefe7c1433730f1275f3d71060e)), closes [#1585](https://github.com/santifer/career-ops/issues/1585) * **dashboard:** Hired canonical status + job-landed celebration flow ([58736bc](https://github.com/santifer/career-ops/commit/58736bc9b2a643f25f72758bc10c4d7ca45be651)) * **i18n:** add German translations of interview modes ([#1610](https://github.com/santifer/career-ops/issues/1610)) ([a6b6180](https://github.com/santifer/career-ops/commit/a6b618012045fc543e3ced0db10bb1ad37cd75f9)) * **i18n:** add Hindi language support with dedicated modes and documentation ([7463d75](https://github.com/santifer/career-ops/commit/7463d75013149c745f204c21c7823ded4e3f416a)) * **i18n:** add Indonesian (id) modes ([#1474](https://github.com/santifer/career-ops/issues/1474)) ([6262d53](https://github.com/santifer/career-ops/commit/6262d532494e01964c99a30c8ea1347bcd9de730)) * **interview-prep:** structured Panel Intel table ([#1502](https://github.com/santifer/career-ops/issues/1502)) ([72b1d5e](https://github.com/santifer/career-ops/commit/72b1d5e8c442288b59c6455ce2eb25b99b283b4d)) * **interview:** company red-flag detector from transcript signal ([0f4f16f](https://github.com/santifer/career-ops/commit/0f4f16fafc941c0ed326a1344fb915eb649d83ed)) * match employer reply candidates to application tracker ([#1607](https://github.com/santifer/career-ops/issues/1607)) ([30df267](https://github.com/santifer/career-ops/commit/30df267615c205ee5e2506af15288009808a9205)), closes [#1584](https://github.com/santifer/career-ops/issues/1584) * **oferta:** employment classification risk signal in Block G ([#1631](https://github.com/santifer/career-ops/issues/1631)) ([1d084a2](https://github.com/santifer/career-ops/commit/1d084a2d6c813e7e51e7a9c8c0d5dfe21ef2d820)), closes [#1630](https://github.com/santifer/career-ops/issues/1630) * offer-prep mode — contract reading companion at Offer stage ([#1634](https://github.com/santifer/career-ops/issues/1634)) ([4490c4b](https://github.com/santifer/career-ops/commit/4490c4b0dda09638592a51c522fb7a6f1e3c9f22)), closes [#1608](https://github.com/santifer/career-ops/issues/1608) * **offer-prep:** negotiation reply-draft step — draft-only email from Items to raise ([0e79229](https://github.com/santifer/career-ops/commit/0e79229772a7a2bebf38f04179d4702642fa885f)) * **patterns:** per-agency advance-rate analysis from the Via channel ([b6ce551](https://github.com/santifer/career-ops/commit/b6ce551e4404f15b20404ecc642886cfe8a2c4c5)) * **pdf:** allow intentional CV section reordering via --allow-reorder ([1a615d9](https://github.com/santifer/career-ops/commit/1a615d9ced3a5ea23afe17ddef031d85861f8b3b)) * **providers:** add Lever EU instance (jobs.eu.lever.co) ([#1571](https://github.com/santifer/career-ops/issues/1571)) ([bd81e37](https://github.com/santifer/career-ops/commit/bd81e37181c0dab0a9d4c7e4c09a3e74997a7515)) * **providers:** Cornerstone OnDemand (csod) + Rheinmetall ([#1549](https://github.com/santifer/career-ops/issues/1549)) ([ffbbf41](https://github.com/santifer/career-ops/commit/ffbbf41fb35df1a7b97cdcffecc3438d5e64ec86)) * **providers:** EchoJobs zero-auth JSON aggregator provider ([#1655](https://github.com/santifer/career-ops/issues/1655)) ([9509882](https://github.com/santifer/career-ops/commit/95098823e1150af51e9811c796f5a43d8ad8f5a7)) * **providers:** Phenom People (phenom) + Radancy TalentBrew (radancy) ([#1554](https://github.com/santifer/career-ops/issues/1554)) ([e638fed](https://github.com/santifer/career-ops/commit/e638fed2c00ceef9475e79922ac85fed1302a0b7)) * **providers:** TKMS, Heckler & Koch, and Deutsche Bahn providers ([#1555](https://github.com/santifer/career-ops/issues/1555)) ([1422846](https://github.com/santifer/career-ops/commit/14228466983f11a19bef1d311e92dbd365b4f221)) * **registry:** add career-ops-plugin-markdown v0.1.0 ([708fa8b](https://github.com/santifer/career-ops/commit/708fa8b34069d30c74a7dc73b0e58cd4c9339eb7)) * **salary:** mode wiring — advertised_comp + observation appends ([f0414ec](https://github.com/santifer/career-ops/commit/f0414ec0f0e0ae2b86fa6a6e4bba602a721d1749)) * **salary:** salary-gap.mjs — append-only compensation observation analyzer ([8c6dcdd](https://github.com/santifer/career-ops/commit/8c6dcddaaa14f61308b21b04004d2523f7514357)) * **scan:** JD-content fingerprinting — flag agency+direct cross-listings ([#1601](https://github.com/santifer/career-ops/issues/1601)) ([52154fd](https://github.com/santifer/career-ops/commit/52154fd8544fcf949be7c430daa8def5c9319471)), closes [#1597](https://github.com/santifer/career-ops/issues/1597) * **scan:** opt-in CLI page extractor (browser-extract.mjs) ([557a97d](https://github.com/santifer/career-ops/commit/557a97d44d7b6574fab8c5b61f448caba8bc08e2)) * **scan:** persist per-run scan counters to data/scan-runs.tsv ([#1606](https://github.com/santifer/career-ops/issues/1606)) ([d0d9bd0](https://github.com/santifer/career-ops/commit/d0d9bd05d75e87d2ab21a6ca440cc4ddd92c919b)) * **scan:** scope content_filter per title-category via by_title_keyword ([9c5791b](https://github.com/santifer/career-ops/commit/9c5791bf934d8e909944f6b8e232fc8326954774)) * **scoring:** culture-screen dimension with structural capping ([dc2a8d8](https://github.com/santifer/career-ops/commit/dc2a8d86464bdc719c709f6e0ab5554d83993074)) * **stats:** lifetime pipeline stats aggregator ([#1605](https://github.com/santifer/career-ops/issues/1605)) ([1b23baa](https://github.com/santifer/career-ops/commit/1b23baa1159c01884a6dab54136031a1b5945097)) * titles mode — suggest adjacent job titles from the CV ([#1637](https://github.com/santifer/career-ops/issues/1637)) ([2d7bb04](https://github.com/santifer/career-ops/commit/2d7bb04247950ec4fbcf1f956895334b04daf349)), closes [#1632](https://github.com/santifer/career-ops/issues/1632) * **tracker:** set-status.mjs — canonical CLI for tracker status updates ([#1460](https://github.com/santifer/career-ops/issues/1460)) ([1750e4c](https://github.com/santifer/career-ops/commit/1750e4c2f26b92b4b7bfd9013c03198361a93b1e)), closes [#1428](https://github.com/santifer/career-ops/issues/1428) * **tracker:** Via channel — end employer vs recruiter/agency intermediary ([#1599](https://github.com/santifer/career-ops/issues/1599)) ([b66c0b4](https://github.com/santifer/career-ops/commit/b66c0b4a76e9f3738bbddac2ebeb612053e0a9cc)) ### Bug Fixes * **dashboard:** duplicate tracker headers resolve last-occurrence to match JS reader ([#1602](https://github.com/santifer/career-ops/issues/1602)) ([edbfd8d](https://github.com/santifer/career-ops/commit/edbfd8d4e4a395ced64fef13fea6d72c010dab08)) * **deps:** update npm dependencies ([#1593](https://github.com/santifer/career-ops/issues/1593)) ([253c571](https://github.com/santifer/career-ops/commit/253c5719df403cdaa493db27cdd17349f54f7889)) * **modes:** enforce modes/_custom.md overrides across mode files ([#1621](https://github.com/santifer/career-ops/issues/1621)) ([1d87f1e](https://github.com/santifer/career-ops/commit/1d87f1e208d3ca5e38d7afdd76b44d24b976597b)), closes [#1618](https://github.com/santifer/career-ops/issues/1618) * **modes:** wire modes/_custom.md into the read path — house rules were write-only ([76b45a8](https://github.com/santifer/career-ops/commit/76b45a8997135d8bfaf245876a987264d803b7cb)) * **pdf:** explain the agentic HTML flow in generate-pdf.mjs usage output ([7ae6eb0](https://github.com/santifer/career-ops/commit/7ae6eb0fba5702638518da7e141cdfbb68491582)) * prevent role-matcher from collapsing different seniorities ([#1622](https://github.com/santifer/career-ops/issues/1622)) ([dd45bcb](https://github.com/santifer/career-ops/commit/dd45bcbbdb425caa61183fe02336c51d440598b3)), closes [#1616](https://github.com/santifer/career-ops/issues/1616) * **scan-ats-full:** reject unrecognized CLI flags with usage help ([#1635](https://github.com/santifer/career-ops/issues/1635)) ([06fa92b](https://github.com/santifer/career-ops/commit/06fa92b021d9b790df1eb28df160daf7501c1493)) * **tracker:** retrofit remaining positional readers onto the shared header-aware parser ([#1598](https://github.com/santifer/career-ops/issues/1598)) ([369a5ff](https://github.com/santifer/career-ops/commit/369a5ffcf6623750fcbedbd16be7d3c1c84f1111)) * **update:** raise local git timeout default 30s -> 120s for cloud-evicted trees ([a7b5dfd](https://github.com/santifer/career-ops/commit/a7b5dfd8c8c42c00f73b1bfa1c51338880637bf8)) * **web:** 44px tap-targets at the component level ([#1629](https://github.com/santifer/career-ops/issues/1629)) ([388542f](https://github.com/santifer/career-ops/commit/388542f3c0a2f82eeac83be8db5b616c213225b9)) * **web:** contrast tokens — AA across both themes ([#1627](https://github.com/santifer/career-ops/issues/1627)) ([ee89bea](https://github.com/santifer/career-ops/commit/ee89bea997702d40d1cc01620f727bbb66146b9b)) * **web:** portals copy + analytics semantics ([#1628](https://github.com/santifer/career-ops/issues/1628)) ([f8daa19](https://github.com/santifer/career-ops/commit/f8daa19d8ea164dd2bbb63834f2d048a34ccaa63)) * **web:** ux-audit cleanup — CostBadge global CSS + last sub-44 stragglers ([#1648](https://github.com/santifer/career-ops/issues/1648)) ([786b960](https://github.com/santifer/career-ops/commit/786b960c2761e88a534886eafdc9d59f82aba56b)) ## [1.17.0](https://github.com/santifer/career-ops/compare/career-ops-v1.16.0...career-ops-v1.17.0) (2026-07-05) ### Features * add the opt-in experimental web UI surface (web/) — isolated versioning, CI and packaging ([432c3c5](https://github.com/santifer/career-ops/commit/432c3c523a13bf0a5053b5d1f3c28c17ef1296eb)) * **add:** /career-ops add — fetch a project/paper/role into cv.md and article-digest.md ([#1476](https://github.com/santifer/career-ops/issues/1476)) ([933c353](https://github.com/santifer/career-ops/commit/933c3536959f29534769fcb92af37c3a60551475)) * **agent-inbox:** queue requests for the next session ([#1472](https://github.com/santifer/career-ops/issues/1472)) ([182554d](https://github.com/santifer/career-ops/commit/182554d1401f0be91b8474df9918dfaf5491c684)) * **apply:** pre-scan forms for knock-out questions before drafting ([#1463](https://github.com/santifer/career-ops/issues/1463)) ([05a85b8](https://github.com/santifer/career-ops/commit/05a85b8bb1b32991a6bed16c19080e47f19a414b)) * **contacto:** short-greeting variant for chat-style outreach ([#1477](https://github.com/santifer/career-ops/issues/1477)) ([8cf19a7](https://github.com/santifer/career-ops/commit/8cf19a76ad381eeebfb7d35abd9d282006c24214)) * **email:** formal application email drafts — draft-only, never sends ([#1515](https://github.com/santifer/career-ops/issues/1515)) ([f7dfb88](https://github.com/santifer/career-ops/commit/f7dfb88f4d18a598db3d1d327648194d98807ef9)) * experimental local-first web UI (opt-in alpha) ([#1451](https://github.com/santifer/career-ops/issues/1451)) ([1791dc4](https://github.com/santifer/career-ops/commit/1791dc4e3a14aeb10decd852c927bb636aefe00d)) * **find:** resolve a company/role/number query to its full pipeline identity ([#1439](https://github.com/santifer/career-ops/issues/1439)) ([3fd0a06](https://github.com/santifer/career-ops/commit/3fd0a06c14481633d28db5a47f9c9317205e9a7d)) * **followup:** seed a pinned first follow-up when a row turns Applied ([#1468](https://github.com/santifer/career-ops/issues/1468)) ([ea6f608](https://github.com/santifer/career-ops/commit/ea6f6086696c68d5437cf6c5007c4a90b161b011)) * **i18n:** add Korean career-ops modes ([#1457](https://github.com/santifer/career-ops/issues/1457)) ([ced5f74](https://github.com/santifer/career-ops/commit/ced5f74b0eadde187e7de76e70f9ab1ce7918d64)) * **i18n:** translate interview modes to French ([#1526](https://github.com/santifer/career-ops/issues/1526)) ([53f77a0](https://github.com/santifer/career-ops/commit/53f77a09000c3437285a77d3ad86e5e1c619a596)), closes [#1489](https://github.com/santifer/career-ops/issues/1489) * **i18n:** translate interview modes to Spanish ([#1523](https://github.com/santifer/career-ops/issues/1523)) ([3657bf0](https://github.com/santifer/career-ops/commit/3657bf0e8eb0cb2dc922ad43a94c7365c54250dc)), closes [#1490](https://github.com/santifer/career-ops/issues/1490) * **oferta:** flag 'remote' location contradicted by JD-body signals ([#1459](https://github.com/santifer/career-ops/issues/1459)) ([74b8fcb](https://github.com/santifer/career-ops/commit/74b8fcb1d0bdf0ae6b8563ff805a7b814919b9c1)) * **patterns:** recruiting-process friction signal at company level ([#1467](https://github.com/santifer/career-ops/issues/1467)) ([dde05bc](https://github.com/santifer/career-ops/commit/dde05bc9427e0752723be0c07ae3621aa46ed67d)) * **patterns:** transcript-driven targeting correction (Step 1b) — closes [#960](https://github.com/santifer/career-ops/issues/960) ([#961](https://github.com/santifer/career-ops/issues/961)) ([ed497fb](https://github.com/santifer/career-ops/commit/ed497fb71d67bc1ad03c57d466e1463e205a4fc7)) * **pipeline:** optional per-offer note in the pipeline writer ([#1483](https://github.com/santifer/career-ops/issues/1483)) ([6435b1a](https://github.com/santifer/career-ops/commit/6435b1a4dc93a9d441df8768e481d878e3309ae3)) * **portals:** probe non-ATS boards through the provider layer ([#1529](https://github.com/santifer/career-ops/issues/1529)) ([ba83606](https://github.com/santifer/career-ops/commit/ba836064cea7a99873fc383b254c32a59d07f4dc)) * **profile:** candidate contact-channel preference for outreach CTAs ([#1557](https://github.com/santifer/career-ops/issues/1557)) ([03a17b5](https://github.com/santifer/career-ops/commit/03a17b5874578aab54e2ef9d36702e9c73ba6cf7)), closes [#1556](https://github.com/santifer/career-ops/issues/1556) * **providers:** add Get on Board (getonbrd) zero-auth provider ([#1442](https://github.com/santifer/career-ops/issues/1442)) ([c53a61c](https://github.com/santifer/career-ops/commit/c53a61c7998f7cdfbf59500deb27493ad3d4ce18)) * **providers:** Amazon (amazon.jobs) and Avature zero-token providers ([#1480](https://github.com/santifer/career-ops/issues/1480)) ([494e947](https://github.com/santifer/career-ops/commit/494e9476cf215e336c255ac5a06fab231a2b256a)) * **providers:** avature self-heals jobOffset→offset pagination ([#1547](https://github.com/santifer/career-ops/issues/1547)) ([7f1a171](https://github.com/santifer/career-ops/commit/7f1a171c23c8f57096223fdf8220e274f2f5c1bc)) * **providers:** beesite (milch & zucker) + softgarden providers ([#1551](https://github.com/santifer/career-ops/issues/1551)) ([220288e](https://github.com/santifer/career-ops/commit/220288e93753933ceafe12f7bcb71ae6788bdeb0)) * **providers:** Dassault Systèmes zero-token provider (Exalead XML) ([#1498](https://github.com/santifer/career-ops/issues/1498)) ([46c0e89](https://github.com/santifer/career-ops/commit/46c0e894daf93d3ac1c683f98fb3bd27e8b1da24)) * **providers:** honour api: on workday and smartrecruiters ([#1496](https://github.com/santifer/career-ops/issues/1496)) ([f77f846](https://github.com/santifer/career-ops/commit/f77f8465a5dc79faed00c6e9510eea3fba76a4ca)) * **providers:** SAP SuccessFactors (RMK) zero-token provider ([#1475](https://github.com/santifer/career-ops/issues/1475)) ([67253c4](https://github.com/santifer/career-ops/commit/67253c49638ef565a32a4aa9f98ef2c895adee5b)) * **providers:** SuccessFactors CSB strategy + bounded health-probe budget ([#1548](https://github.com/santifer/career-ops/issues/1548)) ([81ab0ed](https://github.com/santifer/career-ops/commit/81ab0ede1ac8592ced56b7904627f588092f837e)) * **registry:** add startup boards plugin ([#1413](https://github.com/santifer/career-ops/issues/1413)) ([f2e1d08](https://github.com/santifer/career-ops/commit/f2e1d080ca9eaa8022a53cc91eef313071892aa7)) * **reserve-report-num:** --count N contiguous range reservation ([#1454](https://github.com/santifer/career-ops/issues/1454)) ([a70dd61](https://github.com/santifer/career-ops/commit/a70dd61391d6ee4c7706b9d001dcd833b84547a9)) * **scan:** report unreachable boards with error classification + doctor sweep ([#1455](https://github.com/santifer/career-ops/issues/1455)) ([fd3635f](https://github.com/santifer/career-ops/commit/fd3635f67fc4a83be922306c7d18fb6fb74a296e)) * **verify:** detect duplicate and orphan reports ([#1425](https://github.com/santifer/career-ops/issues/1425)) ([#1441](https://github.com/santifer/career-ops/issues/1441)) ([5c42df3](https://github.com/santifer/career-ops/commit/5c42df3613c4839055a769f81be595677a973c74)) * **web:** Config microcopy humanized (P1.5) ([#1538](https://github.com/santifer/career-ops/issues/1538)) ([8ae3475](https://github.com/santifer/career-ops/commit/8ae347502b8380692a5f80f490bc59f20d1c8491)) * **web:** cost affordance — CostBadge muted (P1.6) ([#1536](https://github.com/santifer/career-ops/issues/1536)) ([b212bb3](https://github.com/santifer/career-ops/commit/b212bb3591de4c374347dec40fc400c4d6ab9bda)) * **web:** dedupe bug reports at write — stable fingerprint + click-gated similar-issue search ([#1473](https://github.com/santifer/career-ops/issues/1473)) ([e13a4f3](https://github.com/santifer/career-ops/commit/e13a4f37d6df9d21c0acca1d1716993df036e01d)) * **web:** empty-state free-scan button (P0.1) ([#1534](https://github.com/santifer/career-ops/issues/1534)) ([28f12e3](https://github.com/santifer/career-ops/commit/28f12e39e3e41104bb7a1f3650a0a508701f82fe)) * **web:** extract cleanChips to a tested module + tab/CR paste delimiter ([#1516](https://github.com/santifer/career-ops/issues/1516)) ([7e676f4](https://github.com/santifer/career-ops/commit/7e676f403e16c84231bb08669c79218615a88c83)) * **web:** inbox triage — Abundance → Triage → Shortlist → Opt-in Score ([#1569](https://github.com/santifer/career-ops/issues/1569)) ([f1e6cc0](https://github.com/santifer/career-ops/commit/f1e6cc0ef2dae1f134e9d6bbb152611107a36308)) * **web:** mobile tap-targets ≥44px + FAB clearance ([#1542](https://github.com/santifer/career-ops/issues/1542)) ([7f6fd1c](https://github.com/santifer/career-ops/commit/7f6fd1c8f34fd0137a995bd2bb4b1f295c8a9303)) * **web:** orange hierarchy — brand-soft Mark-applied + inbox cost legend (P1.4) ([#1537](https://github.com/santifer/career-ops/issues/1537)) ([85d8290](https://github.com/santifer/career-ops/commit/85d829018c7b7225a1bbd547c53b817fd165924d)) * **web:** report progressive disclosure (P0.3+P1.8) ([#1535](https://github.com/santifer/career-ops/issues/1535)) ([30fa1d1](https://github.com/santifer/career-ops/commit/30fa1d19d00bf9a269adcef6778c52a1627d668c)) * **web:** richer bug-report diagnostics — data-shape fingerprint, core version, API errors ([#1469](https://github.com/santifer/career-ops/issues/1469)) ([6a13d8a](https://github.com/santifer/career-ops/commit/6a13d8a7a5448c5f488cac1631a1da471c070335)) ### Bug Fixes * correctness sweep across tracker, providers, and eval reporting ([#1528](https://github.com/santifer/career-ops/issues/1528)) ([bd2a44f](https://github.com/santifer/career-ops/commit/bd2a44f4ee1ea6c6def70200d7750969e67ebadf)), closes [#1527](https://github.com/santifer/career-ops/issues/1527) * **dedup:** require exact company+role match so distinct same-company roles survive ([#1458](https://github.com/santifer/career-ops/issues/1458)) ([4f387f0](https://github.com/santifer/career-ops/commit/4f387f04e44253c43462c5083e298cfb09a3c844)) * **infra:** exempt web/ from the SYSTEM_PATHS coverage guard (isolation contract) ([8a23564](https://github.com/santifer/career-ops/commit/8a235649881dc5fa5f4511accf154355da155ade)) * **merge-tracker:** detect TSV score/status column order by header ([#1517](https://github.com/santifer/career-ops/issues/1517)) ([423fc1f](https://github.com/santifer/career-ops/commit/423fc1f45ed9e6a5b6e1ed623e14a67a028ccea7)), closes [#1427](https://github.com/santifer/career-ops/issues/1427) * **merge-tracker:** guard tier-3 fuzzy dedup with req/job number ([#1525](https://github.com/santifer/career-ops/issues/1525)) ([fdb4376](https://github.com/santifer/career-ops/commit/fdb4376f39051db7102bf48eb0ec8d73cafb7ef9)), closes [#1524](https://github.com/santifer/career-ops/issues/1524) * **onboarding:** auto-copy template seeds in doctor --json ([#782](https://github.com/santifer/career-ops/issues/782), [#1369](https://github.com/santifer/career-ops/issues/1369)) ([#1369](https://github.com/santifer/career-ops/issues/1369)) ([3c06b46](https://github.com/santifer/career-ops/commit/3c06b461903ce2d8c935862b433a1ff2b65039dc)) * **paths:** prefer cygpath over wslpath in toBashPath() ([#1503](https://github.com/santifer/career-ops/issues/1503)) ([b4f5a83](https://github.com/santifer/career-ops/commit/b4f5a83618de4ef90c26ea2130c0bb6dc44d2a85)) * **pdf:** use CSS [@page](https://github.com/page) setup for margins ([#1563](https://github.com/santifer/career-ops/issues/1563)) ([d057218](https://github.com/santifer/career-ops/commit/d057218e0aa1124002b38134e277e8c76e575b38)) * **plugins:** harden manifest path containment against symlink traversal ([#1532](https://github.com/santifer/career-ops/issues/1532)) ([9d0be62](https://github.com/santifer/career-ops/commit/9d0be62f20c45d3b4892a54f780f28a0baf399f0)) * prevent notion plugin from mangling slash-formatted scores ([#1414](https://github.com/santifer/career-ops/issues/1414)) ([#1417](https://github.com/santifer/career-ops/issues/1417)) ([6ea2e5f](https://github.com/santifer/career-ops/commit/6ea2e5f63a172d00e5e64712bc8fb72d6562b680)) * **providers:** avature parser tolerates two live tenant markup variants ([#1541](https://github.com/santifer/career-ops/issues/1541)) ([1f59f2b](https://github.com/santifer/career-ops/commit/1f59f2b6ade03883372e4acb011e8194e43e7a2a)) * **providers:** harden workday pagination against 429s, API caps, and dateless tenants ([#1419](https://github.com/santifer/career-ops/issues/1419)) ([13f80d5](https://github.com/santifer/career-ops/commit/13f80d5643f360b1702d40d449ca330a07752b0d)) * **providers:** update Glints API to v2-alc/searchJobsV3, document Jobstreet GraphQL migration ([#1173](https://github.com/santifer/career-ops/issues/1173)) ([cf863f7](https://github.com/santifer/career-ops/commit/cf863f721585bba32ee6409d708a59afe37b1631)) * **providers:** workday honors ctx.maxPages so the liveness probe stops cleanly ([#1553](https://github.com/santifer/career-ops/issues/1553)) ([39216f0](https://github.com/santifer/career-ops/commit/39216f0661b861d78c5d6700d864a0b9b83e6478)) * **scan:** load .env credentials via optional dotenv import ([#1507](https://github.com/santifer/career-ops/issues/1507)) ([5066b28](https://github.com/santifer/career-ops/commit/5066b284400cbc51b246eeff64c42af9f34e5c43)) * **update:** make updater timeout budgets configurable ([#1564](https://github.com/santifer/career-ops/issues/1564)) ([525c9c0](https://github.com/santifer/career-ops/commit/525c9c0cbc8b6ab5b23a0e612537c75cab83b114)) * **update:** preserve local CLAUDE.md additions during /career-ops update ([#1446](https://github.com/santifer/career-ops/issues/1446)) ([e5f5d25](https://github.com/santifer/career-ops/commit/e5f5d2517ef598350065af1d2475e08bb28c02da)) * **updater:** add .claude/settings.json to USER_PATHS ([#1471](https://github.com/santifer/career-ops/issues/1471)) ([aa8000d](https://github.com/santifer/career-ops/commit/aa8000d84c397145196f8f494beefe86777e1090)), closes [#1408](https://github.com/santifer/career-ops/issues/1408) * **web:** bump FOLLOW-UPS DUE tap-targets to 44px on mobile ([#1568](https://github.com/santifer/career-ops/issues/1568)) ([f5e8362](https://github.com/santifer/career-ops/commit/f5e836268c8a16707566becb51675d0b52a670dd)) * **web:** pin turbopack.root to prevent Windows postcss OOM ([#1530](https://github.com/santifer/career-ops/issues/1530)) ([8560153](https://github.com/santifer/career-ops/commit/8560153ad8aa37a3993418d32f951f25c868c6c4)) * **web:** point the 'Get one free' link at the free-AI-engine guide ([#1540](https://github.com/santifer/career-ops/issues/1540)) ([8369b40](https://github.com/santifer/career-ops/commit/8369b4001ba63be78818240b9dbc3aa94aebe2e8)) * **web:** restore the report-a-bug kit lost between the RC branch and main ([#1456](https://github.com/santifer/career-ops/issues/1456)) ([b11231f](https://github.com/santifer/career-ops/commit/b11231ffc77dfbd36b745b35df0b6ded3bb73720)) ## [1.16.0](https://github.com/santifer/career-ops/compare/career-ops-v1.15.0...career-ops-v1.16.0) (2026-07-02) ### Features * add interview skill modes — plan, practice, debrief ([#956](https://github.com/santifer/career-ops/issues/956)) ([e17a829](https://github.com/santifer/career-ops/commit/e17a829b0a69262fcf3eacab01791aadf1e42154)) * **apply:** ATS auto-fill for Greenhouse / Ashby / Lever — prepare, don't submit ([#1248](https://github.com/santifer/career-ops/issues/1248)) ([215e6d1](https://github.com/santifer/career-ops/commit/215e6d12f51e3f677c834ee81494320cf887a570)) * **discovery:** seed company universe from VC portfolios (YC / a16z)… ([#1375](https://github.com/santifer/career-ops/issues/1375)) ([9a816f5](https://github.com/santifer/career-ops/commit/9a816f5488e9bfbee616b51f7121441ed2be07c3)) * **patterns:** ATS channel yield analysis — algorithmic-monoculture aware ([#1405](https://github.com/santifer/career-ops/issues/1405)) ([c3b5d9a](https://github.com/santifer/career-ops/commit/c3b5d9a815fdd5831d77c07a0c5767f4ae123a0c)) * **plugins:** seed/successor model — community plugins can supersede a bundled reference ([fa61b0c](https://github.com/santifer/career-ops/commit/fa61b0cfcb84b16c01c07ea3ade0b03a0bae5061)) * **providers:** add HigherEdJobs RSS provider ([#1350](https://github.com/santifer/career-ops/issues/1350)) ([d280a7d](https://github.com/santifer/career-ops/commit/d280a7dee24e9225c03f30cd0f47b78c56a14e76)) * **providers:** add JibeApply provider ([#1400](https://github.com/santifer/career-ops/issues/1400)) ([311ed4a](https://github.com/santifer/career-ops/commit/311ed4a0319d8ad4e8437c5c906d4d97255317f1)) * **providers:** add NoDesk provider ([#1330](https://github.com/santifer/career-ops/issues/1330)) ([7fca4dd](https://github.com/santifer/career-ops/commit/7fca4dd264d6ddbc58978cb079c25d63119bf744)) * **providers:** add Teamtailor zero-auth RSS provider ([#1376](https://github.com/santifer/career-ops/issues/1376)) ([eea80e9](https://github.com/santifer/career-ops/commit/eea80e960a845645e7b68a5057227d26ff834713)) * **registry:** add career-ops-plugin-obsidian v0.1.0 ([#1399](https://github.com/santifer/career-ops/issues/1399)) ([1b26648](https://github.com/santifer/career-ops/commit/1b26648b148fd4efc345ad098c5f46d261e81d83)) * **registry:** add career-ops-plugin-tavily v0.1.0 ([#1348](https://github.com/santifer/career-ops/issues/1348)) ([b5aa464](https://github.com/santifer/career-ops/commit/b5aa464857ee141b03f376eb70c8614b2a24ca98)) * **registry:** add google-calendar plugin v0.1.0 ([#1347](https://github.com/santifer/career-ops/issues/1347)) ([1ebc81f](https://github.com/santifer/career-ops/commit/1ebc81fe17087efd4d318345b7b90d627e0b3c27)) * **scan:** add seniority-tier classifier with optional skip_tiers fi… ([#1361](https://github.com/santifer/career-ops/issues/1361)) ([db6cbce](https://github.com/santifer/career-ops/commit/db6cbce03e9290549488a801544ad4a74746c7b5)) ### Bug Fixes * **cv-template:** keep role titles from orphaning at page breaks ([#1366](https://github.com/santifer/career-ops/issues/1366)) ([cbde5c4](https://github.com/santifer/career-ops/commit/cbde5c4d5c5e6a0c420ad550bfadcdaf78a1e6ca)) * **dashboard:** map tracker columns by header name ([#1327](https://github.com/santifer/career-ops/issues/1327)) ([#1328](https://github.com/santifer/career-ops/issues/1328)) ([8257f69](https://github.com/santifer/career-ops/commit/8257f697ef0c0d5b9e0804344cb0275c80075059)) * **followup-cadence:** schedule first responded follow-up with responded_initial ([#1352](https://github.com/santifer/career-ops/issues/1352)) ([e30dd0b](https://github.com/santifer/career-ops/commit/e30dd0b3ec3a360dfa3d68f81f845c0269a8cf9a)) * **liveness:** add Ashby API rung so live jobs.ashbyhq.com postings aren't false-expired ([#1372](https://github.com/santifer/career-ops/issues/1372)) ([b7bc6f3](https://github.com/santifer/career-ops/commit/b7bc6f38497ff423de3865f6ad729b0f511a8adf)) * **pdf:** anchor the output path-traversal guard to the repo root, not cwd ([5ba3c83](https://github.com/santifer/career-ops/commit/5ba3c83)) * **pdf:** keep a right gutter so right-aligned CV content isn't clipped ([#1341](https://github.com/santifer/career-ops/issues/1341)) ([#1351](https://github.com/santifer/career-ops/issues/1351)) ([37c0703](https://github.com/santifer/career-ops/commit/37c07033de3cf872a9f40cc2ca33f400a1192db7)) * **pdf:** thread manifest metadata through render options ([#1367](https://github.com/santifer/career-ops/issues/1367)) ([c7e2439](https://github.com/santifer/career-ops/commit/c7e2439c1b7d2a031900404439dc2d27d93f1f88)) ## [1.15.0](https://github.com/santifer/career-ops/compare/career-ops-v1.14.0...career-ops-v1.15.0) (2026-06-29) ### Features * add opt-in plugin system (engine + supply-chain governance + registry) ([5ae518a](https://github.com/santifer/career-ops/commit/5ae518a371a62a7dac190d98ffd1685880b782f4)) * add optional profile photo support for resume template ([#264](https://github.com/santifer/career-ops/issues/264)) ([#1221](https://github.com/santifer/career-ops/issues/1221)) ([ec18624](https://github.com/santifer/career-ops/commit/ec18624ca6deb1defe205e8e3e7ea3c8107dabc6)) * **dashboard:** add cover letter hotkey to report viewer ([#994](https://github.com/santifer/career-ops/issues/994)) ([8a5cc51](https://github.com/santifer/career-ops/commit/8a5cc51d57bad926e97a4a4011ddd945ffbbfa51)) * **dashboard:** hotkeys to view (d) and regenerate (D) the CV PDF ([#797](https://github.com/santifer/career-ops/issues/797)) ([07e4014](https://github.com/santifer/career-ops/commit/07e4014b39006dce52d750d23110c3dcc18c717b)) * OpenRouter runner — free models, auto-blacklist, no Claude CLI required ([#53](https://github.com/santifer/career-ops/issues/53)) ([bf380c7](https://github.com/santifer/career-ops/commit/bf380c77c6fe74849482978c62b75db355c9b5f1)) * **providers:** add 4 Day Week provider (public zero-auth API) ([#1318](https://github.com/santifer/career-ops/issues/1318)) ([575da5f](https://github.com/santifer/career-ops/commit/575da5f2e99cf8ffd0ed74df229274a42679dd29)) * **providers:** add Arbeitnow provider ([#1301](https://github.com/santifer/career-ops/issues/1301)) ([c018bfa](https://github.com/santifer/career-ops/commit/c018bfac4810103ce4c59f07a7b4c0f98e21380a)) * **providers:** add Hacker News "Who is hiring?" provider (Algolia API) ([#1309](https://github.com/santifer/career-ops/issues/1309)) ([011aeb4](https://github.com/santifer/career-ops/commit/011aeb47b2089af91f23f02a7806018cdc3508fb)) * **providers:** add Himalayas provider ([#1249](https://github.com/santifer/career-ops/issues/1249)) ([1a6f13a](https://github.com/santifer/career-ops/commit/1a6f13a25db340ff5d29c516efb078cbe10ffac4)) * **providers:** add Jobicy provider ([#1260](https://github.com/santifer/career-ops/issues/1260)) ([5a5782e](https://github.com/santifer/career-ops/commit/5a5782ee68f77b9f5a41de79ff7de9acdf20bd65)) * **providers:** add Jobspresso provider ([#1320](https://github.com/santifer/career-ops/issues/1320)) ([dd06e76](https://github.com/santifer/career-ops/commit/dd06e76ffb37ca7d4bffa7ef2217b69bebff4781)) * **providers:** add Landing.jobs provider ([#1307](https://github.com/santifer/career-ops/issues/1307)) ([c60c1eb](https://github.com/santifer/career-ops/commit/c60c1eb824130d27c1fc82ce15b1435491dd480a)) * **providers:** add Pinpoint ATS provider ([#1287](https://github.com/santifer/career-ops/issues/1287)) ([38271b2](https://github.com/santifer/career-ops/commit/38271b2bc538c419c7b76ac120c8d291da57db5f)) * **providers:** add Rippling ATS provider ([#1303](https://github.com/santifer/career-ops/issues/1303)) ([922ec5f](https://github.com/santifer/career-ops/commit/922ec5fdd1fafcc59e91195723734a9c11ed272a)) * **providers:** add The Hub provider ([#1305](https://github.com/santifer/career-ops/issues/1305)) ([19f221f](https://github.com/santifer/career-ops/commit/19f221f60c7db881ba62fcd91127302b2844e9c7)) * **providers:** add The Muse provider ([#1283](https://github.com/santifer/career-ops/issues/1283)) ([e0db3d7](https://github.com/santifer/career-ops/commit/e0db3d74a98ab3d3a31123c6681329f8f72138c9)) * **scan:** add detect-reposts.mjs repost detection from scan-history.tsv ([#1212](https://github.com/santifer/career-ops/issues/1212)) ([112f632](https://github.com/santifer/career-ops/commit/112f6327cb08ce8461a5367be53a876968583df6)) * **scan:** add JustJoin and NoFluffJobs providers ([#989](https://github.com/santifer/career-ops/issues/989)) ([7d1ca07](https://github.com/santifer/career-ops/commit/7d1ca0750aabd8918a21bd4feebccec1e0389ee2)) * **scan:** persist compensation to pipeline.md ([#1017](https://github.com/santifer/career-ops/issues/1017)) ([8a4567d](https://github.com/santifer/career-ops/commit/8a4567d39d8d93c9854d4be24086d50b36a49de1)) * **scripts:** add build:dashboard and serve:dashboard npm scripts ([#796](https://github.com/santifer/career-ops/issues/796)) ([51f6ee4](https://github.com/santifer/career-ops/commit/51f6ee4fe8e7af146c361ff831549f67d9de5f46)) * **updater:** structural SYSTEM_PATHS coverage check ([#1190](https://github.com/santifer/career-ops/issues/1190)) ([cc44f78](https://github.com/santifer/career-ops/commit/cc44f781270685ab2dcb5b6ba17d88b645412f97)) ### Bug Fixes * **deps:** update dependency playwright to v1.61.1 ([#1296](https://github.com/santifer/career-ops/issues/1296)) ([88ebcf9](https://github.com/santifer/career-ops/commit/88ebcf99d891c1592da12ee8335a9a78148fbac3)) * **eval:** bound research budget to a single-pass query cap ([#1262](https://github.com/santifer/career-ops/issues/1262)) ([771577c](https://github.com/santifer/career-ops/commit/771577cf47ec89b8162da6d6f2ef8f17d2628b42)) * **scan:** tighter company matching and dedup order for cooldown filter ([#1201](https://github.com/santifer/career-ops/issues/1201)) ([7d76fc7](https://github.com/santifer/career-ops/commit/7d76fc7061841db9bcf58acf05c38aa489ffbf3e)) * **security:** harden batch tmpfile, PDF output path, and tracker cells ([#1315](https://github.com/santifer/career-ops/issues/1315)) ([ec3023b](https://github.com/santifer/career-ops/commit/ec3023b6ac9a47932d5e543edd176c72ecdf23f0)) * **tracker:** share header-name column mapping across all readers ([#1293](https://github.com/santifer/career-ops/issues/1293)) ([c54ba3b](https://github.com/santifer/career-ops/commit/c54ba3b5feff3627aec07434230f8434f7de6f3d)) ## [1.14.0](https://github.com/santifer/career-ops/compare/career-ops-v1.13.0...career-ops-v1.14.0) (2026-06-28) ### Features * add modes/_custom.md for user custom instructions ([#1198](https://github.com/santifer/career-ops/issues/1198)) ([3cc8844](https://github.com/santifer/career-ops/commit/3cc8844c51975e2bcd94cb9078bc734a75626c71)) * **apply:** ATS behavioural question matcher from story-bank.md ([#1228](https://github.com/santifer/career-ops/issues/1228)) ([9d79931](https://github.com/santifer/career-ops/commit/9d7993153ffa914f80c3f5198d2deec1f963e49f)) * **archive:** add archive-posting.mjs to save live job postings as PDF ([#697](https://github.com/santifer/career-ops/issues/697)) ([571b114](https://github.com/santifer/career-ops/commit/571b114bb56aedc5d32a4ecd9a5861854acd4ae0)) * **batch:** add --limit flag + budget guide ([0607ee5](https://github.com/santifer/career-ops/commit/0607ee57e176c93422732ee1ad1530cd606f70b6)) * **cli:** add first-class Codex support ([#1269](https://github.com/santifer/career-ops/issues/1269)) ([43a7d0e](https://github.com/santifer/career-ops/commit/43a7d0eb6d7c24232f47a482c7ea0178b00c824d)) * **cli:** add Grok Build CLI support ([0a89381](https://github.com/santifer/career-ops/commit/0a8938186ed8a4787a84b2e5bc1680a55aac59ca)) * **cli:** register Kimi as a supported CLI host ([#1193](https://github.com/santifer/career-ops/issues/1193)) ([d3d34f3](https://github.com/santifer/career-ops/commit/d3d34f38ecabd2fbbe4b387c53504577a6255b6f)) * **cv:** add opt-in profile photo for DACH/European CVs ([fcccd58](https://github.com/santifer/career-ops/commit/fcccd58abf4be7b2d620576ffe754861cab933d4)) * **eval:** add openai-eval.mjs for any OpenAI-compatible endpoint ([#1278](https://github.com/santifer/career-ops/issues/1278)) ([5838391](https://github.com/santifer/career-ops/commit/58383910c365e81f41deed34f6340636674d73f8)) * **modes:** add Danish (da) locale ([5407811](https://github.com/santifer/career-ops/commit/54078118a70fa6b42123a68450bb584206af8ac4)) * **modes:** add EU SWE application calibration mode ([f024317](https://github.com/santifer/career-ops/commit/f02431721ad1cbb7e49882b23ebb4dec00eaafff)) * **modes:** add recruiter-side application heuristics ([2ea0814](https://github.com/santifer/career-ops/commit/2ea0814b8436aeae76200a70d2df6be795e498e0)) * **ollama:** add local interactive Ollama evaluator ([#681](https://github.com/santifer/career-ops/issues/681)) ([1b44790](https://github.com/santifer/career-ops/commit/1b447901198fa4defba79062acc3ce1e219373f5)) * **providers:** add Comeet ATS provider ([#1222](https://github.com/santifer/career-ops/issues/1222)) ([f5af817](https://github.com/santifer/career-ops/commit/f5af81760436b38901ba4f1c090c1f077b90941e)) * **providers:** add Personio ATS provider ([#1223](https://github.com/santifer/career-ops/issues/1223)) ([f25570b](https://github.com/santifer/career-ops/commit/f25570b3a5ecbaa18adf6ef6579e167ed3b68294)) * **providers:** add WeWorkRemotely RSS provider ([#1243](https://github.com/santifer/career-ops/issues/1243)) ([39ea2d4](https://github.com/santifer/career-ops/commit/39ea2d4324b1279737f7640e9d0b447a2608e159)), closes [#1241](https://github.com/santifer/career-ops/issues/1241) * **scan:** add early trust validation and job trust metadata ([#985](https://github.com/santifer/career-ops/issues/985)) ([ef07461](https://github.com/santifer/career-ops/commit/ef07461a8d3c4b29418e39a450c0fae4450257f7)) * **scan:** preserve job location in pipeline.md ([#1015](https://github.com/santifer/career-ops/issues/1015)) ([7671517](https://github.com/santifer/career-ops/commit/76715172f3abc23c62af963977306f3ec721408e)) ### Bug Fixes * **batch:** single-worker lock fallback + exit-127 shim-swap retry ([#910](https://github.com/santifer/career-ops/issues/910)) ([9a6e2ce](https://github.com/santifer/career-ops/commit/9a6e2ce5eaaa841b6ffdeaa04af034e2ee063a0a)) * **modes:** bound subagent delegation to prevent research fan-out ([#1268](https://github.com/santifer/career-ops/issues/1268)) ([1cf34a9](https://github.com/santifer/career-ops/commit/1cf34a91f6840440de5d641805d118c4c65d29cc)), closes [#1235](https://github.com/santifer/career-ops/issues/1235) * **plugin:** drop non-schema skills/permissions keys from plugin.json ([5ff910c](https://github.com/santifer/career-ops/commit/5ff910c0014a9d0f6061b65acd2472d15a72487b)) * **scan:** trim title-filter keywords before the length check ([#1261](https://github.com/santifer/career-ops/issues/1261)) ([0842bbf](https://github.com/santifer/career-ops/commit/0842bbf2beb1a6601bbdf2e06bc9b0a5a77e5cb2)) * **template:** scope break-inside to atomic units to prevent CV pagination breaks ([7ef8182](https://github.com/santifer/career-ops/commit/7ef81821684b9959acc0f9e76bef2169ca5d6ec0)) * **updater:** resolve self-reexec checkout from the import closure ([#1267](https://github.com/santifer/career-ops/issues/1267)) ([0a830b5](https://github.com/santifer/career-ops/commit/0a830b5092076b2c7037e4d24ea2b86067b400a9)), closes [#1245](https://github.com/santifer/career-ops/issues/1245) ## [1.13.0](https://github.com/santifer/career-ops/compare/career-ops-v1.12.0...career-ops-v1.13.0) (2026-06-25) ### Features * **arbeitsagentur:** config-driven remoteMatch + server-side homeoffice filter ([#1189](https://github.com/santifer/career-ops/issues/1189)) ([a463308](https://github.com/santifer/career-ops/commit/a4633080f4444a06f4b01b875a79137b534115fc)) * **batch:** add --skip-pdf flag to batch-runner.sh ([#1182](https://github.com/santifer/career-ops/issues/1182)) ([256a289](https://github.com/santifer/career-ops/commit/256a289de8bac8ed134a556b62c8ef2bffc3d713)) * **dashboard:** add in-viewer status picker overlay ([#1195](https://github.com/santifer/career-ops/issues/1195)) ([cc53485](https://github.com/santifer/career-ops/commit/cc534858f5a52bfe0af50c1188c2665488b20c94)) * **dashboard:** customizable columns with column picker ([#979](https://github.com/santifer/career-ops/issues/979)) ([9d1404f](https://github.com/santifer/career-ops/commit/9d1404f32022b552e2dea1d773e0a10a22e2c004)) * **dashboard:** recognize EUR/GBP/CHF pay and international cities in pipeline derive ([#1157](https://github.com/santifer/career-ops/issues/1157)) ([a1c7ce2](https://github.com/santifer/career-ops/commit/a1c7ce296afc0ab2657caefb63323ef544bf745b)) * **liveness:** zero-token ATS API check before Playwright (closes [#574](https://github.com/santifer/career-ops/issues/574)) ([#1181](https://github.com/santifer/career-ops/issues/1181)) ([44f9e64](https://github.com/santifer/career-ops/commit/44f9e6438f8eeaa4dd9f7c36844354256c94f6ae)) * **modes:** add Polish (pl) locale modes ([#1129](https://github.com/santifer/career-ops/issues/1129)) ([51711b3](https://github.com/santifer/career-ops/commit/51711b34ad6764283308245f21023f6337926c12)) * **modes:** optional voice-dna.md writing guardrail ([#998](https://github.com/santifer/career-ops/issues/998)) ([018eb0f](https://github.com/santifer/career-ops/commit/018eb0f692b801104959739151a4303cf5d2717e)) * **portals:** add verify-portals.mjs ATS slug validator ([#1016](https://github.com/santifer/career-ops/issues/1016)) ([7aeb016](https://github.com/santifer/career-ops/commit/7aeb01652d1b6c00ce31f561aa40b61c631515d0)) * **providers:** add BambooHR provider ([#1141](https://github.com/santifer/career-ops/issues/1141)) ([39bb6b2](https://github.com/santifer/career-ops/commit/39bb6b26151e9d1fae8dd6f55aa0deecd467d055)) * **providers:** add Breezy HR scanner provider ([#1185](https://github.com/santifer/career-ops/issues/1185)) ([6249bcb](https://github.com/santifer/career-ops/commit/6249bcb41be7ce0d05209d237e967cc910e46302)) * **scan:** add --json output, --include-undated, and --shuffle to scan-ats-full ([#1199](https://github.com/santifer/career-ops/issues/1199)) ([12206f7](https://github.com/santifer/career-ops/commit/12206f7e7b1bd9bafe0c8258b4951cab667e9f2e)) * **tracker:** add `delete --num N` to remove an application row safely ([#1200](https://github.com/santifer/career-ops/issues/1200)) ([a644392](https://github.com/santifer/career-ops/commit/a64439297e820f7de52d533eaa66b38ed5d08701)) ### Bug Fixes * auto-create data/pipeline.md and harden Playwright doctor check ([#1059](https://github.com/santifer/career-ops/issues/1059)) ([188cf76](https://github.com/santifer/career-ops/commit/188cf7601aa5d776b10a0c33c035e4d0f6199dfe)) * **batch:** harden status score handling ([#1133](https://github.com/santifer/career-ops/issues/1133)) ([fbce3f2](https://github.com/santifer/career-ops/commit/fbce3f28db22a07750082514e4fbf456b379bf5a)) * **batch:** use awk instead of bc for score math ([#735](https://github.com/santifer/career-ops/issues/735)) ([afa74c2](https://github.com/santifer/career-ops/commit/afa74c2b8755b2e0f33d164c92e0beccf528dc88)) * **contract:** expand interview-prep/* coverage in DATA_CONTRACT ([#1060](https://github.com/santifer/career-ops/issues/1060)) ([d19db79](https://github.com/santifer/career-ops/commit/d19db79554362cdd26736fef10bdaa9afaba4624)) * **dashboard:** rewrite only the Status cell on status update ([#1186](https://github.com/santifer/career-ops/issues/1186)) ([b1cba0f](https://github.com/santifer/career-ops/commit/b1cba0feb1e6a8aa1bec2fdb143f3f53ff01fd11)) * images not rendering in PDF output due to about:blank origin ([#1165](https://github.com/santifer/career-ops/issues/1165)) ([81752df](https://github.com/santifer/career-ops/commit/81752df3889a7fa6bce76c5f406482203c1cfdab)) * normalize report links from data files ([#1134](https://github.com/santifer/career-ops/issues/1134)) ([6ae011f](https://github.com/santifer/career-ops/commit/6ae011f22813b63879707f35affc9584fffdb891)) * **providers:** harden lever/ashby/workday against SSRF via redirect ([950aad5](https://github.com/santifer/career-ops/commit/950aad59475a95ddcf842f1556c0de839d5b50a1)) * **recruitee:** keep offer URLs on tenant custom domains ([#1116](https://github.com/santifer/career-ops/issues/1116)) ([7c7fd99](https://github.com/santifer/career-ops/commit/7c7fd994d005557c0f14c4f29376ead33ced4d9f)) * **scan:** guard title-filter keyword normalization against malformed config ([#1187](https://github.com/santifer/career-ops/issues/1187)) ([68c0cdf](https://github.com/santifer/career-ops/commit/68c0cdf340a6066c21038ae6e8665ffc4d8c22d2)) * **scan:** match short acronym title-filter keywords on word boundaries ([#1102](https://github.com/santifer/career-ops/issues/1102)) ([424f864](https://github.com/santifer/career-ops/commit/424f8645d2339b76eaf427629029d34627ac7ccd)) * **template:** emit mailto:/tel: links for email and phone in CV header ([#1167](https://github.com/santifer/career-ops/issues/1167)) ([7a4b3b6](https://github.com/santifer/career-ops/commit/7a4b3b6b3d508c9e2d2064df2a45e942a6a78335)) * **templates:** disable fi/fl ligatures for ATS-clean PDF text extraction ([#1175](https://github.com/santifer/career-ops/issues/1175)) ([#1176](https://github.com/santifer/career-ops/issues/1176)) ([51ef241](https://github.com/santifer/career-ops/commit/51ef24101bd2684ddb4103c51f1ac0df6c9f26ee)) ## [1.12.0](https://github.com/santifer/career-ops/compare/career-ops-v1.11.0...career-ops-v1.12.0) (2026-06-18) ### Features * **batch:** add --status and --watch progress monitoring to batch-runner.sh ([#922](https://github.com/santifer/career-ops/issues/922)) ([#966](https://github.com/santifer/career-ops/issues/966)) ([802552f](https://github.com/santifer/career-ops/commit/802552ff72809d36f42c00ff4cd36affb0f6bf1f)) * **cli:** add Antigravity CLI compatibility ([61de18d](https://github.com/santifer/career-ops/commit/61de18db165cf864c11afd7d4e3224bc7fe6596b)) * **i18n:** add Chinese language modes for China-market job seekers ([#934](https://github.com/santifer/career-ops/issues/934)) ([#965](https://github.com/santifer/career-ops/issues/965)) ([207f960](https://github.com/santifer/career-ops/commit/207f9600e4cf15718ae44d064c9e9ec7cc7a77b3)) * **pdf:** render Japanese CVs with a lang="ja" CJK font fallback ([#1053](https://github.com/santifer/career-ops/issues/1053)) ([d0d57d1](https://github.com/santifer/career-ops/commit/d0d57d184649615b638812156a24c87ceafab8a2)) * **providers:** add Jobstreet and Glints providers for the Indonesian market ([728d547](https://github.com/santifer/career-ops/commit/728d54777dd546fef37373b400aa13cfee38f374)), closes [#1085](https://github.com/santifer/career-ops/issues/1085) * **providers:** add RemoteOK, Remotive, Working Nomads, IBM board providers ([349bacc](https://github.com/santifer/career-ops/commit/349bacc9d9ad377d6d85ae35fe87625c1b3a6114)), closes [#1075](https://github.com/santifer/career-ops/issues/1075) * **providers:** port Arbeitsagentur to an in-process provider ([#1095](https://github.com/santifer/career-ops/issues/1095)) ([504a2f0](https://github.com/santifer/career-ops/commit/504a2f054625c16f777693a56c789599c0bacdfa)) * **scan:** add content/description filter for providers ([#974](https://github.com/santifer/career-ops/issues/974)) ([21d6c86](https://github.com/santifer/career-ops/commit/21d6c86f12071217aefbcbca397ebb957f361f92)) ### Bug Fixes * **ashby:** include secondaryLocations so EU-eligible roles surface ([a84d3f5](https://github.com/santifer/career-ops/commit/a84d3f51e436e8b36305c38d2ed5dd8438aa5f90)), closes [#1073](https://github.com/santifer/career-ops/issues/1073) * **batch:** reconcile pipeline.md inbox after batch runs ([#712](https://github.com/santifer/career-ops/issues/712)) ([34c3d0e](https://github.com/santifer/career-ops/commit/34c3d0ea60e1dcfda4985112ef4577bbb8b1faf3)) * **dashboard:** archetype regex matches English and Spanish reports ([#977](https://github.com/santifer/career-ops/issues/977)) ([d619d3b](https://github.com/santifer/career-ops/commit/d619d3b5ca24fda2ab94cf90111f2b42b2f2691a)) * **dashboard:** open Windows targets without shell ([#987](https://github.com/santifer/career-ops/issues/987)) ([6dc36fb](https://github.com/santifer/career-ops/commit/6dc36fb0792d1157ec96bfb5c3ac4f10cf303305)) * **dashboard:** report last-contact in calendar days, not hours-since-midnight ([#1057](https://github.com/santifer/career-ops/issues/1057)) ([4e05cfd](https://github.com/santifer/career-ops/commit/4e05cfda98b5dccfd2c664c12335ee20812b451b)) * **followup:** resolve report path relative to tracker directory ([752f3b9](https://github.com/santifer/career-ops/commit/752f3b9d598686e56227d8c48063213fdd302a85)), closes [#1070](https://github.com/santifer/career-ops/issues/1070) * **followup:** use the real application date from notes, not the eval date ([#1096](https://github.com/santifer/career-ops/issues/1096)) ([#1097](https://github.com/santifer/career-ops/issues/1097)) ([53785c8](https://github.com/santifer/career-ops/commit/53785c895750b5c69876ed5b1d6d05fb86c022be)) * **gemini:** validate evaluation report shape ([#819](https://github.com/santifer/career-ops/issues/819)) ([a0aa264](https://github.com/santifer/career-ops/commit/a0aa26421b9abc14079f950519bad934134db66c)) * **latex:** language-agnostic section validation + CJK guard ([#1054](https://github.com/santifer/career-ops/issues/1054)) ([b147504](https://github.com/santifer/career-ops/commit/b147504ade6f1f6fb0445dbe09dfcf380ab01260)) * **merge-tracker:** require company match for number-based dedup ([2bb514f](https://github.com/santifer/career-ops/commit/2bb514f31b38c7a520545da0c4d3567f7103f608)), closes [#912](https://github.com/santifer/career-ops/issues/912) * **pdf:** auto-install Playwright chromium after update ([eb504ad](https://github.com/santifer/career-ops/commit/eb504adec46ac7b144d1cbc8ca6e2cc6f18173e3)) * **pdf:** use ATS-safe system fonts for clean CV text extraction ([17033e8](https://github.com/santifer/career-ops/commit/17033e8213a519aa082e790b3cc4702f5bd7266b)), closes [#1074](https://github.com/santifer/career-ops/issues/1074) * **pipeline:** add batch liveness sweep for unconfirmed entries ([#750](https://github.com/santifer/career-ops/issues/750)) ([#973](https://github.com/santifer/career-ops/issues/973)) ([e9eba87](https://github.com/santifer/career-ops/commit/e9eba87367740080e2330b0c6f1e025231e01d86)) * **scan:** sanitize external metadata before writes ([#1098](https://github.com/santifer/career-ops/issues/1098)) ([61bad36](https://github.com/santifer/career-ops/commit/61bad36fc4547c7f28b1ed92e963c9f8143c35c5)) * **security:** harden local-parser against command/arg injection and scan-ats against SSRF ([721f1a8](https://github.com/santifer/career-ops/commit/721f1a863a83d188242a474df3e54c2b673e5b99)) * **tracker:** preserve notes column when rewriting rows without a trailing pipe ([#1004](https://github.com/santifer/career-ops/issues/1004)) ([0569518](https://github.com/santifer/career-ops/commit/0569518b22eae190df0eeb6675536aaa89c71840)) * **update:** materialize skill entrypoints without symlinks ([#1067](https://github.com/santifer/career-ops/issues/1067)) ([3ef63c8](https://github.com/santifer/career-ops/commit/3ef63c8531c60c3cd1a5f8a6088097f914b89907)) * **updater:** git-safety on abort + preserve user files on safety-violation rollback ([#915](https://github.com/santifer/career-ops/issues/915)) ([#1099](https://github.com/santifer/career-ops/issues/1099)) ([deef636](https://github.com/santifer/career-ops/commit/deef6365fa01604f7d6abcd14e1817e22c0d2b05)) ## [1.11.0](https://github.com/santifer/career-ops/compare/career-ops-v1.10.0...career-ops-v1.11.0) (2026-06-15) ### Features * add first-class OpenCode support alongside Claude Code ([#707](https://github.com/santifer/career-ops/issues/707)) ([2710fbe](https://github.com/santifer/career-ops/commit/2710fbe9b31cd0c6d1a8765cd5e04c255ede4ca3)) * **cover:** add optional salutation/greeting to cover letters ([#1010](https://github.com/santifer/career-ops/issues/1010)) ([99346c1](https://github.com/santifer/career-ops/commit/99346c148fbd19e4040be457f860b27fe678e8d7)) * **cover:** load _profile.md so personalization governs the letter ([#1012](https://github.com/santifer/career-ops/issues/1012)) ([dff56d3](https://github.com/santifer/career-ops/commit/dff56d3903c85251e6fdd008feb02ba464a5d0dc)) * **doctor:** warn when Playwright MCP tools are not configured ([#938](https://github.com/santifer/career-ops/issues/938)) ([0222224](https://github.com/santifer/career-ops/commit/0222224c108c210d715ef4f5cac42a2edac24809)) * **tracker:** map tracker columns by header name ([#954](https://github.com/santifer/career-ops/issues/954)) ([57b34c0](https://github.com/santifer/career-ops/commit/57b34c07e01cd106528936398507e1b4552ca295)) * **tracker:** SQLite derived index over applications.md — phase 1 ([#919](https://github.com/santifer/career-ops/issues/919)) ([5465f16](https://github.com/santifer/career-ops/commit/5465f162bb71dec8a25391265bdd498db2d6b512)) ### Bug Fixes * **cv:** align certification org column width across rows ([#931](https://github.com/santifer/career-ops/issues/931)) ([e27b051](https://github.com/santifer/career-ops/commit/e27b051eaf1d96ea56ebbeabd7535d19225922d2)) * **deps:** update npm dependencies to v1.61.0 ([#1023](https://github.com/santifer/career-ops/issues/1023)) ([5407247](https://github.com/santifer/career-ops/commit/54072470ab440b1b358a18ab6de9672cc4cb5649)) * **eval:** gate dead links before evaluation in oferta and auto-pipeline ([#937](https://github.com/santifer/career-ops/issues/937)) ([ebf9a13](https://github.com/santifer/career-ops/commit/ebf9a13762f5bbb2e0d9bdf17c7f0b96e32c4e94)) * **generate-pdf:** inline local fonts as data: URLs so they actually embed ([#952](https://github.com/santifer/career-ops/issues/952)) ([08d1e9a](https://github.com/santifer/career-ops/commit/08d1e9a504cfa8198fb1c84ee824b80de2324df8)) * **merge-tracker:** serialize concurrent tracker merges with a filesystem lock ([#941](https://github.com/santifer/career-ops/issues/941)) ([0d57994](https://github.com/santifer/career-ops/commit/0d579944d99276cf85d0d2280cc2697ee7a95140)) * **pdf:** wait for load instead of networkidle during render ([#929](https://github.com/santifer/career-ops/issues/929)) ([fd2ce04](https://github.com/santifer/career-ops/commit/fd2ce043713874f354980dca0e5778272cdb96a0)) * remove story-bank.md from git tracking ([#944](https://github.com/santifer/career-ops/issues/944)) ([67662b9](https://github.com/santifer/career-ops/commit/67662b9dad68175a06c631baac523437a93d44f2)) * **skill:** surface latex mode in command menus ([#928](https://github.com/santifer/career-ops/issues/928)) ([2803348](https://github.com/santifer/career-ops/commit/2803348129078960d752c34e75bf253cd32aec06)) * **tests:** run tracker-mutating scripts with --dry-run in script checks ([#925](https://github.com/santifer/career-ops/issues/925)) ([1acf27d](https://github.com/santifer/career-ops/commit/1acf27d2d154b8d12c246c8c5fed443dec08384b)) * **tracker:** prevent dedup from deleting distinct same-company roles ([#950](https://github.com/santifer/career-ops/issues/950)) ([98b32a4](https://github.com/santifer/career-ops/commit/98b32a445abe1bb464dbc15ebb1c450a82772564)) * **update:** distribute missing runtime paths ([#991](https://github.com/santifer/career-ops/issues/991)) ([85ae717](https://github.com/santifer/career-ops/commit/85ae717b8dd331a87ffb58f66181465f4509a17c)) * **update:** match Release Please component-prefixed tags in version check ([#926](https://github.com/santifer/career-ops/issues/926)) ([6f0e289](https://github.com/santifer/career-ops/commit/6f0e2890e91b178cdc82a403427152247516e559)) * **update:** rebuild dashboard binary after Go source changes ([#953](https://github.com/santifer/career-ops/issues/953)) ([5382d37](https://github.com/santifer/career-ops/commit/5382d37f65dde222d73ce059f804be9f4853d922)) * **update:** use target updater manifest during apply ([#983](https://github.com/santifer/career-ops/issues/983)) ([539e47b](https://github.com/santifer/career-ops/commit/539e47bdc59462c883964549a01e312d58e996e1)) ## [1.10.0](https://github.com/santifer/career-ops/compare/career-ops-v1.9.0...career-ops-v1.10.0) (2026-06-11) ### Features * **apply:** add preflight liveness and role-match gate ([#887](https://github.com/santifer/career-ops/issues/887)) ([42bb9ab](https://github.com/santifer/career-ops/commit/42bb9ab1aa73397d88a6759def9d4579c979eac3)) * **batch:** pause batch runner on Claude session limits ([#874](https://github.com/santifer/career-ops/issues/874)) ([ae6beec](https://github.com/santifer/career-ops/commit/ae6beec28b83fb184325f3fd261816684613b3ae)) * **cover:** add cover letter generation mode ([#807](https://github.com/santifer/career-ops/issues/807)) ([493f822](https://github.com/santifer/career-ops/commit/493f82268608b447fab2a4b5f60d8ee169bc2679)) * **cv:** add build-cv-latex.mjs structured JSON to LaTeX renderer ([#905](https://github.com/santifer/career-ops/issues/905)) ([b4af01f](https://github.com/santifer/career-ops/commit/b4af01f0858ecd707bcd168b3771a6d3cd76f2ba)) * **dashboard:** keep discard reason visible in pipeline preview ([#914](https://github.com/santifer/career-ops/issues/914)) ([3200dfe](https://github.com/santifer/career-ops/commit/3200dfe34805b5e5f2cfc1850da31bdad1c627fa)) * **dashboard:** sortable Location, Pay, and Last-contact columns in pipeline view ([#798](https://github.com/santifer/career-ops/issues/798)) ([265a95b](https://github.com/santifer/career-ops/commit/265a95befd4f5d0b42ecee104446129898f4ad0c)) * dockerize project for hosts blocked from native Playwright install ([#625](https://github.com/santifer/career-ops/issues/625)) ([66404a8](https://github.com/santifer/career-ops/commit/66404a81a617ad0b076df2a8607aad03996124a7)) * **doctor:** adopt doctor --json as the single onboarding state source ([#888](https://github.com/santifer/career-ops/issues/888)) ([35e2124](https://github.com/santifer/career-ops/commit/35e212429ec98442d83fe47b08636c5688f90055)) * **followup:** read cadence settings from profile.yml ([#889](https://github.com/santifer/career-ops/issues/889)) ([8050c37](https://github.com/santifer/career-ops/commit/8050c37870fe2e3fe14c1da836f00d1a7a8819fe)) * **i18n:** add full Arabic language support and modes ([#764](https://github.com/santifer/career-ops/issues/764)) ([333bb81](https://github.com/santifer/career-ops/commit/333bb81bcc4e3d7e93928ba1b6d155110ce79cd7)) * **modes:** add interactive interview onboarding subcommand ([#909](https://github.com/santifer/career-ops/issues/909)) ([46a5c59](https://github.com/santifer/career-ops/commit/46a5c5914aab6389ab51d4d393d5575a06f229e6)) * **scan:** add --rediscover-404 fallback for moved tracked postings ([#808](https://github.com/santifer/career-ops/issues/808)) ([7096dbc](https://github.com/santifer/career-ops/commit/7096dbc31067963f0a08d95185f7a2b4c5539f91)) * **scan:** add configurable salary filtering to the zero-token scanner ([#677](https://github.com/santifer/career-ops/issues/677)) ([a6ea02e](https://github.com/santifer/career-ops/commit/a6ea02ea354de05f6cb50a6c578fab3e1c5c0dd8)) * **scan:** add portals.yml schema validator ([#886](https://github.com/santifer/career-ops/issues/886)) ([3340695](https://github.com/santifer/career-ops/commit/33406955e5c619c088a0e3063b6e08d445dc1105)) * **scan:** add scan-ats-full.mjs — reverse-discover jobs from public ATS APIs ([#746](https://github.com/santifer/career-ops/issues/746)) ([7801dc7](https://github.com/santifer/career-ops/commit/7801dc7ecdc1ef1a3385fe6eb0797bb03cf6d047)) * **scan:** add scan-history TTL and recheck policy ([#895](https://github.com/santifer/career-ops/issues/895)) ([1db4cf2](https://github.com/santifer/career-ops/commit/1db4cf2072bdb235bb423b61d2d4da4773c9fa49)) * **scan:** add SolidJobs provider and job_boards support ([#853](https://github.com/santifer/career-ops/issues/853)) ([79862a9](https://github.com/santifer/career-ops/commit/79862a9e0ed0938576e91f6785c7fbc5dc2c4d7c)) ### Bug Fixes * **apply:** preserve form field contracts ([#821](https://github.com/santifer/career-ops/issues/821)) ([2b38fd0](https://github.com/santifer/career-ops/commit/2b38fd09e59e5b709069a1f504f3a8553a1cc0f7)) * **batch:** append profile context to worker prompts ([#815](https://github.com/santifer/career-ops/issues/815)) ([4989afc](https://github.com/santifer/career-ops/commit/4989afc112e9fa052b3d489cb5ba198ee0a552ee)) * **batch:** isolate workers from inherited MCP to prevent parallel deadlock ([#809](https://github.com/santifer/career-ops/issues/809)) ([c8c0dbd](https://github.com/santifer/career-ops/commit/c8c0dbd5f96874530f70a2e490f261ee5eaa3ed0)) * **batch:** stop after min-score skip instead of falling through to completed ([#873](https://github.com/santifer/career-ops/issues/873)) ([888ca31](https://github.com/santifer/career-ops/commit/888ca3139411feb5282a3a2ec53c5f8a8390f0e4)) * **dashboard:** resolve tracker-relative report links against the tracker directory ([#780](https://github.com/santifer/career-ops/issues/780)) ([858fc93](https://github.com/santifer/career-ops/commit/858fc9334f38f8767ec3d93cdac4bdb5e754aeff)), closes [#779](https://github.com/santifer/career-ops/issues/779) * **doctor:** single source of truth for onboarding state via doctor --json ([#765](https://github.com/santifer/career-ops/issues/765)) ([eb536c4](https://github.com/santifer/career-ops/commit/eb536c49580ba17a9e63064f3893248a4c58c576)) * **flake:** declare systems so the devShell resolves on macOS ([#848](https://github.com/santifer/career-ops/issues/848)) ([e5f0903](https://github.com/santifer/career-ops/commit/e5f09038e7cd9135db535927db219813d94a71ce)), closes [#334](https://github.com/santifer/career-ops/issues/334) * **liveness:** stop false-expiring postings behind anti-bot walls ([#783](https://github.com/santifer/career-ops/issues/783)) ([a667c33](https://github.com/santifer/career-ops/commit/a667c337acc4b68e3e937fd4ce5280bb77b3ce4a)) * **merge-tracker:** require company match on exact entry-number dedup ([#867](https://github.com/santifer/career-ops/issues/867)) ([10ad2de](https://github.com/santifer/career-ops/commit/10ad2de161f7d45ee51e7895c4a47aa556207cb3)) * **merge-tracker:** use token-union ratio in roleFuzzyMatch to stop cross-role dedup ([#793](https://github.com/santifer/career-ops/issues/793)) ([cfa7505](https://github.com/santifer/career-ops/commit/cfa750573a8dfbcc3b825311e6c910d51719e54f)), closes [#751](https://github.com/santifer/career-ops/issues/751) * **patterns:** parse header-style and Detected-archetype formats in analyze-patterns ([#723](https://github.com/santifer/career-ops/issues/723)) ([abf603c](https://github.com/santifer/career-ops/commit/abf603c885eab6b3741b0cf41297ac2b9a960cc4)) * **pdf:** reject CV section ordering that diverges from cv.md source ([#817](https://github.com/santifer/career-ops/issues/817)) ([9f6acc2](https://github.com/santifer/career-ops/commit/9f6acc2acf5e77ab504990bb483d0e2c29c9b313)) * **pipeline:** atomic report-number reservation for parallel workers ([#803](https://github.com/santifer/career-ops/issues/803)) ([c42368c](https://github.com/santifer/career-ops/commit/c42368c189b611044a666d7d11fe81ba5a78c6ad)) * **release:** auto-sync VERSION via release-please generic extra-file ([214f5f8](https://github.com/santifer/career-ops/commit/214f5f8a7ca06f8b1225aed49709022e4c9f32e8)) * **release:** sync VERSION file to 1.9.0 ([461e3d9](https://github.com/santifer/career-ops/commit/461e3d91f6a48419c5b51fa17e6765bf8d174a3c)) * **security:** close SSRF guard bypasses in liveness-browser ([#917](https://github.com/santifer/career-ops/issues/917)) ([1f525c4](https://github.com/santifer/career-ops/commit/1f525c4e4a661c1153b526e3e210a444007e388e)) * **update:** bootstrap tracker-links.mjs and scaffolder/ for v1.8.x to v1.9.0 upgrades ([#921](https://github.com/santifer/career-ops/issues/921)) ([1d3a18b](https://github.com/santifer/career-ops/commit/1d3a18be5822fe40feb3e5629890a3eb7d752bcf)) * **update:** run curl version checks concurrently in check() ([#896](https://github.com/santifer/career-ops/issues/896)) ([8f0ed38](https://github.com/santifer/career-ops/commit/8f0ed384245f8f859da08e188d873367ffc394f6)) * **update:** use curl in check() so updates work inside the Claude Code sandbox ([#802](https://github.com/santifer/career-ops/issues/802)) ([8cac7f3](https://github.com/santifer/career-ops/commit/8cac7f33deeba69674682c5d77883b0e5b3eaba2)), closes [#754](https://github.com/santifer/career-ops/issues/754) ## [1.9.0](https://github.com/santifer/career-ops/compare/career-ops-v1.8.0...career-ops-v1.9.0) (2026-06-09) ### Features * add npx career-ops scaffolder for one-command install ([#856](https://github.com/santifer/career-ops/issues/856)) ([ce4fa58](https://github.com/santifer/career-ops/commit/ce4fa5825c74c50506e5cdb5018d79840e2e2fe5)), closes [#855](https://github.com/santifer/career-ops/issues/855) * add structured machine summaries to evaluations ([#444](https://github.com/santifer/career-ops/issues/444)) ([19a1820](https://github.com/santifer/career-ops/commit/19a1820f99e05db68508a2b769379384636a9e83)) * add Ukrainian language and market support ([#323](https://github.com/santifer/career-ops/issues/323)) ([06d70d3](https://github.com/santifer/career-ops/commit/06d70d30b26754228e7560e6477f94e8d5360874)) * **batch:** add --model flag to batch-runner.sh ([#504](https://github.com/santifer/career-ops/issues/504)) ([44def35](https://github.com/santifer/career-ops/commit/44def35c23c43e91d9633951d90f4ff50773c931)) * **dashboard:** /-key live search across pipeline rows ([#526](https://github.com/santifer/career-ops/issues/526)) ([433f34f](https://github.com/santifer/career-ops/commit/433f34f20aec61c68fda5dd9274a06919d0d7fc2)) * **i18n:** add Turkish (TR) language modes ([#341](https://github.com/santifer/career-ops/issues/341)) ([e87eb57](https://github.com/santifer/career-ops/commit/e87eb576df3aa394a7e28acd9f04a805ca0ca696)) * **interview-prep:** split prep by interviewer audience ([#489](https://github.com/santifer/career-ops/issues/489)) ([d86b86c](https://github.com/santifer/career-ops/commit/d86b86c93ada6cd8d74213357a1566f17dccd280)) * make PDF auto-generation configurable via auto_pdf_score_threshold ([#715](https://github.com/santifer/career-ops/issues/715)) ([fdbf4e1](https://github.com/santifer/career-ops/commit/fdbf4e13ef6143294b22cc42fb3e03294905880c)) * **scan:** add --verify flag to drop expired postings before pipeline append ([#487](https://github.com/santifer/career-ops/issues/487)) ([82f0c2e](https://github.com/santifer/career-ops/commit/82f0c2ef9ee2155cf70300c2f64e15eeaf40a69e)) * **scan:** add local-parser provider and agent skip rules ([#595](https://github.com/santifer/career-ops/issues/595)) ([b3ef0ae](https://github.com/santifer/career-ops/commit/b3ef0ae3d7ca9ebffc1d8a524408c5dfa42e3446)) * **scan:** add optional always_allow tier to location_filter ([#652](https://github.com/santifer/career-ops/issues/652)) ([d152da3](https://github.com/santifer/career-ops/commit/d152da36e7625c229d15f6f2ef92ab43d4398cc8)), closes [#650](https://github.com/santifer/career-ops/issues/650) * **scan:** add Workable, SmartRecruiters, Recruitee ATS parsers ([#653](https://github.com/santifer/career-ops/issues/653)) ([ea7b2a6](https://github.com/santifer/career-ops/commit/ea7b2a673eab73e258f33f64fcb0844df0b36d9d)), closes [#651](https://github.com/santifer/career-ops/issues/651) ### Bug Fixes * **batch:** wait and retry batch workers on rate limits ([#816](https://github.com/santifer/career-ops/issues/816)) ([f498ccf](https://github.com/santifer/career-ops/commit/f498ccf5e1027032de8402715e1483d780a7ad84)), closes [#505](https://github.com/santifer/career-ops/issues/505) * **dashboard:** width-aware Markdown rendering with table wrapping in viewer ([#513](https://github.com/santifer/career-ops/issues/513)) ([dc3a247](https://github.com/santifer/career-ops/commit/dc3a247733d9fb7eb7159836bed743a587231192)) * **gemini:** auto-merge Gemini evals into the tracker instead of a manual-edit reminder ([#820](https://github.com/santifer/career-ops/issues/820)) ([6efac1a](https://github.com/santifer/career-ops/commit/6efac1a27b64e546a9a3ef31b25478cce571a365)) * make tracker report links relative to the tracker file ([#760](https://github.com/santifer/career-ops/issues/760)) ([#761](https://github.com/santifer/career-ops/issues/761)) ([c0d42cd](https://github.com/santifer/career-ops/commit/c0d42cda026d902dfc226364e018a8fd5c8d94b3)) * **pdf:** don't spell out ambiguous ¥ currency symbol ([4c415a9](https://github.com/santifer/career-ops/commit/4c415a9128c2ecaf2150e6e484324bc53a524dc6)) * **pdf:** normalize arrows, middots, and currency symbols for ATS extraction ([#731](https://github.com/santifer/career-ops/issues/731)) ([f164eba](https://github.com/santifer/career-ops/commit/f164ebadbb1430af8bdc541e1af70af52d05c81e)), closes [#730](https://github.com/santifer/career-ops/issues/730) * register the career-ops skill in Claude Code via user_invocable key ([#801](https://github.com/santifer/career-ops/issues/801)) ([3ddb00c](https://github.com/santifer/career-ops/commit/3ddb00ce14cd7dd7af42410e4f3f3a1311ef787d)), closes [#763](https://github.com/santifer/career-ops/issues/763) * **release:** sync VERSION file to 1.8.0 ([541917f](https://github.com/santifer/career-ops/commit/541917f627f3f328e5411a54685f5e8706761499)) * **scaffolder:** don't pre-create user config so agent onboarding triggers ([#858](https://github.com/santifer/career-ops/issues/858)) ([cd827be](https://github.com/santifer/career-ops/commit/cd827bed557b96ab2dba7a0496c73827ba51277a)), closes [#855](https://github.com/santifer/career-ops/issues/855) * **scan:** bootstrap providers/ on update + harden greenhouse detect() ([#696](https://github.com/santifer/career-ops/issues/696)) ([4b12081](https://github.com/santifer/career-ops/commit/4b120817fc1a07d4664ff764bf2a1c51e443b524)) * **scan:** raise Ashby provider timeout + add backoff retry ([#755](https://github.com/santifer/career-ops/issues/755)) ([1aa6c63](https://github.com/santifer/career-ops/commit/1aa6c63a34b448414826d0c7a7cfa161583c256f)) * **scan:** surface websearch-handoff companies in the run summary ([#814](https://github.com/santifer/career-ops/issues/814)) ([137c7b3](https://github.com/santifer/career-ops/commit/137c7b3f3149f2aac9a2c7c1e9120c90d073d79b)), closes [#747](https://github.com/santifer/career-ops/issues/747) * scope npm package as @santifer/career-ops ([#857](https://github.com/santifer/career-ops/issues/857)) ([87ef561](https://github.com/santifer/career-ops/commit/87ef561b63ca7221ed0476326a96c41421f01103)) * **update-system:** add tracker-links.mjs to SYSTEM_PATHS ([8287cf4](https://github.com/santifer/career-ops/commit/8287cf4eaa00ae40bb236020e9d2892c0d539f76)) * **update-system:** apply() safety violation reverts cleanly and releases lock ([#484](https://github.com/santifer/career-ops/issues/484)) ([980153c](https://github.com/santifer/career-ops/commit/980153c315ec3fbbe6f9195c77d2f865b5a2e1a0)) * **update-system:** bootstrap liveness-browser.mjs for v1.7→v1.8 upgrades ([#725](https://github.com/santifer/career-ops/issues/725)) ([1ea95f2](https://github.com/santifer/career-ops/commit/1ea95f293e742945fb4ba9befee4db8c50df6d2f)), closes [#704](https://github.com/santifer/career-ops/issues/704) * **update-system:** rollback() removes paths absent from backup branch ([#483](https://github.com/santifer/career-ops/issues/483)) ([f94a3be](https://github.com/santifer/career-ops/commit/f94a3be25890d83ee2664175bbe1bebf1f3eb033)) * **update:** distribute missing modes, locales and CLI configs via update-system ([#868](https://github.com/santifer/career-ops/issues/868)) ([03b2c94](https://github.com/santifer/career-ops/commit/03b2c948cf5340f1c31a7711e8858fe0d30b86fd)) * **update:** timestamp backup branches and roll back to the newest ([#813](https://github.com/santifer/career-ops/issues/813)) ([1717f9c](https://github.com/santifer/career-ops/commit/1717f9c3167cee942c99ca290cdf58398e466863)), closes [#733](https://github.com/santifer/career-ops/issues/733) ## [1.8.0](https://github.com/santifer/career-ops/compare/career-ops-v1.7.1...career-ops-v1.8.0) (2026-05-15) ### Features * **scan:** optional location_filter in portals.yml + persist location to scan-history ([#570](https://github.com/santifer/career-ops/issues/570)) ([d692647](https://github.com/santifer/career-ops/commit/d692647c253a0bf92a4f9f3b8043afe2c8161853)) ### Bug Fixes * **batch:** workers read modes/_profile.md and config/profile.yml ([#537](https://github.com/santifer/career-ops/issues/537)) ([150e223](https://github.com/santifer/career-ops/commit/150e223ba679246a378e7815da95b6b6d1c5e6ad)), closes [#534](https://github.com/santifer/career-ops/issues/534) * **deps:** update dotenv to v17 ([#499](https://github.com/santifer/career-ops/issues/499)) ([ce1330e](https://github.com/santifer/career-ops/commit/ce1330efc45e9da462e81ccce3d5f27db9f8a623)) * **gemini-eval:** include profile.yml and _profile.md in evaluation ([#618](https://github.com/santifer/career-ops/issues/618)) ([73dc603](https://github.com/santifer/career-ops/commit/73dc6038d2e723997426d73d3a0c5040c48dd033)), closes [#617](https://github.com/santifer/career-ops/issues/617) * **gemini-eval:** redact API key from error logs, harden summary parsing ([#582](https://github.com/santifer/career-ops/issues/582)) ([fdca4de](https://github.com/santifer/career-ops/commit/fdca4ded87e1dbde0571fe740da061da491f46c7)) * **gemini-eval:** switch default model to non-deprecated endpoint, surface 429 guidance ([#615](https://github.com/santifer/career-ops/issues/615)) ([dd3e036](https://github.com/santifer/career-ops/commit/dd3e0366d26719af7be234786a16512f46ac9e85)), closes [#614](https://github.com/santifer/career-ops/issues/614) * **manifest:** align plugin.json skills field with Claude Code plugin schema ([#612](https://github.com/santifer/career-ops/issues/612)) ([a77d3f6](https://github.com/santifer/career-ops/commit/a77d3f6aa3f5c278665c95c5a12048e4df66d337)) * **merge-tracker:** preserve short specialty acronyms, require non-baseline overlap ([#634](https://github.com/santifer/career-ops/issues/634)) ([5ed3b3d](https://github.com/santifer/career-ops/commit/5ed3b3d7ea693547153ef734ab5f6016414c3301)), closes [#633](https://github.com/santifer/career-ops/issues/633) * **modes:** make /career-ops deep respect user language, not JD language ([#568](https://github.com/santifer/career-ops/issues/568)) ([e5f0508](https://github.com/santifer/career-ops/commit/e5f0508b94299a0e6b46918ecca2f483de0a58c6)) * **portals:** update Weights & Biases entry to CoreWeave acquisition ([#493](https://github.com/santifer/career-ops/issues/493)) ([1411cdc](https://github.com/santifer/career-ops/commit/1411cdc461de05a6772c854188053bcaeeb4ee32)) * **release:** sync VERSION file to 1.7.1 ([2ebfcab](https://github.com/santifer/career-ops/commit/2ebfcabdb4cf7973e279e56f8eae001a8dadc5ed)) * **scan:** validate Greenhouse URL hostname against allowlist to prevent SSRF ([#602](https://github.com/santifer/career-ops/issues/602)) ([988f7bb](https://github.com/santifer/career-ops/commit/988f7bb2a642f91d6cce1e2fc94f08658b72e099)) * **templates:** align CV certification rows on a 3-column grid ([#638](https://github.com/santifer/career-ops/issues/638)) ([082cd11](https://github.com/santifer/career-ops/commit/082cd11c32b917fe3aeef709ff4f386371af3e64)) * **update-system:** allow writing-samples/README.md as system-owned file ([#562](https://github.com/santifer/career-ops/issues/562)) ([207fd07](https://github.com/santifer/career-ops/commit/207fd076da3b2a30f0384fdb19312078ebdcf71f)) * **update-system:** bootstrap .agents/ for v1.6→v1.7 migration ([#654](https://github.com/santifer/career-ops/issues/654)) ([4714504](https://github.com/santifer/career-ops/commit/47145048716d3716a2f1cb0b46377a88e5df73c0)) * **update-system:** defensive VERSION parsing for release-please marker ([#547](https://github.com/santifer/career-ops/issues/547)) ([bf84886](https://github.com/santifer/career-ops/commit/bf848860cb2c7976f6e77e1b5d7b60ed5e9d0d14)) ## [1.7.1](https://github.com/santifer/career-ops/compare/career-ops-v1.7.0...career-ops-v1.7.1) (2026-05-12) ### Bug Fixes * **release:** sync VERSION file to 1.7.0 ([8e554cc](https://github.com/santifer/career-ops/commit/8e554cc4437c3a58e813378abb9b35e2e08a007e)) * **update-system:** include .agents/ in SYSTEM_PATHS ([#600](https://github.com/santifer/career-ops/issues/600)) ([3a71469](https://github.com/santifer/career-ops/commit/3a714695c63ca01a6581b4307885be2055319784)) ## [1.7.0](https://github.com/santifer/career-ops/compare/career-ops-v1.6.0...career-ops-v1.7.0) (2026-05-06) ### Features * adapt contacto mode by contact type (recruiter/HM/peer/interviewer) ([9fd5a90](https://github.com/santifer/career-ops/commit/9fd5a90896f20020f48455cd079b64fed491b89f)) * add --min-score flag to batch runner ([#249](https://github.com/santifer/career-ops/issues/249)) ([cb0c7f7](https://github.com/santifer/career-ops/commit/cb0c7f7d7d3b9f3f1c3dc75ccac0a08d2737c01e)) * add {{PHONE}} placeholder to CV template ([#287](https://github.com/santifer/career-ops/issues/287)) ([e71595f](https://github.com/santifer/career-ops/commit/e71595f8ba134971ecf1cc3c3420d9caf21eed43)) * add Block G — posting legitimacy assessment ([3a636ac](https://github.com/santifer/career-ops/commit/3a636ac586659bb798ef46a0a9798478a1e28b0a)) * add Claude Code plugin manifests (path-stable) ([62b767d](https://github.com/santifer/career-ops/commit/62b767dcc56e4c875ed70bf4fe799c254ecf8eea)) * add follow-up cadence tracker mode ([4308c37](https://github.com/santifer/career-ops/commit/4308c375033c6df430308235f4324658a8353b81)) * add Gemini CLI native integration and evaluator script ([#349](https://github.com/santifer/career-ops/issues/349)) ([0853486](https://github.com/santifer/career-ops/commit/0853486d2c01a35adafea2cc6b6d8c429b843588)) * add Gemini CLI native integration and evaluator script (closes [#344](https://github.com/santifer/career-ops/issues/344)) ([0853486](https://github.com/santifer/career-ops/commit/0853486d2c01a35adafea2cc6b6d8c429b843588)) * add GitHub Actions CI + auto-labeler + welcome bot + /run skill ([2ddf22a](https://github.com/santifer/career-ops/commit/2ddf22a6a2731b38bcaed5786c4855c4ab9fe722)) * add LaTeX/Overleaf CV export mode with pdflatex compilation ([#362](https://github.com/santifer/career-ops/issues/362)) ([b824953](https://github.com/santifer/career-ops/commit/b824953d0e3b7f8c6105dfcce7e17257c95ce6cd)) * add LaTeX/Overleaf CV export mode with pdflatex compilation (closes [#47](https://github.com/santifer/career-ops/issues/47)) ([b824953](https://github.com/santifer/career-ops/commit/b824953d0e3b7f8c6105dfcce7e17257c95ce6cd)) * add Nix flake devshell with Playwright support ([c579fcd](https://github.com/santifer/career-ops/commit/c579fcddebf793f00cfad8534fd74085c09017fb)) * add OpenCode slash commands for career-ops ([#67](https://github.com/santifer/career-ops/issues/67)) ([93caaed](https://github.com/santifer/career-ops/commit/93caaed49cbc9f3214f9beb66fb2281c3f2370e6)) * add scan.mjs — zero-token portal scanner ([8c19b2b](https://github.com/santifer/career-ops/commit/8c19b2b59f7087689e004f3d48e912f291911373)) * add writing-samples folder for AI-detection-evading voice calibration ([9ae201d](https://github.com/santifer/career-ops/commit/9ae201d0682a17e7006ed7902b42db8234212e97)) * **cv:** add cv.output_format to route between html and latex generation ([b82bb5f](https://github.com/santifer/career-ops/commit/b82bb5fb7c86ab3074a54eaf0f3186f81d41f417)) * **dashboard:** add Catppuccin Latte light theme with auto-detection ([ff686c8](https://github.com/santifer/career-ops/commit/ff686c8af97a7bf93565fe8eeac677f998cc9ece)) * **dashboard:** add manual refresh shortcut ([#246](https://github.com/santifer/career-ops/issues/246)) ([4b5093a](https://github.com/santifer/career-ops/commit/4b5093a8ef1733c449ec0821f722f996625fcb84)) * **dashboard:** add progress analytics screen ([623c837](https://github.com/santifer/career-ops/commit/623c837bf3155fd5b7413554240071d40585dd7e)) * **dashboard:** add rejected and discarded pipeline tabs ([7d05967](https://github.com/santifer/career-ops/commit/7d05967389fb6185f0d6e566a4ba583ee3824e1e)) * **dashboard:** add vim motions to pipeline screen ([#262](https://github.com/santifer/career-ops/issues/262)) ([d149e54](https://github.com/santifer/career-ops/commit/d149e541402db0c88161a71c73899cd1836a1b2d)) * **dashboard:** aligned tables and markdown syntax rendering in viewer ([dbd1d3f](https://github.com/santifer/career-ops/commit/dbd1d3f7177358d0384d6e661d1b0dfc1f60bd4e)) * **dashboard:** show tracker IDs in pipeline list ([8d289c6](https://github.com/santifer/career-ops/commit/8d289c64e31f81cf447f75105b500d1feca21058)) * expand portals.example.yml with 8 dev-tools companies + 23 search queries ([#140](https://github.com/santifer/career-ops/issues/140)) ([b7f555d](https://github.com/santifer/career-ops/commit/b7f555d7b9a7b23c875fa0d35584df534961dabe)) * **i18n:** add Japanese README + language modes for Japan market ([20a2c81](https://github.com/santifer/career-ops/commit/20a2c817486968ca42a534aa86838c797d599c10)) * **latex:** add tectonic engine auto-detect with pdflatex fallback ([4b71b2c](https://github.com/santifer/career-ops/commit/4b71b2cbf4fd49d3882cdd8767e31727337fab34)) * multi-CLI support via open agent skill standard ([#572](https://github.com/santifer/career-ops/issues/572)) ([7605a5e](https://github.com/santifer/career-ops/commit/7605a5ed68d0fd559374afec1cd8798c487e3ead)) * **portals:** add Canada/Vancouver and automation companies to example template ([590ba6e](https://github.com/santifer/career-ops/commit/590ba6e1b4b9d2d9d03893b7f5fdae920d4f9a0b)) ### Bug Fixes * 10 bug fixes — resource leaks, command injection, Unicode, navigation ([cb01a2c](https://github.com/santifer/career-ops/commit/cb01a2c2e3b7fc334b1c4594749ea40b0da8fc62)) * add data/ fallback to UpdateApplicationStatus ([#55](https://github.com/santifer/career-ops/issues/55)) ([3512b8e](https://github.com/santifer/career-ops/commit/3512b8ef4eb8ca967bc967664f8798af42b58a52)) * add stopword filtering and overlap ratio to roleMatch ([#248](https://github.com/santifer/career-ops/issues/248)) ([4da772d](https://github.com/santifer/career-ops/commit/4da772d3a4996bc9ecbe2d384d1e9d2ed75b9819)) * align portals.example.yml indentation for new companies ([26a6751](https://github.com/santifer/career-ops/commit/26a675173e64dac09fd1524ff9a7c7061520e057)) * **ci:** correct first-interaction@v3 input names ([c5196a8](https://github.com/santifer/career-ops/commit/c5196a8dd8ff05da51c72ea151f67e481f12c329)) * **ci:** gracefully handle missing dependency graph in dependency-review ([#343](https://github.com/santifer/career-ops/issues/343)) ([7c5fecb](https://github.com/santifer/career-ops/commit/7c5fecb00d60521f77b33724eb345a28257d8832)) * **ci:** gracefully handle missing dependency graph in dependency-review workflow ([#352](https://github.com/santifer/career-ops/issues/352)) ([7c5fecb](https://github.com/santifer/career-ops/commit/7c5fecb00d60521f77b33724eb345a28257d8832)) * **ci:** use pull_request_target for labeler on fork PRs ([#260](https://github.com/santifer/career-ops/issues/260)) ([2ecf572](https://github.com/santifer/career-ops/commit/2ecf57206c2eb6e35e2a843d6b8365f7a04c53d6)) * correct _shared.md → _profile.md reference in CUSTOMIZATION.md (closes [#137](https://github.com/santifer/career-ops/issues/137)) ([a91e264](https://github.com/santifer/career-ops/commit/a91e264b6ea047a76d8c033aa564fe01b8f9c1d9)) * correct dashboard launch path in docs ([#80](https://github.com/santifer/career-ops/issues/80)) ([2b969ee](https://github.com/santifer/career-ops/commit/2b969eea5f6bbc8f29b9e42bedb59312379e9f02)) * **dashboard:** show dates in pipeline list ([#298](https://github.com/santifer/career-ops/issues/298)) ([e5e2a6c](https://github.com/santifer/career-ops/commit/e5e2a6cffe9a5b9f3cec862df25410d02ecc9aa4)) * ensure data/ and output/ dirs exist before writing in scripts ([#261](https://github.com/santifer/career-ops/issues/261)) ([4b834f6](https://github.com/santifer/career-ops/commit/4b834f6f7f8f1b647a6bf76e43b017dcbe9cd52f)) * filter expired WebSearch links before they reach the pipeline ([#57](https://github.com/santifer/career-ops/issues/57)) ([ce1c5a3](https://github.com/santifer/career-ops/commit/ce1c5a3c7eea6ebce2c90aebba59d6e26b790d3f)) * improve default PDF readability ([#85](https://github.com/santifer/career-ops/issues/85)) ([10034ec](https://github.com/santifer/career-ops/commit/10034ec3304c1c79ff9c9678c7826ab77c0bcbf7)) * liveness checks ignore nav/footer Apply text, expired signals win ([3a3cb95](https://github.com/santifer/career-ops/commit/3a3cb95bdf09235509df72e30b3077623f571ea1)) * **liveness:** detect closed postings with applications-closed banner variants ([7f8217e](https://github.com/santifer/career-ops/commit/7f8217e057b327980a797a682c4f01d3318edbbe)) * **merge-tracker:** filter seniority and location stopwords + require overlap ratio in roleFuzzyMatch ([7821113](https://github.com/santifer/career-ops/commit/7821113261eeb32f99639ff076651ab2e7757209)) * **pt:** restore diacritical marks in PT-BR modes ([#358](https://github.com/santifer/career-ops/issues/358)) ([3a4c596](https://github.com/santifer/career-ops/commit/3a4c596cb0a522f562ba38b35c210facaf38a503)) * **pt:** restore diacritical marks in PT-BR modes ([#359](https://github.com/santifer/career-ops/issues/359)) ([3a4c596](https://github.com/santifer/career-ops/commit/3a4c596cb0a522f562ba38b35c210facaf38a503)) * **release:** sync VERSION and package.json via release-please-config ([6a3dc22](https://github.com/santifer/career-ops/commit/6a3dc224337a1942bf2ebf18b9b275d94fc06e7a)) * remove wellfound, lever and remotefront from portals.example.yml ([#286](https://github.com/santifer/career-ops/issues/286)) ([ecd013c](https://github.com/santifer/career-ops/commit/ecd013cc6f59e3a1a8ef77d34e7abc15e8075ed3)) * replace grep -P with POSIX-compatible grep in batch-runner.sh ([637b39e](https://github.com/santifer/career-ops/commit/637b39e383d1174c8287f42e9534e9e3cdfabb19)) * test-all.mjs scans only git-tracked files, avoids false positives ([47c9f98](https://github.com/santifer/career-ops/commit/47c9f984d8ddc70974f15c99b081667b73f1bb9a)) * **update-system:** cross-check GitHub Releases API when VERSION file is stale ([b0ee6eb](https://github.com/santifer/career-ops/commit/b0ee6ebfcec7920ea7590ada61f3c39324d22ebc)) * **update-system:** expand SYSTEM_PATHS to cover all language modes and current scripts ([34fe3fb](https://github.com/santifer/career-ops/commit/34fe3fbd5782f7f57faf8ef4a245fbee6275a040)) * use candidate name from profile.yml in PDF filename ([7bcbc08](https://github.com/santifer/career-ops/commit/7bcbc08ca6184362398690234e49df0ac157567f)) * use execFileSync to prevent shell injection in test-all.mjs ([c99d5a6](https://github.com/santifer/career-ops/commit/c99d5a6526f923b56c3790b79b0349f402fa00e2)) * use fileURLToPath for cross platform compatible paths in tracker scripts ([#32](https://github.com/santifer/career-ops/issues/32)) ([#58](https://github.com/santifer/career-ops/issues/58)) ([ab77510](https://github.com/santifer/career-ops/commit/ab775102f4586ae4663a593b519927531be27122)) * use hi@santifer.io in English README ([5518d3d](https://github.com/santifer/career-ops/commit/5518d3dd07716137b97bb4d8c7b5264b94e2b9e9)) ### Performance Improvements * compress hero banner from 5.7MB to 671KB ([dac4259](https://github.com/santifer/career-ops/commit/dac425913620fe0a66916dda7ba8d8fc4c427d51)) ## [1.6.0](https://github.com/santifer/career-ops/compare/v1.5.0...v1.6.0) (2026-04-26) ### Features * add Gemini CLI native integration and evaluator script ([#349](https://github.com/santifer/career-ops/issues/349)) ([0853486](https://github.com/santifer/career-ops/commit/0853486d2c01a35adafea2cc6b6d8c429b843588)) * add Gemini CLI native integration and evaluator script (closes [#344](https://github.com/santifer/career-ops/issues/344)) ([0853486](https://github.com/santifer/career-ops/commit/0853486d2c01a35adafea2cc6b6d8c429b843588)) * add LaTeX/Overleaf CV export mode with pdflatex compilation ([#362](https://github.com/santifer/career-ops/issues/362)) ([b824953](https://github.com/santifer/career-ops/commit/b824953d0e3b7f8c6105dfcce7e17257c95ce6cd)) * add LaTeX/Overleaf CV export mode with pdflatex compilation (closes [#47](https://github.com/santifer/career-ops/issues/47)) ([b824953](https://github.com/santifer/career-ops/commit/b824953d0e3b7f8c6105dfcce7e17257c95ce6cd)) * **cv:** add cv.output_format to route between html and latex generation ([b82bb5f](https://github.com/santifer/career-ops/commit/b82bb5fb7c86ab3074a54eaf0f3186f81d41f417)) * **dashboard:** add rejected and discarded pipeline tabs ([7d05967](https://github.com/santifer/career-ops/commit/7d05967389fb6185f0d6e566a4ba583ee3824e1e)) * **dashboard:** show tracker IDs in pipeline list ([8d289c6](https://github.com/santifer/career-ops/commit/8d289c64e31f81cf447f75105b500d1feca21058)) * **latex:** add tectonic engine auto-detect with pdflatex fallback ([4b71b2c](https://github.com/santifer/career-ops/commit/4b71b2cbf4fd49d3882cdd8767e31727337fab34)) * **portals:** add Canada/Vancouver and automation companies to example template ([590ba6e](https://github.com/santifer/career-ops/commit/590ba6e1b4b9d2d9d03893b7f5fdae920d4f9a0b)) ### Bug Fixes * **ci:** correct first-interaction@v3 input names ([c5196a8](https://github.com/santifer/career-ops/commit/c5196a8dd8ff05da51c72ea151f67e481f12c329)) * **ci:** gracefully handle missing dependency graph in dependency-review ([#343](https://github.com/santifer/career-ops/issues/343)) ([7c5fecb](https://github.com/santifer/career-ops/commit/7c5fecb00d60521f77b33724eb345a28257d8832)) * **ci:** gracefully handle missing dependency graph in dependency-review workflow ([#352](https://github.com/santifer/career-ops/issues/352)) ([7c5fecb](https://github.com/santifer/career-ops/commit/7c5fecb00d60521f77b33724eb345a28257d8832)) * **liveness:** detect closed postings with applications-closed banner variants ([7f8217e](https://github.com/santifer/career-ops/commit/7f8217e057b327980a797a682c4f01d3318edbbe)) * **merge-tracker:** filter seniority and location stopwords + require overlap ratio in roleFuzzyMatch ([7821113](https://github.com/santifer/career-ops/commit/7821113261eeb32f99639ff076651ab2e7757209)) * **pt:** restore diacritical marks in PT-BR modes ([#358](https://github.com/santifer/career-ops/issues/358)) ([3a4c596](https://github.com/santifer/career-ops/commit/3a4c596cb0a522f562ba38b35c210facaf38a503)) * **pt:** restore diacritical marks in PT-BR modes ([#359](https://github.com/santifer/career-ops/issues/359)) ([3a4c596](https://github.com/santifer/career-ops/commit/3a4c596cb0a522f562ba38b35c210facaf38a503)) * **update-system:** cross-check GitHub Releases API when VERSION file is stale ([b0ee6eb](https://github.com/santifer/career-ops/commit/b0ee6ebfcec7920ea7590ada61f3c39324d22ebc)) * **update-system:** expand SYSTEM_PATHS to cover all language modes and current scripts ([34fe3fb](https://github.com/santifer/career-ops/commit/34fe3fbd5782f7f57faf8ef4a245fbee6275a040)) ## [1.5.0](https://github.com/santifer/career-ops/compare/v1.4.0...v1.5.0) (2026-04-14) ### Features * add --min-score flag to batch runner ([#249](https://github.com/santifer/career-ops/issues/249)) ([cb0c7f7](https://github.com/santifer/career-ops/commit/cb0c7f7d7d3b9f3f1c3dc75ccac0a08d2737c01e)) * add {{PHONE}} placeholder to CV template ([#287](https://github.com/santifer/career-ops/issues/287)) ([e71595f](https://github.com/santifer/career-ops/commit/e71595f8ba134971ecf1cc3c3420d9caf21eed43)) * **dashboard:** add manual refresh shortcut ([#246](https://github.com/santifer/career-ops/issues/246)) ([4b5093a](https://github.com/santifer/career-ops/commit/4b5093a8ef1733c449ec0821f722f996625fcb84)) ### Bug Fixes * add stopword filtering and overlap ratio to roleMatch ([#248](https://github.com/santifer/career-ops/issues/248)) ([4da772d](https://github.com/santifer/career-ops/commit/4da772d3a4996bc9ecbe2d384d1e9d2ed75b9819)) * **dashboard:** show dates in pipeline list ([#298](https://github.com/santifer/career-ops/issues/298)) ([e5e2a6c](https://github.com/santifer/career-ops/commit/e5e2a6cffe9a5b9f3cec862df25410d02ecc9aa4)) * ensure data/ and output/ dirs exist before writing in scripts ([#261](https://github.com/santifer/career-ops/issues/261)) ([4b834f6](https://github.com/santifer/career-ops/commit/4b834f6f7f8f1b647a6bf76e43b017dcbe9cd52f)) * remove wellfound, lever and remotefront from portals.example.yml ([#286](https://github.com/santifer/career-ops/issues/286)) ([ecd013c](https://github.com/santifer/career-ops/commit/ecd013cc6f59e3a1a8ef77d34e7abc15e8075ed3)) ## [1.4.0](https://github.com/santifer/career-ops/compare/v1.3.0...v1.4.0) (2026-04-13) ### Features * add GitHub Actions CI + auto-labeler + welcome bot + /run skill ([2ddf22a](https://github.com/santifer/career-ops/commit/2ddf22a6a2731b38bcaed5786c4855c4ab9fe722)) * **dashboard:** add Catppuccin Latte light theme with auto-detection ([ff686c8](https://github.com/santifer/career-ops/commit/ff686c8af97a7bf93565fe8eeac677f998cc9ece)) * **dashboard:** add progress analytics screen ([623c837](https://github.com/santifer/career-ops/commit/623c837bf3155fd5b7413554240071d40585dd7e)) * **dashboard:** add vim motions to pipeline screen ([#262](https://github.com/santifer/career-ops/issues/262)) ([d149e54](https://github.com/santifer/career-ops/commit/d149e541402db0c88161a71c73899cd1836a1b2d)) * **dashboard:** aligned tables and markdown syntax rendering in viewer ([dbd1d3f](https://github.com/santifer/career-ops/commit/dbd1d3f7177358d0384d6e661d1b0dfc1f60bd4e)) ### Bug Fixes * **ci:** use pull_request_target for labeler on fork PRs ([#260](https://github.com/santifer/career-ops/issues/260)) ([2ecf572](https://github.com/santifer/career-ops/commit/2ecf57206c2eb6e35e2a843d6b8365f7a04c53d6)) * correct _shared.md → _profile.md reference in CUSTOMIZATION.md (closes [#137](https://github.com/santifer/career-ops/issues/137)) ([a91e264](https://github.com/santifer/career-ops/commit/a91e264b6ea047a76d8c033aa564fe01b8f9c1d9)) * replace grep -P with POSIX-compatible grep in batch-runner.sh ([637b39e](https://github.com/santifer/career-ops/commit/637b39e383d1174c8287f42e9534e9e3cdfabb19)) * test-all.mjs scans only git-tracked files, avoids false positives ([47c9f98](https://github.com/santifer/career-ops/commit/47c9f984d8ddc70974f15c99b081667b73f1bb9a)) * use execFileSync to prevent shell injection in test-all.mjs ([c99d5a6](https://github.com/santifer/career-ops/commit/c99d5a6526f923b56c3790b79b0349f402fa00e2))