From e6d5e355dc1b3b2b829643c073beb93efe97be41 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 03:58:08 +0000 Subject: [PATCH] loco: retract the pair-specific epistemic band; drop ogar-epistemic Paired with the lance-graph semantic-family recovery (2026-09-02, E-SIX-SEMANTIC-FAMILIES-MUST-NOT-IMPERSONATE-EACH-OTHER-1). The register the 0x87..0x8B calls operated on aliased episodic loci, qualia magnitude and population-basin geometry into one type. Removed - FnIndex BELNAP_JOIN / INFO_GAIN / SIGMA_TENSION / ACCUMULATE / STANCE_ENTROPY (0x87..0x8B), their arity and name rows; census re-pinned 101 -> 96. The slots return to reserved core (reserve, don't reclaim). - crates/ogar-epistemic (the fixed 24-axis basis, concept 0x0334) and its workspace member line. Kept - TERNLOG 0x86: a generic 3-input mask combinator whose value byte is the truth table, independently justified by ndarray's ternlog. - BasinCodebook (#295) untouched. Ledger: D-EPISTEMIC-BAND-RETRACTED appended to docs/DISCOVERY-MAP.md. Tests: ogar-loco 55 green; clippy -D warnings + fmt clean; workspace metadata resolves without the removed member. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01PFnYKqw6d7TTiB9cT8eFdK --- Cargo.toml | 1 - crates/ogar-epistemic/Cargo.toml | 15 -- crates/ogar-epistemic/src/lib.rs | 330 ----------------------------- crates/ogar-loco/src/lib.rs | 36 +--- crates/ogar-loco/src/vocabulary.rs | 34 ++- docs/DISCOVERY-MAP.md | 15 ++ 6 files changed, 37 insertions(+), 394 deletions(-) delete mode 100644 crates/ogar-epistemic/Cargo.toml delete mode 100644 crates/ogar-epistemic/src/lib.rs 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 41dc132..f5a3e91 100644 --- a/crates/ogar-loco/src/lib.rs +++ b/crates/ogar-loco/src/lib.rs @@ -588,40 +588,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 20440be..336c63c 100644 --- a/docs/DISCOVERY-MAP.md +++ b/docs/DISCOVERY-MAP.md @@ -2097,3 +2097,18 @@ isolation. The map's job is to keep them visible. statement-midpoint scale; rule substitutions within a locus class and sub-midpoint reorderings require the byte tier (the program itself) or a finer orientation encoding — a deliberate future mint, not a patch. + +- **[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.