Skip to content

Declare the opt-in modules in natives.csv, so the smokes know what the loader leaves out - #527

Merged
bernardladenthin merged 1 commit into
mainfrom
local/optin-column
Oct 11, 2026
Merged

bernardladenthin merged 1 commit into
mainfrom
local/optin-column

Conversation

@bernardladenthin

Copy link
Copy Markdown
Owner

First, what run 38164077038 answered — and it is the first time any of it has been

build jobs 54 green, both ROCm among them
ROCm Windows / Linux 3:08 h / 2:57 h — they are the three-hour pipeline; every other job finished inside an hour
verify-native-deps.py 99 native libraries checked, 0 violations

So the SYCL run path is clean and the Linux jars no longer declare libgomp.so.1 with nothing
noticing. package got past the dependency check for the first time.

Then it found this, and it is my own loose end

##[error]classpath: the loader did not put the openvino module jar of Linux/x86_64 in place

A consequence of making openvino opt-in, which I should have foreseen when I added
OPT_IN_BACKENDS: smoke-natives-jars.sh asserts the loader line names every GPU module of the
platform, read from natives.csv — and the list had no way to say that one of them is deliberately
left out.

The loader even printed the reason, one line above the failure:

[jllama] GPU module 'openvino' is on the classpath but not used: it is opt-in, because …

Nothing read it.

The fix: declare it where every consumer already looks

An optin column in natives.csv. check-natives.py validates it — yes/no, only a module can
be opt-in, and the rows of one backend cannot disagree, since the loader decides per backend — and
holds LlamaLoader.OPT_IN_BACKENDS to it in both directions:

  • a backend the list calls opt-in while the loader does not → a jar that takes over silently, which is
    the measured OpenVINO regression the opt-in exists for;
  • the reverse → a jar that is inert with no row saying why.

The two smoke layers read the same column, with different conditions

expectation
smoke-lib.sh + the PowerShell twin (model-backed rows) every module of the set except the opt-in ones — the loader leaves them out, and OpenVINO's CPU plugin would otherwise take over a server round and run 172× slower
smoke-natives-jars.sh (load-only) names every module through net.ladenthin.llama.backend, opt-in included — it loads the library and exits, so nothing is at risk

That second row is the part I care about: it makes this script the only place in CI that loads an
opt-in module at all
, so the mechanism is exercised rather than merely respected.

Verification

122 buildcheck tests (four new: the column's rules, and both directions of the constant check).
Both module lists and the property construction were simulated against the real natives.csv
locally rather than left to CI:

smoke_set_modules      -> cuda13 rocm sycl vulkan           (openvino correctly absent)
smoke-natives-jars.sh  -> cuda13 rocm sycl vulkan openvino  (named via the property)
no modules (macOS)     -> java gets no -D argument at all

check-run-scripts.py 161 scripts clean, check-release-gate.py 0 violations, check-natives.py
0 disagreements.

Still unproven

Everything behind smoke-natives-jars.sh was skipped, as in every run before: the five smoke
sets, the four smoke-natives rows with the RPC smoke on aarch64, the macOS smoke, the agent smoke.
Said in TODO.md rather than implied.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E2h8gXyyE5UeimkL9vQv9G

…e loader leaves out

Package JARs failed in run 38164077038 with: classpath: the loader did not put the openvino module jar of Linux/x86_64 in place. That is a consequence of making openvino opt-in, which I should have foreseen when I added OPT_IN_BACKENDS: smoke-natives-jars.sh asserts the loader line names every GPU module of the platform, read from natives.csv, and the list had no way to say that one of them is deliberately left out. The loader even printed the reason -- is on the classpath but not used: it is opt-in -- and nothing read it.

Declared where every consumer already looks: an optin column in natives.csv. check-natives.py validates it (yes or no, only a module can be opt-in, and the rows of one backend cannot disagree, since the loader decides per backend) and holds LlamaLoader.OPT_IN_BACKENDS to it in both directions. A backend the list calls opt-in while the loader does not would ship a jar that takes over silently -- the measured OpenVINO regression the opt-in exists for -- and the reverse would leave a jar inert with no row saying why.

The two smoke layers now read the same column with different conditions, which is the part worth getting right. The model-backed rows (smoke-lib.sh and its PowerShell twin) stop expecting an opt-in module, because the loader leaves it out and because OpenVINO's CPU plugin would otherwise take over a server round and run 172x slower. smoke-natives-jars.sh instead names every module of the platform through net.ladenthin.llama.backend, opt-in ones included: it only loads the library and exits, so nothing is at risk, and it becomes the only place in CI that loads an opt-in module at all -- the mechanism is exercised rather than merely respected.

What this run did answer, for the record: all 54 build jobs green, both ROCm among them (Windows 3:08 h, Linux 2:57 h -- they are the three-hour pipeline, every other job finished inside an hour), and verify-native-deps.py reporting 99 native libraries checked, 0 violations. The SYCL run path and the removed libgomp dependency are therefore proven. Everything behind smoke-natives-jars.sh was skipped and remains unproven.

122 buildcheck tests, four new ones covering the column and both directions of the constant check. Both module lists and the property construction were simulated against the real natives.csv locally, including the macOS case with no module jars at all; check-run-scripts.py parses all 161 scripts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01E2h8gXyyE5UeimkL9vQv9G
@sonarqubecloud

Copy link
Copy Markdown

@bernardladenthin
bernardladenthin merged commit f2260e8 into main Oct 11, 2026
66 of 70 checks passed
@bernardladenthin
bernardladenthin deleted the local/optin-column branch October 11, 2026 23:30

This branch had an error being deployed

1 failed and 1 active deployments
startgate — 691faedd Deployed Oct 11, 2026 by bernardladenthin via Start gate (abort window) #1231
maven-central — 691faedd Deployed Oct 11, 2026 by bernardladenthin via Verify GPG signing key (no secrets printed) #1231
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant