12 — Two-lead work split + fleet monitor verdict
2026-07-18. Answers Tomas’s Q2 (“jak se nemydlit na tom samém”) and Robert’s fleet-monitor commitment (“kouknu na to”). Sources: fleet run 2026-07-18 (W3/W4/W5 + adversarial fact-check v_w3/v_w4 — corrections applied below).
1. Work split — Tomas vs Robert
Principle (Anthropic doctrine, verbatim, confirmed at claude.com/blog/ai-code-migration): “You don’t fix the code. You fix the process (loop) that produced the code.” + “front-load the human hours.” Tomas’s “já se teď hodně rozhoduju, víc agentů mi nepomůže” is exactly this phase — his human hours ARE the rulebook. Split accordingly:
| Tomas | Robert | |
|---|---|---|
| Owns | domain migrations in monorepo-development, architecture decisions, rulebook/doctrine content, knowledge architecture CONTENT | factory apps: fleet monitor, question-triage inbox, migration ledger, verification harness; scale infra (accounts/subscription farm); knowledge-architecture CONVENTIONS (ADR template, AGENTS.md hierarchy shape) as a shared contract |
| Decision role | DRI for anything in his domains | DRI for factory apps; consulted (not co-decider) on domain calls that touch factory data access — and vice versa |
Collision-avoidance protocol (structural rules, not vibes):
- CODEOWNERS partition, agent-scoped. Migrated-domain paths →
@ctzaruba+ his fleet identity;factory/**→ Robert + his fleet identity. Third bucket for shared/generated (clients, cross-cutting config): human-only, both leads required reviewers. Branch protection makes the boundary machine-checked. (2026 practice: CODEOWNERS as agent identity/governance — domain drift by an agent becomes an attributable, blockable event.) - Claim-before-work queue. Before either fleet starts a unit, it claims it in a shared queue — atomic claim, visible to the other side. Candidate: beads (Steve Yegge; Dolt-backed, hash-based IDs so two fleets on different branches can’t collide on a sequence counter) or lighter Backlog.md (git-native markdown board, same files are the human AND agent API). Beads = claim layer; the Temporal ledger (dossier §2) stays the state machine + audit trail. Two layers, not one.
OWNERSHIP.mdat monorepo root — one file, which app/domain is whose. Resolves what the claim graph can’t (“fleet monitor touches a Tomas-owned service’s telemetry hooks — whose?”).- Shared ADR log in monorepo-development (it’s the system of record; Robert’s factory-specific ADRs can live with the factory but cross-link). Format: MADR 4.0 minimal + two custom front-matter fields:
owner-domain(routing key — operationalizes “who decides”) and provenance footer (Decided-by: <model/session>, approved by <human>) for agent-made decisions. One decision-maker per ADR (DRI),consulted:for cross-domain side effects, supersede never edit-in-place — that’s what stops re-litigation. Both leads’ agents import the samedocs/adr/README.mdindex via CLAUDE.md/AGENTS.md — the actual mechanism that prevents “neither knows what the other decided.” - Worktree/git ops discipline: ≤8–10 concurrent worktrees per host; serialize git writes through one committer per host (known Claude Code failure: commit lost silently on lock contention, anthropics/claude-code#55724).
- Daily digest between leads (thin layer on fleet monitor): claim-queue diff per fleet / boundary violations / cross-bucket PRs awaiting joint review. No published pattern exists for two-lead-two-fleet cadence — this is invented, keep it cheap.
- Review capacity is the real constraint at volume: industry data — AI-authored PRs wait 4.6× longer for review pickup, 32.7% acceptance vs 84.4% human. Each lead reviews only their own bucket; cross-bucket needs both.
First test of the protocol: resolve the Drizzle-vs-raw-SQL conflict (ADR-0004, flagged in 01-ground-truth.md) through this exact flow — Tomas DRI, Robert consulted.
2. Fleet monitor — build-vs-adopt verdict
Verdict: adopt the base, build one thin layer. Nothing on the market covers 50–100 sessions with task-level metrics — confirmed twice independently (this pass + 02-web-research.md §7).
Adopt (foundation, ~1 day):
CLAUDE_CODE_ENABLE_TELEMETRY=1fleet-wide → OTel Collector → Prometheus + Loki → Grafana. Starting wiring: forkColeMurray/claude-code-otel(469★, stale 13mo but correct + small — pin, don’t track upstream). Dashboard: import Grafana 25255 (authorrockdarko, derivative of 25052) as base.- Per-agent cost attribution:
OTEL_RESOURCE_ATTRIBUTES="worktree=…,agent=…"(NOTCLAUDE_CODE_RESOURCE_ATTRIBUTES— that env var does not exist; fact-check caught it). Without tags or per-agent keys, cost-per-unit collapses into cost-per-session. - Keep
OTEL_LOG_USER_PROMPTSOFF (leaks prompts/credentials to the backend). - Operator quota awareness:
Maciek-roboblog/Claude-Code-Usage-Monitor(8.5k★, active) +ccusage. Do not build these. - Live terminal supervision to ~10–20 concurrent: claude-squad (smtg-ai, 8.1k★, active, tmux+worktree) or fork
claude_code_agent_farm(876★) for the 20+ tmux grid.
Mental model for the custom layer — Anthropic’s own Agent View (claude agents, research preview 2026; v2.1.139+): ONE sortable list — session name, status (needs input/working/done/idle), last assistant message — sorted so “needs input” floats to top, with inline reply without context-switching into the session. “You become the integration point, not the bottleneck.” That list, not a wall of Grafana panels, is what the two operators look at all day. Grafana = aggregate health/cost underneath. Session naming: auto-named (Haiku) + rename Ctrl+R + claude --bg --name "…" at dispatch — force human-legible unit names 1:1 with ledger rows.
Build (thin, ties into the ledger app): hook-event ingest (steal pattern from disler/claude-code-hooks-multi-agent-observability, 1.5k★) computing what nothing off-the-shelf tracks: task success rate, review-rejection rate, rework rate, retry-depth, cost/merged-unit, queue depth. Stall detection: claude_code.active_time.total plateau vs wall-clock climb. UI shape: kanban board — steal from Vibe Kanban (27.4k★; Bloop shut down Apr 2026 but relicensed Apache 2.0 to community — design donor / hard fork, not living upstream).
Dead/ignore: Terragon (shut down 2026-02-09, OSS snapshot only), Conductor (active but macOS-only single-operator), Cursor dashboards (vendor-locked), sniffly (11mo stale — steal its error-taxonomy idea only). Agent Teams (code.claude.com/docs/en/agent-teams): experimental, opt-in via CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 — inbox-per-agent JSON mailboxes, task self-claim with file locks, TeammateIdle/TaskCompleted hooks as gates; adopt for small-N coordination, not as the fleet monitor. Its anti-forgery rule (a relayed “human approved this” claim = untrusted input) goes into the question-triage design. Unverified: “AMUX” — flagged, re-check before relying on it.
Question-triage tie-in (Robert’s 17:35 idea “interface pro running agenty… distribuce otázek dle klíčů”): Anthropic’s own mailbox/inbox pattern validates the dossier’s build-thin verdict; langchain-ai/agent-inbox (maintained, LangGraph-coupled) is the only live off-the-shelf reference — worth a skim, still nets out build-thin on Temporal. Dedup/rate-limit/stakeholder-overload remains genuinely unsolved in public literature.