Frugality-first execution: model-tier routing
The headline: ooo run now routes work down the model ladder instead of running everything on one model. Decomposed child ACs execute on the frugal tier (Claude Haiku / Codex mini-class), top-level ACs stay on standard (Sonnet), and a failing AC escalates one tier per retry — so you get real work out of Ouroboros without a Max-tier plan. RLM-style: split the goal well, and each piece becomes cheap enough for a small model to stay grounded.
- Per-call model override across runtimes (Claude SDK, Claude worker, Codex CLI — capability-declared, truthfully; Codex MCP warm threads honestly report they cannot re-target). Live-verified:
claude --resume --modelgenuinely re-targets the billed model. economics.tiersconfig is now live (previously dead): frugal/standard/frontier map to real model ids per provider; legacy shipped ids in persisted configs are normalized automatically (#1324-style).model_tierMCP arg (small/medium/large) now actually drives the tier.- Escape hatches:
OUROBOROS_MODEL_TIER_ROUTING=offkill switch; explicitOUROBOROS_EXECUTION_MODELpin keeps routing dormant. All three routing env vars are denylisted from untrusted project.env.
Frugality proof machinery (deterministic, anti-reward-hack)
The frugality hypothesis — decomposed children stay grounded on cheaper tiers — now has its measurement rig wired live: per-AC token attribution from real runtime usage (Claude ResultMessage.usage, Codex turn.completed), a deterministic in-repo TraceGuard validator feeding observe-only deliver verdicts (journal-bound; the old prose-regex success sniffing was removed outright), a resume-durable routing contract (a kill-switched or differently-configured run keeps its policy across resume, fingerprint-verified), and an opt-in shadow-replay baseline harness (OUROBOROS_SHADOW_REPLAY, isolated-workspace only). The proof gate reports honestly — insufficient_data until real baselines exist — and every admission rule fails closed.
Also ships docs/rfc/active-conductor.md: the proposed judgment layer that lets the main session act on attention events (builds on #1599's delegated job observer).
What's Changed
Full Changelog: v0.50.2...v0.50.3