Files
stack/docs/fleet/proposals/mosaic-platform-prd/PRD-webui-fleet-control.md
Jarvis 2708de55b9
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
docs(prd): fold 2026-07-09 debate-pass findings into Mosaic Platform PRD
All 24 panel findings (P0#1-5, P1#6-13, P2/P3#14-24) accepted and folded:
- DEBATE-FINDINGS.md: disposition record + open-disagreement judgment calls
- north-star: NS-14, J2a/J2b split, J6 wake router, K3 push pipeline,
  M1 memory subsystem, workstream L (MALS lineage), real DAG edges
- J: workspace lease J-R16, resume protocol J-R18, write-side trust,
  needs-decision lifecycle, atomic card publish
- P: CAS approval state machine, gateway-only credentials, default-closed
  gating, principal resolution + policy snapshot (Codex #2/#7)
- W: butt-in exclusive lease, structured control plane, break-glass
  doctrine, trial metric panels
- Q: external_refs table, pending-link, echo-loop guard, crash barriers
- X: storage authority (Postgres sole record), machine-generated census,
  memory retrieval-eval retirement gate, honest rollback scope,
  4 artifact-existence machine gates, bounded day-30 review
- README: Gate Zero, conflict register, DoD line, silent-roster rule

One item OPEN for Jason at ratification: gate superstructure (§3.1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMoEx7hfdFGjUiCHuN1RRi
2026-07-09 16:29:37 -05:00

8.1 KiB
Raw Blame History

PRD — webUI Fleet Control · Workstream W (realizes F6)

Status: DRAFT for ratification · Goals: W1W3 · Upstream anchor: PRD-fleet-suite.md Phase F6 ("webUI hooks — stable JSON contract + terminate/attach(butt-in) surface") Confirmed gap: zero xterm/pty/tmux code in apps/web on either the old snapshot or origin/main. Debate pass 2026-07-09: panel findings folded — see DEBATE-FINDINGS.md.

Mission

The user can pop in on any agentic tmux session from the web, and get a full top-down view of the system — fleet roster, health, work in flight, spend — without touching a terminal. This is the product surface for "user has ability to pop in on any agent session; full top-down view available."

Requirements

Attach service (W1)

ID Requirement
W-R1 A gateway service exposes per-agent session streams over WebSocket: watch (read-only pane view, cannot type) and butt-in (interactive takeover), mirroring the existing CLI verbs mosaic agent watch/attach.
W-R2 Authz is workspace-scoped through the product auth stack (BetterAuth/Authentik); watch and butt-in are separate grants; butt-in may be requires_approval per workspace policy (workstream P).
W-R3 Every attach (watch or butt-in) is audited: who, which agent, when, duration.
W-R4 Butt-in visibly flags the session to the agent runtime and other viewers (no silent takeover).
W-R5 Contract is stable JSON + streaming frames per F6's "stable JSON contract" requirement, so TUI/CLI and webUI share it.

Web terminal (W2)

ID Requirement
W-R6 xterm.js view in apps/web wired to W1: session list → click → live pane; toggle watch↔butt-in per grants.
W-R7 Reconnect-safe (network blips resume the stream), mobile-usable read-only view.

Top-down dashboard (W3)

ID Requirement
W-R8 Fleet dashboard: roster with per-agent state (systemd + tmux + heartbeat join, as fleet ps provides), current card/task, last activity, drift/boot-enable warnings.
W-R9 Work-in-flight view: backlog cards by state with depends_on DAG rendering; advisory spend per card (NS-2/NS-5).
W-R10 Operator controls: PAUSE kill-switch (NS-8), per-agent terminate (killswitch service), queue pause/resume — each gated + audited; destructive controls confirm.
W-R11 Existing widget framework (AgentStatusWidget, OrchestratorEventsWidget, SSE proxy routes) is the starting point, upgraded to the fleet contract rather than rebuilt.

Debate-accepted deltas (2026-07-09) — normative

ID Requirement
W-R12 Butt-in is an exclusive lease with explicit, visible takeover: at most one interactive holder per session at any instant; a second client must take the lease and both parties see the transfer. Input frames are sequenced and deduped so a reconnect never double-sends; a heartbeat/idle timeout closes both the lease and its audit span — audit spans always terminate (extends W-R1/W-R3/W-R4).
W-R13 Structured control plane: PAUSE, terminate, restart, approve/deny, and queue operations are typed API verbs with RBAC and audit — never bytes typed into a tmux pane. Raw terminal input via butt-in is rescue-only and a separately-grantable permission from the control verbs.
W-R14 Break-glass doctrine (documented, not prevented): SSH + tmux attach on the fleet host bypasses W1 and P by design; it is inventoried under P-R19, audited post-hoc from host logs, and never treated as a product path. PAUSE additionally has an on-host file/CLI actuator so a dead gateway can never lock the operator out of the control that fixes the gateway.
W-R15 W3 ships the trial metric panels as workspace-scoped product views over product storage: canary machine-flag correctness, approval decision latency, card priority distribution, wake→ack rate, agent-authored memory retrieval fraction, human interaction load, fixed-input probe stability. The X-R9 trial evidence pack cites these panels; until W3 exists, day-1 emission targets MALS (L1). Workspace isolation fixture: workspace-2 admin sees zero workspace-1 rows.

Acceptance criteria

  1. From a browser (desktop + phone), the user watches a live coder-agent pane read-only, then butt-ins with the right grant, types a message, detaches; agent session continues; audit log shows both.
  2. Dashboard reflects an agent crash within one heartbeat interval; PAUSE flip halts dispatch within one tick (AC-NS-5) from the UI.
  3. A user without butt-in grant can watch but cannot type (enforced server-side).
  4. Two clients contend for butt-in: exactly one holds the lease at any instant, the takeover is visible to both, and after a forced reconnect the input stream shows zero duplicated or interleaved frames (W-R12).
  5. With the gateway stopped, the operator PAUSEs the fleet via the on-host actuator; the bypass appears in the post-hoc audit (W-R14).

Non-goals

  • Replacing tmux as the session substrate (tmux remains the transport; web is a view).
  • Cross-host federation of the dashboard (rides the existing federation workstream later, per upstream note "Phase 5 rides federation").

Assumptions

  • ASSUMPTION: pty bridging terminates at the gateway on the fleet host (web1), not in apps/web; Next.js only speaks WebSocket to the gateway.
  • ASSUMPTION: the jarvis-brain dashboard's node-pty/xterm work (dashboard/server/terminal.ts) serves as reference implementation only; code is not ported wholesale into the multi-tenant product without the authz layer above.