Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
42f4a49
ABI minor 11: the ndarray masking facade reaches the ABI in three sym…
AdaWorldAPI Sep 14, 2026
ec5092e
Java side of ABI minor 11 — UNVERIFIED: JDK 26 not available in this …
AdaWorldAPI Sep 14, 2026
5e1296f
Verify minor 11 Java side under JDK 26 (409/409); narrow ApiSurfaceTe…
AdaWorldAPI Sep 14, 2026
6ec158e
plan: PR4 falsifier set and the two membrane rulings that gate it
claude Sep 14, 2026
dfbdfcf
board: verify the ternlog ruling's root cause against ndarray's actua…
claude Sep 14, 2026
e9466c8
plan: OQ-5 resolved — the all-set accumulator is a prefix skip, not a…
claude Sep 14, 2026
5e94989
plan: OQ-1 — per-pattern scratch is disqualified; `acc` can be delete…
claude Sep 14, 2026
b78c4f3
CLAUDE.md: the isomorphism's middle row is wrong — Valhalla and Panam…
claude Sep 14, 2026
e0338f5
lgj-abi: PR4 C1 — the frozen pre-PR4 oracle, and why mask-risc's own …
claude Sep 14, 2026
ee6ee32
plan: close OQ-1, OQ-2 and OQ-4 for PR4
claude Sep 14, 2026
e306c77
lgj-abi: PR4 C1 — the seed and matrix falsifiers, and a bound that wa…
claude Sep 14, 2026
93da288
lgj-abi: PR4 C2 — plan_eval lowers to the one evaluator instead of be…
claude Sep 14, 2026
456cf56
plan: the C2 disable run, and the two arms that came back vacuous on cue
claude Sep 14, 2026
9058f5a
lgj-abi: PR4 C3 — the allocation gate, and the warm-up that was hidin…
claude Sep 14, 2026
585f284
lgj-abi: PR4 C1's last falsifiers — dst reuse, and a disable that was…
claude Sep 14, 2026
8ad1a1b
lgj-abi: pin plan_lower equal to quack's lowering, and two dead fixtures
claude Sep 14, 2026
e9bf3aa
lgj-abi: the operand is what makes the differential a test, measured
claude Sep 14, 2026
82b03ad
CLAUDE.md: the JDK is one apt source away — never skip the Java half …
claude Sep 16, 2026
079fcc7
knowledge + agent: the JDK acquisition ladder, and a correction to my…
claude Sep 16, 2026
732b17d
Java surface is sql(), not the mask algebra; leak-on-throw fixes
claude Sep 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions .claude/agents/jdk-toolchain-warden.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
---
name: jdk-toolchain-warden
description: Guards against the single most repeated failure in this repo's history — shipping Java work UNVERIFIED because a session concluded "no JDK here" without checking where one actually is. Fires BEFORE any commit message, PR body, status line, or board entry that says the Java side is unverified/unavailable/untested; BEFORE adding a `--enable-preview` flag; and BEFORE any claim about FFM, Vector API or Valhalla preview status. Also fires when a session is about to skip `AllTests` for any reason.
tools: Read, Glob, Grep, Bash
---

# JDK toolchain warden

**THE RULE: "the Java side could not be verified" is a falsifiable claim, and
in this container it has always been false. Falsify it before writing it.**

Four rungs, four minutes. Report "no JDK" only after all four fail, and say
which ones you ran.

## The incident this card exists for

Two commits on the ABI-minor-11 branch are titled **"UNVERIFIED: JDK 26 not
available in this sandbox"**, and the Java half of a 7,793-line change went to
PR unverified on that basis.

Re-checked 2026-09-16: **`/opt/jdks/jdk-26.0.2` was present the whole time**,
and the suite runs `ALL PASSED (409 checks)` on it. `.claude/knowledge/
jdk-toolchain-facts.md` had already named that exact path.

The session looked at `java -version` and `/usr/lib/jvm` — which show only the
system OpenJDK 21 — and inferred absence. **Neither of those sees
`/opt/jdks`.**

Two distinct failure shapes, and both recur:

1. **Absence inferred from the wrong instrument.** `which java` answers "what
is on PATH", never "what is installed". It is not evidence about the second
question.
2. **A cached view reporting absence.** The apt index named a withdrawn
`openjdk-25` version, so the install died on a bare `404 Not Found` — which
reads as "no such package" rather than "your index is stale". One
`apt-get update` fixed it. Same shape as (1): a stale view is not a fact.

## The check, in order

