Documentation for v0.36.0
Changelog
Every release, newest first.
[Unreleased]
[0.36.0] — 2026-10-28
Changed
- Refresh the shipped catalog to Intelligence Index v5.0 with explicit metric version and exact AA slugs. The 8/20-point band rule remains; values are not comparable with v4.
- Sonnet routine review uses high effort. Add optional Terra/high and Terra/max builder profiles and a read-only Opus/max judgement profile. Preserve the existing Fable identity and personal router choices.
Fixed
- Installing the reintroduced Terra builder profiles no longer removes them as legacy files; uninstall also covers all new profile names.
- Missing scores and unmeasured efforts no longer inherit a model’s best measured band; legacy or incompatible local catalogs cannot override current v5 evidence.
- Refresh selects the highest measured score rather than the highest effort, preserves official price provenance, and keeps legacy coding/math results separate from v5.
[0.35.1] — 2026-10-27
- Add GPT-6.1 Terra to the catalog with verified prices and per-effort Artificial Analysis results. Shipped profiles stay unchanged; Terra can be selected in a personal Codex profile.
- Reject unsupported Terra Codex efforts
noneandminimalduring configuration validation. Verify Terra forwarding with a fake native executable.
[0.35.0] — 2026-10-25
Retired models leave the kit, each for its same-line successor. Owner
decision (2026-10-25): a model retired by its provider is retired in every
repo that uses it. Generated by controller-models from its registry, with the
code paths patched by hand. The terra-* profiles are renamed, so the
release is a minor one.
Changed
-
Presets move off retired models:
luna-clerk→gpt-6-luna;terra-builder,terra-reviewer→gpt-6.1-sol, renamedsol-builderandsol-reviewer(owner decision);sonnet-clerk,sonnet-scout,sonnet-reviewer→claude-sonnet-5-5;fable-judge,fable-policy-annotator→claude-fable-5-1;grok-build→grok-4.7.
Efforts are unchanged. The Codex profiles and agents follow, and so does the lead model in
codex/config.snippet.toml. The Claude Code agents keep thesonnetalias, which resolves to Sonnet 5.5. -
Catalog:
- 13 retired rows are removed and 9 rows are added:
deepseek-v4-pro,gemini-4-argon,glm-5.3,gpt-6-luna,mistral-large-4,mistral-medium-3.5,mistral-small-2603,muse-spark-1.3-contributorandqwen3.8-flash. - Claude models carry their 1M context.
- Every price cites its official pricing page, re-checked on 2026-10-25; no figure changed.
- Mistral Medium 3.5 is placed in
small(index 14.2), from its Artificial Analysis row. muse-wonder-full-1.0loses its price, because Meta publishes no API price for it.
- 13 retired rows are removed and 9 rows are added:
-
delegation-grokrunsgrok-4.7by default and reads its usage undergrok-4.7-build.doctor.shchecks for the same model. -
The installer removes the old
terra-*Codex profiles it wrote, unless you edited them.uninstall.shremoves both names. A personal configuration keeps itsterra-*profiles until you rename them; seedocs/user-configuration.md. -
delegation-kimirefuses K3. A personal configuration that still nameskimi-k3must move tokimi-k3.1-pro; seedocs/user-configuration.md.
Fixed
openai-compatiblesendsmax_completion_tokensto Meta’s Model API, wheremax_tokensis a deprecated alias. Other endpoints still getmax_tokens.
[0.34.1] — 2026-10-24
The repository moved from matteoscurati/delegation-kit to
reasance/delegation-kit. No routing decision changes, so the release is a
patch.
Changed
- The npm wrapper clones
https://github.com/reasance/delegation-kit, at the tag of its own version, as before. Earlier versions clone the old URL, which GitHub redirects. package.json,.claude-plugin/plugin.jsonand.claude-plugin/marketplace.jsonlink the new repository as homepage, repository and issue tracker. The author fields still name the author.- Catalog refreshed on 2026-10-24: no model, score or tier changed.
[0.34.0] — 2026-10-24
Meta’s Muse models join the preset, on the Muse Code subscription through a
new runner or on the Meta Model API, and openai-compatible learns
effort. A new runner, adapter and profiles, so the release is a minor one.
Added
delegation-museand themuse-code-cliadapter: Muse Code on the subscription you signed in to withmuse login. Owner decision: the preset gainsmuse-code-wonder-full(muse-wonder-full-1.0, Power and Maximum plans only),muse-code-wonder(muse-wonder-1.0) andmuse-code-spark(muse-spark-1.3), roles clerk, scout, reviewer, policy-annotation (read-only) and builder, frontend-builder (worktree edits), atmaxeffort withcontributor_modeoff. The runner calls the release binary themuselauncher selected, never the self-updating launcher, from an isolated home with minimal settings, a copy ofauth.jsonand a link to the login keychain that holds the token; no user or project rules, skills, hooks, MCP servers or memory load. The shell is off in every role, as are web tools, reminders, questions and approvals, and writes in the read-only roles.sandbox-execlets only the Muse binary execute, keeps the ambient home unreadable but for the keychain, and limits writes to scratch, the keychain and, for builders, the worktree.META_API_KEYnever reaches the CLI, which would otherwise bill the run per token, and a sign-in made with an API key is refused. A kit lock serializes Muse runs; a refreshedauth.jsonis synced back unless the ambient one changed. The receipt carries the provider-reported model,billing: subscription, whether the plan’sallowancecame back, the contributor mode and the token counts.doctor.shchecks the contract and--ping-musepings Muse Spark 1.3. A newmuse-executorskill gates it like the others.contributor_mode(muse-code-clionly,onoroff): whether Meta may train on what the run sends, passed on every run so the setting saved in Muse Code never applies.muse-wonder-1.0andmuse-spark-1.3on the Meta Model API:openai-compatibleprofiles onhttps://api.meta.ai/v1with the key inMETA_API_KEY, atmaxeffort, for when you would rather pay per token. Meta’s Contributor-mode API variants are not in the preset.- Catalog: Muse Spark 1.3 at 48.1 (
mid, $1.25/$4.25; 45.1 atxhigh) and Muse Wonder at 52.4 (frontier, $4/$20, matched by name). Spark scores above Qwen3.8 Max (45.4) for less; Wonder costs what Opus 5.5 costs for a lower score, so a pool that holds Opus or Kimi K3.1 Pro does not pick it. Muse Wonder Full scores 55.8 (frontier, matched by name); the board prices it at $0 because it has no API, so the catalog gives it Muse Wonder’s $4/$20 by hand, kept across refreshes, rather than letting the router treat it as free. Subscription runs are ranked at those API prices too. effortonopenai-compatible:minimal…max, sent asreasoning_effortby the runner and by the router only when the profile declares it. A profile without it sends exactly what it sent before, and through the router the caller’s ownreasoning_effortstill passes. The router’s policy adjusts no effort on this adapter.
Known limits
- Muse Code’s telemetry follows its own defaults, and its bundled skills load.
Upgrading
- A configuration made earlier gets none of the Muse profiles: copy the
ones you want from
config/presets.json(Upgrading in the configuration page).
[0.33.0] — 2026-10-23
MiniMax-M3.1-Flash becomes a shipped profile. A new profile in the preset gives fresh configurations a new choice in every text lane, so the release is a minor one.
Added
- The
minimax-m3.1-flashprofile. Owner decision:config/presets.jsongains the profile the configuration page already used as its example — adapteropenai-compatible, modelMiniMax-M3.1-Flash, familyminimax, the seven text roles,base_urlhttps://api.minimax.io/v1,credential_envMINIMAX_API_KEY,context1,000,000. The catalog already places it (mid, 42.7, $0.15/$0.60). Without the key,delegation-router checkreports it unreachable (no MINIMAX_API_KEY) and a dispatch is refused; nothing else is affected..env.examplelists the variable beside the other provider keys.
Upgrading
- A configuration made earlier does not get the profile: copy it from
config/presets.json(Upgrading in the configuration page).
[0.32.0] — 2026-10-23
The Kimi profile runs Kimi K3.1 Pro. The model is new to the frontier
band, so routing decisions change and the release is a minor one.
Changed
- The Kimi profile is
kimi-k3.1-pro. Owner decision: thekimi-k3preset inconfig/presets.jsonis replaced bykimi-k3.1-pro(modelkimi-k3.1-pro, same adapter, roles andmaxeffort), anddelegation-kimirunskimi-code/k3.1-prowhen no model is requested. Kimi Code serves K3.1 Pro to the same OAuth login. Artificial Analysis measures it at 55.1 (K3: 43.6), which places it in thefrontierband at $2/$10 per million tokens: in a pool it now takes the frontier minimum from Opus 5.5 ($4/$20), and the 2.5 example in the README goes to Kimi as well.doctor.shchecks the new default. delegation-kiminames the models it runs. K3.1 Pro and K3; the provider must attest the requested one (the probe accepted onlyk3), and any other Kimi Code model fails it withnot a supported Kimi Code model.checkreports the kit’s name for the requested model instead of a fixedkimi-k3. A personal configuration with akimi-k3profile keeps running K3; Upgrading in the configuration page says what to change.- Catalog:
kimi-k3.1-proadded and placed by the refresh (55.1,frontier);kimi-k3stays for configurations that name it.
Fixed
- The router page’s pool example gave GPT-6 Astra 52.7; at the
higheffort its profiles run, the catalog places it at 50.9.
[0.31.0] — 2026-10-23
The router keeps an agent loop on one model, ends a native dispatch with the request that started it, and reads its deciders more strictly. Routing decisions change (the excerpt, out-of-schema answers), so the release is a minor one.
Added
X-Router-Conversationkeeps a conversation on its first route. An agent loop sends one request per step, and every step was decided on its own: a step with tools needs the mid band, and past 20,000 estimated tokenslongasks for the frontier, so the model changed halfway through the task and the provider’s prompt cache went with it. With the header, the firstautorequest is decided and pins the conversation to the profile it dispatched; every later one goes there without a decider call, as if the client had named it (modepinned,X-Router-Pin: held,router.pin). A request the pinned profile cannot take is refused withpinnednaming it, never sent elsewhere. Pins live in memory only (1,024 conversations, 12 hours idle); the id is never echoed or written to receipts. Without the header nothing changes. A malformed id is400 invalid-conversation.eval --outputwritesdecisions.jsonl: one line per prompt and paraphrase with the profile chosen, the signals, the reasons and the decider’s own answer, never the prompt. The report gave only aggregates, so a decision that fell to the default could not be traced to the signal that sent it there.
Changed
-
The excerpt drops the blocks coding harnesses add to a user turn before trimming it to 2,048 characters, and the arithmetic check ignores them: a date in a session block no longer kept a Jev decision at the mid band. The list was checked against each harness’s source:
<system-reminder>(OpenCode; Claude Code through translators such as claude-code-router),<environment_context>(Codex),<environment_details>(Roo Code). A user turn that is only such blocks is passed over for the one before it.input: fullstill sends everything as it is. -
The GLM runner sets no spending cap unless asked. It passed Claude Code
--max-budget-usd 2.00on every run, but Claude Code counts that amount at its Opus list (GLM runs under theopusalias), many times GLM’s price, so a GLM run stopped far below $2 of GLM.--max-cost-usdstill sets one, validated as a positive amount, and its help says the amount is Claude Code’s count, not GLM dollars.
Fixed
-
An out-of-schema answer from a decision service is undecidable, as the router page said. A probability or confidence that is not a finite number in [0, 1], a difficulty outside its scale, or a distribution that does not sum to 1 was read as it came (
NaNincluded, which Python’s JSON parser accepts); it now voids the answer, with a warning naming the value. A classifier’s difficulty orp_needs_strongoutside 0..1 is no longer clamped into range: it is undecidable too. -
A native dispatch outlived the request. A client that gave up, or a
servethat stopped, left the dispatcher running: a GLM run went on for more than 30 minutes after both were gone, and the runner ignored SIGTERM while its Claude Code child worked. The dispatcher now runs in its own process group; when the client hangs up orservestops, the group gets SIGTERM and, 10 s later, SIGKILL. -
GLM through Claude Code (
claude-zai) was priced at Opus rates. The runner reported Claude Code’s own cost as the provider’s, but Claude Code runs GLM under theopusalias and prices it at its Opus list: a one-line question was disclosed at $0.022 where GLM’s price comes to $0.0006. The runner reports no provider cost now, and the router prices GLM’s token counts at the profile’s rate.
Documentation
- The router page recommends pinning the Jev version an
evalmeasured instead ofjev-latest(Jev answered as 1.13.0 on 2026-10-15 and as 1.14.0 a week later), and says what Jev’s confidence measures. Sage’s band mass was tried in its place and kept out: replayed on 20 recorded answers it changed no answer and sent two more requests to the default.
[0.30.4] — 2026-10-21
Housekeeping.
Fixed
- The installer leaves nothing a release no longer ships. It copied the
library and the skills over the previous install and never removed what
was gone, so modules from earlier releases (
delegation_router.py,delegation_router_catalog.py) and their bytecode stayed beside the current ones. Library files the checkout does not ship are now removed, the library bytecode is cleared, and each kit skill directory is replaced whole. A regression test seeds a retired module, its bytecode and a retired skill file and checks the install removes them. - Stale names and concepts.
fable-judgepaired itself withsol-judge, which becameastra-judge; the dual-judgement reference said Sol, and one of its sentences was garbled. The GLM and Grok executor skills listed Kimi’s roles and pointed at evaluation options that no longer exist; each now names its own roles.doctorsaid reviewers must be cross-family where the review policy is configurable, that a missing executor skill blocks selection “even after evaluation”, and called the orchestrate skill a fan-out loop. The installer called a keyless DeepSeek “provisional”, the Qwen runner pointed at re-pin instructions the docs no longer have, and two errors said a decider kind is “not available in this release” where it is unknown.
Changed
- The orchestrate skill links its two references, and the empty
worker-brief.mdis gone. The Sonnet agents no longer say “Sonnet-5”: theirmodel: sonnetfollows the current Sonnet. - README: the “Current release” section describes this release only; the history is in this file.
[0.30.3] — 2026-10-21
Shorter documentation, corrected against the code.
Changed
- The router, configuration, executors and compatibility pages were
rewritten to be shorter and easier to scan. Each fact now has one page that
owns it and the others link there; long paragraphs became tables (the
reasons a profile is set aside, the rating-to-minimum map, timeouts per
adapter, the patch policy); history moved out of the pages and into this
file. The compatibility page keeps the current snapshot and lists earlier
releases briefly. The headings other pages link to (
Keys and environment,Adding a model,Deciders) are unchanged. - Shipped catalog refreshed on 2026-10-21: no placement or price changed.
Fixed
- Documentation that had drifted from the code. The router intro and the
README described the pre-0.28 rule (the cheapest model “on the tier”); with
floor-v1it is the cheapest profile at or above the minimum score. Undermax_cost_usdthe strongest eligible profile answers, not the default. The decider-skip rule now matches the code: nothing eligible, only the default, or, with a priced decider, nothing scoring above the default and a saving under ten times the decision’s cost. An unpriced profile ranks last overall, not within its tier.longis over 20,000 estimated tokens.claude-zairuns GLM, not Claude. - Executors and configuration. The ten-second grace after a timeout
applies only to Kimi, Grok and GLM, which also need
timeoutorgtimeouton PATH when a timeout is set (macOS has neither by default);openai-compatiblesends noeffort; a native pool profile whose provider names another model fails502 provider-identity-mismatchinstead of being disclosed; thecodexandclaude-codeadapters have rows; exit 65 and the patch verifier’s own exit codes are listed. The router’s error table lists every code it returns. delegation-router checksaid an unpriced profile is “ranked last within its tier”; it says “ranked last”.
[0.30.2] — 2026-10-20
What a review of 0.30.1 found.
Fixed
doctor.shwith a missing or invalid configuration stopped the personal-configuration section onconfig_file: unbound variableand then reported a keys file at/.env. It now looks for the.envbeside the path the commands read, whether or not the configuration validated.checkon an unreachable default said the router sets it aside. The default is never set aside, since doubt lands on it:checknow says that a request landing on it is refused asno-usable-candidate.delegation-router check --helpsaid “no network”; it says “no model call”, since a runner’s own check may reach its service.- Documentation. 0.30.1 said that an undecidable request landing on a
keyless default meets
401 provider-key-missing; it meets400 no-usable-candidate, withunreachable: <why>as the reason, and the router page’s error table and routing steps say so. The README no longer claims every login is checked (a Codex or Claude Code login is not, only the CLI on PATH) and names the default as the exception; thecheckcomment no longer promises prices outside--json; the external executors page says which runners read a key (GLM, Qwen, DeepSeek, andopenai-compatiblethroughcredential_env) and which use their CLI’s login (Kimi, Grok, Gemini); the router page says anllmdecider uses its profile’s key, kit key file included; the MiniMax walkthrough adds the profile torouter.poolbeforecheck --jsonreports it and gives the fulldelegation-runcommand. The compatibility page leads with this release’s numbers and labels the earlier ones by release.
Changed
- Shipped catalog refreshed on 2026-10-20 (0.30.0 and 0.30.1 were tagged
without the refresh the release rules ask for): MiniMax-M3.1-Flash 42.4 →
42.7, still
mid; every other placement and price unchanged.
[0.30.1] — 2026-10-20
Documentation only: the pages catch up with 0.28.0–0.30.0.
Changed
- README: the Quick start says where keys go (the installer’s three,
then
~/.config/delegation-kit/.envfor any other) and that the real file is never committed; How the choice is made checks your models before the decision;checkreports scores and reachability;decide --laneis named; the client paragraph says Claude Code and Codex cannot send requests to the router but can be picked by it;doctorreports the.env. - Router page: the same client note; a decider’s key and the Artificial
Analysis key can live in the personal
.env;provider-key-missingis what a named profile or an undecidable default meets, anautorequest having set unreachable profiles aside. - Configuration guide: the router section names the profile score,
reachability and
decide --lane; Adding a model puts the key in the.envand walks through a complete MiniMax-M3.1-Flash profile, down to the receipt that confirms it. - External executors: where a runner reads its key.
- The installed guard (Claude Code and Codex):
decide --lane <role>for a task the user wants delegated, still discovery that grants nothing.
[0.30.0] — 2026-10-20
Keys can live in one .env beside the configuration.
Added
- The personal
.env.${XDG_CONFIG_HOME:-$HOME/.config}/delegation-kit/.env(beside$DELEGATION_CONFIG_FILEwhen that is set) holdsNAME=valuelines that fill the variables your environment does not set: a profile’scredential_env,DEEPSEEK_API_KEY,QWEN_TOKEN_PLAN_API_KEY,ZAI_API_KEY, the deciders’SAGE_API_KEYandTYPESAFE_API_KEY,AA_API_KEY.delegation-run,delegation-routerand every runner read it; lines are parsed, never sourced; a variable already set wins; the file is ignored when it is a symlink or readable by group or others. Until now a key for anopenai-compatibleprofile could only come from the environment. The installer copies the new.env.examplethere once, mode 600, every value empty, and never overwrites it;doctorreports its mode and how many variables it sets, never a value. The kit’s key files under the data home keep working, after the environment and the.env. .env.examplein the repository lists every variable the kit reads, with no values;.gitignoreexcepts it and still keeps out every other.env*.
[0.29.1] — 2026-10-19
Changed
- MiniMax-M3.1-Flash replaces MiniMax-M3 in the catalog (owner
decision). Released on 2026-10-19, it scores 42.4 on the Artificial
Analysis Intelligence Index, which places it
mid, at $0.15/$0.60 per million tokens, against MiniMax-M3’s 29.2 (small) at $0.30/$1.20. Its context and JSON mode are not published on the board, so the row leaves them unknown instead of carrying M3’s over; the router then applies no context or JSON-mode rule to it. The shipped catalog was refreshed from the board on 2026-10-19: every other placement and price is as on 2026-10-17.
[0.29.0] — 2026-10-19
A model you cannot reach is set aside before the decision, not chosen and failed.
Changed
- Unreachable pool profiles are set aside. Before the decision, every
pool profile is checked without a model call: an HTTP profile needs its
key (the named variable or the kit’s key file), a native runner’s
check --jsonmust select a backend,codexandclaudemust be on PATH, and a profile that namescredential_envneeds that variable, asdelegation-rundoes. A profile that fails is left out like a context too small and listed underblockedasunreachable: <why>, so the cheapest profile you can actually use answers. Before, the policy could pick a model whose key or login was missing and the request failed, with no fallback.servechecks once when it starts and names what it set aside in its start line;decidechecks every time (the native runners’ checks run in parallel, about 3 s at worst); a login that lapses later still fails at dispatch, with its own error. A profile named asmodelis never set aside: it fails as before. checkanddoctorsay what this machine can reach. Each pool entry carriesreachable, and an unreachable profile, or an unreachablellmdecider, is a warning.decide --lanesays “no reachable pool profile takes the role” when the only candidates are unreachable, and names the reason when the decision lands on an unreachable default.
[0.28.0] — 2026-10-19
The rating becomes a minimum score; the cheapest model that reaches it answers.
Changed
- Policy
floor-v1replacestiered-v1. The decider’s rating becomes a minimum score on the Artificial Analysis Intelligence Index: up to 1 of 4, none; at 2, the bottom of the mid band (37.6 on the 2026-10-17 catalog); from 3, the bottom of the frontier band (49.6); in between, in proportion (2.5 → 43.6).math,rareandtoolsraise it to the mid band,longto the frontier band;codestill narrows to code-capable profiles. Every eligible profile at or above the minimum is a candidate, whatever its tier, and the cheapest wins; when none reaches it, the strongest eligible profile answers and says so (it used to fall to the default). Undertiered-v1the rating picked one tier and the cheapest profile on it won, so GPT-5.6 Luna (small, 37.3) answered an easy request ahead of a cheaper GLM 5.3 Flash (mid, 41.8), and a stronger mid model such as Kimi K3 never answered while a cheaper mid one was eligible. Each profile now carries ascore(the index at its reasoning setting, or the bottom of its band when placed by hand);checkprints it, anddecideand every response discloseminimum_scoreand the chosen profile’sscore. - The LLM decider rates in half points (0, 0.5 … 4), so a request between two levels gets a minimum between them. An answer off that grid, or not a number, is outside the schema and lands on the default. Checked live with DeepSeek Flash: it uses the half points (2.5, 3.5), about 1 s and $0.00014 a decision.
Added
delegation-router decide --lane ROLE: the decider’s recommendation for a task you are about to delegate. Only the pool profiles that take the role, by the same checkdelegation-runmakes, are candidates; the rest are listed underblocked; the recommendation names the profile’s capabilities on that role. A decision that would land on a default without the role recommends nothing, and says so. Themodel-routingskill asks Claude Code and Codex to pass the lane.
[0.27.2] — 2026-10-19
Changed
- The Opus profiles run Claude Opus 5.5. Owner decision:
opus-builder,opus-reviewerandopus-policy-annotatorinconfig/presets.json, and theopus-builderandopus-reviewerClaude Code agents, move fromclaude-opus-5toclaude-opus-5-5at the same efforts. Opus 5.5 is the best model on the Artificial Analysis board (57.6,frontier) and costs less per token than Opus 5 ($4/$20 against $5/$25 per million).doctor.shchecks the new pin. A personal configuration keeps the model it has; Upgrading in the configuration page says what to change. - The docs use the words the responses use.
tierinstead of rung and ladder (theX-Router-Tierheader, thetierfield), “decider” instead of “decision model”, “the profiles it may pick from” instead of “the pool it governs”. The README opens with what the router does.
Fixed
- What leaves your machine. The README and the router page said nothing
leaves the machine except the request to the chosen model. The decider
also gets an excerpt of each request (the whole request with
input: full) unless it runs on your machine; both pages now say so. - The README’s routing example. It said that adding GPT-5.6 Luna would
send the rename to Luna, which
tiered-v1does not do when a cheaper code-capable model sits higher (GLM 5.3 Flash). The example now uses three models from the default install, one per tier (luna-clerk,deepseek-flash,opus-reviewer), each row checked against the policy’schoose(), and the Quick start pool spans the three tiers instead of threemidmodels. install.shwarns when its bin directory is not on PATH. macOS does not put~/.local/binthere, and the first command then failed with “command not found”; the installer prints the line to add.- The tagline “Your models. Your call. Your rules.” is gone from the README and the router page.
[0.27.1] — 2026-10-17
Fixed
npx delegation-kitinstalls its own release. Without--refthe wrapper cloned the default branch, sonpx delegation-kit@0.27.0would have installed whatevermainheld on the day it ran. It now clones thedelegation-kit--v<version>tag of the package’s ownpackage.jsonand refuses, naming the ref, when that tag is missing;--refstill picks another ref, and--refor--repowithout a value is refused.
[0.27.0] — 2026-10-17
You choose the decision model; it governs the models you already pay for.
Added
delegation-router, a local model router. Arouterblock in the personal configuration names the decision model (decider, required) and the profiles it governs (pool,default, on any adapter).checkresolves it without network;decide --prompt-filerecommends one profile and never dispatches it (--rawshows the decider’s own answer);serveis an OpenAI-compatible/v1/chat/completionson loopback only. A"model": "auto"request goes through a deterministic prefilter (rung, context, cost ceiling, JSON mode, native limits), the decider and thetiered-v1policy — the lowest rung the answer allows,codenarrowing,math/rare/toolslifting tomid, the cheapest eligible profile in the rung, escalation never descent, a 0.55 confidence floor — then one forward with the chosen profile’s own key, streaming passed through. A pool profile named directly skips the decider.mode: shadowdecides and discloses but dispatches the default.- Five deciders, all asking the same question — how much capability,
which specialties — and reporting the same signals:
llm(one of your HTTP profiles,temperature 0, the excerpt in aDATAblock, 120 tokens of room; DeepSeek with thinking disabled, Qwen atminimal),sage(Levanto,scale+tags),jev(TypeSafe System One,score+nouls; arithmetic-looking numbers never belowmid),dipylon(your own/decide, oneyesno),classifier(a localPOST {"text"}), andnoneas the rules-only baseline. Each is called with its own credential and prices its decision;url,credential_env,modelandpriceoverride the defaults. Sage, Jev andllmthrough DeepSeek and Qwen were probed live before the release (see the compatibility page). - Native profiles in the pool through
delegation-run: the conversation becomes a prompt file, the dispatcher runs the profile on its first read-only role in an empty temporary workdir, and the answer file comes back as one chat completion with the dispatcher’s receipt underrouter.delegation_run. Timeouts, identity checks, OAuth locks and sandboxes stay with the dispatcher; its exit codes are mapped. No tools, images or JSON mode on a native profile; a stream is one event. This is how Claude models join a pool. - The ladder comes from a third party.
config/catalog.jsonplaces every model it can from the Artificial Analysis Intelligence Index with one published rule,index-bands-v1(frontier within 8 points of the best model of the day, mid within 20, small below), and records the evidence beside each row; a profile’s owntierwins, a profile witheffortis placed at that setting’s index, and every decision names its placement (tier_source).catalog showprints the source of every rung;catalog refreshmakes one request to the API with the user’s key (AA_API_KEY, orconfig/artificial-analysis.envunder the data home, mode 600) and writescatalog.local.json, which takes precedence while it is at least as recent;--shippedrefreshes the shipped file before a release. The shipped snapshot of 2026-10-15 placed 24 of 25 models from the API and corrected four hand placements (GPT-5.6 Sol and GPT-5.5 aremid, GLM 5.2 and Mistral Large 3small). Data attribution: Artificial Analysis. delegation-router eval: an offline measure of one decider on a golden set the user assembled (prompt, paraphrases, recorded outcomes per profile). Reports accuracy, cost, optimal-selection ratio, robustness, undecidable rate, latency, the rules-only baseline, a deferral curve and an advisorygate.json. It calls the decider, never a pool profile.- Disclosure and refusals.
X-Router-*headers and arouterobject with signals, reasons (including the candidates of the chosen rung with their estimated cost), blocked profiles, usage, cost and the provider-reported model (mismatchdisclosed, not fatal). Refusals that never reach a provider: unknown model, browserOriginoutsideallow_origins(a listed origin gets CORS), cost ceiling from the configuration orX-Router-Max-Cost-USD, invalid body, missing credential, busy. Provider failures keep their meaning and lose their payload. The server prints one listening line and nothing else. Opt-in receipts (JSONL, mode 600, no prompt content) surviveuninstall.sh. delegation-route checkreports the router;doctor.shhas a “Model router” section that opens with the decider and names the catalog in effect; the installer linksdelegation-routerand ships the catalog and the decider prompt. The router suite,tests/router/, runs 64 tests against fake providers and services; CI runs ruff beside shellcheck.
Changed
- One idea, up front. The README opens with the decision model and how the choice is made, with a worked table on the measured ladder; the explicit delegation commands, agents, Codex profiles and skills are described as the machinery the router dispatches through. Plugin, marketplace and npm descriptions say the same.
- One configuration schema.
delegation-config initwritesschema_version: 2; a file that still says1is read identically, and the routing fields (tier,code,price,context,json_mode) are accepted on either. doctor.shnames executor sections by adapter rather than by a model the presets may change;uninstall.shreports what it removes in current terms;run-tests.shprints each suite’s time as it finishes. The router and the test fakes bind without the reverse-DNS lookuphttp.serverdoes, which had stalled the macOS CI job past its limit.bin/libhas one module per domain: configuration, credentials, catalog, router policy, pipeline, deciders, bridge, server, eval.
Removed
- The pre-0.24 migration (
routing-gates.jsonimport, retired-file sweep, retired-profile checks): an install older than 0.25 goes through 0.26 first. model-routing.mdandADAPTING.md(folded into the configuration page); the historical snapshots and matrices ofdocs/compatibility.mdand the “Flags retired” section of the executors page — this changelog and git history keep them.
[0.26.1] — 2026-09-16
Fixed
docs/compatibility.md: the 0.26.0 snapshot stated a doctor count of 56; the observed count was 55 OK, 0 WARN, 0 FAIL, because a concurrent user dispatch held the Grok OAuth lock during the pass. Documentation only.
[0.26.0] — 2026-09-16
Changed
- No dispatch timeout unless the profile sets one. The kit no longer
decides how long a delegated task may take: the fixed 900-second limits of
delegation-kimianddelegation-grok, the 600-second default request deadline of the chat-completions adapters, and Gemini’s inherited 5-minuteagydefault are gone (Gemini receives 24h). The profile parametertimeoutis now accepted for every adapter and, when set, bounds the whole run everywhere with the same outcome: killed after the deadline plus a ten-second grace, nothing published, diagnostic reasontimeout, exit 75. The nativecodexandclaude-codedispatch indelegation-run, which had no deadline at all, honours it too. A 20-second connect timeout on HTTP adapters and the ten-second CLI probes ofcheckremain; neither judges the task. DELEGATION_GROK_TIMEOUT_SECONDSis gone;delegation-grok checkreportstimeout_secondsas the configured value ornull.
Fixed
install.shreplaces command files by rename, never in place. Bash reads a script as it executes it; copying a new runner over the inode of one that is mid-dispatch could feed it the new bytes. The installer now writes beside the file and renames, so a running dispatch keeps its own copy until it exits.
Removed
--allow-provisional, the no-op kept for one release in 0.25.0. Passing it is now an unknown argument (exit 64) on every runner and ondelegation-run.
[0.25.2] — 2026-09-13
Changed
- The
kimi-k3preset declares only the rolesdelegation-kimiruns:clerk,scout,builder,frontend-builder,policy-annotation. Thesenior,judgement, andreviewerroles were inherited from the retired routing gate, where they had never been enabled, and the runner has no read-only implementation for them, so the router listed them as unsupported. Owner decision; theroutesuite now asserts that every shipped preset row is technically compatible. A personal configuration is not edited by the kit: remove the three roles by hand if a migrated file carries them.
[0.25.1] — 2026-09-11
Fixed
install.shrestores a key file the uninstaller backed up.uninstall.shkeepszai.env,qwen-token-plan.env, anddeepseek.envas$DELEGATION_DATA_HOME.<name>.env.bak, but a later install asked for the key again and never looked there, so a key could sit in the backup while the runner reported it missing (the Z.AI key did, from 2026-09-01 to 2026-09-11). The installer now copies a backup into place, mode 600, only when the data directory has no key file; an existing file is never replaced. Covered by the install-marker suite.delegation-grok checkreportsadapter: "grok-build-cli", the name the presets anddelegation-configuse, instead of its backend keygrok-build; the backend key itself is unchanged.docs/user-configuration.mdandADAPTING.mdno longer describe historical evidence or evaluation receipts; the router is described at schema 3.
[0.25.0] — 2026-09-11
The idea behind 0.24.0 was that which model runs is the user’s call, not the kit’s. That release made it true for the user and left the qualification machinery in place as history. This release removes it.
Removed
- Routing gates.
config/routing-gates.jsonand the six executableconfig/*-routing.jsongates. No runner, router, or preset reads a gate any more;install.shdeletes the installed copies on upgrade. - The executor contract, evidence, and Epoch importer.
bin/delegation-executor-contractwithconfig/external-executor-contract.json,bin/delegation-evidencewithconfig/model-evidence.json, andbin/delegation-epoch, together with their suites (external-executor-contract.sh,epoch-zip.sh) and the CI step that ran them.uninstall.shkeeps removing the retired commands for one release. - The schema compiler.
bin/delegation-schemaandschema-transport.sh; it served only the evaluation mode below. - The runners’ qualification mode.
--evaluation,--evaluation-manifest, and--preflight-onlyare gone fromdelegation-glm,delegation-kimi,delegation-grok,delegation-gemini, and the shared chat-completions core behinddelegation-qwen,delegation-deepseek, anddelegation-openai-compatible, with the manifest verification, preflight receipts, attempt receipts, publication commit markers, and the “dirty checkout” refusal. Passing a removed flag is an unknown argument (exit 64). The Grok strict-identity VOID path is gone: a missing content model is tolerated everywhere, a surfaced mismatch still fails closed. - The gate-status helpers in
bin/lib/delegation-runner-common.sh, theevidencecolumn ofdelegation-route, compound lanes, and the doctor sections “Model-routing evidence”, “Central routing gates”, and “External executor contract”. docs/external-executors.mdshrinks from the contract description to the adapters, permission classes, patch verifier, identity, and exit codes.
Changed
config/presets.jsonis the shipped profile list (22 profiles, Gemini excluded), maintained by hand;delegation-config initcopies it. The npm wrapper verifies this file instead of the gates. A legacyrouting-gates.jsonis still imported on first migration and falls back to the preset when it is malformed.- Runner
checkreports{model, adapter, roles, efforts, selected_backend, backends}(plusdefault_effortfor the chat-completions adapters and the native runtime controls);qualified_lanes,provisional_lanes, andcandidate_lanesare gone. An unsupported role or effort exits 78 before any credential or runtime inspection. delegation-routereports schema 3: rows carrytechnical_compatibility,capabilities, andselectiononly.- Doctor gains a “Route discovery” section over the personal configuration, reads adapter roles from each runner, and pings through adapter roles.
--allow-provisionalstays a deprecated no-op that prints a warning; it is removed in the next minor release.- CLAUDE.md replaces “Routing gates” with “Presets and configuration”;
evaluation/README.mdis marked as an archive;model-routing.mdstates it governs nothing.
Migration
- Nothing to do for a 0.24.0 personal configuration: the schema is unchanged.
Re-run
./install.sh; it removes the retired files and commands from the data directory. Profiles that name a model the provider no longer serves (for exampledeepseek-v4-pro) are the user’s to edit in the personal configuration. - Scripts that called
delegation-executor-contract,delegation-evidence,delegation-epoch,delegation-schema, or a runner’s--evaluationmode have no replacement; the frozen artifacts underevaluation/remain as a record.
[0.24.0] — 2026-09-10
Added
- Personal configuration.
delegation-config init|validate|show|applymanages${XDG_CONFIG_HOME:-$HOME/.config}/delegation-kit/config.json(schema 1,DELEGATION_CONFIG_FILEoverride): profiles carry an adapter, the actual requested model, a declared family, roles, and supported parameters. Credentials are never stored in profiles;credential_envnames a variable for the three HTTP adapters.initderives a preset from the historical gates, snapshots a legacy install asmigration-v1-backup, and never overwrites an existing file;applyregenerates managed Claude/Codex snippets and preserves edited ones.install.shrunsinitandapplyand keeps hand-edited host profiles. delegation-run. One dispatcher runs a selected profile once through its adapter and writes output, metrics, and a version 2.result.jsonreceipt withreview_status, requested versus provider-reported identity, andauthorization_granted: false. Nativecodexandclaude-codeprofiles run read-only through the CLIs; provider runners keep their own sandboxes.delegation-openai-compatible. A text-only adapter for any OpenAI- compatible/chat/completionsendpoint on the shared chat-completions core: HTTPS required except loopback, one non-streaming request, optional bearer auth, no/modelscall, no tools, no retry.docs/user-configuration.mdand theuser-configregression suite (loopback HTTP, isolated configuration, no provider accounts).
Changed
- Review is optional by default, for new and migrated installs.
requiredaccepts any compatible reviewer,cross-familyrequires two declared, different families. A mandatory policy never authorizes the reviewer call: results staypending-reviewuntil the lead obtains it.init --preset strictselectscross-family. - The router reads the personal configuration and reports schema 2:
configuration_valid,technical_compatibility,capabilities, and the historicalevidenceper row;check,lane,profile,resolve, andtablestay read-only; a compound lane returns its members and protocol and requires separate member selections. - Evidence and gates are advisory.
config/routing-gates.json, the executable gates, the executor contract,delegation-evidence, andevaluation/keep their historical meaning and validation, but no longer grant or block execution; adapters own capabilities, roles, and efforts.--allow-provisionalis accepted as a deprecated no-op everywhere. - DeepSeek re-pinned to
deepseek-flash(DeepSeek V4.1 Flash, released 2026-09-10). DeepSeek routes everydeepseek-v4-prorequest to V4.1 Flash after 2026-09-14 12:00 Beijing time, which would have failed the runner’s exact identity check on every dispatch. Profile, executable gate (config/deepseek-flash-routing.json, the V4 Pro gate is removed on upgrade), contract family, runner default, doctor, installer, tests, and docs follow. One live exact-identity smoke atmaxpassed on 2026-09-10; the builder lane stays provisional and explicit-only in the historical record. - Gemini re-pinned to
gemini-3.8-flashon the staged bridge (gateconfig/gemini-3.8-flash-routing.json, the 3.7 gate is removed on upgrade), every lane still candidate or disabled; Gemini is excluded from the current presets by owner decision and existing personal choices are preserved. - Doctor gains a “Personal configuration” section (configuration valid, review policy, managed snippets, the new commands on PATH, the builder lane resolving selectable profiles) and describes the runners by their adapter defaults instead of pinned qualification.
- Reviewer profiles on both hosts apply the configured review policy instead of hard-coded cross-family exclusion; the resident guards describe the three policies.
Removed
- The routing-gate drift suite (central gate versus executable gates,
producer-family exclusion, fallback). With execution no longer gated by
evidence, those checks guarded a decision the kit no longer takes;
delegation-executor-contract checkanddelegation-evidence checkstill validate the historical records for consistency.
Fixed
- The Antigravity inventory parser matches exact ids in tab-separated ID/display-name rows.
config/deepseek.envis gitignored like the other key files.
[0.23.1] — 2026-09-07
Fixed
delegation-grokreported “ready” on a machine where every dispatch failed. Grok Build 1.0.13 denies the container runtime sockets (/var/run/docker.sock, podman, containerd, and the Docker Desktop paths under~/.docker) in every sandbox profile and resolves each endpoint before applying Seatbelt; when one is a symlink — Docker Desktop’s optional default socket link — a custom profile such asdelegation-kitis refused outright (“Refusing to start with its protections missing”), while the capability probe and model inventory still succeed.checknow probes those endpoints after resolving the CLI and reports the lane unavailable with the offending path and the remedy;runfails closed at exit 69 before dispatch; and a refusal surfaced by the CLI itself is classified assandbox_profile_refused(exit 69) instead of a genericdispatch_failed.DELEGATION_GROK_RUNTIME_SOCKET_ENDPOINTSoverrides the endpoint list for tests. Found by the first live Grok probe since 2026-08-27, on a machine where the link had appeared on 2026-08-28.install.shsaid the compatible Grok Build CLI archive was not retained whenever the runtime was unavailable, even though the archive was in place; the message now depends only on the pinned archive, and runtime availability is doctor’s report.
[0.23.0] — 2026-09-07
Fixed
delegation-route tablerendered its Fallback column from a field the rows never carried (fallbackinstead ofprovider_fallback), so the declaredopus-reviewersecurity fallback toclaude-opus-4.8never appeared. The column now shows the target model and trigger;tests/routing-gates.shasserts it.- README and
doctor.shstill named Sol as the Codex reviewer/judge after the 0.22.0 migration to GPT-6 Astra; both now say Astra. fable-judgewas pinned to thefablealias while the central gate bindsclaude-fable-5-1; the agent,doctor.sh, and the suites now pin the exact id, matchingopus-builderandopus-reviewer.- Removed the unused
found_namehelper fromdoctor.sh;.gitignorenow covers.hermes/per-machine agent state.
Changed
- Shared runner library.
bin/lib/delegation-runner-common.shholds the helpers that were copied into every external runner (die,have,sha256_file,key_file_mode,normalized_destination, lane listing by status,acquire_oauth_lock_wait). All six runners source it after resolving their install root;install.shcopies it to$DATA_HOME/bin/liband never links it onto PATH.runner_sha256still hashes the runner file alone — the library is bound byrunner_source_commitand the clean-checkout refusal. - Shared chat-completions core.
bin/lib/delegation-chat-completions.shis the whole text-only OpenAI-compatible transport;delegation-deepseekanddelegation-qwenare now thin wrappers that set their identity and define provider hooks (request body, key validation, usage accounting, the Qwen next-snapshot probe). Both suites pass unchanged. - Router. The five near-identical jq blocks that compared the Kimi, Qwen,
DeepSeek, Gemini, and Grok executable gates against the central gates are
one
check_executable_gatefunction;resolvecomputes the eligible rows and choices once. JSON output is byte-identical to 0.22.0. docs/compatibility.mdverified snapshot refreshed on 2026-09-07 with the numbers observed for this release.
[0.22.0] — 2026-09-06
Changed
- Codex review/judgement lanes migrate from Sol to GPT-6 Astra (
gpt-6-astra, efforthigh) on the owner decision following OpenAI’s 2026-09-03 launch. New familyopenai-gpt6(distinct from gpt-5.6) keeps cross-family review meaningful.astra-reviewer@ high covers material-review and security;astra-judge@ high replacessol-judge@ max. Super-judgement is now Fable 5.1 + Astra. Verified live on Codex CLI 0.153.4.
Fixed
.gitignorenow coversconfig/qwen-token-plan.env(the Qwen Token Plan key file), which was previously unprotected.
[0.21.0] — 2026-09-01
Changed
- Judgement lane migrates from Fable 5 to Fable 5.1 (
claude-fable-5-1, still atmax, still manual-qualified explicit-only) on the owner decision following Anthropic’s 2026-09-01 launch.fable-judgeand the central gate bind to the exactaa-claude-fable-5-1-maxrow; Fable 5 evidence is retained as context. Verified live: authenticated Claude Code returned exact PONG and surfacedclaude-fable-5-1at requested max. This owner decision does not convert coding evidence into judgement qualification. Super-judgement (Fable 5.1 + Sol) semantics are unchanged.
[0.20.1] — 2026-09-01
Fixed
- The npm wrapper consumed
--skip-doctorbut also forwarded it toinstall.sh, which refuses unknown arguments and exited 2. The wrapper now consumes the flag; the test assertsinstall.shnever sees it.
[0.20.0] — 2026-09-01
Added
- User-directed activation (
activation_policyinconfig/routing-gates.json): every dispatch must be selected or explicitly delegated by the user for the current request. The selection vocabulary is now closed atexplicit-only/blocked;default,fallback, andpreferred-explicitare removed and all lane-localfallbackpointers are gone. PR #56. delegation-route resolve --selected-profile <profile>validates one exact user-selected profile (exit 78 if it is not selectable for the lane) and the resolve output now returnschoices/selected/selection_validatedwithrequires_user_direction: true. PR #56.delegation-patch-verifyandconfig/external-patch-policy.json: a read-only, fail-closed trust boundary for text-patch lane output — path confinement, denied-path classes, capability and limit checks, strip level fixed by header grammar, read-only attestation. PR #55.- The external-executor contract now covers the patch policy: every
text-patchlane declares the policy version and verifier, andcheckfails on a missing, stale, or drifted declaration. PR #55. - npm distribution:
npx delegation-kitruns the universal installer without a manual clone (thin wrapper; installed artifacts are unchanged).
Changed
- Resident policies replaced by a minimal user-direction guard on both hosts
(
claude/CLAUDE.delegation.md,codex/AGENTS.md): no standing permission to delegate, authorization is per dispatch and never carries to retries, reviews, or additional workers.install.shregisters it;doctor.shverifies it on both hosts. PR #56. - All eight skills are explicitly user-triggered;
orchestrateno longer mandates hidden agent calls — the user-approved finite dispatch list is the budget. PR #56. - The external-executor contract mirrors the closed vocabulary: every
dispatchable lane carries
requires_explicit_decision: true. The contract still describes and validates only; each runner remains the sole enforcement authority. PR #56. - README restructured for clarity: why/quick-start/how-it-works flow, the governance model in one place, and a command reference table.
[0.19.0] — 2026-08-29
Changed
- Promote
glm-5.3-flash/claude-zai/maxas the sole GLM route after the exact v4 pack passed 9/9 no-retry attempts at score 1.0. All 204 assistant events carried the exact Flash identity, every terminalmodelUsagereported the sole canonical first-party Flash participant, and every builder checker passed. Clerk/scout are qualified explicit-only; builder is provisional explicit-only. Historical GLM-5.3 and Flash v1-v3 evidence is not relabelled. - Keep Claude Code and Bun temporary paths inside the evaluation scratch and
preserve
USERin the sanitized environment. The first Flash attempt never reached the provider because the frozen native CLI tried to create/tmp/claude-501; that attempt remains a terminalVOID. - Record the terminal v3 identity probe and align future strict extraction with
the actual Claude Code/Z.AI stream: content-bearing assistant events expose
message.model, whilemodelUsagecarriescanonicalModelandprovider. V3 is not relabelled; the fresh v4 pack supplies the evidence used by the promotion recorded above.
Verified
- The exact v4 pack completed 9/9 no-retry attempts at score 1.0 for
glm-5.3-flash/claude-zai/max; all 204 assistant events had complete Flash attribution, every usage record named the sole canonical first-party Flash participant, and all three builder checkers passed 6/6 tests. - The release candidate passed all 12 regression suites in 52 seconds, 59
routing checks, ShellCheck, JSON/evidence validation, the eight-check version
gate,
git diff --check, and independent cross-family review with verdictSHIP. - A clean release-candidate install matched source across the GLM runner, both
gates, and the Claude/Codex executor skills. Static doctor reported
55 OK, 0 WARN, 0 FAIL;doctor.sh --ping --ping-glmreported58 OK, 0 WARN, 0 FAIL, with GLM-5.3-Flash and both bridge directions returningPONG/reachable.
[0.18.0] — 2026-08-27
Added
- Added
delegation-grok run --oauth sharedfor concurrent Grok Build workers. Operational runs share one runner-owned persistentGROK_HOMEgeneration, use the vendor auth lock for refresh coordination, and hold the kit lock only for generation adoption and atomic publication. Externalgrok loginwins a conflict; corrupt or superseded OAuth state fails closed. Evaluations remain serialized.
Fixed
- Serialized Grok runs now hold an OAuth lock for the complete dispatch and atomically publish validated refreshed credentials back to the ambient login, instead of deleting a refreshed token with the ephemeral HOME. Sandbox attestation uses a unique per-run profile and ignores peer/malformed events; the agent cannot edit the credential, policy, or attestation files. Superseded credential generations are bounded instead of accumulating at rest.
Verified
- The 0.18.0 release candidate passed all 12 regression suites in 52 seconds,
59 routing checks, ShellCheck, evidence validation, version consistency, and
git diff --check. A real two-worker Grok 4.6/high smoke returnedPONGtwice in about five seconds, left both workspaces empty, and finished with ambient/shared OAuth hashes aligned. The provider did not separately expose the effective content model, so the smoke is operational compatibility proof, not strict model-identity evidence. The installed release candidate matched source across the changed runner, gates, and skills; the live doctor command completed with57 OK, 0 WARN, 0 FAIL.
[0.17.0] — 2026-08-18
Changed
- Reworked the native routing policy so Sonnet and Luna are limited to very
small, non-builder clerk/scout/routine-review tasks. The former
sonnet-builderandterra-scoutprofiles are retired; the oldopus-reviewer/highprofile is replaced by a max-effort cross-family reviewer. - Added
opus-builderatclaude-opus-5/maxand made it the fallback to the defaultterra-builderatgpt-5.6-terra/max. Added separate read-onlyopus-reviewerandterra-reviewerprofiles, also atmax, so both high-level models can build or review without mixing permissions. - Added an explicit model-family registry and fail-closed cross-family review rule. Every routine/material/security review resolution now requires the producer profile or family, removes all same-family reviewers, and exposes the exclusions in the router output. Runtime availability must still be checked; no eligible reviewer means stop, not self-review.
- This is a breaking routing migration: callers resolving a review lane must
now pass
--producer-profileor--producer-family; omission exits64instead of selecting a potentially same-family reviewer. - Promoted security review from the former manual Opus-only route to
producer-aware provisional defaults/fallbacks across Sol, Terra, and Opus.
The Opus path continues to disclose Anthropic’s possible Opus 4.8 fallback
for classifier-flagged cyber requests; exact Opus 5 identity is not guaranteed
on that path. The former native
seniorroute now has no operational profile. - Re-pinned the read-only
sol-judgeprofile fromhightomaxandfable-judgefromxhighto its verified supportedmaxon explicit owner effort decisions. Both remain manually qualified and explicit-only; coding rows at the exact max tuples are contextual, not judgement evidence. - Recorded a scoped installed-profile smoke for
opus-builder: the exact Opus/max request changed only its assigned file, passedgit diff --check, and surfacedcanonicalModel: claude-opus-5. The lane remains provisional; one synthetic edit is compatibility evidence, not general qualification. - Updated installation, cleanup, doctor, routing tests, and policy documents to enforce the new role and family boundaries and remove stale installed profiles.
- Fixed the release doctor so its missing-producer probe preserves the caller’s
shell options, and added an end-to-end regression for Codex configurations
without a root-level
sandbox_mode.
[0.16.0] — 2026-08-17
Added
- Added
delegation-deepseek, its executable and central gates, installer, doctor checks, executor skill, and regression suite. The officialdeepseek-v4-proAPI is pinned tomax; only the text-onlybuilderlane is provisional/explicit-only after one exact live patch smoke, and every other lane remains blocked.
Changed
- Re-pinned the fail-closed Antigravity bridge from Gemini 3.6 Flash to
gemini-3.7-flash, including its gate, skill, policy, installer, doctor, and tests. No operational Gemini lane is inherited: the current local session cannot attest exact 3.7 inventory/OAuth, so all new routes remain blocked. - Refreshed the evidence registry with first-party Gemini 3.7 Flash and DeepSeek V4 Pro sources and contextual benchmark claims; neither source auto-qualifies a lane.
[0.15.0] — 2026-08-16
Changed
- Sol becomes Codex’s default material reviewer without widening its role.
sol-reviewerathighmoves from manual explicit selection to the provisionalmaterial-reviewdefault on an explicit owner decision. It remains read-only and provisional because no exact review precision/recall row exists.sol-judge, judgement, andsuper-judgementremain manual and explicit-only; routine review and executor lanes are unchanged. - GLM-5.3/max replaces every previous GLM route across the active executor. The exact high/max comparison ran three no-retry attempts per lane on the same frozen runner. Both efforts scored 1.0 in all nine attempts and passed every builder checker; the preregistered efficiency rule selected high (372s, $0.334234) over max (505s, $0.719138), after which the owner explicitly selected max as the sole operational effort. Clerk and scout are qualified explicit-only and builder remains provisional explicit-only. The 5.2 and 5.3/high gates and central profiles were removed; upgrades delete stale installed copies while frozen receipts remain historical. The selected tuple was requalified 9/9 on the final max-only runner bytes; the public result records digests for both the comparison and operational receipts.
- The evidence snapshot records Z.ai’s GLM-5.3 release, Coding Plan access, effort mapping, and launch benchmark claims as contextual-only evidence. No independent tracked leaderboard had a GLM-5.3 row on 2026-08-14.
Fixed
delegation-glmnow reads model and profile identity from the selected executable gate, permits onlyglm-5.3/max, and capability-probes Claude Code with a ten-second fail-closed timeout. A separately verified native binary can be selected explicitly for diagnostics without weakening model, lane, effort, sandbox, or manifest checks.
[0.14.0] — 2026-08-13
Changed
- Grok 4.6 replaces Grok 4.5 across the active integration. The runner,
central and executable gates, skills, installed Claude/Codex policy, doctor,
documentation, and regression fixtures now pin
grok-4.6through Grok Build at efforthigh.builderandfrontend-builderremain provisional andpreferred-explicit, so every dispatch still requires an explicit decision plus--allow-provisional; no reviewer, senior, or judgement lane was added. - The 2026-08-12 evidence snapshot adds separate Grok 4.6 observations from CursorBench 3.2, FrontierCode 1.1, APEX-SWE, APEX Agents, Code Arena WebDev, and xAI’s launch material. Every row is contextual: the independent results use non-production harnesses, WebDev is preliminary, and xAI’s figures are first-party claims. Grok 4.5 benchmark rows remain historical evidence and do not support the new route.
Fixed
- Grok metrics no longer mistake a
modelUsagebilling participant for the model that authored the content. They record the requested model, any separately surfaced effective content model, and all usage participants, summing their tokens and cost. A surfaced mismatch fails every lane closed; a strict evaluation with no content-model identity isVOIDrather than a false pass. - Upgrading removes the installed
grok-4.5-routing.jsonand installs the 4.6 gate atomically with the current router and evidence snapshot before checking a retained private CLI archive. A portable upgrade regression covers stale gate removal, new-gate installation, and archive retention without depending on the user’s authentication state.
Verified
- All ten regression suites, ShellCheck, JSON/evidence/gate validation, and the
version/tag consistency checks pass. After reinstalling the dirty release
candidate,
delegation-grok check --jsonresolved Grok Build CLI0.2.114withgrok-4.6-build, and./doctor.sh --ping-grokreturnedPONGwith42 OK, 0 WARN, 0 FAIL.
[0.13.2] — 2026-08-05
Fixed
- The Agent Arena row for Gemini 3.6 Flash had five of its six effects
recorded with the wrong sign. The board encodes each effect’s direction as a
coloured triangle rather than a character, so the automated capture that built
the 0.13.0 snapshot read every value as positive; the row was committed with
sign_inferredand onlynet_improvement_pctflipped, on an inference from the sort order. Read visually from the rendered board, the model is negative on every effect: net improvement-3.01%, confirmed success-1.63%, praise vs complaint-5.19%, bash recovery-2.69%, and steerability-6.70%— that last one being the scout lane’s own supporting metric, which makes this the difference between “unproven” and “measurably worse than the baseline agent in real sessions”. The flag is gone and the row now states that its signs were read, not inferred. The rows near the boundary were re-read too: GPT 5.6 Sol, Luna, and Terra at ranks 5, 17, and 18 are positive as recorded, so the error was isolated to the one row below the inflection. skills/qwen-executornow tells the brief to demanda/andb/diff header prefixes. The text-only builder lane returns a patch the lead applies, and left to itself the model emits--- <path>on both sides;git applydefaults to-p1and strips one leading component precisely because of that convention, so an unprefixed header resolves to a path that does not exist and a correct patch fails to apply — which reads like a wrong answer and is not one. Re-dispatched with the instruction, the model returned prefixed headers and the patch applied with a baregit apply. The skill also records-p0as the recovery for a patch already in hand.
[0.13.1] — 2026-08-05
Fixed
- The Gemini lane was unreachable from an SSH session, whatever the user did.
agypicks its credential store from the environment: seeingSSH_CLIENT,SSH_CONNECTION, orSSH_TTYit switches to a file-based token store and never consults the macOS Keychain.delegation-geminisupplies credentials the opposite way —prepare_isolated_homesymlinks the user’s~/Library/Keychainsinto the isolated home and carries nothing else — so over SSH the CLI looked in a store that was never written,agy_statusreportedagy model inventory unavailable, and every dispatch failed closed with exit 69. Signing in again could not help: the login landed in the Keychain that the CLI had already decided to ignore. The runner now clears the three markers for everyagycall that can touch credentials — the plugin inventory, the model inventory, and the dispatch itself. On a local session they are unset already, so this is a no-op there, and it grants nothing new: no additional tools, no filesystem access, only which credential store the CLI consults. Verified end to end from an SSH session:checkreportsreadyand a realscoutdispatch returned a correct answer at exit 0. - The unavailable-runtime reason now says to keep the login keychain unlocked, since that is the only store this runner can read; the previous text sent the reader to an interactive sign-in that would not have fixed the SSH case.
tests/gemini-runner-diagnostics.shnow runs its whole suite with SSH markers exported, and itsagystub exits 90 if any of them reaches the CLI. Neutering the fix makes the suite fail, so the regression is real rather than vacuous.
[0.13.0] — 2026-08-05
Changed
- Routing gate — the three Codex executor lanes are re-pinned above the effort
cliff.
luna-clerkmoveslow→max,terra-scoutlow→medium, andterra-buildermedium→max. Lanes, models, harnesses, sandboxes, and statuses are unchanged; only the pinned effort moved. The reason is that the cheap models do not degrade gracefully and the kit had its two highest-volume lanes pinned where they collapse: on the exact Artificial Analysis rowsgpt-5.6-lunaatlowscores 15% SWE-Atlas-QnA — the clerk required metric — against 33% atmax, and the Epoch effort ladder puts the same model at 1.5% DeepSWE atlowagainst 67.2% atmax.terra-buildergains both builder required metrics: DeepSWE 46% → 67% and Terminal-Bench v2 69% → 84%, at $2.76 rather than $0.90 per task. Each new effort was chosen because it already carries an exact benchmark row, so no lane trades measured evidence for expected capability. Owner decision on measured evidence, recorded in each lane’squalification_basis. - Routing gate — Kimi K3 and Grok 4.5 become
preferred-explicitonbuilder(they already were onfrontend-builder). Both remainprovisionaland still require an explicit decision plus--allow-provisional; only the ordering among external builders changed. They are the only two carrying both builder required metrics on an exact production tuple, so they now rank aboveglm-builderandqwen3.8-max, which carry none. This records preference, not qualification: Kimi’s local evaluation is still a quota-truncated run and Grok’s a single non-held-out task. - Codex reasoning-effort support is per model, not global, and reaches further
than this repository claimed. Probed against the provider on 2026-08-05:
gpt-5.6-terraenumeratesnone · minimal · low · medium · high · xhigh · maxand ran athigh,xhigh, andmax;gpt-5.6-solandgpt-5.6-lunaran atxhighandmax;gpt-5.5refusesmax. The effort table inmodel-routing.mdpreviously stopped every Codex row athigh.
Fixed
delegation-evidence checksilently passed a broken snapshot. It ranage="$(validate)", and a command substitution does not inheritset -e, so thejq -ecovering schema, id uniqueness, and source references could fail whilecheckstill printedvalidand exited 0 — only the freshness check, which uses an explicitreturn, was effective. The validation now fails with exit 65 and a message naming the file. Caught when a snapshot whose rows referenced three nonexistent sources was reported as valid.preferred-explicithad no positional meaning:delegation-route resolveemitted theexplicitarray in profile-insertion order, so a plainexplicit-onlyprofile could be listed ahead of a preferred one. Preferred entries now come first, insertion order preserved within each group.
Added
- 65 dated evidence rows and three sources in
config/model-evidence.json: Agent Arena (data 2026-08-03, 1,607,993 sessions — first Claude Opus 5 rows, entering at ranks 1 and 3), Code Arena WebDev (data 2026-08-01, 510,194 votes — firstqwen3.8-maxrow at rank 4, which is thefrontend-builderrequired metric for a model that has no such lane), and the Epoch AI ZIP of 2026-08-04, whose first import of the DeepSWE effort ladder is what made the cliff visible. Existing rows are untouched; the gates reference them by id. Every Epoch row iscontextual_onlybecausemini-swe-agentis not a production harness, and the Gemini Agent Arena row carriessign_inferredbecause the board’s sign is not machine-readable.
[0.12.0] — 2026-08-04
Added
delegation-kimi run --oauth shared(orDELEGATION_KIMI_OAUTH_MODE=shared): concurrent Kimi dispatches. Until now the kit lock spanned the whole run, so a second agent died instantly with exit 75 — but the vendor supports ~30 concurrent instances when they share oneKIMI_CODE_HOME, coordinating refresh-token rotation through the CLI’s own cross-process oauth lock. In shared mode, OAuth state lives in a runner-owned generation under$DELEGATION_DATA_HOME/kimi-shared-oauth; each run’s isolated home symlinks itscredentials/andoauth/dirs at that generation so the vendor lock coordinates the children, and the kit lock shrinks to two brief critical sections (seeding the generation, publishing it back to the ambient home). Generations — not hash markers — keep a dead token family from clobbering a credential after an externalkimi login; a busy kit lock at publish time defers to the next run instead of failing. The serialized default and its sandbox profile are byte-for-byte unchanged,--evaluationruns always serialize, and the live two-parallel smoke against the real CLI passed on 2026-08-04 with a real mid-run rotation through the symlinked generation.DELEGATION_KIMI_OAUTH_WAIT_SECONDS(default 5, 0 = fail immediately): bounded wait on the kit lock for shared-mode seed and publish.- delegation-glm now distinguishes two 429 shapes in
<output>.error.json: reasonrate_limited(retry with backoff) versusquota_exhausted, which carries the window-reset epoch in the newnext_flush_timefield (diagnosticschema_version2). Z.AI’s numeric body codes never reach the runner — a captured stream showsapi_retrycarries only the HTTP status — so quota detection keys on therate_limit_eventreset epoch instead.
Fixed
- The delegation-glm stderr fallback grepped for Z.AI code
1312, which does not exist in the published error table, and missed1302— the actual rate/concurrency code. - A stray 429 event in an otherwise-completed GLM stream no longer overwrites
an extract-phase reason (
empty_result,model_mismatch, …) withrate_limited: reclassification is now scoped to dispatch failures.
[0.11.1] — 2026-08-03
Fixed
- Made the CI release-tag check fetch the real tag object before validating it.
actions/checkoutmaps the commit SHA ontorefs/tags/<name>, leaving a lightweight ref even when the pushed tag is annotated, so the 0.11.0 tag run failed withtag is annotated: expected 'tag', got 'commit'while the tag itself was correct on both the server and locally. - Made
tests/version-consistency.sh --tagfail when the tag object is absent instead of silently skipping the annotation and subject checks. A silent skip left the convention unenforced in exactly the environment it was written for.
[0.11.0] — 2026-08-03
Added
-
install.shnow writesinstalled-version.jsoninto the data home, anddoctor.shcompares it against the checkout. Until now a stale install was undetectable: every other doctor check inspects the installed copy against itself and passes while it lags the repository. A version mismatch is a FAIL, a same-version commit mismatch is a warning, and installs from a dirty checkout or with--claude-only/--codex-onlyscope are recorded so the marker never overstates what was installed. -
Added
tests/install-version-marker.sh, which installs into isolated homes and asserts both the marker’s contents and that doctor detects version drift, commit drift, a missing marker, and a missing install. -
Added
run-tests.sh, which runs every suite in parallel on one machine and prints the full log of any that fails. CI uses it, cutting the macOS job’s test step from ~116s to well under half without allocating a second runner.--sequentialrestores one-at-a-time output for debugging. -
Added
.github/workflows/ci.yml. Until now nothing verified a release except the person cutting it. Every pull request and push tomainnow runs shellcheck at-S warning, the version-surface check, and the regression suites on macOS; a tag push additionally validates the tag against the manifest version. Suites run on macOS because the Kimi runner requires/usr/bin/sandbox-execand the Grok suite asserts BSDstat -fmodes. -
Added
tests/version-consistency.sh, which enforces the CLAUDE.md release rules: the five version surfaces must agree, the newest changelog section must be the shipped version, and--tagvalidates thedelegation-kit--v<semver>annotated-tag convention.
[0.10.0] — 2026-08-03
Changed
- Repinned the Qwen bridge from
qwen3.8-max-previewtoqwen3.8-maxafter the model left preview on 2026-08-02. The rename rests on a local Token Plan probe confirmingGET /modelslists the unsuffixed id and that a chat completion pinned to it returns.model == "qwen3.8-max"withreasoning_effort: xhighaccepted; the-previewid still resolves in parallel. Renamedconfig/qwen3.8-max-preview-routing.jsontoconfig/qwen3.8-max-routing.jsonand the central gate profile toqwen3.8-max. - Promoted the Qwen
builderlane to provisional / explicit-only atxhighon an explicit owner routing decision.delegation-qwen runnow accepts--allow-provisional, which is mutually exclusive with--evaluation; the previous blanket refusal of every provisional lane is gone. Every other lane stays a blocked candidate, andjudgementstays disabled. - Cleared the Qwen
policy-annotationmanifest allowlist in both gates. The frozen manifest was bound to theqwen3.8-max-previewprofile, model, and runner hash, so it can no longer validate; regenerate it against the new tuple before any evaluation run. The frozen v2/v3 evaluation artifacts are historical records and were deliberately left unrewritten.
Documentation
- Recorded the promotion as an owner decision rather than measured capability.
A 2026-08-03 re-check of the Artificial Analysis coding-agent board and
Terminal-Bench 2.1 still found no
qwen3.8-maxrow, so both builder required metrics (coding.deep_swe_pass_pct,coding.terminal_bench_v2_pass_pct) remain unmet andexact_evidence_idsstays empty. Alibaba has published no benchmark table for the model. - Added the contextual
qwen-3.8-max-ga-launchevidence row and itsqwen-3.8-max-ga-2026-08-03source. Its metrics live underlaunch.*so they cannot satisfy any lane’srequired_metrics. The snapshot date stays 2026-07-31 because this was a targeted re-check, not a full refresh. - Documented that the Qwen builder lane is text-only: the chat-completions transport exposes no tools and no terminal, so it returns a patch the lead applies and verifies rather than editing a worktree, and it is prompt-only.
[0.9.0] — 2026-08-01
Added
- Added
delegation-schema, a read-only deterministic compiler and verifier for Claude Code and Codex structured-output transport schemas.
Fixed
- Made GLM lane evaluation compile its manifest-bound schema for Claude before dispatch, while leaving the normative schema and frozen protocols unchanged.
- Made schema compilation preserve literal objects and property order, reject non-standard JSON, and fail closed on unsupported Codex keywords, unions, and documented Structured Outputs limits.
- Made
doctor.shuse Claude’s provider-free auth status and warn when a sanitized macOS environment dropsUSERand therefore Keychain resolution. - Made
doctor.shexercise both the Claude and Codex compiler paths before reporting the installed schema transport helper healthy.
Documentation
- Defined separate requested, effective, and observed-usage model evidence for
Claude safety fallback and internal classifier telemetry, including aggregate
token/cost accounting and exact-identity
VOIDbehavior. - Documented provider-specific schema preflights for raw Claude and Codex
bridges;
--helpchecks alone are not semantic compatibility checks.
[0.8.1] — 2026-07-31
Changed
- Raised the maximum manifest-bound Kimi evaluation timeout from 600 to 1200 seconds. Operational Kimi runs remain capped at 900 seconds.
[0.8.0] — 2026-07-31
Added
- Added hash-allowlisted, manifest-bound qualification for GLM clerk, scout,
and builder at the exact
glm-5.2/claude-zai/hightuple. - Added portable lane-specific structured-output schemas, per-attempt receipts, full worktree and Git-control attestation, and a public minimal aggregate for the frozen repeated comparison.
- Refreshed current GLM and cross-model context from Agent Arena, Code Arena WebDev, Terminal-Bench 2.1, SWE-bench-Live, OpenBench, Z.ai, and Epoch.
Changed
- Qualified GLM clerk and scout as explicit-only routes after three valid repeats matched the best incumbent on each bounded pack.
- Moved GLM builder from candidate/blocked to provisional/explicit-only after
all three GLM attempts and all three Terra incumbent attempts passed the
deterministic checker. Builder still requires
--allow-provisional. - Extended central gate validation so private GLM qualification allowlists may cover clerk, scout, and builder without creating an operational route by themselves.
Fixed
- Made the GLM runner actually pass the manifest-bound output schema to Claude Code and extract structured output without changing the historical policy-annotation path.
- Replaced a non-portable generic comparison schema with lane-specific schemas accepted by both Claude Code and Codex.
- Hardened GLM qualification with fixture-only data reads, a native-CLI process
allowlist, an empty environment, immutable
.git, ignored/untracked file and executable-mode hashing, and disabled Claude keychain prefetch. The final runner passed independent security review and macOS sandbox canaries.
Documentation
- Documented the exact local decisions, costs, latency limitation, invalidated
runner/preflight series, and two
VOIDClaude builder comparator attempts caused by an out-of-fixture write. No attempt in the final v6 series was retried.
[0.7.2] — 2026-07-31
Changed
- Removed downstream Dipylon evaluation packs from the repository, installer, doctor, routing allowlists, and pack-specific tests.
- Kept only kit-owned qualification manifests in the central routing allowlist and added a generic invariant that every allowlisted manifest is tracked.
- Preserved the generic Qwen 900-second evaluation ceiling and timeout classification introduced alongside the downstream packs.
Documentation
- Documented that project-specific evaluation packs belong in their owning repository or artifact registry and are deliberately ignored here.
- Kept the 0.7.1 Claude Code, Codex, and external-runner compatibility matrix as the reproducible compatibility snapshot for this patch release.
[0.7.1] — 2026-07-31
Added
- Added a reproducible compatibility matrix for all shipped Claude Code agents, Codex profiles, and gated external runners.
- Recorded semantic smoke expectations, cross-CLI round-trip verification, fail-closed Qwen behavior, and byte-for-byte installation checks.
Documentation
- Clarified that
codex exec --ephemeral -p <profile>must not be combined with--ignore-user-config, which also suppresses the selected profile. - Clarified that Claude read-only roles expose Bash for inspection and therefore do not have the same OS-enforced write isolation as Codex read-only sandboxes.
- Preserved all existing provisional, candidate, and blocked routing decisions; successful runtime verification is not a model promotion.
[0.7.0] — 2026-07-31
Added
- Upgraded the Kimi bridge to a capability-probed Kimi Code runtime with lane-specific agent files and a digest-attested ripgrep allowlist.
- Added bounded cancellation, timeout handling, sanitized heartbeat/error diagnostics, and explicit OAuth finalization.
Security
- Confined Kimi process execution to the selected CLI,
/usr/bin/true, and the exact pinned ripgrep runtime under the macOS sandbox. - Kept all Kimi lanes provisional and explicit-only without changing historical evaluation manifests.