1.23.0 (2026-07-28)
Features
- batch: add batch-tailor.mjs for bulk CV tailoring of high-scoring roles (#1882) (d5384ef), closes #1836
- cli: add Cursor as a supported CLI host (#2115) (119d75c)
- cv: support declarative section HTML partials from disk (#2184) (aefed14), closes #2183
- dashboard: add a RESPONDED filter tab to the pipeline screen (#2000) (eff33e6), closes #1999
- dashboard: build the pay-span regex from an explicit currency list (#2201) (37f20ab)
- eval: token-budget-aware context compression for the Gemini and OpenAI evaluators (#2060) (4a9281b), closes #2077
- i18n: add Dutch (nl) modes (#1970) (0099c42)
- latex-tex: support resumeItemWithoutTitle bullets and resumeSubItem skills (#2120) (0d4fa4d)
- oferta: flag explicit no-sponsorship as a hard blocker (#2017) (933aa01), closes #2016
- pdf: dynamic CSS theming from a profile.yml style block (#1862) (6271e6d), closes #1837
- providers: add Flowxtra board-wide job provider (c9671e0)
- providers: add VDAB zero-auth provider (#2084) (6164384)
- scan: discover-ats.mjs — resolve a company list to scannable ATS boards (#1865) (50874d1), closes #1864
- skills: extract the shared skill tokenizer into skill-extract.mjs (#2003) (c110825)
- upskill: learning plan on the aggregate gap heatmap (#2217) (f20d3e2), closes #1740
Bug Fixes
- agentic-jobs: replace the broken HTML scraper with the documented REST API (#2167) (3aee274), closes #2143
- agents: compress AGENTS.md ~20% with zero semantic loss (#2094) (bd7b377)
- batch: update Claude tier mapping to the current model lineup (867e374)
- cv: add GitHub contact link to the HTML CV pipeline (38efd59)
- dashboard: persist status changes from viewer Discard/SKIP and stale rows (#1849) (3f4f947)
- dedup: merge notes from removed entries instead of dropping them (#1883) (a91aebf), closes #1833
- deps: update dependency next to v16.2.11 [security] (#2198) (b6d1c87)
- deps: update module golang.org/x/sys to v0.47.0 (#2194) (f8bac6e)
- doctor: treat missing user prerequisites as non-fatal setup warnings (#2083) (a3cf654)
- funnel-velocity: count non-canonical Applied rows in the waiting backlog (#2152) (1e38216)
- jd-skill-gap: recognize real-world requirement headers, stop at benefits (3ce5718)
- liveness: normalize typographic punctuation and accents before matching (#2163) (105ec60), closes #2162
- liveness: treat the SPA "has been filled" phrasing as expired (#2212) (112298c), closes #2211
- match-star: tokenize tag matches so short tokens do not substring-collide (#2153) (360bb8c)
- normalize-statuses: use header-mapped columns instead of fixed indices (cf0bf4f)
- opencode: add missing /career-ops command router (#2204) (74bd6f2), closes #2191
- patterns: recognize the canonical Hired status in analyze-patterns (#2145) (283b2a0)
- pdf: apply the CV section-order check to non-English CVs (#2088) (9a82618)
- pipeline: lock appendToPipeline() against concurrent read-modify-write (#2189) (3c04b43), closes #2188
- plugin: mirror plugin.json at .github/plugin/ for the awesome-copilot validator (11fd356)
- providers: guard decodeEntities against out-of-range code points (#2150) (0448748)
- reply-matcher: decide rejections before offers to stop mis-typing (#2151) (1d56897)
- reply-matcher: sanitize domains harvested from tracker notes (#2135) (adc04fb), closes #2134
- restore empty-Certifications section stripping lost in the v1.22.0 refactor (#2119) (708c53d), closes #2118
- restore the Kimi SKILL.md entrypoint as a real symlink (82e86a0)
- role-matcher: stop collapsing leveled variants into the bare title (fd8f721)
- role-matcher: strip the "Member of Technical Staff" prefix before tokenizing (#1933) (a113766), closes #1965
- role-matcher: treat 'product' as a baseline token so PM sibling specialties stay distinct (#2164) (37c0e99)
- salary-gap: parse US ranges with the currency symbol on both bounds (#2200) (9d77fd4), closes #2190
- scan: keep body consumption inside the fetch timeout window (#2138) (643478f), closes #2136
- scan: lowercase the path in normalizeUrlForDedup to catch cross-source duplicates (#2089) (9c05638)
- scan: recover Greenhouse office cities when location.name is a work model (#2104) (b24b99f)
- scan: word-boundary location keywords + URL location fallback (#2087) (8a1ba8a)
- set-status: fail closed when a lone company row contradicts --role (#2108) (c05ce51), closes #2009
- skill: routing drift + discoverable metadata across the agent surface (8ac6261)
- successfactors: preserve brand path for multi-brand RMK tenants (#2099) (b623271), closes #2010
- sync the PDF and scan summary output (#2213) (c47094b)
- test: make the SYSTEM_PATHS coverage guard actually run in CI (#2240) (b2f3fda)
- tracker: set SQLite busy_timeout to avoid SQLITE_BUSY under concurrent access (#2206) (696a3a8), closes #1957
- tracker: sync the PDF column from data/pdf-index.tsv (#1969) (85a894c), closes #1429
- update-system: rollback removes additions left behind under a directory pathspec (#2110) (fc0cf74), closes #2015
- update-system: verify the target manifest materialized instead of reporting success (#2111) (e1fd205), closes #1998
- verify-cv-facts: detect metric claims the pattern was silently missing (1bf9148)
- web: resolve nested postcss and sharp advisories via overrides (#2216) (ec02af8)