Skip to content

Commit 8baea06

Browse files
authored
Merge pull request #1510 from Hellblazer/release/v7.33.0
release: conexus 7.33.0
2 parents dd9406e + 40081dc commit 8baea06

266 files changed

Lines changed: 19116 additions & 4416 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/marketplace.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@
1111
"source": "git-subdir",
1212
"url": "https://github.com/Hellblazer/nexus.git",
1313
"path": "conexus",
14-
"ref": "v7.32.0"
14+
"ref": "v7.33.0"
1515
},
1616
"description": "Self-hosted three-tier knowledge management with 13 specialized agents, plan-centric retrieval via nx_answer, semantic search, and RDR decision tracking for Claude Code.",
17-
"version": "7.32.0"
17+
"version": "7.33.0"
1818
},
1919
{
2020
"name": "sn",
2121
"source": {
2222
"source": "git-subdir",
2323
"url": "https://github.com/Hellblazer/nexus.git",
2424
"path": "sn",
25-
"ref": "v7.32.0"
25+
"ref": "v7.33.0"
2626
},
2727
"description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
28-
"version": "7.32.0"
28+
"version": "7.33.0"
2929
}
3030
]
3131
}

.claude/skills/release/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ away.
9999
### 1. Run unit + integration suite
100100

101101
```bash
102+
tests/e2e/release-battery.sh # nexus-mfage: every E2E gate below (and 1b, 6, 6b, 6c) in ONE parallel run — artifacts built once, per-leg logs, verdict table, exit 1 on any red; the unit suite still runs SERIAL to it
102103
uv run pytest # unit suite (no API keys)
103104
tests/e2e/local-service-gate.sh # integration incl. the local-service functional gate
104105
tests/e2e/migration-rehearsal/run.sh --package-upgrade # ONE-engine convergence MVV (nexus-cfgo9)

.github/workflows/local-service-gate-nightly.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,13 @@ jobs:
247247
# shape — @pytest.mark.integration, self-provisioning against the
248248
# shared engine substrate, zero other CI wiring — so it joins the
249249
# same allowlist rather than inventing a second gate.
250+
env:
251+
# nexus-a2qhz: these files self-provision against the engine
252+
# substrate and write to it; the production-write guard refuses a
253+
# dev-checkout write without a reason-bearing opt-in (31 setup
254+
# errors on the 2026-09-06 run, the first after the guard landed).
255+
# Never production: the endpoint is the run's own throwaway engine.
256+
NX_ALLOW_PROD_WRITE: "nightly ungated-integration step: self-provisioned throwaway engine substrate on the CI runner (nexus-a2qhz)"
250257
run: |
251258
set -euo pipefail
252259
uv run pytest \

.github/workflows/scheduled-failure-watch.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,14 @@ jobs:
162162
# --paired-deploy's `gh release view` publication check. This leg
163163
# only needs outbound HTTPS to the public managed endpoint plus the
164164
# `contents: read` permission above for actions/checkout.
165-
run: uv run python scripts/check_engine_release_floor.py
165+
#
166+
# --no-record-deploy: since nexus-nx3l5 the bare post-tag verify
167+
# refuses (exit 3) unless it records the deployed-engine-version
168+
# tracker or is told why it cannot. This runner holds no conexus
169+
# checkout, so there is no STEP-6 report here to record from; the
170+
# release box records the tracker. Without the opt-out this job
171+
# was red every day from 2026-08-30 while every substantive check
172+
# (pin current, cloud current, source current) passed.
173+
run: >-
174+
uv run python scripts/check_engine_release_floor.py
175+
--no-record-deploy "GitHub runner: no conexus checkout holds the STEP-6 gate reports; the release box records the tracker"

AGENTS.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ uv run pytest -m integration # E2E (requires .env from .env.example)
1818
uv sync && scripts/reinstall-tool.sh && nx --version # after edits
1919
```
2020

