Repository navigation
v7.67.0
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_idis its documents' owner segment (nexus-6pbwx, engine changesetcatalog-044). A legacy repo collection registered under a name slug (code__arcaneum-2ad2825c__...) kept the slug as its owner, socollectionOwnerRootandcollections_by_ownermissed it. Forcode,docsandrdrcollections the engine now sets the owner to the hyphenated owner segment of the tumbler of the documents in the collection (1-15), through triggers oncatalog_collectionsandcatalog_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, andknowledgecollections keep their subject. Existing rows change at engine boot:catalog-044-3rewrites the owner of every such row that has documents. On the cloud estate that isdocs__default__voyage-context-3__v1(ownerdefaultbecomes the segment of the curator that holds its documents); local installs may have more.nx collection shapestill reports that collection asdefault-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;collectionForTupleprefers the conformant name at equal version. - An
nx-mcpthat borrowed another server's T1 lease survives that server's exit (nexus-k9sec). The survivor of a/mcpreconnect 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 importnever 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; legacydoc_idexports 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_idwith 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_manyandembed_fillhad 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 Bkept 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 repostops the same way and names the remedy. nx tuple rd --newestreturns the real newest rows (nexus-kp5q3). It paged the subspace oldest first up to--max-rowsand 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 --docsand MCPstore_list(docs=True)now list both documents.nx store delete --title Adeletes 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 MCPstore_getname every live document that holds the chunk, where they named the last writer, which could be a deleted note, andstore_getby title finds a note whose text another note wrote later.nx store exportandnx store import -cresolve a two-segment legacy name as the other store verbs do, instead of reporting a false model mismatch on a bge install. nx hooks statusandnx doctoragree on git hook state (nexus-sis0m.6).statuscalled a hookownedwhiledoctorreported its stanza stale;statusnow adds, stanza staleand namesnx hooks update. A hook with a begin sentinel and no end sentinel is reported as malformed with a hand-repair instruction, andinstall,uninstallandupdaterefuse to touch it;nx hooks updatehad 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 installsays 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 withUV_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
/mcpreconnect,/clear,/resumeor a nestedclaude -pserver 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, andnx-hook mcp-connect-checkstays 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 trailinggrepor an&&-joinedbd commentblocked 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 asnexus-x.11was 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, orbd 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.mdornexus-git-policy.pynext to a word likeaddorresetwas denied.gitnow arms the guard only as the command itself (gitorgit-<word>, optionally with an.exe,.cmd,.bat,.comor.shsuffix); 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_failedat 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 renderandnx doc check-groundingcounted a citation quoted in backticks as a real one.
Added
nx doctorreports a lock held too long (nexus-sis0m.7). The newtuples.lock_heldrow warns when a claim on alock/<resource>subspace has been renewed past four times the template's lease bound (one hour), naming the subspace and the claimant.tuples.oldest_unclaimedcould 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,onboardingandrestart_language_servernow 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 topermissions.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
reasoncode 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.pyfolding (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.