9 file(s), +311 / -11 lines
| Path | Role | + | - |
|---|---|---|---|
| messages/en.json | Config | +7 | -0 |
| messages/hi.json | Config | +7 | -0 |
| src/app/[locale]/(workspace)/matters/[matterId]/record/page.tsx | App route | +2 | -1 |
| src/app/[locale]/(workspace)/matters/[matterId]/strategy/page.tsx | App route | +40 | -8 |
| src/components/matter-detail/strategy/strategy-document-shelf.stories.tsx | Component | +70 | -0 |
| src/components/matter-detail/strategy/strategy-document-shelf.tsx | Component | +108 | -0 |
| src/lib/documents/home.test.ts | Library | +37 | -0 |
| src/lib/documents/home.ts | Library | +38 | -0 |
| src/lib/surface-registry/route-registry.ts | Library | +2 | -2 |
The Strategy tab gets its first real content. Per the founder-locked
document-homes doctrine (2026-07-08), a document's nature is
its home in the Worknav: record (evidence — full citizenship) or
strategy (counsel's internal analysis, e.g. the Harsha Venkatesh
note). Strategy documents run the pipeline but are structurally
excluded from the Record register, world-fact assertions,
contradiction candidates, and discovery/export — not filtered, excluded.
"The notice is in the Record. My Harsha analysis is in Strategy."
home seam (Story-2119 lands in parallel)
The wire home enum is not yet on the generated
DocumentListItem, and assertContract strips unknown
keys at the trust boundary — so today every document reads
undefined and defaults to record. Both consumers are
wired now and light up with zero app changes the moment Story-2119
lands the field and pnpm codegen regenerates the schema.
src/lib/documents/home.ts — the one place
that reads a document's home. documentHome(),
isStrategyDocument(), isRecordDocument(). A
TODO(Story-2119) marks the cast for removal once the field is
in src/gen. Covered by home.test.ts (default →
record; strategy off the wire; any other value → record).
matters/[matterId]/record/page.tsx filters the bootstrap
documents through isRecordDocument before they reach the
register — one line, behind the same seam. Strategy docs can never appear
on the Record.
matters/[matterId]/strategy/page.tsx — was the dashed
placeholder; now a thin fat-layout child. It lists the matter's documents
(mattersGateway.listDocuments), keeps only
home=strategy, and renders the shelf. A 404 (wrong firm under
RLS) renders not-found via orNotFound. The
agentSurface.description was extended to say the shelf is
distinct from the Record.
src/components/matter-detail/strategy/strategy-document-shelf.tsx
— a deliberately thin list (name · size · uploaded · status), distinct from
the full evidentiary register (no columns, bulk, or filing lens: strategy
docs are not discoverable citizens). It reuses the register's
formatBytes / statusTone /
parseProcessingStatus and the existing
DocumentsRegister.status.* / columns.* labels — no
duplicate presentation logic. Co-located story with Empty + populated states.
StrategyShelf namespace in en.json +
hi.json).
TODO(#2117) seam. No fake door.
home=strategy list filter is
Story-2119; the in-app filter drops out (moves to a query
param) once it lands. Until then the shelf renders empty — the honest
first-run state — because no document carries home yet.
pnpm gen:routes + pnpm check:routes (37 surfaces,
fresh), pnpm lint (0 errors), pnpm test
(1017 passed), and pnpm build all green. No codegen / contract
change — the home field arrives with Story-2119.