Skip to content

feat(ogar-vocab): OdooPort — commerce-arm curator + planning↔ERP convergence#94

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/odoo-port-commerce-arm
Jun 22, 2026
Merged

feat(ogar-vocab): OdooPort — commerce-arm curator + planning↔ERP convergence#94
AdaWorldAPI merged 1 commit into
mainfrom
claude/odoo-port-commerce-arm

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

What

Adds OdooPort: PortSpec (NAMESPACE = "Odoo", BRIDGE_ID = "odoo") and the
ODOO_ALIASES table to ogar-vocab::ports, making Odoo a first-class codebook
curator
— the commerce-arm sibling of OpenProjectPort / RedminePort
(Northstar §7 T10, "same shape, different domain").

Mappings

Commerce arm (0x02XX):

Odoo model canonical concept id
account.move, sale.order commercial_document 0x0202
account.move.line, sale.order.line commercial_line_item 0x0201
account.tax tax_policy 0x0203
res.partner billing_party 0x0204
account.payment payment_record 0x0205
res.currency currency_policy 0x0206

Cross-arm bridge (the headline):

Odoo model canonical concept id
account.analytic.line billable_work_entry 0x0103

Why this matters — planning ⟷ ERP convergence

That last row is the planning⟷ERP convergence pin. An Odoo analytic
(timesheet / cost) line resolves to the same canonical concept
(billable_work_entry, 0x0103) as an OpenProject TimeEntry and a Redmine
TimeEntry. A logged planning hour and the billed ERP line are one concept, so
the planner's hours and the ERP's billable hours align by construction rather
than by a downstream join. This is the codebook's named "first cross-domain
bridge": the planning arm (work performed) meets the commerce arm (work billed).

Tests (6)

  • odoo_namespace_and_bridge_id_match_canonical_strings
  • odoo_account_move_maps_to_commercial_document
  • odoo_commerce_models_resolve_into_the_commerce_domain — every commerce alias lands in the Commerce (0x02XX) domain
  • planning_and_erp_converge_on_billable_work_entryop == rm == odoo == 0x0103
  • odoo_alias_count_is_stable
  • odoo_unknown_model_names_resolve_to_none

Severity context — the odoo-rs beachhead

odoo-rs today lowers its ontology through a bespoke SurrealQL AST + triple
pipeline
(od-ontology::surreal_ast / triple / emit) that forks
op-surreal-ast / ogar-adapter-surrealql and never touches ogar-vocab.
OGAR exists precisely to own the AR-shaped Class / AST / ClassView surface;
re-deriving it per-consumer is the defect. OdooPort is the beachhead that lets
odoo-rs converge onto the canonical layer — lower onto ogar_vocab::Class,
emit via ogar-adapter-surrealql — instead of re-implementing it. (Wiring
odoo-rs itself is a separate, staged follow-up; this PR only lands the
vocabulary so both sides have a shared anchor.)

CI

Toolchain 1.95.0 (pinned). cargo check --workspace --all-targets and
cargo test --workspace both clean (ogar-vocab lib: 20 ports:: tests pass,
including the 6 above). Purely additive — no existing public API changed.

@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.

OdooPort: PortSpec (NAMESPACE="Odoo", BRIDGE_ID="odoo") + ODOO_ALIASES map
Odoo model names onto the canonical OGAR codebook, making Odoo a first-class
codebook curator -- the commerce-arm sibling of OpenProjectPort / RedminePort
(Northstar §7 T10, "same shape, different domain").

Commerce arm (0x02XX):
  account.move, sale.order           -> commercial_document (0x0202)
  account.move.line, sale.order.line -> commercial_line_item (0x0201)
  account.tax                        -> tax_policy           (0x0203)
  res.partner                        -> billing_party        (0x0204)
  account.payment                    -> payment_record       (0x0205)
  res.currency                       -> currency_policy      (0x0206)

Cross-arm bridge (the headline):
  account.analytic.line              -> billable_work_entry  (0x0103)

That last row is the planning<->ERP convergence pin: an Odoo analytic
(timesheet/cost) line resolves to the SAME canonical concept as an
OpenProject TimeEntry and a Redmine TimeEntry. A logged planning hour and
the billed ERP line are one concept, so the planner's hours and the ERP's
billable hours align by construction.

6 tests: namespace/bridge_id, account.move -> commercial_document, every
commerce alias in the Commerce (0x02XX) domain, the planning<->ERP
convergence (op == rm == odoo == 0x0103), alias-count stability, unknown
name -> None.

Beachhead for converging odoo-rs onto the canonical layer: odoo-rs today
lowers its ontology through a bespoke SurrealQL AST + triple pipeline that
never touches ogar-vocab. OdooPort lets it adopt ogar_vocab::Class +
ogar-adapter-surrealql instead of re-deriving the AR-shaped surface.

cargo check --workspace --all-targets + cargo test --workspace clean.
@AdaWorldAPI AdaWorldAPI force-pushed the claude/odoo-port-commerce-arm branch from 90b2b56 to 2fc96e5 Compare June 22, 2026 10:14
@AdaWorldAPI AdaWorldAPI merged commit 08a9c97 into main Jun 22, 2026
1 check passed
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