The Bestand tab was 1,139 lines of one client file holding two concerns that only meet at the row shape: the list of containers a person holds, and the three dialogs that change it. Registration, per-item correction, packaging economics, the summary and the row rendering all shared a scope, so reading any one of them meant scrolling past the rest. Move-only. The dialogs go to `inventory-dialogs.tsx` with the day-input conversions their fields produce; the row shape and the cache-invalidation they both need go to `inventory-shared.ts`; the section keeps the summary and the list at 458 lines. Every export the tab offered is still offered here, so no caller changes. No copy changes, no new keys. Two suites pin these contracts by reading the file's own source — the register dialog's unit conversion and the correction dialog's sparse patch. Their `readFileSync` now names the file the code moved to. The assertions are unchanged, byte for byte; only the path they read is.
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__/.