Skip to content

lance-graph-ogar: drop six dead string-namespace mirrors — the classid is the namespace - #1202

Merged
AdaWorldAPI merged 3 commits into
mainfrom
claude/namespace-is-the-classid
Sep 6, 2026
Merged

lance-graph-ogar: drop six dead string-namespace mirrors — the classid is the namespace#1202
AdaWorldAPI merged 3 commits into
mainfrom
claude/namespace-is-the-classid

Conversation

@AdaWorldAPI

@AdaWorldAPI AdaWorldAPI commented Sep 6, 2026

Copy link
Copy Markdown
Owner

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.

This body has been corrected three times. Its first version proposed a migration that had already shipped (2026-07-07); its second still published APP_PREFIX values as "the address". Both were wrong. The audit trail is the board entry this PR adds, E-I-CITED-THE-RIGHTMOST-REGISTER-AND-CALLED-IT-THE-ADDRESS-1. The code change below never changed across all three.

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:

domain meaning
0x01 ProjectMgmt
0x02 Commerce
0x09 Health
0x0F Geo
0x17 Blocks (ogar-loco)
0xC0 / 0xC1 / 0xC4 C-band — JavaRuntime / Analytics / BinaryLifting (reserved 2026-08-18)

The 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_PREFIX values — 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: 0x0005 is Healthcare's vendor skin; Health's domain is 0x09.

What is being removed, and why

Six pub const NAMESPACE: &str = XPort::NAMESPACE; — one per bridge module:

error: constant `NAMESPACE` is never used      (×6)
error: could not compile `lance-graph-ogar` (lib) due to 6 previous errors

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

fact measurement
odoo/openproject/redmine/smb/woa bridge modules last touched 2026-07-24 — PR #844, the same commit that introduced these constants
medcare_bridge.rs 2026-08-03, docs-only
every impl PortSpec for *Port in OGAR ports.rs 2026-07-21
consumers of SmbBridge / OdooBridge / RedmineBridge nonegrep across lance-graph, OGAR and q2 finds no code outside lance-graph-ogar itself, only two doc-comment mentions
were the modules ever importable? nevergit log -S 'pub mod redmine_bridge' returns nothing, so the compat shim the doc-comments describe could not have worked on any commit

A dormant, July-dated surface with no callers.

The change

  • Removed the six constants and their doc-comments.
  • The three tests that used one now call the trait const (RedminePort::NAMESPACE etc.).
  • 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).

Verification

cargo clippy --manifest-path crates/lance-graph-ogar/Cargo.toml --all-targets  -> 0 errors
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 and pre-date this change (measured at HEAD before touching anything). They do not fail q2's gate, which applies -D warnings to rustc lints on dependencies, not clippy's doc lints.

How it was found

lance-graph-ogar is in this workspace's exclude list, so cargo clippy --workspace never 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

… 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
@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit 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.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Essentials

Run ID: 52cb905e-ad19-4ff4-a93d-fb97c3b8ecbe

📥 Commits

Reviewing files that changed from the base of the PR and between ef72487 and d242e43.

📒 Files selected for processing (7)
  • .claude/board/EPIPHANIES.md
  • crates/lance-graph-ogar/src/bridges/medcare_bridge.rs
  • crates/lance-graph-ogar/src/bridges/odoo_bridge.rs
  • crates/lance-graph-ogar/src/bridges/openproject_bridge.rs
  • crates/lance-graph-ogar/src/bridges/redmine_bridge.rs
  • crates/lance-graph-ogar/src/bridges/smb_bridge.rs
  • crates/lance-graph-ogar/src/bridges/woa_bridge.rs

Comment @coderabbitai help to get the list of available commands.

@cursor

cursor Bot commented Sep 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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
@AdaWorldAPI AdaWorldAPI changed the title lance-graph-ogar: drop the six string-namespace mirrors — the classid is the namespace lance-graph-ogar: drop six dead string-namespace mirrors — the classid is the namespace Sep 6, 2026
…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
@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review September 6, 2026 11:50
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@cursor

cursor Bot commented Sep 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@AdaWorldAPI
AdaWorldAPI merged commit aba3672 into main Sep 6, 2026
11 checks passed
AdaWorldAPI pushed a commit that referenced this pull request Sep 6, 2026
#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
AdaWorldAPI added a commit that referenced this pull request Sep 6, 2026
lance-graph-ogar: rustfmt the six bridge files — #1202 left a stray blank line in each
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants