Repository navigation
v2.16.7
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-editcontext.patterns(always one 85%<ext> file editingrow) andcontext.relatedFiles(always empty);hooks_model-routeconfidence(always 0.7; the keyword heuristic has no confidence score);hooks_post-tasklearningUpdates.patternsUpdatedandnewPatterns(derived from the success flag, not counted) andlearningUpdates.trajectoryId(a new id each call, with no trajectory recorded);hooks_session-endstatePath(a.claude/sessions/*.jsonpath that was never written) andsummary.filesModified(always 0); andhooks_post-editlearningUpdate(a fixedpattern_reinforced/pattern_adjustedlabel). The CLI commands and the hooks docs no longer read or describe them.
Fixed
hooks_pre-editfileExistsandhooks_post-editrecordedreport what actually happened. (Follow-up to #341)fileExistswas alwaystrue; it now checks the path against the project directory, andhooks pre-editprintsExists: YesorNoagain.recordedwas alwaystrue, even when the learning-feedback write, the hook's only write, failed; it now follows that write, andhooks post-editwarns when nothing was recorded.hooks post-command --success falseis recorded as a failure. (Follow-up to #341) Thehooks_post-commandtool looked only at the exit code, so a command reported with--success falseand the default exit code 0 was stored as a success, andpost-taskthen counted it as the task's final successful command. An explicitsuccess: falsenow wins; a non-zero exit code is still always a failure. The tool's input schema documentssuccess, and the CLI says whether the outcome was recorded as a success or a failure.- The other
hookssubcommands 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-endprintedNaN min,undefinedfor tasks succeeded and failed, a blank commands count,Files Modified: 0every time, and a.claude/sessions/*.jsonpath 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-projectcrashed 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.explainprinted0.00for factors the tool has no value for, including Historical Success with no history; they now showN/A.model-statsprinted 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-editandpost-commandnever 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'sExists: Yesand 85% "Learned Patterns" row,model-route's fixed 70% confidence, andintelligence's HNSW dimension (384) and 0% embedding cache hit rate.pretrainno longer says semantic search was enabled when it indexed nothing.--format jsonstill prints each tool's result unchanged, exceptintelligence, 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 inresult.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-taskno longer printsAgent patterns updated: undefinedandStrategies learned: undefined. (Fixes #341) The command readagentPatternsUpdated,taskStrategiesLearnedandcomplexityModelUpdated, which thehooks_post-taskMCP tool no longer returns, so the first two printedundefinedand the complexity line always saidNo change. It now prints what the tool actually recorded:Learning feedback: recorded (sqlite)ornot recorded, and whether the routing outcome was saved.--format jsonand the MCP result were not affected.- An interrupted
monograph watchno 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 inwatchonly ran after the rebuild. The interruptedwatchkept building and holding the build lock (.monomind/monograph.db.build-lock), and the nextwatchdeferred to it.watchnow removes that listener while a rebuild runs. Ctrl+C during a rebuild exits at once, as it does formonograph build, and the next build takes over the dead process's lock. Ctrl+C between rebuilds still prints "Watch stopped." A build that ends throughprocess.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/monograph1.6.11. - An unattended
org run --task … -yno longer idles silently when the boss callsorg_complete. (Fixes #345)org_completeneeds human approval by default (#170), and-yonly skips the cost prompt, so the approval request went toapprovals.jsonand the dashboard while the run's own log showed nothing until the process was killed.org runnow prints each queued approval with themonomind org approve/denycommand that resolves it. The neworg 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.-yalone still leavesorg_completegated: the default gate is unchanged, so a detached run that relies on a human approvingorg_completestill waits for one, and tools a role's policy gates (approvalTools, the built-inBash/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
blockedwith abudget_usd/budget_tokensexhausted reason instead of sittingreadyforever behind a "crashed or unreachable" bus warning; the coordinator gets one notice per role.budget_usdandbudget_tokensare now hot-reloadable: raising a cap onorg reloadreopens a role that is no longer over it and re-dispatches its held tasks, without losing in-flight spend. See Budget-closed assignees. pickranks 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 theinstructions:<platform>block inCLAUDE.md,AGENTS.md,GEMINI.mdand similar files wholesale, discarding anything a user had edited inside it. These blocks now go through the same hash-guarded merge asinit's other managed regions: an edited block is kept with a warning, and only replaced (with a backup under.monomind/backups/<run>/) when--forceis passed. initno longer warns about this repo's own.opencode→.claudesymlinks. These are deliberate mirrors, and everyinitprinted 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 scanno 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/logsand.update_check, and codex, opencode and copilot created their own directories. Scan now reads the version from the npmpackage.jsonthat owns the binary or from a mise/asdfinstalls/<tool>/<version>directory, and runs--versiononly forclaude,antigravityandpi, whose--versionwrites nothing. For any other runtime it reportsversion: null.agent scan --proberuns--versionfor all of them, in a scratch HOME, cwd and TMPDIR that is deleted afterwards (grok still downloads into it). Each entry gainsversion_source(package.json,install-path,execornot-probed), and the capabilityagent-scan-read-onlyadvertises the change. The MCPorg_list_runtime_optionstool 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