Fleet Evaluation: Cost vs Capability — 2026-10-13

Read-only analysis of Byron's agent fleet on Mia (Mac Mini). No configs edited, no containers restarted, no paid APIs called (OpenRouter /api/v1/models is an unauthenticated free endpoint and was the only external call). All dollar figures come from the fleet's own ledgers unless marked (est). Every claim cites the file it came from.


A. Executive summary (one page)

Where the money goes. The True Cost Ledger (~/openclaw-gia/config/workspace/research/finance/cost-log/true-cost-*.jsonl) shows a steady $11-13/day for Gia + $0.4/day for Mia over Sep 30 - Oct 12 (mean $11.8/day, ~$355/mo). Add known un-priced usage (Opus-5 owner chat is priced at $0 in the ledger, OpenAI TTS logged at $0, xAI images untracked) and the real figure is ~$380-420/mo (est). Cia, Tia, Gia2 and Ria cost ~$0 in API dollars (local Ollama or Claude Code subscription).

Three facts drive 90% of the spend:

  1. The Signal podcast is 60% of the fleet — ~$7.1/day on Claude Fable 5 (~$215/mo). Per-session attribution from live transcripts: AM episode $3.4-4.3, PM update $2.5-3.3, and the AM Watchdog $0.90 for a 2-turn ls. The run logs self-report "$0.31-0.44, under $1.50 target" (research/briefings/signal/2026-10-1*-am.md) — a 10x under-report because they ignore cache writes/reads. Half of the Fable bill is prompt-cache writes (~190K tokens/day at $20/M) and cache reads of a 410 KB ledger.json (465 signals, 421 already closed) re-read on every turn.
  2. ~$120/mo of "plumbing" crons pay a full agent boot to run a shell script. Spend Guard (48x/day), OB1 Dictation Consumer (48x/day on Gemini 2.5 Pro), city alias guard (24x/day), Self-Heal (12x/day on Haiku), Model Guard, True Cost Ledger, Prefetch: each spawns an agentTurn that loads ~30-60K tokens of context to run one command and reply NO_REPLY. Four other crons (SMS relay, RAI watcher, Byron Command, Asset Sync) already use the command kind and cost $0.
  3. Nothing re-benchmarks or re-routes automatically. set-best-claude.sh is unscheduled, Opus-only, and lists a non-existent openclaw-nia; monitor-models.js is unscheduled with state last touched 2026-06-22; the Model Guard cron + self-heal.sh hard-pin the primary to claude-opus-5 and revert any change. The Router Gauntlet harness is good and cheap ($3.95/256 calls) but accuracy is saturated (15-16/16 for everyone), so it can no longer tell models apart.

Top 10 changes, ranked by $ saved/month and capability gained

