From 3c63733ab1320eb88ddb9d072b53fd40fcb4ed8d Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 10:23:32 +0000 Subject: [PATCH 1/3] =?UTF-8?q?lance-graph-ogar:=20drop=20the=20six=20stri?= =?UTF-8?q?ng-namespace=20mirrors=20=E2=80=94=20the=20classid=20is=20the?= =?UTF-8?q?=20namespace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator ruling: "It should always be classid, which is the namespace", and on the surface that still carries a string one, "the old lockstep is deprecated, namespace might be even older." ## What was there Six `pub const NAMESPACE: &str = XPort::NAMESPACE;` — one per bridge module, a string copy of a per-port trait const. q2's newly un-gated clippy gate failed on all six with `constant NAMESPACE is never used`. ## Why they were dead The identical idiom is ALIVE one crate over: `lance-graph-ontology`'s bridges hold the same constant and clippy is silent, because each of those is a hand-written bridge whose own `new()` calls `registry.namespace_id(NAMESPACE)`. Here the per-port bridges were collapsed into the generic `UnifiedBridge` harness, which reads `P::NAMESPACE` off the trait — so the module-level copy lost its only caller. The doc-comments claimed they existed "so existing consumers that imported the constant from this module keep building", but the modules are private (`mod redmine_bridge;`, and `git log -S 'pub mod redmine_bridge'` finds no such line ever) and `bridges/mod.rs` re-exports `*Port`/`*Bridge` without them. The shim was born unreachable in the same PR that wrote it. ## Why deleting is right rather than re-exporting A string is the wrong currency, reachable or not. `ogar_vocab::ports` already carries the address and the mapping is exactly 1:1 — OpenProject/0x0001, Odoo/0x0002, WorkOrder/0x0003, SMB/0x0004, Healthcare/0x0005, Redmine/0x0007, OpenStreetMap/0x0008, WeatherNext/0x0009 — where that value is `APP_PREFIX`, the lo-u16 classview slot of `render_classid = (concept << 16) | APP_PREFIX`. The namespace is not a label beside the address; it is a register OF the address. A string namespace is a second spelling, and a second spelling is a drift surface. Re-exporting would also widen a surface that already carries `#[deprecated]` (`docs/CONSUMER-BRIDGE-DEPRECATION.md`), pointing consumers back at bridges the docs tell them to leave. ## The change - Removed the six constants and their doc-comments. - The three tests that used one now call the trait const (`RedminePort::NAMESPACE` etc.) instead of a module-local copy — the mirror goes, the value stays reachable by the public path consumers are already directed to. - Dropped the six file-level `use ogar_vocab::ports::PortSpec;` imports that existed only to resolve the deleted consts. Each test module keeps its own. ## Named, not done here Migrating `UnifiedBridge` itself onto `lance_graph_contract::hotplug` — whose module doc states the invariant the ruling names, "the classid is the join key on BOTH sides". Not aspirational: this crate ALREADY implements the authority half (`impl CapabilityAuthority for OgarAuthority` in `lib.rs`), so the successor and the legacy are neighbours in one crate. That migration retires the string namespace and the PortSpec lockstep together and wants its own plan. ## Verification cargo clippy --manifest-path crates/lance-graph-ogar/Cargo.toml --all-targets -> 0 errors (was 6 dead_code errors + 6 unused-import errors mid-change) cargo test --manifest-path crates/lance-graph-ogar/Cargo.toml -> 96 passed, 0 failed citation_decay --since ef724878 -> 0 new decays Four `clippy::doc_*` warnings remain in this crate. They pre-date this change — measured at HEAD before touching anything — and are untouched here; they do not fail q2's gate, which applies `-D warnings` to rustc lints on dependencies, not clippy's doc lints. Board: `.claude/board/EPIPHANIES.md` gains E-THE-CLASSID-IS-THE-NAMESPACE-1. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V --- .claude/board/EPIPHANIES.md | 88 +++++++++++++++++++ .../src/bridges/medcare_bridge.rs | 7 +- .../src/bridges/odoo_bridge.rs | 3 - .../src/bridges/openproject_bridge.rs | 7 +- .../src/bridges/redmine_bridge.rs | 7 +- .../src/bridges/smb_bridge.rs | 3 - .../src/bridges/woa_bridge.rs | 3 - 7 files changed, 91 insertions(+), 27 deletions(-) diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 9807f3dc5..93352b129 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,3 +1,91 @@ +## 2026-09-06 — E-THE-CLASSID-IS-THE-NAMESPACE-1 — a string namespace is the oldest layer, and the lockstep above it is already deprecated + +**Status:** OPERATOR RULING, with the measured evidence that prompted it. +**Confidence:** High — the 1:1 table below is read straight out of +`ogar_vocab::ports`, and the dead-code finding was surfaced by a consumer's CI. + +**The ruling, in the operator's words:** *"It should always be classid, which is +the namespace."* And, on the surface that still carries a string one: *"the old +lockstep is deprecated, namespace might be even older."* + +**What surfaced it.** q2's test suite was un-gated (`AdaWorldAPI/q2#146`) and +its clippy gate failed on six `error: constant NAMESPACE is never used` in +`lance-graph-ogar`'s bridge modules. Each was a `pub const NAMESPACE: &str = +XPort::NAMESPACE;` — a *string* copy of a per-port trait const. + +**Why they were dead, which is the interesting half.** The identical idiom is +ALIVE one crate over: `lance-graph-ontology`'s bridges hold the same +`pub const NAMESPACE` and clippy is silent, because each of those is a +hand-written bridge whose own `new()` calls `registry.namespace_id(NAMESPACE)`. +On the OGAR side the per-port bridges were collapsed into the generic +`UnifiedBridge` harness, which reads `P::NAMESPACE` off the trait — +so the module-level copy lost its only caller and nothing replaced it. The +doc-comments said the copies existed "so existing consumers that imported the +constant from this module keep building", but the modules are private (`mod +redmine_bridge;`, never `pub mod` — `git log -S` finds no such line in the +history) and `bridges/mod.rs` re-exports the `*Port` and `*Bridge` names without +them. **The compatibility shim was born unreachable, in the same PR that wrote +it.** + +**The ruling makes the deeper point.** Even if it had been reachable, a string +is the wrong currency. `ogar_vocab::ports` already carries the address, and the +mapping is exactly 1:1: + +| port | `NAMESPACE` (string) | `APP_PREFIX` = classview, lo u16 | +|---|---|---| +| OpenProject | "OpenProject" | `0x0001` | +| Odoo | "Odoo" | `0x0002` | +| WoA | "WorkOrder" | `0x0003` | +| SMB | "SMB" | `0x0004` | +| Healthcare | "Healthcare" | `0x0005` | +| Redmine | "Redmine" | `0x0007` | +| OpenStreetMap | "OpenStreetMap" | `0x0008` | +| WeatherNext | "WeatherNext" | `0x0009` | + +`render_classid = (concept as u32) << 16 | APP_PREFIX`. The namespace is not a +label that sits *beside* the address — it IS a register of the address. A +string namespace is a second spelling of something the classid already says, +and a second spelling is a drift surface. + +**Three layers, oldest first, so a future session can date what it is looking +at:** + +1. **String namespace + `NamespaceRegistry::namespace_id(&str)`** — the oldest. + A name, resolved at runtime through a registry lookup. +2. **`PortSpec` lockstep** (`NAMESPACE` + `BRIDGE_ID` + alias table per port, + `UnifiedBridge

