Skip to content

feat(od-ontology): pull alignment symbol-table from lance-graph-callcenter#14

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/odoo-pull-alignment-symbol-table
Jun 22, 2026
Merged

feat(od-ontology): pull alignment symbol-table from lance-graph-callcenter#14
AdaWorldAPI merged 1 commit into
mainfrom
claude/odoo-pull-alignment-symbol-table

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

What

Phase-2 of the repatriation (per REPATRIATION-FRAME.md shipped in #12,
following the schema pull in #13). Pulled the OWL pivot alignment from
lance_graph_callcenter::odoo_alignment — ~350 LOC of muscle memory + classifier

  • lookup, leaving the runtime-hydration types (OgitFamilyTable, FamilyEntry)
    in lance-graph as generic infrastructure.

Under the compiler-AST frame (#13): this module IS the symbol table /
type-resolver
for the Odoo language frontend — Odoo class name → OGAR
(family, slot) identity + owl:equivalentClass pivot URI + DOLCE marker.

What lands

Surface What Empowerment vs muscle memory
OwlPivot struct (pivot_uri, family, slot, dolce) Empowerment shape — universal across source languages
dolce_odoo suffix-pattern → DOLCE marker classifier Empowerment mechanism + Odoo muscle memory (specific suffix patterns)
ODOO_SEED 15 rows: res.partner → fibo:LegalEntity, account.move → fibo:Transaction, … Muscle memory — pure Odoo specifics
6 family constants 0x61 BillingCore, 0x62 SMBAccounting, 0x64 ProductCatalog, 0x80 SmbFoundryCustomer, 0x81 SmbFoundryInvoice, 0x90 HRFoundation Muscle memory — restated bytes from lance-graph's family registry
resolve_odoo symbol-table lookup with product.* prefix fallback Empowerment — universal pattern

What stays in lance-graph (explicitly NOT pulled)

  • OgitFamilyTable runtime hydration — generic graph spine infrastructure
  • FamilyEntry / OwlCharacteristics / SchemaKind — lance-graph's table types
  • family_default_style returning StyleCluster — Phase 3 push to OGAR as a Class capability

What the invariant pins surfaced (real findings)

14 invariant pins in tests/alignment_pin.rs, all green — and writing the
cross-validation surfaced two real findings the lance-graph original didn't
have tests to catch:

Finding 1 — the lance-graph dolce_odoo classifier was incomplete

The seed row declares product.pricelist is Abstract (a pricelist IS a
pricing rule, not a persistent product). The lance-graph classifier swept it
into Endurant because its product.* rule matched first. Added the
pricelist exception; the classifier now agrees with the seed. lance-graph's
own tests didn't catch this because they only spot-tested product.template
not product.pricelist.

Finding 2 — OGAR's OdooPort covers the commerce arm only

The cross-axis identity check (seeded_classes_have_compatible_ogar_identity)
proves the alignment table and OGAR's identity codebook agree about which Odoo
classes are first-class citizens. But OdooPort has 9 aliases (the
commerce arm: account.move, sale.order, account.move.line,
sale.order.line, account.tax, res.partner, account.payment,
res.currency, account.analytic.line) — the seed table has 15 rows
covering product + accounting + HR basins too.

Surfaced as informational eprintln (= candidate list for the next OdooPort
PR); the hard pin asserts only the commerce-arm intersection. The "gap" IS
the surface for a future PR, not an error today.

informational: 11 of 15 seeded classes have no canonical OGAR classid yet
(= candidates for the next OdooPort PR — product / accounting / HR basins):
["account.account", "account.account.template", "hr.contract", "hr.department",
 "hr.employee", "hr.job", "product.pricelist", "product.pricelist.item",
 "product.product", "product.template", "uom.uom"]

Tests

130+ test results green across the suite: 39 lib + 14 alignment-pin + 10
corpus-pin + 13 typed-lift + 10 ogar-parallel + 7 ogar-convergence + 7 bin +
others
. clippy on my new code clean (pre-existing doc_markdown warnings on
older files untouched). lib.rs / alignment.rs / alignment_pin.rs fmt-clean.

Builds on:

Next phases per the frame:

  • Phase 2 continued: pull odoo_blueprint/{l1..l15}.rs (14K LOC) when ready
  • Phase 3: push empowerment shapes (OwlPivot, suffix-classifier pattern,
    family_default_style → StyleCluster inheritance) to OGAR as universal
    Class capabilities so other source languages reuse them
  • Phase 4: producer-side OGAR-class detection in ruff
  • Phase 5: lance-graph becomes generic by subtraction

…enter

Phase-2 repatriation per REPATRIATION-FRAME.md: pulled the OWL pivot alignment
from `lance_graph_callcenter::odoo_alignment` (~700 LOC of which ~350 was the
data + classifier + lookup; the runtime-hydration types stay in lance-graph as
generic infrastructure).

Under the compiler-AST frame (PR #13): this module IS the **symbol table /
type-resolver** for the Odoo language frontend — Odoo class name → OGAR
(family, slot) identity + owl:equivalentClass pivot URI + DOLCE marker.

What lands:
- `OwlPivot` struct (empowerment shape — universal across source languages)
- `dolce_odoo` suffix classifier (empowerment mechanism + Odoo muscle memory)
- `ODOO_SEED` static table (15 muscle-memory rows: res.partner → fibo:LegalEntity,
  account.move → fibo:Transaction, …)
- 6 family-byte constants (BillingCore 0x61 / SMBAccounting 0x62 /
  ProductCatalog 0x64 / SmbFoundryCustomer 0x80 / SmbFoundryInvoice 0x81 /
  HRFoundation 0x90)
- `resolve_odoo` (symbol-table lookup with `product.*` prefix fallback)

What stays in lance-graph (explicitly NOT pulled):
- `OgitFamilyTable` runtime hydration (generic graph spine infrastructure)
- `FamilyEntry` / `OwlCharacteristics` / `SchemaKind` (lance-graph's table types)
- `family_default_style` returning `StyleCluster` (Phase 3 — push to OGAR as
  a Class capability)

14 invariant pins in `tests/alignment_pin.rs`, all green. Surfaced TWO real
findings while writing the cross-validation:

1. The lance-graph `dolce_odoo` classifier was **incomplete**: it swept
   `product.pricelist` into Endurant (via `product.*` → Endurant) but the
   seed row declares Abstract (a pricelist IS a pricing rule, not a
   persistent product). Added the `pricelist` exception; the classifier
   now agrees with the seed. lance-graph's own tests didn't catch this
   because they don't run cross-validation.

2. OGAR's `OdooPort` covers the **commerce arm** only (7 aliases:
   account.move / sale.order / account.move.line / sale.order.line /
   account.tax / res.partner / account.payment / res.currency /
   account.analytic.line) — `account.account`, `product.template`,
   `product.product`, `uom.uom`, the 4 hr.* classes have alignment rows but
   no OGAR classid yet. Surfaced as informational `eprintln` (= candidate
   list for the next OdooPort PR); the hard pin asserts only the
   commerce-arm intersection.

The cross-axis identity check (`seeded_classes_have_compatible_ogar_identity`)
proves the per-app alignment table (this crate = "which FIBO pivot") and
OGAR's identity codebook (OdooPort = "which classid") agree about which Odoo
classes are first-class citizens — the two are complementary axes of the
same identity.

130+ test results across the suite pass: 39 lib + 14 alignment-pin + 10
corpus-pin + 13 typed-lift + 10 ogar-parallel + 7 ogar-convergence + 7 bin +
others. clippy on my code clean. lib.rs / alignment.rs / alignment_pin.rs
fmt-clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@AdaWorldAPI AdaWorldAPI merged commit 6b1de2c into main Jun 22, 2026
AdaWorldAPI pushed a commit that referenced this pull request Jul 7, 2026
…2 to the recipe

OGAR (#174/#175/#176) + lance-graph (#658) migrated to generic plug-and-play
capability handling, retiring the COUNT_FUSE dual-store. Checked odoo-rs
against the migrated mains:

- Restarted branch from merged main (PR #24 = 0bd6809); floated deps to
  OGAR dee1fc5 (hot-plug) + ruff 55bbf60 (which now INCLUDES the merged DTO
  arm, ruff #51). cargo test -p od-ontology --features cli,fieldmask = 17/17
  green. ZERO breakage: COUNT_FUSE was internal to the OGAR<->lance-graph
  bridge; the additive capability_registry/ocr_actions surfaces don't touch
  the Class/ActionDef/compile_graph_python surface odoo-rs consumes.
- Handover §2b documents the socket/authority/bridge/consumer model +
  sibling-path-dep NO-PIN rule + the 5 drift arms.
- W2 revised: the lance-graph V3 sink is no longer 'invent a sink' — it is
  the hotplug-consumer-migration recipe (declare odoo_actions authority
  table + HOT_PLUG const + activation test + executor), mirroring the
  tesseract-rs #13/#14 template. odoo-rs needs no HOT_PLUG until W2.

Ref: E-HOTPLUG-GENERIC-1, E-HOTPLUG-MIGRATION-1,
OGAR .claude/knowledge/hotplug-consumer-migration.md.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants