Skip to content

Commit 82b03ad

Browse files
committed
CLAUDE.md: the JDK is one apt source away — never skip the Java half again
Operator ruling: document JDK + Panama access so no future session runs without Panama entirely. This repo's own history carries commits titled "UNVERIFIED: JDK 26 not available in this sandbox". Measured today, that is false twice over: * Ubuntu noble's stock archive serves `openjdk-25-jdk-headless`, and Panama FFM has been FINAL since 22, so the whole `internal/ffm` membrane runs on it. * JDK 26 itself -- the exact version those commits wanted -- is one EXTRA APT SOURCE away. Adoptium's noble repo carries 8 through 26; add the key + list, `apt-get update`, `apt-get install temurin-26-jdk`. `ALL PASSED (409 checks)` across all 16 suites on BOTH JDKs, identical, against `abi 0.11, simd ndarray::simd avx512, profile release`. The trap that made it look impossible is recorded too, because it reads as the opposite of what it is: the pre-seeded apt index named `openjdk-25 25.0.2+10-1~24.04`, a version already withdrawn from the pool, so the install died on a bare `404 Not Found` -- which reads as "no such package" rather than "your index is stale". `apt-get update` moved the candidate to `25.0.4+7-1~24.04` and it installed immediately. Same shape as this workspace's other freshness traps: a cached view reporting ABSENCE is not evidence of absence. Also documented: the full build+run recipe (there is no build tool -- `AllTests` is a plain main with meaningful 0/1/2 exit codes, the third being "native artifact absent so nothing ran", because a missing library reported as a failure sends the reader hunting a bug that is not there); why `-Dlgj.library` refuses to fall back to a search path; and the runtime line the suite prints, which is what proves the run exercised the artifact you meant. The honest boundary, narrowed to what it actually is: only the Valhalla EA arm (`valhalla-lab/src/valhalla`, `value record`) needs a non-apt fetch. Adoptium stops at 26 and mainline 27 would not help, since `value record` is a Valhalla EA feature rather than a mainline one -- but `jdk.java.net/valhalla` is reachable through the proxy (HTTP 200), so it is a download rather than a blocker, and it is a measurement arm, not a gate. Consequence stated explicitly: "the Java side could not be verified" is no longer an acceptable status line for this repo. Both halves run here, and a PR claiming otherwise is claiming something that takes about four minutes to falsify. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX
1 parent e9bf3aa commit 82b03ad

1 file changed

Lines changed: 100 additions & 0 deletions

File tree

‎CLAUDE.md‎

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,106 @@ the signal the substrate is missing a word.
355355
`internal.*` in any public signature — the exact analog of "all SIMD from
356356
`ndarray::simd`, never `simd_{arch}`, never raw intrinsics".
357357