21-
Unit tests use the in-process `InMemoryVectorClient` (`nexus.db.inmemory_vector_store`) + bundled ONNX MiniLM — no API keys or network; engine-substrate tests self-provision a local service (`ensure_engine`/`mint_test_tenant` in `tests/conftest.py`) or skip. **After any pull/rebase touching `service/`, run `scripts/build-gate-jar.sh`** — the substrate's freshness gate rejects a stale/unstamped jar and the whole suite errors at setup. Test-authoring directives (scenario journeys, lint bucket, contract-suite patterns, parametrize rules) live in [`tests/AGENTS.md`](tests/AGENTS.md).
21+
Unit tests use the in-process `InMemoryVectorClient` (`nexus.db.inmemory_vector_store`) + bundled ONNX MiniLM — no API keys or network; engine-substrate tests self-provision a local service (`ensure_engine`/`mint_test_tenant` in `tests/conftest.py`) or skip. **After any pull/rebase or edit touching `service/` (a comment in a Java file or a changelog XML counts: the gate is mtime-keyed), run `scripts/build-gate-jar.sh`** — the substrate's freshness gate rejects a stale/unstamped jar and every substrate-backed test errors at setup, lint-marked ones included, so a suite run beside a jar rebuild reports a wall of setup errors that is not a test failure. Never backdate mtimes to get past it; rebuild. Test-authoring directives (scenario journeys, lint bucket, contract-suite patterns, parametrize rules) live in [`tests/AGENTS.md`](tests/AGENTS.md).
2222

2323
## Architecture at a glance
2424

@@ -238,11 +238,15 @@ A green here proves only that no requirement was present in the snapshot the
238238
releaser took — not that none was missed. The snapshot is one developer's
239239
clone (see `docs/contributing.md` § Step 0b KNOWN LIMITATION, nexus-2zmfw).
240240

