v2.11.3
[2.11.3] — 2026-09-18
Fixed
hooks post-task --success true|falserecorded the wrong thing entirely: the argument parser set a declared boolean flag totrueand left the literaltrue/falsein the positionals, wherectx.args[0] || ctx.flags['task-id']picked it up as the task ID. On the invocation CLAUDE.md documents,--task-id abc --success falseprintedTask false recorded as successful— the real ID discarded and a failed task recorded as a success. A declared boolean flag now consumes an immediately followingtrue/false; bare--flag,--no-flagand combined short flags are unchanged. This affected every boolean flag in the CLI (#269: 7c573b6).mcp start --daemonwas a no-op — the flag was read, passed to the server options, and never consulted — so-dblocked the terminal; and an unref'd 5s force-exit watchdog inbin/cli.jskilled everymcp start, foreground included, about 6s after startup (measured).-dnow re-execs detached with output to~/.monomind/mcp.logand reports the child's own PID, and the watchdog exempts a foreground server.mcp stopalso only deleted the PID file for a daemon, leaving it running and unreachable; it now signals the recorded PID (#267: d4354f8).mcp statusalways reportedstdio,localhostand port 3000 because nothing about the running server was recorded — a separate status process only had its own defaults, which also aimed the health probe at the wrong port. The server now writes its transport/host/port beside the PID file (#268: 73c16d9).hooks listshowed every hook as "Enabled: No": the table rendered anenabledcolumn the static registry never populated. Hooks now report their real state, and the separate Claude Code event wiring in.claude/settings.jsonis reported as its own labelled section (#270: ca54133).CopilotAgentRunneralways reported 0 tokens, so a copilot role looked free and its budget cap could never engage. Usage is now read from the CLI's--usage-output-fileJSON and summed across tool-fence rounds;cost_usdis deliberately left unset because copilot meters in AI credits and premium requests, never USD. The same work uncovered that the runner extracted no assistant text at all — the real NDJSON nests payloads underdata, which none of the four checked shapes matched (#181: ef60e0b).monomind org statuscalled a live run "crashed" whenever its recorded pid was stale (the pid is persisted only at start and stop, so re-attaching leaves one that answers to nothing). Liveness now falls back to the daemon heartbeat and then to recent bus activity, and says which evidence proved it live; JSON consumers still see onlyrunning/crashed(#274: 1bb4a0a).org_taskauto-dispatch delivered only the task title when anorg_sendbriefing was issued in the same turn: they were two mailbox pushes and a role consumes one per turn, so the briefing always arrived a turn late. Both now arrive as one message (500ms coalescing window,DISPATCH_COALESCE_MS) (#275: 0207cad).- The release-gate org's hygiene step ("empty TMPDIR") could delete the scratch of the session running it — the shared temp dir also holds the agent harness's own per-session state, and wiping it broke a coordinator's shell mid-run. Hygiene is now narrow and run-scoped, with a test that fails if a wholesale-delete instruction is reintroduced into the shipped config (#273: 5b0c293).
monograph buildfailing on a better-sqlite3 ABI mismatch gave advice that could not work: under a global install the loaded binary sits in the install tree, sonpm rebuildfrom the project rebuilds a different copy — which is why repeated rebuilds left the file byte-identical. monomind now names the exact binary, the Node ABI it disagrees with, and the one command in the one directory that fixes it; it rebuilds automatically when the tree is writable (MONOMIND_NO_NATIVE_REBUILD=1opts out) and pins PATH to the running Node so the rebuild targets the right ABI;doctorgained a Native modules check that detects it without needing a crashed build's log (#231: e736fa6).- The monobrowse
close-browsertest could hang until its 60s timeout and fail an unrelated CI job: it drove a real filesystem read with fake timers, so all 60 advances burned 120,000 fake ms in ~50ms of real time and the process-exit poll never started, leaving an unsettled promise nothing could drive. The wait is now event-driven, and a timed-out run can no longer leak a realSIGKILLpastrestoreAllMocks(#283: fcf1f8c). doc/commands/security.mdand thesecuritycommand's own subcommand list advertised acontainerscan type that hard-errors "not implemented"; removed from both (#271: feee3ce).doc/concepts/org-runtime.mdlisted 6 of the 14 acceptedruntimevalues (grokandhermeswere the reported gap; 8 were missing) and documentedmax_turns_per_messageas defaulting to 30 when the real default is 100,000 — the knob people reach for when a role is cut off. Also correctedidle_minutes' effective default, the roleidconstraint (that regex governs org names, not role ids), the deprecatedgemini/openaiprovider kinds, and stale line references (#272: b5aa32c).
Note for upgraders
2.11.2's init --force fix migrates in place: a project initialised by an older monomind has an unmarked generated body in its CLAUDE.md (and .agents/shared_instructions.md), and the first init --force on 2.11.2+ replaces that body and wraps it in the current <!-- monomind-block:… --> delimiters instead of appending a second copy. Text you wrote outside the generated block is preserved in place; an already-doubled file heals back to one copy.
npm: monomind@2.11.3 · @monoes/monomindcli@2.11.3