Full 6-lane read-only audit of the Rook agent system · run overnight 2026-08-18 → 19 · nothing was modified
01The one-paragraph diagnosis
The engine is healthy; the operating system around it decayed. Inference is near-perfect — zero model errors in 7 days, auth clean, no metered spend leak. But automation is functionally dead (1 of 39 crons live), the workspace hasn't been backed up in 3.5 months, two runaway services burned tens of thousands of restarts unnoticed, semantic memory search is broken right now, and 55–65% of the "constitution" injected into every session is false — it narrates an April civilization (Crew, Patrol, Guardian, wiki loop, Opus 4.6) that no longer exists.
Root failure mode, singular: we build capability and never decommission it — and nothing watches the watchers. The fix is not new architecture. It is subtraction, repair, and three cheap sentinels that make silent death impossible.
"LCM active context engine; Cortex injects memories"
Both plugins disabled; Cortex frozen since Apr 5
"Wiki intelligence loop: 4 jobs confirmed working"
All wiki crons dead since Aug 1
— (never claimed; never noticed)
personal-surface: 31,579 restarts/24h · journald at 3.9 GB
—
voice tunnel: ~124k restarts, flapping 14+ days
—
memory_search: broken (embedding provider cap)
—
Compaction: 4/4 recent soft-fails; main session at 113% of context budget
03How it died
May 3–5 Guardian broke on a platform update → disabled. Backup script hit a rejected git push → silently failed → disabled. Both backup paths died the same week.
May 22 "claude-cli-isolation" sweep: ~20 crons mass-disabled after the model allowlist changed; every legacy-model job was error-looping. Nobody retuned them.
Aug 1 The last 5 daily jobs (Morning Brief, Daily Log Close, wiki loop) died on a broken model ref — a fix documented in our own memory, never applied to the cron payloads.
Throughout Zero alerting existed, so every wave was silent. The constitution kept its April "VERIFIED LIVE" stamps.
04What's actually good
Inference core
368 CLI execs / 7 days, zero errors. Claude Max auth auto-refreshing. Billing proxy clean, 15d uptime, no metered leak. 96% prompt-cache hit on main.
Claude auto-memory
The only memory layer that stayed accurate — because it has an owner and a write discipline. That's the lesson, and the template for the spine.
SessionStart hook
Best-engineered continuity piece in the stack. Mechanism sound; the content it injects is stale (a 20-day-old "next action").
Dreaming pipeline
Right architecture — the industry now calls it sleep-time compute. Starved plumbing: broken recall scoring means ~0 promotions actually happen.
Independent validation: Letta — the MemGPT lineage — landed in 2026 on files + git + bash + a background consolidation agent. Exactly this stack. We independently built every published pattern (sleep-time compute, wiki/graph memory, topic-file memory, consolidation-to-durable-file) — we just ran five generations in parallel and let the connective tissue rot.
05Target architecture
One spine, one write path per fact class, sentinels that can't lie.
Memory spine, 4 pieces: daily notes (episodic log) · SessionStart hook with staleness banners (continuity) · one curated topic-file layer with verified: dates (durable facts) · semantic search + nightly dreaming upgraded to an anti-rot engine — contradiction tombstoning, supersession, procedural rewrites, repeated-procedure→skill proposals. Everything else archived.
Constitution ≤5k tokens, invariants only. Behavioral content survives; every table with a ✅ column becomes a live command. Rule: if it can go stale, it's a command, not a file.
Model map in config, never in session pins: fable-5 main (persisted), sonnet-5 + cross-provider fallback, opus-5 subagent fan-out, cheap utility tier post-upgrade. Written fallback chain + monthly drill.
Three no-LLM sentinels — service-flap alerter, backup sentinel, cron-health meta-check. Each would have caught a silent death this year. Plus a weekly doc-drift detector (one model call).
Verification culture, encoded: separate skeptical evaluator subagent with versioned rubrics for autonomous deliverables · regression micro-suite built from past incidents · worker output contract (no artifact = failure) · morning accountability digest (cron results + memory git diff + failures + one pending decision).
06The plan — waves, hours not weeks
Wave 0 Stop the bleeding — no upgrade required, all reversible
Reconcile the May-5 git divergence, commit the 3.5-month tree, re-enable hourly backups + a backup sentinel.
Un-break personal-surface (one-line lint fix — or retire it deliberately); stop the voice-tunnel flap (park until a named tunnel replaces the rate-limited quick tunnel). Vacuum journald.
Persist fable-5 as config primary for main; add a cross-provider fallback; replace the dead global default model.
Repoint memory-search embeddings off the capped provider; verify recall; dreaming promotion unstarves itself.
Wave 1 Truth reset
Rewrite the constitution to the ≤5k-token structure; freshen working-state + handoff; staleness banners in the SessionStart hook.
Cron graveyard: delete ~28 tombstones; retune Morning Brief + Daily Log Close onto working model refs with failure alerts; deploy the three sentinels.
Archive sweep: dead memory stores (~440 MB), dead scripts (~21 orphans), skill dedupe (3× deep-research, 3× browser-automation, dead-infra skills).
Doctor-fix pre-existing state conflicts (the new version fails closed on them) → snapshot → upgrade 2026.6.11 → 2026.7.1-2 → verify per checklist. Also attended: Codex CLI update (unlocks the configured-but-dead default model), Claude CLI update.
Post-upgrade adoptions: utility-model routing, per-cron model overrides, SecretRef for plaintext secrets currently in config, Usage dashboard, stop/reset hooks writing handoff artifacts automatically.
Wave 3 Top-level practices
Evaluator subagent + versioned rubrics for every autonomous deliverable (Anthropic's strongest documented lever — targets the confident-fabrication failure class we've hit).
Regression micro-suite (~10 cases from past incidents), run weekly and after any config/SOUL change.
Morning accountability digest; dream-pass anti-rot objectives; monthly fallback drill; deterministic pipelines for the 3 most-repeated procedures.
07Decisions needed — three
#
Decision
Default
1
Green-light Waves 0–1. Every step reversible, nothing external-facing.
Execute today unless redirected
2
Upgrade window for Wave 2 — needs you reachable, ~30 min.
Pre-existing state-migration warnings must be doctor-fixed before upgrading (new version fails closed).
Version gap is one big minor: crash-loop safe mode, secret redaction, Telegram steering, session groups, utility-model routing; no config schema breaks for us.
Plaintext secrets sitting in the main config file — move to env files / SecretRef.
Lane 2 — Model routing & reliability
The fable-5 main-brain decision exists only as a session pin. Any reset silently promotes the config primary — the model class behind the old fabrication loop. Persist it.
Compaction soft-fails 100% (4/4 in 6 days); main session at 113% of its context budget. Needs one instrumented run to diagnose.
Global default model is dead on the installed Codex CLI (client too old); fallback chain rescues traffic but the primary is dead weight.
Otherwise excellent: 0 errors/429s/stalls in 7 days; auth healthy; no metered spend since March/April.
Nightly narrative lane silently produced no text 3 nights running behind an "ok" cron status.
No cross-provider fallback on main — a Max outage takes down both options today.
Lane 3 — Memory & context
memory_search is broken right now — embedding provider over cap; also starves dreaming promotion (all candidates at 0 recalls).
Five generations of memory architecture stacked; only the newest runs. Cortex (Apr), ByteRover (Jun), LCM (May) all dead — yet still mandated by the constitution.
SessionStart hook injects a 20-day-old working state and an 82-day-old handoff as "where you left off."
Claude auto-memory is the single accurate durable layer — adopt its topic-file pattern as the spine.
Verdicts: keep 4 spine pieces · archive 6 layers · kill LCM (~372 MB) · rewrite the 3 truth files.
Lane 4 — Automation & services
39 crons, 1 enabled. Death in 3 waves (May 3, May 22, Aug 1), all silent, zero alerting configured anywhere.
No workspace backups since May 5; both backup paths (Guardian + hourly script) disabled the same week.
personal-surface runaway: 31.5k restarts/day on a one-line lint failure; 3.9 GB journal; a tunnel still publishes a hostname to the dead port.
Guardian script itself is good; re-enable health-check + alerting, but gate the auto-rollback (dangerous heuristic on this repo).
Crontab PATH points at a nonexistent node install — any re-enabled cron would fail silently. Fix first.
Verdicts: keep 1 · retune 5–7 (Morning Brief first — best prompt on the box) · delete ~28. Proposed: 3 no-LLM sentinels + doc-drift detector + stale-memory sweeper.
Lane 5 — Operating files & skills
~17.5k tokens of fixed per-session injection; 55–65% stale or false. Four conflicting engine claims across files.
Every ✅-table in the constitution is wrong somewhere; verification stamps lost meaning (3 different stamps in one file).
Proposed slim constitution: ~5k tokens of invariants + behavior; live state comes from commands.
~70 skills across 4 locations; heavy duplication; several wired to dead infrastructure. Dedupe + park list drafted.
Of 38 scripts, 2 are wired live; ~21 orphans to archive.
Dream diary (181 KB of plausible operational narrative) sits in workspace root where a recovering session could read it as fact — rotate it out.
Lane 6 — Industry research
Generator/evaluator separation is Anthropic's flagship harness pattern — a separate skeptical judge with written rubrics; self-graded work is the #1 documented failure mode.
Structured handoffs + fresh sessions beat compaction for long autonomous work; compaction is for chat lanes.
Letta converged on files + git + bash + sleep-time consolidation — validating this stack's shape; their memory-rot taxonomy maps exactly onto our drift.
Regression suites for agents: every past incident becomes a permanent test case; run on every config change.
Routing consensus: ~85% of traffic shouldn't hit the frontier model; three explicit tiers; fallbacks tested before the incident, monthly.
Platform features we're not using (post-upgrade): utility-model routing, per-cron models, usage dashboard, lifecycle hooks, deterministic pipelines, extended-stable release channel.