|
| 1 | +# Land #589 — OGAR bridge-deprecation beacon (pull-via-class, no bridge) |
| 2 | + |
| 3 | +> **Status:** IN PR (branch `claude/pensive-mendel-ou2rj6`). 5+3 sprint + 5+3 |
| 4 | +> review complete; P0 fixed; clippy gate re-run. Supersedes open PR #589 by |
| 5 | +> landing its shape on the canonical dev line **plus** a P0 fix #589 ships. |
| 6 | +> **Date:** 2026-06-22. |
| 7 | +
|
| 8 | +## Overview / goal |
| 9 | + |
| 10 | +Operator goal: *"land where open PR #589 is, without bridge, only pulling OGAR |
| 11 | +via class."* #589 is the lance-graph spine **deprecation beacon** that points |
| 12 | +consumers from per-tenant bridge OBJECTS to OGAR **class-pull**: |
| 13 | + |
| 14 | +```rust |
| 15 | +// BEFORE (bridge object): lance_graph_ogar::bridges::WoaBridge::new(reg)?.entity("Stundenzettel")? |
| 16 | +// AFTER (class pull): ogar_vocab::ports::WoaPort::class_id("Stundenzettel") == Some(0x0103) |
| 17 | +``` |
| 18 | + |
| 19 | +### The OGAR #95 contract this serves (read in full via pygithub/GH_TOKEN) |
| 20 | + |
| 21 | +OGAR PR #95 (`docs(OGAR): APP‖class codebook layout`, merged, **docs-only, |
| 22 | +1136 LOC, nothing minted**): `classid: u32 = [hi u16 = APP / render prefix] |
| 23 | +[lo u16 = shared canonical concept]`. |
| 24 | + |
| 25 | +- `*Port::class_id(name)` returns the **lo u16** concept (`0x0103`), shared |
| 26 | + across apps (RBAC grant + ontology + cross-app identity). |
| 27 | +- The consumer stamps its **hi u16** app prefix for the render id: |
| 28 | + `0x0003 (WoA) << 16 | 0x0103 = 0x0003_0103`. App prefixes: `0x0001` |
| 29 | + OpenProject · `0x0002` Odoo · `0x0003` WoA · `0x0004` SMB · `0x0005` |
| 30 | + Medcare · `0x0007` Redmine. |
| 31 | +- Additive (every shipped id is `0x0000_DDCC`) → zero `ENVELOPE_LAYOUT_VERSION` |
| 32 | + cost, RESERVE-DON'T-RECLAIM holds. The hi u16 was reserved-zero, NOT SoA |
| 33 | + versioning. |
| 34 | +- The `lance-graph-rbac` `authorize(actor, classid, op)` keystone does **not** |
| 35 | + exist yet (gated on `PROBE-OGAR-RBAC-AUTHORIZE`). Consumers migrate the |
| 36 | + classid pull only; do NOT re-introduce a bridge as an auth stopgap. |
| 37 | + |
| 38 | +## What landed |
| 39 | + |
| 40 | +`fb0d8c4d` (cherry-pick of #589's commit `10e717d4`, after merging `origin/main` |
| 41 | +to bring the full 8-bridge set via #585/#586/#587) + a follow-up commit: |
| 42 | + |
| 43 | +- 10 bridge symbols `#[deprecated(note=…)]` (6 `lance_graph_ogar::bridges` |
| 44 | + aliases + 4 `lance_graph_ontology::bridges` structs), each note naming the |
| 45 | + correct `*Port::class_id` replacement. |
| 46 | +- `#![allow(deprecated)]` on the test/conformance harness files. |
| 47 | +- `lib.rs` re-export split (deprecated aliases under `#[allow(deprecated)]`). |
| 48 | +- New `docs/CONSUMER-BRIDGE-DEPRECATION.md` (171 lines). |
| 49 | +- **P0 fix (this session, not in #589):** `lance-graph-ogar/src/bridges/mod.rs` |
| 50 | + re-exported the 6 deprecated aliases WITHOUT `#[allow(deprecated)]` — would |
| 51 | + fail `cargo clippy -- -D warnings`. Split the re-export the same way as |
| 52 | + `lib.rs`. **#589 itself still ships this gap.** |
| 53 | + |
| 54 | +`UnifiedBridge<P>`, the `*Port` types, and the `*_CODEBOOK` constants (already |
| 55 | +deprecated in #570) are correctly NOT re-deprecated. |
| 56 | + |
| 57 | +## 5+3 review (parallel savants, static, no cargo — orchestrator compiled once) |
| 58 | + |
| 59 | +| Lens | Verdict | |
| 60 | +|---|---| |
| 61 | +| brutally-honest-tester | HOLD → **P0** (mod.rs re-export); **fixed** → LAND | |
| 62 | +| preflight-drift-auditor | CLEAN (byte-identical to #589, no conflict markers) | |
| 63 | +| core-first-architect | TARGETS-CORE (sheds bridge residue, keeps harness+Ports) | |
| 64 | +| truth-architect | ACCURATE (doc matches OGAR #95; RBAC gap honestly flagged) | |
| 65 | +| iron-rule-savant | YIELDS-ALL (I-LEGACY-API-FEATURE-GATED yields; nothing reclaimed) | |
| 66 | +| integration-lead | COHERENT (+ board-hygiene P1 → this doc + board entries) | |
| 67 | +| baton-handoff-auditor | CATCH-LATENT (no P0; P1 nits: OgitBridge note example; Spear/SharePoint ports unowned) | |
| 68 | +| dto-soa-savant | FITS-COLUMN (hi/lo split = codebook prefix on existing classid column) | |
| 69 | + |
| 70 | +## Checklist |
| 71 | + |
| 72 | +- [x] Merge `origin/main` into pensive-mendel (full 8-bridge set) |
| 73 | +- [x] Cherry-pick #589 beacon (`fb0d8c4d`) |
| 74 | +- [x] Central `cargo check` of touched crates (exit 0) |
| 75 | +- [x] 5+3 parallel review panel |
| 76 | +- [x] Fix P0 (`bridges/mod.rs` re-export `#[allow(deprecated)]`) |
| 77 | +- [x] Re-run `cargo clippy -- -D warnings` on `lance-graph-ogar` |
| 78 | +- [x] Board hygiene (this plan + PR_ARC + LATEST_STATE + AGENT_LOG) |
| 79 | +- [ ] Push pensive-mendel, open PR, subscribe to PR activity |
| 80 | +- [ ] Note the P0 to #589 (the canonical open PR still ships it) |
| 81 | + |
| 82 | +## Deferred (named, non-blocking) |
| 83 | + |
| 84 | +- P1 (baton): `OgitBridge` deprecation note names `WoaPort` as the example but |
| 85 | + the struct is namespace-agnostic — left verbatim to match #589; flagged for |
| 86 | + #589's author. |
| 87 | +- P1 (baton): `SpearBridge`/`SharePointBridge` deprecate to ports that don't |
| 88 | + exist yet — honest gap, documented in the beacon doc; no owner assigned. |
| 89 | +- The terminal `bridges/` deletion PR is gated on the three remaining consumer |
| 90 | + migrations (MedCare-rs 33, woa-rs 6, smb-office-rs 4) — future work, no |
| 91 | + removal window. |
0 commit comments