v7.20.0
Five instruments that reported absence when the truth was failure. Each said
"nothing here" — no MinerU, no search results, no stored row, no existing
document, no generation layout — while the real answer was that something had
broken, or that the question had been asked in a place it could not be
answered. nx self install also gains the route that makes the side-by-side
generation layout reachable from a packaged install at all.
Added
nx self installconverges a legacy uv-tool box (nexus-gu9zo). It now
distinguishes three sites rather than two: a generation (build the next one),
a legacyuv tool install conexuslayout (CONVERGE it), and a genuine dev
checkout (refuse, namingscripts/reinstall-tool.sh). Before this, the
command refused everywhere that was not already a generation, so it could
upgrade a generation box and never create the first one — and it told
packaged users to run a repo script they have no copy of. Measured on a fresh
uv tool install conexusof 7.19.0: uv-owned symlinks, nogen-*, no
current, no<tools>directory at all. No packaged install of any age had
the layout; every generation box in existence was checkout-driven, and
commit 047dd80's migration had no caller anywhere in the tree. The converge
never uninstalls: the legacy tree is registered as a pseudo-generation and
reaped by a later, separate pass once nothing holds it, and extras bridge
across from the legacyuv-receipt.toml— the only path by which[local]
survives the move.
Fixed
- doctor's MinerU check asked "is it up", not "will it be there"
(nexus-far1c). The check encoded the pre-nexus-1qdb9 model where MinerU was
a long-lived server, so a correctly-idle on-demand service read as a hard
failure, and its failure text asserted a fallback the module owning that
fallback prevents. It now asks whether the server can come up when needed;
reachability is informational, and an unprovisioned box still emits no row. - A threshold drop is not an empty collection (nexus-1obui).
search's
zero-hit branch returned the nexus-uro6c diagnostic only on the prose path,
so every programmatic caller —nx_tidy, the plan-runner step contract,
anything readingids/distances— could not tell "the threshold dropped
every candidate" from "the collection is empty on this topic". The
structured=Truepayload now carries it additively, and_tidy_prefetch
names all six failure modes instead of collapsing them to "nothing to
consolidate", so a T3 outage mid-tidy is no longer indistinguishable from a
clean empty topic. memory_putreads the row back before claiming it stored (nexus-zra63).
A returned row id proves the call returned, not that a row exists: a store
that silently no-ops hands back the same shape as one that wrote. The write
is now verified by re-reading and comparing, with three outcomes — verified,
failed, andStored (UNVERIFIED)when the read path itself is unavailable.
That third state is the point: a check that reports success when persistence
is unavailable is the same defect one level up.- A curator-side reindex no longer forks a repo-owner document
(nexus-tqudo).nx index reporegisters under a repo owner while the
doc_indexer family resolves a curator owner, andby_file_pathis
owner-scoped — so the curator-side lookup could never see the repo-owner row,
structurally, and minted a second catalog Document for one physical file.
--forcewas never causally involved. The lookup now checks the file's repo
owner before minting. - One rule resolves uv's tool directory (nexus-orhp5). Four separate rules
answered "where is uv's tool dir" and disagreed — a substring test, a
UV_TOOL_DIR-only reader, two shell-outs touv tool dir, and a hardcoded
~/.local/share/uv/tools/....install_layout.uv_tool_root()is now the
single Python answer, implementing uv's own precedence (UV_TOOL_DIR>
$XDG_DATA_HOME/uv/tools>~/.local/share/uv/tools, measured against uv
0.8.0), and the substring test became a real containment check. This stopped
being cosmetic when the weakest of those rules began routing install
convergence.
Documentation
nx self install's three sites, the converge route and its live-holder
guarantee are documented indocs/cli-reference.md; README's upgrade section
no longer tells uv-tool users to runuv tool upgrade conexusinstead, which
would have kept them on the legacy layout permanently.