Skip to content

Commit 9b6e6f2

Browse files
authored
Merge pull request #1511 from Hellblazer/release/v7.34.0
release: conexus 7.34.0
2 parents 8baea06 + 523c0ad commit 9b6e6f2

50 files changed

Lines changed: 1709 additions & 728 deletions

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.33.0"
14+
"ref": "v7.34.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.33.0"
17+
"version": "7.34.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.33.0"
25+
"ref": "v7.34.0"
2626
},
2727
"description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
28-
"version": "7.33.0"
28+
"version": "7.34.0"
2929
}
3030
]
3131
}

CHANGELOG.md

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

77
## [Unreleased]
88

9+
## [7.34.0] - 2026-09-06
10+
11+
Paired with engine-service-v0.1.106 (`REQUIRED_ENGINE_VERSION` 0.1.106).
12+
13+
### Fixed
14+
15+
- Engine (nexus-hxrcm): `POST /v1/catalog/manifest/write_many` no longer
16+
fails with `deadlock detected` when two calls on one collection overlap.
17+
The metadata-only UPDATE batch orders its row locks by chash, the same
18+
fix class as the multi-row INSERT, and the combined-write refresh retries
19+
on SQLSTATE 40P01. The metadata-only UPDATE on both write paths now takes
20+
the shared sweep gate first, so it waits for a running superseded-chunk
21+
sweep or orphan quarantine instead of racing it on a different lock
22+
order. Six cloud 500s since the v0.1.104 flip; the client-side symptom
23+
was `superseded-chunk sweep skipped ... (sweep_failed)`.
24+
- Storage-service supervisor (nexus-59bah): the heartbeat takes the
25+
per-scope election flock with a budget of one third of the lease TTL
26+
instead of blocking on it. A held flock costs one skipped stamp, logged
27+
as `service_supervisor_heartbeat_election_busy`, and the next tick
28+
retries; a wedged holder can no longer keep the heartbeat loop blocked
29+
past the TTL. `publish`, `relinquish`, and the shutdown marker still
30+
block, so concurrent first claims serialize into increasing generations.
31+
- `nx_answer` (nexus-wj12p, nexus-90gyo, nexus-zy0kj): a grown plan whose
32+
stored question names different identifiers (RDR ids, bead ids, engine
33+
tags, client versions, issue numbers) than the incoming question is no
34+
longer matched; the call falls through to the inline planner. A
35+
retrieval-only or reduce-less result is classified as a non-answer,
36+
recorded `success=False`, never grown, and returned as a
37+
`[non-answer: <shape>]` notice carrying the retrieved chunk refs; the
38+
envelope gains `answer_shape`. `nx answer-runs` reports the same shapes
39+
as `degenerate/non_answer/<shape>` for pre-fix runs too.
40+
41+
### Removed
42+
43+
- `nx index repo --force-stale` and the collection pipeline-version stamp
44+
(nexus-ebu0c). Since RDR-155 every collection handle is a service stub
45+
with no metadata, so the stamp had been a silent no-op; since
46+
nexus-4jj40 the engine skips embedding for unchanged chunk text, so
47+
`--force` after a chunker change re-embeds only what the chunker
48+
changed. `--force` is the one lever. The `nx doctor` "pipeline versions"
49+
row is gone with it.
50+
51+
### Documentation
52+
53+
- README § Updating and Getting Started § Upgrading are cut to the two
54+
commands, the do-not-reinstall-with-uv rule, and a pointer for pre-PG
55+
installs.
56+
957
## [7.33.0] - 2026-09-06
1058

1159
Paired with engine-service-v0.1.105 (`REQUIRED_ENGINE_VERSION` 0.1.105).

README.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,24 @@ The `nx` CLI provides direct access to all storage tiers, indexing, search, the
7272
## Updating
7373

7474
```bash
75-
nx self install # 1. update the code — PRESERVES your extras (e.g. [local])
75+
nx self install # 1. update the code (keeps your extras, e.g. [local])
7676
nx upgrade # 2. converge the data
7777
```
7878

