Skip to content

release: conexus 7.37.0 (paired with engine-service-v0.1.109) - #1521

Merged
Hellblazer merged 46 commits into
mainfrom
release/v7.37.0
Sep 8, 2026
Merged

release: conexus 7.37.0 (paired with engine-service-v0.1.109)#1521
Hellblazer merged 46 commits into
mainfrom
release/v7.37.0

Conversation

@Hellblazer

Copy link
Copy Markdown
Owner

Paired with engine-service-v0.1.109 (tagged on 2839915), REQUIRED_ENGINE_VERSION 0.1.109. RDR-204 Phase 1: collections stop encoding metadata in their names. NON-additive pairing: the engine deploys only after this client tag.

Changed

  • Collection registration is profile-driven; every store write path registers before its first write and self-heals once on the engine's not-registered 422 (nexus-f5wwx, nexus-ft04v.34).
  • nx index resolves the write model from the install-scoped profile (nexus-ft04v.34).
  • Store writes require a subject collection; placeholder subjects are refused (nexus-0fw11).
  • The aspect worker's reclaim_stale sweep backs off on an idle queue (nexus-e0ypa).

Fixed

  • nx doctor redacts every exception render (nexus-x75kg).
  • Health checks list nexus.embedding_profile among the RLS tenant tables.
  • Plugin hooks run under an interpreter that can import nexus (nexus-4ti7e; shipped early as plugin-v7.36.1-1).

Engine v0.1.109

catalog-036, hygiene-002, hygiene-003 (nine changesets); seven stub-insert paths retired; register-422 with field-named refusals; ghost sweep and dormant marking at first request. Pre-tag battery on 2839915: Java suite 2697/0/0/7, --shakeout PASSED, --candidate-migration PASSED delta=9 invariants EXACT, published-client write gate EXPECTED-INCOMPATIBLE under f5wwx (7.36.1 < 7.37.0).

Client battery on this branch runs once the engine publishes (its cold-acquire legs need the published v0.1.109); the verdict table follows in a comment before merge.

…e stale window, and reset on a hit (nexus-e0ypa)

The aspect worker daemon swept the queue every 30s for a 300s stale window:
2,880 empty reclaim requests a day on an idle box, the dominant empty poll on
the edge after the claim_batch backstop landed. The sweep cadence now doubles
on consecutive empty sweeps, capped at the stale window (a row cannot become
reclaimable faster than that), returns to the 30s base on any reclaim, and
holds on a failed sweep. A live queue keeps the RDR-173 review-M1 promptness
the fixed 30s was chosen for; an idle one costs about a tenth of the traffic.
next_reclaim_wait is the pure rule; the loop reads _current_reclaim_wait.
…nt names the base and the idle worst case (nexus-e0ypa)

Review of 53923fe: the backoff was invisible in the daemon's own logs, so
aspect_worker_daemon.reclaim_wait_changed now records previous and next wait
whenever a sweep moves it. The constructor comment still called the cadence a
fixed 30s; it now names the base and states the idle-then-strand worst case
(threshold plus threshold, the same as a flat threshold cadence).
…er names (nexus-0fw11)

Sam's decision 2026-09-08. The MCP store_put tool and nx store put defaulted
collection to "knowledge", and that default is what minted the
knowledge__knowledge collection (1464 chunks) the collection rules forbid.
store_put's collection argument is now required, nx store put's --collection
is required, and every write resolution through t3_collection_name refuses
the placeholder subjects docs/collections.md Rule 1 names (default,
knowledge, notes, tmp, test) as a bare or two-segment name, with an error
that names the rule. Reads keep their defaults so existing placeholder
collections stay reachable, and a full four-segment conformant name still
passes through untouched, the deliberate escape for what already exists.
nx memory promote and the indexers share the resolver and get the same
refusal. tests/test_corpus.py pins the placeholder set to the docs' list.
Test fixtures that wrote to the placeholder now write to fixture-subject.
…r and never blocks a recovery-bundle restore (nexus-0fw11)