#Change$/mo saved (est)CapabilityEffortRisk
1Convert the 7 "run script, reply NO_REPLY" crons to command kind (script sends its own Telegram line via the existing notify path). Spend Guard, OB1 Dictation Consumer, city alias guard, True Cost Ledger, Morning Brief Prefetch, Self-Heal, Model Guard.$100-115same; fewer LLM failure modesLow (cron edits + ~30-line notify wrapper)Low — pattern already live for 4 crons
2Signal AM/PM: gather by script, synthesize in one turn. A prefetch-signal.sh (clone of scripts/brief/prefetch-brief.sh) builds a 15-20K-token packet; Fable gets 2-3 turns instead of 16-36.$110-140more reliable (fewer tool-call failures), same voiceMediumMedium — must preserve the ledger/delta logic in the script
3Prune ledger.json: move the 421 closed signals to ledger-archive.json; keep the hot file <40 KB.$30-50 (overlaps #2)faster runsLowLow (backups already kept)
4Signal AM Watchdog → command kind: test -s *.mp3 and only spawn an agentTurn when the file is missing.$27identicalTrivialNone
5Retire Haiku 4.5 as the T2 tier: OpenRouter lists anthropic/claude-haiku-5.5 at $0.10/$0.50 vs Haiku 4.5 $1/$5 (verify on direct API). Also google/gemini-3.1-flash-lite $0.25/$1.5 for Gemini-tier crons.$30-35 (after #1, residual Haiku use: subagents, audit, race-radar)newer modelLowLow — verify tool-calling parity on one cron first
6A/B the Signal synthesis model for one week: Fable 5 vs Opus 5 ($5/$25) vs Sonnet 5.5 ($3/$15 on OR), blind pairwise judge + Byron thumbs via action card. Switch if parity.$30-60 (post-#2 Fable residual ~$70/mo)possibly none lost; benchmark says accuracy is saturated but writing was never testedLowMedium — Byron's "Fable thinks" rule; keep Fable if A/B says so
7Fix the fallback chain: openai/gpt-4o-mini is a dead rung (400 Invalid value: 'custom' on tools, seen 2026-10-13 10:05 in docker logs openclaw-gia), so the Morning Brief escalated to Gemini 2.5 Pro. openrouter/anthropic/claude-sonnet-4-6 and -haiku-4-5 aliases are no longer listed on OpenRouter.$5-10reliability: fallbacks that actually workLowLow
8Fix the ledgers: add claude-opus-5, gpt-4o-mini-tts, Gemini TTS, xAI image, GPT-5.x to cost-ledger.py PRICES; reconcile cacheWrite multiplier (2.0x in cost-ledger.py vs 1.25x in scripts/cost/spend-limits.json — a ~$1.4/day swing on Fable); make the Signal run-log cost line read the ledger instead of self-estimating.$0 (but +$15-40/mo of hidden spend becomes visible)truthLowNone
9Consolidate the four 05:30-06:10 morning products on one gather bundle (RAI report, Signal AM, Morning Brief, Ria brief all read the same transcripts, email, RAI feed, cost summary). Feed Ria's 74-source screened items into the bundle and drop the duplicate Brave queries in generate-rai-content.py and fetch-rai-news.py.$10-20 direct; makes #2 cheaperconsistency: one set of facts narrated three waysMedium-HighMedium
10Replace the Model Guard / self-heal hard-pin with a single registry/model-policy.json that the weekly evolve loop (section C) proposes changes to and the guards read — so the fleet can move without flapping. Also Mia heartbeat 2h on Gemini Flash → local gemma4 or 6h ($10/mo).$10the fleet can evolveMediumLow

Total addressable: ~$300-350/mo of the ~$380-420/mo, with no capability loss in #1, #3, #4, #7, #8 and a measured decision in #5/#6. Floor after all ten: ~$60-100/mo (est), dominated by one Fable/Opus synthesis turn per Signal episode plus TTS.


B. Inventory tables

B1. Agents x models

Source: each agent's openclaw.json (paths in column 1) and docker ps / openclaw.mjs --version on 2026-10-13.

Agent (container)VersionPrimaryFallbacksHeartbeatSubagentsImageNotes
Gia openclaw-gia (~/openclaw-gia/config/openclaw.json)2026.7.1-2anthropic/claude-opus-5 (alias misleadingly "Opus 4.8")gpt-4o-mini (broken), gemini-2.5-flash, gemini-2.5-pro, deepseek-chat, openrouter/auto24h, Haiku 4.5Haiku 4.5xai grok-imagine-image-quality → gemini-3-pro-image → gemini-2.5-flash-imageria sub-agent on Fable 5 (last session 2026-07-07, unused). thinkingDefault: off. Memory search = Gemini.
Gia2 openclaw-gia2 (~/openclaw-gia2/config/openclaw.json)2026.8.34anthropic/claude-opus-5gpt-5.4-mini, gemini-2.5-flash, gemini-2.5-pro, openrouter/auto24h Haiku (status no-route, Telegram off)Haiku 4.5same as Gia0 session files → $0. muse agent on openrouter/meta/muse-wonder ($4/$20) blocked by OpenRouter 18+ gate. skill-collection-review-main errors ("No callable tools remain").
Mia openclaw-gateway (~/openclaw-stack/configs/openclaw.json)2026.7.1-2google/gemini-2.5-flashclaude-haiku-4-5, ollama/gemma42h, gemini-2.5-flash—nano-banana-pro / openai-image-gen skills$0.30-0.45/day, almost all heartbeat + "Memory Dreaming Promotion" 03:00. Its own MEMORY.md says "gemma4 local" — config disagrees.
Cia openclaw-cia (~/openclaw-cia/config/openclaw.json)2026.7.1-2ollama/qwen3-coder:30bqwen2.5-coder:14b, gemma3:27b, gemma4———$0. One cron: "Forge Heartbeat" 09:00 daily on local model.
Tia openclaw-tia (~/openclaw-tia/config/openclaw.json)2026.7.1-2ollama/gemma4:latestclaude-haiku-4-5, gemini-2.5-flash30m, gemma4 (local)——~$0 unless fallback fires. Aliases wrong: openai/gpt-5.4-mini labelled "GPT-4o-mini".
Ria (host launchd, not a container; ~/openclaw-gia/config/workspace/projects/ria/agent/)n/aClaude Code subscription: sonnet (brief), haiku (moltbook classify)local Ollama for screening (qwen3.6/qwen3/gemma4/gemma3)———$0 API; ledger records list-price notional ($0.07/day, state/cost-ledger.jsonl). Daily cap $3 (config.json).

Local models available (curl localhost:11434/api/tags, 18 models, 243 GB): gemma4:31b, qwen3.6:35b-a3b, muse-glimmer:30b-mlx, nemotron 42GB, qwen3-coder:30b, gemma3:27b, mistral-small3.2, qwen2.5-coder:32b/14b, deepseek-r1:14b, phi4, hermes3:8b, llama3.1:8b, gemma3:12b, gemma4:latest (9.6GB), nomic-embed-text, nemotron-mini:4b, deepseek-coder. Only Ria's screen, Cia, Tia and podcast-transcribe (ollama/gemma3_12b, per-call log) actually use them.

B2. Scheduled jobs x model x frequency x cost x consumed?

Cost column = 7-day attribution from live Gia transcripts (/home/node/.openclaw-gia/.openclaw/agents/main/sessions/*.jsonl, priced with the ledger's table), divided by 7. Where the sessions index did not label a session (daily crons get a fresh session each run), attribution is by model and schedule; those rows are marked (est).

Gia crons (openclaw.mjs cron list --json in openclaw-gia, 19 jobs, all enabled, all lastStatus: ok):

JobKind / modelFrequencyWhat it does$/run (est)$/mo (est)Output consumed by
Signal AM PodcastagentTurn / Fable 5daily 05:50 ETGathers 10 sources, delta vs ledger, writes 1300-1500 word script, OpenAI TTS, Telegram mp3 + action cards (skills/signal-daily-podcast/SKILL.md)$3.4-4.3 (20-36 turns)~$115Byron (Telegram). mp3 present 7/7 days.
Signal PM UpdateagentTurn / Fable 5daily 18:00 ETSame, delta-only; silent gate$2.5-3.3; delivered 10 of last 14 days~$85Byron (Telegram)
Signal AM WatchdogagentTurn / Fable 5daily 07:15 ETls the mp3; regenerate if missing$0.90 for 2 turns (42K cache write)~$27nobody when healthy (7/7 days healthy)
Daily Podcast Transcripts + Daily RAI RefreshagentTurn / Gemini 2.5 Prodaily 05:30 ET, ~13 minlocal whisper transcribe (8 eps), latest-scan.py, generate-rai-content.py (Sonnet 4.6 then Gemini Flash), render, deploy rai.arnao.ai + today.arnao.ai, RAI report episode + Gemini TTS$0.04 agent + $0.02-0.20 scripts + $0.04 TTS~$5-8rai.arnao.ai (fresh: 2026-10-13), today.arnao.ai (fresh), Morning Brief, Signal AM, Ria (transcript-dir sources). Page traffic unknown — Plausible script is 502.
Morning Brief PrefetchagentTurn / Gemini Flashdaily 05:45 ETruns scripts/brief/prefetch-brief.sh (OB1 recall, Brave RAI news cached 6h, agent-errors, assemble)$0.003~$0.1One Morning Brief
One Morning Brief v2agentTurn / Gemini Flash (fell back to Gemini Pro on 10-13 after flash timeout + dead gpt-4o-mini rung)daily 06:05 ET7-section brief from RAI feed, podcast scan, cost summary, cron list, gmail, calendar, web search$0.02-0.15~$3Byron (Telegram) and ai.arnao.signal-pregen (05:45 next day) renders it in Byron's cloned voice for the Signal Live app (~/quip-service/signal-pregen.log: "7 segs from morning-brief-2026-10-12.md")
Nightly Site AuditagentTurn / Haiku 4.5daily 06:00 ETaudit-all-sites.sh (164 sites), LinkedIn token probe, Mentor API probe$0.02~$0.5Byron only when broken. Not erroring now: last run "164 sites OK", LinkedIn 401 alert sent.
Self-Heal MonitoragentTurn / Haiku 4.5every 2hscripts/health/self-heal.sh; replies HEAL_OK~$0.08~$30nobody when healthy
Model Guard - Opus 5agentTurn / Haiku 4.5every 6hre-pins primary to claude-opus-5; model-pin-guard.py~$0.025~$3config file (anti-drift; also anti-evolution)
Spend GuardagentTurn / Gemini Flashevery 30 min (48/day)spend-guard-v2.py; Telegram only if non-empty~$0.005-0.03~$15-40Byron on anomaly; byron-command dashboard feed
OB1 Dictation ConsumeragentTurn / Gemini 2.5 Proevery 30 min (48/day)node scripts/ob1-dictation-consumer.js; usually "Queue empty."~$0.02-0.03~$35OB1 memory store
city.arnao.ai alias guardagentTurn / Gemini Flashhourlycurl title; re-alias on Vercel if wrong~$0.005~$4nobody when healthy
True Cost LedgeragentTurn / Gemini Flashdaily 23:45 ETcost-ledger.py; posts SUMMARY line$0.002~$0.1Byron (Telegram), Signal, Morning Brief
Byron Command Consumercommandevery 5 minconsume-commands.py$0$0command.arnao.ai
Byron Command Telemetry Refreshcommandevery 15 minrefresh-all.sh (38 s)$0$0command.arnao.ai
Asset Registry Synccommandevery 2hasset-sync.js$0$0registry
SMS Inbound Relaycommandevery 1 mininbound-relay.sh$0$0SMS lane
RAI On-Demand Watchercommandevery 5 minrai/ondemand-watcher.sh$0$0on-demand RAI requests
Signal Weekly Public Draftcommand (ssh to host)Fri 07:00 ETprojects/signal-public/scripts/weekly-draft.sh → make-episode v2 + council$0 agent; host-side claude -p (subscription) + Gemini TTS~$0-1Nobody yet: weekly-draft.log ends "COUNCIL: leak=red judge=red lint=green => HELD (not unanimous)" — the council has held the piece; arming/publish are separate gated steps that never ran. rc=0, so the cron reports "ok".

Other agents' crons: Mia "Memory Dreaming Promotion" 03:00 (Gemini Flash) + 2h heartbeat ≈ $0.40/day (~$12/mo, true-cost by_agent mia). Tia "Memory Dreaming Promotion" 03:00 (gemma4, $0). Cia "Forge Heartbeat" 09:00 (qwen3-coder, $0). Gia2: 3 heartbeats (no-route), 3 skill-collection reviews (one erroring) — $0.

Host crontab (crontab -l): ollama-watchdog every 5 min; run-inbox-check.sh in Gia every 30 min (inbox triage — model use not verified, grep found no API call in the wrapper); fleet-live/keepalive.sh every minute; buzzer @reboot. No LLM spend.

Host LaunchDaemons that touch LLMs (/Library/LaunchDaemons/*.plist):

DaemonScheduleModel / costConsumed by
ai.arnao.ria-watchevery 2hfetch 74 sources (watch/sources.json), screen on local Ollama — $0Ria brief, trust.arnao.ai
ai.arnao.ria-briefdaily 06:10Sonnet via Claude Code subscription, run_llm no-tools — $0.09 notionalByron (Telegram "Reply: new/knew/research/publish"), trust.arnao.ai (last dated 2026-10-11)
ai.arnao.ria-moltbookevery 6hHaiku via subscription, 25 classifies/2 days — $0.003 notional eachmoltbook page
ai.arnao.ria-weeklySun 07:30Sonnet via subscription, self-assessment + replay back-testtrust.arnao.ai weekly
ai.arnao.ria-inbox / -taps / -watchdog30m / 2m / 30mno model / $0Ria plumbing
ai.arnao.signal-pregendaily 05:45local Chatterbox voice clone over the Morning Brief — $0Signal Live app (voice-pod)
com.byron.fleet-keywatchdaily 05:10key/balance probes (Anthropic, OpenRouter remaining credit, Ollama) — $0research/briefings/signal/fleet-health.json → Signal AM
com.byron.inventory-auditmonthlyone claude -p (subscription)audit-central
com.byron.mentor-triage (user agent)every 10 minlocal Ollama triage — $0mentor feedback tranches

B3. Spend

Ledger (priced) — research/finance/cost-log/true-cost-YYYY-MM-DD.jsonl, 13 full days Sep 30 - Oct 12:

$/day (mean)$/mo (x30)
Gia11.4342
Mia0.4012
Fleet (ledger)11.8~355

By model, Gia, same window: Fable 5 $7.2/day (61%), Gemini 2.5 Flash $1.8, Gemini 2.5 Pro $1.35, Haiku 4.5 $1.4, Opus 5 $0.00 (unpriced), gpt-4o-mini $0.00 (unpriced).

Un-priced / untracked (est):

Guard thresholds (scripts/finance/spend-guard-v2.py): turn > $0.50, session > $5, fleet > $15/day; spend-limits.json: Gia $25/day, $400/mo, fleet $600/mo, autodownshift off. Today's alert state shows an "EXPENSIVE TURN" on Fable (.spend-guard-v2-alerted.json) — the Signal AM trips it routinely.

Pricing inconsistency worth fixing (#8): cost-ledger.py bills cacheWrite at 2.0x input (1h TTL); scripts/cost/spend-limits.json says 1.25x (5-min TTL, "derived from Gia runtime's own cost records (exact)"). On ~190K Fable cache-write tokens/day that is $3.8 vs $2.4/day — a $40/mo uncertainty in the headline number. Which TTL OpenClaw actually requests is an open question (D).


C. RAI pipeline end to end, duplication, and model mismatches

Inputs → products (daily):

Podcast feeds (scripts/podcasts/feeds.json, 11-20 shows)
  └─ transcribe.py (local whisper, $0) → research/podcasts/transcripts, latest-YYYY-MM-DD.json
        ├─ generate-rai-content.py  (Sonnet 4.6 → Gemini Flash; + 2 Brave query sets)  → rai.arnao.ai, today.arnao.ai, rai-feed.json, RAI report mp3 (Gemini TTS)
        ├─ Signal AM (Fable 5; latest-scan 2 + gmail + ledger + OB1 + cost + health)       → Telegram mp3 + action cards
        ├─ One Morning Brief (Gemini Flash; rai-feed + latest-scan + cost + gmail + cal + web_search) → Telegram + Signal Live voice app
        └─ Ria watch (74 RSS/HN/arXiv/GHSA/NVD + 20 transcript-dir sources; local screen) → Ria brief (Sonnet, subscription) → Telegram + trust.arnao.ai

Same thing fetched or summarized more than once:

InputFetched/summarized byTimes/day
Podcast transcriptsgenerate-rai-content (Sonnet+Gemini), Signal AM (Fable), Morning Brief (Gemini), Ria screen (local) + Ria brief (Sonnet)4-5 summaries of the same transcripts; transcription itself is done once (good)
RAI / legislation newsfetch-rai-news.py (Brave, 6h cache) for the brief; generate-rai-content.py Brave queries (QUERIES, ~10); Morning Brief step H web_search; Ria's RSS (fedreg-ai, openai-news, anthropic-news, aiid, …)4 fetch paths, 3 of them paid-model summarized
Gmail unreadSignal AM (gog gmail search), Morning Brief (gog gmail search), Ria inbox.py every 30 min3 readers
Fleet cost summarySignal AM, Morning Brief2 (cheap)
Model releasesRia watch (→ brief), monitor-models.js (unscheduled, dead), benchmarks refresh (manual, refresh-2026-10-06.py)1 live, 2 dead

Expensive model on a cheap task (ranked):

  1. Fable 5 doing tool-call gathering (16-36 turns of exec/gog/file reads per episode) — only the final synthesis needs a frontier writer. Fix = #2.
  2. Fable 5 for a 2-turn file check (AM Watchdog) — fix = #4.
  3. Gemini 2.5 Pro for OB1 Dictation Consumer 48x/day — a node script with no reasoning; fix = #1.
  4. Haiku 4.5 for Self-Heal every 2h — a bash script; fix = #1.
  5. generate-rai-content.py calls Sonnet 4.6 first although skills/rai-intelligence/SKILL.md says "MUST use free models only … no Claude/GPT"; Gemini Flash is the fallback and succeeds on most days ($0.02 vs $0.17). Flip the order or drop Sonnet.
  6. Gia owner chat on Opus 5 by hard pin; tiered-route/SKILL.md says T1 (Sonnet) is the owner-chat default. Either the skill or the guard is wrong; today the guard wins.

Where cheap models already do the right job (keep): Ria's local-Ollama screen of 74 sources; whisper.cpp transcription; podcast-transcribe on gemma3:12b; mentor-triage on Ollama; Tia/Cia local.


D. Using our benchmark (benchmarks.arnao.ai, projects/benchmarks/router-bench/)

What it measured (Oct 6, seed 20261006, summary.json/findings.json): 16 script-graded tasks (invented stack language, invented calendar, logic grids, scheduling with a novel rule, 3 coding tasks with hidden tests). Every contestant 15-16/16: GPT-6.1 Sol 16/16 at $0.075/run; Opus 5.5 16/16 at $0.31; DeepSeek V4.1 Flash 15/16 at $0.040; Jev Router 15.3 at $0.149 (only router that escalates hard/extreme to Sonnet 5.5 / GPT-6.1 Sol); Switchyard 15.7 at $0.83 (11x); openrouter/auto 15.3 at $0.079 (sends everything to DeepSeek Flash, failed the "keys get used up" twist 2 of 3).

What it says about the fleet:

Harder tests to add (so the benchmark discriminates again):

  1. Long-context delta — give the 400 KB Signal ledger.json + today's items; ask "which 5 are new or developed and why" with script-checkable ground truth (we know the ledger). This is the Signal job itself.
  2. Prompt-injection resistance — Ria already has an injection canary (projects/ria/agent/tests/injection_canary.py); turn it into a graded tier (RAI-relevant, and the thing that matters for Gia2).
  3. Tool-trace tasks — an invented 6-endpoint API with a spec; grade the sequence of calls, not the prose.
  4. Writing quality, pairwise — fixed 15K-token packet → 300-word segment; cheap judge (Haiku 5.5 / Gemini Flash-Lite) + Byron thumbs through an existing choice action card (scripts/actions/actions.py). Only tier where a frontier model should earn its price.
  5. Jev-style calibrated routing — 30 "route to T0/T1/T2?" decisions with known answers; score Brier, not accuracy.
  6. Extreme-tier compute budget — DeepSeek's one miss was a 32K-token budget blowout; add tasks where the right answer is "stop and answer" vs "think longer".

Is the fleet set up to evolve? No.


E. "A fleet that evolves" — a weekly loop under $1-5/run

Where it runs: the Ria lane (host launchd, Python stdlib, Claude Code subscription for orchestration, sandboxed, cap-aware — projects/ria/agent/lib/) or a command-kind Gia cron. Either way the agent boot cost is $0; the only paid calls are benchmark contestants through OpenRouter with run.py's hard cap.

Step 0 — Detect (free, ~1 s). Pull OpenRouter /api/v1/models (no key needed), Anthropic /v1/models (key, free), Ollama /api/tags. Diff against registry/model-catalog.json (new file; seed from research-2026-10-06.json). Emit: new ids, price changes, delistings (would have caught sonnet-4-6/haiku-4-5), context changes. Candidate = any new model priced ≤ the incumbent of some tier, plus anything Byron names.

Step 1 — Smoke (free, local). Run 4 easy tasks on the local gemma4/qwen3.6 to check the harness and graders still work; abort cheaply if not.

Step 2 — Gauntlet (the only spend, target $1-3). gen_tasks.py <new seed> (new seed every run; old ones are public), 16 base tasks + the six harder tiers above. Contestants = incumbents per tier (T0 Fable/Opus-5, T1 Sonnet, T2 Haiku/Gemini Flash, T3 local) + ≤3 challengers, 1 rep for fixed models. Run 1 cost $3.95 for 256 calls; incumbents-plus-three at ~100 calls is ~$1.50 (est). run.py <cap$> enforces the ceiling; the pairwise-writing tier uses a cheap judge.

Step 3 — Propose (free). summarize.py → per-tier table: incumbent vs challenger, score, $/pass, latency, failure ids. Decision rule: challenger must match score on every tier it would serve and cost ≤70% — otherwise "no change". render.py publishes to benchmarks.arnao.ai (so the public page also stays fresh), and a choice action card goes to Byron via scripts/actions/actions.py emit ("Move T2 to Haiku 5.5? approve / skip / later"). Nothing is applied automatically.

Step 4 — Apply on approval (free, one command job). Write registry/model-policy.json (tier → model, fallbacks only down-tier); a small apply-model-policy.py rewrites openclaw.json primaries/fallbacks, every cron payload model, EXPECTED_PRIMARY in self-heal.sh and the Model Guard prompt from that one file, then runs the agent's sync. Model Guard and self-heal become readers of the policy instead of owners of a literal — the flapping bug of 2026-08 cannot recur, and set-best-claude.sh becomes obsolete.

Step 5 — Verify (free). Next day's True Cost Ledger line and spend-guard are the regression test; the loop posts "T2 now Haiku 5.5: $/day before/after" to the work log via slog.

Budget: $1-3/run x 4 = $4-12/mo, paid back many times by #5 alone. Hard stop: run.py cap + Ria's daily_cap_usd + state/KILL.


F. Open questions for Byron

  1. Do you still want three morning deliveries (Signal AM mp3 05:50, Morning Brief text 06:05 → cloned-voice Signal Live, Ria brief 06:10) plus the RAI report episode? Consolidation (#9) is the biggest structural saving but changes what you hear.
  2. Fable vs Opus 5 vs Sonnet 5.5 for Signal synthesis — approve a one-week blind A/B with action-card thumbs? Your standing rule is "Fable thinks, Sonnet builds"; the Signal is thinking-adjacent writing.
  3. Cache TTL: does OpenClaw request 1 h or 5 min prompt caching? Decides whether the ledger over-states Fable by ~$40/mo (D, B3).
  4. Owner chat on Opus 5 — intentional (Model Guard) or a leftover? tiered-route says Sonnet for T1.
  5. rai.arnao.ai readership — Plausible is 502, so there is no evidence anyone reads the daily page/episode; keep, or fold into Signal?
  6. Signal Weekly Public — the council has HELD the weekly piece (leak=red, judge=red) and nothing publishes; is the "erroring" note in CLAUDE.md about this, and should the gates be loosened or the job paused?
  7. Haiku 5.5 / Sonnet 5.5 on the direct Anthropic API — OpenRouter lists them; the direct /v1/models check needs a key and was not run in this read-only pass.
  8. OpenRouter 18+ confirmation unblocks the Muse agent and Muse Wonder/Spark as contestants.
  9. LinkedIn token 401 (Nightly Site Audit alert, 2026-10-13) still needs your one-tap re-auth.
  10. Gia2 skill-collection-review-main error ("No callable tools remain") — benign while Gia2 is idle, but it will bite at cutover.

Appendix: key files