` parameterised over it) — deprecated. It removed the + per-port bridge boilerplate but kept the string as the join key. +3. **`hotplug`** (`lance_graph_contract::hotplug`) — current. Its own module doc + states the invariant: *"The classid is the join key on BOTH sides."* A + consumer declares one `HotPlug` const listing `classids: &[u16]`; the + authority resolves them to vocab rows and capabilities and bangs on drift. + No strings, no registry lookup, no per-consumer plug crate. + +**This is not aspirational.** `lance-graph-ogar` ALREADY implements the +authority half — `impl CapabilityAuthority for OgarAuthority` sits in the same +crate's `lib.rs`, next to the `UnifiedBridge` surface that still resolves by +string. The successor and the legacy are neighbours in one crate. + +**Done here:** the six dead string mirrors are removed, and the three tests that +referenced one now use the trait const (`RedminePort::NAMESPACE`) rather than a +module-local copy — the mirror goes, the value stays reachable by the public +path consumers are already directed to. + +**Named, NOT done here:** migrating `UnifiedBridge` itself onto +`hotplug`. That is the operator's stated direction and it retires layers 1 and 2 +together. It is an API change on a surface that already carries `#[deprecated]` +(`docs/CONSUMER-BRIDGE-DEPRECATION.md`), so it wants its own plan, not a +drive-by from a consumer's CI. + +**Second instance of the same meta-finding this week.** Like +`E-THE-AARCH64-PATH-HAD-NEVER-BEEN-COMPILED-1`, this was found because a +consumer compiled code the owning repo's CI does not: `lance-graph-ogar` is in +this workspace's `exclude` list, so `cargo clippy --workspace` never builds it. +Un-gating one downstream suite has now produced two defects in code that was +never compiled by the repo that owns it. + +--- + ## 2026-09-05 — E-A-SWEEP-IS-COMPLETE-ONLY-WITHIN-THE-TARGET-KINDS-ITS-GATE-COMPILES-1 — #1194 swept the whole 1.98 delta and still left two sites, because "whole" was measured through six clippy steps **Status:** FINDING (measured on the pinned 1.98.1: `--tests` = 9 findings, `--all-targets` = 11; the two extra are in an example no CI step compiles). **Confidence:** High — both numbers come from running the two commands back to back on the same tree; the two extra sites are the same lint, in the same release, as the ten #1194 fixed. diff --git a/crates/lance-graph-ogar/src/bridges/medcare_bridge.rs b/crates/lance-graph-ogar/src/bridges/medcare_bridge.rs index 64a71f113..014aa43c9 100644 --- a/crates/lance-graph-ogar/src/bridges/medcare_bridge.rs +++ b/crates/lance-graph-ogar/src/bridges/medcare_bridge.rs @@ -32,7 +32,6 @@ use crate::bridges::unified::UnifiedBridge; // items — the trait must be in scope for the resolution to work (codex // P1 on PR #570). Same import in the test module below. pub use ogar_vocab::ports::HealthcarePort; -use ogar_vocab::ports::PortSpec; /// MedCare `NamespaceBridge` — alias over the generic harness, locked to /// the `Healthcare` namespace via [`HealthcarePort`]. @@ -45,10 +44,6 @@ use ogar_vocab::ports::PortSpec; )] pub type MedcareBridge = UnifiedBridge; -/// Canonical namespace name for MedCare / Healthcare. Mirrors -/// `HealthcarePort::NAMESPACE` so existing consumers that imported the -/// constant from this module keep building. -pub const NAMESPACE: &str = HealthcarePort::NAMESPACE; #[cfg(test)] #[allow(deprecated)] // exercises the deprecated bridge alias on purpose @@ -129,7 +124,7 @@ ogit.Healthcare:Patient #[test] fn g_lock_matches_registry_namespace_id() { let registry = registry_with_healthcare(); - let expected = registry.namespace_id(NAMESPACE).unwrap(); + let expected = registry.namespace_id(HealthcarePort::NAMESPACE).unwrap(); let bridge = MedcareBridge::new(registry).unwrap(); assert_eq!(bridge.g_lock(), expected); } diff --git a/crates/lance-graph-ogar/src/bridges/odoo_bridge.rs b/crates/lance-graph-ogar/src/bridges/odoo_bridge.rs index 6e125e842..7c1e3bd25 100644 --- a/crates/lance-graph-ogar/src/bridges/odoo_bridge.rs +++ b/crates/lance-graph-ogar/src/bridges/odoo_bridge.rs @@ -21,7 +21,6 @@ use crate::bridges::unified::UnifiedBridge; pub use ogar_vocab::ports::OdooPort; -use ogar_vocab::ports::PortSpec; /// Odoo `NamespaceBridge` — alias over the generic harness, locked to /// the `Odoo` namespace via [`OdooPort`]. @@ -34,8 +33,6 @@ use ogar_vocab::ports::PortSpec; )] pub type OdooBridge = UnifiedBridge; -/// Canonical namespace name for Odoo. Mirrors `OdooPort::NAMESPACE`. -pub const NAMESPACE: &str = OdooPort::NAMESPACE; #[cfg(test)] #[allow(deprecated)] // exercises the deprecated bridge alias on purpose diff --git a/crates/lance-graph-ogar/src/bridges/openproject_bridge.rs b/crates/lance-graph-ogar/src/bridges/openproject_bridge.rs index f7c3e5c1d..14f9b70e9 100644 --- a/crates/lance-graph-ogar/src/bridges/openproject_bridge.rs +++ b/crates/lance-graph-ogar/src/bridges/openproject_bridge.rs @@ -19,7 +19,6 @@ use crate::bridges::unified::UnifiedBridge; // associated items — the trait must be in scope for the resolution to // work (codex P1 on PR #570). Same import in the test module below. pub use ogar_vocab::ports::OpenProjectPort; -use ogar_vocab::ports::PortSpec; /// OpenProject `NamespaceBridge` — alias over the generic harness. /// @@ -32,10 +31,6 @@ use ogar_vocab::ports::PortSpec; )] pub type OpenProjectBridge = UnifiedBridge; -/// Canonical namespace name for OpenProject. Mirrors -/// `OpenProjectPort::NAMESPACE` so existing consumers that imported -/// the constant from this module keep building. -pub const NAMESPACE: &str = OpenProjectPort::NAMESPACE; /// Compatibility shim — re-exports `ogar_vocab::ports::OPENPROJECT_ALIASES` /// under the pre-migration name so consumers that imported the constant @@ -125,7 +120,7 @@ ogit.OpenProject:WorkPackage #[test] fn g_lock_matches_registry_namespace_id() { let registry = registry_with_openproject(); - let expected = registry.namespace_id(NAMESPACE).unwrap(); + let expected = registry.namespace_id(OpenProjectPort::NAMESPACE).unwrap(); let bridge = OpenProjectBridge::new(registry).unwrap(); assert_eq!(bridge.g_lock(), expected); } diff --git a/crates/lance-graph-ogar/src/bridges/redmine_bridge.rs b/crates/lance-graph-ogar/src/bridges/redmine_bridge.rs index e4ae957d0..71f9a072b 100644 --- a/crates/lance-graph-ogar/src/bridges/redmine_bridge.rs +++ b/crates/lance-graph-ogar/src/bridges/redmine_bridge.rs @@ -13,7 +13,6 @@ use crate::bridges::unified::UnifiedBridge; // `RedminePort::NAMESPACE` / `::aliases()` are `PortSpec` associated // items — the trait must be in scope for the resolution to work // (codex P1 on PR #570). -use ogar_vocab::ports::PortSpec; pub use ogar_vocab::ports::RedminePort; /// Redmine `NamespaceBridge` — alias over the generic harness. @@ -26,10 +25,6 @@ pub use ogar_vocab::ports::RedminePort; )] pub type RedmineBridge = UnifiedBridge; -/// Canonical namespace name for Redmine. Mirrors `RedminePort::NAMESPACE` -/// so existing consumers that imported the constant from this module -/// keep building. -pub const NAMESPACE: &str = RedminePort::NAMESPACE; /// Compatibility shim — re-exports `ogar_vocab::ports::REDMINE_ALIASES` /// under the pre-migration name (codex P2 on PR #570). New code should @@ -108,7 +103,7 @@ ogit.Redmine:Issue #[test] fn g_lock_matches_registry_namespace_id() { let registry = registry_with_redmine(); - let expected = registry.namespace_id(NAMESPACE).unwrap(); + let expected = registry.namespace_id(RedminePort::NAMESPACE).unwrap(); let bridge = RedmineBridge::new(registry).unwrap(); assert_eq!(bridge.g_lock(), expected); } diff --git a/crates/lance-graph-ogar/src/bridges/smb_bridge.rs b/crates/lance-graph-ogar/src/bridges/smb_bridge.rs index c9d726be7..673b8be7d 100644 --- a/crates/lance-graph-ogar/src/bridges/smb_bridge.rs +++ b/crates/lance-graph-ogar/src/bridges/smb_bridge.rs @@ -19,7 +19,6 @@ //! `ogar_vocab::ports::tests::time_entry_converges_across_planner_and_erp_ports`. use crate::bridges::unified::UnifiedBridge; -use ogar_vocab::ports::PortSpec; pub use ogar_vocab::ports::SmbPort; /// SMB `NamespaceBridge` — alias over the generic harness, locked to @@ -33,8 +32,6 @@ pub use ogar_vocab::ports::SmbPort; )] pub type SmbBridge = UnifiedBridge; -/// Canonical namespace name for SMB. Mirrors `SmbPort::NAMESPACE`. -pub const NAMESPACE: &str = SmbPort::NAMESPACE; #[cfg(test)] #[allow(deprecated)] // exercises the deprecated bridge alias on purpose diff --git a/crates/lance-graph-ogar/src/bridges/woa_bridge.rs b/crates/lance-graph-ogar/src/bridges/woa_bridge.rs index bef4fd34c..ecb8c56f4 100644 --- a/crates/lance-graph-ogar/src/bridges/woa_bridge.rs +++ b/crates/lance-graph-ogar/src/bridges/woa_bridge.rs @@ -26,7 +26,6 @@ use crate::bridges::unified::UnifiedBridge; // `WoaPort::NAMESPACE` / `::aliases()` are `PortSpec` associated items — // the trait must be in scope for the resolution to work (same codex P1 // fix as MedcareBridge). -use ogar_vocab::ports::PortSpec; pub use ogar_vocab::ports::WoaPort; /// WoA `NamespaceBridge` — alias over the generic harness, locked to @@ -40,8 +39,6 @@ pub use ogar_vocab::ports::WoaPort; )] pub type WoaBridge = UnifiedBridge; -/// Canonical namespace name for WoA. Mirrors `WoaPort::NAMESPACE`. -pub const NAMESPACE: &str = WoaPort::NAMESPACE; #[cfg(test)] #[allow(deprecated)] // exercises the deprecated bridge alias on purpose From a8477f42f2dc2d6b5874b095d96c191ebc8fdd58 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 10:51:45 +0000 Subject: [PATCH 2/3] =?UTF-8?q?board:=20correct=20my=20own=20entry=20?= =?UTF-8?q?=E2=80=94=20I=20dated=20no=20source,=20and=20the=20"migration"?= =?UTF-8?q?=20I=20proposed=20shipped=20in=20July?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator correction. The entry this replaces (same day, superseded before it merged) built a "three layers, oldest first" taxonomy out of source-file doc comments, declared `hotplug` the current layer, and proposed migrating `UnifiedBridge` onto it as future work "wanting its own plan". Dating the sources shows every step of that was drift: bridges/mod.rs doc comments PR #844, pre-July deprecated docs/CONSUMER-BRIDGE-DEPRECATION.md OGAR#95 era deprecated hotplug.rs module doc 2026-07-07 July -> deprecated hotplug-consumer-migration.md "Shipped 2026-07-07" July -> deprecated E-HOTPLUG-MIGRATION-1 2026-07-07 July -> deprecated The migration I proposed was operator-ruled and shipped 2026-07-07 (OGAR #174/#175, lance-graph #658, tesseract-rs #13/#14 as the template consumer), with C# and Python mirrors already generated in ogar-adapter-{csharp,python} and a MANDATORY knowledge doc carrying a five-step recipe. I proposed planning something that had a plan, was ruled, and was in production. And the correction does not stop there: under the operator's dating rule ("July or older is automatically deprecated") hotplug is itself a July source. The current canon is E-EVERYTHING-WIRES-TO-SOA-V3-CE64-IS-ALU-LEGACY-1 (2026-09-05, operator) with E-PLANNING-MIGRATES-TO-LOCO-R2IL-... the same day. A taxonomy terminating at hotplug is two months stale on its own top rung. The rule, stated mechanically: date the source before citing it as current. A doc comment carries no date — it is evidence of what someone believed when they wrote it, and `git log -S` is how you get the date. The board is ordered newest-first for exactly this reason, and I read the middle of a source file instead of the top of the board. The accompanying code change is unaffected and stands on the 2026-09-06 ruling alone ("it should always be classid, which is the namespace"). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V --- .claude/board/EPIPHANIES.md | 146 ++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 81 deletions(-) diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 93352b129..9999da488 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,88 +1,72 @@ -## 2026-09-06 — E-THE-CLASSID-IS-THE-NAMESPACE-1 — a string namespace is the oldest layer, and the lockstep above it is already deprecated +## 2026-09-06 — E-DATE-YOUR-SOURCE-BEFORE-YOU-CALL-IT-CANONICAL-1 — I proposed a migration that shipped two months ago, from doc comments older than that -**Status:** OPERATOR RULING, with the measured evidence that prompted it. -**Confidence:** High — the 1:1 table below is read straight out of -`ogar_vocab::ports`, and the dead-code finding was surfaced by a consumer's CI. +**Status:** OPERATOR CORRECTION of my own entry, plus the ruling that prompted +it. The first version of this entry (same id, same day, superseded before merge) +is the artefact being corrected. +**Confidence:** High — every date below is read off the source itself. **The ruling, in the operator's words:** *"It should always be classid, which is -the namespace."* And, on the surface that still carries a string one: *"the old -lockstep is deprecated, namespace might be even older."* - -**What surfaced it.** q2's test suite was un-gated (`AdaWorldAPI/q2#146`) and -its clippy gate failed on six `error: constant NAMESPACE is never used` in -`lance-graph-ogar`'s bridge modules. Each was a `pub const NAMESPACE: &str = -XPort::NAMESPACE;` — a *string* copy of a per-port trait const. - -**Why they were dead, which is the interesting half.** The identical idiom is -ALIVE one crate over: `lance-graph-ontology`'s bridges hold the same -`pub const NAMESPACE` and clippy is silent, because each of those is a -hand-written bridge whose own `new()` calls `registry.namespace_id(NAMESPACE)`. -On the OGAR side the per-port bridges were collapsed into the generic -`UnifiedBridge` harness, which reads `P::NAMESPACE` off the trait — -so the module-level copy lost its only caller and nothing replaced it. The -doc-comments said the copies existed "so existing consumers that imported the -constant from this module keep building", but the modules are private (`mod -redmine_bridge;`, never `pub mod` — `git log -S` finds no such line in the -history) and `bridges/mod.rs` re-exports the `*Port` and `*Bridge` names without -them. **The compatibility shim was born unreachable, in the same PR that wrote -it.** - -**The ruling makes the deeper point.** Even if it had been reachable, a string -is the wrong currency. `ogar_vocab::ports` already carries the address, and the -mapping is exactly 1:1: - -| port | `NAMESPACE` (string) | `APP_PREFIX` = classview, lo u16 | +the namespace"*, *"the old lockstep is deprecated, namespace might be even +older"*, and the process rule that makes the rest of it checkable: **"First +determine the age of your source. July or older is automatically deprecated."** + +**What I did wrong.** I read source-file doc comments and a design doc, built a +"three layers, oldest first" taxonomy out of them, declared `hotplug` the +current layer, and then proposed migrating `UnifiedBridge` onto it +as future work "wanting its own plan". Dating the sources shows every step of +that was drift: + +| source I treated as canonical | its own date | status | |---|---|---| -| OpenProject | "OpenProject" | `0x0001` | -| Odoo | "Odoo" | `0x0002` | -| WoA | "WorkOrder" | `0x0003` | -| SMB | "SMB" | `0x0004` | -| Healthcare | "Healthcare" | `0x0005` | -| Redmine | "Redmine" | `0x0007` | -| OpenStreetMap | "OpenStreetMap" | `0x0008` | -| WeatherNext | "WeatherNext" | `0x0009` | - -`render_classid = (concept as u32) << 16 | APP_PREFIX`. The namespace is not a -label that sits *beside* the address — it IS a register of the address. A -string namespace is a second spelling of something the classid already says, -and a second spelling is a drift surface. - -**Three layers, oldest first, so a future session can date what it is looking -at:** - -1. **String namespace + `NamespaceRegistry::namespace_id(&str)`** — the oldest. - A name, resolved at runtime through a registry lookup. -2. **`PortSpec` lockstep** (`NAMESPACE` + `BRIDGE_ID` + alias table per port, - `UnifiedBridge

