SoA envelope: zero-copy register-file model + LE contract + ontology resolution audit#477
Conversation
Q3 verdict: (B) Damped relaxation + (D) wave vocabulary.
The executable substrate is feed-forward bind/bundle/cosine with saturating
gates and a hard-capped contraction loop (fe *= 0.5, depth < 9). No closed
feedback, no vsa16k_permute on the f32 carrier, no phase decode, no
self-sustaining field. global_context reshaping next cycle: 0 source hits.
Key gap: vsa_permute exists only on the binary VsaVector in ndarray (correct,
norm-preserving). The Vsa16kF32 "Click" carrier has no permutation — the braid
that the architecture rests on is missing from the carrier it is claimed on.
Latent bug identified: kv_bundle::unbundle_from uses wrapping_sub (raw
subtraction) as the inverse of a weighted-average bundle — not an inverse.
Q4 verdict: HHTL is addressing — but only in hhtl.rs. high_heel.rs is 0%
address algebra. The two files share a name but are different concepts.
hhtl.rs: NiblePath { path: u64, depth: u8 }, fan-out 16, nibble-shift prefix
arithmetic. is_ancestor_of is the kernel — 4 lines, const, O(1). Every other
relation (descendant, sibling, common_ancestor) derives from it. Clean.
high_heel.rs breakdown (~900 lines):
- ~290 LOC: LensProfile/LensConfig/LENS_REGISTRY — encoding calibration,
zero addressing. Should move out of lance-graph-contract entirely.
- ~170 LOC: BasinAccumulator + calibrate — online metric clustering (L1
distance, EMA centroids). Not derivable from prefix axioms.
- scent() — the advertised 95%-rejection HEEL pre-filter — is dead code in
the merge path. BasinAccumulator::ingest never calls it.
- The test ships its own failure diagnosis: eprintln!("Low merge ratio...
threshold may be too tight") and "texts not clustering meaningfully".
Refactor prescription:
- Keep hhtl.rs as-is (the real HHTL kernel).
- Split high_heel.rs into high_heel_container.rs + basin_accumulator.rs +
lens_profile.rs.
- Wire scent() into ingest() or remove the cascade claim.
https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
Audits the current implementation against the intended particle model (one mailbox-owned thought, one SoA envelope, immutable address identity, OGAR class inheritance, Lance versioning, CausalEdge64 as payload, explicit references, local pragmatics). Findings tagged Confirmed/Inferred/Absent/Contradiction per phase, all file-path grounded. Key results: two competing SoA envelopes (BindSpace global + MailboxSoA per-mailbox); deprecated Vsa16kF32 still live as the BindSpace cycle plane (65 KB/row); two incompatible CausalEdge64 types; OGAR::classes::from(address) reverse resolver absent (forward-only in OGAR, linear scan in lance-graph); references are explicit Copy handles with no ownership cycles; Lance versioning clean. Seven minimal corrections proposed, no theory-driven renames.
Reframes every section that treated the real-valued VSA algebra as a singleton cross-mailbox carrier. The algebra findings (no permute on the real-valued path, damped relaxation, no closed feedback loop) are unchanged — they now describe the per-mailbox computation correctly. Removed the stale correction block; the body is now self-consistent.
…1) 90deg lookup Self-through-time is provided by the LanceDB table geometry: a prior version is a 90-degree lookup (orthogonal to the current write), O(1) by version tag, not a recurrence. The probe's standing-wave question assumed temporal persistence had to live in the compute path. It doesn't. Any recurrence mechanism would be a redundant reimplementation of Lance versioning. Prescription updated accordingly.
The SoA envelope must know the little-endian contract, not just its columns. ndarray::simd::MultiLaneColumn already provides the per-column LE contract (standalone, usable by any pure-SIMD consumer). What was missing: an envelope-level contract describing how columns assemble into one row-strided packet with a cycle stamp. New zero-dep module lance_graph_contract::soa_envelope: - ColumnKind / ColumnDescriptor (LE element width, offset, elems/row) - SoaEnvelope trait: columns(), row_stride(), n_rows(), cycle(), LAYOUT_VERSION, as_le_bytes(), zero-copy row_le()/column_le(), verify_layout() gate (stride/overlap/packet-size/version skew) - 7 unit tests, all passing Deliberately NOT pulling ndarray into the contract: it would force the heavy HPC build onto crewai-rust/n8n-rs (zero-dep consumers) and force pure-SIMD ndarray consumers to pull a graph contract crate. Two-level split keeps both crates clean. Iron rule: ndarray owns the column contract, lance-graph owns the envelope contract, neither restates the other, lance-graph binds them. Also flags CLAUDE.md ndarray-hpc fallback wording for demotion (no shipped consumer runs without ndarray; the fallback is CI-only).
Every SoA envelope is zero-copy from creation to Lance tombstone. There
is no baton, no CollapseGateEmission, no inter-mailbox handoff type.
audit doc:
- Phase 7 rewritten: LE contract is an in-place backing-store descriptor,
not a transmitted packet. Baton/CollapseGateEmission references removed.
The {to,from}_le_bytes on CE64/EpisodicEdges64 are Lance I/O seams, not
cross-mailbox serialization.
- Phase 1: emit()/CollapseGateEmission flagged as code artifact to remove.
- Correction 9 added: remove MailboxSoA::emit() and CollapseGateEmission.
- Geometry verdict: last_emission_cycle → rename to last_active_cycle.
- Bottom line updated: zero-copy lifecycle replaces "execution split".
- Phase 7 follow-up: crewai/n8n replaced with OGAR classes/ractor actors
as the contract's non-HPC consumers. "packet" language removed.
soa_envelope.rs:
- Module doc: "in-place backing store" replaces "packet/snapshot".
"zero-copy from creation to Lance tombstone" stated explicitly.
- SoaEnvelope trait doc: "in-place backing store" not "packet".
- Layering table: "row stride" not "row packet".
- crewai/n8n removed from consumer description.
- PacketSizeMismatch clarified: backing store size mismatch.
https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
Canonical architecture reference replacing any prior baton/emission framing.
Three tiers:
1. MailboxSoA (primary): zero-copy in-place, creation → Lance tombstone.
No emit(), no CollapseGateEmission, no inter-mailbox handoff type.
last_active_cycle replaces last_emission_cycle (idempotency guard only).
2. KanbanColumn/Rubicon (sole secondary): Lance write → VersionScheduler
(read-only) → KanbanMove → MailboxSoaOwner::advance_phase (sole mutator).
Ractor (lance-graph-supervisor) provides actor-level meta-orchestration.
3. OGIT ontology + OGAR classes (inherited, O(1)): HHTL/NiblePath prefix
→ radix-trie codebook → class + schema + label inheritance (compile-time
for known classes, JIT via lance-graph-planner for new ones). entity_type
per-row may be redundant. surrealdb/kv-lance: BLOCKED(C).
Includes full "what does NOT exist" table and six iron rules.
https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
…scriptor New section added to three-tier model doc. Mental model: SoA columns are CPU-style LE registers (fixed offset, fixed width, no schema in the row). OGAR class is the instruction-set descriptor and DTO store for active record (label + schema + tools + codegen templates). Three sub-sections: - SoA columns = LE registers: byte-offset table, SoaEnvelope as ABI doc, ColumnDescriptor as register descriptor, MultiLaneColumn as load/store unit. - OGAR class = ISA descriptor + active record: label-inheritance via HHTL, schema stored once per class (never in rows), tools inherited from class hierarchy (prefix ancestry = class ancestry), active record = class wrapping a register bank slice. - Askama/Jinja codegen = masked selection from class DTO: Class<Template> is a compile-time field projection over the class schema — one select mask, zero new types, zero runtime dispatch. Every DTO is a derived view of an OGAR class; independent DTO structs = schema drift. Lookup table: CPU register file vs SoA mailbox (register bank / ABI doc / load-store / ISA / calling convention / object code / active register state). https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
|
Warning Review limit reached
More reviews will be available in 24 minutes and 42 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ 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 (3)
📝 WalkthroughWalkthroughThis PR introduces a byte-geometry SoA envelope contract module ( ChangesSoA Envelope Contract & System Architecture
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 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: c78a55fad1
ℹ️ 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".
| if summed != stride { | ||
| return Err(EnvelopeError::StrideMismatch { | ||
| declared: stride, | ||
| summed, | ||
| }); | ||
| } |
There was a problem hiding this comment.
Reject descriptors that extend past the row stride
When a descriptor's offsets leave a leading gap or place a later column past the end of the row, verify_layout() still succeeds as long as the column widths sum to row_stride(). For example, two 4-byte columns at offsets 4 and 8 with stride 8 pass this check even though the second column's range is outside every row; consumers then get None from column_le() or silently accept an invalid Lance layout at the read boundary. Track the maximum end offset/contiguity against the declared stride rather than only comparing the summed widths.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (2)
crates/lance-graph-contract/src/soa_envelope.rs (1)
219-359: 💤 Low valueTests are comprehensive and well-structured.
All major error paths are covered (stride mismatch, overlap, packet size mismatch, out of bounds). The zero-copy slice behavior is validated. Test helper
two_col_envelopeis clean and reusable.💡 Optional: Add version mismatch test for completeness
The
LayoutVersionMismatcherror variant is not currently tested. While the version check logic is trivial, testing it would improve coverage of the version-gating contract mentioned in the coding guidelines.#[test] fn version_mismatch_caught() { struct BadVersionEnvelope(TestEnvelope); impl SoaEnvelope for BadVersionEnvelope { const LAYOUT_VERSION: u8 = 99; // Mismatched version fn columns(&self) -> &[ColumnDescriptor] { self.0.columns() } fn row_stride(&self) -> usize { self.0.row_stride() } fn n_rows(&self) -> usize { self.0.n_rows() } fn cycle(&self) -> u32 { self.0.cycle() } fn as_le_bytes(&self) -> &[u8] { self.0.as_le_bytes() } } let env = BadVersionEnvelope(two_col_envelope(1)); assert_eq!( env.verify_layout(), Err(EnvelopeError::LayoutVersionMismatch { expected: ENVELOPE_LAYOUT_VERSION, found: 99, }) ); }🤖 Prompt for 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. In `@crates/lance-graph-contract/src/soa_envelope.rs` around lines 219 - 359, The tests miss exercising the LayoutVersionMismatch path: add a small test that implements SoaEnvelope with a different const LAYOUT_VERSION (e.g., wrap TestEnvelope in a BadVersionEnvelope type that sets const LAYOUT_VERSION = 99) and call verify_layout() to assert Err(EnvelopeError::LayoutVersionMismatch { expected: ENVELOPE_LAYOUT_VERSION, found: 99 }), referencing the SoaEnvelope impl, TestEnvelope helper, verify_layout(), EnvelopeError::LayoutVersionMismatch, and ENVELOPE_LAYOUT_VERSION so the version-gate branch is covered.docs/probes/particle-soa-envelope-audit.md (1)
1-562: 💤 Low valueAudit documentation is comprehensive and accurate.
The 9-phase audit is methodically structured, file-path grounded, and the findings are clearly tagged (Confirmed/Inferred/Absent/Contradiction). Phase 7 follow-up correctly documents the SoaEnvelope contract introduction and matches the implementation in
soa_envelope.rs. The recommended corrections are targeted and actionable.📝 Optional: Address markdown linting warnings
Static analysis flagged minor markdown formatting issues:
- Multiple spaces after blockquote symbols (lines 6-10): remove extra spaces
- Missing language specifiers for fenced code blocks (lines 99, 197, 246, 325, 410): these are diagrams/ASCII art, so adding
textlanguage specifier would resolve the warningsThese are cosmetic and don't affect content quality, but fixing them improves consistency with markdown best practices.
🤖 Prompt for 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. In `@docs/probes/particle-soa-envelope-audit.md` around lines 1 - 562, Audit confirms coexisting legacy/global and per-mailbox envelopes and several contract/identity/layout mismatches; fix by: (1) declare one canonical envelope and deprecate the other (mark BindSpace #[deprecated] with migration note, or gate behind legacy-bindspace) so MailboxSoA is authoritative; (2) remove MailboxSoA::emit() and gate/delete CollapseGateEmission to restore zero-copy lifecycle; (3) avoid CausalEdge64 name collision by renaming thinking_engine::layered::CausalEdge64 to ChannelEdge64 (keep to_spo()/from_spo()); (4) make entity_type resolution match its contract — either change OntologyRegistry::enumerate_first_with_entity_type_id to an O(1) Vec indexed by the 1-based entity_type or update docs to reflect the linear scan; (5) resolve the v2 W-slot by landing the EpisodicWitness64 SoA column (soa_view.rs reserves it) or explicitly gate the W-slot as a versioned exception; (6) add a const EDGE_LAYOUT_VERSION and assert it at reconstruction of edges_raw() to avoid implicit v1/v2 reinterpret hazards; and (7) either wire MappingRow.thinking_style into driver.rs dispatch or remove the dead field — these changes reference MailboxSoA, BindSpace, MailboxSoaView::edges_raw, CausalEdge64 (causal-edge crate), thinking_engine::layered::CausalEdge64, OntologyRegistry::enumerate_first_with_entity_type_id, EpisodicWitness64, MappingRow.thinking_style, MailboxSoA::emit, and CollapseGateEmission to locate the edits.
🤖 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.md`:
- Around line 17-19: The sentence containing the quoted warning "warning: Patch
<crate> ... was not used in the crate graph" is too absolute — update the
wording in CLAUDE.md so this warning is treated as a hard error only when a
direct dependency that should be patched is actually present but not wired;
otherwise treat it as a warning and document transitive semver-mismatch as a
legitimate cause. Concretely, modify the line with the quoted string to: (a)
stop saying “is NOT actually wired — treat it as a build error to fix, never a
warning” and (b) add a short note instructing maintainers to verify direct
Cargo.toml patch entries and to consider transitive semver mismatches before
failing CI.
In `@docs/architecture/soa-three-tier-model.md`:
- Around line 11-16: The documentation currently asserts a zero-emission
architecture but the codebase still contains transitional APIs
(MailboxSoA::emit() and the last_emission_cycle field); update the cited
passages (including the blocks around lines referenced and any similar claims at
50-53 and 148-149) to explicitly label them as "target-state" or "future design"
rather than present-state so the doc reflects current implementation, and add a
short parenthetical or sentence calling out the existing transitional APIs
(MailboxSoA::emit(), last_emission_cycle) so readers know these are being
migrated away.
- Around line 28-40: The Markdown fenced code blocks in
docs/architecture/soa-three-tier-model.md are missing language identifiers;
update each triple-backtick fence for the blocks containing the snippets
starting with "creation", "Lance writer → VersionScheduler::on_version(&view,
at, exec)", "mailbox address (MailboxId + family prefix)", the "Byte offset
Width Column" table, and "OGAR Class { field_a, field_b, field_c, tool_x,
tool_y, template_T }" to include a language tag (use text or a more specific
tag) so lint rule MD040 is satisfied; ensure you add the same tag to the other
listed ranges (61-72, 92-108, 171-184, 215-228, 238-248) by changing each ``` to
```text (or another appropriate language) while preserving the block contents.
In `@docs/probes/q3-standing-wave-falsification.md`:
- Around line 252-261: The fenced code block containing the ASCII diagram (the
triple-backtick block showing "current compute (per-mailbox, feed-forward,
ephemeral) … prior self = Lance version k") needs a language tag to satisfy
markdownlint MD040; change the opening ``` to include a language like ```text
(or ```plain) so the block becomes a declared text code fence.
- Around line 6-10: Fix the blockquote spacing: replace multiple spaces after
the '>' with a single space on the lines containing the quoted snippets (e.g.,
the lines starting with "> `cycle_accumulator.rs`, `crystal/cycle.rs`, ..."
and the line beginning "> **Method:** Read all VSA..."). Ensure each blockquote
line uses exactly one space after '>' so the backticked filenames and the
"**Method:**" line conform to markdownlint MD027.
In `@docs/probes/q4-hhtl-audit.md`:
- Around line 6-8: The blockquote lines containing the text
"`crates/lance-graph-contract/src/high_heel.rs` (42 KB, ~900 lines)" have
multiple spaces after the '>'; normalize them to a single space by replacing the
"> " prefix with "> " (preserve the quoted text exactly), and apply the same
fix to the other blockquote occurrence so every '>' is followed by exactly one
space.
---
Nitpick comments:
In `@crates/lance-graph-contract/src/soa_envelope.rs`:
- Around line 219-359: The tests miss exercising the LayoutVersionMismatch path:
add a small test that implements SoaEnvelope with a different const
LAYOUT_VERSION (e.g., wrap TestEnvelope in a BadVersionEnvelope type that sets
const LAYOUT_VERSION = 99) and call verify_layout() to assert
Err(EnvelopeError::LayoutVersionMismatch { expected: ENVELOPE_LAYOUT_VERSION,
found: 99 }), referencing the SoaEnvelope impl, TestEnvelope helper,
verify_layout(), EnvelopeError::LayoutVersionMismatch, and
ENVELOPE_LAYOUT_VERSION so the version-gate branch is covered.
In `@docs/probes/particle-soa-envelope-audit.md`:
- Around line 1-562: Audit confirms coexisting legacy/global and per-mailbox
envelopes and several contract/identity/layout mismatches; fix by: (1) declare
one canonical envelope and deprecate the other (mark BindSpace #[deprecated]
with migration note, or gate behind legacy-bindspace) so MailboxSoA is
authoritative; (2) remove MailboxSoA::emit() and gate/delete
CollapseGateEmission to restore zero-copy lifecycle; (3) avoid CausalEdge64 name
collision by renaming thinking_engine::layered::CausalEdge64 to ChannelEdge64
(keep to_spo()/from_spo()); (4) make entity_type resolution match its contract —
either change OntologyRegistry::enumerate_first_with_entity_type_id to an O(1)
Vec indexed by the 1-based entity_type or update docs to reflect the linear
scan; (5) resolve the v2 W-slot by landing the EpisodicWitness64 SoA column
(soa_view.rs reserves it) or explicitly gate the W-slot as a versioned
exception; (6) add a const EDGE_LAYOUT_VERSION and assert it at reconstruction
of edges_raw() to avoid implicit v1/v2 reinterpret hazards; and (7) either wire
MappingRow.thinking_style into driver.rs dispatch or remove the dead field —
these changes reference MailboxSoA, BindSpace, MailboxSoaView::edges_raw,
CausalEdge64 (causal-edge crate), thinking_engine::layered::CausalEdge64,
OntologyRegistry::enumerate_first_with_entity_type_id, EpisodicWitness64,
MappingRow.thinking_style, MailboxSoA::emit, and CollapseGateEmission to locate
the edits.
🪄 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: f8346b8a-a3fb-445b-9a96-4fcc0ec4c604
📒 Files selected for processing (8)
CLAUDE.mdcrates/lance-graph-contract/src/lib.rscrates/lance-graph-contract/src/soa_envelope.rsdocs/architecture/soa-three-tier-model.mddocs/probes/particle-soa-envelope-audit.mddocs/probes/q3-standing-wave-falsification.mddocs/probes/q4-hhtl-audit.mdpython/CLAUDE.md
Three confirmed answers written back to the canonical doc: 1. MailboxId IS the NiblePath — u32 mailbox_id is itself the HHTL radix-trie key; entity_type: u16 removal from SoA rows is total, no separate prefix field survives. 2. Class<Template> codegen is build-time + JIT split — known OGAR classes via build.rs/proc-macro at compile time; runtime-discovered classes via JITson (lance-graph-planner / Cranelift) at first use. 3. Tool dispatch = compile-time Rust trait impls — monomorphized per class via HHTL prefix ancestry; zero-cost, no vtable, no dyn. https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
…odegen path Three corrections to the three-tier model: 1. Tool dispatch default = compile-time trait impl (zero-cost); classes that need runtime dispatch opt in via a dispatcher class escape hatch attached to a register — not the default, not in the substrate. 2. Thinking styles are owned by the Kanban (Tier 2), not the OGAR class (Tier 3). They are an O(1) lookup over I4-32D = 2^128 distinct addresses. The Rubicon phase selects the style; the class supplies schema + tools only. MappingRow.thinking_style is the wrong home. 3. SurrealDB AST resolves masked class selections as Elixir-syntax templates — a second codegen surface over the same build-known vs JIT-new (JITson/Cranelift/lance-graph-planner) split as Askama/Jinja. Two syntaxes, one backend, same two-track compilation model. https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
…g, lint CodeRabbit / Codex review addressed: 1. soa_envelope::verify_layout() — P2 correctness fix Previously only checked that column widths *sum* to the declared stride. A column whose end offset exceeds the stride (e.g. two 4-byte columns at offsets 4 and 8 with stride 8) passed the sum check but placed data outside every row. Now each column's end offset is checked against stride directly before the pairwise overlap scan. New test: column_past_stride_caught. Total: 8 tests, all green. 2. soa-three-tier-model.md — Major: target-state vs current-state Sections that asserted "there is no baton/emission" in present tense while MailboxSoA::emit() still exists in source now carry explicit "Target state:" / "Current state:" labels. The removal is scheduled, not yet landed — the doc now says so. 3. CLAUDE.md — Major: patch-warning wording "treat it as a build error to fix" was too absolute; transitive semver mismatch is a legitimate cause. Reworded to "policy alert — verify direct deps and Cargo.lock wiring; track/resolve transitive blockers explicitly." 4. q3-standing-wave-falsification.md — Minor lint Blockquote lines with multiple spaces after `>` normalized (MD027). Unlabelled fenced code block at line 252 given `text` tag (MD040). 5. q4-hhtl-audit.md — Minor lint Blockquote spacing normalized (MD027). 6. New plan + epiphany (board hygiene for this session's findings) .claude/plans/cycle-coherent-soa-snapshot-v1.md — Arc-swap COW at column granularity; 6 deliverables D-SOA-SNAP-1..6; the byte-scale complement to temporal.rs row-scale deinterlace (PR #468). .claude/board/EPIPHANIES.md — E-DEINTERLACE-TWO-SCALES prepended. .claude/board/INTEGRATION_PLANS.md — plan entry prepended. https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
… doc corrections - soa_envelope: verify_layout now returns ColumnOutOfBounds (not overloaded StrideMismatch) when a column end exceeds stride; test updated. 8 tests green. - kv_bundle: deprecate unbundle_from — it is NOT the inverse of weighted-average bundle_into; call sites gated #[allow(deprecated)] + FIXME. 4 tests green. - soa-three-tier-model: layout table labeled current/transitional; entity_type marked scheduled-for-removal. - q3 probe: baton 'stone' corrected to Superseded (conflicts with arch target-state). - TECH_DEBT: TD-UNBUNDLE-FROM-1 logged. https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
crates/lance-graph-planner/src/cache/kv_bundle.rs (1)
1-26:⚠️ Potential issue | 🟠 MajorFix attention-cache gestalt update correctness in
kv_bundle.rs(deprecated unbundle used with weighted-average bundle).
HeadPrintisndarray::hpc::bgz17_bridge::Base17;crates/bgz17/src/base17.rsdocumentsBase17as the fundamental VSA carrier (it defines VSA-stylebundleandxor_bind), so this isn’t an I-VSA-IDENTITIES “quantized register” violation.However,
crates/lance-graph-planner/src/cache/kv_bundle.rs’sbundle_intoperforms a weighted average, whileunbundle_fromis only a wrapping subtraction “XOR analog” and is explicitly documented as not the inverse;AttentionMatrix::setstill uses the deprecatedunbundle_from, so thegestaltwill drift over epochs (the FIXME suggests the needed remedy: rebuild gestalt from scratch or track raw sum/count).🤖 Prompt for 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. In `@crates/lance-graph-planner/src/cache/kv_bundle.rs` around lines 1 - 26, bundle_into currently computes a weighted average into HeadPrint while unbundle_from is a non-inverse subtraction, causing gestalt drift when AttentionMatrix::set calls unbundle_from; fix by changing the accumulation strategy: stop averaging in bundle_into and instead maintain raw accumulators (e.g., i32 or i64 per-dimension sum and a count) alongside the HeadPrint; implement bundle_into to add source.dims * weight into the accumulator and implement unbundle_from to subtract using the same accumulator so inverse operations match, or alternatively rebuild the gestalt from the raw accumulator when needed; update AttentionMatrix::set to use the new accumulator API (or trigger a rebuild) rather than calling the deprecated unbundle_from; reference symbols: HeadPrint, bundle_into, unbundle_from, AttentionMatrix::set.Source: Coding guidelines
crates/lance-graph-contract/src/soa_envelope.rs (1)
106-109:⚠️ Potential issue | 🟠 MajorGuard column-end arithmetic against
usizewrap on 32-bit targets.
crates/lance-graph-contract/src/soa_envelope.rs:ColumnDescriptor::row_byte_range()computes(start, start + self.col_bytes_per_row())with unchecked+, andSoaEnvelope::verify_layout()relies ona_end > stride/ overlap checks using that wrappeda_end/b_end. On wasm32/32-bit,row_offset as usizeplus up to ~524,280 bytes can overflow and wrap, allowing invalid layouts to passverify_layout(). Fix by computinga_end/b_endviachecked_addinsideverify_layout()and returningEnvelopeError::ColumnOutOfBoundson overflow (or otherwise make the end computation overflow-safe). The newcolumn_past_stride_caughtregression covers only the normal non-overflow case; add a wrap-around regression if offsets can be large.🤖 Prompt for 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. In `@crates/lance-graph-contract/src/soa_envelope.rs` around lines 106 - 109, ColumnDescriptor::row_byte_range currently returns (start, start + self.col_bytes_per_row()) which can wrap on 32-bit targets; instead make end computations overflow-safe by using checked_add when computing row end inside SoaEnvelope::verify_layout (or change ColumnDescriptor::row_byte_range to return Option<(usize,usize)>), and if checked_add returns None return EnvelopeError::ColumnOutOfBounds so overflowed ends cannot bypass the overlap/stride checks; also add a regression test that constructs a column with a large row_offset causing wrap-around to assert the overflow path is caught (in addition to the existing column_past_stride_caught test).Source: Coding guidelines
♻️ Duplicate comments (1)
docs/architecture/soa-three-tier-model.md (1)
190-205:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winAdd a language tag to this fenced block (MD040).
Line 190 opens a code fence without a language identifier, which is currently linted. Use
textto keep formatting and satisfy markdownlint.Suggested fix
-``` +```text Byte offset Width Column LE kind ────────── ───── ────── ─────── 0 4·N energy[N] f32 × N @@ 22N+4 4 current_cycle u32 ... ... (scalars follow) -``` +```🤖 Prompt for 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. In `@docs/architecture/soa-three-tier-model.md` around lines 190 - 205, The fenced code block that begins with the "Byte offset Width Column LE kind" table (the block opened at the code fence around the table content) is missing a language tag; update that opening fence to ```text so the block is lint-compliant (MD040) and preserves formatting for the bytes/columns table such as the rows starting with "0 4·N energy[N]" and "22N+4 4 current_cycle u32".Source: Linters/SAST tools
🧹 Nitpick comments (1)
crates/lance-graph-planner/src/cache/kv_bundle.rs (1)
42-43: 💤 Low valueClarify that suggestion 3 still lacks an exact inverse.
The documentation states "Accept approximate unbundle only when weight_self = weight_new = 1.0: then bundle_into reduces to (old + new) / 2 and there is still no exact inverse." While the note "there is still no exact inverse" is correct, the phrasing could be clearer. Even with equal weights, the
.round()operation accumulates rounding errors across multiple bundle/unbundle cycles, so the approximation quality degrades over time.Consider rephrasing to: "Accept approximate unbundle with equal weights (weight_self = weight_new = 1.0): then bundle_into reduces to (old + new) / 2, which is less approximate than arbitrary weights, but rounding errors still accumulate and there is no exact inverse."
🤖 Prompt for 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. In `@crates/lance-graph-planner/src/cache/kv_bundle.rs` around lines 42 - 43, The comment clarifies that suggestion 3 should state equal-weight unbundling still lacks an exact inverse because repeated bundle_into with weight_self and weight_new both = 1.0 reduces to (old + new) / 2 but .round() causes accumulating rounding error; update the documentation text around bundle_into, weight_self, weight_new and .round() to the suggested wording: "Accept approximate unbundle with equal weights (weight_self = weight_new = 1.0): then bundle_into reduces to (old + new) / 2, which is less approximate than arbitrary weights, but rounding errors still accumulate and there is no exact inverse."
🤖 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/plans/cycle-coherent-soa-snapshot-v1.md:
- Around line 89-103: The contract currently introduces a direct dependency on
ndarray by placing MailboxSoaSnapshot with cols: Vec<Arc<MultiLaneColumn>> into
lance-graph-contract; move the concrete MailboxSoaSnapshot type out of
lance-graph-contract into the implementation crate (lance-graph) and keep only
the abstract trait in the contract (SnapshotProvider or SoaEnvelope) so the
contract remains zero-dep, or alternatively change the trait in
lance-graph-contract to use an associated type/generic column (e.g.,
SnapshotProvider::Column and MailboxSoaSnapshot<C>) so lance-graph can implement
SnapshotProvider with Column = MultiLaneColumn without pulling ndarray into the
contract; update the implementation of MailboxSoa::snapshot and any references
to MailboxSoaSnapshot to the new location/type accordingly.
---
Outside diff comments:
In `@crates/lance-graph-contract/src/soa_envelope.rs`:
- Around line 106-109: ColumnDescriptor::row_byte_range currently returns
(start, start + self.col_bytes_per_row()) which can wrap on 32-bit targets;
instead make end computations overflow-safe by using checked_add when computing
row end inside SoaEnvelope::verify_layout (or change
ColumnDescriptor::row_byte_range to return Option<(usize,usize)>), and if
checked_add returns None return EnvelopeError::ColumnOutOfBounds so overflowed
ends cannot bypass the overlap/stride checks; also add a regression test that
constructs a column with a large row_offset causing wrap-around to assert the
overflow path is caught (in addition to the existing column_past_stride_caught
test).
In `@crates/lance-graph-planner/src/cache/kv_bundle.rs`:
- Around line 1-26: bundle_into currently computes a weighted average into
HeadPrint while unbundle_from is a non-inverse subtraction, causing gestalt
drift when AttentionMatrix::set calls unbundle_from; fix by changing the
accumulation strategy: stop averaging in bundle_into and instead maintain raw
accumulators (e.g., i32 or i64 per-dimension sum and a count) alongside the
HeadPrint; implement bundle_into to add source.dims * weight into the
accumulator and implement unbundle_from to subtract using the same accumulator
so inverse operations match, or alternatively rebuild the gestalt from the raw
accumulator when needed; update AttentionMatrix::set to use the new accumulator
API (or trigger a rebuild) rather than calling the deprecated unbundle_from;
reference symbols: HeadPrint, bundle_into, unbundle_from, AttentionMatrix::set.
---
Duplicate comments:
In `@docs/architecture/soa-three-tier-model.md`:
- Around line 190-205: The fenced code block that begins with the "Byte offset
Width Column LE kind" table (the block opened at the code fence
around the table content) is missing a language tag; update that opening fence
to ```text so the block is lint-compliant (MD040) and preserves formatting for
the bytes/columns table such as the rows starting with "0 4·N energy[N]" and
"22N+4 4 current_cycle u32".
---
Nitpick comments:
In `@crates/lance-graph-planner/src/cache/kv_bundle.rs`:
- Around line 42-43: The comment clarifies that suggestion 3 should state
equal-weight unbundling still lacks an exact inverse because repeated
bundle_into with weight_self and weight_new both = 1.0 reduces to (old + new) /
2 but .round() causes accumulating rounding error; update the documentation text
around bundle_into, weight_self, weight_new and .round() to the suggested
wording: "Accept approximate unbundle with equal weights (weight_self =
weight_new = 1.0): then bundle_into reduces to (old + new) / 2, which is less
approximate than arbitrary weights, but rounding errors still accumulate and
there is no exact inverse."
🪄 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: b2e9cbec-044e-46a3-8fbf-879082917a9f
📒 Files selected for processing (10)
.claude/board/EPIPHANIES.md.claude/board/INTEGRATION_PLANS.md.claude/board/TECH_DEBT.md.claude/plans/cycle-coherent-soa-snapshot-v1.mdCLAUDE.mdcrates/lance-graph-contract/src/soa_envelope.rscrates/lance-graph-planner/src/cache/kv_bundle.rsdocs/architecture/soa-three-tier-model.mddocs/probes/q3-standing-wave-falsification.mddocs/probes/q4-hhtl-audit.md
✅ Files skipped from review due to trivial changes (6)
- .claude/board/TECH_DEBT.md
- .claude/board/INTEGRATION_PLANS.md
- CLAUDE.md
- docs/probes/q4-hhtl-audit.md
- .claude/board/EPIPHANIES.md
- docs/probes/q3-standing-wave-falsification.md
| ### D-SOA-SNAP-1 — `MailboxSoaSnapshot` type in lance-graph-contract | ||
|
|
||
| A `MailboxSoaSnapshot` struct: `cycle: u32`, `cols: Vec<Arc<MultiLaneColumn>>`. | ||
| Snapshot is `Send + Sync`. No reference to the originating `MailboxSoa`. | ||
| This is a point-in-time read — immutable after creation. | ||
|
|
||
| ### D-SOA-SNAP-2 — `SnapshotProvider` trait in lance-graph-contract | ||
|
|
||
| ```rust | ||
| pub trait SnapshotProvider { | ||
| fn snapshot(&self) -> MailboxSoaSnapshot; | ||
| } | ||
| ``` | ||
|
|
||
| Zero deps in contract. `MailboxSoa` in lance-graph implements it. |
There was a problem hiding this comment.
Critical dependency architecture violation in D-SOA-SNAP-1 and D-SOA-SNAP-2.
D-SOA-SNAP-1 proposes placing MailboxSoaSnapshot with field cols: Vec<Arc<MultiLaneColumn>> in lance-graph-contract, and D-SOA-SNAP-2 claims "Zero deps in contract." However, MultiLaneColumn is from ndarray (lines 68, 176). This creates a lance-graph-contract → ndarray dependency, violating the zero-dependency contract architecture. Based on learnings, "Zero circular dependencies: lance-graph-contract (zero-dep) → ndarray/planner/n8n-rs/crewai-rust."
Proposed resolution options
Option 1 (recommended): Keep MailboxSoaSnapshot in lance-graph, not in lance-graph-contract. The contract provides only the SoaEnvelope trait; the concrete snapshot type lives in the implementation crate.
Option 2: Make the contract snapshot type generic/abstract:
// In lance-graph-contract
pub struct MailboxSoaSnapshot<C> {
pub cycle: u32,
pub cols: Vec<Arc<C>>,
}
pub trait SnapshotProvider {
type Column;
fn snapshot(&self) -> MailboxSoaSnapshot<Self::Column>;
}Then lance-graph provides impl SnapshotProvider for MailboxSoa { type Column = MultiLaneColumn; }.
🤖 Prompt for 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.
In @.claude/plans/cycle-coherent-soa-snapshot-v1.md around lines 89 - 103, The
contract currently introduces a direct dependency on ndarray by placing
MailboxSoaSnapshot with cols: Vec<Arc<MultiLaneColumn>> into
lance-graph-contract; move the concrete MailboxSoaSnapshot type out of
lance-graph-contract into the implementation crate (lance-graph) and keep only
the abstract trait in the contract (SnapshotProvider or SoaEnvelope) so the
contract remains zero-dep, or alternatively change the trait in
lance-graph-contract to use an associated type/generic column (e.g.,
SnapshotProvider::Column and MailboxSoaSnapshot<C>) so lance-graph can implement
SnapshotProvider with Column = MultiLaneColumn without pulling ndarray into the
contract; update the implementation of MailboxSoa::snapshot and any references
to MailboxSoaSnapshot to the new location/type accordingly.
Source: Learnings
Two CodeRabbit fixes for PR #477: 1. soa_envelope.rs — checked_add overflow guard (Major finding) verify_layout() now computes every column's byte-range end via checked_add rather than raw usize addition. On 32-bit targets (wasm32), row_offset (u32 ≤ 4.29e9) + col_bytes can exceed usize::MAX and wrap to a small value that would silently pass the `a_end > stride` check. The new closure returns ColumnOutOfBounds on overflow, covering both positional overflow and wasm32-wrap in one code path. 2. soa-three-tier-model.md — add `text` language tag (MD040) The layout table code fence was untagged. Added `text` to satisfy the no-language-specified lint. The CodeRabbit "critical" finding about MailboxSoaSnapshot violating zero-dep is NOT fixed here — that finding is architecturally incorrect. ndarray IS a declared dependency per workspace policy; the plan is correct as-is. https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
build_distance_matrix_from_cam reinterpreted a &[u8] codebook buffer as &[f32] via `as_ptr() as *const f32` + from_raw_parts. A &[u8] carries no alignment guarantee, so on an unaligned buffer (mmap'd file, sub-slice) the f32 reinterpret is UB. Every other byte cast in the repo widens [u64]->[u8] (alignment decreases = sound); this one narrowed alignment-up and was the lone genuine soundness risk found in the unsafe audit. Replace with chunks_exact(4) + f32::from_le_bytes: alignment-free, endian-correct (matches the workspace LE contract), no unsafe. The codebook is read-only downstream, so owning a Vec<f32> is fine. The CAM-PQ codebook centroels are f32 by definition (6 subspaces x 256 centroids x subspace_dim); the stored word distance remains the u8-quantized L2 in WordDistanceMatrix. https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
#477 three-tier model The PR #477 'what does NOT exist' table, made source-true: - Remove CollapseGateEmission from contract::collapse_gate (+ lib.rs re-export). MailboxId, MergeMode, GateDecision survive — they are addressing/merge concepts, not emission concepts. - Remove MailboxSoA::emit(); rename last_emission_cycle → last_active_cycle. New in-place consume_firing(row) keeps the threshold + same-cycle-idempotency semantics with no carrier object (zero-copy: owner reads row columns in place, then stamps). - Reword 4 stale doc references (kanban, episodic_edges, witness_tombstone, mailbox_soa module header) to the three-tier zero-copy framing. - Supersede the CLAUDE.md Baton-scoping block (dated note; bundle math + mailbox-as-owner safety argument survive untouched). - Fix cycle-coherent-soa-snapshot-v1 D-SOA-SNAP-1/2: generic MailboxSoaSnapshot<C> + SnapshotProvider::Column so contract never imports MultiLaneColumn (closes #477 CodeRabbit Critical; contract stays zero-dep). - Board: LATEST_STATE contract inventory updated, TD-COLLAPSE-GATE- SMALLVEC-1 closed as moot, AGENT_LOG entry prepended. Verified: #477 codex P2 on verify_layout (ColumnOutOfBounds) already fixed on main with regression test column_past_stride_caught. Tests: contract 594 (-8 emission, +2 gate/merge), driver 85 (emit tests rewritten as consume tests, +1 OOB), clippy clean, workspace check clean. https://claude.ai/code/session_017GFLBnDy23AWBqvkbHHC41
…ry commit, not a cleanup Reframes PR #487 correctly: removing CollapseGateEmission was not dead-code hygiene, it was a boundary-shape correction. The inner seam (mailbox-to- mailbox) does not exist as a typed crossing — it is ownership transfer under Rust move semantics (E-CE64-MB-4). The outer seam (SoA ↔ Lance) is ontology-mediated: OGAR class = table schema (label + fields + tools + templates) SoaEnvelope = column mapping (byte geometry) Lance I/O = SQL writer (LE bytes from in-place store) hand-DTO = ORM-bypass (CollapseGateEmission was the last) The class supplies semantics; the envelope supplies geometry; Lance does the writing. Any independent carrier struct at this seam is schema drift by definition (per #477's 'every DTO is a derived view of an OGAR class'). MailboxId / MergeMode / GateDecision survive because they are vocabulary *of* the ontology side (addressing, merge policy, gate decision), not parallel descriptions of row data. Consequences for future PRs: - inner seams are moves, never carrier types - the outer seam has exactly one description (class + envelope + Lance) - hand-rolled active records are ORM-bypass — reach for ClassView + FieldMask + class-template specialization instead Cross-refs: PR #477 three-tier model; PR #487 tombstone commit; soa-three-tier-model.md; E-OGAR-NORTHSTAR-1 (class spine); I-LEGACY-API-FEATURE-GATED (removal is the canonical path). https://claude.ai/code/session_017GFLBnDy23AWBqvkbHHC41
…o canon) Operator: "no tokio, we use ractor as a runtime ownership guarantee, it's a dummy; we don't use ractor messages." A message-passing ractor actor would have contradicted E-CE64-MB-4 (mailbox-as-owner: Rust move/&mut proves no-aliasing/no-race/no-UAF at compile time) and #477 (nothing transmitted between mailboxes). Dropped that plan — no tokio, no Actor::spawn, no messages. SymbiontBoard's single `&mut self` owner ALREADY IS that guarantee in plain Rust (what ractor hosts in prod, a structural/dummy wrapper). step() drives by owned mutation, never a message. D2's loop is therefore complete for the POC; the only genuinely-live deferral is replacing the u32 tick with a real Lance versions() stream (needs a live dataset) + the SurrealQL re-read. Doc-only: kanban_loop.rs module doc reframed; STATUS_BOARD D2 deferred fixed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
What this PR establishes
This PR documents and contractually pins the correct mental model for the SoA mailbox envelope, and adds the missing envelope-level little-endian contract. It supersedes all prior baton / emission /
CollapseGateEmissionframing.The one invariant
Every SoA envelope is zero-copy from creation to Lance tombstone. No baton. No emission. No inter-mailbox handoff type. Nothing is serialized or transmitted — Lance's own columnar I/O writes LE bytes from the in-place backing store; the store itself is never packaged.
Changes
1.
lance-graph-contract::soa_envelope(new module, 7 tests)The missing envelope-level LE contract. Column-level LE knowledge (
CausalEdge64::to_le_bytes, ndarray'sMultiLaneColumn) was necessary but not sufficient — nothing described how columns assemble into one row-strided in-place layout with a cycle stamp.SoaEnvelopetrait — the register-file ABI descriptor:columns(),row_stride(),cycle(),LAYOUT_VERSION,as_le_bytes(), zero-copyrow_le/column_leviews, and averify_layout()conformance gate (catches stride mismatch, column overlap, backing-store size mismatch, version skew — closes theedges_raw() -> &[u64]implicit-agreement hazard perI-LEGACY-API-FEATURE-GATED).ColumnDescriptor(Copy,repr(C)) — one register descriptor:name_id,kind,elems_per_row,row_offset.ColumnKind— LE element width only, no domain semantics.lance-graphbinds them.2.
docs/architecture/soa-three-tier-model.md(new)Canonical reference. Three tiers:
MailboxSoaView(read) /MailboxSoaOwner(sole mutator).MailboxSoA::emit()+CollapseGateEmissionflagged as code artifacts to remove.VersionScheduler(read-only, proposes) →KanbanMove→advance_phase(sole mutator). Ractor (lance-graph-supervisor) provides actor-level meta-orchestration; single-owner invariant comes from Rust move semantics, no virtual ownership pointer needed.NiblePathprefix → radix-trie codebook → class + schema + label inheritance. Compile-time for known classes, JITson (lance-graph-planner) for new ones.entity_type: u16per-row likely redundant; theOntologyRegistrylinear scan is a defect.Register-file model (the load-bearing analogy):
MailboxSoA<N>columnsSoaEnvelope+ColumnDescriptorMultiLaneColumnSIMD iteratorClass<Template>The SoA is dumb (holds bytes). The OGAR class makes the bytes meaningful (label, schema, tools, codegen templates — DTO store for active record).
Class<Template>is a masked selection over the class schema: compile-time field projection, zero new types, zero runtime dispatch. Every DTO is a derived view of an OGAR class — an independent DTO struct is schema drift.3.
docs/probes/particle-soa-envelope-audit.md(new) + Q3/Q4 probes9-phase source-grounded audit of current code vs the intended model. Every claim is file-path grounded and tagged Confirmed / Inferred / Absent / Contradiction. Surfaces:
BindSpaceglobal legacy vsMailboxSoAper-mailbox) — migration in progress.CausalEdge64types sharing a name (causal-edge SPO-palette vs thinking-engine 8-channel).entity_typelinear-scan resolver vs its "O(1) index" doc claim.Q3 (standing-wave falsification — Lance versioning is the O(1) 90° lookup; recurrence is the wrong question) and Q4 (HHTL audit —
hhtl.rsis the address algebra / inheritance kernel).4.
CLAUDE.md+python/CLAUDE.md— P0 fork ruleAlways depend on the AdaWorldAPI fork; NEVER crates.io upstream for a forked crate. If fork coordinates are unknown, STOP and ask — do not fall back to crates.io to make a build pass.
What does NOT exist (and must not be reintroduced)
CollapseGateEmissionas cross-mailbox carrierMailboxSoA::emit()wire_cost_bytes() = 13 + 10·baton_countVsa16kF32as cross-mailbox carriercyclecolumn onlyTests
cargo test -p lance-graph-contract --lib soa_envelope→ 7 passed.Follow-up (not in this PR — documentation-first by design)
MailboxSoA::emit()+CollapseGateEmissionfrom source.last_emission_cycle→last_active_cycle.OntologyRegistrylinear scan with O(1) HHTL radix-trie lookup; evaluateentity_typeredundancy.kv-lanceis BLOCKED(C) pending AdaWorldAPI fork coordinates.https://claude.ai/code/session_0147hSzjmWZDuy2MSQNrhEK5
Generated by Claude Code
Summary by CodeRabbit
New Features
Documentation
Chores