Repository navigation
v2.22.0
[2.22.0] — 2026-09-30
Fixed
-
Codex and antigravity roles no longer spend many times their
budget_tokensin one turn (#550). Both CLIs report the whole prompt as input, cached part included, and it was charged againstbudget_tokensas uncached input, so one turn could spend 7-35 times a role's budget and close every other role at the org-wide ceiling. The runners now move the cached part intocache_read/cache_creation(thetokenstotal is unchanged), so these roles are charged on the same basis as Claude roles. They also meter each agy step and each codex exec as it completes instead of once per message: an agy exec is killed at the step that exhausts the budget, a codex role starts no further tool round once it is spent, and neither starts an exec with less than 5% of the role's token cap left or after its session was closed for budget. The role is then closed for budget rather than counted as a failed turn. A codex exec that has started still runs to its end, since codex reports usage only then. See Token budgets on codex and antigravity roles. A role closed because it is under that floor counts as out of budget: the coordinator's notice gives its numbers, andorg reloadreopens it only once its budget is raised above the floor.agent execandagent testreport the same split: theinput_tokensof a codex or antigravity run'susageevent now excludes cached input, as it already did for Claude.
-
The org-wide token budget stops deferred lazy spawns (#552). When
run_config.budget_tokensran out, the org closed every open mailbox and stopped pending spawns, but a role already waiting for amax_concurrent_agentsslot kept its retry loop. The closure freed slots, so the role spawned with an open mailbox after "closing all roles" and ran until idle-stop. The closure now cancels those deferrals (adeferred-spawn-cancelledaudit per role) and holds their tasks with the budget reason. A deferred spawn, including one waiting on host resources, checks the org-wide ceiling and the role's own budget closure (its own caps or the #550 turn floor) right before it starts.spawnRolerefuses while the ceiling is spent and logs aspawn-refusedaudit. A reload that raises the ceiling puts the roles back to pending, dispatches their tasks and delivers the messages queued for them. A role a reload adds while the ceiling is spent is set aside the same way, and its tasks are held instead of reported as unresolved.- A role replacement (
org_respawn_role) no longer runs past the ceiling. If the ceiling closes while the replacement starts, the replacement is stopped instead of published, the old incarnation stays closed like the other roles, and its tasks are held. The org's spend stays exact: the old incarnation is counted once, and what the stopped replacement spent while starting is counted too. The cancelled replacement doesn't use up amax_role_respawnsattempt. A reload that raises the ceiling reopens it with the mail it had swept up.
- A role replacement (
-
A role deferred by
max_concurrent_agentsstays a known assignee (#551). The deferral took the role out of the pending roles, so every later dispatch pass reporteddispatch-assignee-unresolved: assignee "X" does not resolvefor a role the org defines, and messages to it failed with "unknown recipient". Its tasks now waitreadywith oneconcurrency-limitaudit each ("deferred by max_concurrent_agents") and go out when the role spawns, whichever path deferred it. A second deferral of the same role joins the first retry loop instead of starting another. If no slot frees in time, the tasks waiting on the role are failed with the reason and the coordinator is told, instead of sittingreadywith no owner. The role goes back to pending, so later work for it defers again. The give-up is written to the org state (abandonedRoles), and the coordinator is also told when only queued messages were waiting.-
A role deferred under host resource pressure gets the same treatment: its tasks wait with one
resource-pressureaudit each and go out when it spawns. -
A deferred role that spawns now delivers only its own queued messages. It drained the whole org inbox, so messages queued for other roles that weren't running yet were lost.
-
deliver()says "waiting for a concurrency slot" or "waiting for resources" to match the deferral.
-
-
A freed
max_concurrent_agentsslot goes to the role that was deferred first (#589). Each deferred role polled for a slot on its own timer, so the first timer to fire after a slot freed took it. A role deferred later could start ahead of one deferred earlier, and could keep doing so each time a slot freed. A role now takes a free slot only when no role deferred before it is still waiting for one; itsconcurrency-limitaudit then says which roles it is waiting behind. A role that was not deferred, started directly by a message or task, can still take a freed slot before the next deferred role polls. -
An approval a decider owns now holds the tool call until the decider rules, instead of denying it as "pending human approval" (#553). monomind now routes a request the way mono-agent does, using a port of its decision class, tier and level × tier routing. With
midorfullautonomy and a model, boss, parent or jev decider, a call that mono-agent sends to a rule or a decider waits for the verdict. For example,tool:Bashis routine unless atool:Bashortool:*tier says otherwise. The wait lasts up todecider.timeout_seconds+ 25s: the timeout defaults to 120s, and the total wait is capped at 300s, below the 600s PreToolUse hook timeout. The call does not wait when mono-agent sends the request to a person: atmid, that covers irreversible tiers and grants with no known tier. It also does not wait atmanual, during an activepaused_until, or when the autonomy block is missing or not understood. The autonomy block is read fresh from the org file on each check. When the verdict is approve, the call runs. A denial names who decided. If no decision comes in time, the message says a decider or a human will resolve it and an[approval]message follows. A call that got its verdict while waiting never gets an[approval]message telling it to repeat, so it never runs twice. That holds even when a human resolves it together with other entries. Mailbox messages name the resolver: a rule, the decider, or a human (--byname). Waits end when the org stops or the role closes. Known gap:monoagentcli org autonomy pausewrites only mono-agent's database, so monomind does not see the pause until mono-agent addspaused_untilto the org file. Known limit: a grant's own tier lives only in mono-agent's database. Atmid, a grant that mono-agent ratesconsequentialgoes to its decider, for example one with no outbound workflow nodes. monomind can't see that tier, so the call does not wait; it is denied as pending at once, as before. Agrant:<alias>orgrant:*tier in the org file avoids this. Every runtime goes through the same in-process gate: claude'scanUseTooland PreToolUse hook, and the in-process org-tool calls of codex, grok, hermes, antigravity and vercel, all wait inline. Approvals owned by a human are unchanged. -
Vercel and openrouter roles post one
chatevent per assistant message (#563). The vercel runner yielded every streamed text delta as its own message, so the org bus carried achatevent per chunk ("I", "'ve asked the question", ...), which filled history and event limits. It now joins the deltas and yields one message when the model step ends, like the claude, codex and aider runners. A turn that is aborted or fails midway still reports its text once.agent execstill streams the deltas, since it asks for partial messages.- A vercel turn whose stream carries an
errororabortevent is now reported as failed (error_during_execution,is_error) with the error message, like a failed claude turn. It was reported assuccess, so the circuit breaker never counted it andagent execexited 0 instead of reporting arate-limited,auth,quotaorrunner-errorcode.
- A vercel turn whose stream carries an
-
agent test pi-rpcno longer fails withturn failed (error_max_turns)when the model runs one of pi's own tools before it answers (#564). pi counts one turn per model call, so a model that lists or reads the temporary directory before replyingokneeds a second turn, andagent testcapped the turn at one: the runner aborted the answer.agent testnow allows 3 turns for every runtime. Plain replies were never affected; checked against pi 0.87.1, which starts exactly one turn for them, retries included. -
A blocking
ask_humanquestion now stopsorg_completeuntil it is answered (#564). A boss could ask a blocking question and end the run in the same turn with an answer it made up. While any blocking question in the org is unanswered,org_completeis refused with a tool error naming the question ids; it works again once the answer arrives. The one outcome still allowed ispartialwith blockerhuman, also underrun_config.completion: 'dag'while runnable work remains, so a run whose human never answers can still be ended honestly. Non-blocking questions don't hold it. The blocking receipt now tells the role to end its turn and not callorg_complete. A blocking question still does not hold the role's turn open: as documented, the answer arrives as a new message. -
The session ledger and its
session-runaudit name the runtime a role actually runs on (#562). They usedrole.runtime ?? def.runtime ?? 'claude', so a role whose runtime comes fromprovider.kind(vercel-api-keyruns onvercel,codexoncodex,antigravityonantigravity) was audited asclaudeand had its task sessions filed underclaude. Both now use the runtime that runner selection resolves. A task session an older build filed underclaudefor such a role is still resumed onorg run --resumeand moves to the new key when it is. Only a role with noruntimeof its own or of the org's reads that old key, because only its entries there came from its own runner.- The full-access check and its audit, the sandbox and authority-mask choice,
org validate's sandbox findings andorg sign's review use that runtime too (#567). Aprovider.kindrole was checked as Claude, so a vercel role declaringpolicy.access: fullpassed the runner check it fails, so a signed grant made itfullon a runner without full access; a vercel role was given an authority mask its in-process runner never applies; andorg signcounted a codex role as covered by Claude's sandbox. A role that setsruntimeitself is checked as before. AMONOMIND_RUNTIMEvalue no runner answers to is checked asclaude, the runner that then runs.
- The full-access check and its audit, the sandbox and authority-mask choice,
-
An open
ask_humanquestion can be dismissed, and a removed role's question can be closed (#572). An open blocking question holdsorg_complete(#564), and until now the only way to close one was to answer it.monomind org questions dismiss <org> <id> [--reason <text>]closes it without an answer:questions.jsonrecordsstate: "dismissed",dismissedAtand the reason, theorg_completegate and the idle-watchdog hold are released, and the asking role is told that no answer is coming (live, or queued while the org is stopped, without waking it). A running org logs adecision-resolvedaudit event withverdict: "dismissed". The dashboard's Human Input view has a Dismiss button (POST /api/questions/dismiss, the same human-session auth as answering), and the daemon route is/api/dismiss-question(operator credential only). Answering a question whose role is no longer in the org definition failed with "role not found", so it could never be closed. The answer or dismissal is now recorded and delivery is skipped, with adelivery: "skipped"note in the audit event. -
org approve,org deny,org answerandorg gate-approve/gate-rejectno longer resolve a decision behind a refusing daemon (#572). Security: when the daemon running the org refused the call, for example with a 403 because the operator credential was missing, the command fell back to writingapprovals.json,gates.jsonorquestions.json(plus the inbox) directly. That approved a tool call or gate, or answered a question, without the operator check, the audit event or delivery to the waiting role. A refusal now fails with "nothing recorded" and exit code 1. The offline write happens only when the daemon can't be reached. The commands also ask only a daemon that hosts this project's org, the same lookup the dashboard uses, so a same-named org run from another project no longer receives the decision. -
A role's blueprint is now covered by the org signature (#571). A role with a
blueprintand noskillsgets itsskillsandskill_poolfrom the catalog'sblueprint.jsonwhen the org starts. That file lives in the project's.monomind/catalog/, which the #502 signature did not cover and which a role may be able to write, so the skills (and the MCP tools they grant) a role got could change without the org being re-signed. The signed hash now records asha256:digest of each named blueprint'sblueprint.jsonunder a newblueprintskey, next to theinstructions_filedigests; the same single read feeds the review,--check,--expect-hashand the start-time check.org runandorg reloaduse a blueprint only while its bytes still have the digest the signature was checked with. An org that uses a blueprint verifies aschangedafter the upgrade and needsmonomind org signonce; an org without blueprints hashes exactly as before.org sign's review lists each role'sblueprint. The hash is documented inorg signwith a pinned example. -
Org roles can no longer change the skill catalog (#576). The content of a role's catalog skills and their
grantedTools(which decide the MCP tools the daemon grants) are read at org start from the project's.monomind/catalog/, which the org signature does not cover beyond skill names. That directory was writable to roles, andmonomind catalogran inside them, so a role could re-stage or re-activate a catalog skill and change what another role got on its next start without the org being re-signed..monomind/catalog/is now an operator-protected path, like.monomind/org-skills/: denied to the file tools, in the SDK sandbox'sdenyWriteand read-only under the bubblewrap mask, for the org root and a role's cwd, and created empty before a role starts so it can't be planted (an empty directory still means the catalog is not configured; a refusedcatalog stageno longer removes it again while roles run).monomind catalog stage,approve,activate,disable,quarantine,release,revoke, andproject/unproject --apply, refuse inside an org role oragent execprocess tree, asorg signdoes. Roles can still read the catalog and run the read-only verbs and projection dry runs; a signedpolicy.sandbox.allowWriteentry naming.monomind/catalogis the opt-in. See Skill Catalog. -
agent exec --runtime claudeworks inside an org role again (#559).~/.monomind/depsis read-only to roles (#527), so a role could never do the first-use install of the Claude Agent SDK and failed with EROFS. The deps directory stays read-only: it holds code the unsandboxed daemons load. Instead, the org runtime installs the pinned SDK on the host, through the same hash-pinned installer, before it starts a role session whose effective runtime is claude (the runtime runner selection resolves: role, org, provider kind, thenMONOMIND_RUNTIME). Roles on other runtimes get no download, so a codex-only org never fetches the 300 MB SDK. An SDK installed without its bundled binary (#522) counts as installed. The install is logged as arole-deps-installedaudit. A failed install is logged as arole-deps-missingaudit, does not stop the role, and is not retried for 10 minutes; a session start waits for it at most 5 minutes or until the org stops.MONOMIND_NO_AUTO_INSTALL=1turns the host install off, for offline or no-network hosts. Inside a role, a missing SDK now fails at once, before any install attempt, and names the operator command. The newmonomind deps installcommand installs the SDK even withMONOMIND_NO_AUTO_INSTALLset, since it is an explicit request, and refuses to run inside an org role. -
The test suites no longer inherit an org role's environment (#560). A suite run from inside an org role picked up
MONOMIND_ORG_ROLE, which moves cline's scoped dir under the role's TMPDIR, socline-runner.test.tsandcline-runner-scoped.test.tsfailed. The shared test setup (tests/setup/isolated-home.global.ts) now unsets the markers a role session and its runners set:MONOMIND_ORG_ROLE,MONOMIND_ROLE_ID,MONOMIND_ORG_NAME,MONOMIND_ORG_DIR,MONOMIND_ORG_RUN,MONOMIND_ORG_ROOT,MONOMIND_AGENT_EXEC,MONOMIND_SDK_AGENT,MONOMIND_CLINE_TURN,MONOMIND_AIDER,MONOMIND_HOOK_QUIET,MONOMIND_GRAPH_GATE,MONOMIND_GIT_LEVELandMONOMIND_EXEC_TREE. -
Other runtimes' project config is now operator-protected from org roles,
.agents/skillsincluded (#580).monomind catalog project --surface platform:agentswrites skills to.agents/skills, and the operator's Codex, Gemini, Kimi, OpenCode and other sessions load them, but unlike.claude/a role could write it, so it could plant or change a skill a later operator session loaded. The same held for the rest of what those sessions load and act on from the project:.gemini/(settings.jsonMCP servers and hooks, the status-line helpers),.codex/(config.tomlMCP servers and hooks, the hook scripts),.kimi-code/(MCP servers, plugin hooks),.opencode/andopencode.json/opencode.jsonc(plugins, and thenode_modulesOpenCode installs for them),.agents/monomind/(the hook bridge rendered hooks run), agy's.agents/hooks.json,.agents/plugins/and.agents/skills.json,.qwen/(settings,.env, commands, agents, skills, extensions),crush.json/.crush.json,crushrc/.crushrcand.crush/skills,.pi/(settings, extensions, skills, prompts, themes, system prompt, installed packages), Cline's.clinerules/hooksandworkflows,.aider.conf.yml,.cursor/,.vscode/mcp.json,.kiro/and.factory/: a role that wrote one got code run in the operator's next session there. Where a runtime writes into its own project dir while it runs as a role, only the parts it loads are protected, so it keeps working: OpenCode writes.opencode/.gitignoreat every start and exits when it can't, pi creates.pi/settings.json.lockto read its settings, Qwen Code writes.qwen/worktrees/andbatch/, and agy writes.agents/teamwork/. With the org root or a role cwd at$HOME, the runtimes' own home state dirs (.codex,.gemini,.kimi-code,.qwen,.pi,.opencode,.cursor,.factory,.kiro) are left alone, since those runtimes write their sessions there. Each (at the org root and a role's cwd) is now denied to the file tools, in the SDK sandbox'sdenyWriteand read-only under the bubblewrap mask once it exists. Like.claude/none is created at org start, so repos get no stray directories; while one is missing it is on the planted-path watch, so one a role creates is quarantined (one the operator creates while an org runs, for example withmonomind initorcatalog project --apply, is quarantined too and restored with themv … && monomind org approve-paths …the notice gives). Instruction files (AGENTS.md,GEMINI.md,QWEN.md, rules) stay writable, asCLAUDE.mddoes, and so does runtime state such as Crush's.crush/data dir. A full-access pi role in coder mode whose trusted project settings declare packages needs a signedallowWritefor.pi/npm/.pi/gitto install them. A signedpolicy.sandbox.allowWriteentry naming the path is the opt-in..claude/skillsand.agents/skillsare the catalog's only projection targets. -
A role can no longer block the operator's catalog changes with a lock file (#581). The catalog lock was
.monomind/locks/catalog.lock, which roles can write, so a role could create it and make everymonomind catalogmutation fail with "catalog is locked". The lock is now.monomind/catalog/.lock, inside the operator-protected catalog directory. A leftover lock at the old path from an older version is ignored and left where it is. A refused mutation in a project with no catalog no longer leaves an empty directory behind. -
monomind cleanup --forcekeeps the skill catalog unless--purge-datais given (#579)..monomind/catalog/(staged packages, approvals and tool grants) was not among cleanup's data paths, so--forcealone deleted it. It is now data, like.monomind/org-skills/. -
org statusno longer reports a killed standalone run as running (#573). Anorg runkilled from outside (SIGKILL, or together with the app that started it) never reaches its stop or crash handlers, soruntime.jsonkept sayingrunningwith its pid, and akill -0probe kept passing once that pid was reused by another process.runtime.jsonnow records the process's start identity (pidStart: its kernel start time and boot id on Linux,ps -o lstartelsewhere), and every reader checks that the recorded pid is still that process:org status(text and--format json),org list,org stop,org delete,org migrate,org mark-complete,org logs --follow, the dashboard's runtime view and startup gap-fill, and the statusline. A record written before this change has no start identity and is judged by its pid alone, as before.-
On the next
org status,org runororg servestart, arunningrecord whose run is dead is rewritten ascrashedwithclosedBy: "liveness-check"and the reason (pid N gone, orpid N now belongs to another process), and a line is appended to the org'sliveness.jsonl.org statusshows it ascrashed (pid N gone). The #274 cross-checks still apply first, so a run whose pid is stale but whose serve heartbeat or event log shows it alive is left alone. The run's checkpoint is kept, soorg run --resumestill works. -
org runnow refuses to start an org whose recorded run is still alive in another process ("already running (pid N)"), instead of starting a second process on the sameruntime.json.
-
-
monodesign URL detection retries a Chrome launch that times out waiting for its CDP port (#583). On a cold Windows CI runner, Chrome's first launch could take longer than the 30s launch timeout to write
DevToolsActivePort, so the first browser test failed while every later launch in the same job passed. The monobrowse detection driver now retries a CDP-port timeout once. The timed-out Chrome has already been killed by monobrowse, its profile dir is deleted, and the retry uses a new one, since a leftover Chrome process could still hold the old dir's lock. Other launch failures (no Chrome, Chrome exiting at startup, a port held by another process) are not retried. A failed launch no longer leaves itsmonodesign-cdp-*profile dir behind. -
Marking a dead run crashed can no longer overwrite a run that just started (#586). The #573 check re-read
runtime.jsonand then renamed acrashedrecord over it, so a new run that wrote its record in between lost it until its next state write. The check now moves the record aside, writescrashedonly if it is still the dead run's record, and puts it back with an exclusive link, so a record a new run writes at any point in that sequence is kept. The running process's own writes are never blocked or delayed.
Added
-
monomind org sign --checkand--project <dir>(#558). Tools that rewrite org files themselves, such as mono-agent, re-sign only their own writes: they verify the org before writing and sign with--yesonly if it verified. They had to scrape the review text for that.org sign <org> --check(or--check --all) only reports each org's state and never prompts, signs or writes anything (it skips the startup update check and subsystem init too, and does not record the plant watch's first look). It prints one line per org (release: signed), or with--format json{"orgs":[{"org","state","signedAt","message"}]}, wherestateissigned,changed,unsigned,invalid-signature,forbidden-key,not-foundorinvalid. It exits 0 when every org checked is signed and unchanged, 1 otherwise, and 2 for an org that is not there,--allwith no orgs, or a usage error. Being read-only, it also runs inside a role.--project <dir>(with or without--check) uses that directory's real path as the project root instead of the current directory; it must hold.monomind/orgs. Signing through--projectbinds the same path as signing from inside the directory, and the refusal inside a role oragent execprocess tree still applies. -
monomind org sign --expect-hash <hex>, and ahashinorg sign --check --format json(#558). A tool that checks an org, writes it and then runsorg sign <org> --yesleft a window: a role could edit the org JSON or aninstructions_filein between, and the edit was signed. With--expect-hash, monomind reads the org file and each instructions file once, computes the hash it is about to sign from those bytes, and signs them only if it equals the one given. Otherwise it exits 1, names the expected and actual hashes, and writes nothing to the operator directory. It works with--yesand--project. With--all, pass--expect-hash <org>=<hex>once for every org (a missing, repeated or unknown org is a usage error, exit 2), and if one org does not match, none is signed.--check --format jsonnow reports each signable org's currenthash, computed from the same read as its state. The hash (the signed projection, its canonical JSON, the instructions digests and SHA-256) is documented inorg signso a tool in another language can compute it from the bytes it wrote, and a fixed-fixture test pins it.-
org sign <org> --format jsonwithout--yesprints the review as JSON ({"org","state","hash","review","reviewText"}).hashis the hash of exactly the content reviewed, from the same single read that--expect-hashuses.reviewholds the structured fields: authority lines, unconfined roles, non-bundled skills, approval candidates, first-look configs and the diff since the last signature.reviewTextis the text review. It never prompts or signs and exits 0. Signing afterwards with--yes --expect-hash <hash>refuses if a role changed the files after the review, so a signature is always of what the user saw. -
The documented key order of the canonical JSON now matches what monomind has always produced. Array-index keys (canonical integers from 0 to 4294967294, with no leading zero or sign) come first in numeric order, and the other keys follow in UTF-16 order. The doc gives a Go recipe, and test vectors pin it, including the non-index keys
01and4294967295. Existing signatures are unchanged. -
org run's one-time sign prompt now signs the instructions files it read for the review, instead of reading them again when it signs.
-
-
org signdeclares its features in the--version --jsonhandshake, and rejects options it does not know. An older monomind silently ignored--expect-hashand signed with exit 0, so a caller could not tell its guard had not run.monomind --version --jsonnow listsorg-sign-check(--checkand--project, #561),org-sign-expect-hashandorg-sign-review-jsonincapabilities(Agent Exec Protocol rev 29); a caller checks for the one it needs before relying on it.org signnow fails closed: any option it does not recognise (for example a misspelled--expect-hsh) printsorg sign: unknown option --expect-hsh — nothing signed.and exits 2 without signing or writing anything. Other commands keep their current flag handling.
Removed
-
BREAKING CHANGE:
monoswarmandautopilotare removed (#418). They were deprecated in 2.21.0. Neither started an agent: both recorded state files. Instead, spawn subagents with Claude Code's Task tool, all in one message, or run an agent org withmonomind org run <org>.-
CLI: the
monoswarmcommand (init,start,status,stop,scale) and theautopilotcommand (status,enable,disable,config,reset,log,predict,check) are gone. Running either one prints what to use instead, not a typo suggestion. -
MCP tools, for MCP clients: the 13
monoswarm_*tools (monoswarm_init,monoswarm_status,monoswarm_scale,monoswarm_health,monoswarm_shutdown,monoswarm_agent_add,monoswarm_join,monoswarm_leave,monoswarm_vote,monoswarm_notice,monoswarm_memory,monoswarm_audit_list,monoswarm_audit_verify) and the 8autopilot_*tools (autopilot_status,autopilot_enable,autopilot_disable,autopilot_config,autopilot_reset,autopilot_log,autopilot_progress,autopilot_predict) no longer exist. A client that calls one gets "tool not found". ThemonoswarmandautopilotMCP tool categories are gone, so the full registry now has 198 tools. -
monomind startandstart stopno longer record or terminate a monoswarm state file, and call no MCP tool.startchecks the project is initialized and prints the topology and max-agents settings from.monomind/config.yaml; its--topology/-tflag, which only set the recorded state, is gone: passing it prints a one-line warning and is otherwise ignored.start stopstill stops a running daemon. -
monomind statusreads the agent count from the agent store (agent_list) instead ofmonoswarm_status. Its JSON output hasagents: { total }in place of theswarmobject, the Swarm panel is gone, and--health-checkno longer has a "Swarm Status" check. -
Generated files: the full, security and performance CLAUDE.md templates drop
## Monoswarm Orchestrationand## Monoswarm Configuration & Anti-Drift.## Monoswarm Protocols & Routingbecomes## Agent Spawning & Routingand## Monoswarm Execution Rulesbecomes## Agent Execution Rules, without the monoswarm lines. All four old headings are recognised on upgrade, so an old CLAUDE.md written before the managed block sheds them cleanly..monomind/CAPABILITIES.mddrops "Monoswarm Orchestration" and "Monoswarm Vote Strategies" and themonoswarmcommand row. Themonoswarmarea is gone fromguidance_capabilities/guidance_recommend,guidance_quickref'sswarm-opsdomain lists the Task tool andorg run, andguidance_workflowno longer returns aswarmConfigortopology. -
Shipped assets: the
monoswarmskill, the/monoswarm:*commands,/coordination:monoswarm-init,/coordination:task-orchestrate,/mastermind:monoswarm,/mastermind:topology,/optimization:auto-topologyand thecoordinator-monoswarm-initagent are removed from every asset tree (.claude, the npm package,.agents,.gemini,.kimi-code). Theswarmpack no longer carries them. Agents and commands that told models to callmonoswarm_*tools now spawn with the Task tool. -
Upgrading a project:
init --forceandinit upgraderetire every file an older release installed for these: the.claudeskill, commands and agent above, their.agents/skillsand.gemini/skillsmirrors, their.kimi-code/{agents,skills,plugin/commands}copies and their.opencode/{agent,command,skills}copies (.opencode/command/monoswarm-*.md,coordination-monoswarm-init.md, …), including projects set up before the init manifest existed. A file is retired only when its content matches a version some release shipped; it is moved to.monomind/backups/<run>/retired/files/<path>, and a directory left empty is removed. A file you edited is kept, and init prints a warning naming it. The READMEsinitno longer rewrites (.claude/commands/{coordination,monitoring,workflows}/README.md), whose old versions namedmonomind monoswarm/monoswarm_init, are refreshed to the current copy when unmodified. -
Manual steps after upgrading, only where init warned or you customised things:
- Delete or rewrite each file init reported as kept ("… was removed in 2.22.0 … but you edited it"), and any command, skill, agent, hook or script of your own that calls
monomind monoswarm,monomind autopilot, or amonoswarm_*/autopilot_*MCP tool. Use Claude Code's Task tool ormonomind org run <org>instead. - Remove the old state if you have it: the
monoswarm/directory in the monomind data root (.monomind/monoswarm/, ormonomind/monoswarm/inside the repository's git directory) and.monomind/data/autopilot-state.json/autopilot-log.json. Nothing reads them now. - An MCP client that pinned tool names (an allow-list, a saved prompt) should drop the 21 removed names.
- Scripts that parse
monomind status --format jsonshould readagents.totalin place ofswarm.*.
- Delete or rewrite each file init reported as kept ("… was removed in 2.22.0 … but you edited it"), and any command, skill, agent, hook or script of your own that calls
-
Also removed: the dashboard's Swarm Status panel and its
monoswarm_status/swarmStatefields, the statusline's and the UI's reads of.monomind/monoswarm/state.json(nothing writes it any more), the.monomind/monoswarm/gitignore check indoctor, themonoswarmentry in thesystem_healthchecks, the unusedMonoswarmCheckpointerset-up at CLI start, and the vote-tally and HMAC audit-log code only monoswarm used.doc/concepts/monoswarm.mdis now a short removal note. -
MONOMIND_LOG_LEVELis no longer listed in the full CLAUDE.md template's Environment Variables. Its only reader in the CLI source was the monoswarm tools;bin/cli.jsstill honoursMONOMIND_LOG_LEVEL=debug.
-
npm: @monoes/monodesign@1.2.25, @monoes/monomindcli@2.22.0, monomind@2.22.0