Sub-issue of #146. PRP 3 milestones M5 (Table render / S03) + M6 (Privacy splash / S04). Reference: `PRPs/cardshed-03-experience-prp.md` lines 796–842.
Scope
M5 — Table
- `docs/SCREENS/table.md` (Stitch)
- `apps/ui/src/features/table/Table.tsx` — reads `matchStore` + `createPrivateView(state, viewerId)`
- `apps/ui/src/components/{Card,Hand,OpponentBar,TrumpIndicator,DeckPile,DiscardPile,PhaseLabel}.tsx`
- `apps/ui/src/dispatcher/LocalDispatcher.ts` — wraps `@cardshed/core`; exposes `dispatch(action) → ActionResult`; emits to in-process EventBus
M6 — Privacy splash
- `docs/SCREENS/privacy.md` (Stitch)
- `apps/ui/src/features/privacy/PassDeviceSplash.tsx` — between turns, blank previous player's view, "Pass device to {next}" + confirm
- `apps/ui/src/state/uiStore.ts` (currentViewerId, transitions)
Acceptance
Common bugs (from PRP 3)
- Leaking opponent hand contents via raw `MatchState` — use `createPrivateView` only
- Card component parsing `card.id` for suit/rank (FORBIDDEN)
- `display:none` on previous hand — STILL inspectable; must UNMOUNT
- Auto-advancing without confirm — destroys pass-and-play privacy
Complexity
M + M = ~7–9 hours.
Sub-issue of #146. PRP 3 milestones M5 (Table render / S03) + M6 (Privacy splash / S04). Reference: `PRPs/cardshed-03-experience-prp.md` lines 796–842.
Scope
M5 — Table
M6 — Privacy splash
Acceptance
Common bugs (from PRP 3)
Complexity
M + M = ~7–9 hours.