How we got here
v0.26.0 made frontier-model spend visible (`ax cost split`), named the redirectable dispatches (`ax dispatches --candidates`), and nudged at dispatch time with the route-dispatch hook. The piece it left open was the policy itself: the routing table was a constant someone had to maintain by hand, and the `/routing-tune` workflow that mined it was a dev-side tool, not something a user could run against their own history.
This release closes that gap. The routing table becomes a real file you own (`~/.ax/hooks/routing-table.json`), and three commands keep it honest - generate it, tune it from your own dispatches, and read back the policy you are actually running. The same file is now the single source of truth for both the route-dispatch hook and `ax dispatches --candidates`, so the nudge and the report can never drift apart.
What changed
The routing commands (#328):
ax routing tune --days=30 # mine unmatched expensive inherit dispatches
ax routing compile # merge-preserving regenerate of the table
ax routing show # the effective table, with class origins`ax routing tune` clusters unmatched expensive dispatches that inherited the frontier model, proposes new routing classes for the recurring ones, and auto-applies the safe (non-judgment) proposals to your table as `origin: user`. Anything that smells like judgment work - review, design, plan, audit - is held back and only ships through an `--emit-brief` review step, so the loop never quietly downgrades the dispatches where you want the expensive model.
`ax routing compile` is merge-preserving on purpose: it refreshes the shipped defaults while keeping every `origin: user` class you added, and refuses to overwrite a corrupt file rather than clobbering your policy.
Improve-first dashboard (#327): the studio's home is now a next-actions panel - the proposals ax has mined from your own history, each with an agent brief you can hand straight to a coding agent. The dashboard leads with "here is the next thing worth fixing" instead of a wall of charts.
Profiles and community (#318, #319, #321):
ax profile show # render your local ax profile
ax profile publish # consent-gated publish to a gist`ax profile show` renders your local profile - stats, rig, and taste patterns - straight from the graph. `ax profile publish` walks a consent prompt that shows the exact JSON, then forks and registers you into the community rails. The site picks it up: `/u/<login>` renders a registered profile live, and `/leaders` renders the compiled boards.
Insights Surface Contract (#322, #329, #331, #334): every dashboard data family - system, insights, sessions, skills, improve, ingest - now sits behind a typed Effect HttpApi with generated Scalar docs and a server-scoped Effect runtime. The studio talks to it through a generated client, with a version handshake so an old daemon and a new studio degrade cleanly instead of crashing on a mismatched payload.
Self-aware daemon (#315): re-running `ax serve` against a live daemon now prints the dashboard URLs instead of fighting for the port; `ax serve status` and `ax serve stop` resolve the running instance and only ever kill the pid actually listening on the port.
Why it matters
A routing policy you can't tune from your own history is a policy you stop trusting. This release makes the table something you own and re-derive from your own dispatches - generate it, tune it, read it back - with the same file driving both the dispatch-time nudge and the candidate report. And the dashboard finally leads with the point of ax: not charts, but the next small fix worth making.