The auto-router already picked the cheapest capable provider for each task — now you can see why. A new GET /providers endpoint rolls up every provider's real state (configured, reachable, headroom, Claude's utilisation and today's spend, everyone else's run count) so the dashboard and Jarvis poll one source instead of scraping notes. The dashboard carries a status strip under the runs panel: one pill per provider, polling every 30s — green for reachable with headroom, amber for capped or gaming-mode, grey for unconfigured. Paired with !backlog and !overnight in Discord, the whole overnight queue and fleet state are legible at a glance.
Hardening the fleet against itself
The command-center agent's working directory is the server directory — so an agent tidying files could overwrite server.js, the Discord bot, or .env out from under itself. Added a protected-basenames guard enforced on every agent WRITE and EDIT (human edits untouched), a single-instance PID lock so a double launch can't spawn a double-replying bot, and a BOM-strip step ahead of boot after a stray UTF-8 byte-order mark on the first .env key silently took the bot down. Follow-through on the 80 KB-compression lesson: agents get autonomy, never the keys to their own runtime.
Auto-routing: cheapest capable provider, by task
Added an --auto lane. A lightweight keyword classifier guesses the task category, a configurable policy maps each category to a provider, and any low-confidence guess fails safe to Claude. Default policy sends summarisation, instruction-following, and text reasoning to local Ollama (qwen3:8b, zero marginal cost), coding to Codex, and agentic or complex work to Claude. The policy isn't a guess — it's derived from the Metis routing benchmark, where that split runs the suite at roughly a sixth of the all-Sonnet cost, keeping coding on Claude.
Ollama as the free local lane
Wired Ollama in as a first-class provider so on-device models handle the safe, high-volume sub-tasks with no quota and no marginal cost. Prompts never leave the machine when the base URL is localhost — a real privacy boundary, not just a price one. Claude usage target sits at ~75% before tasks spill to the free lanes, keeping reserve for the work that actually needs it.
Six-provider runtime live
Claude, Codex, Gemini, DeepSeek, Groq, and Ollama all wired into the ACC. Manager ticks now run autonomously overnight across all six providers, routing tasks to the cheapest and best fit for each job.
Incident response: the great 80KB compression
An agent was asked to tidy a server file and instead compressed 80KB of working code into 10KB of hallucinated junk. Recovery was clean because the defences were already in place: offsite Veeam backups plus OneDrive version history on the file store. Total loss: zero. Lesson: agents get autonomy, but never the only copy.
Mobile dashboard and remote prompting
Rebuilt the dashboard as a single-file, mobile-first page served by Express: agent cards with live status LEDs, flags pulled from agent-memory logs, and a prompt bar that streams agent output over SSE. The /run endpoint stays local-only until bearer-token auth lands, then Cloudflare Tunnel makes the whole fleet promptable from my phone.
Discord bot multi-provider routing
Added provider flags to agent-cli: --codex, --gemini, --groq, --ollama, --deepseek. Any task can now be routed to any provider from Discord or from another agent.