Rook · Internal · Deep Audit

State of the Harness

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.

02Claimed vs real

Claim (injected every session)Reality (verified live)
"17 active crons — VERIFIED LIVE"1 of 39 enabled
"Guardian watchdog every 5 min"Disabled since May 3
"Daily workspace git snapshots"Last backup May 5 — 101+ days uncommitted
Main brain: "Opus 4.6" / "4.8" / "GPT-5.4-pro" (4 conflicting claims)Config: opus-5 · live session: fable-5 pin only
"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.

  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. 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
  1. Reconcile the May-5 git divergence, commit the 3.5-month tree, re-enable hourly backups + a backup sentinel.
  2. 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.
  3. Persist fable-5 as config primary for main; add a cross-provider fallback; replace the dead global default model.
  4. Repoint memory-search embeddings off the capped provider; verify recall; dreaming promotion unstarves itself.
Wave 1 Truth reset
  1. Rewrite the constitution to the ≤5k-token structure; freshen working-state + handoff; staleness banners in the SessionStart hook.
  2. Cron graveyard: delete ~28 tombstones; retune Morning Brief + Daily Log Close onto working model refs with failure alerts; deploy the three sentinels.
  3. Archive sweep: dead memory stores (~440 MB), dead scripts (~21 orphans), skill dedupe (3× deep-research, 3× browser-automation, dead-infra skills).
Wave 2 Platform upgrade — attended, Thomas-present window (~30 min)
  1. 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.
  2. 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
  1. Evaluator subagent + versioned rubrics for every autonomous deliverable (Anthropic's strongest documented lever — targets the confident-fabrication failure class we've hit).
  2. Regression micro-suite (~10 cases from past incidents), run weekly and after any config/SOUL change.
  3. Morning accountability digest; dream-pass anti-rot objectives; monthly fallback drill; deterministic pipelines for the 3 most-repeated procedures.

07Decisions needed — three

#DecisionDefault
1Green-light Waves 0–1. Every step reversible, nothing external-facing.Execute today unless redirected
2Upgrade window for Wave 2 — needs you reachable, ~30 min.Propose next shared window
3Kill-list sign-off: Crew system, LCM store (372 MB), personal-surface disposition, voice tunnel, pm2 leftovers.Full list in lane reports

08Lane summaries

Lane 1 — Platform & config
  • Gateway fundamentally healthy: 13d clean uptime, no recurring errors; billing proxy up.
  • Voice tunnel crash loop root-caused: rate-limited account-less quick tunnel; the 10s restart loop sustains its own ban.
  • Feared auth-store migration already completed cleanly — upgrade risk lower than memory claimed.
  • 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."
  • Daily-note cadence broke Aug 13; reload ritual collapsed 291→4 recordings (Apr→Aug).
  • 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.