UX mock for P9 (amendment to docs PR #69) · one shared read-only PlanTimeline component, two hosts · bottom panel, never a map overlay
A — COP · live now-line · 09:42Z (H+3:42)
WAYPOINT
COPPLANTARGETINGREPLAY
OFFICIALOP ASHGROVE09:42:11Z
live map — tracks, detections, published overlays
OBJ COPPER
A10A11B20SIGHTING 041
PLAN — OPORD 003
v3 · latestH 0600Z⚠ 1 task past due, no report — B TROOPacks 8/9▾ collapse
ORBAT ▸ H-HOUR
H−2
H−1
H
H+1
H+2
H+3
H+4
H+5
NOW 09:42Z
SQN HQ
ESTABLISH CP ✓
A TROOP
CLEAR OBJ COPPER EAST ✓
HOLD + REORG
B TROOP
SUPPORT BY FIRE, RL AMBER ⚠
■ complete (reported)■ in window■ past due, unreported▢ upcomingclick bar = task detail + unit's latest report · unit lanes only (callsigns expand)
B — Replay · cursor 08:15Z · plan as it existed at T
WAYPOINT
COPPLANTARGETINGREPLAY
OFFICIALOP ASHGROVE · 05 JUL
historical map — tracks as at 08:15Z
OBJ COPPER
A10A11B20
PLAN — OPORD 003
v2 · active at cursorsuperseded 12:10Z by v3▾ collapse
ORBAT ▸ H-HOUR
H−2
H−1
H
H+1
H+2
H+3
H+4
H+5
T 08:15Z
SQN HQ
ESTABLISH CP ✓
A TROOP
CLEAR OBJ COPPER EAST
REORG ON OBJ
B TROOP
SUPPORT BY FIRE, RL AMBER
v2 differs from v3: A TROOP reorg task later retimed + extendedtask states derived from reports received ≤ T, never later knowledge
06:00Z
14:30Z▮ plan version published
Implementer notes (P9 steer)
One component, three hosts.PlanTimeline is presentational; pure lane/bar/cursor math in *_helpers.ts (Vitest). Hosts supply {tasks, hHour, cursor, taskStates, editable}. Orders editor (P8) is the editable host; COP and Replay render read-only with a cursor.
Placement. Collapsible bottom panel in the same slot family as the comms panel — never a map overlay, never a COP view toggle. Collapsed state = one-line strip: plan name, version, now-position, past-due count.
COP host. Tasks from the operation's current plan tree (latest seq per plan id). Now-line ticks live. Task state derives from reports: complete (report received covering the task window), in-window, past due + unreported = red — the visual sibling of the silent-unit rule in the compliance matrix. Click bar = task detail + that unit's latest report. Unit lanes by default; expand a unit for callsign lanes.
Replay host. Plan folded from the plan NDJSON layer: at cursor T render the highest seq ≤ T per plan id (same fold-forward as orbat_change / target_transition). Version chip shows which seq is active and when superseded. Task states computed from reports ≤ T only — no future knowledge leaks. Plan-publish moments render as marks on the replay scrubber.
No compat.sync_task export layer removed in the same storm; plan layer replaces it outright.
ORBAT at T. Replay lanes use ORBAT as at cursor (fold orbat_change), so a provisional team formed mid-op appears in lanes only after its formation moment.
Not pixel spec. daisyUI + waypoint tokens; state colours map to NATO-aligned status tokens already in the theme.