Skip to content

Commit f10db15

Browse files
committed
contract: land OGAR #145 OSINT mirror rows — COUNT_FUSE 67==67 restored (ISS-OGAR-OSINT-MIRROR-PENDING)
The fuse fired exactly as the dependency contract intends: OGAR #145 (osint_system 0x0700 + osint_person 0x0701) reached OGAR main (c2755bc), taking ogar_vocab::class_ids::ALL to 67 while the contract mirror held 65 — error[E0080] in every consumer vendoring lance-graph-ogar (surfaced in medcare-rs's build during this session's gap sweep). Per the operator ruling (E-OGAR-LANCEGRAPH-MOVE-IN-PARALLEL: keep the fuse, never pin), this applies the READY PATCH from the issue: - ogar_codebook::CODEBOOK: +2 OSINT rows (65 -> 67). The (O::Osint, C::Osint) domains_agree arm was already present. - Cargo.lock: ogar pin -> c2755bc. (The standalone crates/lance-graph-ogar/Cargo.lock is gitignored; updated locally for the test run.) - One extra finding: OGAR minted osint_system = 0x0700 with a ZERO concept slot (the domain root doubling as the system concept, cf. CLASSID_OSINT_V3). That tripped the mirror's local CC != 0 lint. Per 'wrappers adapt to the canon, never the reverse', the test now carries a documented SHIPPED_ROOT_SLOT_CONCEPTS = [0x0700] carve-out while keeping the blanket lint so an accidental root-slot mint still trips. - ISSUES.md: ISS-OGAR-OSINT-MIRROR-PENDING Status -> RESOLVED. Verified: cargo test -p lance-graph-contract --lib ogar_codebook (8 passed) + cargo test --manifest-path crates/lance-graph-ogar (81 passed across binaries, 0 failed — COUNT_FUSE + parity green).
1 parent 9921ff2 commit f10db15

3 files changed

Lines changed: 31 additions & 16 deletions

File tree

.claude/board/ISSUES.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ Option B resolves it without deleting the idea or moving any id.
109109

110110
## 2026-07-01 — ISS-OGAR-OSINT-MIRROR-PENDING — OGAR #145's OSINT mint (+2 to `class_ids::ALL`) breaks the contract-mirror `COUNT_FUSE` on merge; the paired lance-graph mirror rows must land in the same arc
111111

