You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .claude-plugin/marketplace.json
+4-4Lines changed: 4 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -11,21 +11,21 @@
11
11
"source": "git-subdir",
12
12
"url": "https://github.com/Hellblazer/nexus.git",
13
13
"path": "conexus",
14
-
"ref": "v6.13.1"
14
+
"ref": "v6.14.0"
15
15
},
16
16
"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.13.1"
17
+
"version": "6.14.0"
18
18
},
19
19
{
20
20
"name": "sn",
21
21
"source": {
22
22
"source": "git-subdir",
23
23
"url": "https://github.com/Hellblazer/nexus.git",
24
24
"path": "sn",
25
-
"ref": "v6.13.1"
25
+
"ref": "v6.14.0"
26
26
},
27
27
"description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
Must end `GUIDED LAND-THEN-TRANSFORM GATE PASSED` (marker renamed at the RDR-180 gate rewrite, nexus-jxizy.10.10).
55
55
56
56
**Optional but recommended when the cut carries CLI-visible or concurrency-relevant service changes**: also run the candidate shakeout — the full CLI-verb matrix + incremental-index + concurrent-load journey against the SAME locally-built candidate (nexus-h8rf6; born from the 2026-07-03 post-release shakeout, whose findings were all locally discoverable):
|`knowledge__*`|`voyage-context-3`|`source_uri` then `title` (fallback for MCP-stored notes) |`chunk_text_hash` (full 64-hex)|
45
45
46
-
**Catalog/T3 split (RDR-108)**: Catalog Documents are graph nodes addressed by tumblers (`Document.tumbler`); T3 chunks are content-addressed blobs whose Chroma natural ID is `sha256(chunk_text)[:32]`. Document structure (which chashes compose a doc, in what order) lives in the catalog `document_chunks` manifest, not in chunk metadata. The doc-to-chunks join is `documents.tumbler -> document_chunks.doc_id -> document_chunks.chash`; `chash[:32]` is the Chroma natural ID directly, no further lookup. Identical chunk text in the same collection collapses to one T3 row by design; the manifest preserves position via `(doc_id, position)` rows pointing at the shared chash.
46
+
**Catalog/T3 split (RDR-108, widths per RDR-180)**: Catalog Documents are graph nodes addressed by tumblers (`Document.tumbler`); T3 chunks are content-addressed blobs whose natural ID is the FULL `sha256(chunk_text)` — 64 lowercase hex on the wire, 32 raw bytes in storage (`bytea`, `octet_length=32`); hex only at boundaries (see `docs/architecture.md` § Chunk identity). Document structure (which chashes compose a doc, in what order) lives in the catalog `document_chunks` manifest, not in chunk metadata. The doc-to-chunks join is `documents.tumbler -> document_chunks.doc_id -> document_chunks.chash`; the chash is the chunk id directly, no further lookup. Identical chunk text in the same collection collapses to one T3 row by design; the manifest preserves position via `(doc_id, position)` rows pointing at the shared chash.
47
47
48
48
For the full module map, post-store hook contracts, T2 schema, and design heritage see [`docs/architecture.md`](docs/architecture.md). For module-local guidance see the `AGENTS.md` files inside `src/nexus/catalog/`, `src/nexus/db/`, and `src/nexus/mcp/`.
Copy file name to clipboardExpand all lines: conexus/.claude-plugin/plugin.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "conexus",
3
-
"version": "6.13.1",
3
+
"version": "6.14.0",
4
4
"description": "Self-hosted three-tier knowledge management with plan-centric retrieval (nx_answer), specialized agents, semantic search, and RDR decision tracking for Claude Code.",
Width validation lives inside that seam (the type constructor / the helper),
216
+
so a wrong-width value fails loudly at the boundary with the offending length —
217
+
never deep inside a transaction.
218
+
219
+
**Why this is written down** (the bug class this eliminates): historically the
220
+
stored chunk id was `sha256(chunk_text).hexdigest()[:32]` — 32 *hex chars* =
221
+
128 bits = **half** the digest — while the citation grammar advertised the full
222
+
64-hex digest, bridged by silent truncation. "32" meant hex-chars in one place
223
+
and bytes in another. The canonical definition above makes the two subsystems
224
+
agree at the full 256 bits, by construction.
225
+
226
+
**Migration status:** the flip is IN this tree (epic `nexus-jxizy`): the
227
+
producer emits the full digest, the engine stores bytea, and the
228
+
`chash-rekey` ladder rung rekeys existing stores inside the freeze window. For every rehashable
229
+
row the legacy 32-hex is the strict prefix of the new 64-hex (same text, same
230
+
digest); the persisted `chash_alias` table is the collision-free resolver for
231
+
legacy references thereafter (prefix matching only *builds* the map, it is not
232
+
the resolver). The table below describes **current** (pre-flip) producer
233
+
behavior.
234
+
193
235
### Metadata field semantics (chunk vs document level)
194
236
195
237
Two hash fields look similar but mean very different things. Confusing them produces false-positive panic findings (e.g. "94% redundancy across the corpus" turns out to be 94% of chunks share a doc-level hash, which is correct: every chunk of one paper has the same `content_hash`). The table below locks the contract; consult before drawing conclusions from a metadata distribution.
@@ -198,7 +240,7 @@ Two hash fields look similar but mean very different things. Confusing them prod
198
240
|---|---|---|---|---|
199
241
|`content_hash`| document |`sha256(file_bytes)`| every indexer at register time (`indexer.py:1198`) | document-level dedup; staleness comparison; backup-snapshot identity |
200
242
|`chunk_text_hash`| chunk |`sha256(chunk_text)` (full 64 chars) | every indexer per chunk; healed on an upgraded store by the ladder (`nx upgrade`) | content-addressed link spans (`chash:<hex>`); `nx t3 reidentify` natural-ID source (first 32 chars); cross-collection chunk dedup |
201
-
|`chunk_text_hash[:32]`| chunk | first 32 chars of the SHA |`nx t3 reidentify` upsert ([RDR-108](rdr/rdr-108-graph-identity-normalization.md) Phase 2) | Chroma natural ID for the chunk; the join key from `document_chunks.chash`|
243
+
|`chunk_text_hash` (as chunk id) | chunk |the full SHA (RDR-180) | every indexer via `chunk_identity.chunk_id`| the chunk natural ID and the `document_chunks.chash` join key; the pre-RDR-180 `[:32]` truncation is retired (legacy 32-hex references resolve via `chash_alias`)|
202
244
|`source_uri`| document |`file://...` or `x-devonthink-item://<uuid>` etc. | indexer / MCP write paths | persistent URI identity; aspect-extraction routing; audit-membership home detection |
Copy file name to clipboardExpand all lines: docs/cli-reference.md
+7-6Lines changed: 7 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1028,7 +1028,7 @@ echo "# Cache Strategy" | nx store put - --collection knowledge --title "decisio
1028
1028
| Subcommand | Description |
1029
1029
|------------|-------------|
1030
1030
| `put FILE_OR_DASH` | Store document (use `-` for stdin) |
1031
-
| `get DOC_ID` | Retrieve entry by 32-char hex ID (from `nx store list`) |
1031
+
| `get DOC_ID` | Retrieve entry by 64-char hex ID (from `nx store list`) |
1032
1032
| `list` | List stored entries |
1033
1033
| `delete` | Delete a single entry by ID or title |
1034
1034
| `export [COLLECTION]` | Export a collection to portable `.nxexp` backup |
@@ -1059,11 +1059,11 @@ echo "# Cache Strategy" | nx store put - --collection knowledge --title "decisio
1059
1059
| Flag | Description |
1060
1060
|------|-------------|
1061
1061
| `-c` / `--collection NAME` | Collection name (required) |
1062
-
| `--id ID` | Exact 32-char document ID from `nx store list` |
1062
+
| `--id ID` | Exact 64-char document ID from `nx store list` |
1063
1063
| `--title TITLE` | Exact title metadata match (deletes all matching chunks) |
1064
1064
| `-y` / `--yes` | Skip confirmation prompt |
1065
1065
1066
-
Note: IDs shown by `nx store list` are 32 hex chars (`sha256(text)[:32]`). `--title` delete is paginated and safe for multi-chunk documents. To delete an entire collection use `nx collection delete`.
1066
+
Note: IDs shown by `nx store list` are 64 hex chars (the full `sha256(text)` digest — RDR-180; pre-cohort 32-hex IDs resolve via the permanent `chash_alias` route). `--title` delete is paginated and safe for multi-chunk documents. To delete an entire collection use `nx collection delete`.
1067
1067
1068
1068
**`get` flags:**
1069
1069
@@ -1090,9 +1090,10 @@ Note: IDs shown by `nx store list` are 32 hex chars (`sha256(text)[:32]`). `--ti
1090
1090
| `--assume-model MODEL` | Override the export header's declared embedding model. Pre-migration `.nxexp` files can carry a wrong label (GH #1370); use this to supply the true model instead of trusting the header |
1091
1091
| `--skip-existing` | Skip records whose id already exists in the target collection, instead of overwriting. Useful for resuming a partial import |
1092
1092
1093
-
Non-conformant legacy chunk ids (16-char pre-migration ids that fail the
1094
-
service backend's `chash` length constraint) are re-hashed to 32-char
1095
-
content-derived ids automatically; the CLI reports how many were re-hashed.
1093
+
Non-conformant legacy chunk ids (16- or 32-char pre-migration ids that fail
1094
+
the service backend's `chash` length constraint) are re-hashed to full 64-char
1095
+
content-derived ids automatically (RDR-180); the CLI reports how many were
1096
+
re-hashed.
1096
1097
1097
1098
**Restoring a pre-migration (Chroma-era) backup:**
0 commit comments