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
feat(contract): SoA-as-graph domain foundation for OSINT/Gotham + FMA (q2 consumer)
"Prepare everything so q2 can render nodes/edges + family nodes + HHTL
CLAM hop adjacency, neo4j-emulation" — the lance-graph half (q2 renders
the pixels). The OSINT domain is the Palantir-Gotham neo4j-emulation
class (OGAR classid 0x0007); FMA anatomy (0x0008) is the second instance
of the SAME family-node + HHTL machinery, bones as stability anchors.
Reuses, does not duplicate (consult-don't-guess via two Explore agents):
- graph_render.rs ALREADY is the Neo4j/Gotham surface (GraphSnapshot /
RenderNode / RenderEdge, consumer = q2 cockpit) -> projected INTO, not
re-typed.
- NiblePath::from_guid_prefix ALREADY is the canonical GUID->path lowering
-> symbiont's hhtl_path_of collapsed onto it (third copy removed).
New contract::soa_graph (zero-dep, q2-consumable):
- project_snapshot(&[NodeRow], &DomainSpec) -> GraphSnapshot: projects the
32-byte head (NodeGuid + EdgeBlock) — family nodes (by u24 family),
member->family + in-family (identity-low-byte) + out-of-family
(family-low-byte) edges. Zero value decode.
- nearest_anchor: ranks each node to its nearest stability-anchor family
by NiblePath::family_hop_count (new CLAM hop metric). Anchors are HEAD
families (FMA bones / OSINT key entities), never value-slab types — so
the projection stays head-only (E-ANCHOR-IS-A-HEAD-FIELD-NOT-A-VALUE-TYPE),
falsifiably (projection_is_head_only_zero_value_decode poisons the slab).
- DomainSpec + registered OSINT_GOTHAM (0x0007) + FMA_ANATOMY (0x0008).
canonical_node: NodeGuid::CLASSID_OSINT/CLASSID_FMA + ReadMode::OSINT
(Cognitive/CoarseOnly, hot) + ReadMode::FMA (Compressed/CoarseOnly, cold)
in BUILTIN_READ_MODES. hhtl: NiblePath::family_hop_count.
Rendering deferred to the q2 session; Callcenter DataFusion/gremlin POC +
OntologyRegistry ClassView labels + helix-basin-anchor (CLAM<>Louvain
turbovec edge residue) are named next slices — the shipped POC is hop count.
cargo test -p lance-graph-contract: 698/698 (7 new). symbiont: 12/12.
clippy -D warnings clean. Board updated (LATEST_STATE, AGENT_LOG,
EPIPHANIES, plan) in the same commit.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Copy file name to clipboardExpand all lines: .claude/board/AGENT_LOG.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,11 @@
1
+
## 2026-06-20 (cont.⁶) — SoA-as-graph domain foundation for q2 (OSINT/Gotham 0x0007 + FMA 0x0008)
2
+
3
+
**Main thread (Opus), autoattended.** Operator: "prepare everything so q2 can render nodes/edges + family nodes + HHTL CLAM hop adjacency, neo4j-emulation; OSINT OGAR class is 0x0007; also FMA anatomy 70k as body with bones as stability anchor — rendering is wired in the q2 session, here just the basic domain + SoA-as-graph." Grounded with two parallel Explore agents (q2 wiring + lance-graph ontology/callcenter/polyglot) BEFORE building — consult-don't-guess paid off twice: (a) `graph_render.rs` ALREADY is the Neo4j/Gotham surface (`GraphSnapshot`/`RenderNode`/`RenderEdge`, consumer = q2 cockpit) → reused, not duplicated; (b) `NiblePath::from_guid_prefix` ALREADY is the canonical GUID→path lowering → de-duped symbiont's third copy onto it.
4
+
5
+
NEW `contract::soa_graph` (zero-dep, q2-consumable): `project_snapshot(&[NodeRow], &DomainSpec) -> GraphSnapshot` projects the 32-byte head (NodeGuid+EdgeBlock) into the Gotham surface — family nodes (by u24 family), member→family + in-family (identity-low-byte) + out-of-family (family-low-byte) edges. `nearest_anchor` ranks every node to its closest stability-anchor family by the NEW `NiblePath::family_hop_count` (CLAM tree distance = `2·(16−lcp)` on the fixed-depth lowering). `DomainSpec` (domain-agnostic data) + two registered consts: `OSINT_GOTHAM` (classid `0x0007`) + `FMA_ANATOMY` (`0x0008`). Registered both in `BUILTIN_READ_MODES`: `ReadMode::OSINT` (Cognitive/CoarseOnly, hot entity graph) + `ReadMode::FMA` (Compressed/CoarseOnly, cold structural reference). All structure is HEAD-ONLY (anchors = `family` ids, not value-slab entity-types) → the whole projection is zero value decode, falsifiably (`projection_is_head_only_zero_value_decode` poisons the slab, asserts invariant).
6
+
7
+
**Rendering deferred to q2** (per operator). **Callcenter DataFusion/gremlin POC + the heavier OntologyRegistry ClassView labels = next slices** (named, not built). `cargo test -p lance-graph-contract`**698/698** (7 new: soa_graph ×5, family_hop_count, osint/fma classids); `cargo test --manifest-path crates/symbiont`**12/12** (symbiont `hhtl_path_of` converged onto `from_guid_prefix`, its 2 semantics tests updated 12→16-nibble). clippy `-D warnings` clean. EPIPHANIES `E-ANCHOR-IS-A-HEAD-FIELD-NOT-A-VALUE-TYPE`. Pushed to main.
8
+
1
9
## 2026-06-20 (cont.⁵) — §2.4 key-only neo4j render green (zero value decode, falsifiable)
2
10
3
11
**Main thread (Opus), autoattended.** Operator picked superpower §2.4 from the post-reconciliation menu. Read the canon surface in full first (`canonical_node.rs` NodeGuid/EdgeBlock/NodeRow + ValueTenant carve; `soa_view.rs` the `hhtl_path_at`/`edge_block_at`/`identity_plane_at` deferred key facets; `hhtl.rs` NiblePath) — not a scent-skim.
Copy file name to clipboardExpand all lines: .claude/board/EPIPHANIES.md
+17Lines changed: 17 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,20 @@
1
+
## 2026-06-20 — E-ANCHOR-IS-A-HEAD-FIELD-NOT-A-VALUE-TYPE — graph STRUCTURE (domain, family grouping, hierarchy, stability anchors, adjacency) must key off the 32-byte HEAD (classid / family / HHTL path), never the value slab; only then does the whole neo4j/Gotham view — and "FMA bones as stability anchor" — stay zero-value-decode at memory-scan speed
When a domain wants a "type" or "category" to drive graph structure or layout, the System-1 reflex is to read an entity-type field — which lives in the **value slab** (`ValueTenant::EntityType`, bytes 32..512). That quietly defeats the entire `E-GUID-IS-THE-GRAPH` thesis: the moment structure depends on a value field, the "render from the head" scan has to decode the value, and the 8 MiB of slabs go hot. The fix is an ontology discipline, not a trick: **every structural axis is already in the 32-byte head**, so put the category there.
6
+
7
+
The head carries three orthogonal structural axes, and the OSINT/Gotham + FMA graph uses all three with zero value decode:
8
+
1. **Domain = `classid`** (bytes 0..4, head). OSINT/Gotham = `0x0007`, FMA-anatomy = `0x0008`. The `classid → ReadMode` registry resolves how to read the 128+128 — itself a head-only lookup.
9
+
2. **Family grouping = `family`** (u24, bytes 10..13, head). `soa_graph::project_snapshot` emits one family node per distinct `family`; "use family nodes" is a head field, not a join.
10
+
3. **Hierarchy + adjacency = the HHTL path** (`classid_lo·HEEL·HIP·TWIG`, head). `NiblePath::family_hop_count` (CLAM tree distance) ranks nearest-anchor with no value read.
11
+
12
+
The keystone: **a stability anchor is a FAMILY (head), not an entity-type (value).** "FMA bones as the skeleton the soft tissue hangs off" is expressible as `DomainSpec::anchor_families: &[u32]` — a list of head `family` ids — so `nearest_anchor` computes the bone-distance layout signal entirely from keys. Had we modelled "bone" as a value-slab entity-type, a 70k-node anatomy render would decode 70k×480 B just to find the skeleton. Because anchor-ness is a head field, the same projector serves the Gotham entity graph and the FMA body with one zero-value-decode sweep.
13
+
14
+
The general rule: **value slab = content (fingerprints, qualia, energy); head = structure (identity, domain, family, hierarchy, anchors).** If a graph/layout/routing decision is reaching into the value slab, the category is in the wrong register — lift it to classid/family/HHT. Cross-ref: `E-GUID-IS-THE-GRAPH`, `E-ZERO-DECODE-IS-FALSIFIABLE-BY-POISON` (the test that catches a regression here — `soa_graph::tests::projection_is_head_only_zero_value_decode` poisons the slab and asserts the snapshot is invariant), `E-BASIN-IS-A-NODE` (the family/basin tree this projects), OGAR `CLAUDE.md` P0 "the key prerenders nodes with zero value decode."
15
+
16
+
---
17
+
1
18
## 2026-06-20 — E-ZERO-DECODE-IS-FALSIFIABLE-BY-POISON — a "we never read region X" claim (zero-value-decode key render, cold-column skip, head-only scan) is not a comment, it is a TEST: poison region X with a sentinel, run the op, assert the output is byte-identical to the un-poisoned run; if it touched X, the bytes diverge
Copy file name to clipboardExpand all lines: .claude/board/LATEST_STATE.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,6 +16,8 @@
16
16
17
17
---
18
18
19
+
> **2026-06-20 — branch work (`claude/jirak-math-theorems-harvest-rfii13`)** — **SoA-as-graph domain foundation for the OSINT/Gotham + FMA consumers (q2 renders the pixels).** New zero-dep `contract::soa_graph`: `project_snapshot(&[NodeRow], &DomainSpec) -> graph_render::GraphSnapshot` projects the canonical 32-byte head (NodeGuid + EdgeBlock) into the EXISTING Gotham/neo4j surface (`graph_render` — reused, not duplicated) — family nodes (by u24 `family`), member/in-family/out-of-family edges, all **zero value decode**. `nearest_anchor` ranks nodes to their nearest stability-anchor family by the new `NiblePath::family_hop_count` (CLAM tree distance). Two domains registered: `OSINT_GOTHAM` (classid **`0x0007`**) + `FMA_ANATOMY` (**`0x0008`**, bones = anchor families) in `BUILTIN_READ_MODES` (`ReadMode::OSINT` Cognitive/CoarseOnly hot; `ReadMode::FMA` Compressed/CoarseOnly cold). Anchor-ness is a HEAD field (`family`), never a value type — so "FMA bones as stability anchor" stays head-only (`E-ANCHOR-IS-A-HEAD-FIELD-NOT-A-VALUE-TYPE`). De-duped the GUID→NiblePath lowering: symbiont's `hhtl_path_of` now delegates to canonical `from_guid_prefix` (third copy collapsed). 698 contract + 12 symbiont tests green, clippy clean. **Deferred (named):** q2 rendering (q2 session), Callcenter DataFusion/gremlin POC, OntologyRegistry ClassView labels. Refs: AGENT_LOG 2026-06-20 (cont.⁶), EPIPHANIES `E-ANCHOR-IS-A-HEAD-FIELD-NOT-A-VALUE-TYPE`.
20
+
>
19
21
> **2026-06-20 — branch work (`claude/happy-hamilton-0azlw4`)** — **UNICHARSET `other_case` transcoded + byte-parity proven (E-CPP-PARITY-5), the fifth leaf.** `UniCharSet` now parses the case-pair id (the token right after the script) into `other_cases: Vec<i32>`, applying the load-time clamp (`unicharset.cpp:901`: a value `>= size`, incl. the absent default, folds to the id itself). Exposes `get_other_case` + `dump_other_case`, mirroring `unicharset.h:703` (out-of-range id → `INVALID_UNICHAR_ID` -1). **Byte-identical 112/112** on real `eng.lstm-unicharset` vs tesseract's own `get_other_case` (self-validating oracle, `other_case` mode; 60/112 self, 52 real pairs, e.g. `C`→`c`). Last field cleanly reachable by token-offset; direction/mirror/bbox need the multi-tier parser (next, larger leaf). Additive, zero-dep; +4 contract tests (23 unicharset total), clippy `-D warnings` + fmt clean; reproducible via `examples/unicharset_dump.rs other_case`. Consumed by `tesseract-core::CharSet::get_other_case` (+1 boundary test, 6/6). No Core gap. EPIPHANIES `E-CPP-PARITY-5`.
20
22
>
21
23
> **2026-06-20 — branch work (`claude/happy-hamilton-0azlw4`)** — **UNICHARSET script table transcoded + byte-parity proven (E-CPP-PARITY-4), the fourth leaf — first to transcode an INTERNING side-table.** `UniCharSet` now parses the per-line script name (the token after the optional bbox/stats CSV), interns it via an `add_script`-equivalent (`unicharset.cpp:1063`, insertion-order dedup) into `scripts: Vec<String>` with `null_script` ("NULL") seeded at sid 0 (the `unichar_insert` set_script, `unicharset.cpp:680`; so `null_sid_ == 0` always), and stores `script_ids: Vec<i32>`. Exposes `get_script` / `get_script_table_size` / `script_from_script_id` / `script_of` / `dump_script`, mirroring `unicharset.h:681` (out-of-range → `null_sid_` 0). **Byte-identical 112/112** on real `eng.lstm-unicharset` vs tesseract's own `get_script` (same self-validating oracle, `script` mode; oracle table = `["NULL","Common","Latin"]` confirmed empirically before writing the Rust). Mixed-tier safe (eng id 0 is tier-5 no-CSV, others tier-1 CSV). Additive, zero-dep; +4 contract tests (19 unicharset total), clippy `-D warnings` + fmt clean; reproducible via `examples/unicharset_dump.rs script`. Consumed by `tesseract-core::CharSet::{get_script,script_of}` (+1 boundary test, 5/5). No Core gap. EPIPHANIES `E-CPP-PARITY-4`. Next leaf: the full column tier-parser (unlocks other_case/mirror/direction/bbox).
0 commit comments