This release widens where career-ops looks: nine new job sources, from the applicant systems of US school districts to OCC Mundial in Mexico. It carries work from 86 people, 50 of them contributing for the first time.
Highlights
- Nine new job sources. AppliTrack, NEOGOV, Red Rover and SchoolSpring, used by US K-12 districts and community colleges, by @raymondwilliamskc (#4360). HiringRoom by @cRolandoJr (#4460), OCC Mundial by @VictorMeneses77 (#3748), and Eploy, PeopleSoft Candidate Gateway and PrevueAPS by @Schlaflied (#4055, #3739, #3919). BambooHR, already supported, is now part of the full scan (
scan:full), by @ilyakanevskiy (#4365). - A master career profile you review fact by fact.
node career-profile.mjs import --reviewreads your CV and lets you approve, edit or skip each fact; only approved facts are saved, andvalidatechecks the result. Also available as/career-ops master-profile. By @Kilaa13 (#4456). - CV details. An optional professional title under your name by @Zoubeir23 (#3763), an optional one-line
contextfor each experience entry by @lesiashu (#4049), and a guard that stopsgenerate-pdffrom printing work experience out of chronological order, by @abp002, who picked up @kmichels' #2343 (#4489). - Your data root, in more scripts. If your data lives outside the code checkout (
CAREER_OPS_ROOT), CV and cover letter PDFs now find it, by @shaurya20335 (#4486) and @marcosfemonteiro (#4314), and so doset-statusby @abankar1 (#3988),hired-share,reply-watch,paste-replyandbatch-tailorby @alejandra-dahl (#4571, #4570), andfix-slugsandvalidate-portalsby @SulimanAbdulrazzaq (#4287). - Install and update.
npm installno longer fails on Linux distributions withoutapt-get, such as Fedora, by @Zoubeir23 (#4233).npx @santifer/career-ops initno longer fails atnpm installon Windows, by @samintisar (#4572).node update-system.mjs statusprints your version and commit, by @Shaamak (#3897).
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 --confirmOn 1.33 or earlier the prompt may say your system files differ: say yes. Coming from 1.33 or earlier, that first update installs the current main rather than this release. Your CV, profile, tracker and reports are not touched, and there is nothing else to do.
If you updated from 1.33 or earlier after 1.34.0 came out, your install may report 1.34.0 while running a later snapshot of main. This update moves it forward to the 1.35.0 release.
New installs: npx @santifer/career-ops init.
Thank you
This release carries 161 pull requests from 86 people, 50 of them contributing for the first time.
- @Zoubeir23: #3546, #3547, #3548, #3549, #3763, #3955, #4138, #4143, #4159, #4160, #4216, #4217, #4233, #4479
- @rubicon: #3879, #3959, #3997, #4006, #4035, #4043, #4400, #4402, #4427, #4470, #4530
- @ilyakanevskiy: #3530, #3754, #4053, #4057, #4336, #4353, #4365, #4414, #4467
- @Schlaflied: #3739, #3917, #3919, #4055, #4060, #4099, #4276, #4507
- @abankar1: #3319, #3982, #3988, #3990, #4227, #4348, #4350
- @mbrow190: #3632, #4105, #4108, #4110, #4111, #4113
- @nikitacometa: #3928, #3930, #3931, #3932, #3969, #3972
- @cRolandoJr (first contribution): #4458, #4460, #4476
- @egurnov (first contribution): #4619, #4626, #4628
- @vliggio: #3813, #4480, #4481
- @alejandra-dahl (first contribution): #4570, #4571
- @andrgavrilenko: #3566, #3603
- @barkaaa: #3957, #4491
- @IaroslavMazur: #4318, #4319
- @kg290 (first contribution): #4555, #4556
- @L4XB: #4080, #4154
- @Leftyshields (first contribution): #4200, #4210
- @luochen211: #4499, #4501
- @maxmilian: #4039, #4040
- @pmxlr8: #4306, #4432
- @prasta1: #4120, #4323
- @shaurya20335 (first contribution): #4446, #4486
- @sloemo01: #4332, #4334
- @tarang-tj: #3477, #3482
- @yuki-uix: #3968, #3991
- @3deep0019 (first contribution): #4615
- @Abhishek84313: #4415
- @abp002 (first contribution): #4489
- @AdilAzhariOmsan: #4019
- @aiapienthusiast (first contribution): #4611
- @AnonZ7 (first contribution): #4391
- @artemtrofymenko: #4559
- @BigBrown10: #3261
- @bigguy6883: #3975
- @binggao1230 (first contribution): #4518
- @cernoh (first contribution): #4157
- @clede: #2546
- @configurowebmax (first contribution): #2626
- @croogie (first contribution): #4410
- @darkpandawarrior: #3302
- @DeepMangeshT (first contribution): #4625
- @DevangBanda (first contribution): #1297
- @DhawalAg (first contribution): #3648
- @elmaroun07-hub (first contribution): #4504
- @Enixes (first contribution): #4620
- @felipe-NR: #4182
- @FReptar0: #4125
- @gitraun (first contribution): #2572
- @haichteque (first contribution): #4649
- @hannafady (first contribution): #4397
- @hardik2004gupta (first contribution): #3561
- @ixley (first contribution): #4431
- @jamesjfoong (first contribution): #4623
- @jamin84 (first contribution): #4621
- @Keeferf (first contribution): #4515
- @Kilaa13 (first contribution): #4456
- @lakshaydevoo-arch: #3943
- @lesiashu (first contribution): #4049
- @liting0216 (first contribution): #2202
- @marcosfemonteiro (first contribution): #4314
- @mbaljeetsingh (first contribution): #4461
- @Meng991003 (first contribution): #4343
- @MincongZhou (first contribution): #4398
- @mrbese (first contribution): #4517
- @Object-ions (first contribution): #4629
- @octo-patch: #4650
- @PeraSoluciones (first contribution): #4422
- @peterbussch (first contribution): #4510
- @pmgwee (first contribution): #4313
- @Priyans-Lathiya: #3945
- @rafaelreis-r (first contribution): #2779
- @raymondwilliamskc (first contribution): #4360
- @ringo380: #4366
- @samintisar (first contribution): #4572
- @santichausis (first contribution): #4636
- @Sarvesh0033 (first contribution): #4608
- @SAY-5: #3357
- @Shaamak: #3897
- @SulimanAbdulrazzaq: #4287
- @Syed-Haseeb97: #4007
- @toratsugumi37 (first contribution): #4558
- @Viceversa98 (first contribution): #3373
- @VictorMeneses77 (first contribution): #3748
- @williamchong (first contribution): #4606
- @Wintch (first contribution): #4503
- @ybai08 (first contribution): #4627
1.35.0 (2026-10-01)
Features
- add Hermes Agent headless CLI support (#4623) (a6b867a)
- add reviewed master career profile import (#4456) (221880c)
- cli: register Pi as a supported CLI host (#4157) (#4157) (74c5d17)
- cv: optional professional-title headline slot under the name (#3763) (c95d62c)
- dashboard: add posted-date sort mode (#3648) (c952926)
- explorer: free banded title-vs-profile fit hint on discovery cards (#3261) (b080539)
- local-parser: pass an optional postedAt through (#4057) (ac5db3a)
- oferta: opt-in Brazil PcD-quota check (Lei 8.213/91) as a Block A signal (#2779) (da8abc3)
- patterns: report predicted discard reasons separately (#4110) (3342f9d)
- pdf: add optional
contextline to CV experience entries (#4049) (5fde93e) - pdf: guard CV work experience against non-chronological order (#4489) (b069f62)
- plugins: expose the canonical posting-URL key through ctx (#4332) (ac2696e), closes #4218
- providers: add applitrack, neogov, redrover and schoolspring for K-12 and college boards (#4360) (0d3d669)
- providers: add BambooHR as a 6th scan:full source (#4365) (2ef2184)
- providers: add HiringRoom provider (legacy /jobs and JSON-LD /portal/jobs) (#4460) (c7e5648)
- providers: OCC Mundial — Mexico's dominant job board (#3748) (5118d35)
- scan: add Eploy provider (#4055) (d5f680b)
- scan: add PeopleSoft Candidate Gateway provider (#3739) (addd6e4)
- scan: add PrevueAPS provider (providers/prevueaps.mjs) (#3919) (dbdf2b6)
- scan: bridge scan-history → discover-ats (auto-propose scanned-but-untracked companies) (#4182) (3321861)
- ui: stream matched job cards into results during scan (#4200) (78e13ca)
- update-system: add status command and local_sha to check output (#3883) (#3897) (a3ca457)
- validate-profile: config/profile.yml is never validated, so a misspelled key silently does nothing (#3981) (#3982) (3421cb6)
Bug Fixes
- analyze-patterns: validate threshold and vendor flags (#4007) (66d6252)
- application-answers: find the draft block by a trailing (draft) marker (#4432) (ffe3325)
- application-answers: parse Block H when its heading is localized (#4400) (271f23f)
- avature: read article--jobs cards, titled from the h3 anchor (#4559) (fbed00a)
- batch-evaluate: _profile.md and tracker-additions resolve to the code root (#4347) (#4348) (5dea657)
- batch: fail closed on no-op workers and archive the verbatim JD (#4422) (b78e5f8), closes #4421
- batch: resolve batch-prompt.md placeholders to stable labels (#4517) (b556085)
- canonical states, data-root paths, pipeline parser, and link regex (#3559) (#3561) (5f7819f)
- ci: pin the upgrade gate to the main channel so it stays hermetic (#4470) (43e3ee0)
- cli: scan-hn.mjs delegates --help and unknown flags to lib/cli-flags.mjs (#4627) (80e6dc0), closes #4598
- cli: validate scan-interamt flags before a live scan (#4629) (a0cfa60), closes #4599
- cover: fill {{RECIPIENT_BLOCK}} so pack cover templates render (#4043) (8e16594)
- dashboard: stop level-code digits from shadowing the real Pay figure (#4626) (cfc92c0)
- dashboard: target the correct tracker file, row, and status cell (#3932) (64f1a7d)
- data-root: generate-pdf and set-status resolve the tracker from the code directory (#4486) (d4d2186)
- data-root: hired-share, reply-watch and paste-reply resolve the configured data root (#4571) (ffe6353)
- doctor: checkDependencies and checkTrackedBakFiles read the code root (#4138) (a379ff4)
- doctor: make Git diagnostics locale independent (#4501) (8cda54a)
- eval: date reports with the local calendar day, not the UTC one (#4227) (6f6ccd2)
- followup-cadence: don't read word-glued #N tags as row cross-references (#4461) (89cf7bf)
- followup-cadence: parseAppliedDate matches gapped ATS phrasing (#4143) (fc12587)
- generate-latex: --help is read as a filename, and a mistyped flag becomes the output path (#4446) (b811a93)
- generate-pdf: key the PDF manifest on report number and artifact kind (#3959) (10e789a)
- generate-pdf: recognize Spanish section titles in the section-order guard (#4476) (4eaf2da)
- gitignore: ignore data/agent-inbox.md (#4503) (e00b1ba)
- gitignore: ignore symlinked user-layer directories (#4555) (9b461d8)
- i18n: teach the headed tracker-addition TSV in localized prompts (#3702) (#3813) (07b4df4)
- lock: clamp the retry backoff to the per-holder deadline (#4402) (ffc2a7a)
- merge-tracker: a one-sided req number no longer merges into a duplicate row (#4276) (368c28f)
- merge-tracker: match on identical report file, ahead of the company guard (#4507) (a55d765)
- merge-tracker: reject entry matches across req IDs (#4556) (b41a04a)
- outcome,tracker: stamp the local calendar day, not the UTC one (#3989) (#3990) (cbdddfc)
- paths: resolve user-layer files via the data root in batch-tailor, cv-templates and openrouter-runner (#4570) (cda5b0a)
- pdf: drop optional sections that arrive as a bare header (#3997) (94fcdbb)
- pdf: use workspace styling for batch and imported renders (#4111) (f7e9708)
- pipeline: preserve unknown scores when reconciling reports (#3969) (1e273a1)
- portals: read the data root's portals.yml in fix-slugs and validate-portals (#4287) (814e0ca)
- postinstall: drop --with-deps, which fails on non-Debian/Ubuntu Linux (#4233) (428619d)
- providers: detect dead Workday boards via Workday's own maintenance/outage signals (#4467) (5ed8af5)
- providers: filter Pinpoint/Recruitee seeded demo postings (#4190) (#4217) (62fc722)
- providers: fold country into the primary location on Ashby, Recruitee and Breezy (#4628) (e1ebeff)
- providers: read greenhouse embed slug, support myworkdaysite boards (#4515) (3e028d9)
- providers: recruitee joins multi-location offers, drops title-less rows (#4414) (8c9aae3)
- providers: refuse redirects by default in _http.mjs (#4080) (5e115ba)
- providers: rippling switches to the v2 same-origin board API (#4353) (fd0a0fb)
- providers: support MokaHR's international hire-r1.mokahr.com host (#4606) (8fb1756)
- providers: telegram-channel stops reading a multi-pipe tag as the employer (#4479) (492efa4)
- rejection-latency: the company key deletes combining marks (#4349) (#4350) (d62a74f)
- reports: stamp local date in stats.mjs and analyze-patterns.mjs report headers (#4608) (c03d27a)
- reserve-report-num.mjs skip batch-state "failed" report numbers (#4391) (8aa8ed4)
- role-matcher: keep one-sided level siblings distinct (#4060) (b2abe2a)
- route zh/zh-TW pipeline report numbering through reserve-report-num.mjs (#3991) (b23dbd2)
- scaffolder: run npm install on Windows without spawning npm.cmd (#4572) (fe289aa)
- scan-hn: report Gemini errors instead of zero offers (#4504) (150b39e)
- scan: close companyMatch corporate-form follow-ups from #3957 (#4491) (48715f4)
- scan: detect astral word edges in location keywords on Node 26 (#4478) (#4480) (f327137)
- scan: fold diacritics on both sides of the title filter (#4458) (aa453bd)
- scan: migrate scan-runs.tsv onto the current schema (#4427) (483a100)
- scan: strip CJK/Korean corporate-form markers in companyMatch (#2570) (#3957) (5d1a638)
- scan: strip pipe-delimited location suffixes from role dedupe keys (#4621) (374e97f)
- scripts: resolve user-layer files against the data root, not the checkout (#4314) (db76028)
- set-status: the canonical tracker write path cannot find a configured tracker (#3987) (#3988) (4bd53be)
- stats: stop counting failure streaks from portals no longer probed (#4323) (361f792)
- telegram-channel: preserve employer and title fields in hashtag posts (#3928) (277ceef)
- tests: a killed test run leaves no trap for the next one (#3968) (d83a81d)
- tracker: migrate missing URL column (#4099) (04c9edc)
- tracker: recognize localized headers across Node, web, and Go (#3931) (a827945)
- update-system: a preserved directory with an unreadable upstream lookup no longer aborts the whole update (#3824) (#3955) (c4e5ecf)
- upskill: add testing + observability terms to the skill vocabulary (#4343) (f226408)
- use model-aware MiniMax context budgets (#4650) (5517ba0)
- validate rank pipeline CLI flags (#4625) (0717a4d)
- validate-portals: warn on a provider config block that sets no filter (#4619) (c77db08)
- verify-ats: recognize section headings in every language the repo ships (#4306) (f814dbf)
- verify-cv-facts: don't flag a cited posting requirement as a personal metric claim (#3917) (dbcf073)
- verify-cv-facts: stop reading a CV's own reworded prose as a tool claim (#4006) (e27c7b7)
- verify-pipeline: don't flag same company+role reports that carry distinct posting URLs (#4636) (96ff254)
- verify-pipeline: stop counting a SKIP row as a submission channel (#3978) (#4415) (6a6443a)
- verify-portals: report a live alternate the identity gate refused (#4334) (9e69056)
- web: the web tracker reader drops the Apply Link and Follow-up columns (#3603) (4be56a3)
- workday: skip the sequential retry when a board hit a structural limit (#4336) (8b587cf)
- zh-minimal: preserve ATS text extraction order + strip empty certifications section (#2202) (91e523d)