Skip to content

Commit f066772

Browse files
authored
Merge pull request #1415 from Hellblazer/release/v6.15.0
release: conexus 6.15.0
2 parents 14984a8 + 1443665 commit f066772

175 files changed

Lines changed: 9660 additions & 3365 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.

.beads/interactions.jsonl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,3 +1628,14 @@
16281628
{"id":"int-8d569975ed3b2d421b704138e52728ac","kind":"field_change","created_at":"2026-07-19T03:13:04.335528Z","actor":"Hellblazer","issue_id":"nexus-jxizy.7","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"FORCE-CLOSE RATIONALE for the .6 dep: the .7<-.6 edge encoded gate-obs-1 ACTIVATION ordering (serving flip only inside .6's freeze window), not unfinished .7 work — satisfied structurally: the flip ships in the cohort engine whose DEPLOYMENT is the .6-tracked cutover choreography (freeze -> boot -> rekey), so activation-after-ETL holds by construction. CODE COMPLETE + REVIEWED: Chash inversion (9234abf4+cb8c366f+da2c4f86) byte[32]-backed, fromHex strictly 64-hex with dual-remedy legacy hint, fromSha256Hex=identity, requireLength32 DELETED (one strict tier), ChashHex jOOQ converter seam (recorded interpretation: boundary-typed, seam-converted, RawSqlGateTest-guarded), PgVectorServingContractTest REWRITTEN proving 32-char non-hex ids REJECTED, ChashTypeTest polarity-replaced. Engine suite 1320/0/0. Review marker T1 366c9c36."}}
16291629
{"id":"int-cb3339b221dfd998aac1505d5724cb79","kind":"field_change","created_at":"2026-07-19T03:13:05.699764Z","actor":"Hellblazer","issue_id":"nexus-jxizy.8","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"FORCE-CLOSE RATIONALE: dep chain rode .7's activation edge (see .7 close). CODE COMPLETE + REVIEWED: every handler parses chash through the type at bind time -> uniform 400 with offending length BEFORE any transaction (fk-001 pattern); mute mid-transaction CHECK class gone; dual-remedy hint on legacy width. Pinned by the handler test family (full-64-accepted + legacy-32-rejected pairs). Review marker T1 366c9c36."}}
16301630
{"id":"int-6f929482908b2caf130d3c4e1a58cd54","kind":"field_change","created_at":"2026-07-19T03:13:07.046156Z","actor":"Hellblazer","issue_id":"nexus-jxizy.9","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"FORCE-CLOSE RATIONALE: the .9<-.6 edge was the alias-resolution dependency — the alias resolver EXISTS and is proven (engine resolveLegacyRef + client alias route, RekeyOpsIntegrationTest + test_chash_citation_resolution); what remains of .6 is the PRODUCTION rekey run, which populates alias FACTS but does not change the resolver contract this bead pins. Grammar truthful (64 == storage); 64-hex citations resolve at 256 bits; legacy 32-hex references resolve via the alias route end-to-end (critic HIGH fix 6c72ad55); unmapped legacy = dangling-None. Review marker T1 366c9c36."}}
1631+
{"id":"int-1019c0720516506ce95454dea402722b","kind":"field_change","created_at":"2026-07-20T13:52:05.086193Z","actor":"Hellblazer","issue_id":"nexus-339xv","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"SHIPPED 8573c15b. In-transaction ANALYZE of chash_alias in RekeyOps + StagingPromoteOps via ChashSqlIdioms.refreshAliasStats; GRANT MAINTAIN in grants-nexus-svc (runAlways, self-heals next boot); alias_stats_refreshed rides the envelope and the client rung surfaces a false. KEY FINDING: the bare statement is a SILENT no-op — Postgres WARNs+SKIPs for a non-owner rather than erroring (verified empirically: statement alone produced ZERO stats and threw nothing), so tests assert the RESULTING STATISTICS, never the statement. Version guard is load-bearing: has_table_privilege(...,'MAINTAIN') RAISES on PG16 rather than returning false, which would abort the whole rekey. Cloud verified PG 17.10 so the fix is live there on the next engine tag. Full engine suite 1355/0/0 on the final tree. Mutation-verified both directions."}}
1632+
{"id":"int-ed4743cad80977a8ab1ca15af6651ce3","kind":"field_change","created_at":"2026-07-20T13:52:06.31082Z","actor":"Hellblazer","issue_id":"nexus-noa8d","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"SHIPPED 79d234ec + 9400a014. Gate-three/report-two: the three CONTENT octet CHECKs always VALIDATE; the two POINTER checks are skipped while pre-existing orphan debt exists, counts reported with a remediation pointer. Implemented as a CEILING measured within the run (debt before the rekey vs after) — growth raises, pre-existing is grandfathered — NOT a table exemption, per conexus's own correction that Hal caught. Ceiling is run-local by design: the only cross-run store is the completion record's detail field, which protocol.py declares observability-only and accepted lossy, and a load-bearing gate must not ride a lossy field. pointer_debt_fn rides the read-only diag choke point; None (managed/no creds) leaves all-five behaviour untouched. Red-first, mutation-verified (blanket exemption fails the ceiling test); upgrade-ladder suite 569 passed."}}
1633+
{"id":"int-883fe00ad881cad99d142b4753755f4a","kind":"field_change","created_at":"2026-07-20T14:22:55.350354Z","actor":"Hellblazer","issue_id":"nexus-kmd5b","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Closed"}}
1634+
{"id":"int-41ac5d2f24df5830a1b439f03b0df48a","kind":"field_change","created_at":"2026-07-20T16:24:38.183794Z","actor":"Hellblazer","issue_id":"nexus-b878d","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
1635+
{"id":"int-0bdba4c1c2193b0d09849eab52b73047","kind":"field_change","created_at":"2026-07-20T16:30:03.954804Z","actor":"Hellblazer","issue_id":"nexus-3h0u6","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
1636+
{"id":"int-206ba840457ec123e18502be7dbbfc01","kind":"field_change","created_at":"2026-07-20T16:38:22.76847Z","actor":"Hellblazer","issue_id":"nexus-xzop6","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
1637+
{"id":"int-6ab0294dee824356b5c7b81ddbbc5261","kind":"field_change","created_at":"2026-07-20T16:38:24.36679Z","actor":"Hellblazer","issue_id":"nexus-84tr4","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
1638+
{"id":"int-15dc5b11b9cb47bd7b765388d72ff609","kind":"field_change","created_at":"2026-07-20T16:38:25.53695Z","actor":"Hellblazer","issue_id":"nexus-sfgqi","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
1639+
{"id":"int-5fbd41ca19b13bf1f410f7c3407d8d4a","kind":"field_change","created_at":"2026-07-20T16:43:37.964777Z","actor":"Hellblazer","issue_id":"nexus-leunq","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Closed"}}
1640+
{"id":"int-9fb250e8aa217b49e04bd6aabe1dc7e4","kind":"field_change","created_at":"2026-07-20T18:01:35.956673Z","actor":"Hellblazer","issue_id":"nexus-ixl85","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"MEASURED, no code change (Hal's call, 2026-07-20).\n\nFull classification sweep on the real 15-collection legacy Chroma footprint: median 3.3 ms, per-collection 0.2 ms, 5 of 15 data-bearing so only 5 reach the dim probe. The bead framed this as the vgtff shape, but vgtff was 300 SECONDS and this is 3 MILLISECONDS.\n\nResolution (c) accept and bound, with (d) noted: the cost retires with RDR-155 P4b by construction when the footprint gate goes permanently False. Candidates (a) and (b) are explicitly NOT taken — both make detect() consult stored state and would contradict test_gap4_two_mechanisms.py::test_rung_convergence_is_re_derived_live_never_cached, trading a 3ms perf non-issue for the marker-file-as-authority correctness class.\n\nScope limit recorded on the bead comment: measured on a LOCAL PersistentClient leg. A cloud legacy leg makes each data-bearing collection's probe a network round trip (5 here, not 15); the larger N+1 network half was already fixed. Re-measure there before reopening on a cloud-leg report."}}
1641+
{"id":"int-7c0933e9dfe939419b40601fb0f22c13","kind":"field_change","created_at":"2026-07-20T21:48:32.638867Z","actor":"Hellblazer","issue_id":"nexus-q6830","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Shipped as 5f967f65 on develop. Full suite 14184 passed / 0 failed.\n\nBoth halves of the bead's sketch are addressed, though the second differently than sketched: the error now reports whichever stream carried text (with an explicit sentinel when the subprocess was silent), and a structlog operator_dispatch_failed event at the choke point gives every one of the 17 call sites a record — rather than the per-call-site persist the bead originally imagined.\n\nDeliberately NOT claimed as nexus-1at5 parity. That branch writes a dedicated uncapped per-incident file and names its path in the exception; this writes a capped event into the shared 10MB x 5 rotating mcp.log with no pointer back. And durability is a property of the CALLING process's logging mode, not the choke point: the 15 mcp-mode sites get the file handler, the 2 taxonomy CLI sites get stderr only. Residuals tracked as nexus-ri56e (addressability, retention, CLI coverage — with the warning not to port _persist_timeout_log literally, since its no-cleanup design is only safe because timeouts are rare) and nexus-l1qpj (per-failure stderr volume in the taxonomy batches, untested).\n\nStacked review earned its keep four times across two rounds, none visible to a green suite: the nexus-1at5 overclaim, the mcp.log gap being systemic rather than nx_plan_audit-only (13 of 17 sites bare, 3 with no covered path), silent truncation of the log field (the same 'silence must read as silence' principle this diff designed into the exception, missing one field over), and a code comment left contradicting its own corrected commit message. Three independent enumerations of the call sites gave 12/17/17 — the first was an inherited partial list presented as traced, which is the exact sampling-as-inventory failure nexus-ou4tb is open over.\n\nRoot cause of the GH #1414 failure itself is untouched and remains open as nexus-g6vb4 (MCP host cannot self-detect staleness after an in-place uv tool upgrade; upgrade_finish.py:197 excludes pid == me by construction)."}}

.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.14.0"
14+
"ref": "v6.15.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": "6.14.0"
17+
"version": "6.15.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": "v6.14.0"
25+
"ref": "v6.15.0"
2626
},
2727
"description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
28-
"version": "6.14.0"
28+
"version": "6.15.0"
2929
}
3030
]
3131
}

.claude/settings.json

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,4 @@
11
{
2-
"hooks": {
3-
"SubagentStart": [
4-
{
5-
"matcher": "",
6-
"hooks": [
7-
{
8-
"type": "command",
9-
"command": "NX_ORCH_STOP_GUARD=\"${NX_ORCH_STOP_GUARD:-block}\" bash \"$CLAUDE_PROJECT_DIR/conexus/hooks/scripts/subagent-start-stamp.sh\"",
10-
"timeout": 10
11-
}
12-
]
13-
}
14-
],
15-
"SubagentStop": [
16-
{
17-
"matcher": "",
18-
"hooks": [
19-
{
20-
"type": "command",
21-
"command": "NX_ORCH_STOP_GUARD=\"${NX_ORCH_STOP_GUARD:-block}\" bash \"$CLAUDE_PROJECT_DIR/conexus/hooks/scripts/subagent-stop.sh\"",
22-
"timeout": 15
23-
}
24-
]
25-
}
26-
]
27-
}
2+
"_comment": "The orchestration hooks (subagent-start-stamp.sh, subagent-stop.sh) are registered by conexus/hooks/hooks.json and MUST NOT be re-registered here. See nexus-3h0u6: RDR-184 .16 armed repo sessions from this file as interim instrumentation, explicitly 'without waiting for a plugin release'. That release has shipped (conexus 6.14.0 registers both), so both surfaces fired and every hook-written START/REPORTED row was duplicated, inflating the nexus-ccs9v.11 census 2x against 1x EXPECT rows. Behaviour is unchanged by the removal: both scripts already default NX_ORCH_STOP_GUARD to block internally, which is what the P1.G flip (nexus-ccs9v.15) set, and NX_ORCH_STOP_GUARD=off still opts out per session. Enforced by tests/hooks/test_subagent_start_stamp.py::test_orchestration_hooks_are_registered_exactly_once.",
3+
"hooks": {}
284
}

CHANGELOG.md

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

77
## [Unreleased]
88

9+
## [6.15.0] - 2026-07-21
10+
11+
Ships with (and requires) engine-service-v0.1.51.
12+
13+
### The GH #1414 closure set
14+
15+
- **Ladder-first chash-poison guidance** — the remediation playbooks, doctor
16+
text, install gates, and runbook §8.1 now steer to the upgrade ladder
17+
(`nx upgrade`) first; rollback is reserved for the will-not-boot class
18+
(pre-v0.1.48 char-era engines). The pre-rewrite crash-loop premise was
19+
disproven for v0.1.48+ engines (nexus-joima): the RDR-180 octet-width
20+
CHECKs land NOT VALID and are validated by the chash-rekey rung post-heal.
21+
- **Stale-host self-detection (MCP)** — both MCP servers (core + catalog)
22+
detect upgrade skew between the serving process and the installed package,
23+
decorate responses, and warn. Decorated, not auto-healed, and never
24+
refuses (session-bound hosts are the user's to cycle).
25+
- **Tri-state chash-poison gate** — `converge_engine` distinguishes
26+
POISONED / UNKNOWN / CLEAN. An unverifiable store DEFERS convergence with
27+
a loud, actionable line instead of converging blind (the reporter's box
28+
converged 0.1.35 → 0.1.49 over 35,477 poison rows); install-binary
29+
proceeds with an explicit UNVERIFIED warning (never bricks the
30+
will-not-boot recovery path).
31+
- **Diagnostics cluster tail** — nexus_diag is LOCAL-ONLY by contract
32+
(managed/BYO refuses with the contract stated, hybrid local boxes keep a
33+
working probe via resolution-first gating); heal-by-reindex wording is
34+
verified + scoped; dispatch failures carry an origin tag and a durable
35+
record pointer; taxonomy rollup + run logs.
36+
37+
### Unattended era upgrades restored (the era-hop recovery)
38+
39+
The era-spanning MVV (6.0.0 + engine v0.1.11 + pre-RDR-108 ids + Chroma
40+
substrate → current via `nx upgrade` alone) is green again — red since the
41+
RDR-180 cutover. Four fixes:
42+
43+
- **psql loader guard on all three invocation sites** (health probe,
44+
nexus_diag choke point, admin VALIDATE path): the published PG bundles
45+
ship psql without an RPATH; a bare env exits 127 (libpq.so.5) on minimal
46+
Linux hosts, which the tri-state gate read as UNKNOWN — permanently
47+
deferring engine convergence with `nx doctor` failing identically.
48+
- **The poison probe self-backfills the `nexus_diag` role** on pre-P2.1
49+
installs (idempotent RDR-182 backfill, resolution-gated on the live local
50+
cluster facts) — the unattended walk no longer depends on an operator
51+
re-running `nx init --service`.
52+
- **Era-32 ids get the wire re-id** (nexus-i5rbk): collections holding
53+
32-hex pre-RDR-180 half-digest ids are re-identified on the wire during
54+
the substrate ETL — the canonical FULL sha256(chunk_text) is recomputed
55+
from the carried text (a recompute, never a guess; GH #1390's no-guess
56+
rule is about fabricating addresses). Previously these collections
57+
refused with a re-index-first remedy that an era box cannot perform.
58+
- Era-hop harness assertions updated to the RDR-180 full-digest identity.
59+
60+
### RDR-187: chash_index retired
61+
62+
- `nexus.chash_index` (the router remnant of the split-store architecture)
63+
is DROPPED; the chunks tables are the chash-keyed store. `/v1/chash/*`
64+
reads derive from chunk rows; writes are honest deprecated no-ops;
65+
`rename_collection` stays real; `chash_alias` is permanent. The HTTP
66+
shape survives until the deprecation window closes (nexus-piwya.11).
67+
- Client: census/gate/forensics chash_index legs retired; the legacy --cold
68+
chash ETL leg and staging chash landing removed; the integration MVV
69+
family re-pinned to the post-RDR-187 contract.
70+
- Engine floor: `REQUIRED_ENGINE_VERSION` → v0.1.51 (fresh installs pin the
71+
same tag; the floor is the fix-delivery vehicle for local installs).
72+
73+
### RDR-180 tail
74+
75+
- chash-rekey VALIDATE is gate-three/report-two with a run-local ceiling;
76+
rekey retries once when the engine restarted under it; census dangling
77+
legs see LEGACY-width pointers; ANALYZE inside the rekey/promote
78+
transaction (planner blind-spot on just-written rows); alias-chained
79+
legacy-width resolution in catalog resolve_chash.
80+
81+
### Fixes
82+
83+
- A degraded vector service no longer reads as an empty collection, and a
84+
document that never reached the catalog is no longer silent (nexus-ou4tb).
85+
- The migration dry run answers what the run will answer; a legacy chunk id
86+
no longer hides what the vectors are (nexus-leunq).
87+
- PG bundle: never delete a working bundle before the replacement is
88+
proven; re-extract when handed a different archive (nexus-xzop6).
89+
- Failed `claude -p` operator dispatches say what happened and leave a
90+
durable record (nexus-q6830).
91+
- One registration surface for the orchestration hooks (nexus-3h0u6).
92+
93+
### Docs
94+
95+
- Full user-facing doc audit (4-way parallel sweep): contributing.md release
96+
checklist gained the blocking step-0 engine gate + sandbox smoke; runbook
97+
§8 carries the code-verified wire re-id scope; storage-tiers /
98+
desktop-deployment SQLite framing corrected; stale CLI/MCP help fixed.
99+
9100
## [6.14.0] - 2026-07-19
10101

11102
Ships with (and requires) engine-service-v0.1.49.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ For the full deployment story across all three surfaces (install, daemon lifecyc
4545

4646
## What it does
4747

48-
- **Persistent memory** — three storage tiers (T1 session scratch, T2 SQLite memory bank, T3 semantic knowledge store) so Claude remembers across conversations.
48+
- **Persistent memory** — three storage tiers (T1 session scratch, T2 memory bank, T3 semantic knowledge store, both persistent tiers served by the native Postgres-backed `nexus-service`) so Claude remembers across conversations.
4949
- **Semantic search** — index your code, docs, RDRs, and PDFs once; search by meaning afterward. Tree-sitter AST chunking across 23 languages, CCE prose chunking, PDF auto-routing.
5050
- **Typed document catalog** — Xanadu-inspired addressing with typed links (`cites`, `implements`, `supersedes`). Walk from a design doc to the code that implements it.
5151
- **RDR: Research-Design-Review** — write a spec before you code. Captures the problem, research, alternatives, and chosen approach. The corpus is searchable, so prior decisions surface during new design work.

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.14.0",
3+
"version": "6.15.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+
## [6.15.0] - 2026-07-21
8+
9+
Plugin version aligned with conexus 6.15.0. No plugin-side changes.
10+
711
## [6.14.0] - 2026-07-19
812

913
- Plugin version aligned with conexus 6.14.0. No plugin-side changes. Root

0 commit comments

Comments
 (0)