241-
1. **Run the full release test battery.**
241+
1. **Run the full release test battery.** Step 0 is the pin sweep: `scripts/pins-preflight.sh` (about four minutes: lint bucket, the non-lint pin tests, wire-contract pairing, ruff on src, continuing past failures) so every stale ratchet, ledger, parity pin and reference-rot surfaces in ONE report before the first hour-long gate, instead of one per gate run (2026-09-06: the pattern was "expected fail, bump the pin, rerun for an hour, find the next one"). Then run the whole battery to completion collecting reds; fix once; rerun only the reds.
242+
`tests/e2e/release-battery.sh` (nexus-mfage fix B) runs the whole gate group below in ONE invocation: leg 0 builds every artifact once (`tests/e2e/migration-rehearsal/build-artifacts.sh`: wheel, stamped dev jar, linux native candidate, plus a manifest keyed on the working tree's identity) and runs the pin sweep; then every gate runs in one parallel group (`--max-parallel`, default 4), each consuming the artifacts by manifest (`run.sh --artifacts`, `NX_GATE_ARTIFACTS`, `NEXUS_SANDBOX_HOME`), each in its own log with its verdict line captured verbatim and timed; the throughput-baselined shakeout leg runs alone afterwards. Reds never stop it; one table at the end; a leg with no verdict line is MISSING, never passed. Consumers refuse artifacts whose manifest tree identity is not this checkout's, so a dirtied tree rebuilds rather than reusing (nexus-mbeke). The serial commands below remain the per-leg reference and are what the driver runs.
242243
```bash
243-
uv run pytest # unit suite (no API keys)
244+
tests/e2e/release-battery.sh # the whole battery, parallel, ~30 min on this box
245+
scripts/pins-preflight.sh # step 0: every cheap pin at once
246+
uv run pytest -n auto && uv run pytest -m lint # unit suite and the lint bucket (two runs)
244247
tests/e2e/local-service-gate.sh # integration incl. the local-service functional gate
245248
tests/e2e/migration-rehearsal/run.sh --package-upgrade # ONE-engine convergence MVV (nexus-cfgo9)
249+
tests/e2e/migration-rehearsal/run.sh --candidate-migration # REQUIRED when the tree carries a changeset: --package-upgrade and fresh-install-mvv both converge to the PINNED engine, so only this leg walks the tree's own changesets over a populated existing store (nexus-z0ylb)
246250
```
247251
All must pass. Bare `uv run pytest -m integration` is not enough on its own — the local-service round-trip family self-provisions inside `local-service-gate.sh` and otherwise skip-gates silently on an absent service (the 74/516 ambient-degradation class the gate was built to end). Integration is excluded from CI — this battery is your last line of defense before tag-push.
248252
1b. **Run the fresh-install MVV.** `./tests/e2e/fresh-install-mvv.sh` (nexus-nolqs). The VIRGIN-journey gate — every other E2E gate tests the upgrade axis from a populated install. The unit suite then pinned the SQLite opt-out backend (since retired at RDR-158), which is how the 2026-07-21 fresh-box defect class (f1itv/e9ru2/kmo9h/r5f3c/9xfx5) shipped unseen; today the suite pins the engine substrate instead, and the MVV still covers the virgin journey no unit test walks. Builds the wheel under test, then on a scrubbed-env virgin HOME: local init (engine + portable PG + bge-768), ladder converged at init, store put + index md with ENGINE-CATALOG registration asserted (not just T3 chunks), semantic search returns both, doctor with zero ✗ and warnings checked against the allowlist, and — leg 9 of 10 (nexus-utpuw.19) — a generation install on that same virgin HOME. That last leg is the only fresh-journey coverage of the `<tools>/gen-<stamp>` + shim path, and the only proof the built WHEEL actually ships `nexus/_install/*.sh`: every other test of `packaged_install_dir()` runs against an editable checkout, where that path exists because the repo does. Must end `FRESH-INSTALL MVV PASSED — ... (LOCAL WHEEL, release-battery layer)`. **This is the pre-tag LOCAL WHEEL layer only** — it resolves dependencies from this checkout's `uv.lock`/wheel metadata, not PyPI, so it cannot reproduce a defect that lives in dependency RESOLUTION (nexus-l2ku5: `mcp>=1.0` unbounded resolved `mcp` 2.0.0 fresh from PyPI on a `uv tool install`, killing both MCP servers for 4 days while every gate — this one included — ran pinned to the dev venv and saw nothing). `./tests/e2e/fresh-install-mvv.sh --published [X.Y.Z]` (nexus-796zn) installs the PUBLISHED artifact via `uv tool install conexus[==X.Y.Z]` in the identical scrubbed sandbox (never touches the live `~/.local/share/uv`/`~/.local/bin`) and is the POST-publish SHAKEDOWN layer (T2 `nexus/shakedown-playbook` §2 S1) — there is nothing on PyPI yet to install at pre-tag time, so it does not belong in this numbered step; run it after a tag publishes.

CHANGELOG.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,74 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
88

9+
## [7.33.0] - 2026-09-06
10+
11+
Paired with engine-service-v0.1.105 (`REQUIRED_ENGINE_VERSION` 0.1.105).
12+
13+
### Changed
14+
15+
- Search fan-out (nexus-d9xt2): `search_cross_corpus` issues one combined
16+
`/v1/vectors/search` per embedding-model group instead of one call per
17+
collection, with a per-collection candidate floor of `n_results` times
18+
the corpus overfetch multiplier, capped at 300 and split into sub-batches
19+
above it. A 71-collection `corpus=all` search drops from 13 to 19 s to
20+
about 6 s at shipped defaults; `--corpus knowledge` from 6.7 s to under
21+
1 s. A collection whose combined call fails with a dimension mismatch is
22+
retried alone and then excluded for the process; transient errors are
23+
retried per call. The CLI skips the collection-stats round trip for
24+
conformant `--corpus` names and existence-checks them via the cheap
25+
collections endpoint, keeping the named "no collections match" warning.
26+
Known residual: a group that splits can swap near-tied results at ranks
27+
7 to 10 (rdr, 9 collections); tracked as nexus-atylb.
28+
- Local PG provisioning (nexus-cbo4a batch 9): the provisioner ensures the
29+
`nexus` schema and two SECURITY DEFINER functions
30+
(`nexus.ensure_vector_extensions_relocated()` and its unrelocate
31+
companion, EXECUTE granted to `nexus_admin` only) on every provision and
32+
daemon start; the engine's `search-path-001` changeset calls the function
33+
mid-walk to move `vector` and `pg_trgm` into the `nexus` schema exactly
34+
once. Nothing in the client relies on the PostgreSQL session
35+
`search_path` any more.
36+
- Storage-service supervisor (nexus-59bah): every heartbeat tick is timed;
37+
a tick slower than 3 s logs `storage_service_heartbeat_slow` and a tick
38+
past the lease TTL logs `storage_service_heartbeat_missed_ttl` at ERROR
39+
naming the stalled phase, instead of the lease silently lapsing.
40+
- Engine launch (nexus-9gaj7): every JVM launch line carries
41+
`-Duser.timezone=UTC`; the engine also pins and asserts UTC in-process at
42+
boot.
43+
- Doctor `--check-engine-activity` sends the resolved bearer token on
44+
`GET /v1/status` (nexus-grzai).
45+
- RDR-203 P3: `nx_answer` records its run, steps and outcome in one
46+
`POST /v1/telemetry/nx_answer_runs/complete` when the engine advertises
47+
`nx_answer_run_complete_supported`, falling back to the three legacy
48+
writes otherwise; `use_count` on a plan now bumps exactly once per call.
49+
- `nx doctor` and the T2 telemetry client record the capability census
50+
split by orchestrator and subagent scope (nexus-gjv9b PART 3).
51+
52+
### Added
53+
54+
- `nx agents install worktree-developer` (nexus-uympf): generates
55+
`~/.claude/agents/worktree-developer.md` from the installed plugins, the
56+
sn `examples/worktree-developer.md` frontmatter and activation preamble
57+
(private `serena-wt` Serena rooted at the worktree) followed by the
58+
conexus `developer` agent body verbatim, with `_shared/` links rewritten to
59+
the installed conexus directory. `--check` exits 1 when the file lags the
60+
plugins and `nx doctor` warns on the same drift.
61+
- Release tooling: `scripts/pins-preflight.sh` (every cheap ratchet, ledger,
62+
parity and reference-rot check in one pass before any long gate) and
63+
`tests/e2e/release-battery.sh` (nexus-mfage: artifacts built once by tree
64+
identity, the E2E gates run concurrently with per-leg logs and a verdict
65+
table; the gate group measured 25 min wall against 71 min serial).
66+
67+
### Removed
68+
69+
- The JSONL rotation machinery behind `capability_census.jsonl` and
70+
`routing_log.jsonl` (nexus-gjv9b PART 3). Both writers moved to engine
71+
tables in 7.32.0, so the rotation and tail-dedup had no caller. Existing
72+
files, including an already-rotated `.1` generation, stay readable by
73+
`nx hook routing-stats` without `--from-store`; nothing writes to them any
74+
more.
75+
- `scripts/collapse_rdr_registrations.py`, never run (nexus-ph718).
76+
977
## [7.32.0] - 2026-09-05
1078

1179
### Removed

conexus/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "conexus",
3-
"version": "7.32.0",
3+
"version": "7.33.0",
44
"description": "Self-hosted three-tier knowledge management with plan-centric retrieval (nx_answer), specialized agents, semantic search, and RDR decision tracking for Claude Code.",
55
"author": {
66
"name": "Hal Hildebrand",

conexus/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ All notable changes to the conexus plugin are documented here.
44
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
55
Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [7.33.0] - 2026-09-06
8+
9+
- Plugin version aligned with conexus 7.33.0.
10+
- conexus: `agents/developer.md`'s Beads Integration section no longer tells
11+
the agent to close beads or commit the beads file, matching its Completion
12+
Protocol (nexus-yhcxi); `worktree-developer` inherits it at the next
13+
`nx agents install`.
14+
- conexus: `hooks/scripts/routing/_lib.py` drops the dead JSONL append and
15+
rotation machinery; `log_routing_event` writes only to the engine's
16+
`routing_events` table, as it has since 7.32.0 (nexus-gjv9b PART 3).
17+
718
## [7.32.0] - 2026-09-05
819

920
- Plugin version aligned with conexus 7.32.0.

conexus/PENDING_RELEASE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ mechanize, it matters enough to ship.
2929
---
3030

3131

32-
## Awaiting the next release or plugin cut (pinned: v7.31.0)
33-
32+
## Awaiting the next release or plugin cut (pinned: v7.33.0)
3433

34+
(none)

conexus/agents/developer.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,8 @@ You are an expert software developer who adapts to any language and build system
154154

155155
- Check /beads:ready for available work before starting
156156
- Update bead status when starting: /beads:update <id> --status=in_progress
157-
- Close beads when complete: /beads:close <id>
158-
- Create new beads for discovered work: /beads:create
159-
- Always commit .beads/issues.jsonl with code changes
160-
161-
157+
- Record discovered work as a note on the bead you hold, or hand it back; do not file beads for it
158+
- Do NOT close the bead and do NOT commit `.beads/issues.jsonl`: the caller owns close and commit behind the stacked-review gate (see § Completion Protocol)
162159

163160
## Completion Hand-Back (the review gate is the caller's standing job, not a per-turn reminder)
164161

0 commit comments

Comments
 (0)