Skip to content

v7.86.3

Choose a tag to compare

@github-actions github-actions released this 26 Oct 01:10
· 404 commits to main since this release
29e8a4e

Pairs with engine-service-v0.1.164 (REQUIRED_ENGINE_VERSION unchanged from 7.86.2), already deployed; no engine changesets. Ships the conexus-tool-spill plugin that missed 7.86.2, the manifest-heal data-loss fix, and traverse/plan_save failures reported as errors. Engine work on develop (the re-embed refusal, per-document section labels) waits for the next engine release.

Added

  • conexus-tool-spill, an opt-in Claude Code mod in the nexus-plugins marketplace (nexus-121ke). A third plugin beside conexus and sn, installed with /plugin install conexus-tool-spill@nexus-plugins; nothing changes for anyone who does not. In the main conversation, a Bash result over limit bytes (default 4000) is written to <temp dir>/claude-tool-spill-<user>/<tool_use_id>.txt, and the model sees the first head bytes (1400) and the last tail bytes (800) of each stream, cut at line ends, with a note between them naming the file, how many middle lines were cut and how many of those mention an error or failure; a failure on the last line of an exit-0 pipeline is therefore still seen. A whole-file Read over the limit is cut with the next offset and a limit to use; a Read with an offset or limit, an instruction file (SKILL.md, AGENTS.md, CLAUDE.md, files under skills/, agents/, commands/, rules/), an errored or denied call, output Claude Code already persisted, subagent calls and every other tool (Grep, MCP tools, ToolSearch, Skill) pass untouched, and claude -p runs are left alone unless includeHeadless is on. Limits are counted in UTF-8 bytes and never split a character. The options are limit, head, tail and includeHeadless. The plugin replaces any machine-local copy of the mod (two loaded together would both act); spill files are per user and never deleted by the mod. The directory is tool-spill/ (README there); the plugin channel's allowlist, the drift ledger and scripts/cut_plugin_release.py know it, and the cut now accepts a plugin the base marketplace does not list yet. FALLBACK_PLUGINS in src/nexus/plugin_registry.py names it too, which is client code and so reaches users only with the next client release (the plugin itself ships through a plugin cut). The plugin's tests run with claude plugin test tool-spill, by hand: no workflow installs the claude CLI.

Fixed

  • traverse and plan_save answers that read like an empty result are failures (nexus-4jwr0). Over MCP, traverse with an unknown purpose, a traverse where no seed parses as a tumbler, and a plan_save the plan library refuses ("Plan not saved: ...") now answer isError: true; in-process callers get the same values as before. A traverse that drops some unparseable seeds, or returns no chunk ids because the manifest lookup failed, still succeeds but now says so in a warning entry; both used to be silent.
  • The manifest heal no longer writes into a document that has manifest rows, and no longer lowers the chunk_count of one (nexus-8o06q). nx index repo (its self-heal pass) and nx catalog reconcile treat a document as gapped when its manifest has fewer rows than its chunk_count, which includes a partly manifested one, and rebuilt the manifest from the T3 chunk rows carrying the document's file hash. A chunk row is shared by every document holding that text and carries the last writer's hash, so a chunk the document shared with a document that wrote it last was not fetched; the replace then deleted the document's own correct row for it, booked the shortfall as a duplicate-text collapse, and lowered chunk_count, so the gap never showed again and the document was never re-indexed. Now a gapped document that already has manifest rows is left as it is, chunk_count included, and marked for re-index: its index fence is set to failed, which every index path reads as stale, so re-indexing its source rewrites the manifest at the right positions without re-embedding unchanged text. The route depends on how the document was indexed: the next nx index repo for a repo file, nx index pdf / md / rdr for one indexed that way, nx store put again under the same collection and title for a note; nx catalog reconcile covers the whole catalog, so it can mark documents an nx index repo never walks. A document with no manifest rows is still rebuilt from the stored chunks, now by appending (it cannot delete a row a concurrent run wrote), and only if its fence is not indexing; the append sets its chunk_count to the number of rows rebuilt. If that is fewer rows than the chunk_count it had, the document is marked for re-index too, because the heal cannot tell repeated text inside one document (one manifest row per position, one T3 row) from a lost chunk; its rows then equal its new chunk_count, so a later pass does not list it again, and the failed fence is what makes the next index of its source rewrite it and restore the count. If the rebuild holds more rows than the chunk_count (rows of an older chunker run of the same file) nothing is written and the document is marked. The heal never writes chunk_count itself. nx catalog reconcile prints a REINDEX line for each of the first 20 marked documents and a count of the rest, and the nx index repo self-heal line counts them; --dry-run reports the same and changes nothing. A marked document makes nx t3 gc refuse its collection until it is re-indexed (unless --allow-incomplete-index-state is passed), and one whose source is not re-indexed (an --since-head run, a file that is gone, or a document no nx index repo walks) stays marked; a marked document that still has rows is listed again on every pass. The nx doctor "failed index runs with hidden chunks" row is unchanged: it examines only documents that are already failed and counts those whose manifest the heal would rebuild. The "chunk_count corrected N -> M for duplicate-text collapse" note is gone. The fetch still includes chunk rows with no live manifest owner (they are the rows the heal exists to find), so a manifest-less document's rebuild can include rows left by an older chunker run when the counts happen to match.

Changed

  • The sequential-thinking rule names its decision points (nexus-rkats; Sam 2026-10-25). The SessionStart guidance and the orchestration skill asked for a sequential-thinking call before every decision; they now name the closed list: dispatching an agent, choosing a fix (and again after one fails), acting on a verdict, test result or measurement, pushing, merging, closing a bead or preparing a release, and anything hard to undo.