This release is about not losing what you put in. Your CV, your PDF, your portals.yml, your tracker rows and your saved answers now survive interrupted writes, odd formatting and updates, and it comes from 48 people in one week, in the same days the career-ops Discord passed 5,000 members.
Highlights
- Updates that keep your files safe. The list of what the updater owns now lives in its own manifest, read without importing, and an install on 1.37.0 updates through a bridge list. Tested before release from 1.37.0 and older installs: apply and rollback left the user files we checked byte-identical. (#5563 by @vliggio)
- Writes that cannot half-happen.
cv.md,portals.ymland the generated PDF are replaced atomically, and every core lock now uses one protocol. (#5552, #5389 by @vliggio) - Batch, more in your hands.
--companylimits a run to the companies you name,--thin-actiondecides what happens when no JD text could be fetched, and workers apply your dealbreakers and record a finished SKIP. (#5526, #5547 by @zhangruyi1993, #5493 by @mbrow190) - More places to look. Computrabajo and Magneto365 for Latin America (#2650 by @configurowebmax), Atlassian (#5497 by @kellymmcgrath), Dover (#5565 by @IaroslavMazur), Zoho Recruit career sites (#5345 by @ilyakanevskiy) and white-label SuccessFactors sites in
scan:full(#5740 by @Schlaflied). - Following up, with less to remember. A duplicate check before you write a CV (#5735), take-home deadlines (#5736), interview invites read from an
.icsfile (#5744), all by @Schlaflied, andtracker.mjs query --csvfor your spreadsheet (#5624 by @mbrow190).
Security
- The web app's assisted apply could submit an application form when the text it typed contained a line break: line breaks are now removed from that text, and the fallback inserts it without pressing keys, so it no longer submits the form (GHSA-rm8h-2825-ww26, reported by @vliggio, #5770).
Updating
Run node update-system.mjs apply --confirm in your career-ops folder. If you said no to the update prompt earlier, this is the same command.
Thank you
This release carries 300 pull requests from 48 people, 17 of them contributing for the first time.
- @vliggio: #5347, #5351, #5355, #5389, #5390, #5481, #5483, #5487, #5488, #5489, #5491, #5492, #5501, #5502, #5503, #5504, #5505, #5506, #5507, #5508, #5537, #5538, #5540, #5542, #5549, #5550, #5551, #5552, #5553, #5556, #5563, #5576, #5578, #5579, #5580, #5582, #5583, #5584, #5591, #5592, #5593, #5594, #5595, #5596, #5597, #5598, #5599, #5600, #5601, #5602, #5603, #5604, #5605, #5606, #5607, #5608, #5609, #5635, #5636, #5637, #5638, #5639, #5640, #5641, #5642, #5643, #5644, #5646, #5647, #5648, #5649, #5650, #5651, #5652, #5654, #5656, #5657, #5658, #5661, #5665, #5670, #5671, #5673, #5676, #5679, #5681, #5682, #5683, #5692, #5693, #5695, #5696, #5697, #5699, #5701, #5702, #5704
- @mbrow190: #5131, #5149, #5152, #5155, #5156, #5176, #5178, #5211, #5212, #5221, #5233, #5234, #5259, #5304, #5309, #5310, #5312, #5360, #5361, #5455, #5456, #5457, #5461, #5464, #5465, #5466, #5467, #5468, #5469, #5470, #5471, #5472, #5473, #5475, #5476, #5479, #5480, #5485, #5493, #5495, #5499, #5500, #5509, #5518, #5519, #5520, #5557, #5559, #5560, #5562, #5624, #5625
- @ncoprod: #5004, #5037, #5038, #5039, #5042, #5088, #5089, #5090, #5091, #5271, #5272, #5273, #5274, #5275, #5276, #5277, #5436, #5437, #5438, #5439
- @abankar1: #4968, #4981, #4984, #5370, #5371, #5372, #5373, #5378, #5379, #5380, #5381, #5382, #5383, #5384, #5385, #5386, #5402
- @Schlaflied: #5409, #5411, #5417, #5430, #5447, #5450, #5452, #5516, #5735, #5736, #5740, #5744
- @artemtrofymenko: #5349, #5353, #5365, #5387, #5517, #5522, #5566, #5567, #5618
- @luochen211: #4646, #4866, #5293, #5341, #5342, #5343, #5668, #5672
- @yuki-uix: #3923, #5245, #5356, #5422, #5431, #5484, #5490, #5530
- @SulimanAbdulrazzaq: #5322, #5338, #5339, #5376, #5377, #5398, #5688
- @zhangruyi1993 (first contribution): #5296, #5334, #5391, #5521, #5525, #5526, #5547
- @rubicon: #5087, #5095, #5096, #5145, #5180, #5588
- @roydonsequeira: #5350, #5428, #5533, #5535
- @IaroslavMazur: #5539, #5541, #5565
- @maxmilian: #5119, #5332, #5399
- @tharun-37 (first contribution): #5362, #5451, #5453
- @WJiangH: #2730, #2731, #2732
- @Yoruxyv (first contribution): #5323, #5395, #5532
- @Dakshx07 (first contribution): #5352, #5366
- @DeryFerd (first contribution): #5524, #5574
- @gunjanjaswal: #5572, #5612
- @ilyakanevskiy: #5345, #5621
- @RetroHazard (first contribution): #5289, #5333
- @S3yon (first contribution): #5279, #5368
- @vaishaldsouza: #5250, #5311
- @vnk8071: #4727, #5367
- @3nvyx (first contribution): #5375
- @andrevandal (first contribution): #5401
- @BigBrown10: #3442
- @boo-chee (first contribution): #5617
- @brianmgray: #3233
- @configurowebmax: #2650
- @cristianchiriac: #5626
- @duathron: #4000
- @Ev3nt1ne (first contribution): #5327
- @gregaro: #5458
- @inzamol (first contribution): #5357
- @kellymmcgrath: #5497
- @mc856: #5486
- @mikjkd (first contribution): #5544
- @PeraSoluciones: #4487
- @Sarvesh0033: #5306
- @seintun (first contribution): #5392
- @suleman-dawood (first contribution): #5613
- @Tanmay9223: #2082
- @Thundernerd (first contribution): #5619
- @vikasgowda3007 (first contribution): #5394
- @yaserselvam: #5344
- @d-ulker: adopted in #5366
1.38.0 (2026-10-23)
Features
- assessment-log: track take-home and demo assignments with deadlines (#5736) (60644df)
- audit what title_filter.positive is actually doing (#2731) (0cb0052)
- batch: --company limits a run to named companies (#5526) (c87e0f0)
- batch: --status --summary prints the totals without the per-job table (#5525) (d69d76c)
- batch: --thin-action chooses what to do when no JD text could be fetched (#5547) (bac59f7)
- batch: print a progress line as each offer finishes (#5212) (071a233)
- batch: sync pipeline pending entries into batch-input.tsv (#3442) (c01c34d)
- batch: workers apply the dealbreaker gate and record a finished SKIP (#5493) (e2e99d6)
- company-funded: add siliconangle as an opt-in discovery source (#5334) (abda2b0)
- cv: support locking specific CV sections from AI modification (closes #2053) (#2082) (970cac7)
- debrief: update score, contacts, and the next follow-up after a debrief (#5509) (43bd09e)
- expand: count authored commits in the GitHub evidence step (#5667) (#5668) (05a170b)
- expand: optional GitHub evidence step from authored PRs (#5295) (#5343) (abb4b86)
- i18n: adopt Modes Turkish Localization (#5325) (#5366) (82eabdf)
- ics-interview: read an interview .ics into an active-interviews row (#5744) (5cca74c)
- interview-scoring: surface interview-process stages via culture_screen (#3233) (d9d8254)
- jd: support Workable in shared API-first JD fetching (#5484) (815fb4e)
- latam: fix ElEmpleo encoding, update Magneto URL, harden location filters & add Computrabajo (#2650) (57247d7)
- learn: add learn.mjs check and apply, the gate for learned rules (#5461) (8a1c80e)
- modes: add retro, the end-of-session review that proposes rules through learn.mjs (#5485) (03d21b9)
- modes: stop before Block A when a JD breaks a hard rule (#5466) (ff645d1)
- modes: unattended runs apply each gate's default and close on one line (#5476) (69a0548)
- oferta: accommodation-notice signal (Ontario seed), #2026 member (#5452) (defcfa9)
- oferta: add a Great Britain row to the candidate-paid fees table (#5515) (#5516) (a490911)
- oferta: candidate-paid fees signal (Ontario seed), #2026 member (#5450) (9aef8cb)
- oferta: unpaid-placement signal (Ontario seed), #2026 member (#5447) (042e729)
- oferta: vacancy-status disclosure signal (Ontario seed), #2026 member (#5430) (d33cbb2)
- onboarding: write profile and portals with one script call (#5479) (ecddedc)
- pdf: opt-in page_format: auto picks the paper size from the employer's country (#5145) (a078dda)
- pipeline: add an unreadable bucket to the run summary (#5409) (060b5a8)
- profile: prepare CV bullets from selected verified facts (#5530) (35b4851)
- providers: add atlassian (one public JSON feed) (#5497) (ce7c01d)
- providers: add BWI GmbH careers-site provider (#4000) (9717a7f)
- providers: add Dover careers-page provider (#5565) (b6e0c2d)
- providers: add zoho recruit career sites, with opt-in detail enrichment (#5345) (ffe58b5)
- remember the agent CLI for doctor, the ranker and the web (#5467) (79965b3)
- reports: show the decision line in translated reports (#5500) (fd16c50)
- reuse public job facts from local evaluation reports (#4646) (15f3087)
- scan-ats-full: detect white-label SuccessFactors career sites (#5740) (d8886bf)
- scan: allow disabling remote-title location fallback (#5490) (43b39d8)
- scan: print a timestamped progress line on stderr every 25 sources (#5472) (5be9678)
- scan: record the titles the filter rejects (#2732) (cbc60da)
- tracker: add closing-soon.mjs to surface Evaluated rows closing soon (#5417) (9e4326b)
- tracker: add query --csv for spreadsheet export (#5624) (7c7f3ae)
- tracker: add reeval-candidates.mjs to list rows scored before evidence changed (#5672) (c46179c), closes #5669
- tracker: filter tracker query by --min-score (#5560) (1250467)
- tracker: precheck-duplicate - read-only pre-apply duplicate check (#5735) (7ac802d)
- verify-portals: --unmined finds companies stuck in search_queries (#2730) (d957bc6)
- web: add npm run ui launcher script and server daemon (#5357) (feb5936)
- web: pdf-ready and follow-up seed actions for the apply checklist (#5304) (0818cae)
- web: scheduled scans on macOS and Linux (#5401) (02a5902)
Bug Fixes
- add-entry,fix-slugs: replace cv.md and portals.yml atomically (#5552) (a3ff86b)
- analyze-patterns: read the tracker through resolveTrackerPath() (#5540) (fa0ae21)
- answers: ignore archived fenced section headings (#5436) (7db28ef)
- apify: write JD frontmatter with js-yaml instead of yamlEscape (#4961) (#5306) (c2742ed)
- apply: keep apply inside the project and off the user's Chrome (#5499) (60a68d4)
- archive: retain captures for distinct same-title postings (#5271) (9f322c0)
- artifacts: place default bundles under the configured data root (#5277) (91112c1)
- batch-tailor: propagate failed worker exits (#5438) (57de348)
- batch: add grok workers, a worker time limit, and closed stdin (#5473) (9ee02dd)
- batch: add the Runtime profile block only when CAREER_OPS_PROFILE is set (#5567) (a0fa30b)
- batch: check the rate-limit throttle again before launching the next offer (#5522) (ea3bc9c)
- batch: drop stray bot comments from Gemini report headers (#5550) (56d2e74)
- batch: keep --company off shared ATS domains and single-dash values (#5750) (ef717fe)
- batch: keep headless workers out of the user's rule files (#5455) (8fb6cc4)
- batch: let --dry-run list the queue without the agent CLI (#5559) (46fb5ac)
- batch: put the report number in the batch worker's CV file names (#5391) (0348310)
- batch: read batch-state.tsv rows without collapsing empty cells (#5338) (ab3782b)
- batch: recover a thin JD from the page's structured data before falling back to WebFetch (#5521) (cb34471)
- batch: resolve the profile through path-resolver so CAREER_OPS_PROFILE reaches batch runs (#5544) (ac648cb)
- batch: route economy spend tier to Haiku 5.5 (#5289) (d564122)
- browser-extract: tell a taken-down posting from an unrendered page (#5296) (c8fb06d)
- ci: keep the upgrade gate off the GitHub ref API (#5387) (5b3bc4e)
- ci: put a time limit on the test workflow's jobs (#5578) (af665e6)
- cli: read --flag=value in doctor, upskill and update-system (#5673) (bd3578d)
- comeet: recover valid hosted posting URLs (#5039) (b3cffc3)
- cover-letter: count the candidate's answers as fact sources (#5495) (3e9ebf8)
- coverage-check: survive a stray % in the URL and a missing portals.yml (#5339) (d172d2e)
- cv-sync-check: stop reading time windows as hardcoded metrics (#5470) (f95c4ed)
- dashboard: keep tracker pipe rows whose notes contain a tab (#5651) (4eb33ba)
- dashboard: read only the report header when filling in missing job URLs (#5489) (81fc911)
- dashboard: render only the visible pipeline rows (#5506) (d927f93)
- dashboard: show work modes through the language catalog (#5557) (328eb1a)
- dedup: match corporate-form suffix twins in dedup-tracker.mjs (#4487) (fe9705f)
- discover-new-companies: skip companies tracked by board (#5539) (bccf15b)
- discover-new-companies: stop cutting piped output at 64 KiB (#5541) (8795fe8)
- discover: respect data/blacklist.md in discover-new-companies and discover-ats (#5333) (26d6331)
- docker: let ./cops bash -c '...' run the script (#5638) (7fe62e8)
- docker: make ./cops rebuild refresh the node_modules volume (#5639) (1876161)
- docker: verify the Go tarball's SHA-256 before installing it (#5665) (a58ec93)
- docs: resolve user-layer paths and tracker TSVs against the data root (#5347) (306b924), closes #5346
- doctor,update: clear errors from a copy with no node_modules or no .git (#5658) (16d6fc1)
- doctor: diagnose half-filled profile sections using core sectionState (#5126) (#5311) (afefa44)
- doctor: flag an empty profile as unpersonalized and compare against the checkout template (#5340) (#5344) (b21181c)
- doctor: only suggest renaming the experience heading when none was found (#5562) (4e5ca36)
- doctor: report why Chromium failed to launch instead of "not installed" (#5676) (1718c28)
- eval: archive the verbatim JD in gemini, batch-gemini and openrouter reports (#5671) (868f0f5)
- expand: normalize candidate.github to a username before the API call (#5341) (6146f6e)
- expand: read every page of the repo list and skip forks (#5342) (a475ec0)
- fact-gate: run the gate on every CV renderer and read respelled and structured claims (#5348) (#5351) (68a78bf)
- fix-slugs: find a company block by its parsed name when quoted or followed by a comment (#5322) (dc3f40e)
- followup-cadence: read the apply date from status-log.tsv (#5469) (c2e553c)
- followups: skip the launchd sweep when follow-ups are off (#5312) (630c8c8)
- gem: strip markup before decoding entities in job descriptions (#5549) (7c5c205)
- generate-pdf: find locked sections under an H1 title in cv.md (#5749) (0e541d3)
- generate-pdf: render markdown italic in CVs as (#5619) (f3950bc)
- generate-pdf: replace the pdf atomically so a failed write keeps the old one (#5259) (37cd9ec)
- gitignore: ignore a personal .hermes.md (#5607) (6a6467c)
- himalayas: follow bounded cursor pagination (#5042) (c2b5d14)
- hired-share: retain concurrent never-share decisions (#5274) (12310ad)
- intake: preserve concurrent confirmed-source commits (#5275) (f7d9402)
- invites: recognize requisition labels without a separator (#5091) (338fb4f)
- jd-archive: do not credit a section that says it is a paraphrase (#5180) (a859a91)
- jd-skill-gap: read numbered requirement items and full-width inline headers (#5293) (1011fe2)
- jobstreet: improve pagination coverage and report partial scans (#5395) (d7733a5)
- keyword-match: honour fence indentation when closing a fence (#5453) (98ccc76), closes #5362
- keyword-match: read the keyword list shapes reports actually use (#5362) (1fbd455)
- latex: reject repeated patch IDs before rewriting CV prose (#5437) (9c9f08b)
- latex: reject stale extracted slots before writing output (#5037) (05b883c)
- ledgers: start an append on a fresh line when the last row has no newline (#5398) (5bcf5ef)
- liveness: add a No Fluff Jobs API rung, so live postings are kept and closed ones are not (#5428) (ff95ef0)
- liveness: add API rungs for Tencent, Meituan and Alibaba (#5486) (530e24f)
- liveness: detect Polish closure banners on pracuj.pl (#5617) (09a5548)
- liveness: fetch each Ashby board once per check-liveness run (#5491) (e27c501)
- liveness: read CareerViet's Apply button, and the deadline on a closed posting (#5367) (5a9738d)
- liveness: read getManfred's Apply button, and the date on a closed posting (#5350) (9155d1a)
- liveness: read HiringRoom's Apply button, so live postings are not dropped (#5535) (9fe2313)
- liveness: read the No Fluff Jobs 404 body before closing a posting (#5533) (d12550c)
- liveness: resolve plain-http gh_jid pages via API, retry slow pages once, space throttle per host, count DNS-blocked trackers (#5392) (f2d1de1)
- liveness: the skipped_expired row no longer re-escapes a title, company or location starting with = + - @ (#5376) (a4feed3)
- locks: one directory-lock protocol in lib/dir-lock.mjs, used by every core lock (#5389) (30ae797)
- merge-tracker: keep same-titled postings apart on a tracker with no url column (#5518) (b8aca95)
- merge-tracker: stop statting every tracker row's report in the same-file tier (#5488) (41817e5)
- modes/fr: write report header labels without a space before the colon (#5644) (6823811)
- modes: add the required JD archive section to six localized evaluation modes (#5654) (e1bb2a2)
- modes: stop es/ru/ja/tr apply modes writing answers into Block G (#5648) (88b9eb1)
- normalize-statuses: normalize tab-delimited tracker rows in place (#5574) (0a8595c)
- outcome: journal a status only after tracker confirmation (#5272) (5f5fd50)
- outcome: reject a missing explicitly selected CV artifact (#5273) (fb2a14c)
- paths: read the profile through one CAREER_OPS_PROFILE-aware helper in the remaining core modules (#5095) (8e2ec93)
- paths: resolve the profile through one CAREER_OPS_PROFILE-aware helper (#5087) (ee2532e)
- pdf,latex: include report number in temp and output CV paths (#5394) (a1c0cc0)
- pipeline: share the localized pending and processed headings across scan, sync and reconcile (#5520) (19818b5)
- plugins: build the export snapshot from the resolved tracker via tracker-parse (#5537) (1e339a0)
- plugins: name community plugin authors and explain an empty h1b-sponsor run (#5475) (7d63e03)
- plugins: point the serper registry entry at its renamed owner (#5451) (a8a29cf), closes #4186
- plugins: reject traversal-shaped ids in remove before rmSync (#5524) (8dfa557)
- portals: fold provider plugins into every provider map (#5551) (280e415)
- postinstall: warn instead of failing npm install when Chromium can't download (#5597) (139d2b3)
- prepare: read valid quoted and commented profile YAML (#5276) (13ba8a9)
- providers: tag page-cap and failed-page truncation on eightfold, jibeapply, phenom, rippling, pageup, join (#5327) (fd35521)
- put the _custom.md read rule where every agent reads it (#5457) (c48b87e)
- rank: ask for one tool-free answer, bounded, and name unranked rows (#5480) (85568d9)
- rank: reject invalid explicit limits before CLI calls (#5004) (7510060)
- reconcile: read the pdf flag from the path, not the english words (#5519) (4b57696)
- rippling: propagate first-page fetch failures (#5038) (b8fb226)
- role-matcher: keep titles apart when they differ only by a short capitalised code (#5688) (134057b)
- router: give expand, interview-redflag and update a context-loading rule (#5697) (521555a)
- scaffolder: say which ref init installs, and when it fell back to main (#5584) (b1af602)
- scan: admit scan-hn, interamt, openrouter and plugin postings through one shared gate (#5481) (7933fb3)
- scan: stop pinning skipped_no_apply_control rows in scan-history (#4866) (05a1129)
- set-status: warn when a row leaves a terminal state (#5211) (090f787)
- status: run set-status's hooks for reply-watch and dedup-tracker status changes (#5536) (#5538) (8cfe9cb)
- status: stop web and dashboard Interview moves timing out on the JD archive (#5487) (e017968)
- story-provenance: check story-bank figures by unit and sentence, and keep user-cannot-confirm figures out of negotiation, ATS and interview output (#5355) (55a5165)
- tailor: keep generated CVs distinct per application report (#5439) (bb9a786)
- test-all: keep the assertion message of a failed suite on node 22 (#5353) (9580d88)
- test-harness: guard the user files resolved from the checkout (#5279) (5c697b5), closes #5207
- test: keep substituted paths single args in pdf-ats-variant test (#5411) (1c612e9), closes #5410
- tests: "this command must fail" must mean it ran and failed (#5402) (b2d1c7d)
- tests: fail the absolute-path check when git grep itself fails (#5576) (35a0c30)
- tests: read the smoke loop's declared expectExit (#5579) (3b4b0ee)
- tests: seal git config out of suites whose fixtures inherit process.env (#5582) (3c3c740)
- tracker: derive history from status-log.tsv so a rebuilt index loses nothing (#5555) (#5556) (b161516)
- tracker: Go and Node agree on the lock directory on Windows (#5365) (f0e8392)
- tracker: preserve last cell when migrating Via (#5090) (2596f85)
- tracker: read report links through the shared parser so parentheses survive (#5482) (#5483) (ea3ede6)
- tracker: resolve report links from a symlinked tracker's own folder (#5374) (#5375) (c96fa19)
- tracker: unwrap report URL tokens before trailing punctuation (#5309) (be40c3e)
- treat comment-only YAML config as empty instead of crashing (#5464) (9769f2a)
- ui: say web dependencies are missing instead of blaming the port (#5471) (17fa286)
- update mode: restore CLAUDE.md additions only when apply removed them (#5650) (df88e5f)
- update-system: fail loudly on a failed npm install, and reinstall on rollback (#5656) (902dcf4)
- update-system: keep the local-edits scan and scoped commits under the argv limit (#5119) (667b5e7)
- update-system: put back what a failed update had checked out (#5349) (f21836e)
- update-system: rebuild the dashboard on go.mod/go.sum changes, as career-dashboard.exe on Windows (#5637) (aa1ba62)
- updater: check system paths out in a few batched runs, not one per entry (#5508) (b1b7c60)
- updater: do not commit the auto-update onto a non-default branch (#3923) (ed2ca41)
- updater: preserve ignored local file collisions (#5088) (829d5d5)
- upskill: resolve report links through a symlinked data root (#5542) (e90ae5d)
- url-key: two scripts of one language are two postings, not one (#5370) (1de4ec1)
- validate-portals: flag
enabled: no/off/"false" and bare-string title_filter lists (#5377) (c4ab65b) - verify-portals: probe entries through a bounded pool (#5657) (cb2f1fa)
- web: keep an extracted posting url intact (#5149) (d91bbf2)
- web: move the scheduled-jobs and chat locks onto the shared directory-lock protocol (#5390) (ca5e70b)
- web: name the resolved profile path in agent prompts under CAREER_OPS_PROFILE (#5588) (ec35d1b)
- web: read and write the profile CAREER_OPS_PROFILE names (#5096) (a7f3edf)
- workday: skip placeholder detail GETs for titles the scan drops (#5507) (9b5f7f8)
Performance Improvements
- scan: fetch successfactors csb pages six at a time (#5176) (4cfa7e4)
- web: send inbox postings only to the pipeline inbox tab (#5221) (602a3d5)
web: 0.16.0
0.16.0 (2026-10-23)
Features
- debrief: update score, contacts, and the next follow-up after a debrief (#5509) (43bd09e)
- explore: add an opt-in China employer discovery preset (#5431) (4fa03ae)
- remember the agent CLI for doctor, the ranker and the web (#5467) (79965b3)
- reports: show the decision line in translated reports (#5500) (fd16c50)
- web: add an apply checklist page for each application (#5131) (45dff32)
- web: add the cv studio page to review and customize a tailored cv (#5233) (fab622e)
- web: download the shown Pipeline rows as a CSV file (#5625) (040ce2d)
- web: pdf-ready and follow-up seed actions for the apply checklist (#5304) (0818cae)
- web: rewrite a single cv studio bullet with the user's ai cli (#5234) (cd9ce14)
- web: scheduled scans on macOS and Linux (#5401) (02a5902)
Bug Fixes
- apply: keep apply inside the project and off the user's Chrome (#5499) (60a68d4)
- apply: keep failed CV uploads out of other file fields (#5089) (4eb3cba)
- doctor: diagnose half-filled profile sections using core sectionState (#5126) (#5311) (afefa44)
- status: stop web and dashboard Interview moves timing out on the JD archive (#5487) (e017968)
- tracker: read report links through the shared parser so parentheses survive (#5482) (#5483) (ea3ede6)
- treat comment-only YAML config as empty instead of crashing (#5464) (9769f2a)
- web/apply: insert typed text instead of pressing keys, so a line break never submits (#5770) (1f82b2f)
- web/scheduled: record why a scheduled scan failed, not its first progress line (#5661) (889bdf3)
- web: a rate with nothing applied is absent, not 0.0% (#5371) (ffcb79b)
- web: a vendor rate from one application is not a rate (#5372) (9ad6a3e)
- web: align URL hostname normalization with core (#5532) (2beeeb3)
- web: confirm before remember writes to the profile (#5456) (c6800db)
- web: cut redundant tracker row tab stops (#5361) (2e3e1f2)
- web: drop known AI Explore offers on the server, not in the browser (#5502) (ddcb459)
- web: expose Assistant request feedback and reply access (#5245) (35788de)
- web: expose worker state and coalesce terminal feedback (#5356) (4fe6ef5)
- web: group a flagged posting on Today the way its report labels it (#5332) (7ac3233), closes #5300
- web: honor CAREER_OPS_PORTALS on portals page and API (#5360) (0013c09)
- web: keep an extracted posting url intact (#5149) (d91bbf2)
- web: keep portals.yml comments when /api/portals saves the role filters (#5646) (858cd44)
- web: keep tracker search typing responsive on a large tracker (#5504) (6b5f91e)
- web: match ai and pm as whole words when bucketing archetypes (#5152) (cd0a448)
- web: match padded pipeline ids to tracker rows numerically (#5156) (37edc27)
- web: move the scheduled-jobs and chat locks onto the shared directory-lock protocol (#5390) (ca5e70b)
- web: name the resolved profile path in agent prompts under CAREER_OPS_PROFILE (#5588) (ec35d1b)
- web: preserve failed status confirmations for human retry (#5422) (c48e595)
- web: read a header-mapped tracker with fewer than eight columns (#5635) (1f9b281)
- web: read and write the profile CAREER_OPS_PROFILE names (#5096) (a7f3edf)
- web: read only appended transcript bytes for the usage meter (#5503) (0b35a13)
- web: report a crashed pipeline writer instead of added:0 (#5636) (7ab2e8c)
- web: sample each Explore source instead of its alphabetical prefix (#5465) (34665f9)
- web: show when the assistant's profile or scan-target write fails (#5641) (0bc362b)
- web: show why a CV upload was refused instead of a generic error (#5399) (73dccb1), closes #5369
- web: stop reading account executive as an executive level (#5155) (6fb3b35)
- web: stop rewriting the stored job list on every streamed chunk (#5501) (ccb8d7e)
- web: stop the analytics page parsing scan-history it never uses (#5492) (7fed20f)
- web: treat CAREER_OPS_PORTALS as the portals file in doctorState (#5310) (a1830c4)
- web: turn off Next.js usage telemetry (#5596) (4251d7e)
- web: update next to 16.4.1 for GHSA-2464-fhr4-w9xw, GHSA-673q-mjm6-r5xr and GHSA-p3m5-59mp-jv5r (#5771) (0d244d8)
Performance Improvements
Sponsors
SerpApi sponsors career-ops through its fiscal host, Open Source Collective.