feat(class-meta-dto): D-CLS arc — classes as SoA-view with presence bitmask (FieldMask + ClassView + structural-signature + render)#441
Conversation
…D, 3 P0 errors + D-CLS-3 vaporware 5-savant council + 3-brutal review (plan's own §2 + user requested) BEFORE agent spawn. Doctrine sound (classes.md verbatim) but factual errors vs source: (1) 381 OdooEntity consts not 66 (64 curated + 317 EXT_*); (2) class_id already exists (soa_view.rs:61, N1 hook #437) — D-CLS-5 would collide; (3) canonical DolceCategory has 6 variants not 4 (AbstractObject/Region/ Other, no 'Abstract') — D-CLS-1 From-test won't compile. D-CLS-3 vaporware: aerial mine()s rules not clusters entities — downgrade to deterministic group-by-on-structural-hash. Iron-rule YIELDS-WITH-AP: presence!=facet-code wall holds; AP2 — FieldPositionTable must freeze append-only (not recompute from union). Shippable-once-ratified: D-CLS-2(fix count)/4/5(after reconcile). 4 OD gates still blocking. No agent spawns until P0 fixed + OD ratified. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
… 6v4), ClassId u16 reuse-existing, kind+class_id both DTO-views, askama Spec-owner ratification. Two answers reframe not just answer: OD-DOLCE dissolved (DOLCE is a resolved attribute of the OGIT class in the ontology cache, not a canonical contract enum to pick among 4 -> the 6-vs-4 P0-3 mismatch evaporates; 4 enums become cache consumers). OD-CLASSID-VS-ENTITYKIND dissolved (meta-DTO resolves both kind+class_id as views over the row; Odoo becomes a custom view). OD-CLASSID-WIDTH u16 reuse soa_view::class_id (not a 2nd newtype). OD-TEMPLATE askama. Unifying: meta-DTO resolves, doesn't store (classes.md:39). All 4 gates resolved; still gated on P0 fixes (381 entities, group-by not aerial-cluster, AP2 position-freeze) before Wave-1 spawn. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…; class flies ABOVE the agnostic SoA) The XML-parse framing: OGIT today = hashtable single lookups (uri->row); the class = a META lookup (class_id->shape) composing them. SoA row=XML doc, ObjectView=XSD, ClassView= parser+schema, FieldMask=present optional elements, askama=XSLT. Classes fly as a meta-DTO ABOVE the SoA so the SoA stays agnostic: zero labels in the bytes, labels/template/DOLCE resolved LATE from the OGIT cache at projection (classes.md:39 resolve-not-store; core inv #1). C2 free: bit=presence (SoA), bit->label=resolution (above). Zero-dep: ClassId(u16, reuses soa_view::class_id) + FieldMask(u64) + ClassView trait (fields/template/dolce_category_id/ project) extending ontology::ObjectView/FieldRef/DisplayTemplate (not duplicating). Dep-inversion like MailboxSoaView. 3 teeth-tests + 496 contract lib green; clippy+fmt clean. Board: STATUS_BOARD D-CLS-FM + EPIPHANIES. Deferred: ontology impl, group-by audit (64 curated), askama render crate. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…lassView over the live OGIT cache) Makes the contract ClassView trait live: the OGIT-hashtable-single-lookup -> class-meta- lookup upgrade. RegistryClassView<'a> resolves class_id -> shape over a borrowed OntologyRegistry; DOLCE resolved LATE (enumerate_first_with_entity_type_id -> MappingRow -> ogit_uri -> classify_odoo), never stored on the row (OD-DOLCE cache-resolves). dolce_id u8 consts = the stable ids the trait returns. Dep-inversion (ontology already deps contract). Honest scope: field-SET supplied (ObjectView bit-basis), not enumerated — MappingRow has no field-list; enumeration = deferred D-CLS audit, nothing fabricated. /code-review caught the O(n)-scan+full-clone in registry::enumerate_first_with_entity_type_id called per render -> fixed at my layer with a per-class RefCell memo (DOLCE stable per class) + documented the deferred by_entity_type_id index. 4 teeth-tests + 234 ontology lib green; clippy+fmt clean. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…-hash shape-family audit; fills the D-CLS-RES bit-basis) The honest D-CLS-2/3: classes.md:43 discovered-taxonomy via deterministic group-by-on-structural-hash (NOT aerial-cluster vaporware — aerial mines rules not clusters, brutal-review confirmed). signature(&OdooEntity)->u32 FNV-1a over [kind, field-kind-hist x6, method-kind-hist x5, has_state_machine] (mirrors style_recipe::fnv1a_recipe), deterministic + name-independent. object_view(&OdooEntity) derives the real ObjectView field-set (field i = stable FieldMask bit i, N3) -> FILLS the supplied-placeholder class_resolver (D-CLS-RES) took, so the slices compose. shape_families + audit. 4 teeth-tests over real l1::ENTITIES; 238 ontology lib green; clippy+fmt clean. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…ses.md:42 falsifiably confirmed) + clippy fix curated_entities() concats all 15 l-lanes (64 consts); corpus_summary() + the falsifiable test discovered_taxonomy_collapses_entities_to_fewer_families asserts family_count < entity_count over the REAL curated corpus -> classes.md:42 confirmed on data not fixture. Review->fix: clippy -D warnings flagged unused FieldMask import at class_resolver.rs:32 (D-CLS-RES, test-only use) -> moved into the test module (would have failed CI). 6 class_signature + 240 ontology lib green; my files clippy-clean. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…ed render surface) + Wikidata-HHTL plan
render_rows(class,mask)->Vec<RenderRow{label,predicate}>: the C2 presence-only render
surface (classes.md:49), template-agnostic (askama engine deferred to its crate-Wave).
Completes the contract side of the XML-parse stack. Review->fix: clippy -D warnings caught
a doc-list-indent lint -> reflowed. 497 contract lib green; clippy+fmt clean. Also records
the Wikidata-HHTL plan as the next arc: the classes.md-N4 second-domain falsifier that
reuses FieldMask/signature/ClassView; smallest slice = HHTL 16^n nibble router + OWL/DOLCE
facet template + mask-inherits-as-delta (defer the 115M streaming load).
https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
✅ Files skipped from review due to trivial changes (1)
📝 WalkthroughWalkthroughAdds D-CLS: a ClassView contract (ClassId, FieldMask, projection/render_rows), an ontology-backed RegistryClassView with DOLCE memoization, deterministic structural-signature auditing over curated Odoo entities, and accompanying status/epiphany documentation entries. ChangesD-CLS: Class-View Projection and Audit System
Sequence DiagramsequenceDiagram
participant Client
participant ClassViewImpl
participant OntologyRegistry
Client->>ClassViewImpl: project/render_rows(mask, class_id)
ClassViewImpl->>ClassViewImpl: fields() / field_label() (late-resolve)
ClassViewImpl->>OntologyRegistry: lookup class OGIT / classify_odoo
OntologyRegistry-->>ClassViewImpl: DolceCategory
ClassViewImpl->>ClassViewImpl: dolce_to_id + memoize
ClassViewImpl-->>Client: iterator / RenderRow items
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 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. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5aaefd59ea
ℹ️ 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".
| let mut bits = 0u64; | ||
| let mut i = 0; | ||
| while i < positions.len() { | ||
| bits |= 1u64 << (positions[i] as u64 & 63); |
There was a problem hiding this comment.
Reject out-of-range field positions
When a caller passes a position outside the advertised MAX_FIELDS range, the & 63 mask aliases it back onto a valid bit instead of rejecting or ignoring it; for example from_positions(&[64]) sets bit 0, and a custom ClassView with a 65th field would make render_rows treat field 0 as present. Since the mask is the persistence/render presence contract, this silently corrupts which fields are rendered for invalid or oversized class shapes rather than enforcing the 64-field limit.
Useful? React with 👍 / 👎.
…Codex P2 #441) from_positions/with/has used & 63, which ALIASED an out-of-range position onto a valid bit (pos 64 -> bit 0) — silently corrupting the presence contract for a >64-field class (the N3 'old masks misread' failure class). Now positions >= MAX_FIELDS(64) are ignored (from_positions/with no-op; has -> false), preserving the no-panic property without misrepresenting presence. Teeth-test: pos 64 does NOT alias to bit 0, in-range bit 0 unaffected. 497 contract lib green; clippy+fmt clean. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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/STATUS_BOARD.md:
- Around line 571-575: The D-CLS rows (D-CLS-FM, D-CLS-RES, D-CLS-SIG,
D-CLS-AUDIT, D-CLS-RENDER) currently reference PR `#440` in their "PR / Evidence"
column but the change set belongs to PR `#441`; edit each of those entries to
replace "`#440`" with "`#441`" so the PR/evidence column matches the actual PR
number for traceability.
In `@crates/lance-graph-ontology/src/odoo_blueprint/class_signature.rs`:
- Around line 73-135: Refactor the free functions signature(entity: &OdooEntity)
and object_view(entity: &OdooEntity) into inherent methods on OdooEntity (impl
OdooEntity { pub fn signature(&self) -> StructuralSignature { ... } pub fn
object_view(&self) -> ObjectView { ... } }), replacing references to entity with
&self and iterating self.fields/self.methods by reference (avoid consuming),
keep return types and internal helpers (fnv1a, FieldMask, FieldRef,
DisplayTemplate, StructuralSignature) unchanged, preserve visibility (pub) as
needed, and then update all call sites to use entity.signature() and
entity.object_view() rather than free-function calls.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 19aa0093-a36d-430e-9ba0-7161b2009a52
📒 Files selected for processing (8)
.claude/board/EPIPHANIES.md.claude/board/STATUS_BOARD.mdcrates/lance-graph-contract/src/class_view.rscrates/lance-graph-contract/src/lib.rscrates/lance-graph-ontology/src/class_resolver.rscrates/lance-graph-ontology/src/lib.rscrates/lance-graph-ontology/src/odoo_blueprint/class_signature.rscrates/lance-graph-ontology/src/odoo_blueprint/mod.rs
…ew as OdooEntity carrier methods Two valid CodeRabbit findings: 1. STATUS_BOARD D-CLS rows referenced the plan PR #440; the change set is #441 — updated the 5 mutable PR/Evidence cells (sanctioned: that column is the mutable field). 2. signature(&OdooEntity)/object_view(&OdooEntity) were free functions over the carrier; CLAUDE.md 'The Click' litmus says method-on-the-carrier. Refactored into ; bodies unchanged (entity->self), all 7 call sites -> e.signature()/e.object_view(). 240 ontology lib green; clippy+fmt clean. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…-AST, not the AST itself
Research answer to 'can arm-discovery be the SPO-AST?': NO as the AST (it's the upstream
ArmDiscovered proposer emitting flat CandidateRules via lossy codebook-probe; no AST node
type; using it as the hub conflates proposer<->hub and pushes similarity into addressing,
violating the faiss-homology iron rule). YES as a feeder: CandidateRule -> ruff_spo_triplet
Triple (needs Implies, D-ARM-SYN-1) = one input stream to the hub. The guarded-rewrite SPO-AST
node type doesn't exist yet; it'd be CAM-addressable in contract and consume candidates from
{arm-discovery, AstWalker, LLM, LogicalOperator} tagged by discovery_origin.
https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
Mandatory post-merge board update (merge a77e119): - STATUS_BOARD: 5 D-CLS rows In PR -> Shipped - PR_ARC_INVENTORY: prepend #441 entry (Added/Locked/Deferred/Docs/Confidence) — records the class-flies-above-SoA invariant, C2/N3, FieldMask-no-fold (Codex P2), carrier-methods (CodeRabbit), DOLCE-from-cache + class_id-reuse decisions - LATEST_STATE: prepend Contract-Inventory blockquote (class_view + class_resolver + class_signature surface, so a new session does not re-derive them) https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…FieldMask::inherit (Wikidata-HHTL slice 1) The downstream 16^n Abstammung bucket router #438 (D-ARM-14 P1) names but did not build: subClassOf nibble path, bit-shift O(1) addressing (root/child/basin/parent/is_ancestor_of). DOLCE-agnostic by construction (basin: u8 = dolce_id 0..3 resolved THROUGH the ontology cache per OD-DOLCE b31464d — never an embedded enum; matches both #441 dolce_id and #438 basin() orderings). + FieldMask::inherit (mask-inherits-as-delta; multi-parent = orthogonal facet bit in the same mask, NOT a 2nd path). Reuses #441 FieldMask; zero-dep preserved. The N4 second-domain falsifier for the D-CLS machinery: the Wikidata D-CLS triple (class_id, shape_hash, presence_bitmask) = (ClassId, StructuralSignature, FieldMask) — all #441. Convergent with D-ARM-14, firewall preserved (aerial = zero-dep proposer; contract/ontology = hub). 4 teeth-tests (bit-shift round-trip, depth cap + out-of-range nibble ignored, prefix reachability, multi-parent-is-a-facet-bit); 501 contract lib green; clippy -D warnings + fmt clean. Board: FINDING D-CLS<->D-ARM-14 reconciliation (EPIPHANIES) + D-WIKI-HHTL-1 row. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…a-DTO generalises to Wikidata) The N4 second-domain falsifier (cognitive-risc-classes.md): routes a curated set of REAL Wikidata classes (Q5 human, Q215627 person, Q515 city, Q11424 film, Q5398426 tv-series, Q1656682 event) through the SAME machinery the D-CLS arc built for Odoo — proving the Wikidata D-CLS triple (class_id, shape_hash, presence_bitmask) = (ClassId, StructuralSignature, FieldMask) is domain-independent, not Odoo-overfit. Reuses (not re-grows): contract::hhtl::NiblePath (routing, basin = cache-resolved dolce_id u8, NO DOLCE enum on the path — OD-DOLCE), FieldMask (presence/facet-bitmask), StructuralSignature + contract::hash::fnv1a (shape-family key over the canonical property-set), and the #441 ClassView trait (WikidataClassView impls it unchanged). Falsification CONFIRMED on data (5 teeth-tests): corpus collapses to fewer shape-families (film ≡ tv-series share the AV-work shape), DOLCE→basin routing through the cache u8, triple shape domain-independent, ClassView resolves a Wikidata class with render_rows off-bits-skip (C2), subclass human⊂person inherits path (is_ancestor_of) + mask-as-delta. 245 ontology lib green; clippy -D warnings + fmt clean. Firewall preserved (hub side; aerial untouched). https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…ecord #442 scale-freezes (D-ARM-14 review) The D-ARM-14 session's review of #442 (merge-worthy verdict) flagged two non-blocking 'name the freeze' items; acting on both: Flag 1 (the strong one) — NiblePath::child() saturated SILENTLY past MAX_DEPTH=16, so two distinct deep P279 chains truncated at 16 would collide on one path (is_ancestor_of/basin treat them as one). Same no-silent-aliasing class as the root()/FieldMask fixes. Added is_full() (the depth_exhausted flag) + try_child() -> Option (returns None instead of saturating), so the deferred 115M loader DETECTS the ceiling and switches to a ref instead of colliding. child() stays the saturating convenience, now documented to gate on is_full(). Flag 2 + minors — recorded as TD-WIKI-SCALE (TECH_DEBT, append-only): StructuralSignature u32 birthday ceiling (~77k shape-families — a #441 contract decision to widen to u64, WITH the deferred loader, not unilaterally here); signature() per-call Vec alloc; dolce_category_id default-ENDURANT-on-unknown. All fine at curated/Odoo scale; bite only at the 115M load. signature() doc now cites the u32 freeze. 503 contract + 246 ontology lib green; clippy -D warnings + fmt clean. Firewall preserved; the proposer-side dolce_id alignment remains the D-ARM-14 session's lane. https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
…perseded-by-#441 + EPIPHANY E-CHESS-IS-NOT-RETIREABLE + FINDING F-DIAGRAMS-450-CLOSES-LOOP The parallel `claude/sleepy-cori-aRK2x` + `claude/jolly-cori-clnf9` sessions shipped what my plan v1 (#440) was about to over-engineer. Reconciling my branch's audit trail with their shipped reality. STATUS_BOARD (status-flip per append-only doctrine; row content preserved as audit trail of "approach considered, not shipped"): - D-CLS-1 → Superseded (dissolved: DOLCE resolved late through cache, not consolidated; 4 enums coexist; OD-DOLCE-CANONICAL closed b31464d) - D-CLS-2 → Superseded-by-D-CLS-SIG (Rust function, not static PSV) - D-CLS-3 → Superseded-by-D-CLS-SIG (was VAPORWARE per #441 review; Aerial+ is for runtime data, not structural shapes) - D-CLS-4 → Superseded (no new crate; trait in contract + impl in ontology) - D-CLS-5 → Superseded-by-D-CLS-FM (reuses PR #437's MailboxSoaView class_id) - D-CLS-6 → Superseded (dissolved: class derived from signature(), not stored; "meta-DTO resolves; it does not store") - D-CLS-7 → Superseded-by-D-CLS-FM (FieldMask u64; position table IMPLICIT in OdooEntity.fields[] declaration order) - D-CLS-8 → Superseded-by-D-CLS-RENDER (trait method; C2 enforced by the TYPE not docstring; askama engine deferred) - D-CLS-9 → Superseded-by-D-CLS-AUDIT (falsifiable corpus-collapse; no 66-snapshot N4-freeze) D-CHESS-BRINGUP-1 unchanged (Queued); my earlier chat-statement proposing retirement was wrong and fully retracted (user: "retiring chess is incompetence"). EPIPHANIES (prepended): - F-DIAGRAMS-450-CLOSES-THE-LOOP — the two user-posted architecture diagrams (ODoo×OGIT+DOLCE+GoBD→Elixir/OTP; Dual Grammar §14) are now backed by shipped code via #450 panel-by-panel; board hygiene is training/seeding data for the panel-7 epiphany/fact/signal output loop, not human-only documentation - E-CHESS-IS-NOT-RETIREABLE-PLURAL-FALSIFIERS — retracting my retire-proposal; plural falsifiers is the doctrine (Odoo business-richness, Wikidata open-world, Chess minimal-ISA-closure, future medicine SNOMED/finance FIBO/law per #443's owl-dolce-hhtl-compartments-aerial-fed.md); each domain hits the machinery from a different angle; substitution is the anti-pattern; "we're only touching X" is the diagnostic signature classes.md F4 warned against AGENT_LOG (prepended): full reconciliation entry — rebase audit (no content deletions in any of my commits per `git show --stat`), context (PRs #441..#450), discipline correction (the "I'll discard" chat statement violated append-only as intent even though I committed everything), next steps. https://claude.ai/code/session_017gZ6sPRXYPj5n7uJ7NBtRv
The review council's identity-scalar census left three "writable-now" assertions unwritten; with niblepath_of landed, all three now pin: - T3 guid_basin_equals_resolver_dolce_id: the GUID's routing basin (first nibble of the registry-paired path) == the resolver's dolce_id u8 (cache-resolved, never an enum — OD-DOLCE #441). - T5 guid_shape_hash_is_the_declared_truncation_of_structural_signature: pins the previously-unnamed StructuralSignature -> 22-bit shape_hash truncation, converting the NodeGuid compose-claim's weakest leg from doc-convention to test-pinned. - T8 positional_helper_and_registry_mint_are_different_functions: the divergence pin — contract::ontology::entity_type_id (1-based positional, renumbers on reorder) vs the registry's global deduped counter (after one template reuse, Visit mints id 2 while sitting at row 3). Makes the two-mint divergence observable so the Phase-B move-4 gate has a witness. 254 ontology tests green; registry.rs clippy-clean; fmt clean. https://claude.ai/code/session_012SorR8UbtEvYmbX8cXftj7
…ensus tests This branch's Phase-B paired mint (NiblePath-keyed dedup, append_mapping_with_path, a minted_entity_types counter) was the SAME brick as main's f4cec3b D-IDENTITY-2, shipped by a parallel session — a genuine duplication caught at rebase. The two forked on the dedup key: main keys on the canonical class URI (template identity = the URI, the literal DECISION-3 wording); this branch keyed on the routed NiblePath. Main is merged + canonical, so the branch's duplicate registry implementation is DROPPED (registry.rs is byte-identical to main) and the work composes on main's shipped surface instead of racing a second mint. Re-ported as ADDITIVE coverage against main's two-phase register_class_path API — the identity-census assertions main's 5 DECISION-3 tests don't cover: - T3 guid_basin_equals_resolver_dolce_id: the GUID routing basin == the resolver's cache-resolved dolce_id (OD-DOLCE #441), never an enum. - T5 guid_shape_hash_is_the_declared_truncation_of_structural_signature: pins the StructuralSignature -> 22-bit shape_hash truncation (was doc-convention only). - T7 guid_prefix_consistent_with_registry_path: a NodeGuid built from the registry's own pairing carries an exact entity_type and a <=4-nibble prefix that is_ancestor_of the registry's full minted path. - T8 positional_helper_and_registry_mint_are_different_functions: the move-4 gate witness. Recomputed under main's rows.len()+1 URI-dedup mint — a same-URI reappend grows rows without minting, so Visit mints 3 (gap at 2) while the positional contract::ontology::entity_type_id helper calls it 2. The two mints diverge. 18 registry tests green (main's 14 + 4 re-ported); registry.rs fmt-clean, surgical +131/-0; the crate's 12 pre-existing clippy errors (owl/ttl_parse/odoo_blueprint) untouched. The identity plan carries a convergence note; AGENT_LOG prepends the rebase entry. https://claude.ai/code/session_012SorR8UbtEvYmbX8cXftj7
The class-meta-DTO: classes-as-SoA-view with presence bitmask (D-CLS arc)
Implements the
cognitive-risc-classes.mdv0.2 "Jinja = classes + presence bitmask" pattern: the class flies as a meta-DTO above an agnostic SoA, so the SoA stays label-free and the class shape (fields, labels, template, DOLCE category) resolves late from the OGIT cache — never hand-rolled onto the row (classes.md:39 "the meta-DTO resolves; it does not store"; core invariant #1 "nothing semantic in the register file").This is the contract-foundation work the merged plan #440 (
odoo-classes-bitmask-render-v1) called for — built after a council + brutal-honest review of that plan caught 3 P0 factual errors (recorded in EPIPHANIES), so these slices sidestep them by construction (reuse the existingclass_id, resolve DOLCE from the cache, scope to the curated corpus).The XML-parse framing it realizes
Slices (5)
contract/class_view.rs) —FieldMask(u64)presence bitmask +ClassViewresolver trait +ClassProjection.ClassId = u16(reuses the existingsoa_view::class_idwidth). Extendsontology::ObjectView/FieldRef/DisplayTemplate; does not duplicate. Zero-dep.ontology/class_resolver.rs) —RegistryClassViewimplsClassViewover the liveOntologyRegistry; DOLCE resolved late viaclassify_odoo(ogit_uri)(OD-DOLCE "use the cache"). Per-class memo over the O(n) registry scan (the underlyingby_entity_type_idindex is a documented deferred slice).ontology/odoo_blueprint/class_signature.rs) — deterministicsignature(&OdooEntity)(FNV-1a over kind + field/method-kind histograms + state-machine; name-independent) +object_view()deriving the real field-set bit-basis. The honest group-by-on-structural-hash (classes.md:43), not Aerial+ clustering (that entry point does not exist — confirmed in review).curated_entities()(all 15 l-lanes, 64 consts) + a falsifiable test that the real corpus collapses entities → fewer shape-families (classes.md:42 confirmed on data, not asserted).ClassView::render_rows+RenderRow(off-bits-skipped, C2 presence-only). The render logic; the askama engine is a deferred crate-Wave.Invariants honoured
render_rowsyields a row iff its bit is set; never branches on meaning).i= declared-fieldi).MailboxSoaView).class_id(no colliding newtype); DOLCE from the cache (no canonical-enum contest).Verification
cargo test -p lance-graph-contract→ 497 pass;-p lance-graph-ontology→ 240 pass (+8 new teeth-tests across the arc, incl. the falsifiable corpus collapse + the C2 off-bits-skip).-D warningsclean on all new files (two doc/import lints caught + fixed pre-push); rustfmt clean.Deferred (follow-ups, not this PR)
The askama render crate (engine), the registry
by_entity_type_idO(1) index, naming the discovered shape-families (Wave-2 human step), and Wikidata-HHTL (the classes.md-N4 second-domain falsifier that reusesFieldMask/signature/ClassView).Board hygiene (same commits): STATUS_BOARD D-CLS-* rows + EPIPHANIES findings (the review verdict, the OD ratifications, each slice).
https://claude.ai/code/session_01R9AWgFa65uPnLyS2my2d2R
Generated by Claude Code
Summary by CodeRabbit
Documentation
New Features
Chores