Comms Matrix — operation setup, step 3

UX mock for Journey 2 (docs PR #69) · replaces CommsGraph SVG overlay on COP · steer for P3 implementer, not pixel spec
Operation ORBAT 3Comms 4Orders provisional items 1 · commander appointments from ORBAT

COMMS MATRIX

2 draft nets suggested from ORBAT — confirm to include in plan
ORBAT ▸ NETS
CMD NET
voiceSECRETRADIO · HFPLAN ONLY
A TP NET
voiceOFFICIALVHF
B TP NETDRAFT
voiceOFFICIAL
ALL HANDSDRAFT
chatOFFICIAL
QRF NETFIELD
voiceOFFICIAL
SQN HQ 3/33/3
0A Maj Hale ★ CMDR ··
0B Capt Reid — SIGS ···
A TROOP 1/33/33/31/3
A10 Lt Okafor ★ CMDR ··
A11 Sgt Price ··
A12 Cpl Shaw ···
B TROOP 1/22/22/2
B20 Lt Varga ★ CMDR ··
B21 Sgt Doyle ···
UNASSIGNED — OPERATION MEMBERS NOT IN A UNIT
Cpl Innes (att. RE) ····
owner member (talk) listen-only · not on net — click to add provisioned pending failed PLAN ONLY = out-of-band radio net, never provisions channels DRAFT = suggested from ORBAT, not yet in plan FIELD = provisional, created at the edge

Implementer notes (P3 steer)

  1. Home. This screen is step 3 of operation setup (Operation → ORBAT → Comms → Orders), a full-screen surface under the operation. The COP comms-graph overlay, CommsGraph.tsx, comms_graph_layout.ts, comms_graph_helpers.ts and the COP view toggle branch are deleted. Each step is also directly addressable later for edits (not a one-way wizard).
  2. Rows are the ORBAT. Unit rows (bold, shaded) then callsign rows indented beneath, same tree order as the ORBAT builder; commander appointments render ★ CMDR from ORBAT data — not editable here. Unassigned operation members pool at the bottom and can still join nets.
  3. Cells. Click empty cell = add member (default role: member/talk). Click occupied = small popover: owner / talk / listen / remove. Unit-row cell shows membership count and toggles the whole unit. At-most-one-owner rule (existing OwnerConflictError) enforced inline — picking a new owner offers to demote the current one.
  4. Draft columns (blue tint) are suggestions derived from the ORBAT: command net (HQ + all unit commanders), one net per unit, all-hands chat. SQL-only rows flagged draft; nothing gossips or provisions until confirmed. Confirm-all in toolbar. ORBAT edits re-derive drafts and flag membership diffs on already-confirmed nets. Confirmed-to-gossip publication itself stays behind the zenoh-plugin-remote-api gate — draft→confirmed is a flag until transport lands.
  5. Field/provisional columns (purple tint) are edge-created nets ingested via the comms-plan registry. Bless / retire per registry actions; requires author_comms_plan. Count feeds the header provisional badge.
  6. Carriage. New per-net field carriage: petra | radio. Petra nets materialise as WayPoint voice/chat channels — confirm/save publishes channel create/edit through the existing provisioning path (comms_provision_shell → transport publishers, sealed channel defs), stamped with registry fields (origin=planned, owner = operation, seq) once the registry lands. Radio nets are plan-of-record only — bearer detail (HF/VHF/UHF/SATCOM; freq/crypto fill later), PLAN ONLY chip, no channels, no status dot. Suggested drafts default to petra. Existing bearerType becomes the radio-side detail, no longer implied for petra nets.
  7. Provisioning status dot (petra nets only) per net header + detail in the drawer: green provisioned, amber pending, red failed with retry. Replaces today's silent fire-and-forget bestEffort — failures must surface.
  8. Drawer, not modal. Net detail edits in a right side drawer; matrix stays visible and interactive. Classification stays immutable post-provision but gets an honest affordance: explanation + guided recreate that carries members over.
  9. Read-only mode (no author_comms_plan): cells non-interactive, drafts visible but unconfirmable, drawer read-only. Same surface serves as the operation's comms reference.
  10. Not pixel spec. Use daisyUI table/drawer/badge primitives + waypoint theme tokens; glyphs, spacing and exact chips are illustrative. Keep pure decision logic (suggestion derivation, diff flagging, cell-state mapping) in *_helpers.ts per repo convention.