Skip to content

Commit 6139c05

Browse files
committed
ogar-vocab: OSINT contributes ZERO vocabulary rows — low byte is appid space, domain-wise (operator ruling)
Corrects PR #145's two hallucinated concept mints. The ruling: 0x07 is the OSINT domain; its low byte is allocated domain-wise as an APPID, not a concept slot. 0x0700 = the domain itself (low byte 00 = domain-wide); 0x0701 = OSINT-for-q2 (q2 = appid 0x01, the consumer); V3 form 0x1000_0701. 'OSINT Person was a hallucination' - there is no OSINT concept vocabulary at all. Removed: CODEBOOK rows osint_system@0x0700 + osint_person@0x0701, class_ids consts + ALL pairs, canonical_concept resolver arms, all_promoted_classes entries, the two Class builders, the class-view registry rows + imports, the round-trip test; domain-count test now asserts 0 with the ruling documented. The CODEBOOK 0x07XX section carries a guard note so no session re-mints. ConceptDomain::Osint and the 0x07 domain routing REMAIN (the domain exists; it just carries no names). Count effect: CODEBOOK/ALL 67 -> 65, balancing the lance-graph mirror COUNT_FUSE with zero mirror-side changes. Tests: ogar-vocab 95 green, ogar-class-view 11 green, fmt clean. Ledger: DISCOVERY-MAP D-OSINT-APPID-NOT-CONCEPT (same commit). Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c2755bc commit 6139c05

3 files changed

Lines changed: 106 additions & 153 deletions

File tree

crates/ogar-class-view/src/lib.rs

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,74 @@ use lance_graph_contract::{
6464
ontology::{DisplayTemplate, FieldRef, ObjectView},
6565
};
6666
use ogar_vocab::{
67+
Class,
68+
accounting_account,
6769
// 0x0CXX — automation (HIRO MARS CMDB + DO-arm actuators)
68-
action_applicability, Class,
69-
accounting_account, action_handler, anatomical_structure, auth_ory_keto, auth_store,
70-
auth_zanzibar, auth_zitadel, automation_trigger, billable_work_entry, billing_party, bone,
71-
canonical_concept_id, commercial_document, commercial_line_item, currency_policy, diagnosis,
72-
hr_department, hr_employee, hr_employment_contract, hr_job, joint, knowledge_item, lab_value,
73-
mars_application, mars_machine, mars_node_template, mars_resource, mars_software, medication,
74-
osint_person, osint_system, patient, payment_record, pricelist, pricelist_rule, priority,
75-
product, project, project_actor,
76-
project_attachment, project_changeset, project_comment, project_custom_field,
77-
project_custom_value, project_enabled_module, project_forum, project_journal,
78-
project_member_role, project_membership, project_message, project_news, project_query,
79-
project_relation, project_repository, project_role, project_status, project_type,
80-
project_version, project_watcher, project_wiki_page, project_work_item, skeleton, tax_policy,
81-
treatment, unit_of_measure, visit, vital_sign,
70+
action_applicability,
71+
action_handler,
72+
anatomical_structure,
73+
auth_ory_keto,
74+
auth_store,
75+
auth_zanzibar,
76+
auth_zitadel,
77+
automation_trigger,
78+
billable_work_entry,
79+
billing_party,
80+
bone,
81+
canonical_concept_id,
82+
commercial_document,
83+
commercial_line_item,
84+
currency_policy,
85+
diagnosis,
86+
hr_department,
87+
hr_employee,
88+
hr_employment_contract,
89+
hr_job,
90+
joint,
91+
knowledge_item,
92+
lab_value,
93+
mars_application,
94+
mars_machine,
95+
mars_node_template,
96+
mars_resource,
97+
mars_software,
98+
medication,
99+
patient,
100+
payment_record,
101+
pricelist,
102+
pricelist_rule,
103+
priority,
104+
product,
105+
project,
106+
project_actor,
107+
project_attachment,
108+
project_changeset,
109+
project_comment,
110+
project_custom_field,
111+
project_custom_value,
112+
project_enabled_module,
113+
project_forum,
114+
project_journal,
115+
project_member_role,
116+
project_membership,
117+
project_message,
118+
project_news,
119+
project_query,
120+
project_relation,
121+
project_repository,
122+
project_role,
123+
project_status,
124+
project_type,
125+
project_version,
126+
project_watcher,
127+
project_wiki_page,
128+
project_work_item,
129+
skeleton,
130+
tax_policy,
131+
treatment,
132+
unit_of_measure,
133+
visit,
134+
vital_sign,
82135
};
83136