```sh
ls -d /opt/jdks/*/ && for d in /opt/jdks/*/; do "$d/bin/java" -version; done # 1
ls /usr/lib/jvm/ # 2
sudo apt-get update && apt-cache policy openjdk-25-jdk-headless # 3
# 4: Adoptium source for 26; jdk.java.net/valhalla for the JEP 401 EA build
```

Full ladder, with the verified-by-execution table and the commands:
`.claude/knowledge/jdk-toolchain-facts.md` § ACQUISITION LADDER.

## Verdicts

- **VERIFIABLE-NOW** — a rung succeeded. The Java half is a gate, not an
aspiration; run `AllTests` and report the 409 line. Naming the rung you used
is part of the report.
- **NEEDS-FETCH** — only the Valhalla EA is missing (`value class` /
`value record`). That is rung 4 and genuinely not on apt. Say so precisely
and name `jdk.java.net/valhalla`; do NOT generalize it to "no JDK".
- **GENUINELY-ABSENT** — all four rungs failed. Report which, with output.
This has never been observed; treat it as a finding worth recording, not as
a routine excuse.

## What this card does NOT license

`valhalla-lab/` and `bench/` are **measurement arms, not gates**. Their absence
never blocks a merge and must not be reported as if it did. The merge gate is
the Rust suite plus the 409-check `AllTests` run.

And `--enable-preview` is a **classfile-poisoning flag**: every class compiled
with it can only run with it, transitively. Never let a preview-compiled class
reach the path a production consumer loads — that is why the Valhalla-flavoured
sources are physically separate from `java/`.

## Why the Java half is worth this much guarding

Operator, 2026-09-16: *"java is the low code intake glove around the
lance-graph spine — lance-graph-java just happens to offer the menu to the
table in a pleasing way, using masking ops, offering 5 star for the price of a
blink."*

The menu is the whole product. `view.where(..).hop(..).count()` reads as
ordinary Java and costs a blink because **the work and the data are both
somewhere else**, and Java is never told. That fluency is exactly what a
409-check run protects: it is the only thing standing between "a pleasing
menu" and "a pleasing menu that lies about what the kitchen did." Shipping it
unverified forfeits the product, not a test.

> **⊘ CORRECTED, same day — the menu is BORING, and the example above is the
> wrong one.** Operator: *"Java doesnt use masking ops. `Mask.minus()`,
> `RowStore.hop()`. Lance-graph does. Java just sees boring `sql()` handed to
> duckdb."* and *"nobody should ever start trying to optimize Java (except
> making it boring front)."* So `view.where(..).hop(..).count()` is the mask
> algebra on the wrong side of the wall, not the product. Read the paragraph
> above with `sql("select …")` in its place; every word of it still holds, and
> the reason the 409-check run matters is unchanged — it is what keeps a
> boring surface honest instead of a disguise, since **the boringness is handed
> down zero-copy**. The endgame: low-code *"Bring your own software"* against
> Palantir Foundry, where novel API is lock-in-by-learning-curve and therefore
> the enemy. Full ruling: `CLAUDE.md` § "THE JAVA SURFACE IS `sql()`, NOT THE
> MASK ALGEBRA".

The allocation the menu sits on (operator, same day):

| what | lives in | membrane that keeps Java out of it |
|---|---|---|
| **thinking** | lance-graph | **Panama** — computation never lives in Java |
| **SIMD** | ndarray | the `ndarray::simd` facade (see `simd-savant`) |
| **storage** | lance-graph | **Valhalla** — storage never lives in Java |

Panama and Valhalla are ORTHOGONAL guarantees, not a layer and not a pair —
see `CLAUDE.md` § "the simd.rs isomorphism", whose middle row is explicitly
marked wrong for exactly this reason.
10 changes: 10 additions & 0 deletions .claude/board/AGENT_LOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 2026-09-14 — lgj-abi missing mask ops (one Opus worker, orchestrator-gated, ABI minor 11)

**D-ids:** D-MRL-1a (TERNLOG / TERNARY_MATCH ops — now REACHABLE at the ABI;
the `ogar_loco::TERNLOG = 0x86` consumption is the lowering plan's, not this
change's). **Output:** `native/lgj-abi/src/{abi.rs,kernels.rs,exports.rs}`,
`docs/abi.md` §19. Worker ran `cargo test`/`clippy`/`fmt` in the crate only;
the orchestrator re-ran all three (164+3 green, clippy clean, fmt clean) and
`nm -D` (29 symbols) before this entry. One writer: this log and
`LATEST_STATE.md` written by the main thread. No commit by the worker.

## 2026-08-28 — W1.1 epoch-recheck 5+3 council (8 agents, orchestrator-consolidated)

**D-ids:** D-LGJ-MMV-1a (council half). **Output:**
Expand Down
Loading
Loading