|
51 | 51 | | **Elixir / HIRO** | migration target (OLD stack) | `docs/ELIXIR-HIRO-PREFETCH.md` + `crates/ogar-from-elixir` | scaffold; merged | |
52 | 52 | | **Odoo / ERP** | **production instance** | `docs/ODOO-TRANSCODING.md` + a production ERP deployment | shipping | |
53 | 53 | | **HIPAA / healthcare** | **production instance** | a production healthcare (HIPAA) deployment | shipping | |
| 54 | +| **Geospatial / OSM** | calibration (geographic) | `docs/RDF-OWL-ALIGNMENT.md §10` Phase 2c + `lance-graph` PR #473 `cesium-osm-substrate-v1.md` (D-OSM-1..7) | spec'd; runtime addendum shipped; `ogar-from-osm-pbf` queued | |
54 | 55 |
|
55 | 56 | The first three are how the substrate is *calibrated* (chess proves the |
56 | 57 | Semantik/Syntax/Pragmatik trichotomy separates cleanly; OpenProject |
@@ -122,31 +123,92 @@ A production HIPAA deployment proves the firewall split is a |
122 | 123 | *requirement*, not a nicety: a real HIPAA-compliant system needs fast |
123 | 124 | inner auth AND durable outer audit, and ships exactly that separation. |
124 | 125 |
|
| 126 | +### 2.6 Geospatial / OSM — geographic calibration |
| 127 | + |
| 128 | +**What OSM proves: geography doesn't break the IR.** OSM IDs are |
| 129 | +*already* prefix-structured (`country/region/city/street/house`), so |
| 130 | +the adapter is doing identity-*extraction*, not identity-construction |
| 131 | +— a much smaller surface than typical. Three OSM Classes (`Node`, |
| 132 | +`Way`, `Relation`) lift via the queued `ogar-from-osm-pbf` adapter |
| 133 | +(`docs/RDF-OWL-ALIGNMENT.md §10` Phase 2c). Exercises: |
| 134 | + |
| 135 | +- **Spatial prefix-locality** — Cesium TMS quadkey as `NiblePath` |
| 136 | + prefix, per Q2 coordination outcome locked in `lance-graph` PR #473 |
| 137 | + §2. HHTL trie routes `osm/<quadkey>/way/123` byte-identically to |
| 138 | + `ogit-erp/sale.order/42` and `fma/Femur`. The *runtime session's* |
| 139 | + Cesium tile pyramid math (`crates/cesium/src/sse.rs` + |
| 140 | + `implicit_tiling.rs`) already uses quadkey addressing; aligning |
| 141 | + OGAR routes both sides through the same address arithmetic. |
| 142 | + |
| 143 | +- **Tag-as-Class final / Arrow-list v1 fallback** — Q1 coordination |
| 144 | + outcome locked in `lance-graph` PR #473 §2. Final shape: Tag is a |
| 145 | + `Class` related via `has_tag: HasMany<Tag>` (SPO-natural emission |
| 146 | + `(Way#123, ogar:hasTag, Tag#building=yes)`); v1 implementation |
| 147 | + ships the Arrow `List<Struct>` fallback in `D-OSM-1/2` for |
| 148 | + cardinality control while Tag interning matures. The IR (`Class` |
| 149 | + shape) carries no OSM-specific dialect — same ADR-023 discipline |
| 150 | + Odoo's `_inherit`/`_inherits` already follows. |
| 151 | + |
| 152 | +- **Palette256 codec (ADR-024) adopts its third domain.** OSM tag |
| 153 | + values cluster within a tile (most zoom-21 tiles have ≤256 |
| 154 | + distinct tag values); per-tile palette + const-table lookup |
| 155 | + yields ~5-10× compression on way attributes. The `D-OSM-2` |
| 156 | + Arrow→Lance ingest reports ρ-vs-reference per the ADR-024 |
| 157 | + adoption checklist (lance-graph PR #473's §11 callout — the |
| 158 | + runtime session's commitment after ADR-024 merged in PR #39). |
| 159 | + |
| 160 | +- **The OGAR-crossing deliverable is `D-OSM-3`** — the SPO triple |
| 161 | + lift in `lance-graph-ontology`. That's the producer-side contract |
| 162 | + the `ogar-from-osm-pbf` adapter consumes. OGAR session signed off |
| 163 | + on the surface in 2026-06-05 cross-session coordination; the |
| 164 | + adapter is unblocked. |
| 165 | + |
| 166 | +**The geographic litmus complements the anatomical one: the same |
| 167 | +compile-time HHTL primitive resolves `Femur is_a LongBone` AND |
| 168 | +`Marienplatz is_in Munich` in sub-microsecond.** That's the |
| 169 | +falsifiable property — measurable, not aspirational. If it holds, |
| 170 | +*"instance proves universality"* is non-trivial; if it fails on |
| 171 | +either, the substrate is leaking dialect into the codec. |
| 172 | + |
| 173 | +The OSM instance is calibration-grade like Chess and OpenProject (no |
| 174 | +production deployment owned by the workspace yet), but the *runtime |
| 175 | +side* — Cesium tilesets, Lance-backed OSM datasets, 3DGS splat |
| 176 | +batches over OSM building footprints — is shipping per the |
| 177 | +`cesium-osm-substrate-v1.md` deliverable line. The OGAR side |
| 178 | +contributes the schema lift; the runtime side contributes the |
| 179 | +rendering substrate; together they form the geographic counterpart |
| 180 | +to the FMA-bones anatomical case (`docs/RDF-OWL-ALIGNMENT.md §6`). |
| 181 | + |
125 | 182 | ## 3. Capability coverage matrix |
126 | 183 |
|
127 | 184 | Which domain proves which substrate capability (Foundry-parity columns |
128 | 185 | from `SUBSTRATE-ENDGAME.md §5.2`): |
129 | 186 |
|
130 | | -| Capability | Chess | OpenProject | Elixir/HIRO | Odoo/ERP | HIPAA | |
131 | | -|---|:--:|:--:|:--:|:--:|:--:| |
132 | | -| Ontology (Class/Association) | ✓ | ✓ | ✓ | ✓ | ✓ | |
133 | | -| Action types / lifecycle FSM | ✓ | ✓ | ✓ (gen_statem) | ✓ (workflows) | ✓ | |
134 | | -| `Postpone` / `StateTimeout` | ✓ (premove/clock) | partial | ✓ | — | — | |
135 | | -| `Depends` (data-causal) | — | ✓ (reactive) | ✓ | ✓ (`@api.depends`) | — | |
136 | | -| Time-versioned / time-travel | ✓ | ✓ (paper-trail) | ✓ | ✓ | ✓ (audit) | |
137 | | -| **Row-level permissions** | — | partial (RBAC) | — | partial | **✓ (HIPAA, palette256)** | |
138 | | -| **Immutable audit** | — | ✓ (journals) | — | ✓ | **✓ (HIPAA, signed)** | |
139 | | -| Multi-language frontends | (Rust) | Ruby | Elixir | Python (Odoo)+SeaORM | Rust | |
140 | | -| Money/decimal fidelity | — | — | — | **✓ (ERP)** | — | |
141 | | -| Migration scaffold | — | ✓ (target) | ✓ (spine) | (already Rust) | (already Rust) | |
| 187 | +| Capability | Chess | OpenProject | Elixir/HIRO | Odoo/ERP | HIPAA | OSM | |
| 188 | +|---|:--:|:--:|:--:|:--:|:--:|:--:| |
| 189 | +| Ontology (Class/Association) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| 190 | +| Action types / lifecycle FSM | ✓ | ✓ | ✓ (gen_statem) | ✓ (workflows) | ✓ | — | |
| 191 | +| `Postpone` / `StateTimeout` | ✓ (premove/clock) | partial | ✓ | — | — | — | |
| 192 | +| `Depends` (data-causal) | — | ✓ (reactive) | ✓ | ✓ (`@api.depends`) | — | — | |
| 193 | +| Time-versioned / time-travel | ✓ | ✓ (paper-trail) | ✓ | ✓ | ✓ (audit) | ✓ (changesets) | |
| 194 | +| **Row-level permissions** | — | partial (RBAC) | — | partial | **✓ (HIPAA, palette256)** | — (ODbL-public) | |
| 195 | +| **Immutable audit** | — | ✓ (journals) | — | ✓ | **✓ (HIPAA, signed)** | ✓ (OSM changeset history) | |
| 196 | +| Multi-language frontends | (Rust) | Ruby | Elixir | Python (Odoo)+SeaORM | Rust | Rust (via `osmpbf`) | |
| 197 | +| Money/decimal fidelity | — | — | — | **✓ (ERP)** | — | — | |
| 198 | +| Migration scaffold | — | ✓ (target) | ✓ (spine) | (already Rust) | (already Rust) | (already Rust) | |
| 199 | +| **Spatial prefix routing** (Cesium TMS quadkey via NiblePath) | — | — | — | — | — | **✓ (OSM)** | |
| 200 | +| **Palette256 codec adoption** (ADR-024) | — | — | — | — | ✓ (security) | **✓ (tag values + tile-local coords)** | |
142 | 201 |
|
143 | 202 | **Coverage observation:** no single domain exercises everything, but the |
144 | | -five together cover the full surface. The HIPAA instance is the *only* |
| 203 | +six together cover the full surface. The HIPAA instance is the *only* |
145 | 204 | one that hard-proves row-level perms + signed audit (the Security Mesh); |
146 | 205 | the Odoo/ERP instance is the *only* one that hard-proves money/decimal |
147 | | -fidelity + production `@api.depends`. The calibration trio |
148 | | -(chess/OP/HIRO) proves the lifecycle + migration core. **That's why all |
149 | | -five matter** — drop any and a capability loses its production witness. |
| 206 | +fidelity + production `@api.depends`; the OSM instance is the *only* |
| 207 | +one that hard-proves spatial prefix routing (Cesium TMS quadkey as |
| 208 | +`NiblePath`) AND drives the second production adoption of the |
| 209 | +palette256 codec from ADR-024. The calibration trio (chess/OP/HIRO) |
| 210 | +proves the lifecycle + migration core. **That's why all six matter** |
| 211 | +— drop any and a capability loses its production witness. |
150 | 212 |
|
151 | 213 | ## 4. Why the two production instances change the Foundry argument |
152 | 214 |
|
|
0 commit comments