Skip to content

v9.2.0

Choose a tag to compare

@github-actions github-actions released this 06 Sep 17:58
Immutable release. Only release title and notes can be modified.
765304f

9.2.0 (2026-09-06)

� BREAKING CHANGES

  • engine: nestweaver_engine::admin::compute_claude_hook_patch now returns Result<serde_json::Value, anyhow::Error> instead of serde_json::Value, and returns Err for any existing that is not a JSON object � including Value::Null, which its documentation previously suggested passing. Library callers must handle the Result; pass
  • cli,setup: nestweaver admin install-hook and nestweaver setup no longer refuse a symbolic link. abbde5d listed "is a symbolic link" as one of four conditions under which install-hook exits 1; that condition is now narrower � only a link whose target does not exist, or which cannot be resolved (a cycle), is refused. A working link is FOLLOWED: the merge lands on the file the link names and the link is left intact. Relative to 8.x the net contract still differs, which is why this footer stays: 8.x wrote through a link with a non-atomic fs::write and exited 0 in every case, including a dangling one, where it CREATED the target outside the project. Both of those now behave differently � the write is atomic and aimed at the canonical target, and the dangling case exits 1 naming the target and the command to re-run.
  • cli: nestweaver admin install-hook now exits 1 instead of 0 when .claude/settings.local.json cannot be safely rewritten � it is unparseable, is not a JSON object, contains comments, or is a symbolic link. It previously exited 0 in all four cases, having overwritten the file. The success message also changed: "Hook installed (idempotent) to " is now either "Hook installed to (every other setting preserved)" or "Hook already present in (nothing written)". nestweaver setup gains the same refusals on the config files it merges into, though auto-setup treats them as non-fatal as it always has.
  • cli,engine: server init-tls now REFUSES a directory that already holds any of ca.pem, ca-key.pem, server.pem, server-key.pem, client.pem or client-key.pem, exiting 64 (EXIT_USAGE) with nothing written to stdout and the refusal on stderr. Through 8.x it printed a warning, overwrote the CA and its private key, and exited 0. A job that re-runs init-tls over a populated directory will now fail on its first run after upgrading to 9.0.0; that is the intended signal. Pass --force to replace the bundle � the refusal prints the exact invocation. --force replaces the WHOLE managed set, so a run that omits --client over a bundle that had one REMOVES client.pem and client-key.pem rather than leaving them signed by a CA that no longer exists; pass --client to reissue them. The replaced bundle is kept at <output-dir>/.nestweaver-tls.backup/, and the directory now also carries a .nestweaver-tls.lock. The shipped docker-compose.yml is unaffected: its init-tls service is already guarded by if [ ! -f .../server.pem ].
  • cli,mcp,engine: dead-code now REFUSES on a resolver-generation-stale graph instead of printing a list. On every route � CLI direct, CLI via daemon, --json on both, and MCP dead_code � a graph whose repos are below RESOLVER_GENERATION yields refused: true with reason: "outdated_resolver", resolver_stale_repos, needs_reindex: true and a remedies array, and NO unreachable_symbols key at all; the CLI writes nothing to stdout in text mode and the refusal to stderr. THIS CHANGES A CI-FACING EXIT CODE: dead-code returned 0 with a list on a generation-stale graph through 8.x and now returns 2 (EXIT_NEEDS_REINDEX, the code stale-check already uses for the same condition), so a job that runs dead-code will fail on its first run after upgrading to 9.0.0 until the graph is re-indexed. That is the intended signal. Fix it with nestweaver index --repo <path> --force for each repo the refusal names � --force is required, because a generation-stale repo is already at HEAD and the incremental path writes nothing. There is no override flag. A consumer that must keep reading a list from an un-re-indexed graph has no supported way to do so, which is the point.
  • cli: --no-daemon and NESTWEAVER_NO_DAEMON=1 now only REQUEST a daemon bypass; NESTWEAVER_ALLOW_NO_DAEMON is the sole variable that permits it. CI and GITHUB_ACTIONS no longer confer permission. A requested but unpermitted bypass is disclosed on stderr and the command routes through an autostarted daemon anyway rather than failing, so a CI job that passed --no-daemon expecting an isolated direct store will keep exiting 0 while silently using a daemon. Set NESTWEAVER_ALLOW_NO_DAEMON=1 alongside --no-daemon to restore the previous behaviour.
  • mcp: MCP result provenance moved from the outer tools/call envelope to the result payload, and its keys lost the nestweaver.io/ prefix. A raw HTTP MCP client reading result._meta["nestweaver.io/sources"], nestweaver.io/scope or nestweaver.io/stale_repos now reads nothing; read _meta.sources, _meta.scope and _meta.stale_repos on the payload instead. The payload location is what the server's initialize instructions already promised and what both CLI routes already emitted. MCP over stdio previously sent no provenance at all and now sends it in the same place.
  • cli,mcp,daemon: RESOLVER_GENERATION is bumped 3 -> 4, so every graph indexed by an earlier release is stale by design and must be re-indexed. Until it is, rankings (hubs, bridges, repo-map, clusters, PageRank order everywhere) are computed over the edges the old resolver wrote, C and C++ MEMBER_OF edges do not exist at all, and C++ IMPORTS edges are missing. Detect it with nestweaver stale-check: a generation-stale repo now reports status: "outdated_resolver" with resolver_stale: true and needs_reindex: true, and the command exits 2. Fix it with nestweaver index --repo <path> --force for each repo � --force is required, because such a repo is already at HEAD and the incremental path writes nothing. Vaults are unaffected. THIS CHANGES A CI-FACING EXIT CODE: stale-check returned 0 on a generation-stale graph through 8.x and now returns 2, so a job gating on any_needs_reindex or on exit 2 will fail on its first run after the upgrade until the graph is re-indexed. That is the intended signal.
  • engine: MarkdownIndexResult.wikilinks_resolved / wikilinks_unresolved, MarkdownSinceResult.wikilinks_resolved, and DocStats.total_wikilinks / broken_wikilinks / low_confidence_wikilinks are renamed, as are the corresponding brain_add and brain_doc_stats JSON keys and two CLI summary lines. DocStats is Serialize/Deserialize, so this is a JSON contract change and belongs in the same release as the disclosure.
  • cli: let --include-components stay unset so the documented default governs
  • engine,mcp,cli: PageRank artifacts must declare algorithm_parameters, so backup and publish refuse a sidecar written before this change until a re-index regenerates it. stale-check --json gains needs_reindex_repos, and its text banner now reads "NEEDS REINDEX" rather than "INDEX IS STALE".
  • mcp,daemon: a daemon started without --config now stores graph data under instance "default" rather than a hash of its database path. Existing graphs indexed under the hash identity are not migrated � re-index. MCP tools now reject undeclared arguments instead of ignoring them.
  • cli,export: stale-check now exits 2 (not 1) when a repo needs re-indexing; exit 1 means the check failed. Gate on any_needs_reindex or exit 2. export now includes the vault subgraph by default; pass --scope code for the previous output.
  • embeddings: GraphStore::delete_symbols_in_file and delete_symbols_in_file_on return Vec<String> instead of usize. Callers wanting the count use .len().
  • index: GraphStore::update_symbol_file_paths and update_symbol_file_paths_on are removed. A rename re-keys symbols; delete and re-insert them instead.
  • index: floor the --since threshold, rename file_meta_nanos, correct the platform claim
  • index: the <db>.filemeta.json change-detection sidecar moves to v3 (nanosecond mtimes), and resolution_cache::CACHE_VERSION is bumped in lockstep as its pairing test requires. A v2 sidecar stores SECONDS in the field v3 reads as NANOSECONDS, so it is DISCARDED rather than reinterpreted � reusing it would be indistinguishable from a real edit. The first index after upgrading is therefore a FULL RE-INDEX for every existing database. This is the documented fail-open: it costs one re-index and can never mis-classify a file. Embeddings are keyed separately and are not invalidated.

