diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 729f27a21..fa8f5a7af 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,3 +1,159 @@ +## 2026-09-19 — E-THE-1224-DETOUR-CLEANUP-PASS-WHAT-WAS-CONTAMINATION-AND-WHAT-SURVIVES-1 + +**Status:** CLEANUP RULING (operator-directed, one pass, no new architecture). +**Confidence:** high — each row names the statement it supersedes and where it +lived. Board entries are append-only, so nothing below is deleted from the +ledger; the live PLAN is corrected in place (it is not a ledger) and the +corrections are listed here. + +### Exit condition this pass serves + +A new session reads the live board and reaches **SPOG + `f,c` → generic +reasoning → R2IL / replay / mask / fold / ternlog → next consequence / focus** +directly — without reproducing the #1224 causal-licensing detour, treating +OGAR as the thinker, conflating `G` with `ClassView`, weakening R2IL varnode +semantics, or demoting the Panama/Valhalla zero-copy lesson. + +### 1. Removed or superseded as contamination + +| # | statement, and where it stood | why it goes | +|---|---|---| +| C1 | *"High IG at `band = Relation` … requires an explicit Causal-band operation before any new CE64 is written"* (plan §1, and echoed in `E-THREE-CONVERGENCES-…-1`) | **Invented here, from band ordinality.** `ReasoningBand` is an explicit, coarse, ORTHOGONAL classifier; the source contract says setting one field never implies, derives or requires another. Not a permission ladder. **Deleted, and not replaced by another licensing mechanism** — any future epistemic/causal write gate must come from SPOG / `f,c` / provenance / revision semantics and measured code | +| C2 | *"Usefulness is not causal licensing"* as a doctrine derived from #1224; the helper-existence lesson; the zero-consumer census as the reason the PR closed | #1224 is **not an architectural source**. It was withdrawn because its premise was wrong; the census was forensic evidence only. All three derivations withdrawn | +| C3 | *"outer ontology `G` — which ClassView interprets the bytes"* (plan §2 list) | **Collapsed two axes.** `G` is the graph / context / frame / source context (an ontology graph, a patient graph, a code graph, an episode); `ClassView` is how canonical bytes are interpreted. Never the same axis | +| C4 | *"A varnode is not a buffer"* (plan §1, `E-A-VARNODE-IS-NOT-A-BUFFER`-adjacent text) | **Too broad.** R2IL varnodes ARE real typed machine values/locations with explicit size and address-space semantics. Narrowed to: *a varnode is not a semantic-population materialization obligation.* R2IL stays mechanical behavioral microcode; the zero-materialization freedom belongs to the binding/lowering layer | +| C5 | *"'Valhalla is the storage membrane' does not hold against the tree … Valhalla is E4: Vector API is permanently a lab arm"* (`E-LAYER0-IS-T1-…` item 3, this board) | **Conflated Valhalla with the Vector API lab arm — two different things.** Correct: **lance-graph / T0 owns canonical storage; Panama gives Java direct reach into it; Valhalla gives Java cheap value-shaped semantic carriers over it; lgj therefore inhabits the substrate zero-copy.** Valhalla is a Java-side storage MEMBRANE, never storage OWNERSHIP. E4 (no Vector API in `src/main`) is untouched and unrelated. lgj is one consumer teaching how this works — never the center | +| C6 | *"mount `ogar-dismech` + `dismech-rs` ⇒ DisMech behaviour becomes available"* read as activation | Mounting a graph makes **facts** available; generic reasoning is unchanged. `lance-graph-ogar` is a mount/integration seam, not an ontology reasoner. *We think with OGAR graphs; OGAR does not do the thinking* | + +### 2. Retained — independently supported, not #1224-derived + +`ReasoningBand` and `CausalTopology` exist as CE64 61–63 / 59–60 and are +orthogonal (read from `causal-edge/src/layout.rs`, not from #1224). The +**bidirectional domain inversion** #1224 exposed is real and still live in the +tree — that single historical fact survives, in +`ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS`. And the measured Waben work is +untouched by this pass: mask operation ≠ materialized bitmap; a flat explicit +program lowers into fused execution; materialization is deliberate; W0/W1 +attestation; W2 range terminals and bounded composition; W3 semantic→geometric +rotation; W4 closed tile; W5 local focus; W6 publication cost; replay identity +and determinism; cache-by-key-mismatch rather than maintenance; Quack/DuckDB +economics; R2IL as mechanical behaviour; lgj as zero-copy evidence. **The +goose ride was in the architecture commentary, not in the execution plan.** + +### 3. Final DisMech seam wording + +``` +ogar-dismech the DisMech graph / vocabulary / source-specific semantics +lance-graph zero knowledge that DisMech exists — generic SPOG reasoning only +``` + +Per existing `dismech_*` file: generic mechanics → extract under generic names; +DisMech-specific semantics → the source/ontology side; entanglement-only code → +delete. **No generic-looking type may be minted to preserve DisMech policy** — +`Support / Partial / Refute / NoEvidence` is NOT promoted to a lance-graph +`Stance` absent an independent non-DisMech requirement; the SPOG / `f,c` model +gets first refusal. + +### 4. Final counterfactual module ownership + +⊘ **Amends the census addendum below**, which said the DisMech verdict type +should "collapse into" `revision::CounterfactualVerdict`. **Do not collapse the +measurement to remove a duplicate enum.** The two-arm reading is the +experiment: `Consistent → Inconsistent` clearly supports `Necessary`, and +`Consistent → Consistent` supports `Dispensable`, but `Inconsistent → *` are +**not automatically the same adjudication**. The shape is therefore +`CounterfactualAttack { factual, without_step, … }` with +`adjudicate() -> CounterfactualVerdict`, and **a falsifier covering all four +factual × cut-arm quadrants lands BEFORE the local reading type is deleted.** +Ownership stays: `contract/counterfactual.rs` = split-pole deposit; +`revision::CounterfactualVerdict` = the adjudication; `cognitive/world` = +fingerprint substitution (explicitly not structural intervention); the +structural cut/replay mechanics move beside the generic replay core — **no new +standalone `counterfactual_replay.rs`.** + +### 5. The center, restored in one line + +``` +SPOG + f,c → generic reasoning → R2IL / replay / mask / fold / ternlog → next consequence / focus +``` + +Around it, none of which redefines it: OGAR graphs = knowledge to consult; +Quack = lowering and economics; lgj = zero-copy runtime consumer; JC = +calibration and metrology; DeepNSM / ARM = priors and evidence producers. + +## 2026-09-19 — E-WE-THINK-WITH-OGAR-GRAPHS-OGAR-DOES-NOT-DO-THE-THINKING-1 + +**Status:** RULING (operator) + the ownership CENSUS it demanded before any +cut. **Confidence:** high; every row is read from the tree at +lance-graph `9fd6956d` / OGAR `ogar-dismech` + `ogar-ro` / MedCare-rs `90eb1f9`. + +### The rule, recorded before the cut is revised + +**Ontology thinking is a lance-graph / SPOG concern. OGAR ontologies are +knowledge graphs supplied to that reasoning substrate. `ogar-dismech` is one +optional graph to consult — not a DisMech reasoning plugin, not the owner of +ontology cognition.** Shorter: *we think with OGAR graphs; OGAR does not do the +thinking.* `ogar-ro`, `ogar-obo`, `ogar-fma`, `ogar-dismech`, a patient graph, +a code graph are all just `G` in `(S,P,O,G ; f,c ; topology ; band)`. There is +no "activate DisMech reasoning"; mounting a graph makes facts available and +nothing else changes. **The falsifier:** if generic reasoning must know WHICH +graph supplied a relation to run its mechanics, either the graph failed to say +what it means in SPOG / f,c / context, or domain policy leaked into the engine. +`G` may matter as provenance and context; it never selects an algorithm. + +⊘ This corrects the cut proposed earlier today in +`ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS`, which gave `ogar-dismech` too much +agency (it was to "grow the typed parse") and proposed `contract::revision:: +Stance` — the DisMech `supports` vocabulary renamed and promoted, i.e. the +same contamination with the serial number filed off. Both withdrawn. + +### Ownership census of `lance-graph-contract/src/dismech_evidence.rs` (817 lines) + +| item | what it is | owner | disposition | +|---|---|---|---| +| `DismechTopology` (4) + `from_source` | the `causal_link_type` YAML tokens `DIRECT / INDIRECT_KNOWN_INTERMEDIATES / INDIRECT_UNKNOWN_INTERMEDIATES / UNKNOWN` — its meaning is ALREADY generic as `causal_edge::CausalTopology` (CE64 59–60), 1:1 by the module's own doc | **source-format** | the enum is redundant with `CausalTopology`; the token parse belongs with whoever reads the source (see open decision) | +| `Supports` (4) + `from_source` | `SUPPORT / PARTIAL / REFUTE / NO_EVIDENCE` — **zero consumers outside `dismech_candidates.rs`** | **source-format** | NOT promoted to a generic `Stance`; at ingestion it becomes SPOG evidence attributes / `f,c` (a REFUTE is a relation with negative polarity or low `f`, the domain's call) | +| `EvidenceSource` (5) + `from_source` | `HUMAN_CLINICAL / MODEL_ORGANISM / IN_VITRO / COMPUTATIONAL / OTHER` | **source-format** | source side | +| `modifier` (7), `frequency` (19) | in the doc table only; no enum exists | — | nothing to move | +| `CitationNamespace / CitationKey / BibliographyRecord` (+ `ContentId`) | `(namespace, id)` citation identity — PMID/DOI/URL are cross-domain, ORPHA/CGGV are medical; **zero consumers outside the module** | domain-neutral in SHAPE, single-domain in USE | no independent cross-domain consumer exists, so it does NOT earn a generic home today; it travels with the source side and returns as `contract::citation` when a second domain needs it | +| `DISMECH_PREDICATE_FLOOR`, `DISMECH_PREDICATES`, `dismech_predicate`, `is_dismech_predicate` | the predicate mirror; authority `ogar_dismech::{RELATIONS, CAUSES, by_index}` | **ontology identity, already owned by `ogar-dismech`** | **DELETE** | + +### Census of the planner modules + +| module | generic mechanics (stay, domain-neutral name) | DisMech knowledge (leaves) | +|---|---|---| +| `dismech_replay.rs` | `ChainStep`, `ReplayTraceRow`, `ComposeTables`, `replay_step/chain`, `first_divergence`, `next_base_seq` | `validate_chain` / `chain_step_predicate` against the mirror. Replacement is a GENERIC validity contract (`validate_chain(chain, is_valid_predicate)`), acceptable only because the validator is generic — proven by running the SAME code under two vocabularies (`ogar_dismech::by_index` and `ogar_ro::by_index` both exist) | +| `dismech_counterfactual.rs` | cut-one-step, both arms, load-bearing test | none — but its `Verdict{Consistent, Inconsistent}` / `EdgeRole::is_load_bearing` must reconcile with the EXISTING generic `revision::CounterfactualVerdict{Necessary, Dispensable, NotRun}`; two verdict types for one question is the drift the cut exists to remove | +| `dismech_candidates.rs` | `EvidenceMask` (already generic, `revision.rs:31`) | the POLICY `Support ⇒ ∩ · Refute ⇒ ∖ · Partial/NoEvidence ⇒ no-op` is derived from the source vocabulary, has zero independent consumers, and is NOT canonized as a lance-graph law. `apply/evaluate/is_informative` go with it unless they take the OPERATION as input rather than the stance | + +### `lance-graph-ogar` is a mount, not a reasoner + +Its test is not "lance-graph can replay a DisMech chain". It is: register a +vocabulary → build ordinary SPOG relations → hand generic inputs to +lance-graph → **the identical program runs when the graph is `ogar-dismech`, +`ogar-ro`, or another registered vocabulary.** Mount, unmount: only available +knowledge changes. + +### Acceptance (replaces the token-grep as the decisive test; the grep stays as hygiene) + +1. lance-graph generic reasoning compiles and tests with no DisMech present. +2. Mount `ogar-dismech`: no reasoning code changes; facts become available. +3. Mount a second unrelated graph: the SAME machinery consults it. +4. Unmount `ogar-dismech`: nothing changes but available knowledge. +5. No DisMech source enum or policy has been renamed into lance-graph to + preserve existing code. + +### One open decision, flagged, not decided here + +Two versions of the ruling arrived; they agree on everything except WHERE the +source-token parsers live: one places them in `dismech-rs` (source/domain +implementation), the other allows `ogar-dismech` (source normalization is a +vocabulary concern). Read from the tree: `dismech-rs` is not a local checkout; +MedCare's `medcare-dismech` bake tool already carries its own fail-closed +token match (`freeze.rs`) and is the only thing that reads the YAML today. So +the parse currently lives with the reader, which is the source side either +way. Recorded as open; nothing is moved into `ogar-dismech` until it is closed. + ## 2026-09-19 — E-THE-CENTER-IS-SPOG-PLUS-FC-EVERYTHING-ELSE-IS-CAST-1 **Status:** RULING on the center of gravity for the whole arc; FINDING on what diff --git a/.claude/board/ISSUES.md b/.claude/board/ISSUES.md index 0c22d4ac4..6632bc168 100644 --- a/.claude/board/ISSUES.md +++ b/.claude/board/ISSUES.md @@ -1,3 +1,68 @@ +## ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS — counterfactual adjudication CORRECTED; cleanup pass closed (2026-09-19) + +⊘ The census addendum below says the DisMech `Verdict{Consistent, +Inconsistent}` should collapse into `revision::CounterfactualVerdict`. +**Corrected:** collapsing it discards the two-arm measurement. `Consistent → +Inconsistent` supports `Necessary`; `Consistent → Consistent` supports +`Dispensable`; `Inconsistent → Consistent` and `Inconsistent → Inconsistent` +are NOT automatically the same adjudication. The cut therefore preserves the +factual and without-step readings as `CounterfactualAttack { factual, +without_step, … }` with `adjudicate() -> CounterfactualVerdict`, and **a +falsifier over all four quadrants lands before the local reading type is +deleted**. Everything else in the addendum stands: no new +`counterfactual_replay.rs`; the structural mechanics sit beside the generic +replay core. + +Also closed by the cleanup pass: `Support / Partial / Refute / NoEvidence` is +NOT promoted to a generic `Stance` (the SPOG / `f,c` model gets first refusal), +and **DisMech archaeology stops here** — the seam is now accurately recorded; +the next DisMech action is the implementation PR, on operator word. + +## ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS — census addendum: the generic counterfactual home ALREADY EXISTS (2026-09-19) + +⊘ The revised cut below still says "extract counterfactual under a +domain-neutral name" as if a new module were needed. It is not. Read from the +tree, three counterfactual surfaces predate the DisMech one: + +| module | what it is | consumers | +|---|---|---| +| `lance-graph-contract/src/counterfactual.rs` (546) | D-ATOM-4 — split resolution: minority pole deposited as the CE64 −6 mantissa (`InferenceType::Counterfactual`), `EpisodicEdge` trait, `CounterfactualMailbox` (ghost tier), `revise_if_minority_wins`, `RevisionOutcome` | `lance-graph/src/reasoning.rs`, `lance-graph-cognitive/world`, planner `nars_engine.rs`, contract `scenario.rs`, + tests/examples — a LIVE generic surface | +| `lance-graph-contract/src/revision.rs` | `CounterfactualVerdict{Necessary, Dispensable, NotRun}` — the load-bearing question, adjudicated in the Fusion → Counterfactual → Revision docket | revision policy | +| `lance-graph-cognitive/src/world/counterfactual.rs` (286) | binding substitution on fingerprint worlds — explicitly NOT do-calculus (its own doc says so) | re-exported by `reasoning.rs:44` | +| `lance-graph-planner/src/dismech_counterfactual.rs` (674) | cut-one-step-and-replay-both-arms over a recorded `CausalEdge64` chain; **already `impl EpisodicEdge for CounterfactualEdge`** (`:64`) — it consumes the generic contract today | none in production | + +**Consequence for PR-B:** no `counterfactual_replay.rs`. The cut-one-step +mechanics are the missing *structural* arm (an actual edge severed, which the +cognitive module says it lacks) and land beside the generic replay core as a +method of the recorded chain, and its `Verdict{Consistent, Inconsistent}` + +`EdgeRole::is_load_bearing` collapse into the EXISTING +`revision::CounterfactualVerdict{Necessary, Dispensable, NotRun}` — one verdict +type for one question. Four modules named counterfactual is the drift; the cut +must leave three that each answer a different question (split-pole deposit / +load-bearing adjudication / fingerprint substitution), not add a fourth +generic name. + +## ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS — cut REVISED per operator ruling (2026-09-19) + +⊘ Supersedes the PR-A/B/C shape in the entries below. Ruling and census: +`E-WE-THINK-WITH-OGAR-GRAPHS-OGAR-DOES-NOT-DO-THE-THINKING-1`. + +- **PR-B (lance-graph) lands FIRST and alone** — it needs no new OGAR code: + delete the mirror and the three source enums from the contract; extract + replay + counterfactual under domain-neutral names with a GENERIC predicate + validator; reconcile the counterfactual verdict with + `revision::CounterfactualVerdict`; delete the stance policy in candidates + (zero independent consumers); `lance-graph-ogar` test = the same replay + program under `ogar_dismech::by_index` AND `ogar_ro::by_index`; fence test as + hygiene. Re-scope `dismech-causal-replay-v1.md`; retarget `nan-ci-mode-v1.md` + pointers. **No `Stance`. No parser moves into lance-graph or OGAR.** +- **PR-A (source side) waits on the open decision** — where the token parsers + live (`dismech-rs` vs `ogar-dismech`). Until then the only reader, + `medcare-dismech/freeze.rs`, keeps its local fail-closed match. +- **PR-C (MedCare)** — `freeze.rs:66-70`'s "known follow-up" is retargeted + away from the mirror to wherever PR-A's decision lands; no mirror edge is + ever acquired. + ## ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS — the MedCare-rs bank, read (2026-09-19) The two entries below map the lance-graph and OGAR banks; this reads the diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index 6f221c5ad..195b556f6 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -1,3 +1,20 @@ +## 2026-09-19 (2) — PR #1251 merged (`16090965`): the Waben fold execution-loop plan is on `main`; `main` is `16090965` + +- **#1251 — docs only, 21 commits, +3,928 / −1 across 8 files.** Ships + `.claude/plans/waben-fold-execution-loop-v1.md` (§0–§10) and its board + record. **No contract inventory delta** — no type, crate or API changed. + Full record: `PR_ARC_INVENTORY.md` 2026-09-19 #1251. +- **Queued behind it, on operator word only:** `D-WFL-MASKOP` (precedes + W0/W1), then W0 (two attestations), then W1 (assembly-boundary census). The + DisMech cut per `ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS` (revised: PR-B first + and alone; parser location an open decision). `TD-JC-CLIPPY-RED-ON-BASE-2` + remains red on `main`, untouched. +- **Rulings now on `main`** a session must read before touching masks, folds, + replay or ontology seams: `E-THE-CENTER-IS-SPOG-PLUS-FC-…-1`, + `E-ONE-OBSERVABLE-IS-NOT-THREE-INSTRUMENTS-…-1`, `E-FOLDS-ARE-ZERO-COPY- + PERIOD-…-1`, `E-A-DOMAIN-IS-AN-OPTIONAL-CONSUMER-THROUGH-OGAR-…-1`; and, in + the follow-up PR, `E-WE-THINK-WITH-OGAR-GRAPHS-OGAR-DOES-NOT-DO-THE-THINKING-1`. + ## 2026-09-19 (1) — PRs #1249 (`bb988363`) and #1250 (`25988f3c`) merged; `main` is `25988f3c` - **#1250 — D-DIAMOND-1, verdict BOUNDED.** Ships `ordered_lane` diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index 90986c223..3646c4e7a 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -1,3 +1,54 @@ +## 2026-09-19 — lance-graph PR #1251 (merged `16090965`, branch `claude/waben-fold-loop`, head `78c5016b`, 21 commits, docs only) — the Waben fold execution loop: four seams, and attestation that has an author + +- **Added:** `.claude/plans/waben-fold-execution-loop-v1.md` (§0–§10: baseline + at lg `25988f3c` / nd `40a71ad`; the composition; four seams A–D; the global + primitive; R2IL as behavioural microcode; the three convergences; address + resolution with no new storage; capability table; waves W0–W7 + `D-WFL-DET`; + the first slice; measurement plan; what it proves; §8 deliberately not + decided; §9 cross-domain imports as probes with one fence; §10 the center). + Board: `STATUS_BOARD` D-WFL rows (three review rounds recorded by prepend), + `INTEGRATION_PLANS` entry, `ISSUES` `ISS-TWO-THINGS-ARE-NAMED-R2IL-…` and + `ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS`, ~14 `EPIPHANIES` entries. Discharged + #1250's merged-PR obligation. No code, no crate, no API change. +- **Locked:** a mask EXPRESSION denotes membership and does not imply a bitmap; + materialization only at an explicit terminal (`D-WFL-EXPR`). Folds are + zero-copy, period, with the software-level definition of materialization. + Recompute-or-freeze vs continuously maintain is the real boundary; frozen + cached masks are fine. FIRE is a sparse delta that writes what read already + had; ATTEND vs EPISTEMIC (W6.0); the write-tier ladder is increasing cost. + T1 ≠ T2 (`exec.rs:25` — mask-risc is T2 consuming T1). Two attestations + (`key_digest`, separate `row_order_digest` over stable row identity), with + `AttestedPlanes<'a>` retracted the day it was proposed. One observable is not + three instruments (Tarski / Shannon / JC). The center is SPOG + `f,c` + CE64 + 59–60 / 61–63; everything else is cast. +- **Corrected in-arc (all by prepend, none edited):** T1/T2 flattening; + back-dating the new law onto old T1 doctrine; a size-conditional fold law; + the fold-vs-mask hierarchy; a W2b gate stricter than the law it enforces + (position-dependent span; then the empty-range case); `D-WFL-DET` over an + incomplete identity (then identity vs output sensitivity); tier ordering + reversed; the Tarski fixed point relative to `X_0`; #1224 mis-cited twice + (does not resolve → deleted-for-zero-consumers → withdrawn for being + fundamentally wrong: a bidirectional domain inversion). +- **Measured / read:** Seam B costs 125 KB per `Pred::Range` at 1M rows + (`simd_masking_ops.rs:1587-1588` fills to the end of the slice) and D-DMD-P2's + control arm already measured it (34 → 4,620 ns). The loop's parts exist and + are never assembled (`dispatch_thought`, `AlphaFocus`, `StepMask`, + `BatchWriter::cast`, `CallcenterSupervisor`, `prefix_facet` — no live caller). + `ogar-r2il` is proxy glue, 82 arities, no r2sleigh dep. `crates/jc` has no + Shannon term. `facet.rs` `i >> 2` is `G3D4::group_of`, not a rung ladder. +- **Deferred:** every wave (nothing of W0–W7 is built); `D-WFL-MASKOP` precedes + W0/W1; `FIRST` unscheduled; `PROJECT` after W3; the three D-DIAMOND-1 seal + proposals; `TD-JC-CLIPPY-RED-ON-BASE-2` (red on `main`, two lines, not + touched); the DisMech cut (`ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS`, revised + shape, on operator word); the Valhalla / three-consumer entry (paused). +- **Review:** CodeRabbit three real rounds (5 + 5 + 3 findings, all verified + against the files, all valid, all fixed); Codex once at `e977f9e9`. 13 + threads, 0 unresolved at merge. One post-merge commit (`1208e632`, the + OGAR-does-not-think ruling + census) was stranded on the branch and rides + the follow-up PR. +- **Confidence:** high on the inventory and the seams; the waves are + unexecuted plans and carry no implementation confidence. + ## 2026-09-19 — lance-graph PR #1250 (merged `25988f3c`, branch `claude/d-diamond-1`) — D-DIAMOND-1: the dual fold substrate, verdict BOUNDED - **Added:** `lance_graph_contract::ordered_lane` (`OrderedLaneWitness`, diff --git a/.claude/plans/waben-fold-execution-loop-v1.md b/.claude/plans/waben-fold-execution-loop-v1.md index 7ec3495d2..92cd8601a 100644 --- a/.claude/plans/waben-fold-execution-loop-v1.md +++ b/.claude/plans/waben-fold-execution-loop-v1.md @@ -570,25 +570,26 @@ stop when X_{t+1} = X_t, or earlier when max_H U(H) < ε | `CausalTopology` | **59–60** | `{Direct, IndirectKnownIntermediates, IndirectUnknownIntermediates, Unknown}` — documented as an *"additive factual view over `TrustTexture`"*: ONE field, two lenses, not two variables | | `ReasoningBand` | **61–63** | `{Surface, Association, Relation, Causal, Counterfactual, Perspective, Meta, Transcendent}`, with explicit orthogonality notes to `CausalMask`, the inference mantissa's −6 slot, and `direction` | -**The band is a semantic sandbox, and this is the load-bearing part.** A donor -thought at `band = Relation` with `f = .81, c = .94` and spectacular information -gain **must not be silently promoted to causal knowledge.** High IG makes it a -*candidate causal investigation*, which then requires an explicit Causal-band -operation before any new CE64 is written. Likewise `Counterfactual` can explore -freely without mutating factual causal state. **Usefulness is not causal -licensing** — recorded here on its own merits. ⊘ The first cut said a citation to -"#1224" *does not resolve*; that was a search of `.claude/` and `docs/` only. -**Corrected 2026-09-19 by reading the PR itself, and corrected AGAIN the same -day:** #1224 exists and was **withdrawn and closed without merging because it -was fundamentally wrong** — it converted a criticism into an invented -maturity-ladder specification, and it placed causal-licensing semantics inside -a DisMech module against the ruling that DisMech is not a thinking atom. ⊘ The -first correction here said the helpers were "deleted after a measured zero -production consumers" as if that were the reason; it was not. The zero-consumer -count only meant the deleted helpers needed no re-homing. Making a side -measurement into the verdict is itself the error #1224 warns about. It is cited -here as a *negative* receipt, never as architecture: a helper existing is not -enforcement, and association or usefulness does not grant causal status. +**The band is an explicit, coarse, ORTHOGONAL classifier — never a permission +ladder** (operator, 2026-09-19; the whole licensing paragraph that stood here +is DELETED, not softened). The source contract is explicit that setting one +field never implies, derives, or requires another, so `Relation`, `Causal` and +`Counterfactual` are *contexts*, and nothing about band ordinality gates a +write. ⊘ This plan previously read: *high information gain at `Relation` +requires an explicit Causal-band operation before a new CE64 may be written.* +That rule was invented here, from band ordering, and is struck. **It is not +replaced by another licensing mechanism.** Any future epistemic or causal write +gate must come from actual SPOG / `f,c` / provenance / revision semantics and +measured code — not from a band progression. + +⊘ **#1224 is no longer cited for any reasoning law.** It was withdrawn and +closed unmerged because its architectural premise was wrong, and the single +fact worth keeping from it is historical: **it exposed the live bidirectional +domain inversion** (domain semantics in the substrate; generic reasoning +trapped under domain names) — recorded in +`ISS-DISMECH-SEAM-INVERTED-BOTH-WAYS`. The "causal licensing" doctrine, the +helper-existence lesson, and the zero-consumer census as an explanation of the +closure are all withdrawn from this plan. And `ReasoningBand::Meta` earns its keep without any meta-opcode: bind the fold/mask machinery to the thought programs and transfer histories themselves — @@ -628,14 +629,21 @@ cannot say which. Same category error as the section below, one level over. Cross-repo reads (OGAR `5055b06`, r2sleigh `99d2553`, lance-graph this branch): -> **A varnode is not a buffer.** R2IL varnodes carry behavioral DEPENDENCIES, -> not an obligation to materialize their values. `v2 = ternlog(v0,v1,…)` may -> never exist as bytes. - -Compiler instinct reads `v0 = …; v1 = AND(v0,…)` as *allocate a representation -per name*. The intended semantics is SSA in a **fused dataflow engine**: each -varnode names a logical value / address / membership expression, and only a -terminal that asks for membership as a carrier forces bytes. +> **A varnode is not a semantic-population materialization obligation.** +> ⊘ Narrowed 2026-09-19 from *"a varnode is not a buffer"*, which was too +> broad: R2IL varnodes ARE real typed machine values/locations with explicit +> size and address-space semantics, and that is not weakened here. What does +> not follow is that a varnode BOUND to a population-valued semantic +> expression obliges bytes for that population. + +The split is by layer, and R2IL keeps its own: **R2IL stays mechanical +behavioral microcode** — it is not redefined into a lazy-expression language. +The zero-materialization freedom belongs to the BINDING and LOWERING layer: a +varnode may bind to a population-valued expression, the physical lowering may +keep that population virtual and fused, and only an explicit carrier demand +materializes it. Compiler instinct reads `v0 = …; v1 = AND(v0,…)` as *allocate +a representation per name*; in a fused dataflow lowering only a terminal that +asks for membership as a carrier forces bytes. **The fragments are already built, and nobody had joined them:** @@ -1170,11 +1178,14 @@ no new subsystem is needed — but the literal count does not. ## §2 The address — resolved onto what exists, with no new storage -The prompt's `(G, NodeGuid, Thought-or-Rung)` resolves as: +The prompt's `(G, NodeGuid, Thought-or-Rung)` resolves as FOUR rows, not +three — ⊘ the first cut folded `G` and `ClassView` into one line, the exact +collapse §2's list below forbids (caught in review on #1252): | coordinate | existing home | evidence | new storage? | |---|---|---|---| -| **G** (ontology / ClassView) | `classid: u32` at facet bytes `0..4`, canon-high (`concept << 16 \| app`); resolved through `lance-graph-ontology`'s `class_resolver` | `facet.rs:94`, canon-high flip on the board | none | +| **G** (graph / context / frame) | ⊘ **not `classid`.** `G` is the graph a relation sits in — an ontology graph, a patient graph, a code graph, an episode. Its home is the SPOG tenant lane (`contract/src/spog_tenants.rs`, D-SPG-2 shipped), never the facet's class word | `spog_tenants.rs`; `E-THE-CENTER-IS-SPOG-PLUS-FC-…-1` | none | +| **`classid` → `ClassView`** (byte interpretation) | `classid: u32` at facet bytes `0..4`, canon-high (`concept << 16 \| app`); resolved through `lance-graph-ontology`'s `class_resolver` | `facet.rs:94`, canon-high flip on the board | none | | **NodeGuid** | `canonical_node::NodeGuid`, 16 B, stable | `canonical_node.rs:862` | none | | **Rung** | **`TemporalPov { range, rung: u8 }`** — already a *reader's* coordinate, not per-node state | `contract/src/temporal_pov.rs:151` | **none** | | **Thought track (≤64)** | **[HYPOTHESIS, not resolved]** the 6-bit W-slot palette, `AttentionMaskEntry { mailbox_id, w_slot: u8 /* 0..64 */ }` — a *physical* attention slot with LRU state, bound to a `MailboxId`. Nothing read establishes that it semantically IS a thought track; it is a carrier that happens to have the right cardinality | `cognitive-shader-driver/src/attention_mask.rs:29` | none, IF the hypothesis holds | @@ -1191,7 +1202,12 @@ already sized, already canon. Five things the plan must keep distinct (the prompt's demand): -1. outer ontology `G` — which ClassView interprets the bytes; +1. **`G`** — the graph / context / frame / source context a relation sits in. + ⊘ Corrected 2026-09-19: this line read *"outer ontology `G` — which + ClassView interprets the bytes"*, collapsing two different things. `G` may + be an ontology graph, a patient graph, a code graph, an episode, or any + other context; **`ClassView` is how canonical bytes are interpreted.** They + are never the same axis and never collapse; 2. the facet's own embedded `classid` — which concept×app the node IS; 3. `NodeGuid` — stable identity, never rewritten by a change of view; 4. **execution ordinal** — position in one lane under one lens, valid only with