` parameterised over it) — deprecated. It removed the - per-port bridge boilerplate but kept the string as the join key. -3. **`hotplug`** (`lance_graph_contract::hotplug`) — current. Its own module doc - states the invariant: *"The classid is the join key on BOTH sides."* A - consumer declares one `HotPlug` const listing `classids: &[u16]`; the - authority resolves them to vocab rows and capabilities and bangs on drift. - No strings, no registry lookup, no per-consumer plug crate. - -**This is not aspirational.** `lance-graph-ogar` ALREADY implements the -authority half — `impl CapabilityAuthority for OgarAuthority` sits in the same -crate's `lib.rs`, next to the `UnifiedBridge` surface that still resolves by -string. The successor and the legacy are neighbours in one crate. - -**Done here:** the six dead string mirrors are removed, and the three tests that -referenced one now use the trait const (`RedminePort::NAMESPACE`) rather than a -module-local copy — the mirror goes, the value stays reachable by the public -path consumers are already directed to. - -**Named, NOT done here:** migrating `UnifiedBridge` itself onto -`hotplug`. That is the operator's stated direction and it retires layers 1 and 2 -together. It is an API change on a surface that already carries `#[deprecated]` -(`docs/CONSUMER-BRIDGE-DEPRECATION.md`), so it wants its own plan, not a -drive-by from a consumer's CI. - -**Second instance of the same meta-finding this week.** Like -`E-THE-AARCH64-PATH-HAD-NEVER-BEEN-COMPILED-1`, this was found because a -consumer compiled code the owning repo's CI does not: `lance-graph-ogar` is in -this workspace's `exclude` list, so `cargo clippy --workspace` never builds it. -Un-gating one downstream suite has now produced two defects in code that was -never compiled by the repo that owns it. +| `bridges/mod.rs` doc comments | PR #844, pre-July | deprecated | +| `docs/CONSUMER-BRIDGE-DEPRECATION.md` | OGAR#95 era, pre-July | deprecated | +| `hotplug.rs` module doc | 2026-07-07 | **July — deprecated** | +| `.claude/knowledge/hotplug-consumer-migration.md` | "Shipped 2026-07-07" | **July — deprecated** | +| `E-HOTPLUG-MIGRATION-1` | 2026-07-07 | **July — deprecated** | + +So the "migration" I proposed was **operator-ruled and shipped on 2026-07-07** — +reference PRs OGAR #174/#175, lance-graph #658, tesseract-rs #13/#14 as the +template consumer — with C# and Python mirrors already generated in +`ogar-adapter-{csharp,python}`. It has a MANDATORY knowledge doc carrying a +five-step recipe. I proposed planning a thing that had a plan, was ruled, and +was in production, because I never asked how old my sources were. + +**And the correction does not stop at hotplug.** Under the dating rule hotplug +is itself a July source. The current, non-deprecated canon is +`E-EVERYTHING-WIRES-TO-SOA-V3-CE64-IS-ALU-LEGACY-1` (2026-09-05, operator, +verbatim: *"anything must be wired into SoA V3 substrate no exceptions except +the causaledge64 adjacent as ALU legacy substrat"*) — alongside +`E-PLANNING-MIGRATES-TO-LOCO-R2IL-DATAFUSION-IS-GRACE-PERIOD-1` (same day). A +taxonomy that terminates at hotplug is two months stale on its own top rung. + +**The rule, stated so it is mechanical rather than remembered.** Before citing +anything as current: **date it.** A doc comment carries no date, so it is +evidence of what someone believed when they wrote it, never of what is true now +— its date is its commit's date, and `git log -S` is how you get it. The board +is ordered newest-first for exactly this reason; the top of `EPIPHANIES.md` is +the cheapest date check in the workspace, and I read the middle of a source file +instead. + +**Second-order:** this is the same failure as +`E-A-CORRECTION-IS-ONLY-AS-GOOD-AS-ITS-MERGE-1` one turn later — I nearly merged +a board entry asserting a stale architecture, which would have made the drift +citable by the next session. It is caught here only because the operator read it. + +**What this entry does NOT do.** It proposes no migration, no plan, and no +taxonomy. The `UnifiedBridge`/`PortSpec` surface's disposition is already ruled +elsewhere and is not mine to re-open from a consumer's CI failure. + +**The code change this entry accompanies is unaffected and stands on the +2026-09-06 ruling alone:** six `pub const NAMESPACE: &str` mirrors in +`lance-graph-ogar`'s bridge modules are removed. They were unreachable (private +modules, never `pub mod` in any commit) and they are a *string* spelling of an +address the classid already carries — `ogar_vocab::ports` pairs each +`NAMESPACE` 1:1 with an `APP_PREFIX` (OpenProject/`0x0001`, Odoo/`0x0002`, +WorkOrder/`0x0003`, SMB/`0x0004`, Healthcare/`0x0005`, Redmine/`0x0007`, +OpenStreetMap/`0x0008`, WeatherNext/`0x0009`), the lo-u16 classview slot of +`render_classid = (concept << 16) | APP_PREFIX`. The namespace is a register OF +the address, not a label beside it. Three tests now read the trait const +instead of a module-local copy. --- From d242e437e4d5ca830a25db0c30fefdab8c87b859 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 10:59:17 +0000 Subject: [PATCH 3/3] =?UTF-8?q?board:=20third=20correction=20=E2=80=94=20I?= =?UTF-8?q?=20cited=20the=20rightmost=20register=20and=20called=20it=20the?= =?UTF-8?q?=20address?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator: "0005 is old shit. New is Domain on the left side — if that's not implemented it's not the new." Measured, and the correction is substantive rather than editorial. The table I published as "the address the classid already carries" listed APP_PREFIX values (0x0001 OpenProject, 0x0002 Odoo, 0x0005 Healthcare, 0x0007 Redmine). Those are CLASSVIEW — the lo u16, the per-vendor render skin, the rightmost register of `0xDDCCVVVV` = domain : appid : classview. The leading register is the domain byte, and it is implemented: `ogar_vocab::ConceptDomain` carries 29 arms and `canonical_concept_domain(id) = id >> 8` — 0x01 ProjectMgmt, 0x02 Commerce, 0x09 Health, 0x0F Geo, 0x17 Blocks, plus the C-band 0xC0 JavaRuntime / 0xC1 Analytics / 0xC4 BinaryLifting reserved 2026-08-18. August: the newest source anywhere in this thread, and the one I never opened. The collision proves it on its own terms: 0x0005 is Healthcare's VENDOR SKIN, while Health's DOMAIN is 0x09. Same word, two registers, and I quoted the one carrying the least information. Worse, the "NAMESPACE <-> APP_PREFIX 1:1" pairing I drew as evidence FOR the ruling is itself the deprecated lockstep — a string paired with a vendor ordinal. I used the old thing as proof of the new one. Method fix, mechanical: date the source (`git log -S`); read the board top-down rather than a source file middle-out; and when citing a bit layout, name the REGISTER POSITION, never a bare value — a hex number alone cannot say whether it came from DD, CC or VVVV, which is exactly how 0x0005 got published as an address. The code change is unaffected: six dead `pub const NAMESPACE: &str` mirrors, unreachable since birth, zero consumers in lance-graph / OGAR / q2, five of six files last touched 2026-07-24 by the same PR #844 that created them. A string namespace belongs to the old lockstep — that is the whole reason, and it needs no prefix table. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V --- .claude/board/EPIPHANIES.md | 142 ++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 69 deletions(-) diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 9999da488..ad0c55ac5 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,72 +1,76 @@ -## 2026-09-06 — E-DATE-YOUR-SOURCE-BEFORE-YOU-CALL-IT-CANONICAL-1 — I proposed a migration that shipped two months ago, from doc comments older than that - -**Status:** OPERATOR CORRECTION of my own entry, plus the ruling that prompted -it. The first version of this entry (same id, same day, superseded before merge) -is the artefact being corrected. -**Confidence:** High — every date below is read off the source itself. - -**The ruling, in the operator's words:** *"It should always be classid, which is -the namespace"*, *"the old lockstep is deprecated, namespace might be even -older"*, and the process rule that makes the rest of it checkable: **"First -determine the age of your source. July or older is automatically deprecated."** - -**What I did wrong.** I read source-file doc comments and a design doc, built a -"three layers, oldest first" taxonomy out of them, declared `hotplug` the -current layer, and then proposed migrating `UnifiedBridge` onto it -as future work "wanting its own plan". Dating the sources shows every step of -that was drift: - -| source I treated as canonical | its own date | status | -|---|---|---| -| `bridges/mod.rs` doc comments | PR #844, pre-July | deprecated | -| `docs/CONSUMER-BRIDGE-DEPRECATION.md` | OGAR#95 era, pre-July | deprecated | -| `hotplug.rs` module doc | 2026-07-07 | **July — deprecated** | -| `.claude/knowledge/hotplug-consumer-migration.md` | "Shipped 2026-07-07" | **July — deprecated** | -| `E-HOTPLUG-MIGRATION-1` | 2026-07-07 | **July — deprecated** | - -So the "migration" I proposed was **operator-ruled and shipped on 2026-07-07** — -reference PRs OGAR #174/#175, lance-graph #658, tesseract-rs #13/#14 as the -template consumer — with C# and Python mirrors already generated in -`ogar-adapter-{csharp,python}`. It has a MANDATORY knowledge doc carrying a -five-step recipe. I proposed planning a thing that had a plan, was ruled, and -was in production, because I never asked how old my sources were. - -**And the correction does not stop at hotplug.** Under the dating rule hotplug -is itself a July source. The current, non-deprecated canon is -`E-EVERYTHING-WIRES-TO-SOA-V3-CE64-IS-ALU-LEGACY-1` (2026-09-05, operator, -verbatim: *"anything must be wired into SoA V3 substrate no exceptions except -the causaledge64 adjacent as ALU legacy substrat"*) — alongside -`E-PLANNING-MIGRATES-TO-LOCO-R2IL-DATAFUSION-IS-GRACE-PERIOD-1` (same day). A -taxonomy that terminates at hotplug is two months stale on its own top rung. - -**The rule, stated so it is mechanical rather than remembered.** Before citing -anything as current: **date it.** A doc comment carries no date, so it is -evidence of what someone believed when they wrote it, never of what is true now -— its date is its commit's date, and `git log -S` is how you get it. The board -is ordered newest-first for exactly this reason; the top of `EPIPHANIES.md` is -the cheapest date check in the workspace, and I read the middle of a source file -instead. - -**Second-order:** this is the same failure as -`E-A-CORRECTION-IS-ONLY-AS-GOOD-AS-ITS-MERGE-1` one turn later — I nearly merged -a board entry asserting a stale architecture, which would have made the drift -citable by the next session. It is caught here only because the operator read it. - -**What this entry does NOT do.** It proposes no migration, no plan, and no -taxonomy. The `UnifiedBridge`/`PortSpec` surface's disposition is already ruled -elsewhere and is not mine to re-open from a consumer's CI failure. - -**The code change this entry accompanies is unaffected and stands on the -2026-09-06 ruling alone:** six `pub const NAMESPACE: &str` mirrors in -`lance-graph-ogar`'s bridge modules are removed. They were unreachable (private -modules, never `pub mod` in any commit) and they are a *string* spelling of an -address the classid already carries — `ogar_vocab::ports` pairs each -`NAMESPACE` 1:1 with an `APP_PREFIX` (OpenProject/`0x0001`, Odoo/`0x0002`, -WorkOrder/`0x0003`, SMB/`0x0004`, Healthcare/`0x0005`, Redmine/`0x0007`, -OpenStreetMap/`0x0008`, WeatherNext/`0x0009`), the lo-u16 classview slot of -`render_classid = (concept << 16) | APP_PREFIX`. The namespace is a register OF -the address, not a label beside it. Three tests now read the trait const -instead of a module-local copy. +## 2026-09-06 — E-I-CITED-THE-RIGHTMOST-REGISTER-AND-CALLED-IT-THE-ADDRESS-1 — three corrections to one entry, each because I reasoned instead of measuring + +**Status:** OPERATOR CORRECTION ×3 of my own same-day entry, superseded before +merge. Recorded as one entry because the three are the same mistake at +increasing depth. +**Confidence:** High — every claim below is a `git log` date or a line read out +of `ogar-vocab`. + +**The rulings, in the operator's words:** *"It should always be classid, which +is the namespace"* · *"the old lockstep is deprecated, namespace might be even +older"* · *"First determine the age of your source. July or older is +automatically deprecated."* · *"0005 is old shit. New is Domain on the left +side — if that's not implemented it's not the new."* + +**Correction 1 — I dated nothing.** I built a "three layers" taxonomy out of +source-file doc comments, called `hotplug` current, and proposed migrating +`UnifiedBridge` onto it as future work. That migration was +operator-ruled and **shipped 2026-07-07** (OGAR #174/#175, lance-graph #658, +tesseract-rs #13/#14 as the template consumer; C# and Python mirrors already +generated). Every source I used was pre-August; a doc comment carries no date +at all. + +**Correction 2 — the top rung was stale too.** Under the dating rule `hotplug` +is itself July. The current canon is +`E-EVERYTHING-WIRES-TO-SOA-V3-CE64-IS-ALU-LEGACY-1` (2026-09-05, operator). + +**Correction 3 — the substantive one. I named the wrong register.** I published +this table and called it "the address the classid already carries": + +| port | `APP_PREFIX` | +|---|---| +| OpenProject | `0x0001` | +| Odoo | `0x0002` | +| Healthcare | `0x0005` | +| Redmine | `0x0007` | + +Those are **classview** values — the lo u16, the per-vendor render skin, the +RIGHTMOST register. The composed classid is `0xDDCCVVVV` = +`domain : appid : classview`, so the leading register is the **domain byte**, +and it is fully implemented: `ogar_vocab::ConceptDomain` with 29 arms and +`canonical_concept_domain(id) = id >> 8` — `0x01` ProjectMgmt, `0x02` Commerce, +`0x09` Health, `0x0F` Geo, `0x17` Blocks, and the C-band `0xC0` JavaRuntime / +`0xC1` Analytics / `0xC4` BinaryLifting (reserved 2026-08-18 — **August, the +newest source in this whole thread**). + +The collision proves the error on its own terms: **`0x0005` is Healthcare's +vendor skin; Health's domain is `0x09`.** Two registers, two numbers, one word +— and I quoted the one that carries the least. + +Worse, the "NAMESPACE ↔ APP_PREFIX 1:1" pairing I drew as evidence for the +ruling **is the deprecated lockstep** — a string paired with a vendor ordinal. +I used the old thing as proof of the new one. + +**The rule this leaves.** The domain byte's magnitude encodes ALTITUDE +(`0x00`–`0x0F` business ontology, `0x17` the substrate's own tier, `0xC0`+ the +foreign-host C-band), so the first nibble is a 16-way altitude selector — one +mask, no lookup, no value decode. A register that far left is not +interchangeable with one on the right, and "the classid is the address" is only +true read left-first. + +**Method, stated so it is mechanical.** Date the source (`git log -S`); read the +board top-down, not a source file middle-out; and when citing a bit layout, +name the register position, never just the value — a bare hex number cannot say +which of `DD`, `CC` or `VVVV` it came from, which is exactly how `0x0005` got +published as an address. + +**The code change this accompanies is unaffected.** Six `pub const NAMESPACE: +&str` mirrors in `lance-graph-ogar`'s bridge modules are removed: unreachable +since birth (private modules, never `pub mod` in any commit), zero consumers +anywhere in lance-graph / OGAR / q2, on a surface last touched 2026-07-24 for +five of the six files — by the same PR #844 that created them. A string +namespace belongs to the old lockstep; that is the whole reason, and it needs no +appeal to a prefix table. ---