Skip to content

v2.16.7

Choose a tag to compare

@nokhodian nokhodian released this 26 Sep 07:59
· 1422 commits to main since this release

Changed

  • MCP result shape: hooks_* tools no longer send placeholder fields. (Follow-up to #341) These fields held a fixed value rather than anything measured, and are removed: hooks_pre-edit context.patterns (always one 85% <ext> file editing row) and context.relatedFiles (always empty); hooks_model-route confidence (always 0.7; the keyword heuristic has no confidence score); hooks_post-task learningUpdates.patternsUpdated and newPatterns (derived from the success flag, not counted) and learningUpdates.trajectoryId (a new id each call, with no trajectory recorded); hooks_session-end statePath (a .claude/sessions/*.json path that was never written) and summary.filesModified (always 0); and hooks_post-edit learningUpdate (a fixed pattern_reinforced/pattern_adjusted label). The CLI commands and the hooks docs no longer read or describe them.

Fixed

  • hooks_pre-edit fileExists and hooks_post-edit recorded report what actually happened. (Follow-up to #341) fileExists was always true; it now checks the path against the project directory, and hooks pre-edit prints Exists: Yes or No again. recorded was always true, even when the learning-feedback write, the hook's only write, failed; it now follows that write, and hooks post-edit warns when nothing was recorded.
  • hooks post-command --success false is recorded as a failure. (Follow-up to #341) The hooks_post-command tool looked only at the exit code, so a command reported with --success false and the default exit code 0 was stored as a success, and post-task then counted it as the task's final successful command. An explicit success: false now wins; a non-zero exit code is still always a failure. The tool's input schema documents success, and the CLI says whether the outcome was recorded as a success or a failure.
  • The other hooks subcommands now print only values their MCP tool actually returns. (Follow-up to #341) Each command kept its own copy of its tool's result shape, and several no longer matched the tool. session-end printed NaN min, undefined for tasks succeeded and failed, a blank commands count, Files Modified: 0 every time, and a .claude/sessions/*.json path that is never written. It now prints tasks, agents, patterns, trajectories, pending insights and memory entries, and whether the session state was saved. transfer from-project crashed on the skipped-counts table the tool never returns, even after copying the patterns; it now prints the transferred count by type, or the tool's error. explain printed 0.00 for factors the tool has no value for, including Historical Success with no history; they now show N/A. model-stats printed average complexity, average confidence and circuit-breaker trips as 0 every time; it now prints the success rate and average quality from the outcome ledger. post-edit and post-command never printed their learning-updates block; they now say whether the feedback was recorded, and the exit code and store the command outcome went to. Fixed placeholders are no longer shown as data: pre-edit's Exists: Yes and 85% "Learned Patterns" row, model-route's fixed 70% confidence, and intelligence's HNSW dimension (384) and 0% embedding cache hit rate. pretrain no longer says semantic search was enabled when it indexed nothing. --format json still prints each tool's result unchanged, except intelligence, which builds its own object and drops the same two placeholder fields.
  • Kimi conversion reports a command whose flow skill would take an earlier command's .kimi-code/skills/<name>/ directory. (Fixes #342) The converter kept the first flow skill and dropped the later one without a note in result.skipped. It now lists the later command there, as it already did for plugin-command filename collisions. Flow-skill names and plugin-command filenames share one slug today, so the plugin-command check already caught every such pair; the new check keeps collisions reported if the two names ever diverge.
  • hooks post-task no longer prints Agent patterns updated: undefined and Strategies learned: undefined. (Fixes #341) The command read agentPatternsUpdated, taskStrategiesLearned and complexityModelUpdated, which the hooks_post-task MCP tool no longer returns, so the first two printed undefined and the complexity line always said No change. It now prints what the tool actually recorded: Learning feedback: recorded (sqlite) or not recorded, and whether the routing outcome was saved. --format json and the MCP result were not affected.
  • An interrupted monograph watch no longer blocks the next run with "Rebuild deferred — another build is in progress". (Fixes #340) A rebuild blocks the event loop until it ends, so the Ctrl+C listener in watch only ran after the rebuild. The interrupted watch kept building and holding the build lock (.monomind/monograph.db.build-lock), and the next watch deferred to it. watch now removes that listener while a rebuild runs. Ctrl+C during a rebuild exits at once, as it does for monograph build, and the next build takes over the dead process's lock. Ctrl+C between rebuilds still prints "Watch stopped." A build that ends through process.exit(), such as an MCP server shutting down, now removes its lock. It only removes a lock it still owns. The next build also takes over a lock that predates the last boot (a recycled pid), or one the holder has not refreshed for 30 minutes. The deferred line now names the holder (pid 1234, running 2m). After 10 minutes of deferral the watcher stops retrying and says which pid and lock file block it. The changed files are rebuilt on the next change. @monoes/monograph 1.6.11.
  • An unattended org run --task … -y no longer idles silently when the boss calls org_complete. (Fixes #345) org_complete needs human approval by default (#170), and -y only skips the cost prompt, so the approval request went to approvals.json and the dashboard while the run's own log showed nothing until the process was killed. org run now prints each queued approval with the monomind org approve/deny command that resolves it. The new org run --auto-approve org_complete[,tool…] flag pre-approves the listed tools for every role, for that run only, and refuses a name no role gates. -y alone still leaves org_complete gated: the default gate is unchanged, so a detached run that relies on a human approving org_complete still waits for one, and tools a role's policy gates (approvalTools, the built-in Bash/WebFetch/WebSearch) still block unless they are listed.
  • A role whose budget ran out no longer looks like a crashed or stalled dispatch. (Fixes #343) Its open tasks, and any dispatched to it afterward, are held as blocked with a budget_usd/budget_tokens exhausted reason instead of sitting ready forever behind a "crashed or unreachable" bus warning; the coordinator gets one notice per role. budget_usd and budget_tokens are now hot-reloadable: raising a cap on org reload reopens a role that is no longer over it and re-dispatches its held tasks, without losing in-flight spend. See Budget-closed assignees.
  • pick ranks by the task's head, not its modifiers. A purpose phrase or relative clause ("documentation for the REST API", "an org that monitors competitors") no longer outweighs what the task actually asks for — modifier words are downweighted, "new" is dropped as a stopword, boilerplate description openings shared across many skills are no longer indexed, and an id word that joins two other id words (e.g. createorg) now matches both. Frozen-eval top-3 accuracy rose for both agents and skills.
  • Platform adapters keep user edits inside instructions:<platform> blocks. Reinstalling used to overwrite the instructions:<platform> block in CLAUDE.md, AGENTS.md, GEMINI.md and similar files wholesale, discarding anything a user had edited inside it. These blocks now go through the same hash-guarded merge as init's other managed regions: an edited block is kept with a warning, and only replaced (with a backup under .monomind/backups/<run>/) when --force is passed.
  • init no longer warns about this repo's own .opencode → .claude symlinks. These are deliberate mirrors, and every init printed a [WARN] .opencode/<x> resolves inside .claude/ (likely a symlink) line for each of them; a symlinked destination that resolves exactly to the file it would have mirrored is now skipped silently instead of flagged.
  • agent scan no longer runs the agent CLIs it finds, so it does not download or write their state. (Fixes #337) It ran every installed runtime's --version, and in an empty HOME grok downloaded its 159MB native binary into ~/.grok, hermes wrote ~/.hermes/logs and .update_check, and codex, opencode and copilot created their own directories. Scan now reads the version from the npm package.json that owns the binary or from a mise/asdf installs/<tool>/<version> directory, and runs --version only for claude, antigravity and pi, whose --version writes nothing. For any other runtime it reports version: null. agent scan --probe runs --version for all of them, in a scratch HOME, cwd and TMPDIR that is deleted afterwards (grok still downloads into it). Each entry gains version_source (package.json, install-path, exec or not-probed), and the capability agent-scan-read-only advertises the change. The MCP org_list_runtime_options tool gets the same read-only scan. Contract: doc/agent-exec-protocol.md §6.

npm: monomind@2.16.7, @monoes/monomindcli@2.16.7, @monoes/monograph@1.6.11