feat(fleet): Phase-2 observability — fleet ps + watch + send verify #579
Reference in New Issue
Block a user
Delete Branch "feat/fleet-observability"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #578. Workstream W-FLEET under mvp-20260312. North star: docs/fleet/north-star.md
Operator observability for the durable tmux fleet (per docs/fleet/PRD.md):
Tests: 62 (31 new). Live-verified on mosaic-factory: fleet ps surfaced canary-pi DRIFT + BOOT-ENABLE; HB healthy after responder landed.
Review: dual-engine (Claude + gpt-5.5/Codex), Lead-serialized merge.
- isSendAccepted now returns 'accepted' | 'draft' | 'unverifiable' (was bool) - Blank/empty capture => 'unverifiable' => process.exitCode=1 with distinct "could not verify delivery (blank/no response captured)" message; previously blank was treated as success, violating FR-5 fail-closed semantics - Draft line ('^> ') => process.exitCode=1 with "left as unsubmitted draft" message; distinct wording from unverifiable case - agent watch now dispatched through injectable InteractiveRunner (stdio:inherit) instead of the capturing CommandRunner; tmux attach requires TTY passthrough - Default spawnInteractive implementation uses node:child_process spawn with stdio:'inherit'; injectable via FleetCommandDeps.interactiveRunner for tests - Removed buildSystemdIsActiveCommand (dead code — exported but unused) - Tests: blank=>exitCode=1, draft=>exitCode=1, real response=>exitCode=0, watch dispatched through interactiveRunner not capturing runner - PRD: added "Known limitations" section (heuristic verify, blank fails closed, non-pi/claude draft detection is best-effort, watch requires TTY passthrough) - Code comment on isSendAccepted notes pi/claude-specific draft heuristic Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RMoEx7hfdFGjUiCHuN1RRi