|
| 1 | +# Handover — OGAR V3 as polyglot transpiler; the odoo-rs / OP / ruff convergence arc |
| 2 | + |
| 3 | +> **Date:** 2026-07-09. **Scope:** the whole transpiler arc (ruff harvest → |
| 4 | +> OGAR IR → materializations), not one repo. **Author's honesty contract:** |
| 5 | +> this handover separates **[VERIFIED]** (I built/read it myself this session) |
| 6 | +> from **[REPORTED]** (a parallel session claimed it; I could not confirm — |
| 7 | +> odoo-rs was unreachable from my session: git 403 / pygithub 403 / MCP 404). |
| 8 | +> Do not promote a [REPORTED] line to fact without checking the cited PR. |
| 9 | +
|
| 10 | +--- |
| 11 | + |
| 12 | +## 0. The locked frame (operator, verbatim) — the spine everything hangs on |
| 13 | + |
| 14 | +OGAR V3 is a **polyglot transpiler**; each consumer repo is a **lens**, not a |
| 15 | +"port". odoo-rs is the **Odoo lens**. |
| 16 | + |
| 17 | +``` |
| 18 | +IN (harvest, per-language frontends) IR (the substrate) OUT (materializations) |
| 19 | +──────────────────────────────────── ─────────────────────── ─────────────────────────────── |
| 20 | +Python/Odoo ruff_python_spo CompiledClass emit_rust (Rust SDK) |
| 21 | +Ruby/Rails ruff_ruby_spo ──► { class: ogar_vocab::Class emit_python (Python SDK — the |
| 22 | +C# ruff_csharp_spo , facet: 16B classid+12 mirror-back container) |
| 23 | +C++ ruff_cpp_spo , actions: ActionDef+Kausal } emit_csharp (C# SDK) |
| 24 | + one per class, addressable ─ storage skins ─ |
| 25 | ++ views (ERB/Jinja/Odoo-XML/askama by classid = domain:appid: PG facet table (p0..p11 = 3×SPOG ORM) |
| 26 | + → one WideFieldMask brick) classview lance-graph V3 (same 16B, native) |
| 27 | ++ nav (navigates_to, 4 frontends ─ view/nav skins ─ |
| 28 | + → one connectivity brick) 4 renderers, 1 mask; 1 nav graph |
| 29 | +``` |
| 30 | + |
| 31 | +**Roles, locked:** |
| 32 | +- **odoo (Python upstream)** — read-only *harvest source* + *parity oracle*. Never a deploy target from this work. |
| 33 | +- **odoo-rs** — the *substrate lens*: compile-in, hydrate the storage matrix, serve the mirror-backs (`emit_python` SDK is the "Python container", **not** upstream Odoo). |
| 34 | +- **OGAR** — the *engine* (IR + vocab + emitters + adapters). |
| 35 | + |
| 36 | +Every asset built this arc — kausal parity, field masks, Klickweg nav, the |
| 37 | +ndjson corpora — is **transpiler infrastructure**, not app code. |
| 38 | + |
| 39 | +--- |
| 40 | + |
| 41 | +## 1. Cross-repo state |
| 42 | + |
| 43 | +Local branch is `claude/odoo-rs-transcode-lf8ya5` in every repo. |
| 44 | + |
| 45 | +| Repo | My local branch tip | Notes | |
| 46 | +|---|---|---| |
| 47 | +| OGAR | `9e49ba4` **[VERIFIED]** | rebased clean onto `origin/main` (76dcb27); PR diff now additive-only (see §3). | |
| 48 | +| ruff | `684ba99` **[VERIFIED]** | schema strata + lineage union; main at `72b7759` (#43 merged). | |
| 49 | +| openproject-nexgen-rs | `5092688` **[VERIFIED]** | §5 steps 1–5 done; rebased linear on main. | |
| 50 | +| lance-graph | `df36747` **[VERIFIED local]** | at my clone the contract nav API (`screens_reachable_from`/`nav_is_fully_connected`) was **not** found; parallel track reports it landed at `5284755`/#669 **[REPORTED]** — my clone is likely behind. Re-fetch before relying. | |
| 51 | +| odoo-rs | `d724313` **[VERIFIED local]** | **unreachable via GitHub this session.** Parallel track reports PRs #30/#31/#32 + handover `2e7c55c` + fix `96b9d79` — **none present in my clone**, all **[REPORTED]**. | |
| 52 | +| odoo | — | Parallel track reports PRs #2/#3 (Railway parity-oracle container) merged into `19.0` **[REPORTED]**. Default branch is **`19.0`, not `main`** — a `fetch origin main` silently no-ops. | |
| 53 | + |
| 54 | +--- |
| 55 | + |
| 56 | +## 2. What I verified myself this session **[VERIFIED]** |
| 57 | + |
| 58 | +- **odoo-rs builds green both ways:** |
| 59 | + - `cargo build --release --features cli` → `od-codegen` compiles serde-only, offline, 41s; binary runs (`--help` ok). This is the ground truth for any **job-container `ENTRYPOINT`**. |
| 60 | + - `cargo build --release --features cli,ogar-emit` → **EXIT 0**, 25s. Fetched + compiled OGAR (`7d0dca2`) and the **ruff AST frontend** (`ruff_python_spo` / `ruff_spo_triplet` / `ruff_python_parser` @ `4860e79`). The "use ruff for AST" convergence path is **complete and compiles** at the pinned revs. |
| 61 | +- **od-codegen is a batch CLI, not a server** — zero web-server deps; the "Railway `0.0.0.0:$PORT`" ask does **not** fit the repo *as-is* (nothing listens). The retarget below resolves this correctly. |
| 62 | +- **No runtime DB in odoo-rs today** — zero `DATABASE_URL`/`env::var` DB reads; `lance_graph` appears only as doc-comment provenance. Input = static committed ndjson (`data/*.spo.ndjson`); output = SurrealQL DDL text. The **PG-vs-lance-graph storage choice does not exist in this repo yet** — it is the deployment work below, not current behavior. |
| 63 | + |
| 64 | +--- |
| 65 | + |
| 66 | +## 3. The messy part, recorded so it isn't repeated |
| 67 | + |
| 68 | +Earlier today I opened **OGAR #156** and **OP #71 without rebasing first**. Both |
| 69 | +branches had forked before their mains advanced, so the PR diffs read as massive |
| 70 | +deletions (OP: **10,634** — the entire `vendor/AdaWorldAPI-ruff` tree; OGAR: |
| 71 | +main's OSM/render body shown as reverts). The operator closed both as |
| 72 | +unacceptable. **Fix applied:** both branches rebased so `origin/main` is a clean |
| 73 | +ancestor; PR diffs collapse to additive-only (OGAR: 6 files, +607/−46 — the −46 |
| 74 | +are our own replaced lines; OP: the 10,634 are the intended un-vendor deletion, |
| 75 | +now clearly isolated). **Lesson, now doctrine:** *rebase before every PR; a diff |
| 76 | +that shows deletions of another track's work is a hard stop, never a footnote.* |
| 77 | + |
| 78 | +Also standing: the operator **no-rev-pins ruling** — AdaWorldAPI-internal git |
| 79 | +deps float on the convergence branch; drift protection is the **fuse tests**, not |
| 80 | +pins (a floating dep that fails within a build is the fuse working). Flip to |
| 81 | +`branch = "main"` when the convergence branches merge. |
| 82 | + |
| 83 | +--- |
| 84 | + |
| 85 | +## 4. The retargeted deployment ask — od-hydrate substrate host |
| 86 | + |
| 87 | +The original "Railway `$PORT` Dockerfile for odoo-rs" was correctly rejected (no |
| 88 | +server). The **retarget** (operator-framed) is a genuine feature that *does* |
| 89 | +legitimately bind `$PORT`: |
| 90 | + |
| 91 | +- **`od-hydrate` substrate host** — a real axum server (binds `0.0.0.0:$PORT`), so the Railway web pattern fits honestly. |
| 92 | +- **First-start hydration variable** — check-if-hydrated on the facet table; idempotent (probe before mint). |
| 93 | +- **Storage choice at onboarding** — **PG facet table** (`p0..p11` = 3×SPOG ORM shape) **vs lance-graph V3** (same 16B, native). This is the DB-hydration decision, living where it belongs (the runtime host), not in the transpiler. |
| 94 | +- **`/sdk/python` (+ /rust, /csharp)** — serve the `emit_*` mirror-back of whatever is hydrated. |
| 95 | +- **Surfaces already exist upstream** — `emit_facet_table_ddl`, `emit_python` + prelude, `compile_source` in-process. It is **assembly, not invention**. |
| 96 | + |
| 97 | +Ownership per operator ("take it"): **this handover is mine**; the container |
| 98 | +build is being carried by the track with odoo-rs access. If that inverts, the |
| 99 | +build needs: odoo-rs GitHub access unblocked for the session + the other track |
| 100 | +paused (do not two-write the same crate). |
| 101 | + |
| 102 | +--- |
| 103 | + |
| 104 | +## 5. Open tail (non-blocking) |
| 105 | + |
| 106 | +- **od-hydrate container** — the §4 substrate host (axum + tokio-postgres, Dockerfile + railway.toml, the variable contract). |
| 107 | +- **Q9** — the OGAR carrier asks (council tail). |
| 108 | +- **`odoo_actions` authority table** — deferred, gated on W2′ storage. |
| 109 | +- **lance-graph contract nav API** — confirm `5284755`/#669 landed the `screens_reachable_from`/`nav_is_fully_connected` brick before any consumer delegates to it (my clone couldn't see it). |
| 110 | +- **medcare lens** — ruff now has the MySQL-DDL stratum (`ruff_csharp_spo::schema`, `684ba99`); the medcare session lifts `Struktur.sql → ModelGraph → compile` through the same door, with corpus-specific acceptance tests kept private (no corpus names/stats in the public fork). |
| 111 | + |
| 112 | +--- |
| 113 | + |
| 114 | +## 6. Provenance note |
| 115 | + |
| 116 | +Written by the session that held the **handover**, not the code. Cross-repo PR |
| 117 | +claims (#30/#31/#32 odoo-rs, #2/#3 odoo, #669 lance-graph) are **[REPORTED]** by |
| 118 | +a parallel track and were **not** independently verifiable from here. Everything |
| 119 | +under **[VERIFIED]** was built or read first-hand. When in doubt, trust the cited |
| 120 | +commit/PR over this prose. |
0 commit comments