8 file(s), +184 / -44 lines
| Path | Role | + | - |
|---|---|---|---|
| messages/en.json | Config | +4 | -0 |
| messages/hi.json | Config | +4 | -0 |
| src/components/matters/import-into-matter-sheet-v2.stories.tsx | Component | +34 | -3 |
| src/components/matters/import-into-matter-sheet-v2.tsx | Component | +74 | -26 |
| src/components/matters/use-document-upload-queue.ts | Component | +4 | -4 |
| src/components/matters/use-matter-import-v2.ts | Component | +40 | -10 |
| src/lib/matters/import-source.ts | Library | +15 | -0 |
| src/lib/matters/upload-queue.ts | Library | +9 | -1 |
The founder-locked document homes doctrine (2026-07-08) says a document's nature is its home in the Worknav โ no invented "work product" labels. The drawer's one chip row folds two axes into one gesture: side (Client's / Opponent's / Other) for Record documents, and Strategy, which implies "ours" and sends the upload to a different home entirely. This story adds the 5th chip between Other and ๐ Privileged. It builds directly on Story-2111 (armed dropzone) and Bug-2118 (optimistic row on drop + animated exit) โ neither is regressed.
"The notice is in the Record. My Harsha analysis is in Strategy. My
advice emails are privileged โ PRAMAAN won't take them." Strategy =
counsel's internal analysis made from evidence. The pipeline still runs over
it (anchors, cards, search, Mira's strategy context), but it is
structurally excluded from world-fact assertions, the
contradiction engine, discovery and export. Enum: home = record |
strategy, default record.
home?: DocumentHome (record | strategy, defined
in lib/matters/import-source.ts) rides the
UploadItem from enqueue onward, parallel to the
existing source side hint. The drawer's journey rows read it:
a registered strategy row shows "In Strategy" (blue) in
place of "In the Record" (green), and carries a static Strategy
pill rather than the cycling side chip โ a strategy note has no
side to correct, and can't be mis-cycled into evidence.
useMatterImportV2.addFiles now takes the armed source and
splits it: a side โ home=record + declaredSide;
strategy โ home=strategy with a null
declaredSide ("ours" is implicit). The ledger mint carries
home per item. Because the generated
ImportItemInput mirror does not yet expose home
(backend sibling Story-2119 in flight), a narrow typed
overlay ImportItemInputWithHome = ImportItemInput & { home? }
sends it today; a TODO(Story-2119) marks the seam to delete
once codegen mirrors the field. home is sent only when it
diverges from the record default.
Matters.import in
both en and hi:
sourceStrategy, dropStrategy,
stageInStrategy, trustLineStrategy.
| Armed chip | home | declaredSide | Droppable? | Zone / registered copy |
|---|---|---|---|---|
| Client's | record | client | yes | green ยท "In the Record" |
| Opponent's | record | opponent | yes | crimson ยท "In the Record" |
| Other | record | other | yes | neutral ยท "In the Record" |
| Strategy | strategy | null (ours) | yes | blue ยท "In Strategy" |
| ๐ Privileged | โ | โ | no (refused) | amber ยท protective refusal |
declared_side for Record rows via the optimistic PATCH.Matters/Import/ImportIntoMatterSheetV2 โ ArmedStrategy โ "Strategy" picked, zone recolours blue ("Drop strategy notes"), footer flips to the internal-only trust line.โฆ โ RegisteredToStrategy โ a strategy note that landed: the row reads "In Strategy" (blue) and carries the static Strategy pill, not a side chip.โฆ โ ArmedClient / Privileged / Importing / AllRegistered โ unchanged, proving the side + privileged flows are intact.pnpm lint โ clean (one pre-existing <img> warning in add-matter, untouched).pnpm test โ 164 files / 1016 tests green.pnpm build โ green (typecheck included).pnpm codegen and no board changes, per the story scope.
Live-data seam (Story-2119): Strategy arming, the blue zone,
the "In Strategy" rows and the trust-line swap are live client-side today.
The home=strategy stamp rides the ledger mint through the typed
overlay, but the backend does not persist home or route uploads
to the Strategy shelf until functions Story-2119 lands and
its contract syncs to the mirror (then the overlay is deleted and
home is read straight off ImportItemInput). The
end-to-end "strategy upload never enters the Record" guarantee is
server-enforced there, not here.