79-
Upgrading nexus is: update the code, then run `nx upgrade`. That single trigger converges everything else — it brings the package, engine, and process preconditions current, then walks one ordered ladder. The T2-schema and ChromaDB→Postgres+pgvector substrate-move rungs (and the chunk-identity / embedder-era migrations that were co-resident inside the substrate move) retired with the Chroma + client-SQLite migration machinery at RDR-155 P4b; the RDR-180 chash rekey is the ladder's sole remaining data rung today, detecting, converging, and verifying before it records completion, resumable and idempotent, with your existing store left byte-untouched as a rollback target. There is nothing to sequence by hand and no era to know for any install that has already reached the PG substrate (6.0+): `nx doctor` reports the pending rung read-only, `nx upgrade` walks it, and a dormant-but-migrated install converges the same way a current one no-ops. A **pre-PG install** (5.x, or 6.x that never migrated off ChromaDB) is a separate two-hop — the Chroma-era migration machinery retired at RDR-155 P4b, so hop through `conexus==6.18.1` first (`nx upgrade` there migrates ChromaDB → Postgres+pgvector, copy-not-move), then upgrade forward to current; see [Getting Started § Upgrading an existing install](docs/getting-started.md#upgrading-an-existing-install-skip-this-if-this-is-your-first-install) for the exact commands. Rollback is always yours to invoke and never automatic.
79+
Both steps, every time. Step 1 installs a new generation beside the one you
80+
are running and repoints `current`; nothing is swapped under a live process,
81+
so it is safe with Claude Code sessions open and the service up. Step 2
82+
converges the package, engine, and service, then walks any pending data
83+
rung. `nx doctor` shows what is pending; `nx upgrade --dry-run` previews.
8084

81-
**Step 1 installs a new generation; it does not replace the one you are running.** `nx self install` builds a fresh tree beside the existing ones under `~/.local/share/nexus/tools/`, repoints the `current` symlink and rewrites the `~/.local/bin` shims. Nothing is swapped underneath a live process, so it always succeeds with Claude Code sessions open, the storage service up, and an `nx index` in flight — those holders keep running from their own tree and converge at their next spawn. The install source and your extras travel in the generation's own receipt, so a `[local]` install stays a `[local]` install. Older generations are reaped once nothing is bound to them (the last three are kept by default; `--keep N` to change that).
85+
Do not upgrade with `uv tool install conexus` or `--force`: that resets the
86+
environment and drops `[local]`, which downgrades the embedder and makes
87+
search return nothing. If you did, `nx self install` repairs it.
8288

83-
**On a box still using the older uv-tool layout, `nx self install` now CONVERGES it** (7.20.0, nexus-gu9zo). It builds a generation beside the existing uv tree, flips `current`, takes over the `~/.local/bin` shims, and registers the old tree so live holders keep running from it until nothing is bound to it. Your extras bridge across from the uv receipt, so a `[local]` install stays `[local]`. Before 7.20.0 the command refused here and pointed at a repo script most users do not have — no packaged install could reach the generation layout at all. `nx doctor`'s *Generation layout* row tells you which layout you are on. On either layout, **do not** upgrade with `uv tool install conexus --force` / `uv tool install conexus`: that *resets* the install and **drops `[local]`**, silently downgrading your embedder from 768-dim to 384-dim, which dimension-mismatches existing 768-dim collections and makes search return nothing. On a uv-tool box, recover with `uv tool install --reinstall "conexus[local]"`. On a generation box, that same command rebuilds a `[local]`-less uv tree beside your install (a plain `uv tool install` leaves the nexus shims alone — "Executable already exists"; `--force` takes them, and then every spawn resolves through uv's tree instead of `current`). Since 7.21.0 this is self-repairing: the next `nx upgrade` (the SessionStart hook runs it) or `nx self install` rewrites the shims back to `current`, registers uv's tree for reap, and — if uv's tree is the newer version, i.e. you meant to upgrade — builds a generation at that version from your own receipt, so `[local]` survives. Never run `uv tool uninstall conexus` on a generation box: it deletes the nexus shims at those paths; a reaped tree is what makes uv refuse to rebuild.
89+
After `/plugin update`, run both steps so the CLI matches the plugin.
8490

85-
When you update the **Claude Code plugin** (`/plugin update`), run **both** upgrade steps above (`nx self install` then `nx upgrade`) so the CLI stays in lockstep with the plugin version.
91+
Installs that never left ChromaDB (5.x, or 6.x never migrated) take a
92+
different path: [Getting Started § Upgrading from a pre-PG install](docs/getting-started.md#upgrading-from-a-pre-pg-install).
8693

8794
### Something broken?
8895

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.33.0",
3+
"version": "7.34.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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ 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.34.0] - 2026-09-06
8+
9+
- Plugin version aligned with conexus 7.34.0. No plugin-side changes.
10+
711
## [7.33.0] - 2026-09-06
812

913
- Plugin version aligned with conexus 7.33.0.

conexus/PENDING_RELEASE.md

Lines changed: 1 addition & 1 deletion
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.33.0)
32+
## Awaiting the next release or plugin cut (pinned: v7.34.0)
3333

3434
(none)

