Releases: SomeCodecat/multiclaude
Release list
multiclaude 2.6.0 — reliable AGY dispatch + GPT-6 Astra routing
Two targeted fixes: AGY dispatches were silently no-op'ing, and the Codex hard band was still pinned to the previous generation.
AGY dispatch was a silent no-op
resolveTiers() returned the whole agy models row — id<TAB>Display Name — so dispatches ran as:
# ⚠️ the bug, not a command to run — that is a literal tab in the --model value
agy --model "gemini-3.8-flash-high⇥Gemini 3.8 Flash (High)"
agy does not reject that. It prints its interactive model picker and exits 0 without ever running the prompt. The result is non-empty and plausible-looking, so it slips past orchestrate §3's "empty result = dispatch failure" backstop: the task never ran, the wallet was never touched, and the orchestrator carried on as if it had an answer.
agyTiers()now parses rows into{id, name}and drops theFetching available models...status line.resolveTiers()resolves by ID and ranks by the version parsed out of the ID, so a tier never depends on the orderagy modelshappens to print. Addsgemloandprohi; display names move to.names, used only for §9 attribution.probe.mjsandquota.mjsprint the bare ID with the display name behind a//, and say plainly which half goes to--model.mc-agyrefuses a--modelvalue containing a space, tab, paren, or slash rather than firing the no-op.
Codex routing: GPT-6 Astra
mc-codex hard-enumerated gpt-5.6-{luna,terra,sol} and would have rejected Astra outright.
| Band | Was | Now |
|---|---|---|
| Mechanical | gpt-5.6-luna @ medium |
unchanged |
| Standard | gpt-5.6-terra @ high |
unchanged |
| Hard | gpt-5.6-sol @ xhigh |
gpt-6-astra @ xhigh |
| Escalation | — | gpt-6-astra @ ultra (new) |
gpt-5.6-sol is the documented hard-band fallback: Astra is account-gated and needs Codex CLI ≥ 0.153. Routine burn rate is unchanged — only the top bands moved.
Verified against the live CLIs
Exact commands, copy-pasteable. Note that the prompt is attached to --print:
a valueless --print swallows the next flag as its prompt (agy 1.1.27 now catches
this and says so, rather than acting on the literal flag text).
agy --print="reply with exactly: OK" --model gemini-3.8-flash-high --output-format json
# → {"status":"SUCCESS","response":"OK\n","usage":{"total_tokens":5478}}
codex exec -m gpt-6-astra -c model_reasoning_effort="ultra" \
--skip-git-repo-check "reply with exactly: OK"
# → OK, 4,812 tokens
# probe — from a clone of this repo:
node multiclaude/scripts/probe.mjs
# ...or from anywhere, against the installed plugin:
node ~/.claude/plugins/cache/multiclaude/multiclaude/2.6.0/scripts/probe.mjs
# → all six tiers resolve to bare IDsInside a Claude Code session the orchestrate skill runs the probe itself as
node "${CLAUDE_PLUGIN_ROOT}/scripts/probe.mjs" — the paths above are only for
checking it by hand from a shell.
Known gap
Nothing yet verifies that an AGY dispatch actually ran. This release removes the cause of the silent no-op, but agy exits 0 on both known failure modes, so the exit code remains useless as a success signal. agy --output-format json exposes status and usage.total_tokens — a deterministic check plus proof the work landed off-wallet. Tracked in docs/NEXT_STEPS.md.
Full changelog: v2.5.1...v2.6.0
multiclaude 2.5.0 — native dispatch agents + hybrid dispatch
The plugin now ships its own forwarder agents and chooses the dispatch path by situation.
Native dispatch agents (reverses the no-agents stance)
multiclaude:mc-codexandmulticlaude:mc-agy: strict Bash-only forwarders (haiku driver) — one foreground CLI call, raw stdout verbatim, exact errors on failure, never self-answer, never backgroundmc-agyaccepts--model "<resolved tier name>"and--edit, so tier-specific AGY work gets native agent cards too- External
codex:codex-rescue/agy:agy-rescueare banned (observed: backgrounding placeholders, self-answering drivers)
Hybrid dispatch
- Interactive default: mc-* agents (native agent card, inline result)
- Batches / long jobs: direct backgrounded CLI (zero driver cost)
- Big fan-outs: Workflow tool — only after the user opts in (new "Ask before you fan out" gate)
Always-visible executor indication (§9 grows a fourth surface)
- Every dispatch description starts with the executor tag (
Codex gpt-5.6-terra @ high: …); narration names the delegate at dispatch and result — delegated work never looks like Claude did it
multiclaude 2.4.0 — executor attribution
Every delegated task now surfaces its executor: provider + exact model (+ effort for Codex).
- Task subjects carry the executor (
[Codex · gpt-5.6-luna @ medium]), updated on escalation, with history inexecutorHistorymetadata - Synthesis reports list each subtask's executor with exact-model rules per provider (AGY tier names verbatim from the probe)
- Delegated-edit commits carry an
Implemented-by:trailer; workflow nodes encode the executor in theirlabel(codex:gpt-5.6-terra@high:<item>)
multiclaude 2.3.0 — GPT-5.6 tier routing + Workflow fan-out
Routes Codex work across OpenAI's new GPT-5.6 family by task band, and adds native Workflow-tool fan-out.
GPT-5.6 tier routing
- Three Codex bands: mechanical →
gpt-5.6-luna@ medium effort, standard →gpt-5.6-terra@ high, hard →gpt-5.6-sol@ xhigh - Explicit tier + effort on every dispatch (never the CLI config default); pick the lower band when unsure, escalate one band only after a gate failure
- Both dispatch paths carry the tier:
--model/--effortpass-through in rescue prompts,-m+-c model_reasoning_efforton Bash
Workflow fan-out
- Drive ≥3 independent offload nodes through the native Workflow tool with synchronous Bash-only CLI nodes
- Mix all three wallets (Codex, AGY, own Claude) concurrently: cross-provider judge panels, headroom-weighted partitioning
*-rescueagentTypes banned inside workflows (forwarder can background the CLI and return a placeholder)- Per-node temp file + stdin prompt form; no interpolation inside shell quotes
multiclaude 2.2.0
Cheaper dispatch, deterministic routing, closed failure paths.
- Rescue-agent dispatches now pin a haiku driver (
model: "haiku") so forwarding costs a fraction of an Opus driver - Deterministic session probe (
probe.mjs): opt-out, CLI availability, pattern-resolved AGY tiers - Documented and routed around the broken AGY MCP /
--backgroundpolling paths — the two inline CLI paths are the only supported AGY routes - Wallet-headroom hook biases routing before every Task/Workflow dispatch
v2.1.0
The usage readout is now /multiclaude:quota.
Changed
- Renamed the
usageskill toquotaso its slash command is
/multiclaude:quotainstead of/multiclaude:usage. The old name shadowed
Claude Code's built-in/usagecommand and was confusing to invoke. The
readout, output format, and underlying wallet sources are unchanged — only the
command name. References to Claude Code's first-party/usage(the source of
the CLAUDE utilization bars) are intentionally kept as-is. - Moved
skills/usage/usage.mjs→skills/quota/quota.mjs; updated the
setuphealth check, the orchestrate §0 fallback pointer, the README, and the
plugin/marketplace manifest descriptions to match.
Migration
/multiclaude:usageno longer exists — use/multiclaude:quota. Restart
Claude Code after updating so the renamed skill is picked up.
v2.0.2
The CLAUDE wallet now shows the real quota %, not a time proxy.
Fixed
- CLAUDE bar was elapsed-time, not usage. It tracked how far through the
5-hour block you were (e.g. 86% at ~4h17m), which read like quota used but
wasn't — a 69%-used account could show 86%. It now shows the official
utilization % from the same first-party endpoint Claude Code's/usageuses
(GET https://api.anthropic.com/api/oauth/usage), via the OAuth token at
~/.claude/.credentials.json(token only ever goes toapi.anthropic.com).
Added
claudeLimits()inscripts/lib/wallets.mjs— returns 5-hour + 7-day (and
per-model 7-day opus/sonnet) used % with reset times, plan, and extra-usage
credits. Degrades cleanly when offline, token-expired, or (macOS) creds live in
the Keychain rather than the file.- Full report (
/multiclaude:usage) renders two official bars —5h limit
andweekly— with opus/sonnet weekly + plan + extra credits as a sub-line;
ccusagecost/tokens/burn/projection stays as detail. - Compact hook line now leads with
CLAUDE 5h NN% / wk NN%(the headroom signal
that matters for routing) before the ccusage cost/burn detail.
Fallback
- If the limits endpoint is unreachable, the report falls back to a clearly
labelled elapsed-time bar ("elapsed time, not quota") so it can never again be
mistaken for the real %.
v2.0.1
Documents the AGY-quota investigation and keeps the usage readout honest. AGY's
Gemini + Claude pools stay reactive-only — there is no usable proactive quota
number, and the real model lineup is still sourced from agy models.
Why no proactive AGY %
Both backend RPCs were tried and rejected:
…/v1internal:retrieveUserQuotaanswers200with a consumer token but reports
the legacy Gemini Code Assist buckets (gemini-2.5-flash/-flash-lite/
-pro/gemini-3.1-flash-lite), all pinned atremainingFraction: 1. AGY's
real pooled quota never draws from them, so it would always read "100%"
regardless of true depletion — actively misleading (the "models are wrong" bug).…/v1internal:retrieveUserQuotaSummaryreturns AGY's real pool grouping but
403 PERMISSION_DENIEDfor a direct token. It only answers over the Antigravity
Language Server (Connect RPC on a random localhost port; CSRF token in
/proc/<pid>/environ) — live-session-only and Linux-only, so unusable from a
background, cross-platform usage hook.
Changed (docs + clarity; no behavior change)
scripts/lib/wallets.mjs,skills/usage/usage.mjs,
scripts/usage-snapshot.mjsnow document the reactive-only rationale inline so
the dead-end endpoint is never re-added; minor cosmetic refactor of the AGY
pool rendering. The displayed output is unchanged from 2.0.0.skills/usage/SKILL.mdgains a "Why no proactive %" subsection and corrected
dependencies (only the Claude section needs the network).
v2.0.0
Full port of every script and hook from bash + python3 to pure Node.js, so
the plugin runs identically on Linux, macOS, and Windows. No /bin/sh, no
bash, no python3, no GNU find — only node (already required by Claude
Code) plus bunx/npx for the one ccusage network call.
Changed (breaking — implementation only; commands & output are unchanged)
- All four scripts are now
.mjs.scripts/probe.sh→probe.mjs,
scripts/usage-snapshot.sh→usage-snapshot.mjs,scripts/setup.sh→
setup.mjs,skills/usage/usage.sh→usage.mjs. The old.shfiles are
removed. Shared cross-platform helpers live inscripts/lib/mc.mjs(a
PATHEXT-awarewhich, shell-freerun, recursivenewestFile, duration/bar
formatting) and the wallet readers inscripts/lib/wallets.mjs(one source of
truth for Codex / Claude / AGY data, used by both the full readout and the
hook snapshot). - Hooks switched to exec form.
hooks/hooks.jsonnow uses
"command": "node"+"args": [...](spawned directly, no shell) instead of
"shell": "bash"with a$(find …)fallback — the documented cross-platform
pattern.${CLAUDE_PLUGIN_ROOT}is still substituted by Claude Code. /multiclaude:setupgained an idempotentapplymode.check(default)
verifies and changes nothing;applydeep-merges the desired-state template
into~/.claude/settings.json(backing up to.bak, never clobbering keys it
doesn't manage), with--full,--set dotted.key=value,--ttl,--model,
and--dry-run. The JSON merge is native JS — the python3 heredoc is gone.
Removed
python3, GNUfind, andbashas dependencies. The usage readout's
Codex and AGY sections read local files directly and now work fully offline;
only the Claude block still needs the network (ccusageviabunx/npx).
v1.9.0
Completes the orchestrate → multiclaude rename and makes the setup step real.
Added
/multiclaude:setupcommand. Newskills/setupskill wrapping
scripts/setup.sh— the deploy docs and theusageskill already referenced
/multiclaude:setup, but no such command existed. Verifies codex/agy
(installed + authenticated), python3/find/node, companion plugins, the
wallet-headroom hook, and ccusage; prints an exactfix:for anything missing.
Changed
- Ship the bootstrap settings inside the plugin. Moved
setup/settings.json(repo root, not distributed) →
multiclaude/setup/settings.json, so a plugin-only install can find the
canonical~/.claude/settings.jsonat${CLAUDE_PLUGIN_ROOT}/setup/.
scripts/setup.shnow points its fix messages at that shipped path. - Finished the rename drift.
setup/settings.jsonenabledPlugins, the
README (orchestrate/dir,/orchestratecommand,orchestrate@multiclaude
enable key, install name), and the manifest descriptions now all say
multiclaude/multiclaude@multiclaudeinstead of the deadorchestrate
name.