lance-graph-ogar: drop six dead string-namespace mirrors — the classid is the namespace - #1202
Conversation
… is the namespace
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<P: PortSpec>` 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<P: PortSpec>` 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 ef72487 -> 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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V
|
Warning Review limit reachedNext included review available in 59 minutes. View limit detailsLimit details: You’ve used the included review currently available. Your 70 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (7)
Comment |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_3e889cff-3c79-4ce5-8eed-e9e46046b581) |
…I proposed shipped in July 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<P: PortSpec>` 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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V
…t the address 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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_df87e13f-f3c3-4f38-9ed8-b3938451d7ab) |
#1201 was opened as hygiene-only and its body says "the chain stops here". A second commit — the council SPEC v1 — was then pushed to the same open PR, so that sentence was true when written and false at merge. Under the hygiene rule's own terms a mixed PR gets an entry, which is why this one exists. The narrow lesson is worth more than the entry: a claim about a PR's SCOPE expires the moment another commit is pushed to it, and I never updated the body. Anyone reading #1201's description will be reading a description of a different PR than the one that merged. The entry also banks what the council's five savants returned, because it is the part a future session would otherwise re-derive: three of them independently rejected the audit's own premise (NodeGuid::new is the wrong unit — the exposure is the accessors and mint_for's undifferentiated V2/V3 arm), the G4 blocking set is exactly one site (witness_row.rs:200), and V3 has no mint arm of its own, so at the mint layer "everything is V3" is everything is V2 wearing V3's name. Two spec falsifications are recorded rather than quietly fixed: NodeGuid::new is reachable from weather-poc, a crate the inventory never named; and "Nobody walks anything" does not hold in code — GET /views/graph/wave.abi reaches inherited_part_of through four hops. The second is a VIOLATES against a FROZEN decision, so per the council harness it is escalated to the operator and the council is HELD at Phase 2. Nothing was implemented and no verdict reached. Amendment owed to draft v2, found post-merge in #1202: the operator's dating rule ("July or older is automatically deprecated") was not in SPEC v1's frozen set, and it demotes the prior-art leg — ISS-V1-TAIL-RESIDUE and E-V1-TAIL-FORBIDDEN-V3-IS-CONTENT-BLIND-1 are both 2026-07-04. The quad ratification (August) and the DN entry (September) survive it. Supersession index regenerated after the board writes; byte-identical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfrUJH3UNnv5NpDH4jDGHq
lance-graph-ogar: rustfmt the six bridge files — #1202 left a stray blank line in each
Operator ruling (2026-09-06): "It should always be classid, which is the namespace" — read left-first.
Unblocks the Linux half of
AdaWorldAPI/q2#146, whose newly un-gated clippy gate fails on exactly these six.The address is domain-led
The composed classid is
0xDDCCVVVV=domain : appid : classview. The leading register is the domain byte, and it is implemented —ogar_vocab::ConceptDomain, 29 arms,canonical_concept_domain(id) = id >> 8:0x010x020x090x0F0x17ogar-loco)0xC0/0xC1/0xC4The domain byte's magnitude encodes altitude, so the first nibble is a 16-way altitude selector: one mask separates substrate ontology from foreign host layer with no lookup and no value decode.
An earlier version of this body tabulated
APP_PREFIXvalues —0x0001,0x0002,0x0005,0x0007— and called them the address. Those are classview: the lo u16, the per-vendor render skin, the rightmost register. The collision makes the error concrete:0x0005is Healthcare's vendor skin; Health's domain is0x09.What is being removed, and why
Six
pub const NAMESPACE: &str = XPort::NAMESPACE;— one per bridge module:A string namespace paired with a vendor ordinal is the deprecated lockstep. That is the whole reason they go; no prefix table is needed to justify it, and the earlier version of this body that used one was citing the old scheme as evidence for the new.
Dates and consumers, measured
odoo/openproject/redmine/smb/woabridge modulesmedcare_bridge.rsimpl PortSpec for *Portin OGARports.rsSmbBridge/OdooBridge/RedmineBridgegrepacross lance-graph, OGAR and q2 finds no code outsidelance-graph-ogaritself, only two doc-comment mentionsgit log -S 'pub mod redmine_bridge'returns nothing, so the compat shim the doc-comments describe could not have worked on any commitA dormant, July-dated surface with no callers.
The change
RedminePort::NAMESPACEetc.).use ogar_vocab::ports::PortSpec;imports that existed only to resolve the deleted consts (each test module keeps its own).Verification
Four
clippy::doc_*warnings remain and pre-date this change (measured at HEAD before touching anything). They do not fail q2's gate, which applies-D warningsto rustc lints on dependencies, not clippy's doc lints.How it was found
lance-graph-ogaris in this workspace'sexcludelist, socargo clippy --workspacenever builds it; q2 does, through the[patch."…/OGAR"]wiring. Second defect this week in code the owning repo's CI never compiles — the first being#1200's aarch64 path,cfg-gated off every x86 machine.🤖 Generated with Claude Code
https://claude.ai/code/session_01AGVLyRZNEKKBSfBDJfbY3V