112-
**Status:** OPEN (tracked) · **Resolution path RULED by operator 2026-07-01: keep the fuse (it IS the dependency contract enforcing OGAR↔lance-graph parallel movement); do NOT pin to a rev — "option 1" is REJECTED. Land the 2 mirror rows + `domains_agree` arm in parallel with OGAR #145 (option 2 / coordinated merge; brief transient red is acceptable — "the fuse is okay for now"). See `E-OGAR-LANCEGRAPH-MOVE-IN-PARALLEL`.** · Owner: OGAR `ogar-vocab` (PR #145) + `lance-graph-contract::ogar_codebook` mirror + `lance-graph-ogar::parity::domains_agree`. Surfaced 2026-07-01 while self-reviewing PR #624 / #145. Same cross-repo-arc shape as `ISS-OGAR-AUTH-MIRROR-DRIFT` (which took medcare CI red) and `ISS-OGAR-GENETICS-MIRROR-PENDING`; cited by `E-CODEBOOK-MINT-IS-A-CROSS-REPO-ARC`.
112+
**Status:** RESOLVED 2026-07-01 (PR #625 branch). OGAR #145 reached OGAR main (`c2755bc`, ALL = 67) and the fuse fired exactly as designed — `error[E0080]` surfaced in medcare-rs's vendored build during this session's gap sweep. The READY PATCH was applied: 2 osint rows added to `mirror::CODEBOOK` (65 → 67); the `(O::Osint, C::Osint)` `domains_agree` arm was **already present** (only the rows were missing); lance-graph `Cargo.lock` ogar pin bumped `597ecb1 → c2755bc`; consumer side medcare-rs pin bumped `a3574bd → c2755bc` in the same arc. One extra finding: OGAR minted `osint_system = 0x0700` with a **zero concept slot** (the domain root doubling as the system concept), which tripped the mirror's local `CC != 0` lint — per "wrappers adapt to the canon" the test now carries a documented `SHIPPED_ROOT_SLOT_CONCEPTS = [0x0700]` carve-out while keeping the blanket lint for accidental root-slot mints. Merge-ordering question moot (option 2 happened; brief transient red between #145's merge and this patch). Original ruling preserved: **keep the fuse; do NOT pin to a rev.** · Owner: OGAR `ogar-vocab` (PR #145) + `lance-graph-contract::ogar_codebook` mirror + `lance-graph-ogar::parity::domains_agree`. Surfaced 2026-07-01 while self-reviewing PR #624 / #145. Same cross-repo-arc shape as `ISS-OGAR-AUTH-MIRROR-DRIFT` (which took medcare CI red) and `ISS-OGAR-GENETICS-MIRROR-PENDING`; cited by `E-CODEBOOK-MINT-IS-A-CROSS-REPO-ARC`.
113113

114114
**READY PATCH (apply to lance-graph the moment OGAR #145 is on OGAR main; NOT to #624 while OGAR main is still 65 — that breaks #624's own fuse):** in `crates/lance-graph-contract/src/ogar_codebook.rs` add the two rows `("osint_system", 0x0700), ("osint_person", 0x0701)` to `mirror::CODEBOOK` (65 → 67); add the `(O::Osint, C::Osint)` arm to `lance-graph-ogar::parity::domains_agree` (the `ConceptDomain::Osint` enum + `0x07 => Osint` route already exist). Then `mirror::CODEBOOK.len() == ogar_vocab::class_ids::ALL.len()` (67 == 67) restored.
115115

Cargo.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/lance-graph-contract/src/ogar_codebook.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,11 @@ pub const fn classid_concept(classid: u32) -> u16 {
275275

276276
/// The curated `(canonical_concept, u16)` codebook — wire-compatible mirror of
277277
/// OGAR `ogar_vocab::CODEBOOK`. Ids are stable forever (once shipped, never
278-
/// re-assigned); domain-encoded `0xDDCC`. Carries the two domains the contract
279-
/// graph surfaces realize today (project-mgmt `0x01XX`, commerce/ERP `0x02XX`);
280-
/// OSINT (`0x07XX`) and Health/anatomy (`0x09XX`) are represented by their
281-
/// [`NodeGuid`](crate::NodeGuid) classid roots, not yet by promoted concept slots here. Drift is
282-
/// guarded by [`tests::codebook_ids_match_ogar_vocab`].
278+
/// re-assigned); domain-encoded `0xDDCC`. Carries every promoted OGAR domain,
279+
/// including OSINT (`0x07XX`, promoted OGAR #145) and Health/anatomy
280+
/// (`0x09XX`/`0x0AXX`). Drift is guarded by
281+
/// [`tests::codebook_ids_match_ogar_vocab`] and the `lance-graph-ogar`
282+
/// `COUNT_FUSE` (the OGAR↔lance-graph dependency contract).
283283
pub const CODEBOOK: &[(&str, u16)] = &[
284284
// ── 0x01XX — project-mgmt domain (OpenProject ↔ Redmine) ──
285285
("project", 0x0101),
@@ -368,6 +368,9 @@ pub const CODEBOOK: &[(&str, u16)] = &[
368368
("action_handler", 0x0C07),
369369
("action_applicability", 0x0C08),
370370
("automation_trigger", 0x0C09),
371+
// ── 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence; OGAR #145) ──
372+
("osint_system", 0x0700),
373+
("osint_person", 0x0701),
371374
];
372375

373376
/// Resolve a **canonical-concept** string to its stable `u16` codebook id via
@@ -520,13 +523,25 @@ mod tests {
520523
fn codebook_has_no_duplicate_ids_or_zero_concept_slot() {
521524
// Every id non-zero in its concept slot (CC != 0x00 — root is reserved),
522525
// every id unique, and each id's domain matches its position.
526+
//
527+
// Shipped exception (OGAR is canon; ids are stable forever): OGAR #145
528+
// minted `osint_system = 0x0700` — the OSINT domain-root id doubling as
529+
// the system-profile concept (the profiled AI system IS the domain root
530+
// node; cf. `CLASSID_OSINT_V3`). OGAR's own invariant only forbids the
531+
// whole id being 0x0000, not CC == 0. The mirror follows canon: the
532+
// blanket CC != 0 lint stays for everything else so an *accidental*
533+
// root-slot mint still trips, and the exception list below is the
534+
// deliberate, reviewed carve-out.
535+
const SHIPPED_ROOT_SLOT_CONCEPTS: &[u16] = &[0x0700];
523536
let mut seen = std::collections::HashSet::new();
524537
for &(name, id) in CODEBOOK {
525-
assert_ne!(
526-
id & 0x00FF,
527-
0x00,
528-
"{name}: concept slot CC must be non-zero"
529-
);
538+
if !SHIPPED_ROOT_SLOT_CONCEPTS.contains(&id) {
539+
assert_ne!(
540+
id & 0x00FF,
541+
0x00,
542+
"{name}: concept slot CC must be non-zero"
543+
);
544+
}
530545
assert!(seen.insert(id), "{name}: duplicate id {id:#06x}");
531546
}
532547
}

0 commit comments

Comments
 (0)