Skip to content

Commit c468e76

Browse files
authored
Merge pull request #86 from AdaWorldAPI/claude/fold-distillation-pr-wave-s57uj7
Dispatch the Java gate: 765 checks that were gating nothing
2 parents aef2382 + b1189cb commit c468e76

5 files changed

Lines changed: 388 additions & 15 deletions

File tree

‎.claude/board/ISSUES.md‎

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## ISS-LGJ-CONSUMERS-HAVE-NO-CI-LINE (2026-09-22) — OPEN
1+
## ISS-LGJ-CONSUMERS-HAVE-NO-CI-LINE (2026-09-22) — RESOLVED 2026-09-22 (job landed; dispatch proven by its own first run)
22

33
`main` was RED and nothing said so. `GraphHopTest` reported 1 FAILED / 65
44
passed at `bb81d80`, established by running it from a clean worktree, not
@@ -38,6 +38,83 @@ confirm the job goes red. A job that builds the consumers but never runs
3838
their mains would pass, and would be the no-gate-with-extra-steps outcome
3939
this entry exists to name.
4040

41+
---
42+
43+
**RESOLUTION (2026-09-22).** `java-suites` in `.github/workflows/lint.yml`:
44+
twelve steps, same three-sibling checkout as `rust-test`, `cargo build
45+
--release` for the artifact, then the four `javac`/`java` command strings
46+
`java/README.md` documents, verbatim. No build tool was introduced — there
47+
still is none, by design.
48+
49+
**The first task — acquisition — is ANSWERED, and by a different mechanism
50+
than the local one, which is why this entry was right to refuse to generalise
51+
from the container's ladder.** Chain, each link read from a primary source
52+
rather than inferred:
53+
54+
1. `actions/setup-java`'s `normalizeVersion`: `if (version.endsWith('-ea')) {
55+
... stable = false }` — so `java-version: '28-ea'` is not-stable.
56+
2. its temurin installer: `const releaseType = this.stable ? 'ga' : 'ea'`.
57+
3. Adoptium's API, queried live: `release_type=ea` + `version=[28,29)` +
58+
linux/x64/jdk serves `jdk-28+16-ea-beta` — the same build this container
59+
runs. And `/v3/info/available_releases` omits 28 while naming it
60+
`most_recent_feature_version`, which is *why* the `-ea` suffix is load-bearing.
61+
62+
The container's blocker (gateway-blocked distribution hosts, hence the
63+
GitHub-release download path) is a **this-container** constraint and never
64+
applied to a runner. The version is deliberately NOT pinned to `+16`: internal
65+
head pins are forbidden, and an upstream EA build is an external dependency
66+
whose purpose is to move — what the suite needs is JEP 401 under preview, which
67+
every 28 EA build carries.
68+
69+
**Two counts in the entry above were wrong, measured on `origin/main`
70+
(`aef2382`) before the job was written:** it is **four** consumer mains, not
71+
three (`trades` carries both `TradesAllocationTest` and `TradesParityTest`, and
72+
running one of two would have been precisely the no-gate-with-extra-steps
73+
outcome this entry names). The core suite is **612 checks / 17 suites**, which
74+
this entry had right while root `CLAUDE.md` still briefed every session with
75+
`409 / 16 suites / abi 0.11`. That drift is fixed in the same commit, and fixed
76+
STRUCTURALLY: the live count now exists in exactly one dated place and every
77+
other site had its number removed rather than re-pinned. One measurement
78+
restated in eight places goes stale in eight places.
79+
80+
Measured, all four command strings run verbatim: core **612** (0 failures, abi
81+
0.12, avx512, release), bricks **70**, graph **68**, trades **3** and **12** —
82+
**765 checks across 5 entry points**, every one exit 0.
83+
84+
**FALSIFIER: RUN, red-then-green, in the shape this entry demanded.** The stale
85+
`0` pin was re-introduced in `GraphHopTest` and the consumer step's `run:` body
86+
— extracted VERBATIM from the committed workflow via a YAML parse, not retyped —
87+
was executed under `bash -e`:
88+
89+
| run | mains reached | step exit |
90+
|---|---|---|
91+
| stale `0` pin | all four; `::error::consumer suites FAILED: …GraphHopTest` | **1** |
92+
| restored | bricks 70, graph 68, trades 3 + 12, "all four consumer suites passed" | **0** |
93+
94+
Two properties, one run. It catches the exact defect that survived a merge
95+
(`1 FAILED, 67 passed` — the `bb81d80` shape), AND it reaches every main
96+
regardless: a bare `java` under `bash -e` aborts the step at the first red one,
97+
so one broken consumer would have masked the other three and each CI round would
98+
have revealed exactly one of them. `AllTests` does not behave that way either,
99+
and now neither does this loop.
100+
101+
What a local run CANNOT prove is
102+
dispatch: whether a runner starts the job and reaches JDK 28. **That is now
103+
SETTLED by the first run (#86, `af58fbd`): `java-suites completed success`, all
104+
13 steps.** The runner's own log closes the acquisition chain end to end —
105+
`Downloading Java 28.0.0+16.0.ea (Temurin-Hotspot) from
106+
.../adoptium/temurin28-binaries/releases/download/jdk-28%2B16-ea-beta/...`, the
107+
exact release the Adoptium API named, resolved into
108+
`/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/28.0.0-ea.16.0.ea/x64`.
109+
110+
It also MEASURED something that had only been reasoned about. The runner reports
111+
`abi 0.12, simd ndarray::simd avx2 (x86-64-v3)` against this host's `avx512`,
112+
and every count comes back byte-identical — core **612**, bricks **70**, graph
113+
**68**, trades **3** and **12**. The `simdBackend()` "diagnostic only" rule was
114+
asserted here from reading the tests (`AbiContractTest` asserts only that a
115+
backend was reported, `FusionParityTest` notes it, `DoctrineFenceTest` counts
116+
source lines); it is now observed across two different backends.
117+
41118
## ISS-LGJ-TOOLCHAIN-MUST-BE-JDK28-VALHALLA-PANAMA — UNBLOCKED; JDK 28 installed and the flip proven (2026-09-19)
42119

43120
⊘ The entry below says the migration is blocked because no JDK 28 can be

‎.claude/board/LATEST_STATE.md‎

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,85 @@
1+
## 2026-09-22 — the Java gate is DISPATCHED, and one measurement stops being restated in eight places
2+
3+
`ISS-LGJ-CONSUMERS-HAVE-NO-CI-LINE` is RESOLVED. `java-suites` in
4+
`.github/workflows/lint.yml` builds `liblgj_abi.so`, then runs the four
5+
`javac`/`java` command strings `java/README.md` documents, verbatim — no build
6+
tool was introduced, there still is none by design.
7+
8+
- **The issue's first task was acquisition, not the job**, and it resolves by a
9+
mechanism this container does not use — which is why the entry was right to
10+
refuse to generalise from the local ladder. Read from primary sources:
11+
setup-java's `normalizeVersion` sets `stable = false` on an `-ea` suffix, its
12+
temurin installer then asks `release_type=ea`, and Adoptium's API (queried
13+
live) serves `jdk-28+16-ea-beta` — the same build this container runs. The
14+
container's blocker was gateway-blocked distribution hosts; a runner never had
15+
that constraint. NOT pinned to `+16`: internal head pins are forbidden, and
16+
what the suite needs is JEP 401 under preview, which every 28 EA build carries.
17+
- **Measured on `origin/main` (`aef2382`), every command verbatim:** core **612
18+
checks / 17 suites / 0 failures** (abi 0.12, avx512, release), bricks **70**,
19+
graph **68**, trades **3** and **12** — **765 checks across 5 entry points**,
20+
all exit 0. All of it was gating nothing.
21+
- **Two counts were wrong on the way in.** FOUR consumer mains, not three
22+
(`trades` carries two; running one of two would have been the
23+
no-gate-with-extra-steps outcome the issue names). And root `CLAUDE.md`
24+
briefed every session with `409 / 16 suites / abi 0.11`. Fixed
25+
**structurally**, not re-pinned: the live count now exists in exactly ONE
26+
dated place and every other site had its number REMOVED. One measurement
27+
restated in eight places goes stale in eight places — which is what had
28+
happened. The three surviving 409s are dated historical measurements kept as
29+
evidence; the Valhalla-flip comparison is only meaningful against its own
30+
baseline and must not be restated forward.
31+
- **Falsifier run, red-then-green, on the step body extracted from the
32+
committed YAML rather than retyped.** Stale `0` pin: all four mains reached,
33+
`::error::` named the culprit, exit 1. Restored: exit 0. Not fail-fast
34+
deliberately — a bare `java` under `bash -e` aborts at the first red main, so
35+
one broken consumer would mask three others and each round would reveal one.
36+
37+
**The one OPEN item CLOSED on the first run** (#86, `af58fbd`):
38+
`java-suites completed success`, 13/13 steps. The runner downloaded
39+
`Java 28.0.0+16.0.ea (Temurin-Hotspot)` from
40+
`adoptium/temurin28-binaries/.../jdk-28+16-ea-beta` — the exact release the
41+
Adoptium API had named, so the chain is closed by execution and not only by
42+
reading. Bonus measurement: the runner reports `avx2 (x86-64-v3)` where this
43+
host reports `avx512`, and all 765 counts are byte-identical, which turns the
44+
backend-agnostic claim from something read out of the tests into something
45+
observed across two backends.
46+
47+
**Review follow-up (`2a30039`), both findings CodeRabbit-confirmed.** Two real
48+
defects, both mine:
49+
50+
- **Persisted checkout credentials** (zizmor `artipacked`). Fixed on ALL
51+
THIRTEEN checkout steps, not the four named — `persist-credentials` appeared
52+
nowhere in the file, every job runs `cargo`, so the `build.rs` read path was
53+
identical in `format`/`clippy`/`rust-test`. Verified free first: nothing
54+
pushes, `contents: read`, no secret read. **Verified at RUNTIME, not just in
55+
YAML** — each of the four checkouts logs `persist-credentials: false`, then
56+
`Setting up auth`, then `Removing auth` INSIDE the checkout step, so the
57+
credential no longer spans the later `cargo build`. Without the flag there is
58+
no in-step `Removing auth` and the config survives to post-job cleanup.
59+
- **The documented suite command could not run.** My own pointer sentence aimed
60+
at a JDK 25/26 command without the preview flags; measured `error: value
61+
classes are a preview feature and are disabled by default`, exit 1. Fixing it
62+
surfaced three more in the same block (`/usr/lib/jvm` now holds only Java 21
63+
so `temurin-26-jdk-amd64` does not exist here; the block mixed working
64+
directories and died on `find: 'java/src/main'`; `-Dlgj.library=$PWD/target/...`
65+
named an incidental leftover `target/` that is a separate inode from what
66+
step 1 builds) — and one I INTRODUCED, caught only by executing it:
67+
`--manifest-path` instead of `cd` broke the toolchain, because rustup reads
68+
`rust-toolchain.toml` from the CWD (`rustc 1.94.1 is not supported`, exit
69+
101). The `cd` is load-bearing and is back in a subshell. Verified by
70+
extracting the fenced block by PARSE and running it under `bash -e`: exit 0,
71+
`ALL PASSED (612 checks)`.
72+
I also nearly filed a FALSE finding — the two `.so` paths have different
73+
mtimes, which read as a stale artifact; they are md5-identical. Checking
74+
content instead of timestamps stopped it.
75+
76+
**OPEN:** nothing on this. The remaining gap is elsewhere and unchanged —
77+
`lint.yml` fires `on: {pull_request, push}` for THIS repository only, so an
78+
upstream-only merge in `lance-graph` or `ndarray` cannot start the workflow and
79+
a sibling break stays invisible until someone pushes here. That is the trigger
80+
gap `E-THE-CI-GAP-WAS-THE-TRIGGER-NOT-THE-COVERAGE-1` already names; this job
81+
inherits it rather than fixing it, and now inherits it for the Java half too.
82+
183
## 2026-09-22 — D-LGJ-FOLD-5: the consumer stops asking sixteen times, and a red pin on `main` gets root-caused
284

385
The consumer half of minor 12. `BricksQuery.sumBy()` was sixteen queries —

0 commit comments

Comments
 (0)