Features

  • cli: add selective delete verbs for the two authored sidecars (de42f33)
  • cli: let --include-components stay unset so the documented default governs (c011da6)
  • cli: let a human read back what agents annotate, and say who can repair (5453853)
  • cli: let a human read back what agents annotate, and say who can repair (1ee832e)
  • cli: sweep CLI flag bounds against their MCP schema twins, and write down the sibling-gap rule (nw-217b, nw-217c) (19a995f)
  • daemon,cli: give context its own RPC so both routes run one algorithm (2460331)
  • engine,cli,daemon: per-repo exclude globs for tracked code (f8793c7)
  • engine: add selective delete for interaction and extension sidecars (7c9608c)
  • impact: make the result-set cap a property of the CONTRACT, not of the transport (nw-357) (1bdb6a1)
  • mcp: add code_context, the code-only counterpart to brain_context (b0cc037)
  • mcp: derive tool annotations from MUTATING_TOOLS (nw-293) (8533ba0)
  • mcp: window broken-links so the tiers a reviewer needs are reachable (ced4305)
  • release,npm: attempt npm provenance, and document the install-script failure users actually hit (nw-423, nw-358) (786ab50)

Bug Fixes

  • backup: authorize backup restore on the database write lease, not a pidfile (7709127)
  • backup: prove a restore cutover complete before deleting the last copy (b9ae3ac)
  • brain: say how many notes matched before --max-suggestions cut the row (nw-362a) (6a95f76)
  • cache: stop staging the response cache through a shared temp name (5817f77)
  • cache: stop staging the response cache through a shared temp name (fbda19f)
  • ci,store,daemon: close the v8.0.0 test-quality debt � mutation scope, unlocked recovery, dead lifecycle guards (c0838ff)
  • ci: derive the package list from the same diff that generates mutants (dc6caa9)
  • ci: make Linux release builds portable (eee4334)
  • ci: make the release fail when it cannot publish, and verify that it did (nw-115) (4599d8e)
  • ci: make v9 Linux release builds portable (dcc5b3d)
  • ci: mutate the packages the diff touches, not the whole workspace (dadd45b)
  • ci: mutate the packages the diff touches, not the whole workspace (7594cd2)
  • ci: mutate the workspace, not just the root package, and bound the job (6c30bc4)
  • ci: pin gcc-12 on the 22.04 Linux runners so the release actually builds (91d9390)
  • ci: pin gcc-12 on the 22.04 Linux runners so the release actually builds (b037812)
  • ci: ship Linux archives against a declared glibc baseline, and enforce it (c2e0835)
  • ci: stop the release-PR lookup racing the label that identifies it (44ae901)
  • ci: stop the release-PR lookup racing the label that identifies it (81628db)
  • ci: sync the release lockfile however the release PR got there (819dbd5)
  • ci: sync the release lockfile however the release PR got there (af44f35)
  • cli,ci: make the daemon bypass explicit where CI relied on it implicitly (68ec6da)
  • cli,client: surface two disclosures that were computed and dropped, and let a long-running command say so (74ea5bc)
  • cli,daemon,federation: forward --no-embed across the proto boundary; make it a per-command field (7d4d001)
  • cli,engine,mcp: give the direct route a semantic model, disclose what shaped an answer, and bound investigate's hydration (06a70c2)
  • cli,engine,mcp: report the pre-cap total for every capped summary level (a81858b)
  • cli,engine: make server init-tls refuse to destroy a CA it did not mint (0a2f152)
  • cli,export: give stale-check an honest exit contract and export the whole graph (aa3720a)
  • cli,mcp: --no-embed genuinely disables semantic ranking or is refused; disambiguate four stale_repos populations in docs (2c3c7b4)
  • cli,mcp,daemon: contract divergences � one route fixed, its twin left behind (2d2134b)
  • cli,mcp,daemon: make stale-check see the resolver generation, and disclose it on repo-map (nw-370) (8c3bd9c)
  • cli,mcp,daemon: stop five commands claiming things they never verified (#284) (c211e5c)
  • cli,mcp,daemon: three contracts that said one thing and did another (fdab0e8)
  • cli,mcp,engine: make dead-code refuse a deletion list on a stale graph (nw-372) (d4cf67d)
  • cli,mcp: charge the token budget at the rate the renderer spends (nw-316) (aa5f4da)
  • cli,mcp: forward the clusters bounds to the daemon, clamped to its schema (ae55333)
  • cli,setup,tests: daemon gc needs no database; codex shares the MCP argv builder (2714965)
  • cli,setup: resolve a symlinked user config instead of refusing it (c925d49)
  • cli: bound context --limit and name the cap that actually truncated (nw-259) (6f1bd48)
  • cli: carry the daemon's pre-cut total through brain context (753229b)
  • cli: classify broken wikilinks over the population, not the page (6b36f54)
  • cli: classify the corrupt-WAL diagnostic in the exhaustive matcher (b01b313)
  • cli: close the nw-217b sweep's third hole (kebab/snake schema-key lookup) and revert nw-360's exit code (2b89ead)
  • cli: disclose an unhonourable daemon bypass instead of refusing it (d08e287)
  • cli: disclose stale rankings on the default plain-text route (nw-365) (8ba08fc)
  • client: name the per-command instance override in the --config refusal (341d7af)
  • client: refuse to autostart a daemon against an unreadable write-ahead log (c79b2d1)
  • client: report a daemon that will never boot instead of waiting it out (415a5d6)
  • client: shorten the idle timeout autostart uses for ephemeral --db paths (140d4f1)
  • client: two-tier blast_radius no longer kills the federated response (nw-428 review) (705559f)
  • cli: explicit daemon start/status validate the database; repair reclaims orphaned sidecars (c4619fa)
  • cli: give every corruption mode a named, accurate, followable remedy (nw-285) (1e4de63)
  • cli: give the CLI one --json emitter, so provenance has one author there too (nw-347) (1ac3c59)
  • cli: instance merge must honour a granted daemon bypass (af9a758)
  • cli: make brain remove behave like its two sibling vault commands (a3da11d)
  • cli: make brain remove behave like its two sibling vault commands (6227b07)
  • cli: make cluster name the resolution its answer came from (nw-401) (9d199d9)
  • cli: make help text true, and fix the three places code was wrong instead (3932db6)
  • cli: make project-context's direct route call the tool instead of restating it (nw-316, nw-218) (1fb1a54)
  • cli: make the impact floor clause idempotent instead of unconditional (fd42507)
  • cli: name the unsupported --format/--scope pair instead of relaying the transport (a8f6a2a)
  • cli: one recovery runbook for an unreadable WAL, on all three paths (nw-332, nw-333) (9412007)
  • cli: parse and normalise --since at the clap boundary (nw-295) (1c54b3f)
  • cli: probe readability on the vault guards that only stat it (1f49d76)
  • cli: put ranking staleness on the hubs/bridges JSON payload (f3f7b3d)
  • cli: read-symbols sends the caller's root and stops printing blank bodies (nw-340) (85f856a)
  • cli: reclassify brain add/remove as real MCP twins in declared_cli_mcp_twin (6c9b338)
  • cli: refuse wholly-inferred writes and make error remedies executable (f69f633)
  • cli: reject an invalid export enum at parse time, as a usage error (nw-312) (d565547)
  • cli: render clusters through one bounded renderer on both routes (7267fe6)
  • cli: render the impact truncation note from one producer (nw-317 leg 1) (7f01542)
  • cli: repair must not exit 0 over a database it never opened (5a883bb)
  • cli: repair the nw-217b bounds sweep and close nw-431/nw-432/nw-397/nw-360/nw-379 (17299b3)
  • cli: resolve a service once and render what the resolver returns (nw-311) (2c3d61e)
  • cli: resolve watch-stop's database the way every config-aware command does (45be48b)
  • cli: stop admin install-hook from deleting the settings it merges into (abbde5d)
  • cli: stop brain status printing an unreadable count as zero (d2fc406)
  • cli: stop brain remove warning on success, and make the crash detector work (a0ed21e)
  • cli: stop brain remove warning on success, and make the crash detector work (eef8c94)
  • cli: stop usage errors and "needs re-index" sharing exit code 2 (b666502)
  • cli: stop usage errors and "needs re-index" sharing exit code 2 (c3207ef)
  • cli: take the adaptive cluster resolution from its one authority (F-DC-7) (6df6dcb)
  • cli: tell stale checkpoint debris apart from a live checkpoint (3f85362)
  • cli: two routes that answered differently than the tool they mirror (22535af)
  • cli: wire repo-map/cluster/cross-repo-contracts/hubs/bridges to the engine and mcp fixes (0d4131e)
  • close every finding from the independent review (8454f03)
  • close every route an independent review found still reproducing (836b630)
  • close nw-373, advance nw-316, and land nw-217's remaining legs (1bafb3f)
  • close the CLI twins for the scope filters and the resolver-stale gate (838943c)
  • close writer-lease and consolidation-receipt gaps from PR #352 review (1069f1d)
  • context: disclose on brain_context's MACHINE routes that the answer was cut (nw-353) (cae16cc)
  • context: put the truncation CAUSE in the payload, not only in the prose (dd7318f)
  • correct PR #352's release, writer-lease and consolidation defects (f402870)
  • daemon,cli,engine: nw-246 was unfixed on the default path (8b4bf8e)
  • daemon,cli,engine: nw-246 was unfixed on the default path (c4e9f33)
  • daemon,client: observable launchd-stop timeout; explicit escape for the ephemeral idle-timeout heuristic (0fa2b6f)
  • daemon,cli: HOLD the write lease for the duration, do not probe and hope (f147062)
  • daemon,cli: let the lock decide who may write, not an environment variable (d133e21)
  • daemon,cli: let the lock decide who may write, not an environment variable (1ef9e74)
  • daemon,cli: reclaim an orphaned watcher, and stop the reconciler racing teardown (2478f3c)
  • daemon,cli: reclaim an orphaned watcher, and stop the reconciler racing teardown (e544266)
  • daemon,config,mcp,cli: close five validated reports; document a sixth (#285) (327c2f0)
  • daemon,docs: end the progress race on an observation, and cite the right tickets (5deff62)
  • daemon,engine,mcp: let a daemon re-open a search index it could not open at boot (40decec)
  • daemon,engine: resolve the data instance live, at all six readers (d1bb956)
  • daemon,mcp,index: check daemon version on the paths users take, and stop leaking vectors on a full re-index (3e5c121)
  • daemon,setup,tests: count the reconcile write, reconcile existing registrations, isolate the gc test (8e68eea)
  • daemon,setup: close PR 275 review gaps (2cf2209)
  • daemon,setup: close PR 275 review gaps (0ea8c4a)
  • daemon: gc names a live daemon whose database no longer exists (64dd910)
  • daemon: reclaim a watcher whose owning client process is gone (6a45256)
  • daemon: refuse a stale-version incumbent instead of reporting success (#283) (4eedf2e)
  • daemon: serialize brain_memory_consolidate's file moves behind the write gate (e78ea02)
  • daemon: serialize brain_memory_consolidate's file moves behind the write gate (5a1b01b)
  • daemon: stop reporting success for embeds and vault indexes that failed (9b837ac)
  • daemon: stop reporting success for embeds and vault indexes that failed (ada1f51)
  • daemon: track watcher tasks so shutdown awaits them before releasing the lock (2fc6ea0)
  • daemon: wait for launchd to actually release a job before proceeding (d9349c7)
  • disclosure, bounds and coverage sweep across 13 items (37bc066)
  • disclosure, bounds and coverage sweep across 13 items (429e563)
  • embeddings,cli,mcp: close the review findings against 7.0.0's own fixes (3e857e7)
  • embeddings,daemon,mcp: close the review findings against 7.0.0's own fixes (a42df2f)
  • embeddings: restore the test attribute the new test displaced (7e2a360)
  • embeddings: stop a tombstoned pending upsert wedging every later flush (073ee06)
  • embeddings: stop a tombstoned pending upsert wedging every later flush (e819a69)
  • embeddings: tombstone deleted nodes so dead vectors stop being scored (#281) (520a5d9)
  • engine,cli,mcp: stop blast-radius degrades opening with dead-code's sentence (5d8cc18)
  • engine,cli,mcp: stop visibility alone from promoting dead code to High (nw-291) (b27fc8a)
  • engine,cli: reorder RenderCap's scope filter ahead of its cap, disclose what it drops, and drop a per-candidate DB hit from the hot loop (5ae23ef)
  • engine,daemon: substitute the instances the merge remedy already knows (570cc5d)
  • engine,mcp,cli: close five defects review found in this branch (3666c1e)
  • engine,mcp,federation: report the pre-cap total for code_context (nw-320) (fd8550a)
  • engine,mcp: break bundle locks held by dead processes; restore the resolver descriptor on the restricted route (5307930)
  • engine,mcp: rule Extension callable with enforcement, disclose the hub/bridge kind exclusion (cf60c35)
  • engine,schema: make body fetch total over the UID space and say why it failed (nw-301) (b6a38d6)
  • engine,store,cli: declare pagerank parameters, match tag descendants, seal publication slots (1187d18)
  • engine,store,daemon: resolve a service once, with its candidates and entry points (nw-311) (4375c49)
  • engine,store,mcp: parse and normalise since at the boundary (nw-295) (2300701)
  • engine,store,web: close adversarial-review findings (057a869)
  • engine: a cfg-gated twin of a reachable symbol is not dead code (d51f7b7)
  • engine: a path-qualified wikilink re-enters the proximity ladder (3006148)
  • engine: a scan that dropped a row must not report a clean merge gate (d6b2922)
  • engine: a Spring controller class is not a route implementer (3f7fffa)
  • engine: bump RESOLVER_GENERATION 3 -> 4 (2cc960b)
  • engine: bump RESOLVER_GENERATION to 2 for the lane-A resolver fixes (d292794)
  • engine: carry the manifest cache across every generation advance (nw-289) (c5ae05f)
  • engine: clear a stale unavailable_reason when the entry has a body (nw-301) (de069f0)
  • engine: cluster --resolution reads a resolution-keyed sidecar instead of whatever ran last (26b3903)
  • engine: curate the vault skip-dirs list deliberately instead of admitting everything the 9-entry list happened not to name (nw-436 review) (31ca15b)
  • engine: disclose every pruned directory and stop hiding native modules (39ee90f)
  • engine: disclose file-level [[repos]] exclude prunes (nw-437) (8fbe62b)
  • engine: finish nw-395 � refuse unlocked bundle writes, and stop calling an unreadable store expired (558ea06)
  • engine: give backup_restore its own exclusive restore authority (e74675d)
  • engine: give the graphml export test the note field the vault index added (77c87e1)
  • engine: give the vault skip-dir disclosure its own honest remedy, and stop degrading every vault's coverage forever (nw-436 review) (3fbfd6f)
  • engine: hubs/bridges stop ranking non-callable symbol kinds and bridges fails closed during a dirty publication (af39a49)
  • engine: investigate repo: scope now excludes vault notes (nw-378) (be4ebc6)
  • engine: key memory-lint templates by template, not by NoteKind (081abc3)
  • engine: order rts-eval timestamps by instant, not by bytes (15e2f35)
  • engine: repo-map discloses truncation and stops merging same-path files from different repos (50cb6a7)
  • engine: resolve wikilinks by filename before title, and by nearest ancestor (ad94698)
  • engine: review round 2 � visibility parity, remedy text, project: scope leak (c94d27e)
  • engine: skip a binary source file instead of voiding the whole index (f083edd)
  • engine: stop compute_claude_hook_patch discarding the document it is given (940127f)
  • engine: stop backup refusing a healthy graph over a stale derived cache (ac13afd)
  • engine: stop calling a seedless dead-code walk "complete" coverage (771fb3c)
  • engine: stop vault indexing from inheriting the code repo skip-dirs list, and disclose every prune it makes (nw-436, nw-196) (6e29dbd)
  • engine: tell the caller whether a resolver-stale repository is theirs (nw-424) (aee8168)
  • engine: treat an unreadable vault root as an error, not an empty vault (9844a67)
  • engine: truncate PR comments at a char boundary, not a byte index (nw-402) (842b208)
  • engine: validate the slot on rollback, not just on activation (28c3ff7)
  • engine: validate the slot on rollback, not just on activation (062ddb9)
  • engine: verify per-database write leases before trusting Borrowed (ceade73)
  • export,cli,daemon: make --scope reach the route users actually take (3d92649)
  • export,store,mcp: make a scoped export the subgraph it names (4ef762e)
  • export: make msgpack honour --scope on both routes (9504eb6)
  • export: make msgpack honour --scope on both routes (caf26e3)
  • federation,mcp,cli: re-honour code_context's limit across a merge (b293e70)
  • federation,mcp,cli: re-honour code_context's limit across a merge (1bfec9d)
  • federation,mcp: stop the structured merger dropping required fields (7d2598e)
  • federation,mcp: stop the structured merger dropping required fields (37288e4)
  • federation: restore the #[test] my insertion stole (5d05ed3)
  • give the database its own instance identity, established at creation (1ca38f5)
  • give the database its own instance identity, established at creation (be9da17)
  • harden high-priority safety contracts (a23ac52)
  • harden publication and query lifecycle regressions (d0de9fe)
  • harden publication and query lifecycle regressions (c7d513d)
  • impact: report the same total the daemon does, including when pruned (fc6c55f)
  • index,tests: refresh the cached stat on a content match, and de-flake the investigate parity test (9edcd46)
  • index: compare size as well as mtime, so same-second edits are not lost (3697824)
  • index: floor the --since threshold, rename file_meta_nanos, correct the platform claim (bdb8e31)
  • index: keep nanosecond mtimes so same-second edits are never lost (72b1f9a)
  • index: stop a parseable-to-parseable rename failing the whole index (#280) (970f57e)
  • investigate: count all five caps, not only the token budget (nw-362b) (b29dfe9)
  • make resolver-staleness actionable, attempt npm provenance, sort stale_repos at the emitter (c53f2e9)
  • make writer leases portable across scratch roots (c146495)
  • mcp,cli,daemon: stop turning failed reads into confident answers (52b167d)
  • mcp,cli,daemon: stop turning failed reads into confident answers (cf3afbd)
  • mcp,cli: stop reporting a failed read as a confident zero (d0c2b5c)
  • mcp,cli: stop reporting a failed read as a confident zero (cd64a68)
  • mcp,daemon,cli: close two MCP/CLI parity gaps � code_context and stale-ranking disclosure (181020b)
  • mcp,daemon: server-authoritative instance identity, and strict tool schemas (b80001c)
  • mcp,engine: bound the clusters listing and unify the cluster ID space (nw-299, F-DC-7, F-DC-11, F-MCP-6) (c15df32)
  • mcp,federation: stop restating which tools mutate (282eef7)
  • mcp,federation: stop restating which tools mutate (ce3ff6b)
  • mcp,schema: record only resolvable node UIDs as interaction seeds (10081dd)
  • mcp: apply the bounds and defaults the schemas advertise (79c5b4c)
  • mcp: apply the bounds and defaults the schemas advertise (02f057f)
  • mcp: blast_radius resolves --repo by name/uid, refuses unresolvable (nw-428) (5f9e85c)
  • mcp: create the bounds/total/truncation seam and bound every limit param (nw-304) (4819a70)
  • mcp: cross_repo_contracts attributes rows to a repo, and publication messages stop asserting TRANSIENT past the expected window (1b0c42c)
  • mcp: disclose stale rankings to the agent, not just to the human (b7014a6)
  • mcp: drop a redundant rebinding clippy rejected (71cf485)
  • mcp: escape U+2028/U+2029 on the JSON-RPC wire (d54d4d3)
  • mcp: give summary one shape and one pair of count names (nw-321) (359ca48)
  • mcp: make brain_status's read-failure disclosure reachable by a test (nw-260) (325621f)
  • mcp: reject scalar JSON-RPC params at the envelope (dd18631)
  • mcp: stamp result provenance at BOTH dispatch seams, not one (nw-315) (d51dee1)
  • nine delta findings, two of them regressions we introduced (7d87c0f)
  • nine delta findings, two of them regressions we introduced (9d50a69)
  • npm,ci: close review findings � dead rate-limit branch, credential in argv, vacuous test (7c026c2)
  • npm,release: reconcile the release gate with the installer contract this branch changed (8066e8e)
  • npm: claim the real package name, and stop the tarball shipping a home directory (nw-115) (ad7378f)
  • npm: declare a minimum supported Node version (nw-433) (057fac9)
  • npm: declare the engines floor the package actually needs, not the LTS policy floor (542fdb0)
  • npm: make isMuslLinux fail open when the report is unreadable, not just undefined-glibc (nw-433) (903c932)
  • npm: make the installer's claims true and stop it failing every published version (c67aaca)
  • npm: resolve the bin script through npm's install symlinks (nw-433) (dae8b30)
  • npm: stop declaring a libc constraint that refuses every macOS install (nw-433) (eac6410)
  • nw-246: scope the guard to the SILENT fork, not to stated intent (a5d9148)
  • pagerank: check a declared configuration against this build's, not itself (3ebe34a)
  • parser,engine: gate languages_without_entry_points on a capability check (nw-435) (ffe3eb3)
  • parser,engine: model script/module top-level as an entry point (nw-435) (774b1c4)
  • parser: a symbol's span must cover its body � six languages, not one (904a2dc)
  • parser: bind C and C++ members to their enclosing class (aab7902)
  • parser: capture C++ calls with explicit template arguments (nw-434) (d93548b)
  • parser: capture the function a serde attribute names as a string (516610a)
  • parser: dispatch .h to the C++ grammar, not C (6c877c9)
  • parser: give Rust impl blocks an identity distinct from the struct (nw-330, nw-349 cause 5) (c21a587)
  • parser: give the graph the reachability edges it was missing (nw-291) (66d180f)
  • parser: span Python and SystemVerilog definitions on the declaration (19845a0)
  • parser: three modelling defects � julia call sites, reference context, SFC export kinds (01c3d16)
  • post-9.1.0 regression sweep � 26 items, incl. the npm install blocker (06e4790)
  • pre-release batch � truncation panic, macOS annotation noise, cluster resolution disclosure (811935b)
  • project-context: disclose which config answered, and reroute --config instead of forwarding it (nw-316) (cf6f3ef)
  • proto,daemon,federation,mcp: let an unset boolean stay unset across the RPC (nw-316, partial) (91af830)
  • proto: support Ubuntu 22.04 protoc (42905f9)
  • proto: support Ubuntu 22.04 protoc (3458714)
  • publication,cli,mcp: refuse symlinked slots and stop guessing staleness (57bd286)
  • publication: make discard prove its root lock covers what it deletes (nw-373) (c5c956a)
  • ranking: give the git-activity sidecar a repo dimension, and load it (3b2d539)
  • ranking: give the git-activity sidecar a repo dimension, and load it (1520cea)
  • rankings: read the daemon's own stale_repos instead of recomputing a weaker one (nw-358) (0dd98b0)
  • regex: give the trigram reconciler an owner, and move interaction tracking into config (0f10e28)
  • regex: give the trigram reconciler an owner; move interaction tracking into config (8d46cff)
  • release,npm: dedupe merge-commit changelog entries and ship per-platform npm packages (827034e)
  • release: bundle GCC runtime and smoke-test artifacts (#346) (150e229)
  • release: give the last three output-gated jobs a status function (111d3e9)
  • release: give the last three output-gated jobs a status function (e2fa21f)
  • release: let release-context read the draft it validates (00e2e80)
  • release: let release-context read the draft it validates (2652777)
  • release: remove the duplicate, self-comparing 9.2.0 changelog section (df9bf6c)
  • release: remove the duplicate, self-comparing 9.2.0 changelog section (3357079)
  • release: scope changelog dedup to one section, drop the impossible gitHead check (147bd6b)
  • release: stop preflight failing on a correct tarball via SIGPIPE (6e7fb65)
  • release: stop preflight failing on a correct tarball via SIGPIPE (2753428)
  • release: stop the changelog dedup self-test depending on which release is newest (0c4aa35)
  • release: use verified GNU linker contract (#349) (6972765)
  • remediate the v8.0.0 post-release bug hunt (nw-284..nw-331) (b1ac8a4)
  • resolver enclosing-symbol kinds, per-platform npm packages, and retrieval correctness under scope (3deca27)
  • resolver,parser: close the two escape hatches that kept the nw-308 gate ineffective (5a100c2)
  • resolver,queries: resolve TS/JS imports and capture new/re-export references (3fe2665)
  • resolver: apply can_contain_code to find_enclosing_symbol's exact-match branch (3bc825b)
  • resolver: gate every name-only tier on the receiver, and resolve Rust uniform paths (a739eb6)
  • resolver: resolve C++ #include instead of discarding it (53af1b3)
  • resolver: tell a module-scope reference apart from a degenerate-span guess (nw-349) (87e800c)
  • restore #[cfg(test)] on nw316_route_tests (856177f)
  • schema,mcp,federation: author result provenance once, at the tool layer (nw-315) (1cc9bdf)
  • schema,store,engine: index the raw frontmatter so both search surfaces agree (6d99b96)
  • schema: stop provenance stamping from destroying keys it does not own (a0086c8)
  • second backlog remediation pass � 42 ready items, four lanes (a442624)
  • security, coverage-disclosure and merge-gate sweep across 12 items (3d46ec2)
  • security, coverage-disclosure and merge-gate sweep across 12 items (1062565)
  • separate portable lock authorities (2887b14)
  • setup: distinguish explicit and bare config candidates (3125048)
  • setup: stop setup destroying the settings file it is editing (97d6912)
  • setup: stop setup destroying the settings file it is editing (6e9a78f)
  • six route divergences, three closed by sharing rather than restating (1a6a281)
  • six route divergences, three closed by sharing rather than restating (a3728ec)
  • stabilize safety checks under CI concurrency (939c8af)
  • stop the disclosure work leaking ticket ids into user-facing help (9ee5345)
  • store,cli: classify the engine's SECOND corrupt-WAL phrasing, and execute the runbook (nw-332, nw-346) (7dbe70c)
  • store,daemon: reload the git-activity sidecar the daemon just wrote (nw-258) (bf5b8d3)
  • store,engine,parser: persist visibility, drop discard bindings, rank dead code by importance (6882244)
  • store,engine: emit the vault's edges in the graphml export (2644b4a)
  • store,engine: remove a duplicated #[test] and a now-unused import (684b2d1)
  • store,engine: stop discarding collected regex candidates; bound the watcher's write-gate hold (d36ec9a)
  • store,mcp: derive the intent enum from its parser and move the impact note down (nw-317) (dc8e24b)
  • store,mcp: rank broken wikilinks by severity, and count the population (1f5d4b3)
  • store: a merge moves the recorded data instance identity (nw-264) (c66144a)
  • store: bound regex verification by the remaining deadline, not a fresh one (ab7244d)
  • store: bound the address-space reservation on EVERY open, not just writes (d67d031)
  • store: bound the address-space reservation on EVERY open, not just writes (35a9605)
  • store: bound the engine thread pool on READ opens too (16186d7)
  • store: bound the engine thread pool on READ opens too (nw-240, UNVERIFIED) (0564e85)
  • store: clear the namespace-claim registry before the OS flock releases (8fb453c)
  • store: count regex occurrences, not the nodes that contain one (694da93)
  • store: disclose notes that predate frontmatter indexing, with a remedy that was run (f00877c)
  • store: drop an import orphaned by moving the const guard (b527a01)
  • store: enforce the bound at compile time, not with a hollow assert (ac902d2)
  • store: give engine corruption a type, classified once at the FFI boundary (nw-346) (32d494b)
  • store: invalidate the regex scope on a plain index write (926194b)
  • store: invalidate the regex scope on a plain index write (e15fb97)
  • store: latch the engine thread bound so a test cannot disarm it (nw-265) (9716562)
  • store: make a crash inside a database open attributable (39437db)
  • store: make a degraded whole-corpus scan observable to the caller, not just the log (74f82da)
  • store: one poisoned note must not take the whole index dark (204e116)
  • store: place the reindex recovery lock outside every publication slot (nw-263, nw-255) (81f685e)
  • store: reclaim orphaned Tantivy migration staging directories (b9e6b05)
  • store: recover a crash-orphaned regex generation instead of deleting it (25057a7)
  • store: refuse to adopt a crash-orphaned generation on schema mismatch (dc518ba)
  • store: run schema migrations on the path that reads the database (741cfbf)
  • store: sanity-check a candidate before reclaiming it as staging residue (9b7958a)
  • store: stop unlocked opens from clobbering an index migration (3929692)
  • summaries: make the generator's cap a property of the STORED set, not of the code path (nw-361) (410482a)
  • test: render stale-check help on a deeper stack (ec88027)
  • third backlog remediation pass � C++ header dispatch, truncation honesty, recovery (0a7c460)
  • trigrams: carry the policy across the daemon RPC as three states, not a bool (753f124)
  • v6.3.0 hardening � close every ready high/medium bug (195a895)
  • web: make every durable admin mutation shutdown-visible (33085e2)

Performance Improvements

  • engine: make the score-fusion dedup linear (nw-322, leg 2) (116f451)

Reverts

  • parser: drop the synthetic script/module entry-point symbol (nw-435) (32682c0)
  • unpublish v9.1.0 (never actually released, corrupting release-please) (3701a27)

Documentation

  • cli: record that only NESTWEAVER_ALLOW_NO_DAEMON permits a bypass (b3ca6ec)
  • mcp: record the _meta relocation as the wire break it is (nw-315) (3863735)

Miscellaneous Chores

Code Refactoring

  • engine: name the population every link count measures (c6e05b4)