Skip to content

S3.0 — the exact HHTL causal-literal address - #973

Closed
AdaWorldAPI wants to merge 1 commit into
mainfrom
claude/s3-0-causal-literal
Closed

S3.0 — the exact HHTL causal-literal address#973
AdaWorldAPI wants to merge 1 commit into
mainfrom
claude/s3-0-causal-literal

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

First delivery of the Stage-3 order (§38). One new zero-dep contract type. No DisMech, no Meta tree, no predicate semantics, no recipe change. Stage-2/2.5/2.6 (#971) is the frozen baseline and is untouched — its two proofs (representation totality, reasoning parity) stay separate and unreopened.

What it is

CausalLiteral is the absolute identity of one causal proposition: (domain, subject, predicate, object) as four canonical u16 ordinals. Equality is component equality — no hash, no learned assignment, no tolerance — so one canonical tuple cannot produce two literals, and two distinct tuples cannot collide. Three sources asserting the same proposition converge on one literal with three witnesses.

It is 8 bytes of pure address, const _-asserted at 8. That assert is the structural guard behind the headline claim: identity cannot depend on evidence count, NARS f/c, a source id, a CAM-PQ assignment, or a Lance version, because there is nowhere to put them. Adding such a field is a compile error rather than something review has to catch.

The measurement that decided the shape

The brief wants an exact HHTL address and (§4) an evidence subtree beneath it. Measured, those cannot both be one NiblePath:

component width nibbles
domain / ClassView u16 16 bit 4
canonical subject u16 16 bit 4
canonical predicate u16 16 bit 4
canonical object u16 16 bit 4
total 64 bit 16 = hhtl::MAX_DEPTH

Remaining depth for observed/ interventional/ counterfactual/: zero. And this is not a soft limit — NiblePath's own docs record that descending past MAX_DEPTH is a silent no-op that collides distinct deeper paths, which is why is_full/try_child exist. A literal spending the whole budget could never carry its own evidence tree, and would fail silently.

So identity and routing split — which is the canon's own ref-escape rule ("grows unbounded → path/ref"):

  • identity = the component tuple, exact and reversible;
  • routing = routing_prefix(depth), a deliberately lossy cohort projection for locality (§29) — never equality.

The load-bearing test is the one that proves the projection lossy. routing_prefix_is_not_identity asserts two genuinely different propositions (same domain·S·P, different O) share their 12-nibble prefix, with a paired half proving full depth still separates them. Without it, "prefix ≠ identity" is a doc claim — and falsifiers #3 (CAM-PQ as identity) and #19 (a local target read as absolute) are the same mistake this projection invites.

Why this is an address and not a tenant

Operator ruling E (ARC-B-OWNERSHIP-AND-ADDRESSING-REASSESSMENT.md §4) gates every new tenant behind "genuinely missing canonical information, or a container minted to avoid completing the address transition?" — and answers, for the EW64 case, that the missing canonical reference "is the prerequisite", and that the tenant gap and the addressing gap "are the same problem wearing two hats."

This is that prerequisite. No CE64 bit, no V3 reserved byte, no ValueTenant, no ENVELOPE_LAYOUT_VERSION bump.

Predicate meaning is deliberately absent — no is_transitive, no relation class, no composition policy. domain → codebook → ResolvedPredicate, failing closed on unknown, is S3.3. HHTL supplies hierarchy, locality and exact addressing; it does not decide what CAUSES means.

Falsifiers answered

# falsifier test
#1 same canonical tuple → different literals packed_identity_is_injective (1,296-tuple sweep, both directions)
#2 distinct predicates collide into one literal changing_only_the_predicate_changes_the_literal (two-sided)
#3 CAM-PQ / approximate assignment used as identity routing_prefix_is_not_identity
#4 two sources mint separate literals three_sources_asserting_the_same_proposition_mint_one_literal
#19 a local target mistaken for absolute identity routing_prefix_is_not_identity + the_full_literal_path_exhausts_the_nibble_budget

Nine tests total, including a component-isolation matrix from an all-0xABCD baseline (the I-LEGACY-API-FEATURE-GATED discipline applied to a new packing) and the budget guard pinned as a test rather than left in prose.

One disable-run I did not accept

Four disable-runs verified red-then-green: as_u64 dropping the predicate; routing_prefix folding the object into the top nibbles; from_le_bytes zeroing the predicate; new() ORing domain into subject.

A fifth came back green and was not accepted as evidence. The fold I first injected — packed ^ (packed>>16) ^ (packed>>32) ^ (packed>>48) — shifts only rightward, so the object never reaches the 12 nibbles the assertion reads. The disable was inert; the test was not vacuous. Proven arithmetically (both fixtures fold to 111133330000) before re-running with packed ^ (packed<<48), which goes red on the exact message.

The anchor assertion added after the last PR catches a disable that does not apply. It cannot catch one that applies to the wrong bits. That check is arithmetic, and it is now written down as E-A-DISABLE-THAT-DOES-NOT-BIND-IS-NOT-A-DISABLE-2.

Gates

  • lance-graph-contract 1180/1180 (9 new) + every example suite green
  • cargo fmt --check clean · cargo clippy --all-targets --no-deps -- -D warnings clean
  • downstream lance-graph-planner Stage-2.6a harness still 4/4

Board

EPIPHANIES ×2 (E-THE-LITERAL-CANNOT-LIVE-IN-THE-PATH-IT-ROOTS-1, E-A-DISABLE-THAT-DOES-NOT-BIND-IS-NOT-A-DISABLE-2) · LATEST_STATE contract inventory + the budget constraint · STATUS_BOARD S3.0–S3.9 with S3.0 In PR.


Generated by Claude Code

First delivery of the Stage-3 order. One new zero-dep contract type; no
DisMech, no Meta tree, no predicate semantics, no recipe change. Stage-2/
2.5/2.6 is the frozen baseline and is untouched.

WHAT IT IS

CausalLiteral is the absolute identity of one causal proposition:
(domain, subject, predicate, object) as four canonical u16 ordinals.
Equality is component equality -- no hash, no learned assignment, no
tolerance -- so one canonical tuple cannot produce two literals and two
distinct tuples cannot collide. Three sources asserting the same
proposition converge on ONE literal with THREE witnesses.

It is 8 bytes of pure address, const-asserted at 8. That assert is the
structural guard behind the headline: identity cannot depend on evidence
count, NARS f/c, a source id, a CAM-PQ assignment, or a Lance version,
because there is nowhere to put them. Adding such a field is a compile
error rather than something review has to catch.

THE MEASUREMENT THAT DECIDED THE SHAPE

The brief wants an exact HHTL address AND an evidence subtree beneath it.
Measured, those cannot both be one NiblePath:

  domain 4 + subject 4 + predicate 4 + object 4 = 16 nibbles
                                                = 64 bits
                                                = hhtl::MAX_DEPTH exactly

Remaining depth for observed/ interventional/ counterfactual/: zero. And
NiblePath's own docs record that descending past MAX_DEPTH is a silent
no-op that collides distinct deeper paths -- which is why is_full and
try_child exist. A literal spending the whole budget could never carry
its own evidence tree, and would fail silently.

So identity and routing split, which is the canon's own ref-escape rule
("grows unbounded -> path/ref"):

  identity = the component tuple, exact and reversible
  routing  = routing_prefix(depth), a deliberately LOSSY cohort
             projection for locality -- never equality

The load-bearing test is the one proving the projection lossy:
routing_prefix_is_not_identity asserts two genuinely different
propositions SHARE their 12-nibble prefix, with a paired half proving
full depth still separates them. Without it "prefix is not identity" is
a doc claim, and falsifiers #3 (CAM-PQ as identity) and #19 (a local
target read as absolute) are the same mistake this projection invites.

WHY THIS IS AN ADDRESS AND NOT A TENANT

Operator ruling E gates every new tenant behind "genuinely missing
canonical information, or a container minted to avoid completing the
address transition?" -- and answers, for EW64, that the missing canonical
reference IS the prerequisite, and that the tenant gap and the addressing
gap are the same problem wearing two hats. This is that prerequisite. No
CE64 bit, no V3 reserved byte, no ValueTenant, no layout version.

Predicate MEANING is deliberately absent -- no is_transitive, no relation
class, no composition policy. Resolution through domain -> codebook ->
ResolvedPredicate, failing closed on unknown, is S3.3.

FALSIFIERS

Nine tests. Four disable-runs, each verified red-then-green: as_u64
dropping the predicate; routing_prefix folding the object into the top
nibbles; from_le_bytes zeroing the predicate; new() ORing domain into
subject.

A fifth attempt came back GREEN and was not accepted as evidence. The
fold I first injected shifts only rightward, so the object never reaches
the 12 nibbles the assertion reads -- the disable was inert, not the test
vacuous. Proven arithmetically (both fixtures fold to 111133330000)
before re-running with a fold that binds, which goes red on the exact
message. The anchor assertion added after the last PR catches a disable
that does not APPLY; it cannot catch one that applies to the wrong bits.
That check is arithmetic, and it is now written down.

Gates: contract 1180/1180 (9 new) + all example suites; fmt clean; clippy
--all-targets --no-deps -D warnings clean; downstream planner Stage-2.6a
harness still 4/4.

Board: EPIPHANIES E-THE-LITERAL-CANNOT-LIVE-IN-THE-PATH-IT-ROOTS-1 and
E-A-DISABLE-THAT-DOES-NOT-BIND-IS-NOT-A-DISABLE-2; LATEST_STATE contract
inventory + the budget constraint; STATUS_BOARD S3.0..S3.9 with S3.0 in
PR and the four falsifiers it answers.
@cursor

cursor Bot commented Aug 20, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_5c3f651b-7c3f-41cd-ae50-d8d952e8510a)

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4c393df2-f02b-4036-8e31-74c4dd1d2e3b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

AdaWorldAPI pushed a commit that referenced this pull request Aug 20, 2026
…tion

Operator stopped the previous commit before merge. It retracted #973's
overclaim and then committed four of its own. All four are corrected here by
WITHDRAWING the type entirely; this commit adds no code.

1. WRONG UNIVERSALITY. `CausalLiteral`'s own test asserted TREATED_WITH,
   proving the structure is generic. ASSOCIATED_WITH / TREATED_WITH / CAUSES /
   MEDIATES / PART_OF are exact predicate identities over one generic literal
   substrate; causality is a predicate family, never universal identity.

2. 4xu16 IS NOT ABSOLUTE. MedCare-rs docs/ONTOLOGY_BAKE_STATE.md:182 states it
   plainly: real OBO ids run past u16 (MONDO:0700092 = 700,092). A u16 subject
   would have silently mis-addressed the largest ontology in the bake. The
   substrate already solved this with the V3 rail.

3. THE WORDNET CLAIM WAS INFLATED. #875 was cited as proving an EXACT
   structural encoding. Its own W5 gate reports 256/256 cells at occupancy
   median 255 over 65,292 leaves -- many-to-one by hundreds. What it measured
   is a taxonomy-informed HHTL locality/search prior (corr +0.494 vs -0.036
   shuffled; 24.71x out-of-cell band recall), never an identity encoding.
   Citing a measured result past its own Boundaries section is the #973 failure
   mode with the sign flipped, and it is easier to commit while correcting
   someone else.

4. routing_prefix() WAS UNEARNED. A lexicographic prefix over concatenated
   ordinals was labelled an HHTL locality/cohort projection with no consumer
   and no measurement that it preserves HHTL semantic locality.

