Skip to content

Commit 24ef3ff

Browse files
authored
Merge pull request #1361 from Hellblazer/release/v6.3.1
release: conexus 6.3.1
2 parents 2d83a0a + 57fb3b4 commit 24ef3ff

84 files changed

Lines changed: 6530 additions & 1315 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": "v6.3.0"
14+
"ref": "v6.3.1"
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": "6.3.0"
17+
"version": "6.3.1"
1818
},
1919
{
2020
"name": "sn",
2121
"source": {
2222
"source": "git-subdir",
2323
"url": "https://github.com/Hellblazer/nexus.git",
2424
"path": "sn",
25-
"ref": "v6.3.0"
25+
"ref": "v6.3.1"
2626
},
2727
"description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
28-
"version": "6.3.0"
28+
"version": "6.3.1"
2929
}
3030
]
3131
}

.github/workflows/engine-service-release.yml

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,13 +423,36 @@ jobs:
423423
steps:
424424
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
425425

426-
- name: Build PG + pgvector bundle and package .txz
426+
# nexus-m8au7: PG_VERSION + PGVECTOR_VERSION are pinned constants that
427+
# rarely change across tags, yet every tag recompiled both from source
428+
# (~10-20 min/arch). Cache the COMPILED PREFIX keyed on everything that
429+
# determines its content: versions, arch, builder image, and the build
430+
# script itself (the script does the macOS relocatability fixup — a
431+
# script change MUST invalidate the cache, or a stale bundle would ship
432+
# the exact 2026-07-01 dyld-abort class again). On a hit the compile is
433+
# skipped; packaging, the relocation gate, signing, and upload still run
434+
# per release, so the one-cosign-identity contract and per-release
435+
# acquisition URLs are unchanged, and the relocation gate stays the
436+
# safety net against a stale/poisoned cache entry.
437+
# restore-ONLY (review finding): tag-scoped cache saves can never be
438+
# restored (tags only read default-branch caches), so a save here is
439+
# pure quota waste against the repo's 10GB budget and can evict the
440+
# legit main-scoped entries. Only pg-bundle-cache-seed.yml saves.
441+
- name: Restore compiled PG bundle cache
442+
id: pg-bundle-cache
443+
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
444+
with:
445+
path: bundle
446+
key: pg-bundle-${{ matrix.target.arch }}-${{ matrix.target.runner }}-pg${{ env.PG_VERSION }}-pgvector${{ env.PGVECTOR_VERSION }}-img-${{ matrix.target.image || 'native' }}-${{ hashFiles('scripts/build_pg_bundle.sh') }}
447+
448+
- name: Build PG + pgvector bundle (cache miss only)
449+
if: steps.pg-bundle-cache.outputs.cache-hit != 'true'
427450
env:
428451
MANYLINUX_IMAGE: ${{ matrix.target.image }}
429452
run: |
430453
set -euo pipefail
431454
bundle="$GITHUB_WORKSPACE/bundle"
432-
mkdir -p "$bundle" dist
455+
mkdir -p "$bundle"
433456
if [ -n "$MANYLINUX_IMAGE" ]; then
434457
# linux: build inside manylinux_2_28 so the binaries' glibc floor is
435458
# 2.28 (broad compatibility), exactly as ci.yml's CA-3 gate builds them.
@@ -445,6 +468,32 @@ jobs:
445468
# applies MACOSX_DEPLOYMENT_TARGET). GH macOS runners have no Docker.
446469
BUNDLE_PREFIX="$bundle" bash scripts/build_pg_bundle.sh
447470
fi
471+
472+
- name: Package .txz
473+
run: |
474+
set -euo pipefail
475+
bundle="$GITHUB_WORKSPACE/bundle"
476+
mkdir -p dist
477+
# Cache-hit sanity: a restored prefix must actually contain the PG
478+
# toolchain; an empty/partial restore fails loud here rather than
479+
# shipping a hollow .txz (the relocation gate below would also catch
480+
# it, but this points at the cache instead of at relocation).
481+
if [ ! -x "$bundle/bin/initdb" ]; then
482+
echo "::error::bundle/bin/initdb missing — cache restored a hollow prefix or the build did not run"
483+
exit 1
484+
fi
485+
# nexus-u30zm (critique Critical): a cache hit skips the build
486+
# script's verify_and_mark(), which is the only place contrib
487+
# completeness was asserted — a partial restore that kept initdb
488+
# and vector but lost pg_trgm would otherwise sign + ship broken
489+
# (RDR-155 needs pg_trgm). Mirror verify_and_mark here.
490+
sharedir="$("$bundle/bin/pg_config" --sharedir)"
491+
for ctl in vector pg_trgm; do
492+
if [ ! -f "$sharedir/extension/$ctl.control" ]; then
493+
echo "::error::$ctl.control missing from bundle — contrib set incomplete (cache corruption or build regression)"
494+
exit 1
495+
fi
496+
done
448497
# -C parent + basename preserves the relative bin/ lib/ share/ layout
449498
# relocation depends on (identical to ci.yml packaging).
450499
tar -cJf "dist/$ASSET.txz" -C "$(dirname "$bundle")" "$(basename "$bundle")"
@@ -494,6 +543,10 @@ jobs:
494543
# bare "vector" this assertion originally (incorrectly) expected.
495544
"$root/bin/psql" -h "$sock" -p 59987 -U "$(id -un)" -d postgres -c \
496545
"CREATE EXTENSION IF NOT EXISTS vector" >/dev/null
546+
# nexus-u30zm: pg_trgm must LOAD, not merely exist on disk — the
547+
# cache-hit path has no other executable proof of the contrib set.
548+
"$root/bin/psql" -h "$sock" -p 59987 -U "$(id -un)" -d postgres -c \
549+
"CREATE EXTENSION IF NOT EXISTS pg_trgm" >/dev/null
497550
out="$("$root/bin/psql" -h "$sock" -p 59987 -U "$(id -un)" -d postgres -tAc \
498551
"SELECT extname FROM pg_extension WHERE extname='vector'")"
499552
if [ "$out" != "vector" ]; then
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# nexus-m8au7: seed + keep-warm the compiled PG-bundle cache on MAIN.
2+
#
3+
# WHY THIS WORKFLOW EXISTS — GitHub Actions cache isolation: a run triggered
4+
# by a tag can only RESTORE caches created on the same ref or on the DEFAULT
5+
# branch (main). Caches saved by one engine-service tag run are invisible to
6+
# the next tag, so engine-service-release.yml's cache step can only ever hit
7+
# entries seeded here. Eviction is 7-days-unused; engine tags are often
8+
# further apart, hence the weekly cron keep-warm.
9+
#
10+
# The cache key MUST stay byte-identical to the one in
11+
# engine-service-release.yml (build-publish-pg-bundle job):
12+
# pg-bundle-<arch>-pg<PG_VERSION>-pgvector<PGVECTOR_VERSION>-img-<image|native>-<sha256 of scripts/build_pg_bundle.sh>
13+
# PG_VERSION / PGVECTOR_VERSION are duplicated across ci.yml, the release
14+
# workflow, and here (the pre-existing duplication pattern; the build script
15+
# holds the defaults). Bumping a version in the release workflow WITHOUT
16+
# bumping it here just means a cache miss at the next tag (graceful — it
17+
# compiles as before); the versions live in the key precisely so a stale
18+
# bundle of the WRONG version can never be restored silently.
19+
name: pg-bundle-cache-seed
20+
21+
on:
22+
push:
23+
branches: [main]
24+
paths:
25+
- 'scripts/build_pg_bundle.sh'
26+
- '.github/workflows/pg-bundle-cache-seed.yml'
27+
schedule:
28+
# Weekly keep-warm (Mondays 07:23 UTC — off the hour to dodge cron rush).
29+
- cron: '23 7 * * 1'
30+
workflow_dispatch: {}
31+
32+
permissions:
33+
contents: read
34+
35+
jobs:
36+
seed:
37+
name: Seed PG bundle cache (${{ matrix.target.arch }})
38+
runs-on: ${{ matrix.target.runner }}
39+
timeout-minutes: 40
40+
strategy:
41+
fail-fast: false
42+
matrix:
43+
target:
44+
- { arch: linux-amd64, runner: ubuntu-latest, image: "quay.io/pypa/manylinux_2_28_x86_64" }
45+
- { arch: linux-arm64, runner: ubuntu-24.04-arm, image: "quay.io/pypa/manylinux_2_28_aarch64" }
46+
- { arch: mac-arm64, runner: macos-14, image: "" }
47+
env:
48+
# Pinned identically to engine-service-release.yml + ci.yml (see header).
49+
PG_VERSION: "17.5"
50+
PGVECTOR_VERSION: "v0.8.2"
51+
steps:
52+
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
53+
54+
- name: Restore/claim cache slot
55+
id: pg-bundle-cache
56+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
57+
with:
58+
path: bundle
59+
key: pg-bundle-${{ matrix.target.arch }}-${{ matrix.target.runner }}-pg${{ env.PG_VERSION }}-pgvector${{ env.PGVECTOR_VERSION }}-img-${{ matrix.target.image || 'native' }}-${{ hashFiles('scripts/build_pg_bundle.sh') }}
60+
61+
- name: Compile PG + pgvector (cache miss only)
62+
if: steps.pg-bundle-cache.outputs.cache-hit != 'true'
63+
env:
64+
MANYLINUX_IMAGE: ${{ matrix.target.image }}
65+
run: |
66+
set -euo pipefail
67+
bundle="$GITHUB_WORKSPACE/bundle"
68+
mkdir -p "$bundle"
69+
if [ -n "$MANYLINUX_IMAGE" ]; then
70+
# Identical build environment to engine-service-release.yml:
71+
# manylinux_2_28 for the glibc-2.28 floor.
72+
docker run --rm \
73+
-e PG_VERSION -e PGVECTOR_VERSION -e BUNDLE_PREFIX="$bundle" \
74+
-v "$GITHUB_WORKSPACE:$GITHUB_WORKSPACE" \
75+
"$MANYLINUX_IMAGE" /bin/bash -c '
76+
set -eux
77+
bash "'"$GITHUB_WORKSPACE"'/scripts/build_pg_bundle.sh"
78+
'
79+
else
80+
BUNDLE_PREFIX="$bundle" bash scripts/build_pg_bundle.sh
81+
fi
82+
83+
- name: Sanity-check the prefix before it becomes the cached artifact
84+
if: steps.pg-bundle-cache.outputs.cache-hit != 'true'
85+
run: |
86+
set -euo pipefail
87+
if [ ! -x "bundle/bin/initdb" ] || [ ! -x "bundle/bin/pg_ctl" ]; then
88+
echo "::error::compiled prefix is missing the PG toolchain — refusing to seed a hollow cache"
89+
exit 1
90+
fi
91+
# nexus-u30zm: contrib completeness (mirrors verify_and_mark). The
92+
# actions/cache post-save runs with post-if: success() (verified
93+
# upstream), so an exit 1 here genuinely prevents the seed.
94+
sharedir="$(bundle/bin/pg_config --sharedir)"
95+
for ctl in vector pg_trgm; do
96+
if [ ! -f "$sharedir/extension/$ctl.control" ]; then
97+
echo "::error::$ctl.control missing — refusing to seed an incomplete contrib set"
98+
exit 1
99+
fi
100+
done
101+
echo "prefix ok — cache will be saved on job success"

