Skip to content

Commit c2755bc

Browse files
authored
Merge pull request #145 from AdaWorldAPI/claude/v3-substrate-migration-review-o0yoxv
OSINT substrate: mint 0x07XX domain + convergence roadmap ledger (P0–P5 green)
2 parents 8d70a56 + 441675a commit c2755bc

5 files changed

Lines changed: 449 additions & 3 deletions

File tree

.claude/board/EPIPHANIES.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77
88
---
99

10+
## 2026-07-01 — E-OSINT-SUBSTRATE-CONVERGES-PER-SOA — the massive cognitive stack converges into the V3 2+14 tenant SoA; the dedup IS the convergence
11+
12+
**Status:** FRAMING (`[G]` for the shipped crates + the tenant carve + the sole-writer canon E-CE64-MB-4; `[H]` for the convergence *program* — the deltas + baby-step probes P0–P8 are unrun). Operator-framed 2026-07-01 (*"massive codebase massive entropy … the V3 2+14 tenants converge the awareness massively per SoA"*).
13+
14+
The lance-graph cognitive stack (`causal-edge`, `thinking-engine`, planner `nars_engine`/`causal_distance`, `cognitive-shader-driver` MailboxSoA, `symbiont`, `arm-discovery`, the `elixir-template`+`template-runtime` reflex cluster, the `jc` pillars) is ~80% of an OSINT reasoning substrate already. The V3 **2+14 tenant node is the convergence vessel**: every awareness facet = one typed tenant column on one 512-B row (Meta / Qualia / MaterializedEdges=`CausalEdge64` / Fingerprint / Energy / Plasticity / EntityType / Kanban). Each duplicate type deleted (4× `CausalEdge64`, 4× `ThinkingStyle`, N× fingerprint/qualia) = one crate re-pointed at its tenant — **the dedup IS the convergence**. The sole-writer sandbox (SoA's own owner only; ractor single-`&mut self`; **E-CE64-MB-4**) is what makes it race-free by compile error.
15+
16+
- **One distance format:** `causal_distance` = Pearl-masked Σ of 3×256² palette = the same palette256 shared by `arm-discovery`'s oracle (ρ=0.9973), `deepnsm` (→6×8:8), and the V3 6×(8:8) GUID tiers. Keystone probe **P1** = distance identity across the three.
17+
- **Formal gate = `jc` pillars:** D-ARM-7 (`arm-discovery`→SpoStore) = Pillar 5 (`jirak.rs`, `I-NOISE-FLOOR-JIRAK`); Pearl masks = Pillar 5b (`pearl.rs`); the `syllogize` multi-hop chain = Pillars 6/9 (EWA-sandwich); ℓ²-fingerprint geometry = Pillars 7/8.
18+
- **OSINT deltas (small):** mint `0x0700`/`0x0701` (DONE) · dedup `thinking-engine` `CausalEdge64`→canonical · retarget `osint_bridge`→ClassView · register OGAR action bodies · `deepnsm`→6×(8:8) · gate SPO promotion on D-ARM-7.
19+
- **GoBD-clean:** no LLM on the hot path — rig/spider teach at learn-time → `cognitive-compiler` compiles an `ElixirTemplate``template-runtime` runs OGAR actions deterministically on the OSINT ClassView.
20+
21+
**Full map + convergence baby-step roadmap (P0–P8) + pillar gates:** `docs/OSINT-SUBSTRATE-REUSE-MAP.md`.
22+
23+
---
24+
1025
## 2026-06-30 — E-KEEP-AR-REMOVE-ORM — the consumer open-heart op KEEPS ActiveRecord and removes the ORM; OGAR is named after AR
1126

1227
**Status:** FRAMING (`[G]` for the name origin + the keep/remove split, operator-stated 2026-06-30; the convergence wiring it implies is `[H]`, gated per the OP assessment). Corrects a session inversion (mine) that read the consumer pivot as "castrate the hand-rolled Rails ActiveRecord betrayal" — **backwards**.

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ use ogar_vocab::{
7171
canonical_concept_id, commercial_document, commercial_line_item, currency_policy, diagnosis,
7272
hr_department, hr_employee, hr_employment_contract, hr_job, joint, knowledge_item, lab_value,
7373
mars_application, mars_machine, mars_node_template, mars_resource, mars_software, medication,
74-
patient, payment_record, pricelist, pricelist_rule, priority, product, project, project_actor,
74+
osint_person, osint_system, patient, payment_record, pricelist, pricelist_rule, priority,
75+
product, project, project_actor,
7576
project_attachment, project_changeset, project_comment, project_custom_field,
7677
project_custom_value, project_enabled_module, project_forum, project_journal,
7778
project_member_role, project_membership, project_message, project_news, project_query,
@@ -127,6 +128,9 @@ fn all_canonical_classes() -> Vec<(&'static str, Class)> {
127128
("pricelist", pricelist()),
128129
("pricelist_rule", pricelist_rule()),
129130
("unit_of_measure", unit_of_measure()),
131+
// ── 0x07XX — OSINT (AIRO/AIwar dual-use intelligence) ──
132+
("osint_system", osint_system()),
133+
("osint_person", osint_person()),
130134
// ── 0x09XX — health (OGIT Healthcare) ──
131135
("patient", patient()),
132136
("diagnosis", diagnosis()),

crates/ogar-vocab/src/lib.rs

Lines changed: 140 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,16 @@ 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),
11251135
// ── 0x09XX — Health domain (clinical / patient / care) ──
11261136
// medcare-rs Healthcare-namespace promotion (Northstar T9). The 7
11271137
// entities the OGIT `NTO/Healthcare/entities/` TTL ships, projected
@@ -1642,6 +1652,15 @@ pub mod class_ids {
16421652
/// (`ogit.Automation:Trigger`).
16431653
pub const AUTOMATION_TRIGGER: u16 = 0x0C09;
16441654

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;
1663+
16451664
/// Every `(canonical_concept_name, id)` pair the constants vouch for.
16461665
/// Drift-guarded against [`super::CODEBOOK`] by tests in this module.
16471666
pub const ALL: &[(&str, u16)] = &[
@@ -1684,6 +1703,9 @@ pub mod class_ids {
16841703
("pricelist", PRICELIST),
16851704
("pricelist_rule", PRICELIST_RULE),
16861705
("unit_of_measure", UNIT_OF_MEASURE),
1706+
// 0x07XX — OSINT (AIRO/AIwar dual-use intelligence)
1707+
("osint_system", OSINT_SYSTEM),
1708+
("osint_person", OSINT_PERSON),
16871709
// 0x09XX — health
16881710
("patient", PATIENT),
16891711
("diagnosis", DIAGNOSIS),
@@ -2443,6 +2465,18 @@ pub fn canonical_concept(name: &str) -> String {
24432465
) {
24442466
return "priority".to_string();
24452467
}
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+
}
24462480
// ── Layer 2: lexical fallback ──
24472481
lexical_concept(name)
24482482
}
@@ -2575,6 +2609,10 @@ pub fn all_promoted_classes() -> Vec<Class> {
25752609
pricelist(),
25762610
pricelist_rule(),
25772611
unit_of_measure(),
2612+
// 0x07XX — OSINT arm (AIRO/AIwar dual-use: system + person cards),
2613+
// in class_ids::ALL order.
2614+
osint_system(),
2615+
osint_person(),
25782616
// 0x09XX — health arm (7 OGIT Healthcare concepts), in
25792617
// class_ids::ALL order.
25802618
patient(),
@@ -3684,6 +3722,88 @@ pub fn treatment() -> Class {
36843722
c
36853723
}
36863724

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+
36873807
/// Visit — a clinical encounter (OGIT `Visit`, `0x0906`). The temporal
36883808
/// container diagnoses / labs / treatments / vitals are recorded within.
36893809
#[must_use]
@@ -4138,6 +4258,24 @@ mod tests {
41384258
assert!(wire_synergies(&[a, b, c]).is_empty());
41394259
}
41404260

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+
41414279
#[test]
41424280
fn canonical_concept_promotes_billable_work_entry_deterministically() {
41434281
// Promoted cross-domain invariant — OpenProject `TimeEntry` and
@@ -4829,8 +4967,8 @@ mod tests {
48294967
],
48304968
"Automation domain set drift — re-sync the consumer coverage gate",
48314969
);
4832-
// An empty (reserved-but-unpopulated) domain yields nothing.
4833-
assert_eq!(concepts_in_domain(ConceptDomain::Osint).count(), 0);
4970+
// The OSINT domain carries the two AIRO/AIwar cards (system + person).
4971+
assert_eq!(concepts_in_domain(ConceptDomain::Osint).count(), 2);
48344972
}
48354973

48364974
#[test]

0 commit comments

Comments
 (0)