career-ops-v1.37.0
career-ops-hq/career-opscareer-ops-v1.37.0Oct 16, 2026by career-ops-release[bot]
Upgrading?
AI Summary
This release, titled 'Worth Your Time', introduces liveness checks to verify if tracked postings are still open and ensures every report opens with a prominent Verdict block. It adds new job board providers (Google, Ashby, Kalibrr, Platsbanken) and improves language support, along with updates to the Nix dev shell and LaTeX installer.
Key Highlights
- Liveness checks to verify if postings are still open with --discard-expired
- Reports now open with a Verdict block
- New providers: Google (first results only), Ashby (opt-in), Kalibrr, Tech in Asia, Platsbanken
- Language support via preferred_languages
- Opt-in local LaTeX installer and Nix dev shell improvements
New Features
- Assessment lifecycle and follow-up status controls
- Coverage-check explains why scanners missed a posting found by hand
- Fact gate reads German count claims
- Allow users to turn off follow-ups
- Opt-in local LaTeX installer so the latex path compiles out of the box
- Liveness check for open tracker rows
- Discard expired Evaluated tracker rows
- Nix dev shell works on a fresh NixOS clone
- Block G Signal 18, recruiter identity verification
- Verdict (lead) block on reports
- Plugins: register read-only workspace MCP plugin
- Portals: Latin America and cybersecurity sections
- Google provider (first results page only, per robots.txt)
- Kalibrr and Tech in Asia providers for Southeast Asia
- Platsbanken provider (Sweden's national job board)
- Ashby opt-in embed source for boards with API disabled
- Personio language versions from careers page
- Recruitee language versions and requirements
- Test-all: run discovered suites in parallel
- Upskill: show requirements behind recent skips
- CV studio edit model and API for tailored CVs
- ATS keyword coverage on report view
- Company evidence card on report
- Expand Analytics into progress and search stats
- Recurring skill gaps on CV page
- Show posting URL in tracker view
Full Release Notes
<!-- co:release-notes:career-ops-v1.37.0 --> This release is about knowing what is still worth your time: postings you are tracking get checked for you, and every report opens with its verdict. The dashboard work (interview prep, cover-letter drafts, row comparison) ships in web-v0.15.0. ### Highlights - **Is it still open?** `check-liveness.mjs --tracker` checks the postings behind your open tracker rows, and `--discard-expired` moves the Evaluated ones that closed to Discarded when you add `--apply` (it is a dry run otherwise), by @mbrow190 (#5177, #5241). When you find a posting by hand that the scan missed, `coverage-check` explains why, by @IaroslavMazur (#4849). - **Reports that lead with the call.** Every report now opens with a Verdict block, by @rubicon (#3960). Block G gains Signal 18, recruiter identity verification, by @stdOWL (#5080), and the fact gate reads German count claims, by @duathron (#5074). Signals 8 to 17 now load only when their trigger holds, so evaluations read a shorter prompt, by @mbrow190 (#5229). - **More places to look, in your language.** A Google provider that reads the first results page only, as robots.txt allows, and an opt-in Ashby embed source, by @kellymmcgrath (#4078, #4298). Kalibrr and Tech in Asia for Southeast Asia, by @rafifshaf-fun (#4420). Platsbanken, Sweden's national job board, by @gdut4140 (#5069). `preferred_languages` keeps the version of a posting in the language you apply in, by @ilyakanevskiy (#5285, with #4789, #5044, #5260, #5264). - **Your setup.** Follow-ups can be turned off, by @mbrow190 (#5164). An opt-in local LaTeX installer so the LaTeX path compiles out of the box, by @CaptainCo0L (#5133). The Nix dev shell works on a fresh NixOS clone, by @asinglesprinkle (#5073). ### Security - **providers:** a literal private IP host (such as `http://127.0.0.1/`) is now refused on the direct path too, not only behind a proxy (GHSA-jh4g-g3vm-m943). Reported by @gtyree, who also stopped the full ATS sweep from piling up thousands of idle connections in this release (#4841). ### Updating Your agent offers this update at the start of your next session. If it doesn't, run this once in your career-ops folder: ``` node update-system.mjs apply --confirm ``` Your CV, profile, tracker and reports are not touched. ### Thank you This release carries 263 pull requests from 61 people, 22 of them contributing for the first time. - @mbrow190: #2968, #3626, #3627, #3628, #3629, #4104, #4106, #4109, #5120, #5121, #5122, #5128, #5129, #5130, #5153, #5154, #5157, #5158, #5159, #5160, #5161, #5162, #5163, #5164, #5165, #5166, #5168, #5169, #5170, #5171, #5172, #5173, #5174, #5175, #5177, #5184, #5185, #5186, #5187, #5188, #5189, #5190, #5191, #5192, #5199, #5204, #5205, #5206, #5208, #5209, #5210, #5215, #5216, #5217, #5218, #5219, #5220, #5222, #5223, #5224, #5226, #5229, #5232, #5235, #5236, #5237, #5239, #5240, #5241, #5242, #5258, #5280, #5281, #5282 - @vliggio: #3908, #4907, #4917, #4919, #4922, #4923, #4925, #4926, #5055, #5056, #5060, #5061, #5062, #5065, #5066, #5067, #5077, #5092, #5108, #5109, #5116, #5117, #5137, #5139, #5147, #5150, #5305, #5308 - @ncoprod: #4969, #4970, #4971, #4972, #4973, #4974, #4975, #4976, #4977, #5002, #5003, #5005, #5006, #5007, #5033, #5034, #5035, #5036, #5041 - @rubicon: #3960, #4164, #4395, #4565, #4924, #4947, #4948, #5009, #5011, #5013, #5020, #5021, #5025, #5028, #5030, #5085, #5106, #5142, #5143 - @abankar1: #3998, #4575, #4579, #4581, #4583, #4939, #4941, #4942, #4944, #4946, #4950, #4951, #4952, #4954, #4956 - @SulimanAbdulrazzaq: #4913, #4914, #4985, #4986, #4987, #5053, #5054, #5265, #5266, #5324 - @ilyakanevskiy: #4789, #5044, #5260, #5264, #5283, #5285, #5302 - @roydonsequeira: #4927, #4928, #5015, #5075, #5244, #5299 - @theridgerugby (first contribution): #5046, #5047, #5049, #5050, #5086, #5102 - @IaroslavMazur: #4849, #4850, #4931, #4932, #5084 - @luochen211: #4642, #4645, #4868, #4871, #5294 - @vaishaldsouza: #5148, #5247, #5253, #5255, #5262 - @kellymmcgrath: #4078, #4298, #4466 - @Rkrijn: #4253, #4255, #4256 - @sloemo01: #5110, #5111, #5112 - @yuki-uix: #4996, #5017, #5123 - @asinglesprinkle (first contribution): #5068, #5073 - @bullitt186 (first contribution): #4835, #4997 - @Felix-Lai-12: #3873, #5070 - @Kevin-Boyle: #4905, #5254 - @pmgwee: #4310, #4317 - @TianHengZhuang: #4882, #5203 - @Zoubeir23: #4630, #5267 - @5ergioC (first contribution): #4858 - @adityap (first contribution): #4993 - @Anandb71 (first contribution): #5238 - @artemtrofymenko: #5045 - @ayushharyan19 (first contribution): #5249 - @CaptainCo0L (first contribution): #5133 - @chaitanya-y20 (first contribution): #5225 - @cristianchiriac (first contribution): #5051 - @dtownsend: #4187 - @duathron: #5074 - @euskode: #3782 - @felipe-NR: #5043 - @gdut4140 (first contribution): #5069 - @gtyree (first contribution): #4841 - @haichteque: #4994 - @HariomPCode: #4958 - @HuyTrinh22763: #5256 - @Jarvis-J-Jacob (first contribution): #4809 - @johncarmack1984 (first contribution): #5301 - @killianrms (first contribution): #4874 - @maxmilian: #3805 - @mc856: #5246 - @nikitacometa: #3927 - @piscespieces: #4818 - @rafifshaf-fun: #4420 - @RoJLD (first contribution): #5001 - @saddestmartian (first contribution): #5202 - @salesimonp-web (first contribution): #4934 - @Sarvesh0033: #5014 - @scs0209: #4989 - @sean0407 (first contribution): #4945 - @sghanna: #5321 - @silence-de (first contribution): #5032 - @stdOWL (first contribution): #5080 - @Tedion: #4246 - @vnk8071: #4729 - @walterenriquezphotography-hash (first contribution): #5105 - @yaserselvam: #4734 <!-- /co:release-notes --> ## [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)) <!-- co:release-sponsors:career-ops-v1.37.0 --> ## Sponsors [SerpApi](https://serpapi.com/career-ops-org) sponsors career-ops through its fiscal host, Open Source Collective. <!-- /co:release-sponsors -->
Related Repositories
The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.
The library for web and native user interfaces.
Node.js JavaScript runtime ✨🐢🚀✨
Agent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
A fancy self-hosted monitoring tool