Skip to content

v7.67.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 01:26
· 2966 commits to main since this release
1c668e7

Pairs with engine-service-v0.1.142. The engine carries changeset catalog-044 (a code, docs or rdr collection's owner_id comes from its documents, with a one-off repair of existing rows at boot, nexus-6pbwx), the shutdown crash fixes around ONNX Runtime (nexus-o5xyx), the reason code on the unregistered-collection 422 (nexus-bgvnx), descending tuple reads (nexus-kp5q3), and a registered collection owner that later registrations no longer replace (nexus-7tys2). The managed service has run engine-service-v0.1.141 since 2026-09-29, which already carries nexus-7tys2, nexus-kp5q3, nexus-bgvnx and the model-load half of nexus-o5xyx; v0.1.142 adds catalog-044 and the inference half. Local installs get the new engine with this release. The engine-dependent client changes fall back on an older engine: nx tuple rd --newest pages oldest first as before, and the client recognises an unregistered collection by the error's wording.

Fixed

  • A repo collection's owner_id is its documents' owner segment (nexus-6pbwx, engine changeset catalog-044). A legacy repo collection registered under a name slug (code__arcaneum-2ad2825c__...) kept the slug as its owner, so collectionOwnerRoot and collections_by_owner missed it. For code, docs and rdr collections the engine now sets the owner to the hyphenated owner segment of the tumbler of the documents in the collection (1-15), through triggers on catalog_collections and catalog_documents. Only a slug-like owner, or the segment of a curator-type owner, is replaced; a repo owner already in place stands, a collection with no documents keeps what it was registered with, and knowledge collections keep their subject. Existing rows change at engine boot: catalog-044-3 rewrites the owner of every such row that has documents. On the cloud estate that is docs__default__voyage-context-3__v1 (owner default becomes the segment of the curator that holds its documents); local installs may have more. nx collection shape still reports that collection as default-corpus, which now keys on the name as well as the owner. A repaired slug collection can now share an owner with the conformant collection of the same repo; collectionForTuple prefers the conformant name at equal version.
  • An nx-mcp that borrowed another server's T1 lease survives that server's exit (nexus-k9sec). The survivor of a /mcp reconnect overlap shares the owner's session token, and the owner's teardown revokes it, so the survivor's scratch calls returned 401 for the rest of the session. It now re-mints its own token for the same session id under the existing mint lock and becomes the owner, revoking and clearing on its own exit. Two survivors of one departed owner mint once. A crashed owner's leftover lease, which still names the dead token, is no longer re-adopted, and an owner whose own token 401s recovers the same way, bounded per process by a 30s cooldown and a cap of 3 recovery mints per 10 minutes (two processes can mint up to 6 in that window). An owner's exit leaves a successor's lease and token alone. The owner's clean exit no longer deletes the session's scratch rows: it emptied the pad before the flagged-row drain ran, so flagged notes were lost on that path, and it deleted the pad under a surviving borrower. The engine's sweep (24h TTL, run every 6h) reaps unclaimed rows, as it already did after a SIGTERM exit, so unflagged scratch now outlives a clean exit by up to about 30h. Two narrow races stay open and are documented in JDR-001: a recovery racing SIGTERM can leave a token to expire on its TTL, and a same-id process starting between an owner's lease clear and its revoke can be revoked with it.
  • nx store import never replaces an existing document's chunk list (nexus-wbfpw.40). An import that resolved to a live document wrote the file's chunks as that document's whole manifest, so importing an older export over a re-put note hid the correction from search (RDR-192 live(c)) and left it for the reaper; legacy doc_id exports did the same batch by batch. Now a document that already owns chunks keeps its manifest, and the file's chunks it does not own stay unowned. The command reports how many and names up to 5 documents; to restore a document from a file, delete it first, then import.
  • A later registration no longer overwrites a collection's owner (nexus-7tys2, engine). Each process's first write to a collection registers it with the owner segment parsed from its name, and the engine replaced the stored owner_id with that value every time, so a legacy name's slug overwrote a real owner. The engine now keeps a registered owner; only a row that still carries the tenant-id placeholder takes the incoming one. Rows overwritten before this engine stay as they are. A client older than 7.66.0 that renames a collection now leaves the old name's owner on the new row, because that client repaired the owner by registering again after the rename; 7.66.0 and later send the new owner with the rename.
  • The engine no longer crashes when it is stopped during embedding (nexus-o5xyx.1, nexus-o5xyx.3). A SIGTERM while ONNX Runtime loaded a model or ran inference let ORT's own shutdown hook free its environment under the live call, and the JVM died with SIGSEGV and a crash report instead of exiting 143. Exit now waits for model loads to finish (at most 3 s, NX_ORT_INIT_SHUTDOWN_WAIT_MS) and cancels running inference first. An embed refused or cancelled during shutdown answers a retryable 503 on every embed route; write_many and embed_fill had answered 500. Measured on macOS arm64 under embed load: 0 crash reports in 100 signals, against 7 in 80 with neither fix and 5 in 100 with only the model-load fix. A JVM (jar) launch now writes its crash report to ~/.config/nexus/logs/hs_err_<pid>.log, the supervisor's exit warning names it, and each launch keeps the newest 5 (nexus-o5xyx.2).
  • Writes no longer land under a renamed collection's old name (nexus-wwuzp). A long-lived process (an MCP server, a watcher) that had written to A before another process ran nx collection rename A B kept writing chunks under A's retired row. The registration cache now checks an entry again after 60 s and after a rename or supersede, and a process checks before its first write. A write to a retired name fails with an error that names its successor; nx index repo stops the same way and names the remedy.
  • nx tuple rd --newest returns the real newest rows (nexus-kp5q3). It paged the subspace oldest first up to --max-rows and kept the tail, so a subspace past that bound exited 3 without its newest rows. It now makes one descending read. Asking for more than the engine's read cap (300 by default) returns the newest cap-many rows with a note naming the cap, exit 0.
  • Two notes with identical text are both visible and deletable (nexus-sis0m.5). Identical text is one stored chunk by design, and several surfaces saw only the note that wrote it last. nx store list --docs and MCP store_list(docs=True) now list both documents. nx store delete --title A deletes document A, keeps the shared chunk for its twin and names the twin; it had printed "Deleted 0 entries" at exit 0 with A still live. It also finds a ghost document whose chunk the twin wrote last. A search or query hit and MCP store_get name every live document that holds the chunk, where they named the last writer, which could be a deleted note, and store_get by title finds a note whose text another note wrote later. nx store export and nx store import -c resolve a two-segment legacy name as the other store verbs do, instead of reporting a false model mismatch on a bge install.
  • nx hooks status and nx doctor agree on git hook state (nexus-sis0m.6). status called a hook owned while doctor reported its stanza stale; status now adds , stanza stale and names nx hooks update. A hook with a begin sentinel and no end sentinel is reported as malformed with a hand-repair instruction, and install, uninstall and update refuse to touch it; nx hooks update had reported it refreshed and changed nothing. nx upgrade's hook refresh counts malformed hooks apart from skipped repos. The path verbs print one line instead of a traceback outside a git repository or for a missing path.
  • nx self install says when it cannot reach the package index (nexus-12pyx). An unreachable index, such as a corporate index off VPN, printed only uv's raw output, which read as a nexus fault. It now names the index URL (without credentials, query or fragment), where that host is set, that the install was not changed, and the remedy: reach the index, or run once with UV_INDEX_URL=https://pypi.org/simple. A certificate failure or a configured proxy gets proxy and certificate advice instead.
  • The "nx-mcp is not connected" prompt warning is gone (nexus-qxyqz). It read a session-keyed marker that a /mcp reconnect, /clear, /resume or a nested claude -p server could remove, so it warned about live servers. Nothing acted on it, and it cost 270 to 300 ms on every prompt. The plugin no longer registers the check, and nx-hook mcp-connect-check stays as a silent no-op for older plugins. A reconnecting server's teardown no longer deletes its successor's marker.
  • The bead-close gate checks the beads the command closes (nexus-t0dt8, nexus-qhskl, nexus-nmzsg). It took every nexus-* token in the command as a close target, so a trailing grep or an &&-joined bd comment blocked real closes; it now reads the close's own arguments when it can show that the rest of the command closes nothing. A child id such as nexus-x.11 was cut at the dot, so a sibling's or the parent's review marker satisfied it; ids keep their suffix and coverage needs the exact id. When the gate cannot verify (T1 unreachable, or bd close $VAR), it asks for permission instead of passing an advisory that the auto-mode classifier could approve.
  • The subagent git-write guard no longer trips on paths that contain "git" (nexus-0r5l8). A subagent Bash command with ~/git/nexus, .git/hooks, git-workflow.md or nexus-git-policy.py next to a word like add or reset was denied. git now arms the guard only as the command itself (git or git-<word>, optionally with an .exe, .cmd, .bat, .com or .sh suffix); every catalogued bypass still denies.
  • A failed background-agent ledger write logs a warning (nexus-8he82). A refused or unreachable projection write logged at info as a by-design skip. It now logs tuple_projection_write_failed at warning, and the SubagentStart and SubagentStop projections log their outcome, which they had discarded.
  • Citations inside inline code are not counted (nexus-0qqcu). nx doc render and nx doc check-grounding counted a citation quoted in backticks as a real one.

Added

  • nx doctor reports a lock held too long (nexus-sis0m.7). The new tuples.lock_held row warns when a claim on a lock/<resource> subspace has been renewed past four times the template's lease bound (one hour), naming the subspace and the claimant. tuples.oldest_unclaimed could not see a claimed lock.
  • For the Windows WSL2 appliance (RDR-218, not yet released), the storage-service supervisor can serve on a fixed port (NX_SERVICE_FIXED_PORT, refused loudly on a collision) and write a handoff file for the Windows client (NX_APPLIANCE_HANDOFF_FILE) that carries a mint-only credential, never the root bearer (nexus-ijue9.29). No other install sets either variable, and nothing changes there.

Changed

  • The sn plugin auto-approves only Serena's read tools (nexus-2lf1v). It approved every Serena tool, which skipped both your prompt and the auto-mode classifier for the file and memory writers and for jet_brains_debug, which runs arbitrary Groovy or Java in the IDE's JVM. Writers, jet_brains_debug, query_project, onboarding and restart_language_server now go through Claude Code's normal permission flow, as Edit and Write do; reads and Context7 are still approved. To keep editing through Serena without prompts, add the writers you use by name to permissions.allow. Subagents are told that a Serena write now prompts, and to use Edit or Write rather than retry a denied one.
  • The client recognises an unregistered collection by the engine's reason code instead of the error's wording, so a change of wording cannot break the rewrite of that error or the registration retry (nexus-bgvnx).
  • Internal: engine-release ABI-floor checks (nexus-zwn92, nexus-cd8b7), scripts/ci_status.py folding (nexus-wqvv9), the fresh-install gate's PyPI propagation retry (nexus-qfeez), test isolation and flake fixes (nexus-4h20a, nexus-vj72t, nexus-q0nwd, nexus-oy689), RDR-192 recall gates (nexus-wbfpw.11, nexus-wbfpw.36), and RDR-221 accepted. None of this changes what ships.