Skip to content

Commit 6ad8e0c

Browse files
committed
fix(#496 review): §3 bijection accuracy + STATUS_BOARD legend + CoarseResidue TD
Address PR #496 review comments: - CodeRabbit (plan §3:164): HHT tier widths are struct-defined fixed (u16 = 4 nibbles each), NOT cache-allocated; DOLCE is a static canonical enum ordering, not a dynamic cache. from_guid_prefix must deterministically subset 20→≤16 nibbles. Corrected. - CodeRabbit (STATUS_BOARD:656): "Superseded" is not in the status legend (Deferred/Abandoned only; :115 says superseded rows use Abandoned + cite replacement). D-MBX-11 -> Abandoned (superseded by #445). - codex (canonical_node.rs:336): real (pre-existing) gap — EdgeCodecFlavor:: CoarseResidue residue has no dedicated ValueTenant (only Pq32x4/TurbovecResidue does). Per §0 anti-invention guardrail, NOT reflexively adding a tenant; tracked as TD-COARSERESIDUE-NO-VALUE-TENANT (sign-off-gated; reuse-TurbovecResidue is the guardrail-preferred option). codex (class_view.rs:247, FULL default): intentional (decision a), tracked TD-VALUESCHEMA-FULL-POC-DEFAULT — no revert. https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
1 parent b98b4ef commit 6ad8e0c

3 files changed

Lines changed: 10 additions & 2 deletions

File tree

.claude/board/STATUS_BOARD.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ Plan path: `.claude/plans/unified-soa-convergence-v1.md`. Handover `.claude/hand
653653
| D-EW64-1 | `episodic_edges::{EpisodicEdges64, EdgeRef}` — AriGraph episodic edges (4x[4b family|12b local]); intra=inherited (~98.6%), cross=4-bit nibble->OGIT-class palette (~1.4%) | lance-graph-contract | 120 | LOW | **Shipped (contract)** | 527 lib tests; clippy clean; SoA columns = D-EW64-2 (CI-gated) |
654654
| D-VIEW-1 | `view_angle::ViewAngle` — 4-bit view-schema selector; presence-bitmask-as-attention (inherited) | lance-graph-contract | 40 | LOW | **Shipped (contract)** | 527 lib tests; clippy clean |
655655
| D-MBX-10 | SoA version byte at layout root (`MailboxSoAHeader`); refuse v(N>M) bytes on v(M) reader; field-isolation matrix tests on every column op (`I-LEGACY-API-FEATURE-GATED` discipline) | lance-graph-contract | 100 | HIGH | **Queued** | foundation — should land early in P2; gates on OQ-11.5 |
656-
| D-MBX-11 | Lance bump (5 Cargo.toml) — **OBE: main jumped `=6.0.0 → =7.0.0`, not `=6.0.1`** | workspace Cargo.toml | 10 | LOW | **Superseded (#445, 2026-06-14)** | done by PR #445 (lance/lance-linalg `=7.0.0`, lancedb `=0.30.0`, object_store 0.13.2); `=6.0.1` never existed on the lancedb path. Residual: TD-SURREALDB-KVLANCE-LANCE7 (fork still pins 6) |
656+
| D-MBX-11 | Lance bump (5 Cargo.toml) — **OBE: main jumped `=6.0.0 → =7.0.0`, not `=6.0.1`** | workspace Cargo.toml | 10 | LOW | **Abandoned (superseded by #445, 2026-06-14)** | done by PR #445 (lance/lance-linalg `=7.0.0`, lancedb `=0.30.0`, object_store 0.13.2); `=6.0.1` never existed on the lancedb path. Residual: TD-SURREALDB-KVLANCE-LANCE7 (fork still pins 6) |
657657
| D-MBX-12 | 8-PR workspace-wide consumer alignment: 12.1 AriGraph · 12.2 Vsa16k audit · 12.4 lance-graph · 12.5 planner · 12.6 shader-driver · 12.7 callcenter · 12.8 ontology audit · 12.9 thinking-styles | per-crate | 800 | per-PR | **Queued (multi-PR)** | sequencing per OQ-11.8: 12.4 → 12.5 → 12.6 → 12.7 → 12.1 → 12.9 → 12.2 → 12.8 |
658658
| D-MBX-A6-P1 | contract slice of D-MBX-A6: `kanban::{KanbanColumn, KanbanMove}` + `soa_view::{MailboxSoaView, MailboxSoaOwner}` + `StepDomain::Kanban` — the planner⟷ractor⟷surreal seam, zero-dep, no parallel DTO family | lance-graph-contract | 340 | HIGH | **Shipped** | #437 (merged 9161bd7); + `class_id` N1 hook ride-along |
659659
| D-MBX-A6-P2 | Rubicon lifecycle enforcement + exec-target tag: `KanbanColumn::{next_phases, can_transition_to, is_absorbing}` (the lifecycle DAG) + `MailboxSoaOwner::try_advance_phase` (checked, `RubiconTransitionError`) + `ExecTarget{Native,Jit,SurrealQl,Elixir}` on `KanbanMove` | lance-graph-contract | 120 | LOW | **In PR** | builds on P1; 489 lib tests (+4); downstream cargo-check clean; gates the ractor owner-impl + planner emit (P3) |

.claude/board/TECH_DEBT.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515

1616
## Open Debt
1717

18+
### TD-COARSERESIDUE-NO-VALUE-TENANT — `EdgeCodecFlavor::CoarseResidue` residue has no dedicated value-slab tenant (codex #496, 2026-06-15)
19+
20+
**Surfaced by** codex P2 on PR #496 (`canonical_node.rs:336`). `EdgeCodecFlavor::CoarseResidue` (`canonical_node.rs:213`) declares its per-dimension signed-4-bit residue is "carried in the reserved value slab" (cost `1 + ⌈D/2⌉`, `bytes_per_vector` :228), but the `ValueTenant` catalogue (`canonical_node.rs:324-343`) has a slot only for `Pq32x4` (`TurbovecResidue = 5`, 16 B at offset 160) — **none for `CoarseResidue`**. So `Full`/`Compressed` presets report all codec tenants present while a class pairing `CoarseResidue` with those schemas has no addressable column for its residue (it would collide with another tenant).
21+
22+
**Pre-existing, not introduced by #496:** the `EdgeCodecFlavor` enum rode #495 / `920671d` (entropy-ladder D-EL-1); #496 only adds the `ValueSchema`/FULL-default on top. The #495 AGENT_LOG claim that "signed-`CoarseResidue` is a first-class tenant" was aspirational — no such tenant exists in `VALUE_TENANTS`.
23+
24+
**Pay it by** (operator sign-off REQUIRED per §0 anti-invention guardrail — adding a tenant is "inventing a property"): either (a) mint a `CoarseResidue` `ValueTenant` (append-only, after `EntityType=8`, carving the remaining value slab — needs sign-off), or (b) document that `CoarseResidue` reuses the `TurbovecResidue` slab region (both are "edge residue in the value slab"; the flavor disambiguates the read mode) — zero new tenant, the guardrail-preferred path. Decide before any class actually selects `CoarseResidue` with a dense preset. Cross-ref: `EdgeCodecFlavor` (920671d), entropy-ladder-spo-rung-v1 D-EL-1.
25+
1826
### TD-VALUESCHEMA-FULL-POC-DEFAULT — `ClassView::value_schema` blanket default flipped Bootstrap→Full for the consumer-POC phase (2026-06-15)
1927

2028
**Surfaced by** operator decision (a): *"flip the blanket default to Full (all unconfigured classes → Full) / any consumer that needs to save memory can create [its] smaller settings / any consumer that needs more data and more efficiency can afford a separate class."* Enables the downstream consumers (tesseract-rs / woa-rs / medcare-rs / q2) to transcode against a fully-materialised `NodeRow` while the POC is built.

.claude/plans/integrated-cognitive-planner-v1.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ classid|HEEL|HIP|TWIG : VALUE_TENANTS offset : dn_hash (content)
161161
- **documentid** = the *dedup key*, a DISTINCT object from the leaf: the live `dn_hash(canonical_dn(triplet)) → u64` (fingerprint.rs:65, used at spo_bridge.rs:127). Same content → same key = Pinpoint dedup, **ALREADY shipped** (not an unbuilt ADOPT). The address resolves a row by `local_key`; dedup happens via `dn_hash` at ingest. Complementary, not the same field. (If you content-hashed the identity, every revision would mint a new address and shatter the arc — the anti-pattern.)
162162
- **shape_hash** = a THIRD hash, `StructuralSignature(u32)` (class_signature.rs:31, FNV-1a over field/method structure) — the shape-family / ground-truth-drift key. Canon dropped it from the GUID (identity errata 2026-06-13) but drift-detection carries it ALONGSIDE the address, never inside it.
163163

164-
**Bijection width constraint (the real P-SCOPE-CLASSIFY blocker, S5):** the prefix `classid|HEEL|HIP|TWIG` is bytes 0..10 of `NodeGuid` = 10 bytes = **20 nibbles**, but `NiblePath` (hhtl.rs:55) holds only `MAX_DEPTH = 16` nibbles in its `u64` (hhtl.rs:45). A flat byte→2-nibble lowering OVERFLOWS the path word. The bijection MUST be tier-structured: the 3 canon cascade tiers (HEEL/HIP/TWIG, canonical_node.rs:28) each contribute a *bounded, cache-allocated* nibble run, basin nibble resolved from the DOLCE-from-cache binding (hhtl.rs:18-23), never a raw classid byte. Proposed `NiblePath::from_guid_prefix(&NodeGuid, TierWidths) -> Option<NiblePath>` next to `from_packed` (hhtl.rs:199), `None` when depth exceeds `MAX_DEPTH`. `is_ancestor_of` (hhtl.rs:176) is a base-16 prefix-equality test = TiKV `[start,end)` range-containment (reflexive ⇒ closed-start; empty path = "no region assigned" sentinel). Proven by `is_ancestor_of_is_cheap_prefix_reachability` (hhtl.rs:387).
164+
**Bijection width constraint (the real P-SCOPE-CLASSIFY blocker, S5):** the prefix `classid|HEEL|HIP|TWIG` is bytes 0..10 of `NodeGuid` = 10 bytes = **20 nibbles**, but `NiblePath` (hhtl.rs:55) holds only `MAX_DEPTH = 16` nibbles in its `u64` (hhtl.rs:45). A flat byte→2-nibble lowering OVERFLOWS the path word. The bijection MUST be tier-structured, and the tier widths are **struct-defined fixed, NOT cache-allocated** (CodeRabbit #496 correction): HEEL/HIP/TWIG are `u16` fields = 4 nibbles each (classid 8 + 4+4+4 = 20 nibbles — the overflow), fixed by layout. The DOLCE basin (hhtl.rs:18-23) is a **static canonical enum ordering** (ENDURANT=0, PERDURANT=1, QUALITY=2, ABSTRACT=3; 0x4–0xF reserved), collision-free by design — **not a dynamic cache**. So `from_guid_prefix` must deterministically **subset** the 20 nibbles into ≤16 (a fixed layout decision — e.g. fold/drop the high classid nibbles), never *allocate* widths. Proposed `NiblePath::from_guid_prefix(&NodeGuid) -> Option<NiblePath>` next to `from_packed` (hhtl.rs:199), `None` when depth exceeds `MAX_DEPTH`. `is_ancestor_of` (hhtl.rs:176) is a base-16 prefix-equality test = TiKV `[start,end)` range-containment (reflexive ⇒ closed-start; empty path = "no region assigned" sentinel). Proven by `is_ancestor_of_is_cheap_prefix_reachability` (hhtl.rs:387).
165165

166166
- **ScopedReference** (the genuinely NEW piece; "ticket" — but **NOT** named `ticket`: collides with `grammar::ticket::FailureTicket`) = `(NiblePath scope, QueryReference as-of)` = a TiKV-TSO snapshot-handle scoped to a key-range = "this subtree, as-of Lance version T". `QueryReference::at(ref_version,rung)` is already the as-of half. **Retrieval shape (additive, S5):** `admits(row,path,knowable,deps) = scope.is_ancestor_of(path) (hhtl.rs:176, range-containment) && classify_ready(...).dispatchable(mode) (temporal.rs:258/249)`; `retrieve_arc(rows,deps) = deinterlace (temporal.rs:301, TIME∧DATA filter + HLC sort) with the is_ancestor_of pre-filter`. A METHOD on the carrier (Click litmus: accept). **Snapshot-isolation (P-TICKET-SNAPSHOT) is FREE not built (S4):** two reads at the same `Copy` handle call `at_version(ref_version)` (versioned.rs:419); Lance versions are immutable → byte-identical batches regardless of concurrent head ticks. The handle pins the version; the version pins the bytes; Lance's versioning IS the MVCC.
167167
- **Bardioc's** "which export-restriction at data-window T" = `deinterlace(rows, QueryReference::at(T,rung), deps)` (temporal.rs:301) → rows Contemporary-at-T. **But the marking carrier is MISSING (S4, highest-value gap):** `Marking{Public,Internal,Pii,Financial,Restricted}` exists (property.rs:771) but is schema-level/static (`&'static`, `const fn with_marking`) — NO version axis, so it cannot answer "which held at T"; `CognitiveEventRow` (external_intent.rs:113) carries no marking. **Minimal additive seam:** emit a versioned `MarkingRow{predicate, Marking, knowable_from: LanceVersion}` into the SPO store on each classification change; `impl DeinterlaceRow for MarkingRow``deinterlace` returns the marking `Contemporary` at T. `Marking` + `DeinterlaceRow`, both exist, joined with zero new machinery. Route: **read-as-of, NEVER counterfactual** (Bardioc asks "what *was*", not "what *would be*" — the latter = `counterfactual.rs`, the wrong surface for audit).

0 commit comments

Comments
 (0)