358+
## The JDK is one apt command away — never skip the Java half (2026-09-16)
359+
360+
**Operator ruling: document this so no future session runs without Panama at
361+
all.** This repo's history contains commits titled *"UNVERIFIED: JDK 26 not
362+
available in this sandbox"*. That conclusion was wrong in the only way that
363+
matters — it was never re-tested after an `apt-get update`. **JDK 25 installs
364+
from Ubuntu's own archive in one command, gives FINAL Panama FFM (final since
365+
22), and runs the entire Java suite green.** A session that reports "no JDK
366+
here" without running the three commands below is reporting a stale index, not
367+
a fact about the container.
368+
369+
**JDK 26 — the version this repo's own commits targeted — needs ONE extra apt
370+
source, and Ubuntu's stock archive alone will never offer it.** Add Adoptium
371+
and it is an ordinary `apt-get install`:
372+
373+
```sh
374+
# the extra source — Ubuntu noble stops at openjdk-25; Adoptium carries 8..26
375+
curl -fsSL https://packages.adoptium.net/artifactory/api/gpg/key/public \
376+
| sudo tee /etc/apt/keyrings/adoptium.asc >/dev/null
377+
. /etc/os-release && echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] \
378+
https://packages.adoptium.net/artifactory/deb $VERSION_CODENAME main" \
379+
| sudo tee /etc/apt/sources.list.d/adoptium.list
380+
sudo apt-get update
381+
sudo apt-get install -y temurin-26-jdk # -> /usr/lib/jvm/temurin-26-jdk-amd64
382+
```
383+
384+
Ubuntu's own archive serves **openjdk-25** (also fine — Panama is final since
385+
22, and the suite passes on it too):
386+
387+
```sh
388+
sudo apt-get update # NOT optional — see the trap below
389+
sudo apt-get install -y openjdk-25-jdk-headless
390+
/usr/lib/jvm/java-25-openjdk-amd64/bin/java -version # openjdk 25.0.4
391+
```
392+
393+
**The trap that made this look impossible.** The pre-seeded apt index pointed
394+
at `openjdk-25 25.0.2+10-1~24.04`, a version already withdrawn from the pool,
395+
so the install died on a bare `404 Not Found` — which reads as *"this package
396+
does not exist"* rather than *"your index is stale"*. `apt-get update` moved
397+
the candidate to `25.0.4+7-1~24.04` and the install succeeded immediately.
398+
Same shape as this workspace's other freshness traps: **a cached view reporting
399+
absence is not evidence of absence.**
400+
401+
### Running the Java suite — there is no build tool, and that is deliberate
402+
403+
`java/src/test/.../AllTests.java` is a plain `main` that runs every suite in
404+
one JVM and exits 0 / 1 / 2 (passed / failed / **native artifact absent, so
405+
nothing ran** — a missing library reported as a failure would send the reader
406+
hunting a bug that is not there). So: build the `.so`, `javac`, `java`.
407+
408+
```sh
409+
# 1. the native artifact
410+
cd native/lgj-abi && cargo build --release # -> target/release/liblgj_abi.so
411+
412+
# 2. compile main + test together (56 files)
413+
J=/usr/lib/jvm/temurin-26-jdk-amd64/bin # or java-25-openjdk-amd64
414+
find java/src/main java/src/test -name '*.java' > /tmp/srcs.txt
415+
$J/javac -d /tmp/jout @/tmp/srcs.txt
416+
417+
# 3. run. `-Dlgj.library` is an EXPLICIT request and `Abi.locateLibrary`
418+
# refuses to fall back to a search path if it cannot be honoured — by
419+
# design, so a run can never silently measure a different artifact.
420+
$J/java --enable-native-access=ALL-UNNAMED \
421+
-Dlgj.library=$PWD/target/release/liblgj_abi.so \
422+
-cp /tmp/jout com.adaworldapi.lancegraph.AllTests
423+
```
424+
425+
**Measured 2026-09-16 on BOTH `Temurin 26.0.2.1` and `openjdk 25.0.4`:
426+
`ALL PASSED (409 checks)`** across all 16 suites, against `abi 0.11, simd
427+
ndarray::simd avx512, profile release` — identical on the two JDKs. The
428+
runtime line the suite prints at the end names the ABI minor, the SIMD backend
429+
and the library path — read it, because it is what tells you the run exercised
430+
the artifact you meant.
431+
432+
### What JDK 25 does and does NOT give you
433+
434+
| need | reachable here? | source |
435+
|---|---|---|
436+
| **Panama FFM** (`java.lang.foreign`, the whole `internal/ffm` membrane) | **YES** — final since 22 | Ubuntu `openjdk-25-jdk-headless`, or Adoptium `temurin-26-jdk` |
437+
| the 16-suite `AllTests` run (409 checks) | **YES**, verified on 25 AND 26 | either of the above |
438+
| `valhalla-lab/src/stable` (records, JDK 26) | **YES** | Adoptium `temurin-26-jdk` |
439+
| `valhalla-lab/src/valhalla` (**value** records, JDK 27 EA) | not via apt | `https://jdk.java.net/valhalla/` — reachable, `HTTP 200` |
440+
441+
**Only the Valhalla EA arm needs a non-apt fetch, and it is not a gate.**
442+
Adoptium's noble repo carries 8 through 26 and stops there (`apt-cache search
443+
temurin` shows no 27+), and mainline 27 would not help anyway — `value record`
444+
is a Valhalla EA feature, not a mainline one. `https://jdk.java.net/valhalla/`
445+
**is reachable through this environment's proxy** (verified `HTTP 200`), so
446+
that build is a download away rather than a blocker. `bench/` and
447+
`valhalla-lab/` are measurement arms; the merge gate is the Rust suite plus the
448+
409-check Java run, and both of those are fully reachable here.
449+
`bench/` and `valhalla-lab/` are measurement arms, NOT gates; the merge gate is
450+
the Rust suite plus the 409-check Java run, and both are reachable here.
451+
452+
**Consequence for every future session:** "the Java side could not be verified"
453+
is no longer an acceptable status line for this repo. The Rust half
454+
(`cargo test` in `native/lgj-abi`) and the Java half (409 checks) are BOTH
455+
runnable in this container, and a PR that claims the Java surface is unverified
456+
is claiming something that takes about four minutes to falsify.
457+
358458
## Missing-capability STOP rule
359459

360460
A consumer or facade that needs a capability the substrate lacks does

0 commit comments

Comments
 (0)