Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .claude/board/EPIPHANIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@

---

## 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

**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"*).

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.

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

**Full map + convergence baby-step roadmap (P0–P8) + pillar gates:** `docs/OSINT-SUBSTRATE-REUSE-MAP.md`.

---

## 2026-06-30 — E-KEEP-AR-REMOVE-ORM — the consumer open-heart op KEEPS ActiveRecord and removes the ORM; OGAR is named after AR

**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**.
Expand Down
6 changes: 5 additions & 1 deletion crates/ogar-class-view/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ use ogar_vocab::{
canonical_concept_id, commercial_document, commercial_line_item, currency_policy, diagnosis,
hr_department, hr_employee, hr_employment_contract, hr_job, joint, knowledge_item, lab_value,
mars_application, mars_machine, mars_node_template, mars_resource, mars_software, medication,
patient, payment_record, pricelist, pricelist_rule, priority, product, project, project_actor,
osint_person, osint_system, patient, payment_record, pricelist, pricelist_rule, priority,
product, project, project_actor,
project_attachment, project_changeset, project_comment, project_custom_field,
project_custom_value, project_enabled_module, project_forum, project_journal,
project_member_role, project_membership, project_message, project_news, project_query,
Expand Down Expand Up @@ -127,6 +128,9 @@ fn all_canonical_classes() -> Vec<(&'static str, Class)> {
("pricelist", pricelist()),
("pricelist_rule", pricelist_rule()),
("unit_of_measure", unit_of_measure()),
// ── 0x07XX — OSINT (AIRO/AIwar dual-use intelligence) ──
("osint_system", osint_system()),
("osint_person", osint_person()),
// ── 0x09XX — health (OGIT Healthcare) ──
("patient", patient()),
("diagnosis", diagnosis()),
Expand Down
142 changes: 140 additions & 2 deletions crates/ogar-vocab/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1122,6 +1122,16 @@ const CODEBOOK: &[(&str, u16)] = &[
("pricelist", 0x0209),
("pricelist_rule", 0x020A),
("unit_of_measure", 0x020B),
// ── 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence) ──
// Minted from the q2 cockpit V3 SoA bake (`data/osint-v3/`, harvested from
// `AdaWorldAPI/aiwar-neo4j-harvest`). The low u16 is the FROZEN canonical
// concept (07xx is operator-ratified canonical; the slot is the owner's);
// the render-skin APP_PREFIX (`0x1000`, the V3 format signal) is the
// consumer's half (`classid = (APP_PREFIX << 16) | concept`). Two concepts:
// the AI-system card (GUID1, 12 AIRO dims) and the person card (GUID2, 5
// McClelland/Rubicon dims — the Epstein-archetype implicit-motive lens).
("osint_system", 0x0700),
("osint_person", 0x0701),
Comment on lines +1133 to +1134

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add OSINT aliases to the resolver

These new codebook rows are not matched by canonical_concept() (nor by source_domain_concept("osint")), so the normal producer path that sees PascalCase model names like the new builders' OsintSystem/OsintPerson still normalizes them to osintsystem/osintperson and fails to recover 0x0700/0x0701 unless the caller already supplies the exact snake_case concept. That makes the advertised OSINT concepts unreachable for ordinary model-name inputs, unlike the existing promoted classes whose canonical class names round-trip through ogar_codebook.

Useful? React with 👍 / 👎.

// ── 0x09XX — Health domain (clinical / patient / care) ──
// medcare-rs Healthcare-namespace promotion (Northstar T9). The 7
// entities the OGIT `NTO/Healthcare/entities/` TTL ships, projected
Expand Down Expand Up @@ -1642,6 +1652,15 @@ pub mod class_ids {
/// (`ogit.Automation:Trigger`).
pub const AUTOMATION_TRIGGER: u16 = 0x0C09;

// ── 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence) ──

/// `osint_system` (`0x0700`) — AI system profiled on the 12 AIRO/VAIR
/// dual-use dims (V3 SoA GUID1 `6×(8:8)` tier cascade).
pub const OSINT_SYSTEM: u16 = 0x0700;
/// `osint_person` (`0x0701`) — person profiled on McClelland motive +
/// Rubicon stage (V3 SoA GUID2; the Epstein-archetype implicit-motive lens).
pub const OSINT_PERSON: u16 = 0x0701;

/// Every `(canonical_concept_name, id)` pair the constants vouch for.
/// Drift-guarded against [`super::CODEBOOK`] by tests in this module.
pub const ALL: &[(&str, u16)] = &[
Expand Down Expand Up @@ -1684,6 +1703,9 @@ pub mod class_ids {
("pricelist", PRICELIST),
("pricelist_rule", PRICELIST_RULE),
("unit_of_measure", UNIT_OF_MEASURE),
// 0x07XX — OSINT (AIRO/AIwar dual-use intelligence)
("osint_system", OSINT_SYSTEM),
("osint_person", OSINT_PERSON),
// 0x09XX — health
("patient", PATIENT),
("diagnosis", DIAGNOSIS),
Expand Down Expand Up @@ -2443,6 +2465,18 @@ pub fn canonical_concept(name: &str) -> String {
) {
return "priority".to_string();
}
// OSINT domain (0x07XX) — the canonical class-name spellings must
// round-trip so ordinary PascalCase model-name inputs (`OsintSystem` /
// `OsintPerson`, the builders' `Class::new(...)` names) recover their
// codebook ids; without this arm they lexically land on `osintsystem` /
// `osintperson`, which are NOT in the codebook (`osint_system` /
// `osint_person` are). Codex P2 on PR #145, mirrors the PR #60 pattern.
if matches!(lower.as_str(), "osintsystem" | "osint_system") {
return "osint_system".to_string();
}
if matches!(lower.as_str(), "osintperson" | "osint_person") {
return "osint_person".to_string();
}
// ── Layer 2: lexical fallback ──
lexical_concept(name)
}
Expand Down Expand Up @@ -2575,6 +2609,10 @@ pub fn all_promoted_classes() -> Vec<Class> {
pricelist(),
pricelist_rule(),
unit_of_measure(),
// 0x07XX — OSINT arm (AIRO/AIwar dual-use: system + person cards),
// in class_ids::ALL order.
osint_system(),
osint_person(),
// 0x09XX — health arm (7 OGIT Healthcare concepts), in
// class_ids::ALL order.
patient(),
Expand Down Expand Up @@ -3684,6 +3722,88 @@ pub fn treatment() -> Class {
c
}

// ─────────────────────────────────────────────────────────────────────
// 0x07XX — OSINT domain (AIRO/AIwar dual-use intelligence)
//
// Minted from the q2 cockpit V3 SoA bake (`data/osint-v3/`, harvested from
// `AdaWorldAPI/aiwar-neo4j-harvest`). Two concepts mirror the two GUIDs of a
// baked node: GUID1 (the AI system, 12 AIRO/VAIR dims) and GUID2 (the person,
// 5 McClelland/Rubicon dims). Field order IS the SoA tier order — the FieldMask
// bit basis. The low u16 is the frozen canonical concept; the render-skin
// APP_PREFIX (`0x1000`, a V3 format signal) is the consumer's half.
// ─────────────────────────────────────────────────────────────────────

/// OSINT **AI system** — the AIRO/AIwar dual-use system card (`osint_system`,
/// `0x0700`). The 12 dims the V3 SoA bake packs into GUID1's `6×(8:8)` tier
/// cascade: HEEL `current_status:type`, HIP `military_use:civic_use`,
/// TWIG `ml_task:ml_type`, LEAF `purpose:capacity`, family `output:impact`,
/// identity `stakeholder:airo_role`. Attribute declaration order IS the tier
/// order, so the lifted `ObjectView` FieldMask bit `i` == tier byte `i`. The
/// reasoning roles (Demand `offer⟷need`, Causality `intent⟷impact`) are a
/// consumer-side overlay on these names (see q2 `osint_classview.rs`).
#[must_use]
pub fn osint_system() -> Class {
let mut c = Class::new("OsintSystem");
c.language = Language::Unknown;
c.canonical_concept = Some("osint_system".to_string());
c.description =
Some("An AI system profiled on the AIRO/AIwar dual-use dimensions".to_string());
c.source_domain = Some("osint".to_string());
c.source_curator = Some("aiwar".to_string());
let mut attrs = Vec::with_capacity(12);
for name in [
"current_status", // HEEL.hi — state
"type", // HEEL.lo — identity
"military_use", // HIP.hi — dual-use need
"civic_use", // HIP.lo — dual-use need
"ml_task", // TWIG.hi — the task (need)
"ml_type", // TWIG.lo — the technique (offer)
"purpose", // LEAF.hi — intent (explicit)
"capacity", // LEAF.lo — offer
"output", // family.hi — offer
"impact", // family.lo — causality (implicit)
"stakeholder", // identity.hi — relation
"airo_role", // identity.lo — actor role (person)
] {
let mut a = Attribute::new(name);
a.type_name = Some("string".to_string());
attrs.push(a);
}
c.attributes = attrs;
c
}

/// OSINT **person** — the McClelland / Rubicon actor card (`osint_person`,
/// `0x0701`). The 5 dims the V3 SoA bake packs into GUID2: HEEL `stage:need`,
/// HIP `receptor:rubicon`, TWIG `motive`. This is the Epstein-archetype lens —
/// implicit motive (`nPow`/`nAch`/`nAff`) × Rubicon crossing × power receptor —
/// the Person side of the Person×Situation split (the system card carries the
/// Situation). Attribute order IS the GUID2 tier order (the FieldMask bit basis).
#[must_use]
pub fn osint_person() -> Class {
let mut c = Class::new("OsintPerson");
c.language = Language::Unknown;
c.canonical_concept = Some("osint_person".to_string());
c.description =
Some("A person profiled on McClelland motives and the Rubicon action stage".to_string());
c.source_domain = Some("osint".to_string());
c.source_curator = Some("aiwar".to_string());
let mut attrs = Vec::with_capacity(5);
for name in [
"stage", // HEEL.hi — Rubicon stage I..IV
"need", // HEEL.lo — McClelland nPow/nAch/nAff
"receptor", // HIP.hi — power receptor
"rubicon", // HIP.lo — Rubicon crossing
"motive", // TWIG.hi — dominant motive
] {
let mut a = Attribute::new(name);
a.type_name = Some("string".to_string());
attrs.push(a);
}
c.attributes = attrs;
c
}

/// Visit — a clinical encounter (OGIT `Visit`, `0x0906`). The temporal
/// container diagnoses / labs / treatments / vitals are recorded within.
#[must_use]
Expand Down Expand Up @@ -4138,6 +4258,24 @@ mod tests {
assert!(wire_synergies(&[a, b, c]).is_empty());
}

#[test]
fn canonical_concept_promotes_osint_classes_deterministically() {
// OSINT domain (0x07XX): the builders' PascalCase class names must
// round-trip to their codebook ids, like every other promoted class
// (codex P2 on PR #145). Without the resolver arm, `OsintSystem`
// lexically lands on `osintsystem`, which is NOT in the codebook.
assert_eq!(canonical_concept("OsintSystem"), "osint_system");
assert_eq!(canonical_concept("OsintPerson"), "osint_person");
assert_eq!(canonical_concept("osint_system"), "osint_system");
assert_eq!(canonical_concept("osint_person"), "osint_person");
// Full round-trip through the codebook resolver.
assert_eq!(ogar_codebook("OsintSystem"), Some(0x0700));
assert_eq!(ogar_codebook("OsintPerson"), Some(0x0701));
// The class builder's own `.name` resolves to its codebook id.
assert_eq!(ogar_codebook(&osint_system().name), Some(0x0700));
assert_eq!(ogar_codebook(&osint_person().name), Some(0x0701));
}

#[test]
fn canonical_concept_promotes_billable_work_entry_deterministically() {
// Promoted cross-domain invariant — OpenProject `TimeEntry` and
Expand Down Expand Up @@ -4829,8 +4967,8 @@ mod tests {
],
"Automation domain set drift — re-sync the consumer coverage gate",
);
// An empty (reserved-but-unpopulated) domain yields nothing.
assert_eq!(concepts_in_domain(ConceptDomain::Osint).count(), 0);
// The OSINT domain carries the two AIRO/AIwar cards (system + person).
assert_eq!(concepts_in_domain(ConceptDomain::Osint).count(), 2);
}

#[test]
Expand Down
Loading
Loading