Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
589 commits
Select commit Hold shift + click to select a range
7a51bbc
Refuse several completions of one prompt instead of answering one (F197)
claude Oct 20, 2026
0bf2d41
Record the commit of F197 in the bug-hunt ledger
claude Oct 20, 2026
c07aad0
Let FfmTextToSpeech.close() wait for a synthesis in progress (F198)
claude Oct 20, 2026
7215d0a
Record the commit of F198 in the bug-hunt ledger
claude Oct 20, 2026
aa58171
Write the stream's opening event even when a heartbeat started the st…
claude Oct 20, 2026
b6c3f00
Record the commit of F199 in the bug-hunt ledger
claude Oct 20, 2026
a2bfad8
Bound chatBatch's threads and wait for every request before throwing …
claude Oct 20, 2026
12398c9
Record the commit of F200 in the bug-hunt ledger
claude Oct 20, 2026
8e2642f
Refuse a model id llama.cpp would split into several aliases (F201)
claude Oct 20, 2026
28aec2a
Record the commit of F201 in the bug-hunt ledger
claude Oct 20, 2026
29ff8c1
Ask upstream only for the stop word on the Anthropic route (F202)
claude Oct 20, 2026
4f2c4ef
Record the commit of F202 in the bug-hunt ledger
claude Oct 20, 2026
af84cb5
Keep a chat template kwarg that is not one JSON value as text (F203)
claude Oct 20, 2026
a7e761a
Record the commit of F203 in the bug-hunt ledger
claude Oct 20, 2026
da6fa8e
Leave a pending Java exception in place in the UTF-8 JNI helpers (F204)
claude Oct 20, 2026
14d5917
Record the commit of F204 in the bug-hunt ledger
claude Oct 20, 2026
200cc90
Answer an Ollama /api/generate without a prompt as a model load (F205)
claude Oct 20, 2026
897a6ba
Record the commit of F205 in the bug-hunt ledger
claude Oct 20, 2026
380e672
Bring the bug-hunt ledger overview and statuses up to date
claude Oct 20, 2026
7193556
Correct the docs the branch review found stale
claude Oct 20, 2026
6ed6881
Cover every user-visible bug-hunt fix in the Unreleased changelog
claude Oct 20, 2026
6295831
Answer a non-object Ollama chat message with 400 (F213)
claude Oct 20, 2026
afc0be9
Record the commit of F213 in the bug-hunt ledger
claude Oct 20, 2026
d00936b
Answer a backend IOException before the first chunk with 500 (F214)
claude Oct 20, 2026
ad113e9
Record the commit of F214 in the bug-hunt ledger
claude Oct 20, 2026
7933eb0
Refuse Ollama raw generate with system, template or context (F215)
claude Oct 20, 2026
e07155b
Record the commit of F215 in the bug-hunt ledger
claude Oct 20, 2026
a4d0604
Answer an Ollama chat without messages as a model load (F216)
claude Oct 20, 2026
4dc1cd6
Record the commit of F216 in the bug-hunt ledger
claude Oct 20, 2026
eade620
Forward Ollama think true as enable_thinking (F217)
claude Oct 20, 2026
323889b
Record the commit of F217 in the bug-hunt ledger
claude Oct 20, 2026
fea0a1d
Forward json_schema next to grammar to upstream's chat parser (F218)
claude Oct 20, 2026
2703f62
Record the commit of F218 in the bug-hunt ledger
claude Oct 20, 2026
63f05e1
Refuse token caps below -1 and n below 1 like upstream (F219)
claude Oct 20, 2026
5d0c777
Record the commit of F219 in the bug-hunt ledger
claude Oct 20, 2026
ca1baa9
Map chat logprobs and top_logprobs as upstream's parser does (F220)
claude Oct 20, 2026
bb6cd21
Record the commit of F220 in the bug-hunt ledger
claude Oct 20, 2026
7e965d9
Report a matched stop word as stop_reason stop_sequence (F221)
claude Oct 20, 2026
e6a6f69
Record the commit of F221 in the bug-hunt ledger
claude Oct 20, 2026
cb123a9
Close the text block before a new streamed thinking block (F222)
claude Oct 20, 2026
39c36ff
Record the commit of F222 in the bug-hunt ledger
claude Oct 20, 2026
82bef4a
Refuse an Anthropic max_tokens that is not a number (F223)
claude Oct 20, 2026
2639344
Record the commit of F223 in the bug-hunt ledger
claude Oct 20, 2026
e372019
Refuse Responses images without a URL and foreign tool parts (F224)
claude Oct 20, 2026
c247160
Record the commit of F224 in the bug-hunt ledger
claude Oct 20, 2026
4913acf
Refuse Responses function_call arguments that are not a string (F225)
claude Oct 20, 2026
baa8b84
Record the commit of F225 in the bug-hunt ledger
claude Oct 20, 2026
88f823e
Forward logit_bias and n_probs on the Responses route (F226)
claude Oct 20, 2026
ea8389a
Record the commit of F226 in the bug-hunt ledger
claude Oct 20, 2026
740938d
Forward only the tool a named tool_choice asks for (F227)
claude Oct 20, 2026
0a2f0f3
Record the commit of F227 in the bug-hunt ledger
claude Oct 20, 2026
beaffcc
Refuse Responses input items of an unknown type (F228)
claude Oct 20, 2026
546354c
Record the commit of F228 in the bug-hunt ledger
claude Oct 20, 2026
ad8b0b1
Report a Responses answer cut off by a limit as incomplete (F229)
claude Oct 20, 2026
dd4f69c
Record the commit of F229 in the bug-hunt ledger
claude Oct 20, 2026
f4164c7
Point the recorded commit hashes at the rebased history
claude Oct 20, 2026
efe5b75
Pin the refusal text of a nameless function tool_choice
claude Oct 21, 2026
5781ef5
Read a float top_n like upstream and refuse a negative one (F230)
claude Oct 21, 2026
56ba0d3
Record the commit of F230 in the bug-hunt ledger
claude Oct 21, 2026
893ede3
Serve a rerank from texts when documents is null (F231)
claude Oct 21, 2026
d028ae0
Record the commit of F231 in the bug-hunt ledger
claude Oct 21, 2026
5c5a892
Refuse a native rerank body that is not a JSON array (F232)
claude Oct 21, 2026
cef566e
Record the commit of F232 in the bug-hunt ledger
claude Oct 21, 2026
27cd696
Render an IPv6 router host bracketed in RouterClient.toString
claude Oct 21, 2026
0a49c54
Refuse a tool schema that is not one JSON value in appendTool (F233)
claude Oct 21, 2026
cadfd64
Record the commit of F233 in the bug-hunt ledger
claude Oct 21, 2026
b8c3992
Refuse an empty adapter path in appendCsvValue (F234)
claude Oct 21, 2026
9065372
Record the commit of F234 in the bug-hunt ledger
claude Oct 21, 2026
e265ccd
List F234 in the bug-hunt ledger overview and note it under F188
claude Oct 21, 2026
edad4ca
Release and keep receiving on an Error in submitAllThenReceive (F235)
claude Oct 21, 2026
2e26427
Record the commit of F235 in the bug-hunt ledger
claude Oct 21, 2026
4b410d1
Attach later batch failures as suppressed instead of dropping them (F…
claude Oct 21, 2026
4e4b8ce
Record the commit of F236 in the bug-hunt ledger
claude Oct 21, 2026
2eb3fff
Keep the RPC slot while a stopped server thread survives (F237)
claude Oct 21, 2026
ccf30c0
Record the commit of F237 in the bug-hunt ledger
claude Oct 21, 2026
8809fe4
Leave unencodable offline model paths to the native loader (F238)
claude Oct 21, 2026
b0bbfb3
Record the commit of F238 in the bug-hunt ledger
claude Oct 21, 2026
4205d20
Sweep stale .tmp leftovers of the old flat layout again (F239)
claude Oct 21, 2026
ebd7c0f
Record the commit of F239 in the bug-hunt ledger
claude Oct 21, 2026
0bf1e38
Note F235 to F238 under the bug-hunt entries they follow up
claude Oct 21, 2026
eafc272
Import Charset in OfflineModelGuardTest instead of naming it in full
claude Oct 21, 2026
166a267
Start every slot with the server's LoRA adapters in patch 0021 (F240)
claude Oct 21, 2026
91eafcc
Record the commit of F240 in the bug-hunt ledger
claude Oct 21, 2026
1047673
Keep an RPC stop issued before the bind in the C API (F241)
claude Oct 21, 2026
184e420
Record the commit of F241 in the bug-hunt ledger
claude Oct 21, 2026
6c3e264
Describe the throwing native stop in RpcServer.close's Javadoc
claude Oct 21, 2026
b90de3c
Complete a streamed tool call when the next one starts (F242)
claude Oct 21, 2026
b2752fe
Record the commit of F242 in the bug-hunt ledger
claude Oct 21, 2026
f10aa6a
Serve the agent's in-process model under its model id (F243)
claude Oct 21, 2026
55d207f
Record the commit of F243 in the bug-hunt ledger
claude Oct 21, 2026
4dde45b
Name the highest index in the rejected tool-call delta message
claude Oct 21, 2026
7f7ef60
Release the heartbeat test backends on an observed heartbeat
claude Oct 21, 2026
1543695
Pin the fields /api/generate hands to the chat template path
claude Oct 21, 2026
3d20bdd
Pin the MIME detection of Ollama images
claude Oct 21, 2026
9980ce0
Test the client-disconnect path of the streamed completions
claude Oct 21, 2026
30713e1
Let the disconnect tests wait for a stream that never ends on its own
claude Oct 21, 2026
7ba425f
Test that end() closes a thinking block no text closed
claude Oct 21, 2026
6b75aa0
Test the untested branches of the Anthropic request translation
claude Oct 21, 2026
d8297df
Pin the output indices and sequence numbers of the Responses stream
claude Oct 21, 2026
c99c587
Test the format choice and the TEI defaults of the rerank response
claude Oct 21, 2026
e911f9a
Test top_n, usage and the TEI form of /v1/rerank end to end
claude Oct 21, 2026
13ea636
Test that an already bracketed IPv6 host is not bracketed again
claude Oct 21, 2026
f8f874b
Test the start guards of NativeServer through the backend seam
claude Oct 21, 2026
d8f5352
Test that a nested response field is named with a slash
claude Oct 21, 2026
711943b
Pin the batch thread bound with latches instead of sleeps
claude Oct 21, 2026
63257fd
Test the library suffixes and the regular-file guard of the cleanup
claude Oct 21, 2026
a9b7b5f
Test that a failed LlamaModel call keeps a four-byte character
claude Oct 21, 2026
2cad6a2
Prove cache reuse in the LoRA cache test with timings.cache_n
claude Oct 21, 2026
3baad59
Test that takeStrings reads a populated array in order
claude Oct 21, 2026
61bbccb
Pin the partial tool-call events of the two F128 tests
claude Oct 21, 2026
8ca7b8a
Test the trailing usage chunk with an empty choices array
claude Oct 21, 2026
50ae06a
Test that the agent surfaces a 413 for an oversized request
claude Oct 21, 2026
2fbffa3
Check every control character's round trip through the scripted chunks
claude Oct 21, 2026
43f2f3b
Close two gaps in the new streaming assembler tests
claude Oct 21, 2026
6461e29
Say where /api/generate's load answer deviates from Ollama
claude Oct 21, 2026
c26bb17
Say that max_tokens 0 makes the server generate one token
claude Oct 21, 2026
6bda165
Describe the tool_choice mapping as the code does it
claude Oct 21, 2026
368baf5
Name the image and thinking blocks in the Anthropic Javadoc
claude Oct 21, 2026
1c3b655
Describe the reasoning item in the Responses class Javadoc
claude Oct 21, 2026
c5e53cc
Document the TEI rerank answer and the rerank usage
claude Oct 21, 2026
b197707
Credit the lifecycle lock in NativeServer.main's close comment
claude Oct 21, 2026
3d46b3a
Record the Anthropic and rerank Javadoc fixes in the ledger
claude Oct 21, 2026
a9905cc
Say that response_fields paths are slash-separated
claude Oct 21, 2026
bcb8dee
Say where the __verbose object sits in each answer
claude Oct 21, 2026
50e0671
Say that null clears the field in withOptionalJson's Javadoc
claude Oct 21, 2026
587057d
Document the configuration checks of toJson and finetune
claude Oct 21, 2026
67379b4
Document the bias and tool-argument normalisations
claude Oct 21, 2026
0d95f2f
Credit escapeNonAscii, not Jackson, for the ASCII training config
claude Oct 21, 2026
9373886
Describe the bounded batch pool in the SpotBugs exclusion
claude Oct 21, 2026
1d0f436
List all four rerank entry fields in the C header
claude Oct 21, 2026
9fabf3e
Describe the current llama-ffm test set in its README and CLAUDE.md
claude Oct 21, 2026
a520c36
Say which tool-call fragments reach onPartialToolCall
claude Oct 21, 2026
707da0e
Document the one-prompt, one-completion rule on every entry point
claude Oct 21, 2026
026bfed
Name the rebased commits in three ledger notes
claude Oct 21, 2026
cbf841f
Merge the checked-files ledger to one line per path
claude Oct 21, 2026
6bd24c7
Point four ledger entries at their renamed or removed tests
claude Oct 21, 2026
9b82397
Record this pass's fixes in the changelog
claude Oct 21, 2026
96a82d6
Give the newest ledger entries the anchors their overview links use
claude Oct 21, 2026
c73cc35
List what the branch review left open in TODO.md
claude Oct 21, 2026
df182e3
Correct three details of the closing documentation pass
claude Oct 21, 2026
1503b94
Refuse a non-string prompt on Ollama's /api/generate (F244)
claude Oct 21, 2026
f3829a9
Record the commit of F244 in the bug-hunt ledger
claude Oct 21, 2026
28edd47
Test that an invalid request keeps a four-byte character
claude Oct 21, 2026
a21184b
Save LoraCacheFreshSlot's slot state under its save directory
claude Oct 21, 2026
ae3f8c0
Pin that an Anthropic file image source is dropped like upstream
claude Oct 21, 2026
124e359
Make MemoryManagementTest's context-shift tests shift the context
claude Oct 21, 2026
0fb100c
Skip FfmRpcServerTest where libjllama is not loadable
claude Oct 21, 2026
53e592a
Record the non-string /api/generate prompt in the changelog
claude Oct 21, 2026
af52880
Bring the branch-review TODO section up to this pass
claude Oct 21, 2026
3e49d39
Keep the loader tests' fixture build info out of the JVM (F245)
claude Oct 21, 2026
031e7b3
Record the commit of F245 in the bug-hunt ledger
claude Oct 21, 2026
6cae6ce
Find the router test's model by its file name, not by "Qwen3"
claude Oct 21, 2026
9c41569
Skip the infill tests on a model without FIM tokens
claude Oct 21, 2026
f8fc50b
Let the cancellation tests end only through the cancel
claude Oct 21, 2026
7ddd78f
Give the grammar tests a prompt and ignore EOS
claude Oct 21, 2026
59eeeb7
Correct the ledger on which infill test the dropped prefix reddens
claude Oct 21, 2026
c7bcfe7
Record the loader-test isolation and this pass's open points
claude Oct 21, 2026
0233127
Format the infill prompt on the raw completion paths (F246)
claude Oct 21, 2026
c1cc9c4
Record the commit of F246 in the bug-hunt ledger
claude Oct 21, 2026
bdc37e2
Render messages into the prompt on the raw completion paths (F247)
claude Oct 21, 2026
45ad26c
Record the commit of F247 in the bug-hunt ledger
claude Oct 21, 2026
ea22ed6
Document infilling and messages on the raw completion paths
claude Oct 21, 2026
bda7fd8
Name the messages and infill shapes in handleCompletions' refusals
claude Oct 21, 2026
d3fc9a8
Skip the infill example test on a model without FIM tokens
claude Oct 21, 2026
d497b40
Refuse chat fields beside messages on the raw completion paths (F248)
claude Oct 21, 2026
b81c981
Record the commit of F248 in the bug-hunt ledger
claude Oct 21, 2026
9c310b5
Name the Ling-3 stop string in the F248 ledger entry
claude Oct 21, 2026
03caed5
Record the chat-field refusal beside messages in the changelog
claude Oct 21, 2026
85f6afa
Keep the template's reasoning budget on raw paths with messages (F249)
claude Oct 21, 2026
718f140
Record the commit of F249 in the bug-hunt ledger
claude Oct 21, 2026
31c2403
Record the raw-path reasoning budget in the changelog and TODO
claude Oct 21, 2026
d88214f
Preserve the template's tokens on raw paths with messages (F250)
claude Oct 21, 2026
a184ba4
Record the commit of F250 in the bug-hunt ledger
claude Oct 21, 2026
a1a5efb
Resolve slot files under --slot-save-path as upstream does (F251)
claude Oct 21, 2026
dc1316a
Record the commit of F251 in the bug-hunt ledger
claude Oct 21, 2026
fdca13a
Offer the reasoning budget's tags in the builder (F252)
claude Oct 21, 2026
f4e9987
Record the commit of F252 in the bug-hunt ledger
claude Oct 21, 2026
e81a5ed
Name slot files in the README's checkpoint example
claude Oct 21, 2026
5abe67e
Refuse number fields of the wrong type on every chat route (F253)
claude Oct 21, 2026
51f269a
Record the commit of F253 in the bug-hunt ledger
claude Oct 21, 2026
cb0b97f
Force Anthropic's named tool and refuse other tool_choice types (F254)
claude Oct 21, 2026
1cd5073
Record the commit of F254 in the bug-hunt ledger
claude Oct 21, 2026
de3c64f
Refuse logprobs on a streamed chat with tools like upstream (F255)
claude Oct 21, 2026
02d187f
Record the commit of F255 in the bug-hunt ledger
claude Oct 21, 2026
80d2d9c
Name an Anthropic image without media_type by its bytes (F256)
claude Oct 21, 2026
25ff1d4
Record the commit of F256 in the bug-hunt ledger
claude Oct 21, 2026
baecd5a
Refuse an Anthropic image source that cannot be served (F257)
claude Oct 21, 2026
346ada7
Record the commit of F257 in the bug-hunt ledger
claude Oct 21, 2026
27933f7
Read each mapper number once and keep the cap aliases in a constant
claude Oct 21, 2026
595a8be
Take upstream's multimodal prompt object on the raw paths (F258)
claude Oct 21, 2026
b2e7395
Record the commit of F258 in the bug-hunt ledger
claude Oct 21, 2026
e5d35b1
Map format and images of a raw Ollama generation (F259)
claude Oct 21, 2026
af9250d
Record the commit of F259 in the bug-hunt ledger
claude Oct 21, 2026
b99a25b
Refuse template and context on a templated Ollama generation (F260)
claude Oct 21, 2026
d971ea6
Record the commit of F260 in the bug-hunt ledger
claude Oct 21, 2026
2c6e5c5
Serve upstream's token-count routes (F261)
claude Oct 21, 2026
c242d70
Record the commit of F261 in the bug-hunt ledger
claude Oct 21, 2026
f13394f
Default OpenAiCompatServer to llama.cpp's port 9931
claude Oct 21, 2026
7048501
Name the refused value in the new route and count messages
claude Oct 21, 2026
266636d
Name the renamed media check in the ledger entry of F261
claude Oct 21, 2026
359b6d0
Report a backend failure after the stream started as an event (F262)
claude Oct 21, 2026
08893ed
Record the commit of F262 in the bug-hunt ledger
claude Oct 21, 2026
f06729f
Keep the streams' disconnect log line stable
claude Oct 21, 2026
8771717
Reject a malformed stream envelope instead of ending the stream (F263)
claude Oct 21, 2026
9d820bd
Record the commit of F263 in the bug-hunt ledger
claude Oct 21, 2026
93be4df
Make LlamaLoader.initialize() idempotent after a load (F264)
claude Oct 21, 2026
7c285ee
Record the commit of F264 in the bug-hunt ledger
claude Oct 21, 2026
b528b4e
Report the arguments that arrive before a tool call's name (F265)
claude Oct 21, 2026
9377ec7
Record the commit of F265 in the bug-hunt ledger
claude Oct 21, 2026
a0a95aa
Pin that AgentOptions.withWorkspace keeps every other option
claude Oct 21, 2026
967864a
Satisfy SpotBugs for the stream and loader fixes
claude Oct 21, 2026
b1a5eb2
Make the stale-RPC-server test hold under gtest_repeat
claude Oct 21, 2026
3c80ab4
Pin that the agent retries a 503 and not a 400
claude Oct 21, 2026
5bd74b9
Skip the tests bound to CI's models on another model, with the reason
claude Oct 21, 2026
f60d0db
Record the pre-release fixes in the changelog and the upgrade guide
claude Oct 21, 2026
fc83503
Close the pre-release items in TODO.md and compare SECURITY/CONTRIBUTING
claude Oct 21, 2026
fa9aecb
Point the README at the upgrade guide and update langchain4j's stream
claude Oct 21, 2026
9f89e36
Name the token-count routes and the default port in CLAUDE.md
claude Oct 21, 2026
accd1bc
Give the ledger entries F246 to F260 the anchors their overview uses
claude Oct 21, 2026
c46e918
Refuse server operations on a vocab-only model instead of crashing (F…
claude Oct 21, 2026
9c810f7
Record the commit of F266 in the bug-hunt ledger
claude Oct 21, 2026
a4edb90
Answer raw Ollama images on a backend without a marker with 501 (F267)
claude Oct 21, 2026
36e49cf
Record the commit of F267 in the bug-hunt ledger
claude Oct 21, 2026
4fe2c5e
Name the slot files of the slot tests per run
claude Oct 21, 2026
0e2df0e
Skip the image-colour test on a model that is not a trained VLM
claude Oct 21, 2026
bf3c447
Rewrap one doc comment of jllama_api.h to the column limit
claude Oct 21, 2026
a986c0e
Upgrade llama.cpp from b11639 to b11760, drop patch 0016 (Kolibri-1)
claude Oct 21, 2026
01e0aed
Upgrade llama.cpp from b11760 to b11761, drop patch 0019 (#30505 merged)
claude Oct 21, 2026
162ce52
Upgrade llama.cpp from b11761 to b11799, refresh patch 0007
claude Oct 21, 2026
836f297
Upgrade llama.cpp from b11799 to b11800
claude Oct 21, 2026
d9300c6
Move both SYCL natives jobs to upstream's oneAPI installers
claude Oct 21, 2026
452251b
Move the stream-envelope translation out of LlamaModel so its test ru…
claude Oct 21, 2026
be90df1
Evaluate the prompt the same way twice in the raw reasoning-budget co…
claude Oct 21, 2026
c23fa96
Record the commits of the PR #554 fixes for F263 and F249 in the bug-…
claude Oct 21, 2026
0c36431
Upgrade llama.cpp from b11800 to b11803
claude Oct 21, 2026
68ab75d
Correct the README against the code, and give the classes jar its Mai…
claude Oct 22, 2026
834ae19
Record the commit of F269 in the bug-hunt ledger
claude Oct 22, 2026
9daae5b
Count the grammar tests' tokens from the stream and the result, not b…
claude Oct 22, 2026
c59569a
Let an RPC stop be for the serves in progress when it is made, not fo…
claude Oct 22, 2026
272c8fc
Record the commit of F271 in the bug-hunt ledger
claude Oct 22, 2026
85ebbfd
Compare generations only on the same prompt-cache path in the Java te…
claude Oct 22, 2026
e2c1657
Record the commit of F272 in the bug-hunt ledger
claude Oct 22, 2026
ff3ee6b
Upgrade llama.cpp from b11803 to b11809
claude Oct 22, 2026
8e0dedb
Upgrade llama.cpp from b11809 to b11814
claude Oct 22, 2026
f64a42e
Compare generations only on the same prompt-cache path in eight more …
claude Oct 22, 2026
a38580a
Record the commit of the F272 follow-up in the bug-hunt ledger
claude Oct 22, 2026
ad28542
Upgrade llama.cpp from b11814 to b11815
claude Oct 22, 2026
d10f211
Run the Windows sign job on every run instead of skipping it, and ref…
claude Oct 22, 2026
9c835e8
Restore the classpath line of the natives-jar load smoke lost with F269
claude Oct 22, 2026
7de7a84
Record the smoke-script repair under F269 in the bug-hunt ledger
claude Oct 22, 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
15 changes: 14 additions & 1 deletion .github/buildcheck/natives.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
SMOKE_EXCLUDED_OSES = ("Linux-Android",)
# The job that re-uploads the Windows natives artifacts Authenticode-signed (CLAUDE.md, "Code signing").
SIGN_JOB = "sign-windows-natives"
# A job-level key sits at the four-space indent of the job body (` if:`); a step's `if:` is deeper.
JOB_CONDITION = re.compile(r"^ if:")
SMOKE_EXCLUDED_TREES = ("Linux/s390x",)

# `package` uploads each smoke set alone, as llama-smoke-<target>, for the smoke jobs; a matrix row
Expand Down Expand Up @@ -245,14 +247,25 @@ def check_signing(natives, jobs, uploads):
or reads one of them -- `overwrite` deletes the artifact for a moment, so a build or test job still
reading it would race (the Windows Java test job reads natives-cpu-windows-x86-64 through the
reusable workflow's input). A Windows row without its step would ship that jar unsigned on a
signed run, which `--require-signed` in `package` then reports late."""
signed run, which `--require-signed` in `package` then reports late.

And the job carries no job-level `if:`: it must run on every run (a no-op without the switch,
gated step by step) rather than be skipped, because GitHub applies a skip to every job in the
dependency chain behind the skipped one, past any condition of the jobs in between -- the first
form was `if:`-skipped without the switch, `package` tolerated that with `!cancelled()` and ran
green, and the smoke sets, the report and both publish jobs behind `package` were skipped with
the run concluding "success" (run 38870889665, attempt 2)."""
windows = [r["classifier"] for r in natives if tree(r).split("/")[0] == "Windows"]
sign = jobs.get(SIGN_JOB)
if sign is None:
return [f"publish.yml has no `{SIGN_JOB}` job"] if windows else []
signed = {c for c, uploaders in uploads.items() if SIGN_JOB in uploaders}
failures = [f"publish.yml {SIGN_JOB} re-uploads (one per Windows row): missing {c}"
for c in sorted(set(windows) - signed)]
if any(JOB_CONDITION.match(line) for line in sign.lines):
failures.append(f"publish.yml {SIGN_JOB} carries a job-level `if:` -- the job must run on every run "
f"(a no-op without the switch), never be skipped: a skipped job skips every job behind "
f"`package` in the dependency chain, past any condition in between")
failures += [f"publish.yml {SIGN_JOB} re-uploads natives-{c}, which is not a Windows row -- it would replace "
f"the build artifact of another platform with an unsigned copy"
for c in sorted(signed - set(windows))]
Expand Down
12 changes: 12 additions & 0 deletions .github/buildcheck/tests/test_natives.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,18 @@ def test_the_sign_job_re_uploads_every_windows_row_with_overwrite(self):
"error` would leave the unsigned build artifact in place when the download matched "
"nothing"] * len(WINDOWS))

def test_the_sign_job_carries_no_job_level_condition(self):
"""A skipped sign job skips every job behind package (GitHub's dependency-chain rule), so the job
must run on every run; a step-level `if:` (the per-step gate on the switch) is what it uses."""
skipped = [" if: github.event_name == 'workflow_dispatch' && inputs.sign_windows"] + sign_uploads()
self.assertEqual(natives.check_workflow(ROWS, jobs(sign=skipped)),
["publish.yml sign-windows-natives carries a job-level `if:` -- the job must run on every "
"run (a no-op without the switch), never be skipped: a skipped job skips every job "
"behind `package` in the dependency chain, past any condition in between"])
gated = [line for step in sign_uploads() for line in
([step, " if: env.SIGN_WINDOWS == 'true'"] if step.startswith(" - ") else [step])]
self.assertEqual(natives.check_workflow(ROWS, jobs(sign=gated)), [])

def test_the_sign_job_waits_for_every_reader_of_a_windows_artifact(self):
# a job reading the artifact between the build and the signed re-upload would race the overwrite
self.assertEqual(natives.check_workflow(ROWS, jobs(consumer_needs="[build]")),
Expand Down
12 changes: 11 additions & 1 deletion .github/smoke-natives-jars.sh
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,18 @@ classes="$(find "$TARGET" -maxdepth 1 -name 'llama-*.jar' | grep -E '/llama-[0-9
mapfile -t natives < <(find "$TARGET" -maxdepth 1 -name 'llama-*.jar' ! -path "$classes" ! -name '*-sources.jar' \
! -name '*-javadoc.jar' ! -name '*-jar-with-dependencies.jar' | sort)
[ "${#natives[@]}" -gt 0 ] || { echo "::error::no natives jars in $TARGET" >&2; exit 2; }
# The classes jar is runnable: its manifest names ServerLauncher, which is what the README's
# `jbang --deps <natives jar> net.ladenthin:llama:<v>` lines rely on (JBang runs a GAV through its
# Main-Class). Read from the jar itself, not from the pom: the entry went missing once, with the
# fat-jar assembly that used to carry it, and nothing noticed.
main_class="$(unzip -p "$classes" META-INF/MANIFEST.MF | tr -d '\r' | sed -n 's/^Main-Class: //p')"
[ "$main_class" = "net.ladenthin.llama.server.ServerLauncher" ] \
|| { echo "::error::the classes jar $classes names '$main_class' as Main-Class, expected net.ladenthin.llama.server.ServerLauncher" >&2; exit 1; }
echo "classes jar: $classes (Main-Class $main_class); ${#natives[@]} natives jars"
# The consumer's classpath: the classes jar, every natives jar and the runtime dependencies. This
# line went missing once (F269 replaced it with the Main-Class check above), and bash -n cannot see
# an unbound variable: the first package job to reach this step after that died on `$path` below.
path="$classes:$(IFS=:; echo "${natives[*]}"):$DEPS"
echo "classes jar: $classes; ${#natives[@]} natives jars"

run() {
local label="$1"
Expand Down
Loading
Loading