docs/cli-reference.md

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ nx index repo ./my-project
8686
|------|-------------|
8787
| `--frecency-only` | Update frecency scores only; skip re-embedding (faster, for re-ranking refresh). Mutually exclusive with `--force` |
8888
| `--re-embed` | Requires `--force`. Also forces a Voyage re-embed of every chunk, even one whose text is unchanged (the pre-nexus-4jj40 `--force` behaviour). Without it, `--force` alone re-chunks and re-sends every file; the server's own existence-partition still skips the billed embed call for a chunk whose text is byte-identical to what is already stored, refreshing only its metadata (e.g. a chunker classification change). Reserve `--re-embed` for a genuine embedding-model change |
89-
| `--force-stale` | Re-index only if collection pipeline version is outdated (smart force — skips current collections) |
90-
| `--since-head` | Index only the git delta since the last indexed commit (`owners.head_hash`): changed files re-index, deleted files' docs prune, full-tree passes (staleness pulls, housekeeping, misclassified/orphan prunes, rg cache rebuild) are skipped. Worktree-inclusive. Falls back to a full index when no usable base exists; ignored with `--force`/`--force-stale`. The per-commit hook's fast path |
89+
| `--since-head` | Index only the git delta since the last indexed commit (`owners.head_hash`): changed files re-index, deleted files' docs prune, full-tree passes (staleness pulls, housekeeping, misclassified/orphan prunes, rg cache rebuild) are skipped. Worktree-inclusive. Falls back to a full index when no usable base exists; ignored with `--force`. The per-commit hook's fast path |
9190
| `--corpus [docs\|knowledge]` | Corpus routing for auto-classified prose/PDF files (default: `docs`). `docs` routes to `docs__` collections; `knowledge` routes to `knowledge__` collections instead |
9291
| `--on-locked {skip,wait}` | Behavior under contention (default: `wait`). Per-repo advisory lock (two `nx index repo` on the same repo): `skip` exits immediately, `wait` blocks. Catalog-write fairness (RDR-146): when a foreground interactive catalog write is pending, `skip` defers this run's catalog writes to the next idempotent pass, `wait` proceeds after a bounded yield. `NX_WRITE_PRIORITY=interactive|batch` overrides the tty-based priority of a run's catalog writes. |
9392
@@ -3607,6 +3606,20 @@ every row is split three ways:
36073606
- `error` — a plan-execution or binding error before/without any
36083607
completed step.
36093608
- `other` — anything else (harness probes, unclassified rows).
3609+
- `non_answer/<shape>` (nexus-90gyo / nexus-zy0kj) — reachable at ANY
3610+
`step_count`, like the nexus-x79ne well-formed shapes: the run
3611+
retrieved evidence but never reduced it. `<shape>` is one of
3612+
`hydration_dump` (the body is a `store_get_many` payload),
3613+
`extractions_only` (a bare `operator_extract` payload),
3614+
`ranking_only`, `operator_payload` (filter, check, verify or groupby
3615+
payload), `retrieval_only` (a search/query/traverse result payload),
3616+
`listing`, `empty`. A row
3617+
written by a post-fix client carries the `[non-answer: <shape>]`
3618+
notice as its `final_text` and is named by that prefix; a pre-fix row
3619+
(the 2026-09-06 run 706 / plan 488 class) is named from its body by
3620+
the same classifier `nx_answer` uses (`nexus.plans.answer_shape`).
3621+
Before this class existed these rows counted as executed-ok and the
3622+
plan-grow path saved them as successes.
36103623
36113624
`--json` carries `executed_ok_count`, `executed_failed_count`,
36123625
`degenerate_count`, `degenerate_breakdown: {class: count}`, plus a
@@ -3678,6 +3691,22 @@ predicted `usd`/`ms`/`basis`, and which one was chosen are written to
36783691
predicted_cost_usd, basis}`; `None` on any path that never reaches Step
36793692
1's hit branch — force_dynamic, a plan-miss, or an error before Step 1).
36803693
3694+
The envelope also carries `answer_shape` (nexus-90gyo): `"answered"` when
3695+
`final_text` is a synthesized answer, otherwise one of `hydration_dump`,
3696+
`extractions_only`, `ranking_only`, `operator_payload`, `retrieval_only`, `listing`, `empty`.
3697+
On a non-answer `final_text` is a one-line `[non-answer: <shape>]` notice
3698+
(the raw payload is never returned as prose), the `chunks` list still
3699+
carries what was retrieved, the run is recorded as a failure, and no plan
3700+
is grown from it (nexus-zy0kj). `None` on paths that never classified:
3701+
errors, misses, the single-step fast path, a continuation handoff.
3702+
Grown plans are additionally gated on identifier agreement at match time
3703+
(nexus-wj12p): a grown plan whose originating question named identifiers
3704+
(RDR/JDR ids, bead ids, engine tags, client versions, GH/PR numbers) is
3705+
offered only to an intent naming exactly the same set, so a question
3706+
about RDR-197 can no longer be answered by a plan grown for RDR-176; the
3707+
drop is logged as `plan_match_grown_literal_disagreement_dropped` and
3708+
the call falls through to the inline planner.
3709+
36813710
### `--derive-budget` (RDR-196 .p3a, nexus-nyry9.19)
36823711
36833712
Derives the default `budget_usd` from recorded **post-flip** history and

0 commit comments

Comments
 (0)