# Changelog

## Score

- CAI 56 → 36 (-19.8)
- Rubric changed (rubric-2026.08.18 → rubric-2026.08.15) — scores are not directly comparable.

## Lenses

- Code Health 46 → 30 (-15.3)
- Maturity 72 → 75 (+2.5)
- Readiness 61 → 25 (-36.2)
- Security 81 → 64 (-17.4)

## Resolved (23)

- Change coupling: merge-tracker.mjs ↔ test-all.mjs (merge-tracker.mjs)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 2) (dashboard/internal/data/career.go)
- Duplicated block (10 lines × 2) (dashboard/internal/data/pdf.go)
- Duplicated block (12 lines × 2) (dashboard/internal/data/pdf.go)
- Duplicated block (12 lines × 2) (dashboard/internal/ui/screens/pipeline.go)
- Duplicated block (14 lines × 2) (dashboard/internal/data/career.go)
- Duplicated block (15 lines × 2) (dashboard/internal/ui/screens/pipeline.go)
- Duplicated block (15 lines × 2) (dashboard/internal/ui/screens/progress.go)
- Duplicated block (8 lines × 2) (dashboard/internal/data/pdf.go)
- Duplicated block (8 lines × 3) (dashboard/internal/ui/screens/pipeline.go)
- Duplicated block (9 lines × 2) (dashboard/internal/ui/screens/pipeline.go)
- Duplicated block (9 lines × 2) (dashboard/internal/ui/screens/progress.go)
- Duplicated block (9 lines × 3) (dashboard/internal/ui/screens/progress.go)
- Further sole-owners (lower concentration)
- Hotspot: dashboard/internal/ui/screens/pipeline.go (dashboard/internal/ui/screens/pipeline.go)
- Hotspot: dashboard/main.go (dashboard/main.go)
- Off-boarding risk: anonymized user #1
- Off-boarding risk: anonymized user #2
- …and 3 more

## New (420)

- (anonymous) (cognitive 16) (scan.mjs)
- (anonymous) (cognitive 17) (providers/comeet.mjs)
- (anonymous) (cognitive 25) (scan-ats-full.mjs)
- (anonymous) (cognitive 26) (scan.mjs)
- (anonymous) (cognitive 26) (upskill.mjs)
- (anonymous) (cognitive 30) (providers/smartrecruiters.mjs)
- (anonymous) (cognitive 57) (scan.mjs)
- (anonymous) (cyclomatic 16) (providers/comeet.mjs)
- (anonymous) (cyclomatic 16) (upskill.mjs)
- (anonymous) (cyclomatic 17) (scan-ats-full.mjs)
- (anonymous) (cyclomatic 18) (scan.mjs)
- (anonymous) (cyclomatic 21) (providers/smartrecruiters.mjs)
- (anonymous) (cyclomatic 32) (scan.mjs)
- Change coupling: followup-cadence.mjs ↔ test-all.mjs (followup-cadence.mjs)
- Change coupling: scan.mjs ↔ test-all.mjs (scan.mjs)
- Dimension evaluation failed
- FileTooLong: ./analyze-patterns.mjs (analyze-patterns.mjs)
- FileTooLong: ./build-cv-html.mjs (build-cv-html.mjs)
- FileTooLong: ./check-table-freshness.mjs (check-table-freshness.mjs)
- FileTooLong: ./company-funded.mjs (company-funded.mjs)
- …and 400 more

## Changes since last survey

- 131 commits — 69 feature/other, 62 fixes

## By area

- (root) — 98 commits
- docs/SCRIPTS.md — 6 commits
- dashboard/internal — 3 commits
- web/src — 3 commits
- docs/SUPPORTED_JOB_BOARDS.md — 2 commits
- .github/workflows — 1 commit
- batch/batch-runner.sh — 1 commit
- docs/ARCHITECTURE.md — 1 commit
- docs/FAQ.md — 1 commit
- lib/latex-escape.mjs — 1 commit
- modes/_shared.md — 1 commit
- modes/fr — 1 commit
- modes/it — 1 commit
- providers/a16z-speedrun-talent.mjs — 1 commit
- providers/cryptocurrencyjobs.mjs — 1 commit
- providers/echojobs.mjs — 1 commit
- providers/radancy.mjs — 1 commit
- providers/workable.mjs — 1 commit
- providers/workday.mjs — 1 commit
- templates/portals.example.yml — 1 commit

## Notable commits

- fix: docs(scripts): document fix-slugs.mjs in SCRIPTS.md (#2329)
- fix: feat(portals): standalone fix-slugs.mjs — auto-write ATS slug fixes to portals.yml
- fix: fix(batch): don't mark a worker-reported failure as completed
- fix: fix(batch-runner): tab-IFS collapse recorded score "-" for every successful offer
- fix: fix(ci): a fork signature's valid check must not go red when the ack comment can't post
- fix: fix(cli): --flag=value was silently ignored in five scripts
- fix: fix(company-funded): catch the layoff spellings #2404 left through
- fix: fix(company-funded): the cuts N% layoff exclusion never matched (#2404)
- fix: fix(company-history): count a hire as a company response (#2297)
- fix: fix(cv-facts): the anti-fabrication gate saw nothing in five shipped locales
- fix: fix(cv-facts): the employer/title gate only matched lowercase triggers
- fix: fix(cv-latex): single mailto: scheme + escape OT1-unsafe glyphs (#2378)
- fix: fix(dashboard): localize the hired status label and buffer split stream openers (#2295)
- fix: fix(dashboard): pin the row's own status to the top of the status picker
- fix: fix(dashboard): the 'hired' status renders with no colour in the pipeline list
- fix: fix(dashboard): the progress funnel dropped Hired from every stage (#2406)
- fix: fix(dedup): use Unicode-aware Via key for blind-employer grouping (#2397)
- fix: fix(deps): update npm dependencies (+ Dockerfile playwright pins, web lockfile sync)
- fix: fix(doctor): detect Playwright MCP in JSONC OpenCode configs (#2252)
- fix: fix(echojobs): keep hybrid roles distinguishable from remote (#2258)
- …and 111 more
