v1.96.0
[1.96.0] — 2026-07-04
Career orientation (Epic 27). A new #/orientation page answers "which directions actually fit me?" — the read you'd get from a vocational test, but inferred from your own CV and profile instead of a questionnaire. Click Generate profile and the model returns your best-fit career vectors (which of the eight archetypes — Functionalist, Administrator, Communicator, Specialist, Analyst, Innovator, Manager, Entrepreneur — fit, with evidence), a career-type leaning, recommended roles, professional strengths tied to your CV, working-style tendencies, and development recommendations. It is an AI reflection of how your CV reads — not a psychometric test: it never invents achievements and never reports numeric scores as if measured. Export it to Markdown or PDF; nothing is written to disk.
- New route
server/lib/routes/orientation.mjs(24th route module) —POST /api/orientation/generatebuilds the profile prompt from CV+profile+two-pager+memory via the shared provider cascade, with a copy-paste manual fallback and no file writes. - Reuses
report-export.jsfor Markdown/PDF/copy, under the Growth nav group. - Tests:
tests/orientation-routes.test.mjs(reflection framing / no fabricated scores, CV/profile-seeded manual mode). 7 new i18n keys ×16 locales, Help §28 ×16.
New: #/orientation; server/lib/routes/orientation.mjs.
Also in this release — review-driven fixes & hardening. A sweep of the AI-review logs across recent PRs surfaced several real defects, all fixed here:
- Duplicate i18n keys removed (30 CodeQL
js/duplicate-propertyalerts). The v1.94.0 statistics fan-out had inserted thestats.*/export.*block twice in five locale dicts (ar,ja,ko,zh-CN,zh-TW) — last-wins silently shadowed the first copy. Each doubled block is removed; snapshot regenerated; parity green. cv-diagnostics.jsdead code (CodeQLjs/useless-comparison). Thewords === 0length branch was unreachable after thewords < 20early-return guard — removed.cv-privacy.jsfalse redactions.PHONE_REnow skips date-like runs (a2018-2022year range, a2026-07-04ISO date) that its ≥7-digit guard would otherwise mask;ADDRESS_REnow requires a real address boundary (comma / ZIP / end-of-line) so a mid-sentence "…Full Stack Dev St building…" isn't redacted. New tests cover both.i18n-dict.fr.jsshipped-bundle noise. Stripped the trailing English// glosscomment from every French entry — consistent with the other 15 locales.- AI-review workflow.
ai-review.yml's rubric now names all 16 locales (was a stale 8), and the reviewer diff is ordered code-first (server/,public/,tests/) so the 200 KB cap truncates bulky localized CHANGELOG/README churn rather than the security-relevant code it kept reporting as "not in the diff." - Doc drift. Refreshed stale counts in
docs/sdd/CONVENTIONS.md(test total, H3 parity number),CLAUDE.md, and.claude/PROJECT-CONTEXT.md.