Skip to content

v2.11.3

Choose a tag to compare

@nokhodian nokhodian released this 18 Sep 08:02
· 800 commits to main since this release

[2.11.3] — 2026-09-18

Fixed

  • hooks post-task --success true|false recorded the wrong thing entirely: the argument parser set a declared boolean flag to true and left the literal true/false in the positionals, where ctx.args[0] || ctx.flags['task-id'] picked it up as the task ID. On the invocation CLAUDE.md documents, --task-id abc --success false printed Task false recorded as successful — the real ID discarded and a failed task recorded as a success. A declared boolean flag now consumes an immediately following true/false; bare --flag, --no-flag and combined short flags are unchanged. This affected every boolean flag in the CLI (#269: 7c573b6).
  • mcp start --daemon was a no-op — the flag was read, passed to the server options, and never consulted — so -d blocked the terminal; and an unref'd 5s force-exit watchdog in bin/cli.js killed every mcp start, foreground included, about 6s after startup (measured). -d now re-execs detached with output to ~/.monomind/mcp.log and reports the child's own PID, and the watchdog exempts a foreground server. mcp stop also only deleted the PID file for a daemon, leaving it running and unreachable; it now signals the recorded PID (#267: d4354f8).
  • mcp status always reported stdio, localhost and 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 list showed every hook as "Enabled: No": the table rendered an enabled column the static registry never populated. Hooks now report their real state, and the separate Claude Code event wiring in .claude/settings.json is reported as its own labelled section (#270: ca54133).
  • CopilotAgentRunner always 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-file JSON and summed across tool-fence rounds; cost_usd is 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 under data, which none of the four checked shapes matched (#181: ef60e0b).
  • monomind org status called 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 only running/crashed (#274: 1bb4a0a).
  • org_task auto-dispatch delivered only the task title when an org_send briefing 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 build failing on a better-sqlite3 ABI mismatch gave advice that could not work: under a global install the loaded binary sits in the install tree, so npm rebuild from 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=1 opts out) and pins PATH to the running Node so the rebuild targets the right ABI; doctor gained a Native modules check that detects it without needing a crashed build's log (#231: e736fa6).
  • The monobrowse close-browser test 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 real SIGKILL past restoreAllMocks (#283: fcf1f8c).
  • doc/commands/security.md and the security command's own subcommand list advertised a container scan type that hard-errors "not implemented"; removed from both (#271: feee3ce).
  • doc/concepts/org-runtime.md listed 6 of the 14 accepted runtime values (grok and hermes were the reported gap; 8 were missing) and documented max_turns_per_message as defaulting to 30 when the real default is 100,000 — the knob people reach for when a role is cut off. Also corrected idle_minutes' effective default, the role id constraint (that regex governs org names, not role ids), the deprecated gemini/openai provider 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