84137
/// All promoted canonical concepts: `(canonical_concept_name, Class)`.
@@ -128,9 +181,6 @@ fn all_canonical_classes() -> Vec<(&'static str, Class)> {
128181
("pricelist", pricelist()),
129182
("pricelist_rule", pricelist_rule()),
130183
("unit_of_measure", unit_of_measure()),
131-
// ── 0x07XX — OSINT (AIRO/AIwar dual-use intelligence) ──
132-
("osint_system", osint_system()),
133-
("osint_person", osint_person()),
134184
// ── 0x09XX — health (OGIT Healthcare) ──
135185
("patient", patient()),
136186
("diagnosis", diagnosis()),

crates/ogar-vocab/src/lib.rs

Lines changed: 16 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,16 +1122,15 @@ const CODEBOOK: &[(&str, u16)] = &[
11221122
("pricelist", 0x0209),
11231123
("pricelist_rule", 0x020A),
11241124
("unit_of_measure", 0x020B),
1125-
// ── 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence) ──
1126-
// Minted from the q2 cockpit V3 SoA bake (`data/osint-v3/`, harvested from
1127-
// `AdaWorldAPI/aiwar-neo4j-harvest`). The low u16 is the FROZEN canonical
1128-
// concept (07xx is operator-ratified canonical; the slot is the owner's);
1129-
// the render-skin APP_PREFIX (`0x1000`, the V3 format signal) is the
1130-
// consumer's half (`classid = (APP_PREFIX << 16) | concept`). Two concepts:
1131-
// the AI-system card (GUID1, 12 AIRO dims) and the person card (GUID2, 5
1132-
// McClelland/Rubicon dims — the Epstein-archetype implicit-motive lens).
1133-
("osint_system", 0x0700),
1134-
("osint_person", 0x0701),
1125+
// ── 0x07XX — OSINT domain: ZERO vocabulary rows BY DESIGN (operator
1126+
// ruling 2026-07-02, corrects PR #145's two hallucinated concept mints
1127+
// `osint_system@0x0700` / `osint_person@0x0701`). Within the OSINT domain
1128+
// the low byte is NOT a concept slot — it is allocated domain-wise as an
1129+
// APPID: `0x0700` = the OSINT domain itself (low byte 00 = domain-wide),
1130+
// `0x0701` = OSINT-for-q2 (q2 is appid 0x01, the consumer); V3 form
1131+
// `0x1000_0701`. Class content (AIRO/VAIR system card, McClelland/Rubicon
1132+
// person lens) lives consumer-side in q2's `osint_classview.rs` — OGAR
1133+
// vocabulary carries no OSINT concept names. Do NOT re-mint rows here.
11351134
// ── 0x09XX — Health domain (clinical / patient / care) ──
11361135
// medcare-rs Healthcare-namespace promotion (Northstar T9). The 7
11371136
// entities the OGIT `NTO/Healthcare/entities/` TTL ships, projected
@@ -1652,14 +1651,9 @@ pub mod class_ids {
16521651
/// (`ogit.Automation:Trigger`).
16531652
pub const AUTOMATION_TRIGGER: u16 = 0x0C09;
16541653

1655-
// ── 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence) ──
1656-
1657-
/// `osint_system` (`0x0700`) — AI system profiled on the 12 AIRO/VAIR
1658-
/// dual-use dims (V3 SoA GUID1 `6×(8:8)` tier cascade).
1659-
pub const OSINT_SYSTEM: u16 = 0x0700;
1660-
/// `osint_person` (`0x0701`) — person profiled on McClelland motive +
1661-
/// Rubicon stage (V3 SoA GUID2; the Epstein-archetype implicit-motive lens).
1662-
pub const OSINT_PERSON: u16 = 0x0701;
1654+
// ── 0x07XX — OSINT domain: no concept constants (low byte = APPID,
1655+
// domain-wise; q2 = 0x01 → `0x0701` is OSINT-for-q2, not a concept —
1656+
// operator ruling 2026-07-02; see the CODEBOOK section note). ──
16631657

16641658
/// Every `(canonical_concept_name, id)` pair the constants vouch for.
16651659
/// Drift-guarded against [`super::CODEBOOK`] by tests in this module.
@@ -1704,8 +1698,6 @@ pub mod class_ids {
17041698
("pricelist_rule", PRICELIST_RULE),
17051699
("unit_of_measure", UNIT_OF_MEASURE),
17061700
// 0x07XX — OSINT (AIRO/AIwar dual-use intelligence)
1707-
("osint_system", OSINT_SYSTEM),
1708-
("osint_person", OSINT_PERSON),
17091701
// 0x09XX — health
17101702
("patient", PATIENT),
17111703
("diagnosis", DIAGNOSIS),
@@ -2465,18 +2457,6 @@ pub fn canonical_concept(name: &str) -> String {
24652457
) {
24662458
return "priority".to_string();
24672459
}
2468-
// OSINT domain (0x07XX) — the canonical class-name spellings must
2469-
// round-trip so ordinary PascalCase model-name inputs (`OsintSystem` /
2470-
// `OsintPerson`, the builders' `Class::new(...)` names) recover their
2471-
// codebook ids; without this arm they lexically land on `osintsystem` /
2472-
// `osintperson`, which are NOT in the codebook (`osint_system` /
2473-
// `osint_person` are). Codex P2 on PR #145, mirrors the PR #60 pattern.
2474-
if matches!(lower.as_str(), "osintsystem" | "osint_system") {
2475-
return "osint_system".to_string();
2476-
}
2477-
if matches!(lower.as_str(), "osintperson" | "osint_person") {
2478-
return "osint_person".to_string();
2479-
}
24802460
// ── Layer 2: lexical fallback ──
24812461
lexical_concept(name)
24822462
}
@@ -2611,8 +2591,6 @@ pub fn all_promoted_classes() -> Vec<Class> {
26112591
unit_of_measure(),
26122592
// 0x07XX — OSINT arm (AIRO/AIwar dual-use: system + person cards),
26132593
// in class_ids::ALL order.
2614-
osint_system(),
2615-
osint_person(),
26162594
// 0x09XX — health arm (7 OGIT Healthcare concepts), in
26172595
// class_ids::ALL order.
26182596
patient(),
@@ -3722,88 +3700,6 @@ pub fn treatment() -> Class {
37223700
c
37233701
}
37243702

3725-
// ─────────────────────────────────────────────────────────────────────
3726-
// 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence)
3727-
//
3728-
// Minted from the q2 cockpit V3 SoA bake (`data/osint-v3/`, harvested from
3729-
// `AdaWorldAPI/aiwar-neo4j-harvest`). Two concepts mirror the two GUIDs of a
3730-
// baked node: GUID1 (the AI system, 12 AIRO/VAIR dims) and GUID2 (the person,
3731-
// 5 McClelland/Rubicon dims). Field order IS the SoA tier order — the FieldMask
3732-
// bit basis. The low u16 is the frozen canonical concept; the render-skin
3733-
// APP_PREFIX (`0x1000`, a V3 format signal) is the consumer's half.
3734-
// ─────────────────────────────────────────────────────────────────────
3735-
3736-
/// OSINT **AI system** — the AIRO/AIwar dual-use system card (`osint_system`,
3737-
/// `0x0700`). The 12 dims the V3 SoA bake packs into GUID1's `6×(8:8)` tier
3738-
/// cascade: HEEL `current_status:type`, HIP `military_use:civic_use`,
3739-
/// TWIG `ml_task:ml_type`, LEAF `purpose:capacity`, family `output:impact`,
3740-
/// identity `stakeholder:airo_role`. Attribute declaration order IS the tier
3741-
/// order, so the lifted `ObjectView` FieldMask bit `i` == tier byte `i`. The
3742-
/// reasoning roles (Demand `offer⟷need`, Causality `intent⟷impact`) are a
3743-
/// consumer-side overlay on these names (see q2 `osint_classview.rs`).
3744-
#[must_use]
3745-
pub fn osint_system() -> Class {
3746-
let mut c = Class::new("OsintSystem");
3747-
c.language = Language::Unknown;
3748-
c.canonical_concept = Some("osint_system".to_string());
3749-
c.description =
3750-
Some("An AI system profiled on the AIRO/AIwar dual-use dimensions".to_string());
3751-
c.source_domain = Some("osint".to_string());
3752-
c.source_curator = Some("aiwar".to_string());
3753-
let mut attrs = Vec::with_capacity(12);
3754-
for name in [
3755-
"current_status", // HEEL.hi — state
3756-
"type", // HEEL.lo — identity
3757-
"military_use", // HIP.hi — dual-use need
3758-
"civic_use", // HIP.lo — dual-use need
3759-
"ml_task", // TWIG.hi — the task (need)
3760-
"ml_type", // TWIG.lo — the technique (offer)
3761-
"purpose", // LEAF.hi — intent (explicit)
3762-
"capacity", // LEAF.lo — offer
3763-
"output", // family.hi — offer
3764-
"impact", // family.lo — causality (implicit)
3765-
"stakeholder", // identity.hi — relation
3766-
"airo_role", // identity.lo — actor role (person)
3767-
] {
3768-
let mut a = Attribute::new(name);
3769-
a.type_name = Some("string".to_string());
3770-
attrs.push(a);
3771-
}
3772-
c.attributes = attrs;
3773-
c
3774-
}
3775-
3776-
/// OSINT **person** — the McClelland / Rubicon actor card (`osint_person`,
3777-
/// `0x0701`). The 5 dims the V3 SoA bake packs into GUID2: HEEL `stage:need`,
3778-
/// HIP `receptor:rubicon`, TWIG `motive`. This is the Epstein-archetype lens —
3779-
/// implicit motive (`nPow`/`nAch`/`nAff`) × Rubicon crossing × power receptor —
3780-
/// the Person side of the Person×Situation split (the system card carries the
3781-
/// Situation). Attribute order IS the GUID2 tier order (the FieldMask bit basis).
3782-
#[must_use]
3783-
pub fn osint_person() -> Class {
3784-
let mut c = Class::new("OsintPerson");
3785-
c.language = Language::Unknown;
3786-
c.canonical_concept = Some("osint_person".to_string());
3787-
c.description =
3788-
Some("A person profiled on McClelland motives and the Rubicon action stage".to_string());
3789-
c.source_domain = Some("osint".to_string());
3790-
c.source_curator = Some("aiwar".to_string());
3791-
let mut attrs = Vec::with_capacity(5);
3792-
for name in [
3793-
"stage", // HEEL.hi — Rubicon stage I..IV
3794-
"need", // HEEL.lo — McClelland nPow/nAch/nAff
3795-
"receptor", // HIP.hi — power receptor
3796-
"rubicon", // HIP.lo — Rubicon crossing
3797-
"motive", // TWIG.hi — dominant motive
3798-
] {
3799-
let mut a = Attribute::new(name);
3800-
a.type_name = Some("string".to_string());
3801-
attrs.push(a);
3802-
}
3803-
c.attributes = attrs;
3804-
c
3805-
}
3806-
38073703
/// Visit — a clinical encounter (OGIT `Visit`, `0x0906`). The temporal
38083704
/// container diagnoses / labs / treatments / vitals are recorded within.
38093705
#[must_use]
@@ -4258,24 +4154,6 @@ mod tests {
42584154
assert!(wire_synergies(&[a, b, c]).is_empty());
42594155
}
42604156

4261-
#[test]
4262-
fn canonical_concept_promotes_osint_classes_deterministically() {
4263-
// OSINT domain (0x07XX): the builders' PascalCase class names must
4264-
// round-trip to their codebook ids, like every other promoted class
4265-
// (codex P2 on PR #145). Without the resolver arm, `OsintSystem`
4266-
// lexically lands on `osintsystem`, which is NOT in the codebook.
4267-
assert_eq!(canonical_concept("OsintSystem"), "osint_system");
4268-
assert_eq!(canonical_concept("OsintPerson"), "osint_person");
4269-
assert_eq!(canonical_concept("osint_system"), "osint_system");
4270-
assert_eq!(canonical_concept("osint_person"), "osint_person");
4271-
// Full round-trip through the codebook resolver.
4272-
assert_eq!(ogar_codebook("OsintSystem"), Some(0x0700));
4273-
assert_eq!(ogar_codebook("OsintPerson"), Some(0x0701));
4274-
// The class builder's own `.name` resolves to its codebook id.
4275-
assert_eq!(ogar_codebook(&osint_system().name), Some(0x0700));
4276-
assert_eq!(ogar_codebook(&osint_person().name), Some(0x0701));
4277-
}
4278-
42794157
#[test]
42804158
fn canonical_concept_promotes_billable_work_entry_deterministically() {
42814159
// Promoted cross-domain invariant — OpenProject `TimeEntry` and
@@ -4967,8 +4845,10 @@ mod tests {
49674845
],
49684846
"Automation domain set drift — re-sync the consumer coverage gate",
49694847
);
4970-
// The OSINT domain carries the two AIRO/AIwar cards (system + person).
4971-
assert_eq!(concepts_in_domain(ConceptDomain::Osint).count(), 2);
4848+
// The OSINT domain carries ZERO vocabulary rows BY DESIGN (operator
4849+
// ruling 2026-07-02): its low byte is appid space (q2 = 0x01), not a
4850+
// concept slot — see the CODEBOOK 0x07XX section note.
4851+
assert_eq!(concepts_in_domain(ConceptDomain::Osint).count(), 0);
49724852
}
49734853

49744854
#[test]

docs/DISCOVERY-MAP.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,3 +587,26 @@ isolation. The map's job is to keep them visible.
587587
the ClassView from a manifest is fine ("compile types", not hot-path
588588
serde). Detail: `docs/APP-CLASS-CODEBOOK-LAYOUT.md` §3.5–3.7. `[H]`
589589
pending a hot-path no-serde probe across one render + one RAG path.
590+
591+
- **D-OSINT-APPID-NOT-CONCEPT (the OSINT low byte is appid space,
592+
domain-wise; 2026-07-02; [G], operator ruling):** PR #145's two OSINT
593+
codebook mints were hallucinations — "OSINT Person was a
594+
hallucination" (operator, verbatim). The corrected semantics: `0x07`
595+
is the OSINT **domain**; its low byte is allocated **domain-wise as
596+
an APPID**, not as concept vocabulary. `0x0700` = the domain itself
597+
(low byte `00` = domain-wide); `0x0701` = **OSINT-for-q2** (q2 is
598+
appid `0x01`, the consumer); V3 form `0x1000_0701`. Consequently the
599+
OSINT domain contributes **zero vocabulary rows**`osint_system` /
600+
`osint_person` removed from `CODEBOOK` / `class_ids::ALL` / the
601+
resolver / `all_promoted_classes` / the Class builders (this pass).
602+
Class *content* (AIRO/VAIR system card, McClelland/Rubicon person
603+
lens) is consumer-side — q2 `osint_classview.rs` — never OGAR
604+
vocabulary. Side effect: codebook count returns 67 → 65, balancing
605+
the lance-graph mirror COUNT_FUSE with zero mirror changes, and
606+
dissolving lance-graph `ISS-OSINT-SYSTEM-ROOT-SLOT-VIOLATION`
607+
(neither of its Options A/B — the ruling is sharper: no concept rows
608+
at all). Adjacent confirmations in the same ruling: FMA anatomy = own
609+
domain (`0x0A`), adjacent to but separate from Health (`0x09`),
610+
consumed by q2; CPIC likewise its own Genetics domain (`0x0E`) under
611+
q2. Do NOT re-mint OSINT concept rows; the codebook section carries
612+
the guard note.

0 commit comments

Comments
 (0)