00 — SYNTHESIS: Fleet Monitor — Executive Recommendation
2026-07-18. Written by Fable (auditor/orchestrator) after the full research pass (13 agents, docs 01–07). This doc is the decision record: it resolves the cross-doc tensions the writers correctly refused to smooth over, folds in build-vs-buy, validation, advisor verdicts, and founder questions. Where it overrides a numbered doc, it says so — this doc wins.
Verdict: BUILD a limited MVP — a thin merge layer over things that already exist. Confidence: HIGH on shape, MEDIUM on the problem’s measured severity (that’s what the 1-week trial exists to establish).
The 001 verdict (ADOPT + thin layer, local-first) survives a hostile re-test, but shrinks twice: the research pass found most of the “build” already built (
fleetops,ghmonitor, Zaruba’s own REST endpoints), and the audit found the remaining thin layer thinner still (Langfuse rejected, no new ingest pipeline, no OSS UI fork). Estimated build: 2–4 operator-days to trial-ready. Maximum justified investment before trial evidence: one week. This is Robert’s committed first-to-ship deliverable to Tomas — sequence unchanged.
1. What the research changed vs 01-initial-recommendation.md
| # | 01 said | Evidence said | Standing |
|---|---|---|---|
| 1 | Open Q1: does local fleet tooling exist? | YES — ~/tui/ holds five maintained personal TUIs: fleetops (session board, status derivation, fleet snapshot JSON, wezterm pane-jump), ghmonitor (GH Actions/deploys), tokenomics, bridge, ground-control (VERIFIED R4) |
F1/F2 flip from BUILD to REUSE (04 §corrections) |
| 2 | Adopt Agent View for needs-input list | fleetops does the same job WSL-native without plan-tier gate; Agent View --json + inline reply retained as second feed |
Both — resolution §2.2 below |
| 3 | Build = hook ingest → SQLite → web page + fresh OTel stack | Data collection mostly exists; the genuine gap is aggregation/join + ledger metrics + Zaruba pane (02 §1, 03 §5) | Build scope cut roughly in half |
| 4 | Silent-stall problem (implicit fact) | Downgraded to HYPOTHESIS — zero recorded incidents; the one documented wave was clean (02 §2) | Trial’s primary open question, not a selling point |
| 5 | Ledger join in MVP | Ledger is decided-not-built AND its v1 needs separate fleet-hook wiring — two unbuilt things stacked (04 §corrections #4) | Degradation mode is the default launch state, not a fallback |
| 6 | Zaruba watch scope open | v1 = REST poll of workflow_executions + tasks, one VIEWER g-api-key token, zero new infra (R5). GH Actions PAT-blocked; Temporal/infra not provisioned |
F5 scoped, small |
| 7 | — (not known to 01) | research/12’s implicit architecture donor (disler repo) has no license — legally unusable as-is (VERIFIED R1) |
Pattern reimplemented clean-room; moot anyway since hooks HTTP-forward is first-party documented |
2. Auditor resolutions (tensions the writer docs left open — settled here)
2.1 Pattern A/B — RESOLVED, was flagged as the top feasibility risk (02 §0)
Task-tool subagents run in-process inside the parent Claude Code session. They are not separate OS sessions: no own ~/.claude/sessions/<pid>.json, invisible to fleetops’s /proc discovery and to claude agents. Evidence: VERIFIED-BY-OPERATION today — this plan’s own research workflow ran 13 agents that appear on disk only as subagents/workflows/wf_…/journal.jsonl + agent-*.jsonl under the parent session’s transcript directory, while the machine ran one Claude Code process.
Consequences, settled:
- A Pattern-B wave (Fable fanning subagents — how all fleet work to date has actually run) appears on the board as one busy session. The tooling is not blind to the wave; it is blind to per-agent structure within it.
- The per-agent structure is recoverable from two sources that need no new instrumentation: hook events (
SubagentStart/SubagentStopfire in the parent session — R6) and workflow journal files (per-agent state, label, tokens,lastProgressAt— ideal stall signal at subagent granularity). The board’s wave drill-down ingests these; F3 gains one small “journal tailer” input alongside hooks. - Needs-input routing is unaffected: in Pattern B the orchestrator session is the thing that asks the operator, so the needs-input list stays session-level and correct.
- Story #6 in 02 (pattern-mismatch banner: “wave declared M units, 0 sessions found”) stays in MVP — it is now a display of a known dual-mode reality, not a probe of an unknown.
2.2 F1 data source — fleetops primary, Agent View corroborating
fleet snapshot is the primary feed (WSL-native, no tier gate, pane-jump, already trusted). claude agents --json runs as second feed for corroboration and as the inline-reply path (F2). Disagreement between feeds renders as unknown-gray, never a guess — feeding the trust SLO instead of fighting it. (Resolves 02 vs 03; 06’s deferred open item — decided: yes, both.)
2.3 Langfuse — REJECTED for MVP (overrides 03 §2/§4/§6)
03 recommended self-hosted Langfuse as a third adopted component. Audit overrules: six containers (web/worker/Postgres/ClickHouse/Redis/MinIO) to give two operators trace drill-down that the Unit drawer + session JSONLs already provide, for a product whose concept explicitly removed “historical analytics suite.” That is freight, not thinness — the same test 05 applies to every panel (“what decision does it change?”) kills it. Revisit post-MVP only if the trial demonstrates a real trace-forensics need that transcripts can’t serve.
2.4 Encore Cloud deploy surface — VERIFIED TODAY, gap closed (downgrades 06 risk 3, 07 mode 14)
Checked live 2026-07-18 (encore.dev/docs/platform/integrations/api-reference + …/webhooks): Encore Cloud has a rollout API (GET/POST /api/apps/{app}/envs/{env}/rollouts, statuses pending/queued/running/completed) and per-app webhooks for build/provision/deploy start-finish events (Go type defs in go.encore.dev/webhooks). The backend-deploy blind spot is therefore not structural — it needs one thing: Tomas configures a webhook (or issues an API key) for the two Encore apps. Post-MVP item with a concrete path; pre-mortem mode 14 likelihood drops M-H → L-M, and the honest digest label (“backend deploy not yet covered”) is needed only until that ask lands.
2.5 OTel stack in MVP — YES, kept (resolves 02’s open question)
02 asked whether the compose stack is needed for v1 at all. Kept: it is the only source of cost/token truth (claude_code.cost.usage tagged via OTEL_RESOURCE_ATTRIBUTES) and the stall heuristic’s active_time input — and it is config + a frozen fork, not code. Loki stays per 06 ADR-9 (content-free event text has no other home) with a cut-if-unused-at-trial-retro review. Cardinality guard: OTEL_METRICS_INCLUDE_SESSION_ID=false for aggregate panels from day one (pre-mortem mode 11).
3. Final disposition table (canonical — supersedes 03 §6 where they differ)
| Layer | Disposition | Component |
|---|---|---|
| Session discovery + status board feed | REUSE | fleetops (fleet snapshot) |
| Needs-input corroboration + inline reply | ADOPT | claude agents --json / Agent View |
| Cost math / pricing table | ADOPT | ccusage (shell out; MIT, active) |
| OTel wiring | FORK-PINNED | ColeMurray/claude-code-otel compose skeleton (MIT, frozen at SHA) |
| Aggregate panels | IMPORT | Grafana dashboard 25255 (linked from board, never embedded) |
| GH Actions/deploy watch | REUSE (post-PAT) | ghmonitor |
| Hook→ingest→SQLite pattern | STEAL (clean-room) | disler-shape reimplemented via first-party hooks HTTP-forward; disler code untouchable (no license) |
| Error taxonomy | STEAL | sniffly categories |
| Board UI + queue + drawer + Zaruba strip | BUILD-THIN, bespoke | per 05; no fork — claude-view / hoangsonww solve a narrower single-host problem (06 ADR-3); optional 1-hour hands-on look at claude-view before UI start, timeboxed, not a gate |
| Zaruba poller | BUILD-THIN | 2 REST endpoints, VIEWER token, host cron |
| Wave drill-down (Pattern B) | BUILD-THIN | workflow-journal tailer + SubagentStart/Stop hooks (§2.1) |
| Digest + wave report | SCRIPT | GChat webhook; docs/llm-runs.md reuse |
| Session/trace UX (Langfuse), kanban, Grafana Cloud/Datadog, Temporal-direct, auto-remediation, auth, mobile, cloud deploy | REJECT / DEFER | §2.3; 01 removals all re-confirmed |
4. Build-vs-buy, concluded
Eight options assessed across 03 §4 + audit: (1) build from scratch — irrational, the ecosystem covers collection; (2) build on OSS foundation — partially, as forks/pins only, no living upstream to track; (3) buy — nothing to buy: every SaaS fails confidentiality (Datadog, Grafana Cloud, claude.ai/code cloud) or ops-weight (LangSmith, Weave, Braintrust) bars; (4) integrate existing tools — YES, this is the core: fleetops + Agent View + ccusage + Grafana + Zaruba’s REST, joined; (5) partner/white-label — n/a internal; (6) managed service — n/a, we are the operators; (7) process-only — holds only below ~10 concurrent (tmux + eyeballs); today’s 34-agent wave already exceeded it; (8) abandon — unjustified: Tomas’s watch ask alone (F5, near-zero build) clears the bar even if the fleet board proves unnecessary.
The chosen shape is (4) with a thin (2): integrate-and-join, with the only genuinely novel build being the ledger-joined metrics, the stall-confidence signal, the Zaruba pane, and the one-screen attention router that fronts them.
5. MVP and sequence
Per 04 §MVP (F1–F7), with §2 resolutions applied. Sequence: F5+F6 first (Zaruba poller + digest — smallest, fulfils the explicit ask, zero trust-SLO exposure), then F1/F2 wiring (reuse), then F3 config + journal tailer, then F4 board. Rationale: 04’s own pivot criterion anticipates F5 delivering measured value before the board finishes earning trust — so ship it first and let the pivot test run for free. Acceptance: the seven 1-week-trial criteria in 04, with 05 §6’s substitutions (ledger metrics render “unavailable” all week by design).
North Star: median time-to-unblock (question raised → operator reply sent), day-1 measurable, ledger-free. Guardrails: false-needs-input rate, total fleet cost, queue-depth trend. Anti-metrics: panel count, metrics-that-changed-no-decision.
6. Validation plan (folded)
The 1-week live trial on the next real wave IS the validation instrument (04 acceptance criteria). Riskiest assumptions and their coverage: 02 §6 table — all covered by the trial except one: “executions+tasks is what Tomas means by watch my deployments” requires showing him the digest and asking, pre-trial, one GChat message. Pattern A/B is resolved (§2.1) and drops off the risk list. Kill/pivot criteria: 07 §kill (board unopened 5 consecutive days ×2 in 6 weeks, OR two false-negative needs-input incidents in one week → kill custom board, keep Zaruba script + digest) and 04 §pivot verbatim.
7. Five-advisor verdict (principle-based simulation, no quotations)
- Jobs (focus): would approve the doorbell-not-cockpit framing and demand the removal list stay removed; would challenge shipping seven F-numbers — F5+F6+F1 is the product, the rest must justify themselves weekly. Evidence to invest: the trial’s zero-missed-events week.
- Ive (coherence, reduction): would endorse one-canvas IA and five state colors; would challenge Loki and the metric tiles as latent wall-creep; would ask that “unavailable — ledger required” be designed as carefully as success states, since it is the most-shown state at launch.
- Cagan (outcome, riskiest-assumption-first): would flag that the highest-risk assumption is desirability (silent stalls = HYPOTHESIS), and approve that the trial tests exactly that before more build; would insist the kill criteria stay armed, not decorative.
- Torres (continuous discovery): would approve the assumption table in 02 §6; would require the weekly retro actually interrogate “which metric changed a decision” and feed removals, making discovery continuous rather than one trial.
- Christensen (JTBD): the job — “tell me which worker needs me, before I go looking” — is real and currently hired to tmux + muscle memory at near-zero cost; the product must beat an incumbent that costs nothing, which is why trust (not features) is the entire battle. Fleet monitor is sustaining tooling for the factory, not disruption — correctly scoped as such.
8. Founder questions (the hard ten, internal edition)
- Will Robert actually keep the Board ambient — second monitor, always on — or is the honest interface a TUI pane inside the terminal he already lives in? (05 risk #2’s hidden precondition; cheapest possible pivot if the answer is “terminal.”)
- If the next three waves all run Pattern B (one orchestrator session), is the session board worth building at all before the wave drill-down?
- Does Tomas mean Encore Cloud deploys when he says “deployments” — and will he configure the webhook? (One message settles it.)
- When does the work-ledger actually get built — and if the answer is “not this month,” does the cost/merged-unit pitch come out of every doc sent to Tomas until then?
- What is the concurrency plan that makes stall detection matter — is 64-concurrent real near-term, or is ≤16 the operating reality where eyeballs almost suffice?
- Is
fleetops’s status derivation accurate enough to bet the trust SLO on? (One afternoon of side-by-side with tmux answers it — do this before the trial, not during.) - Who maintains the monitor in month 3 when the rebuild is the priority — does the calendared maintenance slot (pre-mortem mode 7) actually exist in Robert’s week?
- If Anthropic ships cross-session needs-input aggregation in the next Agent View release, is the discipline really there to delete the board that week?
- Is a GChat digest actually read by Tomas, or does it become notification wallpaper — and how would we know? (Digest includes one question in week 1 to force a signal.)
- What number, seen at the week-1 retro, would cause an honest “kill” call rather than one more iteration — and is it written down before the trial starts? (It is: §6 kill criteria. Keep it binding.)
9. Confidence and caps
- Shape (thin merge layer, reuse-first): HIGH — confirmed by three independent doc passes and the audit.
- Problem severity (silent stalls, triage pain at current N): MEDIUM — hypothesis until the trial measures it.
- Max investment before trial evidence: 1 operator-week. The build should cost 2–4 days; if it is trending past a week, that is itself a signal the thin layer is not thin — stop and re-scope.
- Standing decision hygiene: any scope addition post-trial passes 05’s one-question review (“what decision does this change?”) and gets a MADR entry with
owner-domain+Decided-by:per the shared ADR convention.