CHANGELOG.md

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

77
## [Unreleased]
88

9+
## [6.3.1] - 2026-07-04
10+
11+
The shakeout-follow-ups release (epic nexus-c0twp). Everything the 6.3.0 live
12+
shakeout deferred, plus everything the new safety nets caught while building
13+
them. Pins engine-service-v0.1.22 (cloud-gated 2026-07-04).
14+
15+
### Fixed
16+
- `nx t3 gc` no longer crashes in service mode — local event-log emission is
17+
skipped when the catalog is service-backed (live-shakeout finding #4).
18+
- `nx store put` no longer loses aspect extraction on fresh notes: the document
19+
hook chain carries the catalog doc_id, not the T3 chunk id, so the engine's
20+
FK accepts the enqueue (nexus-w8lg1); the enqueue-failure warning is one line
21+
(traceback at debug).
22+
- `nx collection re-embed` and the chash backfill no longer crash on
23+
`db._client` (absent from every production handle post-RDR-155); service-mode
24+
re-embed is same-model-only via the verbatim vector passthrough, and a
25+
cross-model `--to` fails loud with correct guidance instead of silently
26+
re-embedding with the wrong model (nexus-c9xr2, nexus-u37lw, nexus-tcvpn).
27+
- `nx collection rename` rejects same-prefix renames whose embedding-model
28+
segment differs — rename never re-embeds, so the vectors would silently stay
29+
in the old model space (nexus-tcvpn).
30+
- HttpCatalogClient shape drifts vs the local catalog fixed across 9 methods:
31+
`graph`/`graph_many` return typed entries/links (the service-mode links CLI
32+
was silently broken), `collection_health_meta` no longer drops
33+
`stale_source_ratio`, `validate_link` returns error lists,
34+
`legacy_grandfathered` is a bool, `descendants` rows are normalized, and
35+
chunk-address `resolve_chunk` works against the new engine route
36+
(nexus-u26b4, nexus-gc2ze).
37+
38+
### Added
39+
- Bounded per-file indexing concurrency: 2 workers by default when both the
40+
vectors and catalog backends are the HTTP service; `NX_INDEX_CONCURRENCY`
41+
overrides; hook chains and progress callbacks are serialized;
42+
`--debug-timing` gains a `hooks_s` bucket (nexus-cfc72).
43+
- Mechanized runtime return-shape tripwire across the shared
44+
Catalog/HttpCatalogClient surface (72 registered parity entries + audited
45+
exclusions + a completeness gate), with a T3-backed leg for span/chash
46+
resolution (nexus-8y1tm, nexus-oq0tk).
47+
48+
### Changed
49+
- Warm `nx index repo` no longer pays ~1,400–2,800 serial catalog round-trips
50+
per run: one owner-scoped list + local join in both the registration hook
51+
and the frecency map, and unchanged files skip their per-file catalog
52+
update entirely (nexus-dst5h).
53+
- Pinned engine advances to engine-service-v0.1.22: aspect-queue linkage
54+
preserved across doc_id-less re-enqueues, `/resolve_chunk`, metadata
55+
updates MERGE like the local catalog (previously a silent-replace data-loss
56+
class in service mode), and full raw-SQL elimination in the engine
57+
(nexus-nyout, nexus-gc2ze, nexus-ke45f, nexus-xtmtf, nexus-mzuj9).
58+
- Engine release workflow caches the compiled PG bundle across tags
59+
(nexus-m8au7).
60+
61+
962
## [6.3.0] - 2026-07-03
1063

1164
The service-mode seam-closure release (epic nexus-h8rf6). The first systematic

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": "6.3.0",
3+
"version": "6.3.1",
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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
88

9+
## [6.3.1] - 2026-07-04
10+
11+
Plugin version aligned with conexus 6.3.1. No plugin-side changes.
12+
913
## [6.3.0] - 2026-07-03
1014

1115
Plugin version aligned with conexus 6.3.0. No plugin-side changes.
1216

17+
18+
1319
## [6.2.0] - 2026-07-02
1420

1521
Plugin version aligned with conexus 6.2.0. No conexus-plugin-side changes —

docs/cli-reference.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ nx index repo ./my-project
8282
| `--frecency-only` | Update frecency scores only; skip re-embedding (faster, for re-ranking refresh). Mutually exclusive with `--force` |
8383
| `--force-stale` | Re-index only if collection pipeline version is outdated (smart force — skips current collections) |
8484
| `--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. |
85+
86+
Per-file indexing runs with bounded concurrency (6.3.1, nexus-cfc72): 2 workers by default when both the vectors and catalog backends are the HTTP service, 1 otherwise. `NX_INDEX_CONCURRENCY=N` overrides (a warning is logged when it forces concurrency past the backend gate). Progress callbacks and post-store hook chains are serialized; `--debug-timing` gains a `hooks_s` bucket so hook-serialization wait is visible separately from upload time.
8587
| `--no-taxonomy` | Skip automatic topic discovery after indexing |
8688
| `--debug-timing` | Emit an end-of-run per-stage breakdown to stderr (chunking / embed / upload / retry seconds per file, aggregated with percentages). Instruments code, prose, and PDF per-file paths — silent without the flag. Use when investigating "why did indexing take N minutes?" (introduced 4.9.0, nexus-7niu) |
8789
@@ -1094,7 +1096,8 @@ nx collection list
10941096
| `verify NAME` | Existence check + document count |
10951097
| `reindex NAME` | Delete and re-index a collection from its source documents |
10961098
| `backfill-hash [NAME]` | Add `chunk_text_hash` metadata to chunks missing it (no re-embedding) |
1097-
| `rename OLD NEW` | In-place metadata-only rename in the T3 vector store + T2 + catalog cascade (4.8.0, nexus-1ccq) |
1099+
| `rename OLD NEW` | In-place metadata-only rename in the T3 vector store + T2 + catalog cascade (4.8.0, nexus-1ccq). Never re-embeds; same-prefix renames whose embedding-model segment differs are rejected (6.3.1, nexus-tcvpn) |
1100+
| `re-embed NAME --to MODEL` | In-place re-embed for non-CCE Voyage models (nexus-bw65). Service mode: same-model only — the computed vectors ride the verbatim passthrough; a cross-model `--to` fails loud (server-side embedding routes by the collection NAME's model segment; cross-model moves are the migration pipeline's job). `--no-dry-run --yes` to apply (6.3.1, nexus-c9xr2/u37lw) |
10981101
| `audit NAME` | Deep-dive per-collection report: distance histogram, top-5 cross-projections, orphan chunks, hub topics, chash coverage (RDR-087 Phase 4) |
10991102
| `health` | Composite per-collection health table — chunk counts (T3-sourced), staleness, hub score, chash coverage (RDR-087 Phase 3.4) |
11001103
| `delete NAME` | Delete collection (irreversible) |
@@ -1136,7 +1139,7 @@ takes ~25–70 minutes on ChromaDB Cloud. Maintenance-window operation.
11361139
11371140
| Flag | Description |
11381141
|------|-------------|
1139-
| `--force-prefix-change` | Allow a cross-prefix rename (e.g. `code__foo` → `docs__foo`). Embedding-model spaces differ across prefixes, so the renamed collection is query-incompatible with its old clients — use only when you've deleted every downstream reader |
1142+
| `--force-prefix-change` | Allow a cross-prefix rename (e.g. `code__foo` → `docs__foo`) OR a same-prefix rename whose embedding-model segment differs (6.3.1, nexus-tcvpn). Rename never re-embeds, so either change leaves the vectors in the OLD model space under a name claiming the new one — use only when you know the vectors already match the target name (cross-model moves belong to `nx migrate` / guided-upgrade, the RDR-162 vector ETL) |
11401143
11411144
Renames the collection in the T3 vector store via `t3.rename_collection` (a metadata-only update on the pgvector service path — no embedding re-upload, no Voyage cost, no vector egress), and cascades the new name through T2 taxonomy, `chash_index`, and catalog (JSONL + SQLite). Ordering (SIG-8 / nexus-nhyh): the T2 cascade runs FIRST, then the T3 rename, so a partial failure is recoverable: if the T3 rename fails the T2/catalog rows can be re-pointed or the rename re-run; if T2 fails no T3 rename was attempted.
11421145

mcpb/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"manifest_version": "0.4",
44
"name": "conexus",
55
"display_name": "Conexus",
6-
"version": "6.3.0",
6+
"version": "6.3.1",
77
"description": "Three-tier semantic memory + knowledge management for Claude Desktop chat. Persistent code/docs/RDR indexing, plan-centric retrieval via nx_answer, and a daemon-mediated storage substrate that interoperates with the Claude Code plugin and the nx CLI on the same host.",
88
"long_description": "Conexus is the Claude Desktop Extension form of Nexus. Same MCP tools and storage tiers as the Claude Code plugin and the nx CLI, packaged as a .mcpb bundle that uv resolves on first install. On first launch, the host's T2 daemon is auto-installed (LaunchAgent on macOS, systemd user unit on Linux) so the MCP server has a daemon to talk to. State is shared with any other consumer on the same host (Claude Code plugin, nx CLI, Cowork via SDK bridge).",
99
"author": {

mcpb/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "conexus-mcpb"
3-
version = "6.3.0"
3+
version = "6.3.1"
44
description = "Conexus packaged as Claude Desktop .mcpb (Desktop Extension)"
55
requires-python = ">=3.12"
66
dependencies = [
@@ -10,7 +10,7 @@ dependencies = [
1010
# while collections are indexed at 768/1024-dim, so every T3 search hits a
1111
# dimension mismatch and returns zero results. The .mcpb cannot run the
1212
# interactive `nx init` embedder choice, so it must pin [local] explicitly.
13-
"conexus[local]>=6.3.0",
13+
"conexus[local]>=6.3.1",
1414
]
1515

1616
[tool.uv]

0 commit comments

Comments
 (0)