Releases: AqueGen/model-routing
Release list
v0.15.0
v0.14.0
0.14.0 (2026-08-11)
Features
- call out dispatches that went below their agent's pin (#27) (2b9b433)
- notify on session start when a newer plugin version is available (d6affc2)
- price the token volume at API list rates (#26) (c00d736)
- report reasoning effort, and stop losing big sessions from the math (#25) (634a32a)
Bug Fixes
v0.13.2
Says what the token charts can and cannot be credited with. Docs only - no pin, config, hook, or stats changes.
- The "without routing" bar is labelled an upper bound rather than a measurement. It assumes every subagent would otherwise inherit the session model, which is the documented default only for an UNPINNED agent. Other installed plugins ship their own pinned agents and Claude Code's built-in
Explorepicks its own tier, so some of that volume would have run cheaply with this plugin uninstalled. How much was never measured, and the README now says so instead of implying the whole bar is the saving. - Added an attribution table over the same week. Of 199 routed-down dispatches: 68 came from agent frontmatter pins this plugin ships, which fire automatically whether or not any rule is followed; 127 came from an explicit
model=on the dispatch, which is the routing rules being applied and is enforced by nothing; 4 came from the built-inExploreagent and are not this plugin at all. The automatic half is fully attributable, the behavioural half is not, and the difference is now visible. - Stated the obvious limit plainly: this is the author's own workload, measured with the author's own tool, with no before-install baseline and no control group.
- Recorded that
CLAUDE_CODE_SUBAGENT_MODELwas unset in the window - a global subagent override would have produced routed-down volume with no routing decision behind it, and the report annotates rows withenv=when it is set, so its absence is evidence rather than an assumption.
v0.13.1
Re-measures the README token section on 0.13.0 so every figure in it comes from one run, and corrects a claim the new measurement made false. Docs only - no pin, config, hook, or stats changes.
- Every number in the token section now comes from a single measurement. The previous draft quoted 1.79B of subagent volume in one paragraph and 283.7M two lines later. Both were true - the first across all sessions, the second scoped to fable-default ones - and a reader had no way to reconcile them. The section now opens with a two-column table, all sessions against fable-default sessions, with main-session and subagent volume on separate rows, and every later figure states which column it belongs to.
- Corrected a claim the re-measurement falsified. The fable slice grew from 0.7M to 2.1M, and the growth is a
model=fablereviewer dispatched deliberately above the session tier - to review 0.13.0 itself. The old text called that slice "the honest remainder" of accidental inheritance, which is now wrong about most of it. It says so instead, and points at the above-tier reporting added in 0.8.0 as the reason a deliberate top-tier dispatch shows up as a decision rather than hiding among at-tier work. - The scoped headline is 99%, not the 100% quoted before: a fable subagent in a fable session is at tier, not below it, so the deliberate review moved the figure. Left as measured rather than re-scoped to keep the round number.
- Snapshot attribution corrected to v0.13.0; the previous line still credited v0.12.0, which could not have produced the main-session figures beside it.
v0.13.0
tokens now prints the denominator its percentage is measured against. The routed-down share was true and easy to over-read, including by the author, which is the failure this release exists to close.
- Main-session volume is reported next to the routed-down share.
tokenswalkedagent-*.jsonlonly, so it described subagent work exclusively. That is the right subject - the main session model is fixed for the turn and no routing decision can move it - but printing "283.1M of 283.7M (100%) processed on a cheaper model" with nothing beside it reads as "almost everything was optimized". In the author's own window main sessions were 6.82B against 1.79B of subagent volume, so routing governed 21% of what was actually spent. The report now says so, with a per-model split of the main-session side. - A
--sessionfilter no longer shows its share alone. Scoping to fable-default sessions reported 100% routed down; unfiltered across the same week it was 33%, because opus-default sessions have little room to route down at all. Both are honest, and the filtered figure was the one on the README. The unfiltered share is now printed directly beneath the scoped one, with the reason they differ. - Populations are separated by an explicit test rather than a negative one: a bare
<session-id>.jsonlat a project root is a main session, a transcript whose name begins withagent-is subagent work, and a non-agent file undersubagents/is neither. A stray sidecar there would otherwise inflate the denominator it is being measured against. - The empty case improved too: with main-session volume present but no dispatches, the report says how much the session spent undelegated instead of only "no subagent transcripts found".
- Per-file usage summation was extracted into one helper now that both populations need it, so per-line model attribution and timestamp-vs-mtime windowing cannot drift between them.
- The main-session test is positive, not negative - exactly depth 1,
projects/<proj>/<session-id>.jsonl. The first cut asked "not an agent transcript and not undersubagents/", which the walk applies down to depth 6, so any sidecar the harness writes beside a transcript would have enrolled as a whole session. Since that sidecar's volume lands in the denominator, the error would have pushed the routed-down share UP - the same direction of flattery this release removes. - An unreadable transcript is reported, not swallowed.
tokenspreviously read only agent transcripts, which are small; main-session transcripts run to hundreds of MB, andreadFileSyncas a string throws past V8's ~512MB limit. That now fails the single file instead of the whole command, and the count is printed, because a silently dropped session understates the denominator and again biases the share upward. - The empty-window note says "no subagent volume counted against them" rather than "none of it delegated": agent transcripts can exist and still contribute nothing to a window, e.g. a resumed transcript whose lines predate an
--agorange. - Tests 27 -> 32: the denominator line, the unfiltered-beside-scoped line, a non-agent file under
subagents/, a sidecar besidesubagents/(the depth case above), and--sessionscoping the denominator as well as the headline. Measured at ~2s over 83 sessions and 8.63B tokens, so the extra read stays comfortable for an on-demand command. - README: the token section now opens with its own scope - subagent volume only, main session excluded and why - and states the unfiltered share next to the scoped one.
- The first three findings above came from an adversarial review of this diff run on Fable; the arithmetic of the new accumulators was checked and confirmed correct in the same pass.
v0.12.1
Refreshed token snapshot, a fix to how release notes are extracted, and a readability pass over every past changelog entry. Docs and CI only - no pin, config, hook, or stats changes.
- README token snapshot refreshed to 2026-08-02 / v0.12.0, replacing the 2026-07-20 / v0.8.1 figures. 98% of dispatches (82 of 84) and 283.1M of 283.7M tokens ran below the session tier, over a window roughly 1.7x larger than the previous one.
- The refresh has a story worth reading, not just newer numbers: the inherited-session-tier slice fell from 21.4M of 166.8M to 0.7M of 283.7M. That slice was the accidental-inheritance case the previous snapshot flagged, 0.7.2 added the Workflow routing rule in response to that exact measurement, and this window is the evidence it worked. Tier leaks now sit at 1 of 11 unpinned dispatches (9%), under the 20% rework threshold the report warns at.
- Release-notes extraction anchored on the exact version header. The workflow matched the version as a substring of any
##line, which is fragile - a short version can match inside an unrelated header - and it relied on the next header resetting a flag rather than stopping. It now matches^## <version>with a delimiter and exits at the following##, so one release's notes can never bleed into another's. - Every past changelog entry rewritten for readability. Two problems: entries were hard-wrapped at ~72 columns for no reason (Markdown reflows anyway, and the wrapping only made diffs and edits noisy), and many entries opened straight into a bullet with no summary line, so the rendered GitHub release read as though it had been cut off. Every version now leads with one sentence saying what the release is, and no line is wrapped by hand. Substance is unchanged - nothing was padded to look longer, and the genuinely small releases stayed small.
- All 35 published release bodies were re-pushed from the rewritten entries, so the GitHub releases and the file agree.
v0.12.0
Adds the advisor pattern: a plan check before implementation, for the case where no plan exists yet. Docs only - no pin, config, hook, or stats changes.
- Plan check before implementation, when no plan exists yet. Every escalation rule in the skill was reactive - a stuck agent hands back, a weak result retries one step up. This adds the proactive counterpart: when implementation work is dispatched with no approved plan behind it, the cheap-tier agent returns its PLAN first and the main session checks it before any code is written.
- Source and measurement: Anthropic's model-selection guidance names this the advisor strategy - "faster, lower-cost worker models to call more intelligent models to check their plan and evaluate their work" - and reports Sonnet 5 with a Fable 5 advisor within 10% of Fable 5's SWE-bench Pro score at 63% of the price of using Fable 5 for the whole task.
- Costs one short turn and adds no new agent. In this plugin's shape the main session already IS the advisor, so the pattern reuses the loop that is already there instead of introducing a seventh bundled agent.
- Written as a condition, not a rule-plus-exemption: it fires when there is no approved plan and is silent when there is one. That form holds for a setup where this plugin is the only thing installed as well as one with a planning workflow in front of it, and it leaves no exemption clause for a model to negotiate with under pressure.
- Skill: new bullet placed ahead of the escalation rules, which are now named reactive so the two read as a pair rather than as competing advice.
- Routing anchor: one line, so the pattern is present in every session rather than only when the skill is explicitly invoked. The anchor is the surface that actually changes behaviour here; the skill entry documents it for anyone reading the plugin.
- Audited the rest of the plugin for assumptions about an external planning workflow and found none: planning is already routed to the main session, the verifier and reviewer agents ship with the plugin, and the SendMessage-unavailable path was already handled.
v0.11.1
Scopes the verifier gate so the routing cannot be read as contradicting Opus 5's guidance on self-verification. Docs only - no pin, config, hook, or stats changes.
- Scoped the
verifiergate explicitly: the verifier gates ANOTHER agent's cheap-tier diff, never the main session's own work. - Rationale: a current-generation model self-verifies, so spawning a subagent to re-check what the main session just wrote burns tokens for no quality gain - which is exactly what Opus 5's prompting guide means by "do not use subagents to verify or double-check your own work".
- Skill: the batched-output verifier bullet now carries that scope and the citation, alongside the existing "skip it when the main session reads the full diff anyway" exemption, so both ways of double-paying are named in one place.
- Routing anchor: the one-line verifier rule gained the same scope, so the distinction is present in every session rather than only on skill invoke.
- The cheap-tier gate itself is unchanged - gating another agent's diff was always the intent and stays recommended.
v0.11.0
Effort accuracy fix plus a Workflows chapter. Docs only - no pin, config, hook, or stats changes.
- Corrected a stale claim: the skill and README stated that Anthropic's quality-first guidance for Opus-class models starts coding and agentic work at
xhigh. That is the Opus 4.7/4.8 recommendation. Opus 5 is told to start athigh, step up toxhighfor demanding coding and agentic work, and uselow/mediumliberally as the primary cost control - the generation this plugin has targeted since 0.9.0. The text now names which generation each recommendation belongs to and says to re-sweep effort after a model change. - Effort is documented as shaping all response tokens, tool calls included: at lower effort the model makes fewer tool calls, so a cheap pin saves twice.
low's own documented use case is subagents. - Sonnet 5 at
mediumis comparable to Sonnet 4.6 athigh- stated next to the sonnet/medium pins, which that comparison justifies. - Prompt-cache caveat: changing effort between requests invalidates the cached prefix, so effort should vary across workloads (per-agent pins, per-
agent()opts) rather than inside one conversation. - New
## Workflowschapter in the skill: the breadth-vs-chain boundary, per-stage routing withCLAUDE_CODE_SUBAGENT_MODELprecedence, granularity as saved progress on resume, the/configsize guideline (defaultmediumsince Claude Code 2.1.219), the 25-agent / 1.5M-token warning and the 16-concurrent / 1000-total runtime caps, and theacceptEditspermission note for workflow subagents. The## Rulesbullet that restated part of this is now a pointer at the chapter. - README: workflow cost settings and the ultracode stance in Recommended settings; the 0.10.0 report caps now cite the 1,000-2,000 token subagent-summary shape; the old "Workflow use" section is renamed "Superpowers flow" so the word "workflow" means one thing.
- SKILL.md grew 2377 -> 2973 words. Deliberate: the skill is charged per invoke, and the routing anchor - charged every session - was not touched.
v0.10.0
Token diet: the plugin's own overhead cut with zero rule loss, plus success-path report caps. Budgets were soft and meaning won every conflict - the numbers below are what non-debatable cuts yielded.
| Surface | Words before | after | Paid when |
|---|---|---|---|
| routing anchor | 501 | 428 | every session start + every compact |
| agent descriptions (6) | 278 | 173 | every session (agent list) |
| agent files (6, incl. bodies) | 1870 | 1674 | per dispatch |
| SKILL.md | 2445 | 2377 | on skill invoke |
- Report caps, success-path only (failures always full): test-runner PASS <= 5 lines, verifier terse one-line reasons (a FAIL lists every real one), scout <= 15 lines, e2e-runner step log <= 20 lines.
- implementer's stale SWE-bench point-gap claim removed from its body (the 0.9.0 dated-framing pass missed it).
- All 15 anchor directives, every agent boundary and anti-misuse clause, and every skill rule survived - the PR carries the rule-survival matrix. No pin, config, or stats changes.