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.
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:
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.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.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.| # | Change | $/mo saved (est) | Capability | Effort | Risk |
|---|---|---|---|---|---|
| 1 | Convert 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-115 | same; fewer LLM failure modes | Low (cron edits + ~30-line notify wrapper) | Low — pattern already live for 4 crons |
| 2 | Signal 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-140 | more reliable (fewer tool-call failures), same voice | Medium | Medium — must preserve the ledger/delta logic in the script |
| 3 | Prune ledger.json: move the 421 closed signals to ledger-archive.json; keep the hot file <40 KB. | $30-50 (overlaps #2) | faster runs | Low | Low (backups already kept) |
| 4 | Signal AM Watchdog → command kind: test -s *.mp3 and only spawn an agentTurn when the file is missing. | $27 | identical | Trivial | None |
| 5 | Retire 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 model | Low | Low — verify tool-calling parity on one cron first |
| 6 | A/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 tested | Low | Medium — Byron's "Fable thinks" rule; keep Fable if A/B says so |
| 7 | Fix 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-10 | reliability: fallbacks that actually work | Low | Low |
| 8 | Fix 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) | truth | Low | None |
| 9 | Consolidate 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 cheaper | consistency: one set of facts narrated three ways | Medium-High | Medium |
| 10 | Replace 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). | $10 | the fleet can evolve | Medium | Low |
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.
Source: each agent's openclaw.json (paths in column 1) and docker ps / openclaw.mjs --version on 2026-10-13.
| Agent (container) | Version | Primary | Fallbacks | Heartbeat | Subagents | Image | Notes |
|---|---|---|---|---|---|---|---|
Gia openclaw-gia (~/openclaw-gia/config/openclaw.json) | 2026.7.1-2 | anthropic/claude-opus-5 (alias misleadingly "Opus 4.8") | gpt-4o-mini (broken), gemini-2.5-flash, gemini-2.5-pro, deepseek-chat, openrouter/auto | 24h, Haiku 4.5 | Haiku 4.5 | xai grok-imagine-image-quality → gemini-3-pro-image → gemini-2.5-flash-image | ria 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.34 | anthropic/claude-opus-5 | gpt-5.4-mini, gemini-2.5-flash, gemini-2.5-pro, openrouter/auto | 24h Haiku (status no-route, Telegram off) | Haiku 4.5 | same as Gia | 0 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-2 | google/gemini-2.5-flash | claude-haiku-4-5, ollama/gemma4 | 2h, 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-2 | ollama/qwen3-coder:30b | qwen2.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-2 | ollama/gemma4:latest | claude-haiku-4-5, gemini-2.5-flash | 30m, 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/a | Claude 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.
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):
| Job | Kind / model | Frequency | What it does | $/run (est) | $/mo (est) | Output consumed by |
|---|---|---|---|---|---|---|
| Signal AM Podcast | agentTurn / Fable 5 | daily 05:50 ET | Gathers 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) | ~$115 | Byron (Telegram). mp3 present 7/7 days. |
| Signal PM Update | agentTurn / Fable 5 | daily 18:00 ET | Same, delta-only; silent gate | $2.5-3.3; delivered 10 of last 14 days | ~$85 | Byron (Telegram) |
| Signal AM Watchdog | agentTurn / Fable 5 | daily 07:15 ET | ls the mp3; regenerate if missing | $0.90 for 2 turns (42K cache write) | ~$27 | nobody when healthy (7/7 days healthy) |
| Daily Podcast Transcripts + Daily RAI Refresh | agentTurn / Gemini 2.5 Pro | daily 05:30 ET, ~13 min | local 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-8 | rai.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 Prefetch | agentTurn / Gemini Flash | daily 05:45 ET | runs scripts/brief/prefetch-brief.sh (OB1 recall, Brave RAI news cached 6h, agent-errors, assemble) | $0.003 | ~$0.1 | One Morning Brief |
| One Morning Brief v2 | agentTurn / Gemini Flash (fell back to Gemini Pro on 10-13 after flash timeout + dead gpt-4o-mini rung) | daily 06:05 ET | 7-section brief from RAI feed, podcast scan, cost summary, cron list, gmail, calendar, web search | $0.02-0.15 | ~$3 | Byron (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 Audit | agentTurn / Haiku 4.5 | daily 06:00 ET | audit-all-sites.sh (164 sites), LinkedIn token probe, Mentor API probe | $0.02 | ~$0.5 | Byron only when broken. Not erroring now: last run "164 sites OK", LinkedIn 401 alert sent. |
| Self-Heal Monitor | agentTurn / Haiku 4.5 | every 2h | scripts/health/self-heal.sh; replies HEAL_OK | ~$0.08 | ~$30 | nobody when healthy |
| Model Guard - Opus 5 | agentTurn / Haiku 4.5 | every 6h | re-pins primary to claude-opus-5; model-pin-guard.py | ~$0.025 | ~$3 | config file (anti-drift; also anti-evolution) |
| Spend Guard | agentTurn / Gemini Flash | every 30 min (48/day) | spend-guard-v2.py; Telegram only if non-empty | ~$0.005-0.03 | ~$15-40 | Byron on anomaly; byron-command dashboard feed |
| OB1 Dictation Consumer | agentTurn / Gemini 2.5 Pro | every 30 min (48/day) | node scripts/ob1-dictation-consumer.js; usually "Queue empty." | ~$0.02-0.03 | ~$35 | OB1 memory store |
| city.arnao.ai alias guard | agentTurn / Gemini Flash | hourly | curl title; re-alias on Vercel if wrong | ~$0.005 | ~$4 | nobody when healthy |
| True Cost Ledger | agentTurn / Gemini Flash | daily 23:45 ET | cost-ledger.py; posts SUMMARY line | $0.002 | ~$0.1 | Byron (Telegram), Signal, Morning Brief |
| Byron Command Consumer | command | every 5 min | consume-commands.py | $0 | $0 | command.arnao.ai |
| Byron Command Telemetry Refresh | command | every 15 min | refresh-all.sh (38 s) | $0 | $0 | command.arnao.ai |
| Asset Registry Sync | command | every 2h | asset-sync.js | $0 | $0 | registry |
| SMS Inbound Relay | command | every 1 min | inbound-relay.sh | $0 | $0 | SMS lane |
| RAI On-Demand Watcher | command | every 5 min | rai/ondemand-watcher.sh | $0 | $0 | on-demand RAI requests |
| Signal Weekly Public Draft | command (ssh to host) | Fri 07:00 ET | projects/signal-public/scripts/weekly-draft.sh → make-episode v2 + council | $0 agent; host-side claude -p (subscription) + Gemini TTS | ~$0-1 | Nobody 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):
| Daemon | Schedule | Model / cost | Consumed by |
|---|---|---|---|
ai.arnao.ria-watch | every 2h | fetch 74 sources (watch/sources.json), screen on local Ollama — $0 | Ria brief, trust.arnao.ai |
ai.arnao.ria-brief | daily 06:10 | Sonnet via Claude Code subscription, run_llm no-tools — $0.09 notional | Byron (Telegram "Reply: new/knew/research/publish"), trust.arnao.ai (last dated 2026-10-11) |
ai.arnao.ria-moltbook | every 6h | Haiku via subscription, 25 classifies/2 days — $0.003 notional each | moltbook page |
ai.arnao.ria-weekly | Sun 07:30 | Sonnet via subscription, self-assessment + replay back-test | trust.arnao.ai weekly |
ai.arnao.ria-inbox / -taps / -watchdog | 30m / 2m / 30m | no model / $0 | Ria plumbing |
ai.arnao.signal-pregen | daily 05:45 | local Chatterbox voice clone over the Morning Brief — $0 | Signal Live app (voice-pod) |
com.byron.fleet-keywatch | daily 05:10 | key/balance probes (Anthropic, OpenRouter remaining credit, Ollama) — $0 | research/briefings/signal/fleet-health.json → Signal AM |
com.byron.inventory-audit | monthly | one claude -p (subscription) | audit-central |
com.byron.mentor-triage (user agent) | every 10 min | local Ollama triage — $0 | mentor feedback tranches |
Ledger (priced) — research/finance/cost-log/true-cost-YYYY-MM-DD.jsonl, 13 full days Sep 30 - Oct 12:
| $/day (mean) | $/mo (x30) | |
|---|---|---|
| Gia | 11.4 | 342 |
| Mia | 0.40 | 12 |
| 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):
claude-opus-5 at $0 (PRICES in scripts/finance/cost-ledger.py has only opus-4-8). Token lines show 10-03: 62 turns, 6.8M cache-read, 152K cache-write, 49K out → ~$7 that day; 10-10: ~$2.8. 7-day attribution: $0.41/day → ~$12-40/mo, spiky.gpt-4o-mini-tts for Signal: logged at $0.00 or $0.08-0.12 inconsistently (cost-log/2026-10-0*.jsonl). ~9K chars/episode → ~$5/mo (est).router-bench/README.md).lib/cost.py month).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).
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:
| Input | Fetched/summarized by | Times/day |
|---|---|---|
| Podcast transcripts | generate-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 news | fetch-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 unread | Signal AM (gog gmail search), Morning Brief (gog gmail search), Ria inbox.py every 30 min | 3 readers |
| Fleet cost summary | Signal AM, Morning Brief | 2 (cheap) |
| Model releases | Ria 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):
exec/gog/file reads per episode) — only the final synthesis needs a frontier writer. Fix = #2.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.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.
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:
research-2026-10-06.json routers[1]) is a decision model billed on input only, ~151 ms — the right shape for the fleet's "which tier does this task need?" decision, but it is not integrated anywhere; our tiered-route skill is a prose table the model is asked to consult. Jev Router on OpenRouter priced as "-1" (dynamic) — Byron's worklog (~/ops/data/worklog.jsonl, 2026-10-13 "Parked: … weekly model-scout agent … Jev-style tests") already parks this.Harder tests to add (so the benchmark discriminates again):
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.projects/ria/agent/tests/injection_canary.py); turn it into a graded tier (RAI-relevant, and the thing that matters for Gia2).choice action card (scripts/actions/actions.py). Only tier where a frontier model should earn its price.Is the fleet set up to evolve? No.
~/openclaw-stack/scripts/set-best-claude.sh: unscheduled (no cron/launchd references it), Opus-only, fleet list includes openclaw-nia (does not exist), skips Gia2/Cia, and would be reverted within 6 h by Model Guard unless EXPECTED_PRIMARY in scripts/health/self-heal.sh is changed too.scripts/benchmarks/monitor-models.js: unscheduled; research/model-monitor-state.json last touched 2026-06-22.switch-model/SKILL.md lists Opus 4.7 as "strongest available" (validated 2026-06-01).anthropic/claude-sonnet-4-6 and claude-haiku-4-5 (free /api/v1/models check today); Gia's config still lists both OR aliases. Nothing noticed.anthropic/claude-haiku-5.5 ($0.10/$0.50), openai/gpt-6.1-sol ($2/$10), unbiased/pareto-26.10-preview, mistralai/mistral-large-4-0, meta/muse-wonder ($4/$20).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.
tiered-route says Sonnet for T1./v1/models check needs a key and was not run in this read-only pass.skill-collection-review-main error ("No callable tools remain") — benign while Gia2 is idle, but it will bite at cutover.~/openclaw-gia/config/openclaw.json, ~/openclaw-gia2/config/openclaw.json, ~/openclaw-stack/configs/openclaw.json, ~/openclaw-cia/config/openclaw.json, ~/openclaw-tia/config/openclaw.jsondocker exec <agent> node /usr/local/lib/node_modules/openclaw/openclaw.mjs cron list --json~/openclaw-gia/config/workspace/research/finance/cost-log/true-cost-*.jsonl (nightly, scripts/finance/cost-ledger.py); per-call cost-log/YYYY-MM-DD.jsonl (scripts/cost/cost_logger.py); guard scripts/finance/spend-guard-v2.py, scripts/cost/spend-limits.json; Ria projects/ria/agent/state/cost-ledger.jsonlskills/signal-daily-podcast/SKILL.md, research/briefings/signal/ledger.json (410 KB), research/briefings/signal/*-{am,pm}.mdskills/rai-intelligence/SKILL.md, skills/rai-intelligence/voices-registry.json, skills/sources-registry/SKILL.md, scripts/generate-rai-content.py, scripts/brief/prefetch-brief.sh, scripts/brief/fetch-rai-news.py, scripts/podcasts/{transcribe,latest-scan}.pyprojects/ria/agent/README.md, watch/README.md, watch/sources.json, /Library/LaunchDaemons/ai.arnao.ria-*.plistprojects/benchmarks/router-bench/{README.md,summary.json,findings.json,gen_tasks.py,run.py}, projects/benchmarks/research-2026-10-06.json~/openclaw-stack/scripts/set-best-claude.sh, scripts/benchmarks/monitor-models.js, research/model-monitor-state.json, skills/tiered-route/SKILL.md, skills/switch-model/SKILL.md