feat(ogar/bridges): WoaBridge + SmbBridge + OdooBridge — close the planner→ERP convergence chain#587
Conversation
…anner→ERP convergence chain Operator value statement 2026-06-21: "in the end planning (openproject) and ERP (odoo, YOU) should become reusable ontologies so that the planner times can align with billable hours". OGAR PR #93 (WoaPort + SmbPort) and PR #94 (OdooPort) landed the canonical port specs; this PR ships the lance-graph-side type aliases that connect those ports to the existing `UnifiedBridge<P: PortSpec>` harness. Three new files, all ~150 LOC each, all following the medcare_bridge.rs template: - WoaBridge = UnifiedBridge<ogar_vocab::ports::WoaPort> (NAMESPACE "WorkOrder", bridge_id "woa"). Customer/Kunde resolves to BILLING_PARTY (0x0204); Vorgang/WorkOrder/Quote/Invoice/CreditNote to COMMERCIAL_DOCUMENT (0x0202); Position/LineItem to COMMERCIAL_LINE_ITEM (0x0201); TaxRate/Steuersatz to TAX_POLICY (0x0203); Payment/Zahlung to PAYMENT_RECORD (0x0205); Stundenzettel/ TimesheetActivity/TimeEntry/Zeiterfassung to BILLABLE_WORK_ENTRY (0x0103). - SmbBridge = UnifiedBridge<ogar_vocab::ports::SmbPort> (NAMESPACE "SMB", bridge_id "smb"). Same canonical block as WoA — Kunde→ BILLING_PARTY, Stundenzettel→BILLABLE_WORK_ENTRY, etc. — so smb-office-rs gets cross-fork convergence with WoA + OpenProject + Odoo for free. - OdooBridge = UnifiedBridge<ogar_vocab::ports::OdooPort> (NAMESPACE "Odoo", bridge_id "odoo"). Odoo's Python class names (res.partner / account.move / account.move.line / hr.attendance / …) resolve to the same canonical block. Closes the planner→ERP→billing chain at every hop. The convergence pin (the operator's value statement as a bridge-side test): - `bridges::woa_bridge::tests::entity_resolves_stundenzettel_to_ billable_work_entry_planner_convergence` ✓ - `bridges::smb_bridge::tests::entity_resolves_stundenzettel_to_ billable_work_entry_planner_convergence` ✓ Both assert that `bridge.entity("Stundenzettel").schema_ptr. entity_type_id() == 0x0103 BILLABLE_WORK_ENTRY`, the SAME id `OpenProjectBridge.entity("TimeEntry")` and `RedmineBridge. entity("TimeEntry")` return. The planner→ERP integration is now a codebook lookup, not a translation layer. Tests: 53/53 lance-graph-ogar lib tests pass, including the 14 new tests (5 per bridge minus 1 missing in odoo). Cargo lock updated to pull OGAR main @ 08a9c979 (post #93+#94 merge). Unrelated drive-by: cargo fmt picked up minor formatting nits in unified.rs / medcare_bridge.rs / openproject_bridge.rs / tests/ bridge_codebook_convergence.rs — included to keep the tree fmt-clean. Pre-existing clippy `--lib -- -D warnings` errors in lance-graph- ontology and the OGAR bridges (8 `dead_code` warnings on the per- bridge `pub const NAMESPACE` constants — pre-migration compat shims that aren't used inside the crate) are NOT introduced by this PR and affect medcare_bridge.rs / openproject_bridge.rs / redmine_bridge.rs identically — the new bridges follow the same pattern. Consumer-side migrations queued (next, in their own repos): - woa-rs: RFC-010 (Iron Rule 1 allow-list: add `lance-graph-ogar`) + switch `use lance_graph_ontology::bridges::WoaBridge` → `use lance_graph_ogar::bridges::WoaBridge` across 4 files (~50 LOC). - smb-office-rs: Cargo dep + repoint `crates/smb-bridge/src/unified_bridge_wiring.rs` from `OgitBridge` to `SmbBridge` (~50 LOC). - odoo-rs / openproject-nexgen-rs: their own sessions per the medcare-rs #168 worked example pattern. Cross-refs: OGAR PR #93 (WoaPort + SmbPort, merged), OGAR PR #94 (OdooPort, merged), lance-graph PR #585 (the OGIT/OGAR separation that gated this work), EPIPHANIES `E-OGAR-AR-MIGRATION-IS-SEVERITY`, ISSUES `OGAR-AR-MIGRATION-WOA-SMB-OPEN`, woa-rs `.claude/board/OGAR-MIGRATION-GAP-2026-06-21.md`, smb-office-rs `.claude/board/TECH_DEBT.md` `TD-OGAR-CONSUMER-MIGRATION-1`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xzyc27Nx3f8WC5KzwfWfjx
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (8)
📝 WalkthroughWalkthroughThree new OGAR-driven tenant bridge modules are added ( ChangesNew OGAR Tenant Bridges
Formatting and import-order fixes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 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 docstrings
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 |
What
Three new OGAR-driven port bridges in
lance_graph_ogar::bridges, all thin type aliases over the existingUnifiedBridge<P: PortSpec>harness:WoaBridge = UnifiedBridge<WoaPort>(namespaceWorkOrder, bridge_idwoa)SmbBridge = UnifiedBridge<SmbPort>(namespaceSMB, bridge_idsmb)OdooBridge = UnifiedBridge<OdooPort>(namespaceOdoo, bridge_idodoo)Consumes OGAR PR #93 (WoaPort + SmbPort) and OGAR PR #94 (OdooPort) — both already merged on OGAR
main@ 08a9c979.The convergence pin (operator value statement 2026-06-21)
That's the cross-fork convergence the codebook was built for, applied to the planner ↔ ERP seam. This PR ships it end-to-end through the
entity()codebook-synthesis path:All resolve to
class_ids::BILLABLE_WORK_ENTRY = 0x0103. The planner→ERP integration is a codebook lookup, not a translation layer.Commerce-block convergence (apple meets apple, second time)
Symmetric to the OpenProject ↔ Redmine pin, WoA ↔ SMB ↔ Odoo now have one too:
(The cross-port assertion lives in
ogar_vocab::ports::tests::woa_and_smb_converge_on_commerce_block, shipped in OGAR #93.)Tests
53/53 lance-graph-ogar lib tests pass, including the 14 new bridge-side tests:
cargo fmt --checkclean. Pre-existing clippy--lib -- -D warningswarnings (8dead_codeon per-bridgeNAMESPACEconstants — pre-migration compat shims) are NOT introduced by this PR; they affect medcare/openproject/redmine bridges identically — the new bridges follow the same pattern.Consumer-side migrations (queued, in their own repos)
lance-graph-ogar) + repointuse lance_graph_ontology::bridges::WoaBridge→use lance_graph_ogar::bridges::WoaBridgeacross 4 files (~50 LOC). Spec:woa-rs/.claude/board/OGAR-MIGRATION-GAP-2026-06-21.md.crates/smb-bridge/src/unified_bridge_wiring.rsfromOgitBridgetoSmbBridge(~50 LOC). Spec:smb-office-rs/.claude/board/TECH_DEBT.mdTD-OGAR-CONSUMER-MIGRATION-1.Drive-by
cargo fmtpicked up minor formatting nits inunified.rs,medcare_bridge.rs,openproject_bridge.rs, andtests/bridge_codebook_convergence.rs— included to keep the tree fmt-clean.Cross-refs
E-OGAR-AR-MIGRATION-IS-SEVERITYOGAR-AR-MIGRATION-WOA-SMB-OPEN.claude/board/OGAR-MIGRATION-GAP-2026-06-21.md.claude/board/TECH_DEBT.mdTD-OGAR-CONSUMER-MIGRATION-1.claude/board/EPIPHANIES.mdE-PLANNER-TIMES-ALIGN-BILLABLE-HOURS🤖 Generated with Claude Code
https://claude.ai/code/session_01Xzyc27Nx3f8WC5KzwfWfjx
Generated by Claude Code
Summary by CodeRabbit
New Features
Chores