The PHQ-9, GAD-7 and WHO-5 are not validated in Dutch or Brazilian Portuguese, and the SCI is validated in English only, yet the check-in wizard and the answer breakdown read the item text, answer options and stems through t() in the reader's language. Dutch and Brazilian Portuguese readers saw unvalidated translations of every item, including PHQ-9 item 9, under a note saying the questions were in English. Every surface now resolves instrument wording through instrumentText, which returns the English source for a language outside the instrument's validated set. The unvalidated wording is removed from the bundles; the locale-parity check accepts exactly those keys as absent and fails when a bundle carries one, and a structural test keeps item text out of bare t() calls. The PHQ-9 follow-up question regains its original wording. CONTRIBUTING states the rule for translators.
src/components/
React components. The UI primitives are shadcn/ui (new-york style, zinc base) over Radix + Tailwind 4 + Lucide; everything above the primitives is feature-grouped by surface. Components are server components unless they need a hook, state, or browser API, in which case they open with "use client". Charts use Recharts 3 — replacing the chart library requires explicit approval.
Primitives and shell
ui/— shadcn/ui primitives (button, dialog, sheet, table, …). Generated by the shadcn CLI; keep edits minimal and on-style.layout/— the app shell: sidebar, topbar, bottom nav.providers.tsx,version-poller.tsx— top-level context providers and the self-healing stale-shell poller.i18n/— translation context + locale switcher.
Feature groups
insights/— insight status, assessment cards, Coach surface, advisor cards (the largest group).medications/— medication cards, the schedule wizard, intake timeline, detail history.settings/— the section components behind each settings page.measurements/,mood/,dashboard/— entry forms, lists, dashboard tiles.charts/— Recharts wrappers.monitoring/— Umami / GlitchTip client bootstrap.gamification/,targets/,comparison/,doctor-report/,clinician/,onboarding/,admin/— the remaining per-surface groups.
Conventions
Kebab-case filenames; React component exports stay PascalCase regardless. (A handful of PascalCase-filename outliers under medications/ + onboarding/ are pre-existing drift, noted in ../../CLAUDE.md.) Every t() call needs a matching key in messages/en.json — guarded by i18n-call-site-coverage.test.ts. Data reads go through TanStack Query with keys from @/lib/query-keys and unwrap (await res.json()).data. Tests live in __tests__/.