v0.30.0 Release Notes
[0.30.0] - 2026-09-13
The largest platform release so far: sixteen merged PRs that split the backend into three processes, decompose the orchestrator into mixins, make the gateway's WAF scanning real, move RAG writes onto a dedicated worker, and add the first live-catalog external provider. Nothing here changes how you drive the fleet day to day, but the deployment topology changes (three orchestrator-family processes instead of one), so read the first section before upgrading.
The backend runs as three processes
ROBOCO_ROLE splits the old single backend process into api, dispatcher, and indexer. The API serves the panel, the dispatcher runs the fleet loops, and the indexer owns embedding and RAG writes. Measured on the production NAS, the split stops the three workloads from pinning one core against each other.
You don't configure any of this by hand: the shipped compose files carry the three-role topology, resolve the dispatcher per request (so nginx starts even before the dispatcher does), and wait for both split roles at bootstrap. Just pull and bring the stack up as usual.
A stuck orchestrator can now be diagnosed live
0.29.0's night of an orchestrator sitting at 113% CPU for 80 minutes with no way to see why produced three permanent fixes:
- The image ships
py-spy. Attach to the running process without a restart:docker compose exec orchestrator py-spy dump --pid 1. The compose files grant theSYS_PTRACEcapability this needs. - Postgres collects real query stats: the container now enables
pg_stat_statements(with the preload flag set), so slow-query questions have data behind them. - Vector search uses an HNSW index instead of
ivfflat. The old index trained its clusters on an empty table and the planner never trusted it; the new one builds incrementally and repairs a previously-failed build on startup.
The gateway's WAF scanning is real
Every gateway endpoint (all 102 of them) is now scanned by the WAF for real, without pulling the internal docker mesh off the whitelist or exposing it to rate limiting.
Orchestrator internals: mixins, not a monolith
The orchestrator (previously a single ~19,700-line class) is mechanically decomposed into per-family mixins under roboco/runtime/engines/, with no behavior change. This is codebase health, not a feature - it's why the release was large and why future changes get smaller.
OpenRouter: the first live-catalog provider
Save an OpenRouter key in Settings → AI Providers, pick a model from the live catalog (with real per-million pricing), and route the fleet or individual agents to it. OpenRouter models get their own agent image and the same rate-limit parking as every other provider. See Run on OpenRouter.
0.30.0 adopts fastapi-guard 8.0.0 / guard-core 4.0.1. guard-core 4.0.0 changed how rate-limit keys are hashed, so every in-flight rate-limit counter resets exactly once on deploy. No action needed - it just means a clean slate for limiters the first time this version comes up.
Also in this release
- A
cancel_leafgateway verb gives Cell and Main PMs a mechanical way to close a zero-diff leaf task instead of bouncing it around. - A CEO-gated portfolio dashboard route: the first per-project metrics view.
- Branch and parent-topology validation moved to
open_pr(and the re-parent path), so a mismatched PR base is caught at PR time, not at closure. - The eight MCP servers migrated to the mcp 2.x SDK.
Next
- Provider Routing for how the new provider fits the ladder
- HTTP Security for the guard configuration
- v0.31.0 Release Notes for what came next