The closing question, per the operator's rule: WHAT EXACT INFORMATION CANNOT BE
EXPRESSED BY THE ADDRESSING THAT ALREADY EXISTS? Nothing demonstrable.
identity_quad::IdentityQuad (operator-ratified 2026-08-17) already carries four
exact external identities as 4 x u24 in one 96-bit V3 facet behind a
classid(4), refuse-don't-truncate, resolving the crosswalk once at bake time.
It strictly dominates the withdrawn type. No falsifier => no new type. S3.0 is
closed as NOT-NEEDED rather than filled because the plan had a slot.

Separately surfaced, NOT fixed here: ClassId = u16 is near-exhausted for
RELATIONS (MedCare-rs CLAUDE.md #10) -- a classid-mint capacity question for
the operator, not something a literal type addresses.

The ladder matrix says the empty column is not ADDRESS but HYDRATED SoA for
Bible/Rosetta; the real next work is hydrate epistemic/causal nodes -> reason
over them -> think about the reasoning, gated by the DisMech oracle experiment.

Board: EPIPHANIES x4 (E-S3-0-NEEDED-NO-NEW-ADDRESS-1,
E-WORDNET-IS-A-LOCALITY-PRIOR-NOT-AN-IDENTITY-ENCODING-1,
E-NIBLEPATH-DEPTH-IS-NOT-HHTL-DIMENSIONALITY-1,
E-A-LOCAL-DERIVATION-CANNOT-OVERRULE-A-MEASURED-COUNTEREXAMPLE-1 with both
instances) + LATEST_STATE + STATUS_BOARD re-scope + the full audit.

Gates: zero code diff vs main; lance-graph-contract back to its 1171 baseline.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AZLe87ssKXGuXFbrmHdGnG
AdaWorldAPI pushed a commit that referenced this pull request Aug 21, 2026
Operator-directed audit, written BEFORE any replacement code. No code in
this commit by design -- the brief said stop and audit first, and what
the audit found changes the deliverable rather than refining it.

THE CLAIM THAT WAS WRONG

#973 measured (correctly) that domain+S+P+O = 4x u16 = 16 nibbles =
NiblePath::MAX_DEPTH, then concluded (incorrectly) that the exact literal
therefore cannot live in HHTL and identity must sit outside it. That
promoted a limit of ONE sequential representation into a limit of the
addressing substrate. Rejected.

THE EVIDENCE, AND IT WAS CLOSER THAN THE BRIEF ASSUMED

The brief named repo precedents. The sharpest item is nearer than that:

- rail_geometry.rs:55, in the SAME crate #973 edited, declares
  RAIL_MAX_DEPTH = 2 * RAIL_SLAB_LEVELS = 24, "a slab register plus its
  continuation", with RailCarving::AxisSlab { reg, cont: Option<usize> }.
  #973 read NiblePath::MAX_DEPTH from a different module and never
  consulted the type that owns the question.

- THIS SESSION had already measured and published the continuation, the
  day before, in its own words: "read() does exactly the concatenation --
  p[..12] from the slab, p[12..] from the continuation slab. So the
  logical DN across base+continuation already exists and is already
  assembled." Tasks "Zipper/DN precedent archaeology" and "Phase 1:
  logical DN across base+continuation", both completed, depths 16-18,
  parent() = truncation, ancestor() = prefix containment. #973 then
  asserted the opposite. That is not a forgotten precedent; it is a
  contradiction of an in-session measurement.

- facet.rs already codes the canonical tenant: FacetTier{lo,hi} +
  FacetCascade{facet_classid: u32, tiers: [FacetTier;6]} = 4+12 = 16 B,
  size-asserted, "ALWAYS 8:8; only the CONSUMER projects meaning".
  CascadeShape::{G6D2,G4D3,G3D4} is the re-carving algebra, byte-for-byte
  the same 12 units; G4D3 is the 4x24 reading.

- The primitive layer was declared complete in session: hi_chain/
  lo_chain, shared_prefix_tiles, row_match_mask, distance/group helpers
  -- "no missing HHTL operation and no reason to invent"; the split is
  already a no-op 2x 6x2x8bit cast.

- E-WORDNET-MAKES-THE-4-ARY-ADDRESS-SEMANTIC-1 (#875): a real taxonomy
  used AS the address, with W4 measuring 2.47 hops of structure the
  16-ary router is blind to. #876 is the paired caution about reporting
  an intake limit as a property of the address.

- OSM/WebMercator and Bible Rosetta: coordinate-plus-facets, shipped.
  MedCare-rs runs FMA anatomy (70k nodes, ~4M vertices) as HHTL at 4x24
  -- exactly the case a 16-nibble ceiling would have called impossible.

MORTON: THE SAME MISTAKE, MADE AGAIN INSIDE THE CORRECTION

An earlier draft of this audit reached for a Morton interleave as the
S3.0 locality view. The brief mentioned Morton ONLY to deny the premise
"Morton implies lossy". Turning a denied premise into a component to
build is a second instance of the failure being documented. Removed, and
recorded as such, with the rulings pinned: no SoA uses Morton for
identity, no NARS resides in Morton.

WHAT S3.0 BECOMES

Nothing needs minting. The exact literal (D,S,P,O) is a READING over the
canonical 6x2x8 facet tenant, using primitives that already exist, with
base+continuation for depth. A parallel 4x u16 container would have been
the ruling-E anti-pattern in a new costume.

Deliberately unanswered: which rails carry D/S/P/O. The canon assigns
tiers HEEL:HIP / TWIG:LEAF / family:identity and le-contract names L1
part_of:is_a, L2 memberof:members, L3 mereology:taxonomy, L4
palette256:palette256. Choosing a projection unilaterally is the exact
creative completion this audit exists to stop.

Recorded as E-A-LOCAL-DERIVATION-CANNOT-OVERRULE-A-MEASURED-COUNTEREXAMPLE-1;
E-THE-LITERAL-CANNOT-LIVE-IN-THE-PATH-IT-ROOTS-1 is retracted (it never
merged -- #973 closed unmerged -- so no board entry on main needs editing).
AdaWorldAPI added a commit that referenced this pull request Aug 21, 2026
#978)

* plan: DisMech x Causality-V3 rebase report — measured, no code

The report-before-code deliverable. Twelve sections, every number carrying the
command or file:line that produced it; anything not personally measured is
labelled "claimed, unverified".

Two findings correct the board itself, and both get their own entry:

E-HHTL-IS-MINTED-IN-THE-ARTIFACT-NOBODY-CITES-1 — the standing claim "HHTL is
zero on every baked row in both production bakes" is precise about the two
artifacts it names and silent about a third. Measured on the pinned bytes:
obo-core.soa 0/68,797, spine.soa 0/7,641, but all-lanes.soa 164,031/770,360
(21.29%), with MONDO/HPO/UBERON/PATO/ICD-10-GM/OMIM at 100%. Those are exactly
the namespaces a DisMech overlay grounds against, so HHTL is available or
unavailable depending on which artifact a reader names — a first-class design
decision, not a detail. The generalization error is the transferable part: two
citations counting the same 68,797 rows is ONE measurement reported twice.

E-THE-ORACLE-POPULATION-IS-64-PERCENT-AND-A-GATE-HARDCODES-THE-OTHER-36-1 —
only 2,449 of 3,825 INDIRECT_KNOWN_INTERMEDIATES edges actually name an
intermediate (three independent methods agree). The supervision corpus is
2,449 edges over 534 diseases, not 3,869; and 74 INDIRECT_UNKNOWN edges DO
name mediators, so they must leave any restraint control. The gate that should
have caught this asserts == 3.869 and cannot pass on any corpus revision; its
own rule is "stoppen und melden, nicht die Zahl anpassen", so this is the
report rather than an edit.

The structural headline: the substrate is read-rich and write-empty at four
independent layers — CE64 bits 53-63, CausalEdgeV3, CausalWitnessFacet and the
dismech_evidence module that landed yesterday — every one with rich read
machinery and zero production writers. Hence the sequencing rule in D-CV3-*:
the benchmark (0..2) must be green before a HoleV3 tenant (3) exists, or the
tenant becomes the fifth entry in that column.

Board hygiene in the same commit per the rule: plan file, INTEGRATION_PLANS
prepend, two EPIPHANIES entries, seven STATUS_BOARD rows.

* correct §8a: the cascade census measured the FALLBACK reading, not the preferred one

Operator: "Obo HHTL ist meines Wissens mit zipper bereits indirekt hydriert."
Verified — and the correction compounds the entry's own lesson.

rails::HhtlMode::of_row PREFERS the RailHead reading and falls back to Cascade
only when the rail register is empty. The report counted cascade tiers (bytes
4..10), i.e. the fallback path. Measured on the four Zipper rail registers
(rails.rs:130-147): MONDO 32,094/32,095, HPO 19,835/19,836, UBERON
14,973/14,975 plus 8,525 part_of (the only lane carrying mereology, matching
graph_feed.rs:730's "UBERON only"), PATO 1,886/1,887 — median logical-DN
depths 6/7/8/5, and 264 rows exceeding 12 levels so the continuation slab is
load-bearing rather than hypothetical.

obo-core.soa and spine.soa are zero on BOTH readings, so the original finding
holds for those two artifacts; it was simply not the whole hydration story.

New, and not visible from the cascade census: cascade and rail are INDEPENDENT.
Orphanet (14,063 cascade rows) and OMIM (18,712) carry zero Zipper DN, so a
consumer expecting prefix containment on a RailPath gets depth 0 there,
silently, while a HhtlMode consumer gets the cascade arm.

Consequence for the ladder: the HHTL rung is available at ~100% for
MONDO/HPO/UBERON/PATO via RailHead — precisely the namespaces DisMech grounds
against — and a ladder level must now declare its READING, not only its
artifact.

The two-reading design is operator-ruled: RAIL_OFFENE_POSTEN Posten 1,
ENTSCHIEDEN 2026-08-12, "Register als Zeuge", re-bake unblocked.

* Plan: alpha-channel rung overlay — the empty row of the thinking table

Scrapes an operator brainstorm onto homes that already exist. The Photoshop
alpha channel: an ephemeral layer over the ontology carrying the residue of a
search; rung levels 2-10 as layers; second-order thought at the SAME address
in a separate thinking table; a mask over activities; focus of attention.

That is exactly the one unfilled row of
hhtl-thinking-tables-le-contract-v1.md §2.3 -- "Rung ladder | (unassigned) |
unminted, undesigned" -- so the plan mints no new type and opens no new arc.

Six of nine pieces already exist or are planned, verified by reading each:

  PhaseCensus (kanban_actor)              the activity mask        SHIPPED
  five tactics + ReasoningGap (planner)   the elimination search   SHIPPED
  attention_mask.rs (shader-driver)       residue carrier?         UNAUDITED
  rung layers                             dialectic V3             planned
  64k parallel rungs                      dialectic V4             gated
  rung carve (two axes)                   HTT §3                   designed

The one genuinely missing primitive is RowFocusMask: named in STATUS_BOARD
S3.1b, absent from every crate (grep hits only the board and one handover).
D-ACR-1 is that primitive; everything else queues behind it, and D-ACR-0 is an
audit of attention_mask.rs BEFORE anything is built on a name that may not be
what it sounds like.

Two refusals, both citing where the same mistake was already made:

  No new address type. S3.0/PR #973 was closed at exactly this spot -- "CLOSED
  -- NOT NEEDED (use IdentityQuad / ClassAddr / V3 rail)", the ladder's empty
  column ruled to be HYDRATION, not ADDRESS. An overlay is hydration over
  addresses that exist.

  No CE64 bit. 59..63 is TRUTH_SHIFT + SPARE_SHIFT, and the reasoning band
  there is set ONLY by an explicit with_reasoning_band() call -- nothing
  derives it. An overlay must not become a fifth derivation path in.

The contamination boundary ("damit der Graph nicht von Patienten kontaminiert
wird") is not new machinery: it is one-writer-per-mailbox. The overlay's owner
is the session mailbox, so a patient-derived write to an ontology row has no
owner that could perform it. The invariant is one-directional -- the overlay
reads the graph, the graph never reads the overlay -- which is also what makes
the residue safe to discard whole: it records where attention went, it does
not cache derived truth, so dropping it costs a re-search and never a
correctness question.

Graded a pruner, never a proof -- the grade ONTOLOGY_BAKE_STATE.md already
gives HHTL. Nothing here claims the residue improves recall or finds needles;
the numbers that would justify the rest have to be measured after D-ACR-1.

Board hygiene in this same commit: INTEGRATION_PLANS prepended, STATUS_BOARD
D-ACR-0..5 rows.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan revision: two writers, witness-by-reference, the 59..63 axes, Rubicon

Four operator corrections to alpha-channel-rung-overlay-v1, each changing a
claim rather than adding to it.

1. TWO writers, not one. The first draft said "the overlay is a tenant whose
   owner is the session mailbox", singular -- that mistook one-writer-per-
   MAILBOX for one-writer overall. The design is two tables at the same
   addresses with two owners: the ontology thinking table (durable, shared,
   cacheable) and the session overlay (ephemeral, discardable). The rule
   applied twice, not weakened; the contamination guarantee is now structural
   in the table split instead of resting on a singular-owner assumption.

2. Thin rows, fat concepts, and where each is allowed. An atomic SoA row
   carries a concept BY REFERENCE; only a higher-order HHTL node materialises
   it, and only there may concepts stack. Measured, the carriers are already
   live across crates -- WitnessLens 11 files, WitnessTable 9, WitnessEntry 8
   -- and WitnessLens being a LENS is the point: the row borrows, it never owns
   a copy. WideFieldMask is the alternative when no concept needs naming at
   all: the field mask for thoughts.

3. What 59..63 grades, and what it does not. The operator's list -- episodic-
   witness basins, epistemic knowledge, causality, supporting causality, just
   related to -- is TWO orthogonal axes. Strength is already carried:
   ReasoningBand's Association/Relation/Causal are exactly "just related to" /
   "supporting causality" / "causality". Evidence KIND is not a strength at
   all, and CE64 has nowhere to put it (0 free bits; the board already counted
   this for awareness_state vs unknown_kind). So: the band GRADES, the witness
   reference DISCRIMINATES -- which carrier a row points at IS the kind axis,
   and item 2 is what makes that free. Three fences kept explicit, each because
   the opposite is the attractive move: nothing derives the band; ReasoningBand
   is never RungLevel; TrustTexture and CausalTopology are the same two bits
   read differently, so the reading must be named per (classid, rail).

4. Versioning is temporal. QueryReference::at(version, rung) exists
   (temporal.rs:188) and E-MARKOV-TEMPORAL-STREAM-1 already moved the
   trajectory onto the sorted stream. "Where did rung-n look" is a read at a
   version, never a stored history column -- the second reason the residue is
   discardable.

Plus two joins to work that already exists:

   The KJV gap (D-ACR-6) is BLOCKED, not merely unbuilt: prestaging its missing
   epistemic-causality nodes as episodic basins is HTT X3's Type-B promotion
   seam, and EpisodicBasins measures 2 files -- its own module and mod.rs. A
   promoted basin is a thinking-table row with no minted rail, so it sits
   behind the same mint decision as D-ACR-2.

   The Rubicon (D-ACR-8) closes an open checkbox in
   unified-soa-rubikon-integration-v1 ("Thinking styles <-> Rubikon"). What
   Heckhausen asserts about the crossing IS a claim about attention --
   deliberative mindset broad and impartial, implemental mindset narrow and
   shielding -- so a focus mask can falsify the phase labels themselves. Two-
   sided: broader in Planning than in CognitiveWork on a deliberated task, AND
   indistinguishable on a single-forced-candidate task, or the discriminator
   fires on everything. It READS; driving a phase transition from a focus
   reading would rebuild the scheduler
   E-PROGRESSION-IS-EXISTENCE-NOT-COMMAND-1 removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: ogar-loco as the recipe executor, and a window discrepancy I will not rule on

Operator: "ogar-loco kann jetzt die 34,36 nars recipes direkt verwenden und in
-220..0 ueber Revision die potholes und ggf reasoning with another style."

Both counts verified rather than accepted: recipe_dispatch::dispatch_order()
returns [u8; 34], and ThinkingStyle has exactly 36 variants. They are two
lists, not two names for one -- a style switch picks among 36, the 34 are what
a style runs.

recipe_dispatch already carries the pothole machinery, and the signature is the
tell: rung_delta() -> i16 is SIGNED, so a rung demotion is a first-class recipe
outcome rather than an error path -- exactly the "epistemic pothole -> rung
degradation -> revision" chain. And ladder(ctx) -> Vec<RecipeStep> already
returns a step sequence, which is what makes the loco join mechanism rather
than resemblance: one emits an ordered step list, the other executes ordered
(fn : value) calls over a 256-entry codebook. ladder()'s output IS a loco
program.

The wiring does NOT exist, and the plan says so plainly: grep over
OGAR/crates/ogar-loco/src for recipe|Recipe|nars|Nars returns no files. What is
true is that loco is domain-agnostic by design -- consumers implement
Vocabulary and mint ops above DOMAIN_FLOOR, as ogar-dismech did with SEARCH_OPS
0xA3..0xA9 -- so a recipe vocabulary is the natural next impl and it is
unbuilt. D-ACR-9.

Recorded as OPEN, not resolved: the -220..0 window contradicts
unified-soa-rubikon-integration-v1 §3, which states the Libet veto window as
-550..-200 and proposes stamping -200 000 us on Planning -> Prune. In the
classic paradigm the readiness potential begins around -550 and reported
awareness of the intention falls around -200, which would put a conscious veto
AFTER awareness -- the operator's interval -- since before it there is nothing
conscious to veto with. That favours the operator's reading and would make the
plan's -550..-200 the pre-awareness stretch instead. I am not ruling on it: I
have twice today asserted structure from memory and been wrong, and this is a
claim about an experimental paradigm rather than about this codebase. Whoever
answers should cite the source rather than recall it. D-ACR-9 waits on it --
a revision pass cannot be stamped into an interval two documents describe
differently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: the 34/31/14/5 ladder measured, MUL, and eigenvalue split in two

"5 oder 14" is settled, and both numbers are right for different criteria. The
count is written in recipe_kernels.rs itself: "Measured over the 34: no kernel
declares ThoughtField::Confidence in writes, and only 14 can move delta_conf --
while 31 are Operational. So maturity().is_production() is a far weaker
statement than 'this tactic can move the confidence number'."

  34/34  have a kernel        all_kernels() -> [&dyn Tactic; 34]
  31/34  self-declare Operational   (3 Demonstration: Are, Zcf, Hkf)
  14/34  can move delta_conf        <- the operator's 14
      5  route through real NARS truth functions

And the 5 are in a DIFFERENT CRATE, which is the structural half: 0 of the 34
contract kernels reference TruthValue at all. The truth algebra lives in
lance-graph-planner/src/nars/tactics.rs (33 uses: deduction 1, induction 1,
abduction 2, revise 2, analogy 2) -- the V1 five. There are two tactic
surfaces, and a plan saying "the 34 exist" without saying which invites
building on the wrong one.

The consequence is hard and now an acceptance condition on D-ACR-7: any
overlay deliverable that samples tactics filters on delta_conf CAPABILITY,
never on maturity(). The in-tree failure is already named --
E-A-WATCHER-THAT-CANNOT-DISSENT-IS-NOT-A-WATCHER-1, with the live instance
cited by codex on PR #971 (the newly-Operational Etd rewrites candidates and
returns 0.0 forever). §3b's grading axis is worthless if the tactics feeding it
cannot move a confidence number: the band would be set by unanimity among
mutes.

Self-correction in the same file: my previous commit claimed rung_delta() ->
i16 was "signed, so a negative delta is a rung demotion -- the pothole ->
degradation chain". False. The doc says escalation depth offset, Ded +1 through
Counterfactual +5 -- all five positive. i16 is a type width, not a semantic. I
inferred meaning from a type and pushed it. Same error class as the four this
arc is about.

Eigenvalue, split by the operator's follow-up into a strong half and a weak one:

  CONFIDENCE (strong, probe-ready). Dunning-Kruger operationalized rather than
  analogized: justified confidence moves under disconfirming evidence,
  overconfidence is a fixed point. §3g already measured part of that spectrum
  without naming it -- 20 of 34 tactics cannot move a confidence number, so
  their output is invariant by construction, eigenvalue exactly 1. A watcher
  that cannot dissent and a confidence that cannot be lowered are the same
  phenomenon at two levels. D-ACR-11 probes it two-sided.

  FREQUENCY (weak, stays CONJECTURE). "Tautology = fixed point of f" is
  metaphor until someone shows revision is linear enough for a spectrum to
  mean anything, and I-NOISE-FLOOR-JIRAK fences it: under weak dependence the
  naive statistical reading is wrong, and this is a statistical reading.

Also recorded: MUL over the rung layers as long-term WITHOUT a deliverable id,
because it depends on RowFocusMask, the 59..63 contract and the delta_conf
filter -- sequencing it first would wire a meta-layer onto an unpinned axis.
TrustTexture appearing on both sides (MUL output, and one of two 2-bit readings
of 59..60) is exactly why the per-(classid, rail) reading fence is
load-bearing. And temporal.rs as a hindsight filter (D-ACR-10), which is the
board's own first_possible vs first_derived (S3.8) using a shipped primitive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Fix: contamination invariant is information-flow, not write-authorization

CodeRabbit review on lance-graph#978 caught a real gap: two mailbox owners
writing two separate tables proves the session mailbox cannot DIRECTLY
mutate an ontology row. It does not prove a session-derived VALUE can't be
handed to the ontology-mailbox owner, who then writes it as its own act --
mailbox ownership is a write-authorization boundary, the plan's actual claim
is an information-flow boundary, and a correct authorization check can sit
downstream of a completed contamination.

Corrected in place (not deleted -- CodeRabbit's finding stays visible at the
point it applies) and D-ACR-3 rewritten to match: the test must show no
ontology-owned write traces to a patient-tagged read through ANY call path,
not merely that the session mailbox can't author the write.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Fix: three unrelated witness surfaces conflated as one family in §3a

Operator: "Episodic basins sind in KJV Bible und AriGraph crate
episodicwitness V3 vs epistemic witness causality witness" -- the plan's
witness table lumped WitnessLens/WitnessTable/WitnessEntry, CausalWitnessFacet,
and EpisodicBasins together as one measured family. They are three unrelated
surfaces plus one that does not exist as code:

  CausalWitnessFacet: 18 files, HEAVILY consumed (lance-graph-planner's
  meta_basin/style_strategy/dispatch_guard, deepnsm-v2's versioned event
  window). My previous entry cited the CV3 rebase report's "write-empty"
  finding against THIS type. Wrong target -- it is the opposite, the
  most-consumed witness type measured. A 12-byte register of loci offsets,
  never episodic memory.

  EpisodicWitness64: 0 files. soa_view.rs:272 states it plainly -- "is NOT
  YET a code symbol (a queued design)". This is the type the write-empty
  finding actually belongs to, and it is the one "episodic witness" should
  mean when talking about AriGraph promoted to the hot path -- its own
  comment: "EpisodicWitness64 IS AriGraph living in the mailbox SoA view."
  E-ARIGRAPH-IS-AN-ISLAND names the gap directly.

  EpisodicBasins: 2 files, X3 already confirmed (definition + mod.rs only).

Verified bible_wave.rs touches NONE of the four -- its imports are entirely
internal to deepnsm_v2. Section 3d's citation of it as "the whole-book
falsifier" for basin prestaging was therefore wrong and is corrected: it
falsifies HHTL cascade coverage, not basin promotion.

Second operator correction folded in: "Bei KJV sind episodicwitness als fat
concepts in den SoA" -- read as the design hazard for whoever builds D-ACR-6,
not a bug report on bible_wave.rs today, whose own Spo struct (three u16
WordId indices into the shared codebook, TemporalStream = Vec<(u64, Spo)>)
is already the reference-shaped model to replicate. The fat-concept failure
arrives at the PROMOTION step: a basin row must stay index-width, content
reached only by following references into the triple stream and vocab --
the same test WitnessLens already passes. D-ACR-6's acceptance criterion
extended to say so explicitly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: rail ancestry as epistemic inheritance (D-ACR-12), KJV is a different mechanism, four nibble homonyms disambiguated

Operator: "Die Idee wie gesagt HHTL nodes als Meta Verbindung in eigene SOA
zu materialisieren. Das was bei Ontologien ueber rails bereits implicit ist.
Aber die Vererbung fehlt (unsere Aufgabe, epistemic knowledge from
parents)."

Verified the missing primitive precisely. NiblePath::parent() (hhtl.rs:155)
has ZERO callers anywhere in the tree -- grepped every .parent() call site;
the only real hits are std::path::Path (unrelated) and
holograph::dn_sparse::DottedName's own parent/ancestor/ancestors on a
DIFFERENT type, real prior art for the shape (an O(depth) ascent loop, no
scanning) but not shared code. is_ancestor_of (hhtl.rs:176) is the only
consumer-facing use of ancestry today and it only answers yes/no -- never
"what does the nearest ancestor with content know," which is the actual
missing inheritance. New section §3k writes that lookup as an ascent-with-
early-exit over parent(), and states precisely why it belongs in its OWN
SoA rather than touching ontology rows: the lookup reads only the KEY (zero
value decode, per the canon's own P0), and the materialized result is
(source_addr, resolved_addr, hop_distance) -- a reference per §3a's
discipline, never a copy of the ancestor's content. D-ACR-12, gated on
D-ACR-1 so the ascent path is itself recordable as an overlay trace, with a
two-sided falsifier: a childless-witness node resolves to its nearest
ancestor at the correct hop count, AND a node with its own witness never
ascends past it (an eager-ascent bug would silently prefer stale ancestor
knowledge over fresh local knowledge).

Second correction, and it's a scope split, not an addition: "Bei der Bibel
muessen dagegen erst die episodic arc generiert werden und die lenses
Gadamer Horizontverschmelzung usw erkennen dann logische Verknuepfungen" /
"Hermeneutik als logische Verknuepfungen" / "muss ggf als causality
mechanical drin stehen." KJV is NOT a rail-ancestry problem -- a book has no
taxonomy to ascend, its causal nodes have to be GENERATED by reading the
text, not inherited. And the generation mechanism turns out to be shipped,
not a gap: bible_wave.rs's own comment states the seam (stance::stream()
needs verse TEXT, 3 of 4 stances measured UNREACHABLE from triples alone,
text now emitted as its own artifact for exactly that reason);
nars::stance::stream()'s ReadOut::impls: Vec<(String, u16, u16)> is
literally "causal edges observed from because-cued text, as (verse, cause,
effect)" -- hermeneutics AS mechanical causality, already the type, not a
metaphor needing translation; and Horizontverschmelzung is not a design, it
is D-BLW-3, SHIPPED + MEASURED 2026-08-04 (blw_fusion.rs), whose own KILL
condition ("flat kappa regrades the claim to four independent stance reads
-- not Gadamer") did not fire. No new deliverable opened for KJV
hermeneutics; §3d corrected to say why, and D-ACR-6 confirmed scoped to the
promotion-format question alone, which does not apply to stance::stream()'s
already-triple-width output.

Third correction, caught before it could contaminate D-ACR-12: "Nibble ist
in grammar heuristics Relativpronomen anaphora pointers und tekamolo" / "Aber
nibble als Morton waere ein parallel Universum." Verified FOUR unrelated
4-bit encodings share the word "nibble" in this tree: NiblePath's absolute
16-nibble tree address (what D-ACR-12 actually uses); edge_v3.rs's anaphora
nibble, one signed i4 RELATIVE coreference offset at byte [6] low
(E-NIBBLE-ANAPHORA-EDGE-1, pronoun-to-referent, nothing to do with a tree);
the TEKAMOLO carving at bytes [10..12], reserved/dormant grammar role slots;
and Facet::morton(), explicitly ruled non-canonical by HTT's own X2 ("nothing
in the HHTL contract depends on it"). A disambiguation table now sits inside
§3k precisely so D-ACR-12 cannot accidentally become morton()'s second
consumer or get confused with the anaphora/TEKAMOLO grammar layer -- same
discipline §3a already had to apply to four unrelated "witness" surfaces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: D-ACR-12 corrected to the mask-native bulk-frontier pattern (lance-graph-java precedent)

Operator: "Schau Mal in den session transcripts wir wir es in
lance-graph-java geloest haben. Where ueber ABI shaped substrate als masking
method."

Verified in the sibling repo, not recalled: View.where() accumulates
Predicate descriptors with ZERO membrane crossings (Predicate.java's own doc
comment names the rejected alternative -- a java.util.function.Predicate<Row>
-- as "catastrophic: 64,000 objects and 64,000 crossings for 64,000
entities"); only a terminal op marshals the whole chain into one array for
ONE fused native kernel. And RowStore.hop() (measured, pinned by
GraphHopTest, 2026-08-18): "Two native crossings, flat ... never per-row,
never per-frontier-size" -- the CLAUDE.md invariant verbatim, "hop may look
like hop; it must execute as Mask x ClassView/WideFieldMask -> Mask."

D-ACR-12's prior pseudocode (an ascent loop over ONE address, hop by hop) was
exactly the per-row-crossing shape that repo's own docs call out as the
mistake. Corrected to the bulk shape: resolve the WHOLE frontier of
childless-witness rows in lockstep, one hop per ROUND over all of them at
once, composed from kernels already shipped in kernels.rs
(simd_mask_or_assign, simd_mask_andnot) -- the hop number becomes the
hop-distance column for free.

Scoped carefully, per this session's own recurring lesson: the pattern
transfers, not the code. NiblePath and RowStore's EdgeBlock facets are
different substrates (this repo's HHTL tree address vs lgj-abi's row-store
edges) -- D-ACR-12 does not claim hop() already operates on NiblePath
ancestry, only that it must adopt the SAME bulk-over-frontier discipline.
Falsifier gained a third condition: resolution cost must scale with tree
DEPTH (bulk rounds), never with population size.

Closing tie-back, operator-confirmed real rather than decorative: "Das
verbessert vieles von den Morton falsch abgebogenen." D-HTT-6 (withdrawn)
would have derived parenthood from morton() coordinate arithmetic directly;
D-ACR-12 gets the SAME question -- who is the ancestor -- right on both axes
that withdrawal separated: prefix containment for the address, bulk mask
algebra for the execution.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: brutal-honesty audit of book-hydration-as-precondition + episodic/epistemic ratification + pothole-vocabulary resolution + explicit-masking governing choice

Operator: "Lass mal brutal sein und in ogar-loco die Hydrierung von Knoten
bei Buechern als fest maskierte awareness mit kanban_actor ueber HHTL
masking. Dann kann die Massen-Hydrierung als Voraussetzung fuer
higher-order thinking fest geprueft werden."

Checked three places rather than designing on assumption, all confirmed
empty: ogar-loco (grepped hydrat|awareness|precondition|gate across all 8
source files -- zero hits beyond an unrelated RefusalGate telemetry enum);
kanban_actor::PhaseCensus (a bare `counts: [usize; 6]` tally, no hydration
concept); and "hydration" itself is a THIRD homonym collision this session
(bake_hydrate's boot-time fetch / lance-graph-ontology's format PARSERS /
helix's mu-hydration 3DGS gaussian-splat probe -- none the operator's
concept). Nearest real precedent, E-FOVEATED-AWARENESS-1 +
self_directed_graph.rs, is downstream of the question (replay-index /
write-back gating), not upstream of it (population-readiness checking).

Then the operator supplied the actual design before this landed as
"NOT DESIGNED": "Brutal heisst, bevor wir ueber das Buch nachdenken wird
ein Inhaltsverzeichnis als HHTL-Baum mit SoA-Knoten erstellt." A table of
contents IS a tree's own enumeration -- book/chapter/section/verse mints
one NiblePath + SoA row per level, unconditionally, before content
ingestion. The precondition check falls out of D-ACR-12's own bulk-ascent
loop run as a COVERAGE query: every leaf resolves before max_hops, zero
stuck in frontier, or it's a hard refusal (same fail-closed posture as
predicate_domains.tsv / RefusalGate). D-ACR-13 redesigned as two ordered
steps: TOC-mint, then coverage gate = D-ACR-12 reused.

Continuation checked piece by piece, not assumed to be one gap: cartography
("Danach laeuft eine feste Kartographie der Mindmap") found holograph::
mindmap.rs -- real, rich API (add_node/connect/bfs/pagerank/
spread_activation), EXISTS-UNCALLED, with a known mxv-mutability bug flagged
by a sibling file. Rung-dependency reasoning ("Dann reasoning ueber rung
Stufen mit dependency graph") found WorkflowDAG (planner strategy #12) is a
registered STUB -- plan()'s body is literally the spec as comments, not
code. Nested kanban cascade genuinely absent, zero hits, same honest-empty
grade as D-ACR-13's first draft.

Then corrected on operator challenge: "Holograph hat meines Erachtens
nichts mit SoA zu tun." Verified empirically -- holograph's Cargo.toml deps
are Arrow/DataFusion/Lance, it imports NONE of canonical_node/SoaEnvelope/
MailboxSoA/ClassView, and its only consumers (bgz-tensor,
lance-graph-cognitive) are not the SoA/mailbox substrate either. Split
D-ACR-14 into D-ACR-14a (fix mindmap.rs's bug on its own holograph-local
terms) and D-ACR-14b (a NEW cartography pass built fresh on SoA, not
designed) -- the original wording implied a bridge between the two trees
that does not exist.

Two more corrections in §3b, closing threads from earlier this session:

  Episodic vs epistemic ("die Abhaengigkeit, wann wird episodic zu
  epistemic") is already RATIFIED, not a design gap -- EPIPHANIES.md:5194,
  with a live example in this plan's own KJV territory
  (E-WHOLE-BOOK-REASONING-RUN-1: is_a(god,light) stores episodic adjacency
  wearing epistemic inheritance's label). D-ACR-12 checked against it and
  confirmed on the right side: it ascends a TAXONOMIC is_a/part_of tree
  (genuine epistemic grounding by definition), never temporal/witness
  proximity. Falsifier gained a fourth condition naming the trap explicitly.

  The pothole-mechanism vocabulary ("potholes als 59..63 using deduction
  extrapolation syllogism counterfactual synthesis inference induction")
  does not get a new field. It collides with RecipeInference, already
  shipped 13 bits away at inference_mantissa (CE64 46-49) -- 5 of 7 words
  map directly. And it is NOT bgz-tensor's Zipper7LevelDescriptor despite
  the shared "7": verified the zipper's 7 is discrete MAGNITUDE levels
  (-3..+3) per continuous embedding sample, not a category count -- a fifth
  same-shaped homonym trap this session (after witness x4, nibble x4).

Finally, a governing choice for the whole plan, operator-stated: "Wenn du
spaeter in die Verlegenheit kommst VSA-Masken fuer cascading rung awareness
zu erstellen, koennen wir darueber sprechen. Aber ich waere fuer explizite
masking ABI traversal wie bei java. Sonst verwaessern wir unsere
Architektur." Recorded in §3k: every cascading/rung-awareness mechanism in
this plan defaults to the explicit Mask x ClassView/WideFieldMask -> Mask
pattern, never Vsa16kF32 bundling -- a scoping choice, not a contradiction
of I-VSA-IDENTITIES, which keeps its own narrow niche unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: EpisodicEdges64 mint (ValueTenant=17) closes the 64k-parallel hydration pipeline end to end

Operator: "Du hast 64k thoughts in parallel, du musst also nur einen Plan an
64k SoA ausliefern. Die schreiben dann ihr Ergebnis in den tenant. Du liest
den episodicwitness tenant aus und hydrierst daraus die witness arc facet
rails fuer HHTL."

First had to resolve which type this is, and got it wrong once mid-thread
before the operator corrected it. Checked ValueTenant's full enum: 14 =
CausalWitness (EXPERIMENTAL, the actual mounted "witness arc facet rail" --
24 signed i4 loci read as G24N4). Then found episodic_edges.rs -- a real,
10-consumer type ((family,local) nibble-encoded edge refs, grounded by
locality probe #444, added 2026-07-23) -- and initially hedged about
whether it was the same thing soa_view.rs's "EpisodicWitness64 is NOT YET a
code symbol" comment (last touched 2026-08-04) was describing.

Operator closed it directly: "Episodic edges = nibbles. Episodic Witness
[war] vorbelastet, weil es frueher den CausalEdge64 vom Witness fett
kopiert hat. Jetzt koennen wir die Vorbelastung ignorieren." The comment in
soa_view.rs names an earlier, abandoned witness-copy design;
EpisodicEdges64's nibble-(family,local) encoding is what actually shipped
instead. No identity question left -- the one real gap is mechanical: zero
ValueTenant mount.

Verified rather than assumed that this mount is a real, named, awaited gap
and not invented: .claude/v3/MODULE-TABLE.md line 167 already classifies
episodic_edges.rs "W1 envelope/ownership (SoA edge column)" and confirms it
is already byte-ready (to/from_le_bytes, write_le/read_le, to_u64/from_u64).
Stronger: a DIFFERENT module's own doc comment (markov_soa.rs, line 48)
says plainly -- "truly-correct home is still inside the EW64-in-SoA seam" --
already staged elsewhere, waiting for exactly this mount.

Slot number checked, not assumed: ValueTenant=15 is ALREADY reserved by
BoardAggregates (dismech-causality-v3-v1.md:497, "HoleV3 as ValueTenant=16
(BoardAggregates already reserves 15)") and 16 is HoleV3 itself (D-CV3-3,
queued). Almost minted into 15 before checking. ValueTenant::EpisodicEdges
= 17, additive, reserve-don't-reclaim.

This closes the full pipeline the operator specified across several
messages, three stages: (1) dispatch one plan to the 64k-thought SoA field;
(2) each worker writes into ValueTenant::EpisodicEdges at its own row --
EpisodicEdges64's own shape is a 4-slot MRU promote/evict tier, so this is a
bounded hot-tier write, never a growing list -- and cartography is a
byproduct of these writes rather than a separate pass ("die nodes erstellen
die Kartographie"), folding the former D-ACR-14b into this step; (3) a read
pass hydrates CausalWitness=14's facet rail via D-ACR-12's bulk-ascent loop,
whose resolved==all-leaves output IS D-ACR-13's coverage gate, and
higher-order reasoning is strictly downstream of that gate passing ("das
reasoning higher order ist dann nachgelagert").

D-ACR-17 (the mint) gates D-ACR-13's write stage -- nothing to write into
until the slot exists. Sequencing corrected: D-ACR-17 -> D-ACR-13 (folding
former D-ACR-14b) -> D-ACR-15.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: reading-without-hindsight is a QueryReference::at binding on D-ACR-15, not a DeepNSM-v2 scope extension

Operator: "Die Frage ist nur ob wir DeepNSM-v2 durch thinking styles und
epistemic potholes und CE64 59..63 erweitern, dass Lesen bereits ein
intellektuelles Erlebnis ohne hindsight knowledge eigenvalue wird."

Answered directly rather than fact-checked, because it's a genuine scope
question, not a claim to verify: no. Extending deepnsm-v2 with thinking
styles/potholes/CE64 grading would reverse
E-DEEPNSM-V2-IS-INBOUND-LEG-REASONING-LIVES-IN-LANCE-GRAPH-1, which this
plan's own §3d already cites approvingly ("this leg emits text, it does not
reason over it").

The actual mechanism the operator wants -- reading without retroactive
knowledge contaminating an earlier point -- already exists, unbuilt but
fully specified: first_possible vs first_derived (board S3.8), which §3i
already named as a primitive but only as a post-hoc audit filter. Sharpened
here to a LIVE binding: each reasoning step at verse v is bound to
QueryReference::at(v, rung), never the fully-hydrated end state. Landed as
an added constraint on D-ACR-15 (once WorkflowDAG::plan() is real) rather
than a new deepnsm-v2 responsibility -- gives S3.8 an actual live consumer
instead of leaving it an audit-only board line. Acceptance condition
extended to a two-sided version-sensitivity test: a node's conclusion must
change when a later version feeds in and must NOT change when only earlier
versions do.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* alpha-channel plan: §3p — the epistemic pothole as reading suspense

Operator: "Das Wissen und Nicht-Wissen beim Lesen. Das epistemic
knowledge pothole als 'binge reading' forward suspense."

Names the mechanism already specified in §3o (QueryReference::at
horizon) and §3i (hindsight/eigenvalue filters) as the reader's actual
open/close experience: a staged claim with RecipeInference::Revision
pending IS an open forward hypothesis; TruthValue::revise firing on a
later verse's because-cue (stance.rs) is the suspense resolving. No
new primitive, no new CE64 bit, no new deliverable — sharpens
D-ACR-10's falsifier to measure the pothole-open SPAN (first_possible
to Revision-close) rather than only the existing derivable-at-every-
version boolean, so a probe that closes every pothole on the verse it
opened (instant lookup wearing NARS's vocabulary) fails the same way
E-A-WATCHER-THAT-CANNOT-DISSENT-IS-NOT-A-WATCHER-1 already fails a
guard that cannot dissent.

* Fix 4 codex P2 findings on PR #978

- STATUS_BOARD.md D-ACR-3: matched the plan's own corrected wording
  (any call path, not just direct write-authorization) — the board
  row still described the withdrawn narrower test.
- dismech-causality-v3-v1.md:369: dropped the false "unavailable
  regardless" for Orphanet/OMIM — HhtlMode falls back to Cascade
  when RailHead is empty and both lanes have full cascade coverage
  (14,063/14,063 and 18,712/18,712); only RailPath prefix
  containment is genuinely unavailable there.
- alpha-channel-rung-overlay-v1.md D-ACR-13: the row said NOT
  DESIGNED while §3l/§3n (and the ordering sentence directly below
  the table) already specify its two steps and dispatch/write/
  hydrate/gate pipeline — self-contradictory, corrected to DESIGNED,
  not built.
- dismech-causality-v3-v1.md D-CV3-3: HoleV3=16 assumed
  BoardAggregates=15 was already settled; it is only a gated
  reservation with open width. Added the BoardAggregates mint as an
  explicit prerequisite (contiguous-discriminant requirement), not
  merely implied by the benchmark gate.

---------

Co-authored-by: Claude <noreply@anthropic.com>
AdaWorldAPI added a commit that referenced this pull request Aug 21, 2026
* plan: DisMech x Causality-V3 rebase report — measured, no code

The report-before-code deliverable. Twelve sections, every number carrying the
command or file:line that produced it; anything not personally measured is
labelled "claimed, unverified".

Two findings correct the board itself, and both get their own entry:

E-HHTL-IS-MINTED-IN-THE-ARTIFACT-NOBODY-CITES-1 — the standing claim "HHTL is
zero on every baked row in both production bakes" is precise about the two
artifacts it names and silent about a third. Measured on the pinned bytes:
obo-core.soa 0/68,797, spine.soa 0/7,641, but all-lanes.soa 164,031/770,360
(21.29%), with MONDO/HPO/UBERON/PATO/ICD-10-GM/OMIM at 100%. Those are exactly
the namespaces a DisMech overlay grounds against, so HHTL is available or
unavailable depending on which artifact a reader names — a first-class design
decision, not a detail. The generalization error is the transferable part: two
citations counting the same 68,797 rows is ONE measurement reported twice.

E-THE-ORACLE-POPULATION-IS-64-PERCENT-AND-A-GATE-HARDCODES-THE-OTHER-36-1 —
only 2,449 of 3,825 INDIRECT_KNOWN_INTERMEDIATES edges actually name an
intermediate (three independent methods agree). The supervision corpus is
2,449 edges over 534 diseases, not 3,869; and 74 INDIRECT_UNKNOWN edges DO
name mediators, so they must leave any restraint control. The gate that should
have caught this asserts == 3.869 and cannot pass on any corpus revision; its
own rule is "stoppen und melden, nicht die Zahl anpassen", so this is the
report rather than an edit.

The structural headline: the substrate is read-rich and write-empty at four
independent layers — CE64 bits 53-63, CausalEdgeV3, CausalWitnessFacet and the
dismech_evidence module that landed yesterday — every one with rich read
machinery and zero production writers. Hence the sequencing rule in D-CV3-*:
the benchmark (0..2) must be green before a HoleV3 tenant (3) exists, or the
tenant becomes the fifth entry in that column.

Board hygiene in the same commit per the rule: plan file, INTEGRATION_PLANS
prepend, two EPIPHANIES entries, seven STATUS_BOARD rows.

* correct §8a: the cascade census measured the FALLBACK reading, not the preferred one

Operator: "Obo HHTL ist meines Wissens mit zipper bereits indirekt hydriert."
Verified — and the correction compounds the entry's own lesson.

rails::HhtlMode::of_row PREFERS the RailHead reading and falls back to Cascade
only when the rail register is empty. The report counted cascade tiers (bytes
4..10), i.e. the fallback path. Measured on the four Zipper rail registers
(rails.rs:130-147): MONDO 32,094/32,095, HPO 19,835/19,836, UBERON
14,973/14,975 plus 8,525 part_of (the only lane carrying mereology, matching
graph_feed.rs:730's "UBERON only"), PATO 1,886/1,887 — median logical-DN
depths 6/7/8/5, and 264 rows exceeding 12 levels so the continuation slab is
load-bearing rather than hypothetical.

obo-core.soa and spine.soa are zero on BOTH readings, so the original finding
holds for those two artifacts; it was simply not the whole hydration story.

New, and not visible from the cascade census: cascade and rail are INDEPENDENT.
Orphanet (14,063 cascade rows) and OMIM (18,712) carry zero Zipper DN, so a
consumer expecting prefix containment on a RailPath gets depth 0 there,
silently, while a HhtlMode consumer gets the cascade arm.

Consequence for the ladder: the HHTL rung is available at ~100% for
MONDO/HPO/UBERON/PATO via RailHead — precisely the namespaces DisMech grounds
against — and a ladder level must now declare its READING, not only its
artifact.

The two-reading design is operator-ruled: RAIL_OFFENE_POSTEN Posten 1,
ENTSCHIEDEN 2026-08-12, "Register als Zeuge", re-bake unblocked.

* Plan: alpha-channel rung overlay — the empty row of the thinking table

Scrapes an operator brainstorm onto homes that already exist. The Photoshop
alpha channel: an ephemeral layer over the ontology carrying the residue of a
search; rung levels 2-10 as layers; second-order thought at the SAME address
in a separate thinking table; a mask over activities; focus of attention.

That is exactly the one unfilled row of
hhtl-thinking-tables-le-contract-v1.md §2.3 -- "Rung ladder | (unassigned) |
unminted, undesigned" -- so the plan mints no new type and opens no new arc.

Six of nine pieces already exist or are planned, verified by reading each:

  PhaseCensus (kanban_actor)              the activity mask        SHIPPED
  five tactics + ReasoningGap (planner)   the elimination search   SHIPPED
  attention_mask.rs (shader-driver)       residue carrier?         UNAUDITED
  rung layers                             dialectic V3             planned
  64k parallel rungs                      dialectic V4             gated
  rung carve (two axes)                   HTT §3                   designed

The one genuinely missing primitive is RowFocusMask: named in STATUS_BOARD
S3.1b, absent from every crate (grep hits only the board and one handover).
D-ACR-1 is that primitive; everything else queues behind it, and D-ACR-0 is an
audit of attention_mask.rs BEFORE anything is built on a name that may not be
what it sounds like.

Two refusals, both citing where the same mistake was already made:

  No new address type. S3.0/PR #973 was closed at exactly this spot -- "CLOSED
  -- NOT NEEDED (use IdentityQuad / ClassAddr / V3 rail)", the ladder's empty
  column ruled to be HYDRATION, not ADDRESS. An overlay is hydration over
  addresses that exist.

  No CE64 bit. 59..63 is TRUTH_SHIFT + SPARE_SHIFT, and the reasoning band
  there is set ONLY by an explicit with_reasoning_band() call -- nothing
  derives it. An overlay must not become a fifth derivation path in.

The contamination boundary ("damit der Graph nicht von Patienten kontaminiert
wird") is not new machinery: it is one-writer-per-mailbox. The overlay's owner
is the session mailbox, so a patient-derived write to an ontology row has no
owner that could perform it. The invariant is one-directional -- the overlay
reads the graph, the graph never reads the overlay -- which is also what makes
the residue safe to discard whole: it records where attention went, it does
not cache derived truth, so dropping it costs a re-search and never a
correctness question.

Graded a pruner, never a proof -- the grade ONTOLOGY_BAKE_STATE.md already
gives HHTL. Nothing here claims the residue improves recall or finds needles;
the numbers that would justify the rest have to be measured after D-ACR-1.

Board hygiene in this same commit: INTEGRATION_PLANS prepended, STATUS_BOARD
D-ACR-0..5 rows.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan revision: two writers, witness-by-reference, the 59..63 axes, Rubicon

Four operator corrections to alpha-channel-rung-overlay-v1, each changing a
claim rather than adding to it.

1. TWO writers, not one. The first draft said "the overlay is a tenant whose
   owner is the session mailbox", singular -- that mistook one-writer-per-
   MAILBOX for one-writer overall. The design is two tables at the same
   addresses with two owners: the ontology thinking table (durable, shared,
   cacheable) and the session overlay (ephemeral, discardable). The rule
   applied twice, not weakened; the contamination guarantee is now structural
   in the table split instead of resting on a singular-owner assumption.

2. Thin rows, fat concepts, and where each is allowed. An atomic SoA row
   carries a concept BY REFERENCE; only a higher-order HHTL node materialises
   it, and only there may concepts stack. Measured, the carriers are already
   live across crates -- WitnessLens 11 files, WitnessTable 9, WitnessEntry 8
   -- and WitnessLens being a LENS is the point: the row borrows, it never owns
   a copy. WideFieldMask is the alternative when no concept needs naming at
   all: the field mask for thoughts.

3. What 59..63 grades, and what it does not. The operator's list -- episodic-
   witness basins, epistemic knowledge, causality, supporting causality, just
   related to -- is TWO orthogonal axes. Strength is already carried:
   ReasoningBand's Association/Relation/Causal are exactly "just related to" /
   "supporting causality" / "causality". Evidence KIND is not a strength at
   all, and CE64 has nowhere to put it (0 free bits; the board already counted
   this for awareness_state vs unknown_kind). So: the band GRADES, the witness
   reference DISCRIMINATES -- which carrier a row points at IS the kind axis,
   and item 2 is what makes that free. Three fences kept explicit, each because
   the opposite is the attractive move: nothing derives the band; ReasoningBand
   is never RungLevel; TrustTexture and CausalTopology are the same two bits
   read differently, so the reading must be named per (classid, rail).

4. Versioning is temporal. QueryReference::at(version, rung) exists
   (temporal.rs:188) and E-MARKOV-TEMPORAL-STREAM-1 already moved the
   trajectory onto the sorted stream. "Where did rung-n look" is a read at a
   version, never a stored history column -- the second reason the residue is
   discardable.

Plus two joins to work that already exists:

   The KJV gap (D-ACR-6) is BLOCKED, not merely unbuilt: prestaging its missing
   epistemic-causality nodes as episodic basins is HTT X3's Type-B promotion
   seam, and EpisodicBasins measures 2 files -- its own module and mod.rs. A
   promoted basin is a thinking-table row with no minted rail, so it sits
   behind the same mint decision as D-ACR-2.

   The Rubicon (D-ACR-8) closes an open checkbox in
   unified-soa-rubikon-integration-v1 ("Thinking styles <-> Rubikon"). What
   Heckhausen asserts about the crossing IS a claim about attention --
   deliberative mindset broad and impartial, implemental mindset narrow and
   shielding -- so a focus mask can falsify the phase labels themselves. Two-
   sided: broader in Planning than in CognitiveWork on a deliberated task, AND
   indistinguishable on a single-forced-candidate task, or the discriminator
   fires on everything. It READS; driving a phase transition from a focus
   reading would rebuild the scheduler
   E-PROGRESSION-IS-EXISTENCE-NOT-COMMAND-1 removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: ogar-loco as the recipe executor, and a window discrepancy I will not rule on

Operator: "ogar-loco kann jetzt die 34,36 nars recipes direkt verwenden und in
-220..0 ueber Revision die potholes und ggf reasoning with another style."

Both counts verified rather than accepted: recipe_dispatch::dispatch_order()
returns [u8; 34], and ThinkingStyle has exactly 36 variants. They are two
lists, not two names for one -- a style switch picks among 36, the 34 are what
a style runs.

recipe_dispatch already carries the pothole machinery, and the signature is the
tell: rung_delta() -> i16 is SIGNED, so a rung demotion is a first-class recipe
outcome rather than an error path -- exactly the "epistemic pothole -> rung
degradation -> revision" chain. And ladder(ctx) -> Vec<RecipeStep> already
returns a step sequence, which is what makes the loco join mechanism rather
than resemblance: one emits an ordered step list, the other executes ordered
(fn : value) calls over a 256-entry codebook. ladder()'s output IS a loco
program.

The wiring does NOT exist, and the plan says so plainly: grep over
OGAR/crates/ogar-loco/src for recipe|Recipe|nars|Nars returns no files. What is
true is that loco is domain-agnostic by design -- consumers implement
Vocabulary and mint ops above DOMAIN_FLOOR, as ogar-dismech did with SEARCH_OPS
0xA3..0xA9 -- so a recipe vocabulary is the natural next impl and it is
unbuilt. D-ACR-9.

Recorded as OPEN, not resolved: the -220..0 window contradicts
unified-soa-rubikon-integration-v1 §3, which states the Libet veto window as
-550..-200 and proposes stamping -200 000 us on Planning -> Prune. In the
classic paradigm the readiness potential begins around -550 and reported
awareness of the intention falls around -200, which would put a conscious veto
AFTER awareness -- the operator's interval -- since before it there is nothing
conscious to veto with. That favours the operator's reading and would make the
plan's -550..-200 the pre-awareness stretch instead. I am not ruling on it: I
have twice today asserted structure from memory and been wrong, and this is a
claim about an experimental paradigm rather than about this codebase. Whoever
answers should cite the source rather than recall it. D-ACR-9 waits on it --
a revision pass cannot be stamped into an interval two documents describe
differently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: the 34/31/14/5 ladder measured, MUL, and eigenvalue split in two

"5 oder 14" is settled, and both numbers are right for different criteria. The
count is written in recipe_kernels.rs itself: "Measured over the 34: no kernel
declares ThoughtField::Confidence in writes, and only 14 can move delta_conf --
while 31 are Operational. So maturity().is_production() is a far weaker
statement than 'this tactic can move the confidence number'."

  34/34  have a kernel        all_kernels() -> [&dyn Tactic; 34]
  31/34  self-declare Operational   (3 Demonstration: Are, Zcf, Hkf)
  14/34  can move delta_conf        <- the operator's 14
      5  route through real NARS truth functions

And the 5 are in a DIFFERENT CRATE, which is the structural half: 0 of the 34
contract kernels reference TruthValue at all. The truth algebra lives in
lance-graph-planner/src/nars/tactics.rs (33 uses: deduction 1, induction 1,
abduction 2, revise 2, analogy 2) -- the V1 five. There are two tactic
surfaces, and a plan saying "the 34 exist" without saying which invites
building on the wrong one.

The consequence is hard and now an acceptance condition on D-ACR-7: any
overlay deliverable that samples tactics filters on delta_conf CAPABILITY,
never on maturity(). The in-tree failure is already named --
E-A-WATCHER-THAT-CANNOT-DISSENT-IS-NOT-A-WATCHER-1, with the live instance
cited by codex on PR #971 (the newly-Operational Etd rewrites candidates and
returns 0.0 forever). §3b's grading axis is worthless if the tactics feeding it
cannot move a confidence number: the band would be set by unanimity among
mutes.

Self-correction in the same file: my previous commit claimed rung_delta() ->
i16 was "signed, so a negative delta is a rung demotion -- the pothole ->
degradation chain". False. The doc says escalation depth offset, Ded +1 through
Counterfactual +5 -- all five positive. i16 is a type width, not a semantic. I
inferred meaning from a type and pushed it. Same error class as the four this
arc is about.

Eigenvalue, split by the operator's follow-up into a strong half and a weak one:

  CONFIDENCE (strong, probe-ready). Dunning-Kruger operationalized rather than
  analogized: justified confidence moves under disconfirming evidence,
  overconfidence is a fixed point. §3g already measured part of that spectrum
  without naming it -- 20 of 34 tactics cannot move a confidence number, so
  their output is invariant by construction, eigenvalue exactly 1. A watcher
  that cannot dissent and a confidence that cannot be lowered are the same
  phenomenon at two levels. D-ACR-11 probes it two-sided.

  FREQUENCY (weak, stays CONJECTURE). "Tautology = fixed point of f" is
  metaphor until someone shows revision is linear enough for a spectrum to
  mean anything, and I-NOISE-FLOOR-JIRAK fences it: under weak dependence the
  naive statistical reading is wrong, and this is a statistical reading.

Also recorded: MUL over the rung layers as long-term WITHOUT a deliverable id,
because it depends on RowFocusMask, the 59..63 contract and the delta_conf
filter -- sequencing it first would wire a meta-layer onto an unpinned axis.
TrustTexture appearing on both sides (MUL output, and one of two 2-bit readings
of 59..60) is exactly why the per-(classid, rail) reading fence is
load-bearing. And temporal.rs as a hindsight filter (D-ACR-10), which is the
board's own first_possible vs first_derived (S3.8) using a shipped primitive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Fix: contamination invariant is information-flow, not write-authorization

CodeRabbit review on lance-graph#978 caught a real gap: two mailbox owners
writing two separate tables proves the session mailbox cannot DIRECTLY
mutate an ontology row. It does not prove a session-derived VALUE can't be
handed to the ontology-mailbox owner, who then writes it as its own act --
mailbox ownership is a write-authorization boundary, the plan's actual claim
is an information-flow boundary, and a correct authorization check can sit
downstream of a completed contamination.

Corrected in place (not deleted -- CodeRabbit's finding stays visible at the
point it applies) and D-ACR-3 rewritten to match: the test must show no
ontology-owned write traces to a patient-tagged read through ANY call path,
not merely that the session mailbox can't author the write.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Fix: three unrelated witness surfaces conflated as one family in §3a

Operator: "Episodic basins sind in KJV Bible und AriGraph crate
episodicwitness V3 vs epistemic witness causality witness" -- the plan's
witness table lumped WitnessLens/WitnessTable/WitnessEntry, CausalWitnessFacet,
and EpisodicBasins together as one measured family. They are three unrelated
surfaces plus one that does not exist as code:

  CausalWitnessFacet: 18 files, HEAVILY consumed (lance-graph-planner's
  meta_basin/style_strategy/dispatch_guard, deepnsm-v2's versioned event
  window). My previous entry cited the CV3 rebase report's "write-empty"
  finding against THIS type. Wrong target -- it is the opposite, the
  most-consumed witness type measured. A 12-byte register of loci offsets,
  never episodic memory.

  EpisodicWitness64: 0 files. soa_view.rs:272 states it plainly -- "is NOT
  YET a code symbol (a queued design)". This is the type the write-empty
  finding actually belongs to, and it is the one "episodic witness" should
  mean when talking about AriGraph promoted to the hot path -- its own
  comment: "EpisodicWitness64 IS AriGraph living in the mailbox SoA view."
  E-ARIGRAPH-IS-AN-ISLAND names the gap directly.

  EpisodicBasins: 2 files, X3 already confirmed (definition + mod.rs only).

Verified bible_wave.rs touches NONE of the four -- its imports are entirely
internal to deepnsm_v2. Section 3d's citation of it as "the whole-book
falsifier" for basin prestaging was therefore wrong and is corrected: it
falsifies HHTL cascade coverage, not basin promotion.

Second operator correction folded in: "Bei KJV sind episodicwitness als fat
concepts in den SoA" -- read as the design hazard for whoever builds D-ACR-6,
not a bug report on bible_wave.rs today, whose own Spo struct (three u16
WordId indices into the shared codebook, TemporalStream = Vec<(u64, Spo)>)
is already the reference-shaped model to replicate. The fat-concept failure
arrives at the PROMOTION step: a basin row must stay index-width, content
reached only by following references into the triple stream and vocab --
the same test WitnessLens already passes. D-ACR-6's acceptance criterion
extended to say so explicitly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: rail ancestry as epistemic inheritance (D-ACR-12), KJV is a different mechanism, four nibble homonyms disambiguated

Operator: "Die Idee wie gesagt HHTL nodes als Meta Verbindung in eigene SOA
zu materialisieren. Das was bei Ontologien ueber rails bereits implicit ist.
Aber die Vererbung fehlt (unsere Aufgabe, epistemic knowledge from
parents)."

Verified the missing primitive precisely. NiblePath::parent() (hhtl.rs:155)
has ZERO callers anywhere in the tree -- grepped every .parent() call site;
the only real hits are std::path::Path (unrelated) and
holograph::dn_sparse::DottedName's own parent/ancestor/ancestors on a
DIFFERENT type, real prior art for the shape (an O(depth) ascent loop, no
scanning) but not shared code. is_ancestor_of (hhtl.rs:176) is the only
consumer-facing use of ancestry today and it only answers yes/no -- never
"what does the nearest ancestor with content know," which is the actual
missing inheritance. New section §3k writes that lookup as an ascent-with-
early-exit over parent(), and states precisely why it belongs in its OWN
SoA rather than touching ontology rows: the lookup reads only the KEY (zero
value decode, per the canon's own P0), and the materialized result is
(source_addr, resolved_addr, hop_distance) -- a reference per §3a's
discipline, never a copy of the ancestor's content. D-ACR-12, gated on
D-ACR-1 so the ascent path is itself recordable as an overlay trace, with a
two-sided falsifier: a childless-witness node resolves to its nearest
ancestor at the correct hop count, AND a node with its own witness never
ascends past it (an eager-ascent bug would silently prefer stale ancestor
knowledge over fresh local knowledge).

Second correction, and it's a scope split, not an addition: "Bei der Bibel
muessen dagegen erst die episodic arc generiert werden und die lenses
Gadamer Horizontverschmelzung usw erkennen dann logische Verknuepfungen" /
"Hermeneutik als logische Verknuepfungen" / "muss ggf als causality
mechanical drin stehen." KJV is NOT a rail-ancestry problem -- a book has no
taxonomy to ascend, its causal nodes have to be GENERATED by reading the
text, not inherited. And the generation mechanism turns out to be shipped,
not a gap: bible_wave.rs's own comment states the seam (stance::stream()
needs verse TEXT, 3 of 4 stances measured UNREACHABLE from triples alone,
text now emitted as its own artifact for exactly that reason);
nars::stance::stream()'s ReadOut::impls: Vec<(String, u16, u16)> is
literally "causal edges observed from because-cued text, as (verse, cause,
effect)" -- hermeneutics AS mechanical causality, already the type, not a
metaphor needing translation; and Horizontverschmelzung is not a design, it
is D-BLW-3, SHIPPED + MEASURED 2026-08-04 (blw_fusion.rs), whose own KILL
condition ("flat kappa regrades the claim to four independent stance reads
-- not Gadamer") did not fire. No new deliverable opened for KJV
hermeneutics; §3d corrected to say why, and D-ACR-6 confirmed scoped to the
promotion-format question alone, which does not apply to stance::stream()'s
already-triple-width output.

Third correction, caught before it could contaminate D-ACR-12: "Nibble ist
in grammar heuristics Relativpronomen anaphora pointers und tekamolo" / "Aber
nibble als Morton waere ein parallel Universum." Verified FOUR unrelated
4-bit encodings share the word "nibble" in this tree: NiblePath's absolute
16-nibble tree address (what D-ACR-12 actually uses); edge_v3.rs's anaphora
nibble, one signed i4 RELATIVE coreference offset at byte [6] low
(E-NIBBLE-ANAPHORA-EDGE-1, pronoun-to-referent, nothing to do with a tree);
the TEKAMOLO carving at bytes [10..12], reserved/dormant grammar role slots;
and Facet::morton(), explicitly ruled non-canonical by HTT's own X2 ("nothing
in the HHTL contract depends on it"). A disambiguation table now sits inside
§3k precisely so D-ACR-12 cannot accidentally become morton()'s second
consumer or get confused with the anaphora/TEKAMOLO grammar layer -- same
discipline §3a already had to apply to four unrelated "witness" surfaces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: D-ACR-12 corrected to the mask-native bulk-frontier pattern (lance-graph-java precedent)

Operator: "Schau Mal in den session transcripts wir wir es in
lance-graph-java geloest haben. Where ueber ABI shaped substrate als masking
method."

Verified in the sibling repo, not recalled: View.where() accumulates
Predicate descriptors with ZERO membrane crossings (Predicate.java's own doc
comment names the rejected alternative -- a java.util.function.Predicate<Row>
-- as "catastrophic: 64,000 objects and 64,000 crossings for 64,000
entities"); only a terminal op marshals the whole chain into one array for
ONE fused native kernel. And RowStore.hop() (measured, pinned by
GraphHopTest, 2026-08-18): "Two native crossings, flat ... never per-row,
never per-frontier-size" -- the CLAUDE.md invariant verbatim, "hop may look
like hop; it must execute as Mask x ClassView/WideFieldMask -> Mask."

D-ACR-12's prior pseudocode (an ascent loop over ONE address, hop by hop) was
exactly the per-row-crossing shape that repo's own docs call out as the
mistake. Corrected to the bulk shape: resolve the WHOLE frontier of
childless-witness rows in lockstep, one hop per ROUND over all of them at
once, composed from kernels already shipped in kernels.rs
(simd_mask_or_assign, simd_mask_andnot) -- the hop number becomes the
hop-distance column for free.

Scoped carefully, per this session's own recurring lesson: the pattern
transfers, not the code. NiblePath and RowStore's EdgeBlock facets are
different substrates (this repo's HHTL tree address vs lgj-abi's row-store
edges) -- D-ACR-12 does not claim hop() already operates on NiblePath
ancestry, only that it must adopt the SAME bulk-over-frontier discipline.
Falsifier gained a third condition: resolution cost must scale with tree
DEPTH (bulk rounds), never with population size.

Closing tie-back, operator-confirmed real rather than decorative: "Das
verbessert vieles von den Morton falsch abgebogenen." D-HTT-6 (withdrawn)
would have derived parenthood from morton() coordinate arithmetic directly;
D-ACR-12 gets the SAME question -- who is the ancestor -- right on both axes
that withdrawal separated: prefix containment for the address, bulk mask
algebra for the execution.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: brutal-honesty audit of book-hydration-as-precondition + episodic/epistemic ratification + pothole-vocabulary resolution + explicit-masking governing choice

Operator: "Lass mal brutal sein und in ogar-loco die Hydrierung von Knoten
bei Buechern als fest maskierte awareness mit kanban_actor ueber HHTL
masking. Dann kann die Massen-Hydrierung als Voraussetzung fuer
higher-order thinking fest geprueft werden."

Checked three places rather than designing on assumption, all confirmed
empty: ogar-loco (grepped hydrat|awareness|precondition|gate across all 8
source files -- zero hits beyond an unrelated RefusalGate telemetry enum);
kanban_actor::PhaseCensus (a bare `counts: [usize; 6]` tally, no hydration
concept); and "hydration" itself is a THIRD homonym collision this session
(bake_hydrate's boot-time fetch / lance-graph-ontology's format PARSERS /
helix's mu-hydration 3DGS gaussian-splat probe -- none the operator's
concept). Nearest real precedent, E-FOVEATED-AWARENESS-1 +
self_directed_graph.rs, is downstream of the question (replay-index /
write-back gating), not upstream of it (population-readiness checking).

Then the operator supplied the actual design before this landed as
"NOT DESIGNED": "Brutal heisst, bevor wir ueber das Buch nachdenken wird
ein Inhaltsverzeichnis als HHTL-Baum mit SoA-Knoten erstellt." A table of
contents IS a tree's own enumeration -- book/chapter/section/verse mints
one NiblePath + SoA row per level, unconditionally, before content
ingestion. The precondition check falls out of D-ACR-12's own bulk-ascent
loop run as a COVERAGE query: every leaf resolves before max_hops, zero
stuck in frontier, or it's a hard refusal (same fail-closed posture as
predicate_domains.tsv / RefusalGate). D-ACR-13 redesigned as two ordered
steps: TOC-mint, then coverage gate = D-ACR-12 reused.

Continuation checked piece by piece, not assumed to be one gap: cartography
("Danach laeuft eine feste Kartographie der Mindmap") found holograph::
mindmap.rs -- real, rich API (add_node/connect/bfs/pagerank/
spread_activation), EXISTS-UNCALLED, with a known mxv-mutability bug flagged
by a sibling file. Rung-dependency reasoning ("Dann reasoning ueber rung
Stufen mit dependency graph") found WorkflowDAG (planner strategy #12) is a
registered STUB -- plan()'s body is literally the spec as comments, not
code. Nested kanban cascade genuinely absent, zero hits, same honest-empty
grade as D-ACR-13's first draft.

Then corrected on operator challenge: "Holograph hat meines Erachtens
nichts mit SoA zu tun." Verified empirically -- holograph's Cargo.toml deps
are Arrow/DataFusion/Lance, it imports NONE of canonical_node/SoaEnvelope/
MailboxSoA/ClassView, and its only consumers (bgz-tensor,
lance-graph-cognitive) are not the SoA/mailbox substrate either. Split
D-ACR-14 into D-ACR-14a (fix mindmap.rs's bug on its own holograph-local
terms) and D-ACR-14b (a NEW cartography pass built fresh on SoA, not
designed) -- the original wording implied a bridge between the two trees
that does not exist.

Two more corrections in §3b, closing threads from earlier this session:

  Episodic vs epistemic ("die Abhaengigkeit, wann wird episodic zu
  epistemic") is already RATIFIED, not a design gap -- EPIPHANIES.md:5194,
  with a live example in this plan's own KJV territory
  (E-WHOLE-BOOK-REASONING-RUN-1: is_a(god,light) stores episodic adjacency
  wearing epistemic inheritance's label). D-ACR-12 checked against it and
  confirmed on the right side: it ascends a TAXONOMIC is_a/part_of tree
  (genuine epistemic grounding by definition), never temporal/witness
  proximity. Falsifier gained a fourth condition naming the trap explicitly.

  The pothole-mechanism vocabulary ("potholes als 59..63 using deduction
  extrapolation syllogism counterfactual synthesis inference induction")
  does not get a new field. It collides with RecipeInference, already
  shipped 13 bits away at inference_mantissa (CE64 46-49) -- 5 of 7 words
  map directly. And it is NOT bgz-tensor's Zipper7LevelDescriptor despite
  the shared "7": verified the zipper's 7 is discrete MAGNITUDE levels
  (-3..+3) per continuous embedding sample, not a category count -- a fifth
  same-shaped homonym trap this session (after witness x4, nibble x4).

Finally, a governing choice for the whole plan, operator-stated: "Wenn du
spaeter in die Verlegenheit kommst VSA-Masken fuer cascading rung awareness
zu erstellen, koennen wir darueber sprechen. Aber ich waere fuer explizite
masking ABI traversal wie bei java. Sonst verwaessern wir unsere
Architektur." Recorded in §3k: every cascading/rung-awareness mechanism in
this plan defaults to the explicit Mask x ClassView/WideFieldMask -> Mask
pattern, never Vsa16kF32 bundling -- a scoping choice, not a contradiction
of I-VSA-IDENTITIES, which keeps its own narrow niche unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: EpisodicEdges64 mint (ValueTenant=17) closes the 64k-parallel hydration pipeline end to end

Operator: "Du hast 64k thoughts in parallel, du musst also nur einen Plan an
64k SoA ausliefern. Die schreiben dann ihr Ergebnis in den tenant. Du liest
den episodicwitness tenant aus und hydrierst daraus die witness arc facet
rails fuer HHTL."

First had to resolve which type this is, and got it wrong once mid-thread
before the operator corrected it. Checked ValueTenant's full enum: 14 =
CausalWitness (EXPERIMENTAL, the actual mounted "witness arc facet rail" --
24 signed i4 loci read as G24N4). Then found episodic_edges.rs -- a real,
10-consumer type ((family,local) nibble-encoded edge refs, grounded by
locality probe #444, added 2026-07-23) -- and initially hedged about
whether it was the same thing soa_view.rs's "EpisodicWitness64 is NOT YET a
code symbol" comment (last touched 2026-08-04) was describing.

Operator closed it directly: "Episodic edges = nibbles. Episodic Witness
[war] vorbelastet, weil es frueher den CausalEdge64 vom Witness fett
kopiert hat. Jetzt koennen wir die Vorbelastung ignorieren." The comment in
soa_view.rs names an earlier, abandoned witness-copy design;
EpisodicEdges64's nibble-(family,local) encoding is what actually shipped
instead. No identity question left -- the one real gap is mechanical: zero
ValueTenant mount.

Verified rather than assumed that this mount is a real, named, awaited gap
and not invented: .claude/v3/MODULE-TABLE.md line 167 already classifies
episodic_edges.rs "W1 envelope/ownership (SoA edge column)" and confirms it
is already byte-ready (to/from_le_bytes, write_le/read_le, to_u64/from_u64).
Stronger: a DIFFERENT module's own doc comment (markov_soa.rs, line 48)
says plainly -- "truly-correct home is still inside the EW64-in-SoA seam" --
already staged elsewhere, waiting for exactly this mount.

Slot number checked, not assumed: ValueTenant=15 is ALREADY reserved by
BoardAggregates (dismech-causality-v3-v1.md:497, "HoleV3 as ValueTenant=16
(BoardAggregates already reserves 15)") and 16 is HoleV3 itself (D-CV3-3,
queued). Almost minted into 15 before checking. ValueTenant::EpisodicEdges
= 17, additive, reserve-don't-reclaim.

This closes the full pipeline the operator specified across several
messages, three stages: (1) dispatch one plan to the 64k-thought SoA field;
(2) each worker writes into ValueTenant::EpisodicEdges at its own row --
EpisodicEdges64's own shape is a 4-slot MRU promote/evict tier, so this is a
bounded hot-tier write, never a growing list -- and cartography is a
byproduct of these writes rather than a separate pass ("die nodes erstellen
die Kartographie"), folding the former D-ACR-14b into this step; (3) a read
pass hydrates CausalWitness=14's facet rail via D-ACR-12's bulk-ascent loop,
whose resolved==all-leaves output IS D-ACR-13's coverage gate, and
higher-order reasoning is strictly downstream of that gate passing ("das
reasoning higher order ist dann nachgelagert").

D-ACR-17 (the mint) gates D-ACR-13's write stage -- nothing to write into
until the slot exists. Sequencing corrected: D-ACR-17 -> D-ACR-13 (folding
former D-ACR-14b) -> D-ACR-15.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* Plan: reading-without-hindsight is a QueryReference::at binding on D-ACR-15, not a DeepNSM-v2 scope extension

Operator: "Die Frage ist nur ob wir DeepNSM-v2 durch thinking styles und
epistemic potholes und CE64 59..63 erweitern, dass Lesen bereits ein
intellektuelles Erlebnis ohne hindsight knowledge eigenvalue wird."

Answered directly rather than fact-checked, because it's a genuine scope
question, not a claim to verify: no. Extending deepnsm-v2 with thinking
styles/potholes/CE64 grading would reverse
E-DEEPNSM-V2-IS-INBOUND-LEG-REASONING-LIVES-IN-LANCE-GRAPH-1, which this
plan's own §3d already cites approvingly ("this leg emits text, it does not
reason over it").

The actual mechanism the operator wants -- reading without retroactive
knowledge contaminating an earlier point -- already exists, unbuilt but
fully specified: first_possible vs first_derived (board S3.8), which §3i
already named as a primitive but only as a post-hoc audit filter. Sharpened
here to a LIVE binding: each reasoning step at verse v is bound to
QueryReference::at(v, rung), never the fully-hydrated end state. Landed as
an added constraint on D-ACR-15 (once WorkflowDAG::plan() is real) rather
than a new deepnsm-v2 responsibility -- gives S3.8 an actual live consumer
instead of leaving it an audit-only board line. Acceptance condition
extended to a two-sided version-sensitivity test: a node's conclusion must
change when a later version feeds in and must NOT change when only earlier
versions do.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Pud4qpxFHwqyqDjSabQbs

* alpha-channel plan: §3p — the epistemic pothole as reading suspense

Operator: "Das Wissen und Nicht-Wissen beim Lesen. Das epistemic
knowledge pothole als 'binge reading' forward suspense."

Names the mechanism already specified in §3o (QueryReference::at
horizon) and §3i (hindsight/eigenvalue filters) as the reader's actual
open/close experience: a staged claim with RecipeInference::Revision
pending IS an open forward hypothesis; TruthValue::revise firing on a
later verse's because-cue (stance.rs) is the suspense resolving. No
new primitive, no new CE64 bit, no new deliverable — sharpens
D-ACR-10's falsifier to measure the pothole-open SPAN (first_possible
to Revision-close) rather than only the existing derivable-at-every-
version boolean, so a probe that closes every pothole on the verse it
opened (instant lookup wearing NARS's vocabulary) fails the same way
E-A-WATCHER-THAT-CANNOT-DISSENT-IS-NOT-A-WATCHER-1 already fails a
guard that cannot dissent.

* Fix 4 codex P2 findings on PR #978

- STATUS_BOARD.md D-ACR-3: matched the plan's own corrected wording
  (any call path, not just direct write-authorization) — the board
  row still described the withdrawn narrower test.
- dismech-causality-v3-v1.md:369: dropped the false "unavailable
  regardless" for Orphanet/OMIM — HhtlMode falls back to Cascade
  when RailHead is empty and both lanes have full cascade coverage
  (14,063/14,063 and 18,712/18,712); only RailPath prefix
  containment is genuinely unavailable there.
- alpha-channel-rung-overlay-v1.md D-ACR-13: the row said NOT
  DESIGNED while §3l/§3n (and the ordering sentence directly below
  the table) already specify its two steps and dispatch/write/
  hydrate/gate pipeline — self-contradictory, corrected to DESIGNED,
  not built.
- dismech-causality-v3-v1.md D-CV3-3: HoleV3=16 assumed
  BoardAggregates=15 was already settled; it is only a gated
  reservation with open width. Added the BoardAggregates mint as an
  explicit prerequisite (contiguous-discriminant requirement), not
  merely implied by the benchmark gate.

* Handover: alpha-channel plan session (PR #978) + MedCare-rs S3 tier work

Cold-start handover ahead of a flagged multi-day gap: what shipped, what
FINDING vs CONJECTURE, real blockers vs designed-around ones, and the
first concrete next step (D-ACR-0).

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants