diff --git a/Cargo.toml b/Cargo.toml index 80d554d..c7e2eda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,6 @@ members = [ "crates/ogar-obo", "crates/ogar-cpic", "crates/ogar-dismech", - "crates/ogar-epistemic", "crates/ogar-adapter-python", "crates/ogar-adapter-csharp", "crates/ogar-auth", diff --git a/crates/ogar-epistemic/Cargo.toml b/crates/ogar-epistemic/Cargo.toml deleted file mode 100644 index 1b55d52..0000000 --- a/crates/ogar-epistemic/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "ogar-epistemic" -version.workspace = true -edition.workspace = true -license.workspace = true -repository.workspace = true -authors.workspace = true -rust-version.workspace = true -description = "Compile-time classid reservation and the named 24-axis epistemic basis (v3) for the EpistemicBassin24 magnitude register. Authority-side half of the plug-and-play contract: lance-graph-contract's epistemic_bassin stays zero-dependency, this crate reserves the basis classid and names the axes; the armed parity check on the lance-graph side asserts both sides byte-for-byte." - -[dependencies] - -[dev-dependencies] -ogar-dismech = { path = "../ogar-dismech" } -ogar-obo = { path = "../ogar-obo" } diff --git a/crates/ogar-epistemic/src/lib.rs b/crates/ogar-epistemic/src/lib.rs deleted file mode 100644 index c1f01d7..0000000 --- a/crates/ogar-epistemic/src/lib.rs +++ /dev/null @@ -1,330 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: Copyright The Lance Authors - -//! `ogar-epistemic` — the **named 24-axis epistemic basis, v3**: the classid -//! reservation and axis catalogue for the `EpistemicBassin24` magnitude -//! register (lance-graph `epistemic_bassin`, the `agree_u4[24] + -//! disagree_u4[24]` pair). -//! -//! # The facet classid names the basis — and versions it -//! -//! Per the operator co-architect ruling (2026-09-01): each nibble of the -//! register is a quantized value on a **named epistemic axis**, never an -//! address, and the facet's 4-byte classid names WHICH 24-axis basis (and -//! which version) the register's lanes are read against. "Epistemic witness -//! v3" is a classid, not a Rust name — so a superseded catalogue is retired -//! by minting the NEXT concept id (v4), never by re-reading old rows under -//! new labels. Append-only, the same discipline as every codebook here. -//! -//! # Where the axes come from -//! -//! Derived from the ruled projection (episodic references / named basis / -//! premise trace / revision) and the ruled lane semantics (lanes carry -//! proprioception and pressure, never empirical truth — exact quantities -//! stay in their exact carriers). Every axis names a pressure GROUNDED in a -//! shipped surface, listed per row in [`AXES`]; none is invented. The -//! catalogue is the session's derivation from those rulings — supersedable -//! by a v4 mint, which is deliberately cheap. -//! -//! Four of the axes are **magnitude twins** of A9 ContextLoci pointer axes -//! (`Quorum`, `Contradiction`, and the TEKAMOLO four collapse to their own -//! group): the locus points at WHO (the agreeing peer, the disagreeing -//! peer); the basis axis carries HOW MUCH. Two readings, one register -//! family, zero overlap in what they store. -//! -//! # What this crate deliberately does NOT do -//! -//! - No shared-codebook rows: [`EPISTEMIC_BASIS_V3_CONCEPT_ID`] lives inside -//! the already-reserved `Ontology` domain (`0x03XX`), clear of every -//! neighbour (collision-guarded in tests against `ogar-dismech` and -//! `ogar-obo`'s bands). -//! - No domain `FnIndex` mints: the six epistemic calls are ogar-loco CORE -//! (`0x86..0x8B`) and therefore readable in every vocabulary already; a -//! domain palette (per-axis macros, revision verbs — and per the -//! rung-per-classid ruling, per-rung palettes) mints later, as content -//! earns it. -//! - No Hambly-Lyons axis: sigker's path-signature classification is gated -//! on jc Pillar 11 (DEFERRED) — the red-pillar rule holds for axes as it -//! does for lanes and mints. - -/// The v3 basis concept id, inside the reserved `Ontology` domain (`0x03XX`). -/// -/// Clear of: OBO core (`0x0301..=0x0305`), `ogar-ro` (`0x0306`), the -/// private-consumer run (`0x0307..=0x031D`, `0x031F`/`0x0321` retired), -/// DisMech (`0x0333`), and the meta-study spine (`0x0340..=0x0347`). -/// A v4 catalogue mints the NEXT free id; this one is then retired in -/// place, never re-labelled. -pub const EPISTEMIC_BASIS_V3_CONCEPT_ID: u16 = 0x0334; - -/// The full V3 render classid under a consumer's app prefix — canon-high -/// (`concept << 16 | app_prefix`), the same compose every codebook uses. -#[must_use] -pub const fn epistemic_basis_render_classid(app_prefix: u16) -> u32 { - ((EPISTEMIC_BASIS_V3_CONCEPT_ID as u32) << 16) | app_prefix as u32 -} - -/// Axis count — must equal the register's lane count (`BASIS_AXES` on the -/// lance-graph side; the armed parity check holds the two together). -pub const AXES_LEN: usize = 24; - -/// The six axis groups, four axes each — the ruled projection made -/// positional: `group = axis >> 2` is a shift, never a lookup. -pub const GROUPS: [&str; 6] = [ - "set", // Mengenlehre kind 1 — the inheritance field itself - "evidence", // dismech stances - "derivation", // Tarski / premise trace - "field", // Shannon / EWA proprioception - "circumstance", // TEKAMOLO frame agreement - "witness", // provenance / revision / peers -]; - -/// The named basis: `(axis, name, group, grounding)` — the grounding names -/// the SHIPPED surface each pressure is measured against, so no axis is a -/// free-floating adjective. -pub const AXES: [(u8, &str, &str, &str); AXES_LEN] = [ - // ── set (0..4): the whale lives here ───────────────────────────────── - ( - 0, - "IS_A", - "set", - "the is_a rail (hhtl path / episodic_basin L1-L3)", - ), - ( - 1, - "PART_OF", - "set", - "the part_of rail (same rails, mereology axis)", - ), - ( - 2, - "TYPICALITY", - "set", - "conformance to the basin's Cam96 self_code neighbourhood", - ), - ( - 3, - "MISSING_LINK", - "set", - "rail-expected relation with silent evidence (asked-but-silent, sweep_ternlog 0x02)", - ), - // ── evidence (4..8): dismech stances ───────────────────────────────── - ( - 4, - "SUPPORT", - "evidence", - "dismech_evidence::Supports::Support mass", - ), - ( - 5, - "REFUTE", - "evidence", - "dismech_evidence::Supports::Refute mass", - ), - ( - 6, - "PARTIAL", - "evidence", - "dismech_evidence::Supports::Partial mass", - ), - ( - 7, - "REPLICATION", - "evidence", - "replication pressure across independent evidence rows", - ), - // ── derivation (8..12): Tarski / premise trace ─────────────────────── - ( - 8, - "PREMISE", - "derivation", - "premise-ancestry soundness (exact depth stays in the ancestry)", - ), - (9, "DEDUCTION", "derivation", "NARS deduction-step validity"), - ( - 10, - "FALSIFIER", - "derivation", - "known-falsifier pressure (Tarski's falsifier side)", - ), - ( - 11, - "COUNTERFACTUAL", - "derivation", - "rung-3 counterfactual pressure (CE64 mantissa -6; never observed truth)", - ), - // ── field (12..16): Shannon / EWA ──────────────────────────────────── - ( - 12, - "INFO_GAIN", - "field", - "epistemic_bassin::info_gain_u4 over candidate counts", - ), - ( - 13, - "TENSION", - "field", - "epistemic_bassin::sigma_tension_u4 vs sigma_propagation::pillar_5plus_bound", - ), - ( - 14, - "COHERENCE", - "field", - "EWA residual coherence with the neighbourhood Sigma", - ), - ( - 15, - "AMBIGUITY", - "field", - "open candidate-set width (dismech_candidates::Evaluation)", - ), - // ── circumstance (16..20): TEKAMOLO agreement ──────────────────────── - ( - 16, - "TEMPORAL", - "circumstance", - "children agree on the WHEN frame (Tekamolo tenant / Locus::Temporal twin)", - ), - ( - 17, - "KAUSAL", - "circumstance", - "children agree on the WHY frame (Locus::Kausal twin)", - ), - ( - 18, - "MODAL", - "circumstance", - "children agree on the HOW frame (Locus::Modal twin)", - ), - ( - 19, - "LOKAL", - "circumstance", - "children agree on the WHERE frame (Locus::Lokal twin)", - ), - // ── witness (20..24): provenance / revision / peers ────────────────── - ( - 20, - "PROVENANCE", - "witness", - "episodic grounding strength (EpisodicBasin references exist)", - ), - ( - 21, - "REVISION", - "witness", - "admitted-then-revised pressure (NARS revision; what was admitted and when)", - ), - ( - 22, - "QUORUM", - "witness", - "peer-agreement mass (magnitude twin of Locus::Quorum)", - ), - ( - 23, - "CONTRADICTION", - "witness", - "preserved-contradiction depth (magnitude twin of Locus::Contradiction)", - ), -]; - -/// Group of an axis — a shift, never a branch. -#[must_use] -pub const fn group_of(axis: u8) -> Option<&'static str> { - if (axis as usize) < AXES_LEN { - Some(GROUPS[(axis >> 2) as usize]) - } else { - None - } -} - -/// Name of an axis, `None` past the basis. -#[must_use] -pub const fn axis_name(axis: u8) -> Option<&'static str> { - if (axis as usize) < AXES_LEN { - Some(AXES[axis as usize].1) - } else { - None - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn the_catalogue_is_dense_unique_and_grouped_by_shift() { - for (i, &(axis, name, group, grounding)) in AXES.iter().enumerate() { - assert_eq!(axis as usize, i, "axes are dense 0..24, no gaps"); - assert_eq!(group, GROUPS[i >> 2], "group is axis >> 2"); - assert!( - !grounding.is_empty(), - "{name}: every axis names its grounding" - ); - } - for (i, a) in AXES.iter().enumerate() { - for b in AXES.iter().skip(i + 1) { - assert_ne!(a.1, b.1, "axis names are unique"); - } - } - assert_eq!(AXES_LEN, 24); - assert_eq!(GROUPS.len() * 4, AXES_LEN); - } - - #[test] - fn the_concept_id_collides_with_no_reserved_neighbour() { - assert_ne!( - EPISTEMIC_BASIS_V3_CONCEPT_ID, - ogar_dismech::DISMECH_CONCEPT_ID - ); - // OBO core + ogar-ro + the private-consumer run + retired ids. - assert!( - !(0x0301..=0x0321).contains(&EPISTEMIC_BASIS_V3_CONCEPT_ID), - "clear of the OBO/ro/private run" - ); - // the meta-study spine - assert!( - !(0x0340..=0x0347).contains(&EPISTEMIC_BASIS_V3_CONCEPT_ID), - "clear of META_STUDY_SPINE" - ); - // inside the reserved Ontology domain at all - assert_eq!(EPISTEMIC_BASIS_V3_CONCEPT_ID >> 8, 0x03); - } - - #[test] - fn render_classid_is_canon_high() { - let c = epistemic_basis_render_classid(0x0002); - assert_eq!(c >> 16, EPISTEMIC_BASIS_V3_CONCEPT_ID as u32); - assert_eq!(c & 0xFFFF, 0x0002); - } - - #[test] - fn lookups_answer_inside_the_basis_and_refuse_past_it() { - assert_eq!(axis_name(0), Some("IS_A")); - assert_eq!(axis_name(23), Some("CONTRADICTION")); - assert_eq!( - axis_name(24), - None, - "past the basis is refused, not wrapped" - ); - assert_eq!(group_of(3), Some("set")); - assert_eq!(group_of(23), Some("witness")); - assert_eq!(group_of(24), None); - } - - /// The red-pillar rule as an assertable absence: no axis claims a - /// Hambly-Lyons / path-signature quantity while jc Pillar 11 is red. - #[test] - fn no_axis_claims_a_red_pillar_quantity() { - for &(_, name, _, grounding) in AXES.iter() { - for banned in ["HAMBLY", "LYONS", "SIGNATURE"] { - assert!( - !name.to_uppercase().contains(banned) - && !grounding.to_uppercase().contains(banned), - "{name}: red-pillar quantity in the catalogue" - ); - } - } - } -} diff --git a/crates/ogar-loco/src/lib.rs b/crates/ogar-loco/src/lib.rs index e2df12b..e460ab8 100644 --- a/crates/ogar-loco/src/lib.rs +++ b/crates/ogar-loco/src/lib.rs @@ -589,40 +589,22 @@ impl FnIndex { /// Read a call argument. `procedures_defreturn` argument access. pub const PROC_ARG: FnIndex = FnIndex(0x85); - // ── epistemic mask algebra (0x86..0x8B, minted 2026-09-01) ────────── + // ── stacked-mask combinator (0x86, minted 2026-09-01) ──────────────── // - // The operator's essence-directive, verbatim in intent: primitives like - // Belnap become reusable bytecode macros here, for literally everything. - // Semantics are owned by `lance-graph-contract::epistemic_bassin` (the - // scalar oracles these calls are parity-tested against); batch SIMD - // execution is ndarray's shipped W1a-#9 `ternlog` (native VPTERNLOGQ). - // Green-certified atoms only — Hambly-Lyons is deliberately ABSENT - // while jc Pillar 11 is red (the red-pillar mint rule). + // Generic: any 3-input boolean over mask-shaped carriers, independent of + // what the masks mean. Batch SIMD execution is ndarray's shipped W1a-#9 + // `ternlog` (native VPTERNLOGQ). Slots 0x87..0x8B are reserved core + // slots: the pair-specific band minted there on 2026-09-01 was + // retracted on 2026-09-02 with the model it encoded (reserve, don't + // reclaim — a future mint takes the next free slot deliberately). /// Any 3-input boolean over stacked masks: pops three masks, and the /// call's ONE VALUE BYTE **is the 8-bit truth table** (IMM bit index = /// `(a << 2) | (b << 1) | c`) — one FnIndex covers all 256 stacked-mask /// combinators, which is the purest `(function : value)` in the ABI. - /// Canonical tables (asked-contested 0x80, asked-silent 0x02 = the - /// missing link, …) live in `epistemic_bassin::sweep_ternlog`. + /// The value byte is the whole table; no named table set is canonical + /// here — a caller passes the truth table its own question needs. pub const TERNLOG: FnIndex = FnIndex(0x86); - /// Belnap/FDE knowledge-order join of two mask PAIRS — bitwise OR per - /// side; provably the state layer of one-hop accumulation. - pub const BELNAP_JOIN: FnIndex = FnIndex(0x87); - /// Shannon expected-information-gain readout: pops (before, after) - /// candidate counts, pushes whole bits of narrowing (u4-saturated). - /// Proprioception, never evidence. - pub const INFO_GAIN: FnIndex = FnIndex(0x88); - /// EWA tension readout: pops (log-norm growth, certificate bound), - /// pushes quarters-of-the-bound (u4; 7 = the 1.75× PASS slack). - pub const SIGMA_TENSION: FnIndex = FnIndex(0x89); - /// One-hop accumulation of a LIST of bassin pairs into the parent pair — - /// exact sums per side, one clamp; a parent expresses its DIRECT - /// children only. - pub const ACCUMULATE: FnIndex = FnIndex(0x8A); - /// One-hop contested-ness: pops (list of pairs, axis), pushes the - /// four-state Shannon entropy of the children's stances on that axis. - pub const STANCE_ENTROPY: FnIndex = FnIndex(0x8B); /// Is this a **shared computational** operation — one that means the same /// thing in every vocabulary? diff --git a/crates/ogar-loco/src/vocabulary.rs b/crates/ogar-loco/src/vocabulary.rs index 15c3048..a4e8a29 100644 --- a/crates/ogar-loco/src/vocabulary.rs +++ b/crates/ogar-loco/src/vocabulary.rs @@ -89,17 +89,13 @@ pub mod shared_core { | FnIndex::FOR_EACH => 1, // from, to, by — then a body. FnIndex::FOR_RANGE => 3, - // ── epistemic mask algebra (0x86..0x8B). TERNLOG pops three - // masks; its truth table rides as the call's value byte, never - // as an operand. The two list-consuming ops take the LIST as - // one operand (the arity of the call, not of the children — - // which is how the variadic-refusal rule stays satisfied). + // ── stacked-mask combinator (0x86). TERNLOG pops three masks; + // its truth table rides as the call's value byte, never as an + // operand. 0x87..0x8B are reserved core slots again (the + // pair-specific band minted there on 2026-09-01 was retracted + // by the 2026-09-02 semantic-family ruling; reserve, don't + // reclaim). FnIndex::TERNLOG => 3, - FnIndex::BELNAP_JOIN - | FnIndex::INFO_GAIN - | FnIndex::SIGMA_TENSION - | FnIndex::STANCE_ENTROPY => 2, - FnIndex::ACCUMULATE => 1, // Leave the enclosing loop / iteration. No operand, no body. FnIndex::BREAK | FnIndex::CONTINUE => 0, // ── leaves — they push, they do not consume. @@ -349,11 +345,6 @@ pub mod shared_core { FnIndex::ATAN => "ATAN", FnIndex::ATAN2 => "ATAN2", FnIndex::TERNLOG => "TERNLOG", - FnIndex::BELNAP_JOIN => "BELNAP_JOIN", - FnIndex::INFO_GAIN => "INFO_GAIN", - FnIndex::SIGMA_TENSION => "SIGMA_TENSION", - FnIndex::ACCUMULATE => "ACCUMULATE", - FnIndex::STANCE_ENTROPY => "STANCE_ENTROPY", FnIndex::RANDOM_INT => "RANDOM_INT", FnIndex::RANDOM_FLOAT => "RANDOM_FLOAT", FnIndex::CONSTRAIN => "CONSTRAIN", @@ -1434,11 +1425,12 @@ mod coverage { ); } - // And the census itself, pinned: 101 named operations (102 constants - // minus NOP, which is not an operation), 5 refused, 96 covered. - // Re-pinned 2026-09-01: +6 for the epistemic mask-algebra band - // (0x86..0x8B — TERNLOG, BELNAP_JOIN, INFO_GAIN, SIGMA_TENSION, - // ACCUMULATE, STANCE_ENTROPY), minted into the reserved core slots. - assert_eq!(named, 101, "the named census moved — re-pin deliberately"); + // And the census itself, pinned: 96 named operations (97 constants + // minus NOP, which is not an operation), 5 refused, 91 covered. + // Re-pinned 2026-09-01 to 101 (+6, the 0x86..0x8B mask-algebra + // band); re-pinned 2026-09-02 to 96 (−5): only the generic TERNLOG + // 0x86 survives the semantic-family ruling — the five pair-specific + // calls were retracted with the model they encoded. + assert_eq!(named, 96, "the named census moved — re-pin deliberately"); } } diff --git a/docs/DISCOVERY-MAP.md b/docs/DISCOVERY-MAP.md index 185c19e..27c5c36 100644 --- a/docs/DISCOVERY-MAP.md +++ b/docs/DISCOVERY-MAP.md @@ -2138,3 +2138,17 @@ isolation. The map's job is to keep them visible. resolution passed until the two books held different bytes at index 1, and the capacity guard passed until the refusal was asserted to leave the table unchanged). +- **[D-EPISTEMIC-BAND-RETRACTED] the 0x87..0x8B loco calls and `ogar-epistemic` + (concept 0x0334) are RETRACTED — `ogar-loco` — [G] — CODED (removal) — + regrades #296/#297.** The lance-graph semantic-family ruling of 2026-09-02 + (`E-SIX-SEMANTIC-FAMILIES-MUST-NOT-IMPERSONATE-EACH-OTHER-1`) found that the + register those calls operated on aliased three distinct families (episodic + loci, qualia magnitude, population basin). `BELNAP_JOIN` / `INFO_GAIN` / + `SIGMA_TENSION` / `ACCUMULATE` / `STANCE_ENTROPY` were defined over that + pair and go with it; census re-pinned 101 → 96. `TERNLOG` 0x86 stays: it is + a generic 3-input mask combinator whose value byte is the truth table, + independently justified by ndarray's W1a-#9 `ternlog`. Slots 0x87..0x8B are + reserved core again (reserve, don't reclaim). The fixed 24-axis basis is + withdrawn as canonical population-basin semantics; population geometry is + an accepted vacancy on the lance-graph side. Append-only: D-BASIN-CODEBOOK + (#295) is unaffected and stands.