Skip to content

Commit 42e45a3

Browse files
committed
board: PR #81 arc entry + LATEST_STATE
Discharges the merged-PR obligation for #81 at merge time, not as a backfill: the Panama x Valhalla framing, the RangeOutOfBounds fix and its falsifier, the 409/183 gate results, the flattening cliff reproducing on JDK 28 with RowRange and Row on the wrong side, the two allocation measurements that got worse, the lab re-scope and its removed confound, and the JMH numbers still owed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HScwwezRdMxFfTs3WLG19d
1 parent 07aa441 commit 42e45a3

2 files changed

Lines changed: 85 additions & 0 deletions

File tree

‎.claude/board/LATEST_STATE.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,25 @@
1+
## 2026-09-19 — PR #81 merged (`07aa441`): production IS the Valhalla arm; Panama × Valhalla is one membrane
2+
3+
**The frame, because it is easy to file this wrong:** this was not a JDK
4+
26→28 upgrade. Production was Panama-only and Valhalla lived in the lab; they
5+
are now **one production membrane**, with JDK 28 as the enabling toolchain.
6+
Panama = the verb, Valhalla = the noun, **lance-graph / T0 owns storage**.
7+
8+
- **Toolchain:** `/opt/jdks/jdk-28+16` (Temurin `28+16-ea`). FFM final and
9+
flag-free; JEP 401 preview-gated, so `--release 28 --enable-preview` is part
10+
of the shipped build contract — **the flag is Valhalla's, never FFM's.**
11+
- **Production vocabulary:** the six types are `public value record`,
12+
`isValue() == true`. Gates: **183 native tests**, **409 Java checks**,
13+
identical to the unflipped baseline on the same JDK.
14+
- **Carry this forward:** the **8-byte flattening cliff reproduces on JDK 28**,
15+
and `RowRange` / `Row` (16 B) are on the wrong side of it. Two allocation
16+
measurements got WORSE under value semantics (non-escaping construction,
17+
`Row` hydration) — both honest, neither on a production path. The FFM path is
18+
byte-identical across the object model.
19+
- **Still owed:** `bench/` JMH numbers have NOT been re-taken on JDK 28
20+
(`bench/lib` absent here); `bench/RESULTS.md` is JDK 26 historical.
21+
- Full record: `PR_ARC_INVENTORY.md` PR #81.
22+
123
## 2026-09-16 — `hop_cached_vs_gather`: the M1b tile pays off on the second hop; the scatter walk is the access-shape question
224

325
**PR #79**, `native/lgj-abi/examples/hop_cached_vs_gather.rs` only — no ABI

