Skip to content
GRPNR.

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/SubagentStop fire 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)

  1. 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.”)
  2. 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?
  3. Does Tomas mean Encore Cloud deploys when he says “deployments” — and will he configure the webhook? (One message settles it.)
  4. 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?
  5. 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?
  6. 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.)
  7. 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?
  8. 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?
  9. 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.)
  10. 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.