All notable changes to jev-router are documented here. The format follows Keep a Changelog, and this project uses Semantic Versioning.
0.4.0 - 2026-10-10
- The default is now the
leanpreset: a Sonnet ceiling and effort capped atmedium. Chosen by a pre-registered rule on 100 more graded runs: 39/40 hard tasks done against 38/40 for always-Opus and always-Sonnet, at $0.064 per run against $0.163 (Opus) and $0.062 (Sonnet); 18/18 on the multi-step set at $0.061 per run. Opus is still used when Jev is at least 90% sure (ceilingBreak). To keep the old behaviour setpreset: balanced(or/jev preset balanced).
/jev preset lean|balanced|maxand apresetoption;/jev statusshows the active preset.- Benchmark harness:
> strategy filter, a lean strategy, and an opt-in Wilson interval for pass rates (CI=1). CI checks that the shipped defaults match the lean preset.
0.3.0 - 2026-10-09
- The band shows the model that really ran the last step. A mismatch reads
sonnet (picked opus); after a Jev failure it shows the session model instead of "waiting for the first task"; it flips from warm to cold on its own. - Model ceiling and floor (
ceiling,floor,ceilingBreak,/jev ceiling,/jev floor), applied before the cache guard. Off by default. A sonnet ceiling finished 20/20 hard tasks at half the cost of opus. - A real long-session benchmark (
benchmarks/session.mts, one process per session via stream-json) and a debug line with the cache state per Jev call.
- README and charts now use the measured long-session numbers. The earlier simulation's "3x more" is replaced by +38% (guard off) and +24% (guard on) against opus, and the README says plainly that in a long warm session routing cost more than staying on opus.
0.2.0 - 2026-10-09
- Per-step routing: Jev is asked again before every step of a task, not only at the prompt (
routeSteps). - Per-subagent routing: each subagent is routed at spawn from its full task prompt, sets the subagent's model and tags its description in the subagent list (
routeSubagents). Verified live. - Effort cap,
highby default, so thexhigh/maxthat Jev suggests on hard tasks no longer drives cost above always-opus. Lift it for one prompt with a!fullprefix or/jev full; change it with/jev cap <effort|none>or theeffortCapoption. The band shows the cap (⤓xhigh) and the unlock (🔓). - Circuit breaker: three failed Jev calls in a row pause routing, then it recovers; strict stickiness with a warm cache makes no step calls.
- Per-prompt markers:
!opus,!sonnet,!haiku,!fablepin a model and skip Jev;!cheap,!efficientset the mode; they combine with!full. - Escalation: after
escalateAfterfailed tool calls in a row the rest of the task moves up one model (verified live). - Estimated savings tally in
/jev statusagainstbaselineModel, kept across sessions;/jev stats clearresets it. - Privacy:
redact(on by default),sendHistory,maxTaskChars, and an opt-in localfallback: heuristicwhen Jev is down. - A debug log line per Jev call (
jev prompt|step N|agent), used to verify the above live. - CI workflow, band render test and an animated band GIF.
- Benchmark on harder tasks graded by hidden tests (100 real runs). On those tasks plain sonnet did as well as opus and cost 61% less; jev-router sits between them.
- Benchmarks for the effort cap and for multi-step and subagent routing on tasks with tools, with updated README images.
- Ponytail cleanup pass over the hook module: one subagent router, one usage tally (steps per model, in
/jev status), shared benchmark helpers, and the band GIF now renders the realsegments()so it cannot drift.
- Supply-chain hygiene: CI actions pinned to commit SHAs, Dependabot for Actions, a SECURITY.md, and no secret-looking literals in the tests (plugin-scanner: 100/100).
- Secret redaction now catches lowercase names (
password=,client_secret:,api_key=), JSON keys ("apiKey": "...") anduser:password@in URLs, and no longer mangles type words liketoken: string. - A pinned model (
!opus) now works without a Jev key, and the marker no longer sticks to the next prompt. A prompt with no key no longer runs on the previous task's pick. - The hard-task benchmark's hidden tests and reference solutions are sealed in an archive and unpacked only into a random temp directory while grading, so an agent cannot read them from disk. (A first run was discarded because they were readable.)
- Background-task notifications no longer trigger a Jev call or overwrite the task text.
- Spinner leak: the band ticker now stops on
turn.completeand on/jevcommands, and cancels itself if a prompt never completes.
- Jev routing per prompt: before each task, ask TypeSafe Jev which Claude model and effort fit best, then run the turn on it. Modes:
efficient,balanced,cheap. - The band above the prompt: mode, model tier, effort, confidence and cache state, with a spinner while a task runs.
/jevcommands:efficient,balanced,cheap,sticky,on,off,status,key.- Cache stickiness (
auto,strict,off): while the prompt cache is warm, a downgrade is refused and an upgrade needs a confident pick, so routing does not throw away a cache it would pay to rebuild. - Benchmarks: routing fit, cost, stability, overhead and cache stickiness over 30 tasks, plus real token usage and cost per mode against no plugin.
- Ponytail-style README with logo, hero art and benchmark charts.