Skip to content

v7.65.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 00:53
· 3119 commits to main since this release
b3113ae

Pairs with engine-service-v0.1.138, whose only change is that GET /v1/memory/list takes a limit (nexus-xn9ut). The change is additive and needs no schema change, so the engine deploys before this client tag. An older engine ignores the parameter and the client trims the result itself, so the output is the same either way.

Correction to 7.64.2

The 7.64.2 entry's "What to do" was incomplete, and one of its commands does nothing for many users (nexus-zytwq). uv tool upgrade conexus does not change an install that nx self install made, so always run nx self install. Both the CLI and the Claude Code plugins must be updated, and updating only one leaves hooks unfixed: from v7.54.0 one of the conexus plugin's Bash hooks runs code from the installed CLI, and the other three live in the plugin. The entry also did not mention two things. First, the plugin as installed before the rename to conexus, nx@nexus-plugins, keeps running its own hooks until you uninstall it (/plugin uninstall nx@nexus-plugins). Installing conexus does not remove it. Second, the sn plugin was affected too, from v4.33.1 through v6.1.0. The published advisory, GHSA-mc84-6gjq-vm2p, carries the authoritative list of affected versions and the steps to take. No CVE id has been assigned.

Fixed

  • Subagents get their injected context again (nexus-fow78, nexus-8t9w8, nexus-xn9ut). The SubagentStart hook's T2 memory scan downloaded every entry of a project, content included, to render the five titles it shows: 3,840 rows and about 21 MB for the nexus project, about 9.5 s against a 9 s hook limit. When the harness killed the hook, the subagent started with no injected context at all. The scan now lists only the rows it renders and fetches content only for the entries it shows, and each HTTP call's timeout is clamped to what is left of the scan's budget. The measured scan dropped to about 5 s before the engine side landed. With engine-service-v0.1.138 the list is bounded at the engine too, and the overflow line reports the exact number of rows not shown. The bead-close gate's bd state-stamping now shares one time budget across all the beads it stamps, so a slow bd fails fast and the gate's ALLOW or DENY decision survives, instead of being lost when the harness kills the hook.
  • nx upgrade --dry-run takes seconds, not minutes (nexus-5z0us). Its name-vs-embed-dim advisory re-listed the whole tenant once per collection. On a 97-collection tenant that took 8 min 6 s with no output. It now takes 14 s, and prints a line saying what it is doing. The same per-collection re-listing is gone from nx catalog doctor's chunk-size, dedup and zombie scans, the T3 orphan classifier (nx doctor --t3-vs-catalog, nx catalog verify, reconcile-stale), nx collection backfill-hash --all and nx t3 reidentify --all-collections. A collection whose count cannot be read is reported as unreadable, never counted as zero.
  • Scratch notes flagged for keeping now survive a session's end (nexus-mgu1k). The SessionEnd hook flushed flagged T1 scratch entries to T2 from a detached process that started after the MCP server had already cleared the session lease, so the flush failed on every run and flagged entries were lost. The MCP server now drains flagged entries to T2 during its own shutdown, before it clears the lease and revokes its token; every network step of that teardown is bounded at 5 s. The SessionEnd flush remains as a backstop for sessions that crash.
  • The background-agent ledger stops recording phantom reports (nexus-uzntx). Claude Code's internal side-queries fire SubagentStop events with no agent type and no transcript; each one wrote an orphan REPORT row (92% of one session's ledger) and paid a synchronous network call. Those events now project nothing, and a dropped event logs as tuple_projection_dropped_orphan rather than as a successful projection.
  • The plugin as installed before the rename to conexus is flagged until it is uninstalled (nexus-qocnk). The rename hint used to say only to install conexus and reload. It now leads with /plugin uninstall nx@nexus-plugins, at MCP startup and in nx upgrade. nx doctor gains a "Retired Claude Code plugin" row that fails while nx@nexus-plugins is still in Claude Code's plugin registry, whichever plugin the session runs. docs/desktop-deployment.md now lists the uninstall as a required step.
  • nx tuple rd no longer hides rows past the first page (nexus-sh1ea). It returned the oldest rows, one engine read stops at 300, and nothing said more existed, so a board read showed stale posts. New flags: --since CREATED_AT,ID resumes from a cursor, --all pages through every row oldest first, --newest keeps the latest -n rows, and --max-rows bounds both (default 10,000). A truncated read prints a stderr line beginning nx tuple rd: truncated, naming the resume cursor. The RDR-184 expectations census now counts past 300 (measured: 1,530 reports, where it used to report 300).
  • Deleting a note after an import deletes it (nexus-r3cdg). nx store delete and MCP store_delete looked up a chunk's owner across the whole catalog. After an .nxexp import into another collection a chunk had two owners, the lookup called it ambiguous, and the command printed "Deleted 0 entries" at exit 0 with the note still live. The lookup is now scoped to the chunk's own collection.
  • nx store put of identical content under a second title makes a second document (nexus-enej7). It used to rewrite the first document's source URI to the new title, leaving document A unresolvable by its own title and document B never registered. MCP store_get by title now consults the catalog only when chunk metadata has no match.
  • nx store import -c <subject> resolves a bare subject (nexus-8o7ae) like every other store verb, instead of refusing it with a model mismatch on a bge install.
  • A failed index run no longer leaves its stored chunks unreadable (nexus-0ntxj). Every index path writes chunks before their manifest rows, and engine v0.1.137 hides chunks that have no owning document. A run that failed between the two writes therefore hid a document's chunks until someone repaired it with nx catalog reconcile. A document's first failed run now rebuilds its manifest from the chunks that landed. A failed re-index of a complete document keeps its previous manifest.
  • Read commands against a stopped or failing service print one line (nexus-sis0m.1). nx search, nx store get and nx collection list printed a 46-line traceback when the local service was stopped, and nx store list --docs printed "Collection not found" at exit 0. They now print one line naming the service, the failed request (method, host and route) and the remedy.
  • Exit codes that told callers the wrong thing (nexus-sis0m.2, nexus-sis0m.3, nexus-sis0m.4). nx doctor refuses more than one mode flag, because it only ever ran the first. nx doctor --check-mcp-logs fails when it scanned zero files. nx collection merge-candidates exits 1 with its "unavailable" message, including under --format json. nx rdr preamble rdr-verdict exits 2 on a malformed call. nx t3 gc counts only the manifest-less note chunks it actually protects and refuses an unknown collection name. nx store list offers a next page only after a full page.
  • nx collection info answers in seconds and says where its numbers come from (nexus-ktsa1, nexus-7q8zg). It paged every chunk to find the latest index time, which took 5 min on a 48,553-chunk collection. It now reads the catalog. It prints the catalog row's model, and the name's model too when a model-encoding name disagrees with the row. A read failure prints the error instead of "unknown". nx collection list and info show stored chunks next to live ones when they differ, and nx collection shape skips quarantine siblings instead of telling you to merge them.
  • A renamed collection's old name no longer shows as a live collection (nexus-sis0m.3, client half). After nx collection rename A B, nx collection list showed A as live with 0 chunks and nx collection info A said "not found". The list now hides a retired name that holds no chunks, labels one that still holds chunks superseded -> B, and shows every row with --all; info A names B as the successor. The engine half (B inheriting A's owner and source URIs) ships with the next engine tag.
  • nx doctor --check-search stopped failing every real tenant (nexus-dhvzx). One canned query was irrelevant to most collections, so 58 of 111 read threshold_drop and the check exited 2. Each collection is now probed with one of its own chunks, and the check judges that chunk's real neighbours, excluding the chunk itself by id. A collection whose nearest neighbours all fall past its threshold is a warning row naming the distance, the threshold and the sample, not an exit 2.
  • MCP tools say what they did (nexus-zdzm5, nexus-bm8dd). traverse caps ids at 300 with an ids_truncated key; one two-hop walk had returned 1,196 ids (86 KB). search refuses limit above 300 instead of returning 301 rows. A read of an unregistered collection says the collection does not exist in this tenant, instead of advising a write endpoint. A depth-2 catalog traverse lists each edge once. Structured search and query results carry the catalog tumbler, where they had returned empty strings (nexus-kkqv7), so plan steps that read $stepN.tumblers get real seeds.
  • Lexical search changes which rows you get, not just their scores (nexus-zdzm5, nexus-p5ei5). Lexical matches usually have the worst vector distance in their window, and only the server reranker scores rows on text. CLI and MCP searches now rerank whenever lexical is on, and a degraded rerank is reported.
  • query with a catalog filter searches every corpus by default (nexus-p5ei5). query(content_type="rdr") answered "No documents found" because the default corpus was still knowledge. With follow_links, graph hops still cross corpora.
  • Catalog MCP search by file_path or author covers the whole catalog (nexus-3bafq). It filtered one page, so on a 23,334-row catalog anything past about row 21 read as absent. Free-text search with filters no longer drops them at the engine's 50-row cap. The ghost-by-title reconcile reads every full-text match, where a same-titled ghost past row 50 had caused a duplicate document.
  • nx_answer honours budget_seconds inside a retrieval step and marks every error return as a non-answer (nexus-5ezgn, nexus-f9kxd). A slow search could run 324 s against a 120 s budget; a step is now cut at the remaining budget. Planner failures, invalid input and zero-evidence returns now carry the planner_error, error or no_evidence answer shape, instead of bare prose a caller could mistake for an answer.
  • Search is faster and ranks more consistently (nexus-w032x, nexus-2yshe). The catalog reverse lookup's manifests are reused instead of being fetched twice, and topic labels are fetched concurrently. The same-topic boost is now a fraction of the result window's distance spread, not a flat 0.1. On voyage-code-3 the flat boost was a whole window, so the nearest chunk could fall off the page, and results changed with -m.
  • nx search line numbers point at the right file (nexus-zdzm5). Prose results get line numbers from the printed file. When the printed file opens, the line comes from that file, never from another document. The silent-zero hint never suggests a threshold below the top distance.

Changed

  • The test suite provisions its ONNX models on a fresh host without prompting, honours XDG directories, and shards substrate ports by worker count (nexus-wvyvn). CI routes the engine release's mac-arm64 legs to a self-hosted runner, and the PG-bundle cache seed covers both mac cache keys (nexus-yd9po, nexus-n7q28). None of this changes what ships.