Critique of 86cd65e: only nx store put caught PlaceholderCollectionError;
nx memory promote, nx index pdf/md and nx dt index raised a traceback. The
exception is now a click.ClickException as well as a ValueError, so every
command sharing the resolver prints the message and exits 1 with no
per-command catch; the store put catch is removed. The recovery-bundle
import reduces a recorded conformant name to its two-segment base before
resolving for write, which refused the two live placeholder collections
(docs__default, knowledge__knowledge); t3_collection_name gains
allow_placeholder, set only there, since a restore is not a new mint. The
docs sentence names every writer the refusal covers. The full suite's other
placeholder writers (attribution, scenario journeys, store enrich, index
pdf normalization, dt index) move to a subject name.
… interpreter, so hooks that import nexus resolve instead of falling through (nexus-4ti7e)

Measured on the 7.36.1 install: Homebrew's python3.13 has no nexus, so
rdr_hook's two resolution imports raised, the structlog warning meant to
name the cause could not be written either, and every SessionStart reported
a fully indexed tree as NOT indexed. The owna8 fix shipped inert. The
runner now execs <tools>/current/bin/python (NX_TOOLS_DIR or
~/.local/share/nexus/tools) when it exists, then the named probes, then
python3.
…tructlog, so an interpreter without the package still names the cause (nexus-4ti7e)
… that cannot run; the stdlib-only docstrings say when the interpreter lacks nexus (nexus-4ti7e)
…over the generation; the NOT-indexed verdict names a resolution failure on stdout and in <config>/rdr_hook.log (nexus-4ti7e)
…he verdict print is guarded, drives main() in its test, and caps the failure text (nexus-4ti7e)
…s archive/* branches, pushed from the source, as a real clone of github does (rdr-120's archive-only citation 122feaf)
…rot lint, which walks history a depth-1 single-tag checkout does not have (nexus-4ti7e cut)
…hannel until the client release carries the wheel half (nexus-0fw11)

The plugin cut refuses an entry whose bead also touches wheel content: the
reference.md row says collection is required, which is true only once the
wheel with the refusal ships. Reverted from develop so plugin-v7.36.1-1 can
cut; the row re-lands with the client release that carries 86cd65e.
…en, not a Voyage one, so the mode-declarations census reads no cloud claim (nexus-0fw11)
…enant, evicting the registry (nexus-ft04v.6)
…v.2)

catalog-036-3 creates nexus.embedding_profile with ENABLE + FORCE +
tenant_isolation; the health check's _RLS_TENANT_TABLES and its test
mirror must carry every RLS table or the changelog cross-walk fails.
…the seven stub-insert paths are retired (nexus-ft04v.7)
…s lifecycle_state; a differing model is a 422 naming the profile's value (nexus-ft04v.8)
…ase changeset (nexus-ft04v.4, nexus-ft04v.5)
…ction-attribute constraints (nexus-ft04v.4, nexus-ft04v.7)

Six full-suite passes in the primary over the RDR-204 Phase 1 range
(2350 run, 47 failures, 219 errors at the start; 250 classes green at the
end). Test fixtures that inserted a bare catalog_collections row or wrote
chunks, topics or aspects without registering now go through
PgContainerHelper.insertCollection, which derives constraint-satisfying
attributes from the name and is guarded for pre-catalog-036 migration
depths; HTTP-driven tests spend the per-tenant boot sweep (bead .3) with
one authenticated request before registering, since the sweep deletes a
registered-but-chunkless row. RawSqlGateTest's per-file ceilings drop as
raw fixtures converted (1191 -> 1129 total).

Production, all consequences of the constraints:
- CatalogRepository.importCollection / importCollectionsBatch write
  lifecycle_state; the unreachable stub-upgrade DO UPDATE arm becomes
  DO NOTHING (an import never overwrites a live row).
- upsertCollection refuses a registration with no content_type with the
  same 422 shape as the profile conflict.
- hygiene-003: the ninth stub-insert path, in the assign_from_chashes
  SQL functions, is retired with a fail-loud guard.
- hygiene-004: hygiene-002-2's gc_quarantine_orphans rewrite had dropped
  catalog-033-2's gc_audit producer and sample_limit clamp; restored.

Two tests changed contract with the design: the foreign-tenant
assign-from-chashes case now expects the not-registered error under RLS,
and the blank-stub import tests became existing-row-untouched tests.
…s body; hygiene-004 squashed away (nexus-ft04v.4)
…ons carry content_type, fixtures send the effective model (nexus-f5wwx)
…on-attribute walk (hygiene-002-1, nexus-ft04v.4)
…ha and names both client halves (nexus-ft04v.8, nexus-f5wwx)
…, the user-level commit recorder's ambient writes (nexus-4ti7e cut battery)
…fixture collections before writing; the engine no longer auto-registers on a chunk write (nexus-ft04v.7)

Found by --shakeout Phase F on the v0.1.109 candidate: the rerank fixture's
store-put returned 422 'collection ... is not registered'. The same script
runs in engine-service-release.yml, where it would have burned the tag;
the local-service gate's vector leg writes the same way and would have
failed the paired client release's battery. SMOKE_EXPECTED 11 -> 12.
…exus-f5wwx, fixed in 7.37.0; sh9v2's 7.7.0 ack was stale against every current client (nexus-ft04v.7)
…tered 422 like every other write path (nexus-f5wwx)
…st is order-independent (nexus-x75kg)

The fan-out floor census renders whatever the T3 handle raised:
"fan-out floor census: UNAVAILABLE (RuntimeError: HTTP 401: invalid
api_key SUPERSECRET)". health.py's reachability probe redacted its 401
text (nexus-8ooxn / nexus-hcy4w); nothing else in doctor.py did, and the
census is a default-sweep check, so any engine 401 whose body echoes the
rejected credential printed it. Every doctor site that puts an exception
into output or a log field now goes through _exc_detail(), which is
redact_credentials() plus the optional class-name prefix those sites
already carried.

Why it only showed under -n auto: the test patches
http_vector_client._get but not make_t3, so the census reaches the
patched transport only when the process-global _vector_client_instance
is already constructed - which an earlier test in the same xdist worker
does once the engine substrate is up. Alone, construction fails first
with ManagedServiceUnreachable and the message carries no secret. The
doctor tests now reset that singleton on both sides, so they neither
inherit it nor export one, and a new test patches make_t3 directly to
pin the redaction without depending on that accident.

health.py's other exception renders are unchanged - out of scope here.
…he walk completes on the disputed fixture (nexus-ft04v.7, nexus-ft04v.4, nexus-ft04v.8)
…plugin channel until the client release carries the wheel half (nexus-0fw11)"

This reverts commit 29190c7.
… and the acquire probe names a subject collection

- test_changelog_rls_lint: allowlist hygiene-002-1 on nexus.catalog_collections;
  its UPDATEs LEFT JOIN nexus.embedding_profile (FORCE RLS, untoggled), which
  the changeset's own comment shows holds zero rows for every tenant at walk
  time. Published in engine-service-v0.1.109 and walked on the PITR fork.
- test_nexus_config_dir_setattr_lint: the exempt setattr in
  test_health_service_checks.py moved from line 2671 to 2672 (80b3fee).
- write-seam gate: the four tests set NX_LOCAL=1 instead of deleting it. With
  only NX_SERVICE_URL set the client reads as managed and registers a
  knowledge collection as voyage-context-3 (nexus-f5wwx), which the ONNX
  engine's bge-768 profile refuses with 422.
- mcp store_put refuses a placeholder collection before _get_t3(): the
  managed floor probe ran first, so an unstamped or unreachable engine
  masked the nexus-0fw11 refusal (both shard-3 jobs).
- rehearse_acquire.sh: the store put probe passes --collection, required
  since nexus-0fw11; the acquire gate on v0.1.109 failed three checks on
  that usage error, not on the engine.
…cal mode

Same shape as 034043c for tests/db/test_write_seam_gate_integration.py: with
only NX_SERVICE_URL set the client reads as managed and the nexus-f5wwx
registration names voyage-context-3 for a knowledge collection, which the
ONNX engine profile (bge-base-en-v15-768) refuses with 422. The four
combined-query tripwire tests share the vec_client fixture, so they were the
remaining write-seam reds on PR #1521.
…xus-0fw11)

nexus-0fw11 made --collection required and refused the placeholder
subjects, and shipped to develop without a PR; the gate scripts that only
run at release or tag time kept the old invocation. Found by the battery
(fresh-install MVV, step 5) and the --acquire gate (034043c fixed that
one). This sweep covers the rest: fresh-install-mvv.sh (two puts),
data-token-cli-gate.sh, rehearse.sh (the default, --comprehensive and
--stress legs), and published-client-write-gate.sh, whose --collection
knowledge is the refused placeholder once 7.37.0 is the published client
(7.36.1 predates the change).
…their collections before seeding (RDR-204 client half, PR #1521)

The local-service gate's 53 failed + 73 errors traced to two related gaps
left by RDR-204's client-side registration change:

- family A (422 profile mismatch): java_service-backed fixtures export
  NX_SERVICE_* for the client without NX_LOCAL=1, so is_local_mode()
  reads managed and derives voyage-context-3 for a knowledge/code write,
  which the ONNX-only test engine's bge-768 profile refuses. Fixed in
  test_retrieval_drift_gate.py (seeded_client, _service_env) with the
  same NX_LOCAL=1 pin as e08f68c/034043c65. test_xnz0o_commands_
  integration.py and test_catalog_consumer_qnp5s_integration.py instead
  passed an explicit, now-stale voyage-context-3/voyage-code-3 literal to
  register_collection (never overridden by the derivation) -- both fixed
  to the model this ONNX engine actually serves for every content type
  (EmbedderRouter.contentTypeModelTokens' local branch).

- family B/C (not registered / connection refused): every store's
  write_with_registration_retry self-heals via a DEFAULT registrar
  (catalog.factory.make_catalog_writer) that resolves NX_SERVICE_URL from
  the ambient env, not from the fixture's own base_url. A class- or
  module-scoped seed fixture runs before any function-scoped autouse
  fixture (pytest resolves by scope), so at seed time ambient env is
  either empty (connection refused) or points at a different shared
  substrate (registers there, then the real write 422s "not registered"
  against this fixture's own engine). Fixed by pre-registering every
  collection each file's tests actually write to, bound explicitly to
  that file's own service, in test_http_taxonomy_store_integration.py,
  test_http_aspects_stores_integration.py, and
  test_l9hd8_aspect_sql_service_integration.py (whose per-class seed
  fixtures needed the same pin repeated around each class's own writes,
  not just once at module setup, since one class's write could still
  trigger a stale-registration retry with a stale ambient env).
  test_http_chash_integration.py's _seed_chunk posts directly to
  /v1/vectors/upsert-chunks (bypassing the client's self-heal entirely)
  and now registers first under the same bearer the write uses.
  test_data_token_manager_e2e.py registers its collection before
  deliberately breaking the static service token, so the self-mint
  round trip it verifies is never masked by an unrelated registration
  failure under the mint-locked credential.

test_collection_health_dsu5z_integration.py, test_http_telemetry_store_
integration.py, and test_coverage_3cwnx_integration.py were audited and
left unchanged: none of their tests write a collection, so neither
failure mode applies (confirmed by a clean run).
…204 client half, round 2)

Same two families as the first commit, in modules that first commit did
not touch, plus one distinct auth-tenant bug and one genuinely
unreachable non-vacuity constraint:

- tests/db/test_5xn3k_runfence_gate.py: service_env explicitly
  monkeypatch.delenv("NX_LOCAL")'d, reading managed posture and deriving
  voyage-context-3/voyage-code-3 for a docs/code registration. Pinned
  NX_LOCAL=1 (5 tests: 4 direct 422s, one "batch 1 never landed" whose
  background thread was swallowing that same 422 before ever setting its
  landed-event).
- tests/db/test_http_catalog_integration.py,
  tests/db/test_i711w_gap_xfails.py (TestSupersedeCollectionSemantics),
  tests/db/test_i711w_gap_contracts_fresh.py
  (TestItem12CatalogReadsAfterRename): explicit voyage-context-3/
  voyage-code-3 literals passed to register_collection, never overridden
  by the derivation since register_collection only derives on an EMPTY
  kwarg. This ONNX engine's EmbedderRouter.contentTypeModelTokens (local
  mode, verified in service/.../EmbedderRouter.java) maps every content
  type, code included, to bge-base-en-v15-768 -- literals and the
  matching name segments renamed to match. TestItem12's 5 setup errors
  were all the same fixture failing once per dependent test.
- tests/db/test_frecency_enehl_integration.py,
  tests/db/test_indexer_seam_b_integration.py
  (test_store_put_get_roundtrip_ij9hg): same NX_LOCAL posture gap as the
  first commit's family A, in files the first pass's file list didn't
  name. test_indexer_seam_b's sibling
  test_indexer_seam_b_index_search_round_trip deliberately omits
  NX_LOCAL=1 (its own non-vacuity proof requires managed-mode routing to
  activate BEFORE local-mode fallback) -- registered that one collection
  explicitly instead, with an EXPLICIT bge-base-en-v15-768, bypassing the
  ambient-mode derivation the test cannot use, and warmed
  ensure_collection_registered's cache directly (the same test-sanctioned
  pattern as tests/test_store_cmd.py / tests/test_collection_shape.py).
- tests/db/test_http_shape_parity_integration.py: _token_env pinned
  NX_SERVICE_TOKEN but never NX_SERVICE_URL, so a client constructed
  with only base_url (no explicit _token) resolved its OWN token from
  this pin correctly, but ensure_collection_registered's DEFAULT
  registrar resolved the URL from stale/ambient env -- landing on the
  shared T2 substrate while presenting this module's bearer: 401.
  Pinned URL alongside the token (plus NX_LOCAL=1).
- tests/test_indexer_e2e.py test_reindex_self_heals_missing_manifest:
  this file's autouse _legacy_vector_backend pins
  NX_STORAGE_BACKEND_VECTORS=local for local_t3's own in-memory double,
  but the test's own real-engine mirror (seed_manifest_chunks, a bare
  HttpVectorClient()) inherited that same ambient posture, deriving
  minilm-l6-v2-384 (the client-local EF tier) instead of this engine's
  actual bge-768 profile. Pinned service+local posture for the duration
  of that one real-engine write only, restored immediately after.
- tests/db/test_data_token_manager_e2e.py: registration was already
  correctly ordered before the static-token break in the first commit;
  the residual "data_token_mint_failed" events in the full-gate run did
  not reproduce in 2 separate isolated re-runs of this file (3/3 passed
  both times) -- left as diagnosed-but-unreproduced-in-isolation, likely
  full-session state this scoped verification protocol cannot surface.
@Hellblazer

Copy link
Copy Markdown
Owner Author

Release battery, conexus 7.37.0 paired with engine-service-v0.1.109

Tree 034043c (/tmp/nxb-20260908-111745-44701), reds rerun on later commits of this branch:

leg verdict wall s note
artifacts PASSED 171 wheel, stamped jar, linux native candidate
preflight PASSED 188 pins sweep
shakedown PASSED 1701 every fail-capable step green
lsg FAILED then PASSED 938 / 581 53 failed + 73 errors on 034043c, all RDR-204 client-half fixture fallout; 594 passed / 35 skipped / 0 failed on 4bb342d + 2b33f53 + 6b07e56 (nexus-69's sweep, full gate 9m41s)
pkgup PASSED 428 7.36.1 + v0.1.108 -> tree -> converged to v0.1.109
mvv FAILED then PASSED 80 / rerun store put lacked --collection (nexus-0fw11); fixed in 4bb342d, rerun alone: FRESH-INSTALL MVV PASSED
smoke PASSED 86
upshakeout PASSED 51 12/12
genflip PASSED 36
pluginls PASSED 50
shakeout PASSED 217 candidate verb matrix, incremental index, concurrent load
candmig NOT RUN no changeset since engine-service-v0.1.109

Engine: --acquire on published engine-service-v0.1.109 PASSED (bare box, cold acquire, store put + search + doctor clean). PITR-fork walk rehearsal recorded in T2 nexus/rehearsal-v01109-rdr204-phase1-walk-and-ghost-sweep-2026-09-08; findings nexus-snm4y and nexus-ztafa ship as-is by ruling and ride the next engine cut.

Suspect flake, not a fixed defect: test_data_token_manager_e2e self-mint round trip went red once in a full gate run and green in every other run.

@Hellblazer
Hellblazer merged commit 604b4da into main Sep 8, 2026
24 checks passed
@Hellblazer
Hellblazer deleted the release/v7.37.0 branch September 8, 2026 20:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant