1.31.0 (2026-08-31)
Features
- application-answers: read the evaluation's Block H draft answers (778d5bf)
- cv: add "text" output_format — tailored markdown CV, no PDF (#3342) (13de717)
- cv: ATS-friendliness check — score a generated CV for parseability (#2064) (6d4e4c7)
- external data directory via CAREER_OPS_ROOT (#524) — lands #1444 (9159ec6)
- hired-wall: a quiet chevron with the exact remainder says the strip continues (87e3188)
- hired-wall: the audit line speaks to the person mid-search (c74dfc3)
- hired-wall: the badge is the title — self-identifying label, own share line, tighter audit line (7280a48)
- portals: profession-agnostic examples in portals.example.yml (b8614f8)
- providers: JobsDB Hong Kong via the existing jobstreet provider (6fa8279)
- web: add a global "Back to Top" button (#2821) (e5e786b)
- wire reply-watch into status-log.tsv (#1582) (f88df83)
Bug Fixes
- coverage: exclude the local-paths declaration file so a fork can commit it (280044e)
- cv-sync-check: resolve prompt paths from CODE_ROOT instead of an undefined projectRoot (d6df7a2)
- cv-sync-check: stop allowFail from excusing an uncaught crash (a19da42)
- dashboard: read job URLs from the tracker before the legacy enrichment tiers (c124fb6)
- deps: refresh web lockfile for Next update (2ca6c00)
- doctor: survive a null entry in installed_plugins.json (0a137a1)
- harness: make the syntax gate recursive, shared with npm run lint (43f846c)
- hired-share: suggest outcome.mjs's real syntax in the no-Hired-row error (4a69583)
- providers/icims: fill a missing location from the posting's JSON-LD (20ec88f)
- scan: Level 1 runs Playwright sequentially, matching the shared-session rule (77eebc9)
- scan: opt-in word:/stem: anchoring for content_filter keywords (ce3ac16)
- tests: scope the profile pin and move the last hand-registered suites (0bcd0fa)
- update-system: refuse to run when the install is not its own git toplevel (aecae53)
- updater: parse git status with -z so quoted paths and renames match real files (79152e7)
- verify-pipeline: recover a report number from a link target written with backslashes (8177808)
- web: honour language.modes_dir and language.output on web-triggered runs (#3253) (316906e)
- web: ignore nonfatal CLI stderr on clean run exit (#1974) (7f430ee)
- web: only surface follow-ups that are actually due (#2157) (82e1055)
- web: regenerate the nested web/ lockfile on postcss bumps (dba2a2e)
- web: show a cause-specific hint on job failure instead of an always-auth prompt (#2158) (d372908)
- web: show Via attribution for confidential employers (f749939)
- web: stop evaluation tables collapsing to one word per line (#3254) (b3c1e12)
- web: stop tracing runtime data paths (0a9d71f)
- web: tab label spacing and report table word-breaking (#3160) (102560b)
- web: use next/link for decision-card report link (#1931) (e7b38b3)