‎.claude/board/PR_ARC_INVENTORY.md‎

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,69 @@
88
> anti-pattern the imported board rules name. Backfilled below in one
99
> pass rather than left stale; PR #4 onward gets its entry at merge time.
1010
11+
## PR #81 — Panama × Valhalla as ONE production membrane (merged `07aa441`, branch `claude/great-pascal-k96kok`, head `1c66091`, 3 commits)
12+
13+
**Entry written at merge**, not backfilled.
14+
15+
- **Frame, and it is the point:** NOT a JDK 26→28 migration. The two halves
16+
that were split — Panama FFM in production, Valhalla in the lab — became one
17+
production membrane. JDK 28 is the enabling toolchain, nothing more. Panama
18+
carries the VERB (reach into canonical bytes); Valhalla carries the NOUN
19+
(identity-free semantic addresses over them); **lance-graph / T0 still owns
20+
the only canonical copy.**
21+
- **Added:** `CLAUDE.md` § P0 (the operator mandate); the six vocabulary types
22+
as `public value record` (`LaneId`, `MaskId`, `Ordinal`, `FacetId`,
23+
`RowRange`, `WideFieldMask`); `plan_lower::range_falsifier::
24+
no_opcode_lowers_to_pred_range`; JDK 28 + preview across `bench/run.sh`,
25+
`bench/gate-run.sh`, `java/README.md`, `README.md`, `docs/panama.md`,
26+
`panama-bridge-engineer.md`, `BOOT.md`; `jdk-toolchain-facts.md` § "JDK 28 —
27+
INSTALLED AND MEASURED" with the obtain route.
28+
- **Fixed (this blocked everything):** `lgj-abi` did not compile against
29+
lance-graph `main`. `mask_risc::ExecError` gained `RangeOutOfBounds` with the
30+
`Pred::Range` work and `exec_error_to_status` matches exhaustively. Mapped
31+
into the documented *"bug in THIS file"* family — no new public status, no
32+
ABI bump — and fenced by the falsifier above, **disable-verified
33+
red-then-green**. *Standing hazard worth the sentence: an exhaustive match
34+
across a repo boundary turns an upstream ADDITIVE change into a downstream
35+
build failure, and no CI job here compiles the native crate, so nothing saw
36+
it.*
37+
- **Measured** (Temurin `28+16-ea`, fresh `liblgj_abi.so` abi 0.11 avx512):
38+
**183 native tests**; **`ALL PASSED (409 checks)`** — byte-for-byte the same
39+
409 as the unflipped baseline **on the same JDK**, which is the comparison
40+
that matters. All six types `isValue() == true`; substitutability holds.
41+
**The 8-byte flattening cliff REPRODUCES on JDK 28:** `LaneId`/`Ordinal`
42+
(4 B) and `MaskId` (8 B) FLAT; **`RowRange` (2 long, 16 B) and `Row` (16 B)
43+
NOT-FLAT.** Allocation, record → value, 1M ops: construct-into-array
44+
15.26 → **1.87 MiB** (8.2×); allocate+fill 19.07 → 5.65 MiB; `Descriptor`
45+
45.78 → 27.89 MiB; ⊘ **never-escaping 4.73 → 5.75 MiB (WORSE** — EA already
46+
erased the record case**)**; ⊘ **hydrate 65,536 `Row` 1.50 → 2.00 MiB
47+
(WORSE** — `Row` does not flatten**)**. **FFM path byte-identical across
48+
arms:** 712 B/query, 0 Java objects per row, same native bytes.
49+
- **Locked:** `value semantics ≠ flattening` — `RowRange` is a production type
50+
on the wrong side of the cliff and no performance claim may be read off its
51+
`isValue()`. Valhalla changes what the VOCABULARY costs; it does not touch
52+
the membrane. No second graph representation, no row hydration introduced.
53+
- **Lab re-scoped, and the re-scope removed a confound it always carried:** the
54+
old A/B was `(record, JDK 26)` vs `(value record, JDK 27 EA)` — two
55+
variables. Both arms now run JDK 28, so the object model is the only
56+
difference. Two things it forced: **preview marking is transitive** (the
57+
`record` arm also runs `--enable-preview`; it is a record arm on a preview
58+
JVM, not a preview-free one), and **`ValueClass.isFlatArray` narrowed from
59+
`Object` to `Object[]`** since 27-jep401ea3, which broke the flattening probe
60+
until adapted.
61+
- **Struck:** the *"production targets a shipped GA JDK, no preview flags — a
62+
real, deliberate strength"* decision, in place in `jdk-toolchain-facts.md`.
63+
It dressed a release constraint as an architectural virtue and had already
64+
licensed the false claim *"production lgj does not depend on Valhalla at
65+
all."*
66+
- **Deferred, stated rather than implied:** `bench/` cannot run here —
67+
`bench/lib` does not exist, so the JMH jars are absent. `bench/RESULTS.md`
68+
numbers remain **JDK 26 historicals, correct when taken**, deliberately
69+
untouched and **NOT re-taken on JDK 28**. `gate-run.sh` carries the new pin
70+
and flags, so the re-run is one command once the jars are present.
71+
- **Confidence:** high on everything measured in-container; the JMH
72+
crossing/allocation figures are unverified on JDK 28 and are labelled so.
73+
1174
## PR #79 — `hop_cached_vs_gather`: the M1b tile pays off on hop two; the scatter walk is the access-shape question (opened 2026-09-16, merged `9cb63e9`, head `c10029b`)
1275

1376
> **Post-merge backfill, owned (2026-09-16):** this entry was NOT written at

0 commit comments

Comments
 (0)