career-ops-v1.34.0

cloudflare/agentscareer-ops-v1.34.0Sep 24, 2026by career-ops-release[bot]

Upgrading?

AI Summary

This release improves the update system to only prompt for actual new versions, introduces new job board providers, and enhances liveness checks using public APIs.

Key Highlights

  • Update prompts now only appear for actual new versions, not when tracking the main branch.
  • Added new job board providers: Python.org Jobs and generalist-world board.
  • Improved liveness checks using Greenhouse, SmartRecruiters, and Arbeitsagentur APIs.
  • Opt-in strict location filter now fails closed on empty locations.
  • Added domain-level detection for aggregator reposts and explicit Personio tenant pinning.

New Features

  • Python.org Jobs provider
  • Generalist-world board provider
  • Explicit Personio tenant pin support

Full Release Notes

<!-- co:release-notes:career-ops-v1.34.0 -->
This is the first release since I started working on career-ops full time. The update prompt now shows up only when a new version is actually out. Until now, almost any change landing on `main` could trigger it, often every day. This release also carries work from 63 people, 43 of them contributing for the first time.

### Highlights

- **Update prompts only for new versions.** `update-system.mjs` installs the latest published release instead of `main`, `check` asks only when a newer release exists, and saying no lasts until the next version instead of forever. Tracking `main` stays available with `--channel main`. Built on @obielin's release resolution in #3845.
- **Fewer live offers marked as closed.** Liveness now checks company pages with a Greenhouse `gh_jid`, SmartRecruiters, Arbeitsagentur and We Work Remotely through their public APIs (#4444), and a careers page that loads its ATS in an iframe is no longer read as a dead posting (#4439), both by @luochen211.
- **Sharper scans.** Domain-level detection of aggregator reposts by @vaishaldsouza (#4263), an opt-in strict location filter that fails closed on empty locations by @Zoubeir23 (#4033), blacklist rows that can cover a whole domain (#4169), and a warning when a portal returns zero jobs without a single successful response (#4441), both by @luochen211.
- **New sources.** A Python.org Jobs provider by @lasithadilshan (#4173), a generalist-world board provider by @ConnorCloze (#4100) and an explicit Personio tenant pin by @duathron (#4001), all three first contributions.

### Updating

Your agent offers this update at the start of your next session. If you declined an update prompt before, run this once to pick it up:

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

New installs: `npx @santifer/career-ops init`.

### Thank you

This release carries 112 pull requests from 63 people, 43 of them contributing for the first time.

- @luochen211: #4168, #4169, #4308, #4369, #4370, #4371, #4372, #4373, #4377, #4378, #4438, #4439, #4440, #4441, #4442, #4443, #4444, #4451
- @Zoubeir23: #4033, #4046, #4144, #4147, #4215, #4254, #4280, #4285
- @rubicon: #3995, #4009, #4072, #4095, #4116, #4405, #4419
- @abankar1: #3246, #3994, #3996, #4208
- @maxmilian: #3925, #4028, #4074
- @pmxlr8 (first contribution): #4270, #4283, #4305
- @AdilAzhariOmsan: #4235, #4259
- @ConnorCloze (first contribution): #4100, #4264
- @duathron (first contribution): #3999, #4001
- @ilyakanevskiy: #4238, #4252
- @jaybarrett34 (first contribution): #4064, #4065
- @jsmith7735 (first contribution): #4151, #4152
- @prasta1 (first contribution): #4174, #4324
- @rajatvarna (first contribution): #4145, #4146
- @Schlaflied: #3638, #4096
- @SulimanAbdulrazzaq (first contribution): #4240, #4288
- @Tedion (first contribution): #4247, #4248
- @TianHengZhuang (first contribution): #4244, #4376
- @aohl1986-ohlcenter (first contribution): #4048
- @aron-intframe (first contribution): #3944
- @artemtrofymenko: #4284
- @ashiwanikumar (first contribution): #4119
- @ayushi-wq (first contribution): #3190
- @BrianChung95 (first contribution): #4267
- @c020627 (first contribution): #4041
- @chshiv (first contribution): #4023
- @coolchigi: #4194
- @Duyanh090205 (first contribution): #3958
- @eliador90: #3974
- @evgenyponomarev (first contribution): #3814
- @Fayaz-jani-git (first contribution): #2964
- @felipe-NR: #4183
- @glenelkin (first contribution): #3436
- @harshkumar18-bzz (first contribution): #4293
- @JarnDev (first contribution): #4191
- @javimateo (first contribution): #4292
- @jduffey1990 (first contribution): #4066
- @JigarDPrajapati (first contribution): #4137
- @kellymmcgrath: #4296
- @L4XB (first contribution): #4142
- @lasithadilshan (first contribution): #4173
- @mbrow190: #4112
- @mcgalleg (first contribution): #4132
- @MicBun (first contribution): #3536
- @mkriegl (first contribution): #4156
- @Natchica (first contribution): #4291
- @nikitacometa: #3926
- @obielin: #3845
- @peppe1337 (first contribution): #3954
- @prateek942 (first contribution): #4239
- @Rayan-and-beyond (first contribution): #4122
- @rickvian (first contribution): #4282
- @Rkrijn (first contribution): #4258
- @sebastienfi: #4089
- @sloemo01 (first contribution): #4331
- @snuuym (first contribution): #4300
- @TapiocaQAQ (first contribution): #4075
- @tasmiarahmantanjin: #3161
- @Thibaultjaigu (first contribution): #4030
- @vaishaldsouza: #4263
- @vliggio: #3906
- @wajahathussain81 (first contribution): #2322
- @ZxlDragonDoctor (first contribution): #4051
<!-- /co:release-notes -->

## [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` ([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))

Related Repositories