Skip to content

Commit 6136eb5

Browse files
authored
Merge pull request #613 from AdaWorldAPI/claude/p-a-readmode-tail-variant
feat(contract): 6×(8:8) FacetCascade + V3 (part_of:is_a) fold + OSINT-V3 (custom:canon split)
2 parents d4deefb + 28c5264 commit 6136eb5

6 files changed

Lines changed: 610 additions & 21 deletions

File tree

.claude/board/EPIPHANIES.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,45 @@
1+
## 2026-06-25 — E-FACET-8-8-ALWAYS — the homogeneous facet is ALWAYS 8:8 (content-blind, consumer-projected); it amortizes to a 2bit×2bit Morton tile cascade
2+
3+
**Status:** FINDING `[H]` (operator-locked 2026-06-25; impl PR #613). Refines
4+
`E-HOMOGENEITY-CLOSES-AS-CONTAINED-FACET`'s `place⊕search` framing to its general
5+
form: the facet tier is **ALWAYS 8:8** — two opaque bytes `hi:lo` — and the
6+
**producer bakes in NO meaning**; only the CONSUMER (the `facet_classid`'s ClassView)
7+
projects it: `(part_of:is_a)`, a 256:256 palette/CAM-PQ centroid pair, a concatenated
8+
`u16`, `(group:member)`, `(mixin:identity)`, `(column:row)`, `(Y:Z)`, … (AGI-as-glove:
9+
the SoA is content-blind, the reader interprets). **Benefit (why ALWAYS-8:8 is the
10+
right substrate):** every interpretation amortizes to ONE `2 bit × 2 bit` **Morton
11+
tile cascade** — Morton-interleave `hi:lo` and each nibble is a quad-tree quadrant in
12+
BOTH bytes at once (`256 = 4⁴` hierarchical ancestry), so hierarchical-prefix routing
13+
is uniform regardless of meaning. (Operator analogy: chess bitboards / `shakmaty` /
14+
Stockfish — one fixed bit substrate, many consumers; magic-bitboard + NNUE
15+
index-into-quantized-table = the centroid reading.)
16+
17+
**Contract (#613, `canonical_node.rs`):** `FacetTier { lo, hi }` (2 B, `as_u16` +
18+
`morton` projections) + `FacetCascade { facet_classid: u32, tiers: [FacetTier; 6] }`
19+
(16 B = `facet_classid(4) | 6×(8:8)=12`, harvest §5.1) — a *reading* over a borrowed
20+
`[u8; 16]`, carrying NO value-slab offset (it does NOT touch the LOCKED 480 B layout;
21+
the `classid → ClassView` byte-pick is the separate, panel-gated step). `hi_chain`/
22+
`lo_chain` + `hi_distance`/`lo_distance` are the two orthogonal prefix metrics.
23+
24+
**Key-side V3 routing (#613, `hhtl.rs` / `soa_graph.rs`):**
25+
`NiblePath::from_guid_prefix_v3` folds the 4 HHTL tiers `HEEL·HIP·TWIG·LEAF` in FULL
26+
(BOTH bytes per tier, depth 16) — the routing **prefix** of the 6-tier facet;
27+
`family`/`identity` (tiers 5-6) stay the basin tail (`local_key`), exactly as v1/v2
28+
keep their tail out of the path (the full 12 B cascade does not fit one `u64`
29+
NiblePath). `classid` is NOT folded, so `hhtl_path` (schema-driven by `tail_variant`)
30+
routes OSINT-V3 `0x1000_0700` to a non-empty depth-16 path — fixing the Codex-P2
31+
latent EMPTY-fold.
32+
33+
**Correction (resolves Codex P2 on #613):** "high `u16` is reserved-zero" is a
34+
**v1-fold** statement (v1 folds `classid_lo` as the coarse tier), NOT a global classid
35+
law — V3 abolishes it by never folding `classid`. `from_guid_prefix`'s doc + guard
36+
scoped to v1 accordingly.
37+
38+
**Cross-ref:** `E-HOMOGENEITY-CLOSES-AS-CONTAINED-FACET` (the place⊕search facet this
39+
generalizes to content-neutral 8:8), `soa-value-tenant-migration-v1-harvest.md` §5.1,
40+
`perturbation-sim/src/cascade_key.rs` (`CascadeKeyV3`), q2 `fma/docs/V3_SOA_WIRING.md`,
41+
`I-VSA-IDENTITIES` (concatenate disjoint bytes, never XOR-bundle codes).
42+
143
## 2026-06-25 — E-TWO-SOA-WORLDS — the value-tenant migration's real object is the slab↔parallel-MailboxSoA seam, not homogenization
244

345
**Status:** FINDING `[G]` (confirmed-by-read; Phase-1 harvest of `soa-value-tenant-migration-v1`). The 480 B `NodeRow.value` slab (10 `ValueTenant`s, `canonical_node.rs:606`) and the parallel `MailboxSoA<N>` (`cognitive-shader-driver/src/mailbox_soa.rs`, separate `[T;N]` columns) BOTH implement `MailboxSoaView`/`Owner` (`soa_view.rs`) but are **disjoint** — they share exactly one semantic column, `class_id()≡entity_type()` (`soa_view.rs:75`). **6 of 10 slab tenants have NO live producer** (Meta/MaterializedEdges/HelixResidue/TurbovecResidue/Plasticity — only schema tests or parallel-SoA mirrors); only Energy/EntityType/Kanban/Fingerprint are written into the actual slab. `SymbiontBoard` straddles both (carries `Vec<NodeRow>` but exposes parallel mirror `Vec`s). **Consequence:** the migration's load-bearing decision is which world becomes canonical (the A↔B reconciliation), NOT homogenizing tenants. Open (un-answerable from source, a §6-panel question): does `MailboxSoA.edges` become the slab `MaterializedEdges` tenant? Full inventory: `soa-value-tenant-migration-v1-harvest.md`.

.claude/board/LATEST_STATE.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ Membrane consumers can now pull BOTH halves of a render `classid` BBB-safely fro
140140

141141
## Current Contract Inventory (lance-graph-contract)
142142

143+
> **2026-06-25 — ADDED (#613, the 6-tier 8:8 homogeneous facet + V3 routing fold)**: `lance_graph_contract::canonical_node::{FacetTier, FacetCascade}` — the **ALWAYS-8:8** content-blind facet substrate. `FacetTier{lo, hi}` (2 B, `const`; `as_u16` concatenated + `morton` 2bit×2bit Morton-tile projections); `FacetCascade{facet_classid: u32, tiers: [FacetTier; 6]}` (16 B = `facet_classid(4) | 6×(8:8)=12`, harvest §5.1) — a *reading* over a borrowed `[u8;16]` with `from_bytes`/`to_bytes`/`hi_chain`/`lo_chain`/`hi_distance`/`lo_distance`. **Carries NO value-slab offset** → does NOT touch the operator-LOCKED 480 B layout (the `classid→ClassView` byte-pick is the separate, panel-gated step); content-blind — only the consumer projects meaning (`part_of:is_a` / 256:256 palette centroid / `group:member` / `column:row` / concatenated u16 …), every reading amortizing to one 2bit×2bit Morton tile cascade. **Key-side V3 routing:** `hhtl::NiblePath::from_guid_prefix_v3` (feature `guid-v3-tail`) folds the 4 HHTL tiers `HEEL·HIP·TWIG·LEAF` in FULL (both bytes, depth 16) — the facet's routing prefix; `family`/`identity` stay the basin tail. `classid` NOT folded, so `soa_graph::hhtl_path` (schema-driven by `tail_variant`) routes OSINT-V3 `0x1000_0700` non-empty — fixes the Codex-P2 latent EMPTY-fold. `from_guid_prefix`'s "reserved-zero" doc/guard scoped to **v1-fold** (NOT a global classid law). Additive, zero-dep; 739 lib green (default + `guid-v3-tail`), clippy `-D warnings` + fmt clean. EPIPHANIES `E-FACET-8-8-ALWAYS`. Branch `claude/p-a-readmode-tail-variant`.
144+
143145
> **2026-06-21 — ADDED (content-store for the AriGraph/OSINT episodic arc)**: `lance_graph_contract::content_store::{ContentId, SourceSpan, ContentError, ContentStore, ContentSink}` — the content-addressed **cold text/blob store** contract. `ContentId(u64)` = `hash::fnv1a` of the bytes (stable across versions — the correct content address; `DefaultHasher` must never key one; `0` = sentinel). `SourceSpan{ContentId,u32,u32}` = the fixed-size, `Copy` typed form of `template-equivalence`'s `(source_id,start,end)` provenance; `is_cited()` = "no source span → no claim" (non-sentinel content + non-empty span). `ContentStore` (cold read: `resolve(id) -> Option<&[u8]>` zero-copy slice into the mmap/backing store; `resolve_span`/`contains` defaulted) + `ContentSink` (idempotent `put -> ContentId`, dedup by content-address: many episodes → one source row). **Hot/cold firewall (ADR-022)**: the hot path (SIMD sweep, AriGraph edge traversal) touches only the fixed-size `ContentId`/`SourceSpan`; bytes hydrate cold at the membrane (the fingerprint is the hot-path stand-in for text). Nothing variable-length enters the 512 B node. Additive, zero-dep; +6 tests (stable/dedup, idempotent put, resolve_span slice, OOB/missing errors, uncited-rejected); clippy clean. Consumers: `rs-graph-llm/episodic-arc-task` (replaces its local fnv1a), `template-equivalence` (typed provenance). Plan: `.claude/plans/arigraph-osint-episodic-v1.md` (D-CC-ARI-3). Branch `claude/content-store-contract-draft`.
144146

145147
> **2026-06-18 — ADDED (probe-excel-compute-dag-v1 Inc 0, the `compute_dag` Core gap)**: `lance_graph_contract::class_view::{ComputeEdge, compute_dag_is_acyclic}` + `ClassView::compute_dag(class) -> &[ComputeEdge]` (default `&[]`, zero-fallback). `ComputeEdge {target: u8, inputs: &'static [u8]}` is the harvest-sourced recompute edge (`emitted_by` target ← `depends_on` inputs; field positions index the class `FieldMask`), `const`-constructible like `MethodSig`/`ActionDef` (the harvest IS the manifest). `compute_dag_is_acyclic` is the **registry-build gate** — a cyclic recompute DAG (formula loop / `@api.depends` cycle / self-loop) is rejected at build (Kahn over ≤64 positions, allocation-free; out-of-range positions ignored, no panic, mirrors `FieldMask::from_positions`). This is the Core home for computed-field recompute *dispatch* that EVERY computed-field AR consumer needs (Odoo `@api.depends`, Excel formulas, medcare lab-trends, woa calc, q2 cells — they reduce to a sheet; `E-EXCEL-SHADER-PROJECTION`) and the NNUE-incremental existence-proof shape (`E-CHESS-TENSOR-PROVEN`). **Layout-preserving**: a default trait method + a free fn, resolution metadata ABOVE the SoA, stores nothing on the row, zero `NODE_ROW_STRIDE`/`ENVELOPE_LAYOUT_VERSION` impact (core-gap-auditor's EXTEND-CORE, never an adapter-state hack). The instance recompute that consumes it is gated per-cell by the cycle-aware `write_row` (`E-SOA-CYCLE-OWNERSHIP`). Additive, zero-dep; +4 tests (default-empty, acyclic-chain, cycle/self-loop/3-cycle rejected, out-of-range ignored); 10/10 class_view, clippy/fmt clean. Sibling `ClassView::constraints` (`validation_kind`-sourced) deferred to Inc-follow-up. Plan: `.claude/plans/probe-excel-compute-dag-v1.md`. Branch `claude/particle-wave-click-epiphany`.

crates/lance-graph-contract/Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ trajectory-audit = []
4343
# I-LEGACY-API-FEATURE-GATED (field-isolation matrix + version gate).
4444
guid-v2-tail = []
4545

46+
# guid-v3-tail (P-A, plan: soa-value-tenant-migration-v2.md §2.1/§2.2) — gates the
47+
# V3 cascade-key per-classid entries. The V3 identity AXIS itself (TailVariant::V3
48+
# + ReadMode::tail_variant) is unconditional, latent (nothing reads tail_variant
49+
# yet) → non-breaking. The gated entries pin the generation marker in the HIGH
50+
# (custom) u16, preserving the canon LOW-u16 0xDDCC domain byte (so
51+
# `classid_concept_domain` still routes the legacy domain). OSINT-V3 (0x1000_0700)
52+
# is the wired exemplar; FMA-V3 (0x1000_0A01) + Genetics follow. Default OFF.
53+
guid-v3-tail = []
54+
4655
# tenant-counters — per-ValueTenant update counters for debug instrumentation of
4756
# the SoA write cascade (the capstone NaN-census / seam-wiring measurement). OFF
4857
# by default: `tenant_counter::tenant_update` is a zero-cost no-op unless enabled

0 commit comments

Comments
 (0)