Skip to content

Commit 2c2c3d2

Browse files
committed
Merge origin/main into the Blocks-V3 branch
`main` moved 2918421 -> d24ddbc (#1208/#1209/#1210) and made this PR `mergeable_state: dirty`. One conflict: both sides prepended a board entry to LATEST_STATE.md. Both survive -- this branch's Blocks V3 contract entry above main's #1209 record, in prepend order. 3384 lines against parents of 3324 and 3305, so no-shrink holds against both. Corrected in the same resolution rather than merged forward: this entry's citation-decay paragraph claimed the gate was red on origin/main too, 12 findings byte-identical, and that its prescribed fix would require editing past entries the append-only rule protects. That described one run and was carried forward instead of re-read. On dcfc820 the gate reported 1 NEW decay and it was this branch's -- registering the class moved the NodeRow size assert off the line ISSUES.md:1537 cited. Fixed in 91fb423 with a stable anchor; the "append-only forbids it" dilemma was false, since an anchor repair changes a citation's address, not a past entry's claim. citation-decay --since d24ddbc: 0 new decay(s), 147 pre-existing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011DN5odWu4eisdevH9bPWyz
2 parents 91fb423 + d24ddbc commit 2c2c3d2

9 files changed

Lines changed: 836 additions & 14 deletions

File tree

‎.claude/board/ISSUES.md‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,47 @@
1+
## ISS-NO-NON-LINUX-TARGET (2026-09-06) — OPEN
2+
3+
**Neither filed issue covers the defect that opened this one, and the difference
4+
is the generalization.** `crates/lance-graph-hydrate/src/release.rs` gated three
5+
sites `#[cfg(unix)]` and called `libc::posix_fadvise` / `libc::POSIX_FADV_DONTNEED`
6+
inside them. `posix_fadvise` is **Linux/Android, not POSIX-universal** — Apple's
7+
libc does not declare it — so the crate fails to compile on macOS with
8+
`error[E0425]: cannot find function 'posix_fadvise' in crate 'libc'`. `cfg(unix)`
9+
reads as "has fadvise" and is not.
10+
11+
Why the two existing issues miss it:
12+
13+
- `ISS-NO-AARCH64-RUNNER` is about target **arch**. This is target **OS**: the cfg
14+
selection was proved two-sidedly on the pinned 1.98.1 toolchain with a `#![no_std]`
15+
rustc probe — `x86_64-apple-darwin` excludes the Linux arm, `x86_64-unknown-linux-gnu`
16+
selects it. An x86 macOS runner would have caught this; an aarch64 *Linux* one
17+
would not.
18+
- `ISS-EXCLUDED-CRATES-UNBUILT` is about the **member list**. `lance-graph-hydrate`
19+
is a workspace member, compiled and linted by CI on every PR. The crate list was
20+
never the gap here.
21+
22+
**The accurate statement is the union, not either half:** CI compiles exactly ONE
23+
`(target_os, target_arch, crate-list)` tuple — `(linux, x86_64, members)`. Every
24+
`cfg` block outside it is text the parser skips. The three defects found this week
25+
each fall in a different one of those three axes, which is why fixing one axis would
26+
not have caught the other two.
27+
28+
**Found the same way as the other two:** by q2's newly-ungated `macos-latest` job —
29+
a downstream consumer's CI doing this repo's job, for the third time in one week.
30+
Nothing in this repo's own CI was capable of seeing it.
31+
32+
**Fixed here** (the point repair): the three sites are gated
33+
`#[cfg(any(target_os = "linux", target_os = "android"))]` with a fallback arm for
34+
macOS/BSD, and the doc comment records the rule — *widen this gate only to targets
35+
whose libc actually declares the call*. 39/39 crate tests green on Linux.
36+
37+
**Not fixed here:** the axis. A `runs-on: macos-latest` job, or a cheap
38+
`cargo check --target x86_64-apple-darwin` on the existing x86 runners, is a CI
39+
policy change and an operator call. Note the cheap form needs
40+
`rustup target add --toolchain 1.98.1 <target>` — installing a target for the
41+
DEFAULT toolchain while the repo pins 1.98.1 produces a `can't find crate for 'core'`
42+
that reads like a broken probe rather than a missing std; that cost a turn this
43+
session.
44+
145
## ISS-NO-AARCH64-RUNNER (2026-09-06) — OPEN
246

347
**Every `#[cfg(target_arch = "aarch64")]` block in this repo is unverified, because

‎.claude/board/LATEST_STATE.md‎

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,73 @@ a slot-allocation one, and is not evidence against this address.
5252
**Validated on `197ef083d`:** `read_mode_blocks_v3_routes_v3_tail_and_the_blocks_domain`
5353
passes inside 1319 contract lib tests; `test`, `member-tests`, `clippy`,
5454
`format`, `linux-build`, `test-with-coverage`, `no-shrink` and
55-
`regenerate-and-diff` all green. `citation-decay` is red on `origin/main`
56-
too — 12 findings, byte-identical, measured on a clean worktree of each; none
57-
of them cites into `LATEST_STATE.md`, so this prepend moved nothing under an
58-
anchor. Its prescribed fix (line number → stable anchor) means editing past
59-
entries in `EPIPHANIES.md` / `AGENT_ORCHESTRATION_LOG.md`, which the
60-
append-only rule forbids — a standing tension for the board sweep, not for a
61-
contract-crate PR.
55+
`regenerate-and-diff` all green.
56+
57+
**`citation-decay` — the first diagnosis here was WRONG, corrected in place
58+
because it was never true of this branch.** It read: *red on `origin/main`
59+
too, 12 findings byte-identical, none citing into `LATEST_STATE.md`.* That
60+
described one run and was then carried forward instead of re-read. On
61+
`dcfc820d` the gate reported **1 NEW decay** and it was this branch's:
62+
registering the class inserted 18 lines above the const-assert block in
63+
`canonical_node.rs`, moving `size_of::<NodeRow>() == 512` from `:735` to
64+
`:753`, and `ISSUES.md:1537` (ISS-MAILBOXSOA-ROW-COST-VS-512B-CANON) cited
65+
that coordinate. Nothing in `ISSUES.md` changed; the branch moved the thing it
66+
pointed at.
67+
68+
Fixed in `91fb4234` the way the gate's own error text prescribes — *"THE FIX
69+
IS NOT TO CORRECT THE LINE NUMBER"* — by naming the assert block through the
70+
symbols around it, so the next insertion above it does not re-break the
71+
citation. Green since: `0 new decay(s), 147 pre-existing`. The "append-only
72+
forbids the fix" tension recorded above was therefore a false dilemma: an
73+
anchor repair changes a citation's ADDRESS, not a past entry's claim, and is
74+
what the gate asks for.
75+
76+
**The transferable rule:** *"red on the base too"* is a claim about ONE run,
77+
not a standing property. It expires the moment the branch adds a line above a
78+
cited symbol — precisely what a `--since`-diffing gate exists to catch.
79+
80+
## 2026-09-06 — #1209 MERGED (f1336b66): the temporal architecture was measured against the wrong store
81+
82+
| PR | merge | what landed |
83+
|---|---|---|
84+
| **#1209** | `f1336b66` | Three probes (`canonical_witness_identity_probe`, `v3_mint_reachability_probe`, `test_e_old_diff_tripartite`) + four `STATUS_BOARD` rows (D-TEMPORAL-1 / -1a / D-V3-MINT-1 / D-TEMPORAL-2) + the `SUPERSESSION-INDEX` regeneration the gate required. No source changes. |
85+
86+
**Ruling: R4 with an R1 core.** Two representations coexist by construction —
87+
store **A** (canonical temporal/cognitive persistence, `graph/cycle_sink.rs`,
88+
PR #911) and store **B** (`VersionedGraph`/`NodeSchema`, `node_id:u32` + planes
89+
+ seals). A's architecture survived the lance 9→11 migration byte- and
90+
semantic-intact; its concrete writer `LanceCycleWriter` remains DORMANT (zero
91+
non-test callers, per D-MW-P2). Do not read "architecture survived" as
92+
"production wired".
93+
94+
**The correction this PR exists for:** an earlier pass in the same session
95+
measured store B and reported it as THE addressed architecture, concluding the
96+
spine "terminates at `u32 node_id`". That was the wrong store — `cycle_sink.rs`
97+
had never been opened. Its birth commit states the invariant outright ("one
98+
detached cycle batch → ONE official Lance commit → exactly one real
99+
DatasetVersion base+1") with `payload: FixedSizeBinary(512)` documented as
100+
`key(16) | edges(16) | value(480)`.
101+
102+
**No A↔B membrane was ever designed**, and the chronology forecloses one: B was
103+
born 2026-03-16 (`270b703c` / `229db767`), ~5 months before A and before
104+
`NodeGuid` itself. The deleted `contract/src/identity.rs` (`e8060589`) says it
105+
plainly — *"the cold path keys nodes by `node_id:u32` today … neither is a
106+
stable, globally-referenceable id. `NodeGuid` fills that gap."* The workspace
107+
answered B's identity gap by minting a SEPARATE identity, not by extending B.
108+
Zero commits in 5 387 ever touch `NodeGuid` and `versioned.rs`/`columnar.rs`
109+
together; `node_id` has no in-repo producer; B is `WriteMode::Overwrite`n
110+
wholesale each round. **Consequence: do NOT add a `NodeGuid` column to B, and do
111+
NOT invent a mapping.** B's `node_id:u32` is a projection-local coordinate of a
112+
GraphBLAS/fingerprint snapshot, not an architectural deficiency.
113+
114+
**Measured, not inferred:** V3 rail (`CLASSID_OSINT_V3`) byte-exact through two
115+
cycles and a reopen, `payload[0..16] == G.as_bytes()`, each cycle minting exactly
116+
`base+1`; V1 legacy control likewise; 23/23 `cycle_sink` invariant tests green on
117+
lance 11 (lost-ACK reconciles, hash conflict fails closed, stale horizon fenced
118+
writing nothing, reconcile-unavailable ⇒ `Ambiguous`). `#911 → #912 →
119+
1d416704` are three SEPARATE events and all coherent: #912 is an admission
120+
valve (no artifact-backed change ⇒ no sink call ⇒ no version), `1d416704` is
121+
fence hardening, neither a migration regression.
62122

63123
## 2026-09-06 — #1201 MERGED (54285a42): #1199's records + the council SPEC v1
64124

‎.claude/board/PR_ARC_INVENTORY.md‎

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,80 @@
1+
## 2026-09-06 — lance-graph PR #1209 (merged `f1336b66`, branch `claude/ndarray-simd-tract-o3jfrn`) — the temporal architecture, measured against the wrong store first
2+
3+
- **Added:** `crates/lance-graph/tests/canonical_witness_identity_probe.rs` (3
4+
tests), `crates/lance-graph-contract/tests/v3_mint_reachability_probe.rs` (2),
5+
`crates/lance-graph/tests/test_e_old_diff_tripartite.rs` (1), four
6+
`STATUS_BOARD` rows, and the `SUPERSESSION-INDEX` regeneration. No source
7+
changes — this PR measures, it does not migrate.
8+
- **Corrected, about this session's own earlier reporting:** a first pass traced
9+
`VersionedGraph`/`NodeSchema` and reported it as the addressed architecture,
10+
concluding the spine "terminates at `u32 node_id`" and that the last link "was
11+
never built". Wrong store: `graph/cycle_sink.rs` (#911) had not been opened.
12+
The operator named the failure mode before the evidence did — *"we may be
13+
debugging the migration while accidentally treating a secondary
14+
VersionedGraph/BLASGraph representation as the architecture."*
15+
- **The V1/V3 two-rail control was operator-mandated and earned its keep
16+
immediately.** The first fixture used `NodeGuid::new` — the V1 (deprecated)
17+
constructor — so it would have proven the live rail nothing. Rewritten to mint
18+
through `mint_for(classid_read_mode(c).tail_variant, …)`. It then failed twice,
19+
both times on MY assertions, not the store: `local_key_v2` was expected to
20+
separate keys differing only in `leaf`, and must not — `leaf` is the 4th HHTL
21+
routing tier (bytes 10..12), part of the addressing PREFIX, deliberately
22+
outside the basin-local key (bytes 12..16). **Both facts are now pinned**, so
23+
"use the V3 accessor" is recorded as TWO choices and picking the wrong V3 one
24+
fails like picking the V1 one.
25+
- **Pinned false-green (D-TEMPORAL-1a):** 256 V3 addresses differing only in
26+
`leaf` → 256 distinct raw keys, 256 distinct `to_hex_v2()`, **1** distinct
27+
`identity()`. The miniature of the measured OBO incident (60 478 rows → 658
28+
apparent identities on a byte-exact round trip). Byte fidelity does not imply
29+
address fidelity.
30+
- **Checked rather than assumed (D-V3-MINT-1):** `mint_for`'s V2/V3 arm is gated
31+
on `guid-v2-tail`, absent from `default`; the registry's V3 entries are gated
32+
on `guid-v3-tail`, present. A contradiction was one step from being reported —
33+
and does not exist: `guid-v3-tail = ["guid-v2-tail"]` (`Cargo.toml:69`).
34+
Measured `tail_variant=V3 / guid-v2-tail=true / leaf_is_live=true`.
35+
- **CodeRabbit finding, CONFIRMED and fixed (`91cfe1c1`):** the removal probe
36+
could pass without validating removal handling. `graph_seal_check` returns on
37+
its FIRST divergence while walking `to_seals`, so on `V1={A,B,D} → V2={A,B',C}`
38+
the update to `B` or the insert of `C` tripped it before the removal branch
39+
(`versioned.rs:632-637`) ran — the assertion held with that branch deleted.
40+
Added `V3={A,B'}` (a removal-ONLY transition). The isolation also SHARPENED the
41+
blind spot: for a pure removal `GraphDiff` is entirely empty AND its own
42+
`seal_status` reads `Wisdom`, while `graph_seal_check` calls the same pair
43+
`Staunen` — the two surfaces disagree.
44+
- **CodeRabbit finding, DECLINED with evidence** (reply on
45+
`#discussion_r3944816260`): "prepend new board rows above the existing
46+
`D-LNC-*` entries". The `CLAUDE.md` prepend rule names its scope —
47+
`EPIPHANIES` / `PR_ARC_INVENTORY` / `INTEGRATION_PLANS` / `AGENT_LOG`, the
48+
chronological logs. `STATUS_BOARD` is a dashboard grouped by plan and is not in
49+
that list; the last three commits to the section (`8078b69e`, `01569280`,
50+
`5fe1ffae`) all APPEND. The finding did catch a real defect, just not the one
51+
it named: the rows were originally inserted mid-table because the patch
52+
anchored on a convenient unique string. Moved to the append point.
53+
- **Own prediction falsified by CI:** the PR body claimed
54+
`SUPERSESSION-INDEX.md` needed no regeneration, reasoning a STATUS_BOARD-only
55+
change could not move it. `regenerate-and-diff` went red within a minute —
56+
`crates/` is also an index input, and the new probe calls `persist_cycle`, a
57+
ruled symbol, moving its reference count 10 → 11. Fixed in `01829f6a`; body
58+
corrected.
59+
- **Locked:** R4 with an R1 core (see `LATEST_STATE`). Historical snapshot
60+
comparison is the correctness ORACLE for the changed set — `inserted`/`updated`
61+
from `GraphDiff`, `removed` derivable from the same two seal maps `diff()`
62+
already materialises before discarding their difference. Native lance delta is
63+
an optional accelerator measured against that, never the architecture; D-LNC-5a's
64+
RED is a statement about `DatasetDelta`'s configuration needs, not about store A.
65+
- **Deferred:** `test_c_cycle_payload_roundtrip.rs`, written by the probe fleet
66+
and deliberately NOT landed — D-TEMPORAL-1 already proves the stronger V1/V3
67+
result, and a second green test of the same claim adds review cost without
68+
adding a falsifier.
69+
- **NOT proven, and the caveat must ride with any citation:** production
70+
reachability. `LanceCycleWriter` has zero non-test callers. The architecture
71+
survived; the writer is dormant.
72+
- **Confidence:** High on the byte/address/semantic results (all locally
73+
executed, each failing at least once first). Medium on "no membrane was ever
74+
intended" — grounded in chronology, a deleted design doc and exhaustive
75+
negative greps, but no doc ever states the relationship positively, because A
76+
did not yet exist when B was built.
77+
178
## 2026-09-06 — lance-graph PR #1201 (merged `54285a42`, branch `claude/great-curie-d2ufyl`) — #1199's records, and the SPEC v1 that made it mixed
279

380
- **Added:** #1199's post-merge records (`PR_ARC_INVENTORY` entry + the

‎.claude/board/STATUS_BOARD.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ identity) is real and probe-gated.
2121
| D-GTM-0n / P3 | **Ternlog chaining amortization** (`ndarray/examples/ternlog_amortization_probe.rs`, re-run `--release` 2026-09-06): does chaining pay on THIS mask shape? Pre-registered pass criterion = per-constraint cost flat in K, with a **K=1 control** (nothing to chain ⇒ no win) | **GREEN, bounded.** `T3/T1` bottoms at **0.50** by K=8; T3 total flat in K (57.6 ns @ K=4 → 54.1 ns @ K=32, 16× more constraints). K=1 control reads **1.03** as it must. Two bounds ride with the number and may not be dropped when it is cited: the win is **L2-residency-contingent** (bandwidth `138→15 GB/s` past L2, ratio back to 1.03 at a 512 KiB mask), and mask loses to sparse below **0.1%** active. **Does NOT retire the standing caveat** — 2× on one of three passes still cannot account for 5×. Gates Stage-3 SPEED claims only; the shape/correctness case never depended on it |
2222
| D-ALPHA-1b | **`AlphaMask::zip` release-mode length guard** (`lance-graph-contract/src/alpha.rs`): the only guard was `debug_assert_eq!`, compiled out in release, so mismatched-length operands produced a mask claiming `self.len` addresses over the SHORTER operand's word count — `count`/`is_empty` under-report silently, `contains`/`materialize_ordinals` panic at a distance | **Fixed** — promoted to `assert_eq!`. Defect reproduced in release BEFORE the fix (the `should_panic` falsifier reported "test did not panic as expected"); two-sided falsifiers both disable-verified. No API change, no external callers. Stage 1b of `.claude/temporal/09-plan.md`, now DONE |
2323
| D-LNC-7 | **One-WAL ruling**: `LanceCycleWriter`'s watermark WAL vs lance MemWAL — `applied_through` ≡ index catch-up position; two under one commit = two truths. Plan recommends keep-ours until D-LNC-3, then re-decide | **Operator decision** |
24+
| D-TEMPORAL-1 | **Canonical witness identity probe** (`crates/lance-graph/tests/canonical_witness_identity_probe.rs`): does canonical address identity survive the A-store round trip on lance 11? `NodeGuid → NodeRow → NodeRowPacket::as_le_bytes → cycle commit → drop writer → reopen → scan_image`. Minted through `mint_for(classid_read_mode(c).tail_variant, …)`, never a hardcoded constructor | **GREEN, both rails.** V3 (`CLASSID_OSINT_V3`): payload bytes byte-exact across two cycles and a reopen; `payload[0..16] == G.as_bytes()`; value slab survived (so equality is not a zero-match); each cycle minted exactly `base+1`; head recovered at V2 after restart. V1 legacy control (`CLASSID_OSINT`) round-trips too. **Scope:** proves byte and address fidelity of the store; does NOT prove production reachability — `LanceCycleWriter` still has zero non-test callers (see D-MW-P2) |
25+
| D-TEMPORAL-1a | **Pinned false-green: the V1 accessor on a V3 key.** 256 V3 addresses varying only in `leaf` → 256 distinct 16-byte keys, 256 distinct `to_hex_v2()`, but **1** distinct `identity()`. Byte fidelity does not imply address fidelity | **Pinned as a positive assertion.** Also pins the second half, which is not a defect: `local_key_v2` yields **1** across the same set BY CONSTRUCTION — `leaf` is the 4th HHTL routing tier (bytes 10..12), part of the addressing prefix, deliberately outside the basin-local key (bytes 12..16). So "use the V3 accessor" is two choices, not one, and the wrong V3 one fails like the V1 one. Do not update the numbers if the assertion breaks — re-audit the call sites |
26+
| D-V3-MINT-1 | **V3 mint reachability** (`crates/lance-graph-contract/tests/v3_mint_reachability_probe.rs`): `mint_for`'s V2/V3 arm is gated on `guid-v2-tail`, which is NOT in `default`; the registry's V3 entries are gated on `guid-v3-tail`, which is. Two different features, so premise and conclusion can come apart — is a V3-registered classid silently minted into the deprecated V1 layout? | **GREEN — no defect.** `guid-v3-tail = ["guid-v2-tail"]` (`Cargo.toml:69`), so the implication holds. Measured, not inferred: `tail_variant=V3 guid-v3-tail=true guid-v2-tail=true leaf_is_live=true`, key bytes show the V2/V3 carving with `leaf` live at byte 10. Discriminator is `leaf` (the V3 arm feeds it to `new_v2`; the V1 fallback discards it), so the probe stays valid if the feature graph is ever flattened |
27+
| D-TEMPORAL-2 | **Old-path tripartite change set** (`crates/lance-graph/tests/test_e_old_diff_tripartite.rs`): can store B's snapshot comparison produce `inserted / updated / removed` without any lance delta API? `V1={A,B,D}`, `V2={A,B',C}` | **GREEN.** `inserted={C}` and `updated={B}` from `GraphDiff`; `removed={D}` DERIVED from the same two seal maps `diff()` already materialises (`versioned.rs:550-554`) before discarding the difference — so the missing `removed_nodes` field is an **API omission, not information loss**. Seal gate two-sided AND isolated: the `Staunen` arm runs on a THIRD version `V3={A,B'}` whose only change is dropping `C` — on `V1→V2` that assertion was CONFOUNDED, because `graph_seal_check` returns on its FIRST divergence while walking `to_seals`, so `B`'s update or `C`'s insert trips it before the removal branch (`versioned.rs:632-637`) runs at all, and it would have passed with removal detection deleted (caught by a CodeRabbit finding on #1209). Self-compare ⇒ `Wisdom`. Sharper blind spot now pinned: for a PURE removal `GraphDiff` is entirely empty and its own `seal_status` reads `Wisdom`, contradicting `graph_seal_check`'s `Staunen` on the same version pair. Anti-vacuity: unchanged `A` appears in neither set. Blind spot pinned — if a `removed_nodes` field lands, the assertion must be re-pinned deliberately. **Consequence: historical snapshot comparison is the correctness ORACLE; native lance delta is an optional accelerator, never the architecture** |
2428

2529
## bindspace-mailbox-soa-wiring-v1 (D-ids minted 2026-09-05 with the plan)
2630

‎.claude/board/SUPERSESSION-INDEX.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ coverage instead.
5353
| `StepMask` | BLOCKED | — | 3 | 9 | 4 |
5454
| `commit_to_l4` | BLOCKED | — | 2 | 2 | 0 |
5555
| `dispatch_busdto` | BLOCKED | — | 3 | 8 | 5 |
56-
| `persist_cycle` | BLOCKED | — | 10 | 8 | 5 |
56+
| `persist_cycle` | BLOCKED | — | 11 | 8 | 5 |
5757
| `CognitiveMarkers` | REPURPOSE | `Commit` | 1 | 0 | 0 |
5858
| `DominoCascade` | REPURPOSE | `Commit` | 7 | 1 | 0 |
5959
| `GateDecision` | REPURPOSE | — | 25 | 27 | 24 |

0 commit comments

Comments
 (0)