github career-ops-hq/career-ops career-ops-v1.34.0
career-ops v1.34.0: The Quiet Update

latest release: web-v0.12.0
3 hours ago

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:

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.

1.34.0 (2026-09-24)

Features

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

Bug Fixes

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

Don't miss a new career-ops release

NewReleases is sending notifications on new releases.