feat(contract): GUID decode→read-mode keystone + helix Signed360 right-size + OCR→NodeRow transcode - #498
Conversation
#496 merged (merge 2e58e03, CI 5/5 green, CodeRabbit resolved, codex P2 dispositioned). Post-merge hygiene per the Mandatory Board-Hygiene rule: - PR_ARC_INVENTORY: prepend #496 (Added/Locked/Deferred/Docs/Confidence) — ValueSchema/ValueTenant/VALUE_TENANTS + FULL POC default + the reference plan + §0 guardrail + §9 hardening; the keystone is the next unblock. - LATEST_STATE: prepend the #496 shipped note + the keystone convergence (from_guid_prefix + classid->ClassView read-mode on registry.rs). Capture (operator "yes"): TD-LAZY-IMPORT-VERSION-PIN — the OGIT-as-lazy-import drift-control finding (immutable-address + evolvable-shape + versioned-namespace + StructuralSignature-detector; lock version-pin + reserve-don't-reclaim sibling nibbles before the OGAR-identity migration runs a real load). EPIPHANY candidate flagged for the council. https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
… HelixResidue 48B->6B
Operator caught the slab over-allocation: HelixResidue reserved 48 BYTES but the
intent was a 24-bit equal-area hemisphere DOUBLED = 48 BIT = 6 bytes (a
bits->bytes slip; 42 dead bytes), and the tenant used NONE of the helix crate.
helix crate (the math, where it belongs):
- HemispherePoint::signed_lift(n,N,sign) -- y = sign*sqrt(1-u), the full sphere
(y in [-1,1]); r^2+y^2=1 preserved; Sign{Pos,Neg}.
- Signed360 -- 6-byte signed full-sphere residue {rim: ResidueEdge (unsigned
hemisphere), polar: signed lift centred@128 (sign recoverable via .sign()),
azimuth: u16 over the full 360deg (n*phi mod 2pi)}; ResidueEncoder::encode_signed.
- +9 tests; helix 72 lib + 7 doctests green; lib clippy -D warnings + fmt clean.
contract (right-size only, NO new type):
- HelixResidue elems_per_row 48 -> 6; downstream tenants shifted (Turbovec 118 /
Energy 134 / Plasticity 138 / EntityType 142); budgets re-locked (Full 154->112,
Compressed 98->56). 613 contract lib green; clippy/fmt clean.
- NO HelixFlavour enum: one canonical encoding, one tenant size (the fixed-offset
SoA can't vary width per-class; Hemisphere = degenerate sign=+). Contract stays
zero-dep; the producer writes helix::Signed360::to_bytes into the reserved 6 B.
Cheap now (POC FULL default, no persisted real instances); after instances
persist it is a version bump. Board: LATEST_STATE note + TD-HELIX-PROBE-CLIPPY
(pre-existing probe_mantissa_fill clippy/fmt debt, NOT introduced here).
https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
…perator) + ractor note Operator ground truth 2026-06-15: surrealdb "just needed 7.0.0 / lancedb 0.30 pin" — kv-lance is implemented, only the version pin remains (no deep work). The fix is the 3-pin bump in AdaWorldAPI/surrealdb surrealdb/core/Cargo.toml, a FORK write outside this session's scope (add_repo unavailable). Once it lands -> unblocks D-PG-6 / D-MBX-9 OUT / identity Phase H. Companion: the --features supervisor blocker is the AdaWorldAPI/ractor fork's MessagingErr::Saturated match (fork lags upstream); sync the fork — also out of scope. Default builds unaffected (ractor optional, off by default). https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
…oor) — red on main resolved The standing 47/1 red (flagged by 4 parallel sessions, ridden through ~46 PRs): test_build_fast asserted byte_size() < 256*1024, but the c_levels=1 fast path is EXACTLY 256 KB (1 revision table + 1 deduction table, 256·256·2 = 128 KB each). `262144 < 262144` is false → impossible to satisfy. Fix: `<=` (the floor is 256 KB, not under it). causal-edge now 48/48 lib green. Scoped to the test bound (tables.rs, fmt-clean). The crate's separate pre-existing crate-wide clippy (15) + fmt debt (edge.rs, v2_layout_tests.rs) is NOT from this fix and is CI-invisible (causal-edge is not a workspace member) — tracked as TD-CAUSAL-EDGE-LINT for a follow-up `cargo fmt`+`clippy --fix` pass. https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
…single source)
NodeGuid gains HHT accessors (heel/hip/twig), a one-shot decode() -> GuidParts
(classid + HEEL/HIP/TWIG + family + identity in canon print order), and a
carrier read_mode() method. ReadMode bundles the two already-existing read-mode
axes (ValueSchema + EdgeCodecFlavor) — not a new node property, not a SoA column,
just the resolution lens (§0 anti-invention). classid_read_mode(u32) is the
single source both the consumer and OGAR inherit: a LazyLock<HashMap> builtin
registry, zero-fallback to ReadMode::DEFAULT for unconfigured classids.
ReadMode::DEFAULT = {Full, CoarseOnly} mirrors the ClassView::value_schema POC
default; the two sites revert together (TD-VALUESCHEMA-FULL-POC-DEFAULT paired,
guard test read_mode_default_is_full_poc). Display deduped onto the new HHT
accessors. +6 tests; 619 contract lib green; clippy -D warnings + fmt clean.
Delivers the contract-side half of the #496 keystone; the ontology-side
NiblePath::from_guid_prefix meets it at the classid (follow-up).
https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
…off)
LayoutBlock::to_node_row(classid, identity) is the reference OCR→SoA transcode
any OcrProvider (tesseract-rs + others) reuses, exercising the keystone end to
end: classid → classid_read_mode → ValueSchema gates which tenants materialise.
BlockKind::entity_type() → ValueTenant::EntityType; confidence → ValueTenant::
Energy; each written at its canon slab offset via new ValueTenant::{value_offset,
byte_len} (derived accessors over the locked carve, not new properties).
text/bbox are NOT bundled into the node (I-VSA-IDENTITIES: node = identity +
typed scalars; string + geometry live in an external content store keyed by
identity). Schema-gated writes; transcoded rows ride the SoaEnvelope zero-copy.
§0 anti-invention: reuses existing EntityType/Energy tenants, no ocr_kind field.
Lives in the contract (next to the ocr types, zero-dep, testable with no OCR
C-lib and no fork); tesseract-rs adds the contract dep + calls it. +4 tests;
623 contract lib green; clippy -D warnings + fmt clean.
https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
|
Warning Review limit reached
More reviews will be available in 13 minutes and 17 seconds. Learn how PR review limits work. Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file). ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughAdds a signed full-sphere helix encoding layer ( ChangesHelix Signed Sphere Codec, Canonical-Node Keystone Contracts, and OCR Transcode
Sequence Diagram(s)sequenceDiagram
participant OCRPipeline
participant LayoutBlock
participant classid_read_mode
participant BUILTIN_READ_MODES
participant ValueTenant
participant ResidueEncoder
participant NodeRow
OCRPipeline->>LayoutBlock: to_node_row(classid, identity)
LayoutBlock->>classid_read_mode: classid_read_mode(classid)
classid_read_mode->>BUILTIN_READ_MODES: lookup(classid)
BUILTIN_READ_MODES-->>classid_read_mode: ReadMode or DEFAULT
classid_read_mode-->>LayoutBlock: ReadMode { value_schema, edge_codec }
LayoutBlock->>ValueTenant: EntityType.value_offset() + byte_len()
LayoutBlock->>ValueTenant: Energy.value_offset() + byte_len()
LayoutBlock->>LayoutBlock: write entity_type() + confidence into 480B slab
Note over LayoutBlock,ResidueEncoder: HelixResidue tenant now 6B (Signed360)
LayoutBlock-->>NodeRow: NodeRow { guid: NodeGuid(identity, classid), value_slab }
NodeRow-->>OCRPipeline: canonical NodeRow
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f880141261
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.claude/board/PR_ARC_INVENTORY.md:
- Around line 38-50: The PR_ARC_INVENTORY.md entry for PR `#496` (lines 42-43, the
"Added" section) is incomplete—it documents only
ValueSchema/ValueTenant/VALUE_TENANTS and the ClassView default flip, but the
single merge commit 2e58e034 also shipped: Helix Signed360 codec (Sign enum,
Signed360 residue type, HemispherePoint::signed_lift,
ResidueEncoder::encode_signed), NodeGuid keystone with HHT-tier accessors
(HEEL/HIP/TWIG) and GuidParts decode with classid_read_mode registry support,
VALUE_TENANTS HelixResidue sizing correction from 48 bytes to 6 bytes, OCR
transcode implementation (BlockKind::entity_type, LayoutBlock::to_node_row), and
causal-edge test_build_fast boundary assertion fix. Expand lines 42-43 of the
"Added" bullet to document all five contribution categories as child items under
the single PR `#496` entry, so the PR_ARC entry fully reflects what was shipped in
merge commit 2e58e034.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 0c40d388-e4ac-459c-b4c9-03d187ba82ca
📒 Files selected for processing (10)
.claude/board/LATEST_STATE.md.claude/board/PR_ARC_INVENTORY.md.claude/board/TECH_DEBT.mdcrates/causal-edge/src/tables.rscrates/helix/src/lib.rscrates/helix/src/placement.rscrates/helix/src/residue.rscrates/lance-graph-contract/src/canonical_node.rscrates/lance-graph-contract/src/lib.rscrates/lance-graph-contract/src/ocr.rs
…gn-partition Two codex P2s on #498: - ENVELOPE_LAYOUT_VERSION 1→2 — the HelixResidue 48→6 B right-size shifted every downstream value-tenant offset; bump gates it so a v1 blob refuses to decode rather than read tenants from the wrong bytes (safe: nothing persisted under v1, FULL is POC-only). - Signed360: encode |y| in 7 bits + sign in the partition (Pos⇒[128,255], Neg⇒[0,127]) so a near-rim negative lift (|y|≈0) can't round to 128 and read back as Pos. Regression test signed360_neg_sign_survives_near_rim_at_high_total. Also adds the #498 PR_ARC_INVENTORY entry (CodeRabbit mis-attributed this PR's helix/keystone/OCR/causal-edge work to #496 — corrected: it's #498's). contract 623 lib, helix 73 lib + 7 doc green; clippy -D warnings + fmt clean. https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
…5-specialist framing) Five specialists (cascade / family-codec / palette / dto-soa / truth-architect) framed the merged #497 OCR-transcode plans against the post-#498 substrate. Two showstoppers + 6-way drift; all 7 plans corrected: - HelixResidue 48 B → 6 B everywhere (a stored Signed360 index, not a 48-byte field); budgets/carve rebaselined (Full 112, [32,144)); headers #496 → #498. - "Morton-tile stacked-pyramid perturbation-shader" purged (does not exist; Morton rejected for Hilbert) → real primitives (mipmap pyramid / HHTL depth-cascade / CAKES). - "reversible without a hash" reframed: no residue→rank inverse exists; node = identity → content-store lookup, codebook = repair signal (I-VSA-IDENTITIES). - §0 tripwires: no ValueSchema::Ocr variant (ride Full/Compressed); Meta de-overloaded (confidence→Energy, provenance→Plasticity, OOV→content-store); TurbovecResidue is the edge codec, glyph→word uses DeepNSM CamCodes. - master critical path 42→53 becomes 42→{50,51}→53 (resolves the open #497 CodeRabbit Major). New ocr-probes-v1.md specs the 4 gating probes (OCR-RT/DET/POST/SCHEMA) for the unmeasured claims (int8-exact LSTM, bit-reproducible diff, 200k-LOC 1:1 layout). OCR-SCHEMA shipped as a contract test proving OCR rides an existing preset. EPIPHANIES E-OCR-PLAN-DRIFT-1 + AGENT_LOG entry. contract lib green; fmt clean. https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
…oaOwner cherry-pick + LanceVersionScheduler + SurrealMailboxView (D-PG-6) Lands four tasks from the shortest-unblocking-path list surfaced after PR #497-#501 + the AdaWorldAPI/surrealdb fork bump (lance/lance-index =7.0.0, lancedb =0.30.0, ndarray exact-rev). All four meet at the single contract trait `MailboxSoaView`, closing the cascade in one commit (E-UNBLOCK-CASCADE-1). ## Task 3 — `NiblePath::{from_guid_prefix, prefix}` (zero-dep, foundational) Ontology-side keystone follow-up of PR #498's `classid → ReadMode` LE contract. The 20-nibble `classid(8) | HEEL(4) | HIP(4) | TWIG(4)` prefix overflows the 16-nibble MAX_DEPTH: the deterministic fold drops the canon-reserved high u16 of classid (root-first pack: `classid_lo(4) | HEEL(4) | HIP(4) | TWIG(4)`), returning None when the fold would be lossy. `prefix(d)` is the O(1) ancestor view; `prefix(d).is_ancestor_of(self)` holds for every d ≤ self.depth (the routing-cache view of a deeper class path). +7 tests in `hhtl::tests`; contract lib 619 → 632 green. ## Task 2 — `impl MailboxSoaView + MailboxSoaOwner for MailboxSoA<N>` Cherry-pick of jolly-cori-clnf9 commit 463d71b (integrated-cognitive-planner-v1 §2 Seam #3, +149 LOC). Adds `pub phase: KanbanColumn` field + zero-copy repr(transparent) slice impls (edges_raw, meta_raw) + the in-RAM Rubicon driving-loop test (`test_in_ram_driving_loop_walks_rubicon_to_commit`). The contract spine (#437/#439) now drives an actual loop end-to-end — no surreal, no ractor bus needed for the in-process case. +1 driving-loop test; cognitive-shader-driver lib 85 → 86 green. ## Task 1 — `LanceVersionScheduler` over `VersionedGraph::versions()` D-MBX-9-IN core impl (the CI-gated twin of the contract slice shipped 2026-05-31). Lives in `crates/lance-graph/src/graph/scheduler.rs`. Wraps a `VersionedGraph` + inner `VersionScheduler<S = NextPhaseScheduler>` and exposes: - `drive_once(view, exec)` — read current Lance version, lower to a move - `drive_at_latest(view, exec)` — fold `versions().last()` into a move - `current_dataset_version()` — typed `DatasetVersion` over nodes head Closes `E-SUBSTRATE-IS-THE-SCHEDULER`'s OUT-direction end-to-end. The OUT direction stays propose-not-dispose (R1): returned `KanbanMove` is for the caller's `MailboxSoaOwner::try_advance_phase` to apply. +5 tests with real on-disk tempdir Lance (no mocks). ## Task 4 — `SurrealMailboxView<'a>` (D-PG-6 contract slice) Read-only `MailboxSoaView` adapter the SurrealQL projection populates via `from_columns(...)` — pure zero-copy borrow over the kv-lance scan's byte buffers. Imports `MailboxSoaView` but NOT `MailboxSoaOwner` (compile-time enforcement of `kanban.rs:1-21` "surreal=project-read-only, callcenter=commit"). `read_via_kv_lance()` returns the new typed `SurrealContainerError::BlockedColdBuild` until the surrealdb fork dep in `Cargo.toml` is uncommented — kept off by default to avoid the ~10 min cold surrealdb build for contributors who don't need it. The contract surface is available today; the integration is one Cargo.toml edit + a SurrealQL projection body in `view.rs`. +4 tests; new `lance-graph-contract` dep in surreal_container/Cargo.toml; BLOCKED(C) marker flipped to RESOLVED. ## What this unblocks - **D-MBX-9-IN-impl** — SHIPPED (the contract trait now has a Lance-backed implementor). - **D-MBX-A6-P3** — still queued, BUT Seam #3 (the in-RAM loop) is now in-tree; a downstream session can wire the emit-side without depending on the unmerged jolly branch. - **D-PG-6 (Rubicon kanban VIEW)** — contract slice SHIPPED; impl-side gated on `BlockedColdBuild` flip-on (one Cargo.toml uncomment + projection body). - **Identity-architecture v1 §3 P-SCOPE-CLASSIFY** — solved (the bijection-width fix is deterministic + ancestor-preserving + falsifiable by tests). ## Tests + clippy - lance-graph-contract: **632** (+7 hhtl) - cognitive-shader-driver: **86** (+1 driving-loop) - lance-graph::scheduler: **5** (new module, real Lance tempdir) - surreal_container::view: **4** (new module) All clippy `-D warnings` clean on the new files. Pre-existing lints in lance-graph-ontology / lance-graph-planner / ndarray_bridge.rs are out of session scope. ## Board hygiene (mandatory rule) - LATEST_STATE.md — Contract Inventory PREPEND for the new types. - EPIPHANIES.md — E-UNBLOCK-CASCADE-1: three independent landings converge on one trait surface, closing four queued deliverables in one commit. - AGENT_LOG.md — task-by-task summary with test counts. https://claude.ai/code/session_01Xzyc27Nx3f8WC5KzwfWfjx
…oaOwner cherry-pick + LanceVersionScheduler + SurrealMailboxView (D-PG-6) Lands four tasks from the shortest-unblocking-path list surfaced after PR #497-#501 + the AdaWorldAPI/surrealdb fork bump (lance/lance-index =7.0.0, lancedb =0.30.0, ndarray exact-rev). All four meet at the single contract trait `MailboxSoaView`, closing the cascade in one commit (E-UNBLOCK-CASCADE-1). ## Task 3 — `NiblePath::{from_guid_prefix, prefix}` (zero-dep, foundational) Ontology-side keystone follow-up of PR #498's `classid → ReadMode` LE contract. The 20-nibble `classid(8) | HEEL(4) | HIP(4) | TWIG(4)` prefix overflows the 16-nibble MAX_DEPTH: the deterministic fold drops the canon-reserved high u16 of classid (root-first pack: `classid_lo(4) | HEEL(4) | HIP(4) | TWIG(4)`), returning None when the fold would be lossy. `prefix(d)` is the O(1) ancestor view; `prefix(d).is_ancestor_of(self)` holds for every d ≤ self.depth (the routing-cache view of a deeper class path). +7 tests in `hhtl::tests`; contract lib 619 → 632 green. ## Task 2 — `impl MailboxSoaView + MailboxSoaOwner for MailboxSoA<N>` Cherry-pick of jolly-cori-clnf9 commit 463d71b (integrated-cognitive-planner-v1 §2 Seam #3, +149 LOC). Adds `pub phase: KanbanColumn` field + zero-copy repr(transparent) slice impls (edges_raw, meta_raw) + the in-RAM Rubicon driving-loop test (`test_in_ram_driving_loop_walks_rubicon_to_commit`). The contract spine (#437/#439) now drives an actual loop end-to-end — no surreal, no ractor bus needed for the in-process case. +1 driving-loop test; cognitive-shader-driver lib 85 → 86 green. ## Task 1 — `LanceVersionScheduler` over `VersionedGraph::versions()` D-MBX-9-IN core impl (the CI-gated twin of the contract slice shipped 2026-05-31). Lives in `crates/lance-graph/src/graph/scheduler.rs`. Wraps a `VersionedGraph` + inner `VersionScheduler<S = NextPhaseScheduler>` and exposes: - `drive_once(view, exec)` — read current Lance version, lower to a move - `drive_at_latest(view, exec)` — fold `versions().last()` into a move - `current_dataset_version()` — typed `DatasetVersion` over nodes head Closes `E-SUBSTRATE-IS-THE-SCHEDULER`'s OUT-direction end-to-end. The OUT direction stays propose-not-dispose (R1): returned `KanbanMove` is for the caller's `MailboxSoaOwner::try_advance_phase` to apply. +5 tests with real on-disk tempdir Lance (no mocks). ## Task 4 — `SurrealMailboxView<'a>` (D-PG-6 contract slice) Read-only `MailboxSoaView` adapter the SurrealQL projection populates via `from_columns(...)` — pure zero-copy borrow over the kv-lance scan's byte buffers. Imports `MailboxSoaView` but NOT `MailboxSoaOwner` (compile-time enforcement of `kanban.rs:1-21` "surreal=project-read-only, callcenter=commit"). `read_via_kv_lance()` returns the new typed `SurrealContainerError::BlockedColdBuild` until the surrealdb fork dep in `Cargo.toml` is uncommented — kept off by default to avoid the ~10 min cold surrealdb build for contributors who don't need it. The contract surface is available today; the integration is one Cargo.toml edit + a SurrealQL projection body in `view.rs`. +4 tests; new `lance-graph-contract` dep in surreal_container/Cargo.toml; BLOCKED(C) marker flipped to RESOLVED. ## What this unblocks - **D-MBX-9-IN-impl** — SHIPPED (the contract trait now has a Lance-backed implementor). - **D-MBX-A6-P3** — still queued, BUT Seam #3 (the in-RAM loop) is now in-tree; a downstream session can wire the emit-side without depending on the unmerged jolly branch. - **D-PG-6 (Rubicon kanban VIEW)** — contract slice SHIPPED; impl-side gated on `BlockedColdBuild` flip-on (one Cargo.toml uncomment + projection body). - **Identity-architecture v1 §3 P-SCOPE-CLASSIFY** — solved (the bijection-width fix is deterministic + ancestor-preserving + falsifiable by tests). ## Tests + clippy - lance-graph-contract: **632** (+7 hhtl) - cognitive-shader-driver: **86** (+1 driving-loop) - lance-graph::scheduler: **5** (new module, real Lance tempdir) - surreal_container::view: **4** (new module) All clippy `-D warnings` clean on the new files. Pre-existing lints in lance-graph-ontology / lance-graph-planner / ndarray_bridge.rs are out of session scope. ## Board hygiene (mandatory rule) - LATEST_STATE.md — Contract Inventory PREPEND for the new types. - EPIPHANIES.md — E-UNBLOCK-CASCADE-1: three independent landings converge on one trait surface, closing four queued deliverables in one commit. - AGENT_LOG.md — task-by-task summary with test counts. https://claude.ai/code/session_01Xzyc27Nx3f8WC5KzwfWfjx
…x360, meticulously sourced New knowledge doc .claude/knowledge/weather-normalized-substrate.md: the product/engineering reference for weather AI on the substrate, written after the operator-corrected helix arc. Every code claim carries file:line and a [G]/[H]/[S] grade; absences are stated as [G-absence]; measured numbers carry their conditions and are flagged not-yet-re-runnable until the probes land. Contents: - Doctrine: one arctanh core, two readings (fisher z statistics / 2z Poincaré arc length); normalized-low-entropy is the stored form, geometry is hydratable on demand — hyperbolic_depth exposed-but-uncalled is design. - helix360 precisely: 4-stage pipeline, ResidueEdge (3 B) + Signed360 (6 B) wire shapes incl. the codex #498 sign-partition regression, the ValueTenant::HelixResidue lane (U8×6 @ offset 112) whose 2×24-bit reading IS wind in/out, and the curve-ruler hydration principle. - palette256 precisely: RollingFloor mechanics with the honest loss accounting (±0.195% span), calibration loop, the version contract; DistanceLut linear/from_floor metric-safety. - Floor scoping RESOLVED as a policy decision (shared canonical z-floor vs per-variable vs hybrid), with the Lance-version alignment proposal [S] and probes P2/P3/P6 gating it. - Per-variable weather mapping [H]; measured-evidence ledger (blosc 1.27x, Lance 1.00x verbatim on 512 B rows, BF16 anomaly 97x, from!=to 90.2% / 15.50 deg, wind_speed Jensen-gap non-derivability, u8 bearing ~8x under obs error); economics (inbound tax once); ingest spec; verification battery (jc vs ndarray mirror divergence, Jirak rule); probe queue P1-P6; and the five-entry correction ledger from this arc. Board hygiene (same commit): EPIPHANIES prepend E-HELIX360-IS-THE-NORMALIZED-SUBSTRATE-NOT-A-BIT-BUDGET-1; weather plan §0 gains append-only ⊘ C3 correcting the invented Zarr object name to the session-verified 1959-2023_01_10-full_37-1h-0p25deg-chunk-1.zarr. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…alone Operator asked "did you test signed360?". No — §12.12 was written from doc comments and a knowledge doc with nothing executed, which is the failure it diagnoses one level down: having just written "reading the primary source is not the same as reading the doctrine", I read both and ran neither. The crate's suite is 77 + 4 + 7 doctests, all green, but a green suite is not evidence for a specific claim. Audited claim-by-claim; two had nothing behind them: - "azimuth is a full-360° field" rested on a doc comment. The existing signed360_azimuth_varies_with_n asserts a != b for ONE consecutive pair, which golden-angle stepping makes true of any sane implementation — it cannot detect a truncated field. Measured over the whole domain: min 0, max 65535, 256/256 coarse arcs occupied, 54319 distinct values. - "an all-zero lane reports a definite sign" was asserted twice and never constructed. Demonstrated: from_bytes([0u8; 6]).sign() -> Sign::Neg. Also measured: polar partitions fill their halves exactly (Pos [128,255], Neg [0,127]), no overlap, no gap. Three tests, each disable-verified red-then-green against an injected defect: 10-bit truncation -> left 1023 right 65535; the #498 centred-at-128 round -> left (0,128) right (0,127); a "fixed" sentinel -> left Pos right Neg. The third pins a DEFECT, not a virtue: when the dormant-lane hazard is fixed it must fail and be re-pinned deliberately, never silently edited. Scope caveat stated in the doc rather than implied: helix is excluded from the root workspace and named in no CI workflow, so these run only by hand. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…d claims #920 merged with neither board file updated (0 references to it in either). This is the retroactive-hygiene pattern CLAUDE.md names as an anti-pattern — unavoidable once the PR is merged, and leaving the board stale is the worse outcome (the rule exists because #223/#224/#225 merged with no entries). PR_ARC_INVENTORY: prepends the #920 entry (Added / Locked / Deferred+WITHDRAWN / Docs / Confidence), and applies the file's own rules 3-4 to #917 — an appended Correction line plus an updated Confidence line, never an edit to its immutable Locked text. #917 had locked two claims #920 falsifies: that "helix360" names something (it does not — the type is Signed360, 12 blobs all from that session, zero deletions) and that the HelixResidue lane reads as 2x24 hemispheres = wind in/out (it does not — one Signed360 is already a complete full-sphere direction; rim is the metric carrier, (polar, azimuth) the render carrier). LATEST_STATE: prepends the #920 entry with the same correction as a leading supersession note. Also records a measurement made after the merge, in answer to an operator question about polar vs equatorial error rates. Signed360 angular error by latitude, N=65536: equator 0.112 deg mean / 0.226 max; pole 3.332 / 4.998 — a ~30x spread, best at the rim. And a correction to the premise: there is NO resolution gain from the sign split at equal bit budget — 7-bit |y| + sign vs 8-bit over [-1,1] measures 0.99-1.02x in every band (step 1/127 vs 2/255 = 0.996x). The 256-sample codebook figures that imply a sqrt(2) gain (full sphere cap 7.17 deg vs hemisphere 5.07) spend an EXTRA bit; at equal budget 128-on-hemisphere is 7.17, identical. What the partition buys at the rim is sign EXACTNESS, not precision — and that is exactly where weather lives, since a wind bearing is near-horizontal (y = 0), the regime where a centred-at-128 round loses the hemisphere (#498). Per the termination clause, this hygiene-only commit generates no further board obligations of its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Post-#496 branch work. Three pieces + a standing-red fix, all on the single canon
canonical_node::NodeGuid(no second GUID type —identity::NodeGuidwas retired in #490).Keystone — GUID decode + classid→read-mode (
eef7e5f9)The "read the GUID as a GUID, but resolve a class" surface:
NodeGuid::{heel(), hip(), twig()}HHT accessors +decode() -> GuidParts(all six canon groups in one read: classid · HEEL · HIP · TWIG · family · identity).ReadMode { value_schema, edge_codec }— bundles the two already-existing read-mode axes (ValueSchema+EdgeCodecFlavor). Not a new node property, not a SoA column — the resolution lens only (§0 anti-invention).classid_read_mode(u32) -> ReadMode— aLazyLock<HashMap>registry, the single source both the consumer and OGAR inherit; zero-fallback toReadMode::DEFAULTfor unconfigured classids.NodeGuid::read_mode()is the carrier-method form.Displaydeduped onto the new HHT accessors.ReadMode::DEFAULT = {Full, CoarseOnly}mirrors theClassView::value_schemaPOC default; the two sites revert together (TD-VALUESCHEMA-FULL-POC-DEFAULT, guard testread_mode_default_is_full_poc).OCR
LayoutBlock → NodeRowtranscode POC (2fa7fcb0)Reference transcode any
OcrProviderreuses, exercising the keystone end-to-end:classid → read_mode → ValueSchemagates which tenants land;BlockKind::entity_type()→EntityType,confidence→Energy, written at canon slab offsets via newValueTenant::{value_offset, byte_len}.text/bboxstay in an external content store (I-VSA-IDENTITIES). Engine-agnostic — not Tesseract-coupled.helix
Signed360+HelixResidue48 B → 6 B (66989691)Right-sizes a slab over-allocation (48 bytes → the intended 48 bit = 6 B) and gives the tenant real math:
helix::Signed360signed full-sphere codec (HemispherePoint::signed_lift,Sign{Pos,Neg}). Downstream tenant offsets shifted; budgets re-locked (Full 154→112, Compressed 98→56).causal-edge red fix (
2106be29)test_build_fastboundary<→<=(the c_levels=1 floor is exactly 256 KB) — resolves a standing red on main.Tests
-D warnings+ fmt clean across touched cratesNote
The tesseract-rs cross-repo wiring explored mid-session was reverted (board reflects it) — hand-wrapping the original Tesseract C engine is the wrong direction. Pure-Rust OCR via
ocrs+rten(ONNX-adjacent) is the chosen path, parked pending scope.https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
Generated by Claude Code
Summary by CodeRabbit
New Features
Bug Fixes
Documentation