@@ -533,17 +533,19 @@ jobs:
533533 # job — never in the dockcross cross-compilers (which have no node) or per-platform.
534534 # ---------------------------------------------------------------------------
535535 # ---------------------------------------------------------------------------
536- # llama-atmosphere-agent: the standalone (non-reactor, unpublished ) local coding-agent
537- # project that wires Atmosphere's built-in OpenAI-compatible agent runtime to this
538- # project's OpenAiCompatServer. Two jobs, mirroring the langchain4j pair :
536+ # llama-atmosphere-agent: the standalone (non-reactor, never on Maven Central ) local
537+ # coding-agent project that wires Atmosphere's built-in OpenAI-compatible agent runtime to
538+ # this project's OpenAiCompatServer. Three jobs, all publish gates :
539539 # - model-free: unit tests + the wire-contract tests, which drive the REAL
540540 # OpenAiCompatServer over a loopback socket with a scripted backend (no native lib,
541541 # no GGUF) and pin the streamed tool_calls / role=tool / multi-round shape — seconds,
542- # on every PR.
542+ # on every PR. It also builds the GitHub Release asset (the agent jar WITHOUT the core).
543543 # - model-backed: the same loop against the cached Qwen2.5-1.5B tool model through the
544544 # downloaded Linux native library (chat, streaming, tool call + result, read/write/read
545- # loop). Validation-only, not a publish gate: a small model's wording is not a release
546- # signal, the deterministic contract is the model-free job.
545+ # loop). A gate since its assertions stopped pinning wording (content checks are limited
546+ # to facts no instruct model gets wrong and to tool results) and it ran green throughout.
547+ # - smoke-agent-linux (further down, after package-fatjars): the release asset itself,
548+ # started next to the real core fat jar.
547549 # The project is built with -Dllama.version=<reactor version> against the core that was just
548550 # installed to the local repo, so it always tests the code of this checkout.
549551 # ---------------------------------------------------------------------------
@@ -569,6 +571,28 @@ jobs:
569571 run : mvn -B --no-transfer-progress -f llama-atmosphere-agent/pom.xml "-Dllama.version=${VERSION}" spotless:check
570572 - name : Build and test (unit + model-free wire contract against the real OpenAiCompatServer)
571573 run : mvn -B --no-transfer-progress -f llama-atmosphere-agent/pom.xml "-Dllama.version=${VERSION}" verify
574+ # The GitHub Release asset llama-atmosphere-agent-<core version>-jar-with-dependencies.jar:
575+ # the agent plus Atmosphere/JLine, WITHOUT the core (src/assembly/agent-jar.xml), so it is a
576+ # few MB and the natives are not in the release twice. Never deployed to Maven Central.
577+ # smoke-agent-linux launches it next to the real core fat jar; the attach jobs sign it.
578+ - name : Build the agent release jar (without the core)
579+ run : >
580+ mvn -B --no-transfer-progress -f llama-atmosphere-agent/pom.xml "-Dllama.version=${VERSION}"
581+ -P assembly -DskipTests package
582+ - name : Collect the agent release jar + sha256
583+ run : |
584+ mkdir -p agent-jar
585+ cp "llama-atmosphere-agent/target/llama-atmosphere-agent-${VERSION}-jar-with-dependencies.jar" agent-jar/
586+ (cd agent-jar && for f in *.jar; do sha256sum "$f" > "$f.sha256"; done)
587+ ls -la agent-jar
588+ - name : Upload the agent release jar
589+ uses : actions/upload-artifact@v7
590+ with :
591+ name : llama-atmosphere-agent-jar
592+ path : agent-jar/
593+ compression-level : 0 # jars are already deflated
594+ retention-days : 7
595+ if-no-files-found : error
572596
573597 test-java-llama-atmosphere-agent-integration :
574598 name : Integration Test llama-atmosphere-agent (model-backed)
@@ -3665,6 +3689,50 @@ jobs:
36653689 server-err.log
36663690 if-no-files-found : warn
36673691
3692+ # The agent release asset, launched the way the README tells a user to: `java -jar` on the agent
3693+ # jar lying next to the real all-backends Linux fat jar, so the core is found only through the
3694+ # agent manifest's Class-Path. Proves the two assets fit together (matching version in the file
3695+ # names, nothing missing on either side), that the agent jar carries no core, and that a
3696+ # one-shot answer and a read_file tool round work through the shipped jars.
3697+ smoke-agent-linux :
3698+ name : Smoke test the agent release jar (Linux)
3699+ needs : [test-java-llama-atmosphere-agent, package-fatjars, verify-model-cache]
3700+ runs-on : ubuntu-latest
3701+ steps :
3702+ - uses : actions/checkout@v7
3703+ - uses : actions/download-artifact@v8
3704+ with :
3705+ name : llama-atmosphere-agent-jar
3706+ path : agent-assets/
3707+ - uses : actions/download-artifact@v8
3708+ with :
3709+ name : llama-fatjar-smoke-linux
3710+ path : agent-assets/
3711+ - name : Restore shared GGUF model cache (populated by download-models; no re-download)
3712+ uses : actions/cache/restore@v6
3713+ with :
3714+ path : models/
3715+ key : gguf-models-${{ hashFiles('.github/models.csv') }}
3716+ enableCrossOsArchive : true
3717+ - name : Validate model files
3718+ run : .github/validate-models.sh
3719+ - uses : actions/setup-java@v6
3720+ with :
3721+ distribution : ' temurin'
3722+ java-version : ${{ env.JAVA_VERSION }}
3723+ # The agent is Java 21 (Atmosphere's floor), unlike the Java 8 core: its ceiling is 65.
3724+ - name : Verify Java 21 bytecode (no class newer than major 65)
3725+ run : .github/verify-bytecode-version.sh --max-major 65 agent-assets/llama-atmosphere-agent-*-jar-with-dependencies.jar
3726+ - name : Run the agent release-jar smoke test
3727+ run : .github/smoke-agent-jar.sh agent-assets "models/${TOOL_MODEL_NAME}"
3728+ - name : Upload agent logs
3729+ if : failure()
3730+ uses : actions/upload-artifact@v7
3731+ with :
3732+ name : agent-smoke-linux-logs
3733+ path : agent-*.log
3734+ if-no-files-found : warn
3735+
36683736 smoke-fatjar-windows :
36693737 name : Smoke test all-backends fat jar (Windows)
36703738 needs : [package-fatjars, verify-model-cache]
@@ -3880,7 +3948,7 @@ jobs:
38803948
38813949 publish-snapshot :
38823950 name : Publish Snapshot to Central
3883- needs : [check-snapshot, crosscompile-linux-x86_64-cuda, crosscompile-android-aarch64-opencl, package-android-aar, test-android-emulator, code-style, test-java-llama-langchain4j, test-java-llama-kotlin, package-fatjars, smoke-fatjar-linux, smoke-fatjar-windows, smoke-fatjar-linux-aarch64, smoke-fatjar-windows-arm64, smoke-fatjar-macos]
3951+ needs : [check-snapshot, crosscompile-linux-x86_64-cuda, crosscompile-android-aarch64-opencl, package-android-aar, test-android-emulator, code-style, test-java-llama-langchain4j, test-java-llama-kotlin, test-java-llama-atmosphere-agent, test-java-llama-atmosphere-agent-integration, package-fatjars, smoke-fatjar-linux, smoke-fatjar-windows, smoke-fatjar-linux-aarch64, smoke-fatjar-windows-arm64, smoke-fatjar-macos, smoke-agent-linux ]
38843952 if : needs.check-snapshot.result == 'success' && inputs.publish_to_central
38853953 runs-on : ubuntu-latest
38863954 environment : maven-central
@@ -4059,11 +4127,11 @@ jobs:
40594127
40604128 github-snapshot :
40614129 name : Update Snapshot Pre-release on GitHub
4062- needs : [publish-snapshot, package-fatjars]
4130+ needs : [publish-snapshot, package-fatjars, test-java-llama-atmosphere-agent ]
40634131 # Also runs when publish-snapshot FAILED (not when skipped/cancelled): a Central
40644132 # publish-poll timeout reds that job after the artifacts were already uploaded —
40654133 # the GitHub pre-release assets must not be lost in that case.
4066- if : ${{ !cancelled() && (needs.publish-snapshot.result == 'success' || needs.publish-snapshot.result == 'failure') && needs.package-fatjars.result == 'success' }}
4134+ if : ${{ !cancelled() && (needs.publish-snapshot.result == 'success' || needs.publish-snapshot.result == 'failure') && needs.package-fatjars.result == 'success' && needs.test-java-llama-atmosphere-agent.result == 'success' }}
40674135 runs-on : ubuntu-latest
40684136 # maven-central so the GPG_PRIVATE_KEY / GPG_PASSPHRASE secret is delivered (it is
40694137 # scoped to this environment) for signing the fat jars below. This environment has
@@ -4086,6 +4154,12 @@ jobs:
40864154 with :
40874155 name : llama-fatjars
40884156 path : snapshot-assets/
4157+ # The agent jar (+ sha256) — built without the core, run next to one of the fat jars above.
4158+ # Same directory, so sign-fatjars.sh signs it and the upload glob attaches it.
4159+ - uses : actions/download-artifact@v8
4160+ with :
4161+ name : llama-atmosphere-agent-jar
4162+ path : snapshot-assets/
40894163 # GPG-sign the fat jars so each carries a detached .asc signature alongside its
40904164 # .sha256 checksum — signature parity with the thin jars (which maven-gpg signs at
40914165 # deploy) and with the BAF / srcmorph sibling fat jars. The .sha256 files (integrity)
@@ -4147,7 +4221,7 @@ jobs:
41474221 publish-release :
41484222 name : Publish Release to Central
41494223 if : needs.check-tag.result == 'success' && inputs.publish_to_central
4150- needs : [check-tag, crosscompile-linux-x86_64-cuda, crosscompile-android-aarch64-opencl, package-android-aar, test-android-emulator, code-style, test-java-llama-langchain4j, test-java-llama-kotlin, package-fatjars, smoke-fatjar-linux, smoke-fatjar-windows, smoke-fatjar-linux-aarch64, smoke-fatjar-windows-arm64, smoke-fatjar-macos]
4224+ needs : [check-tag, crosscompile-linux-x86_64-cuda, crosscompile-android-aarch64-opencl, package-android-aar, test-android-emulator, code-style, test-java-llama-langchain4j, test-java-llama-kotlin, test-java-llama-atmosphere-agent, test-java-llama-atmosphere-agent-integration, package-fatjars, smoke-fatjar-linux, smoke-fatjar-windows, smoke-fatjar-linux-aarch64, smoke-fatjar-windows-arm64, smoke-fatjar-macos, smoke-agent-linux ]
41514225 runs-on : ubuntu-latest
41524226 environment : maven-central
41534227 permissions :
@@ -4326,11 +4400,11 @@ jobs:
43264400
43274401 github-release-signed :
43284402 name : Attach Signed Binaries to GitHub Release
4329- needs : [publish-release, package-fatjars]
4403+ needs : [publish-release, package-fatjars, test-java-llama-atmosphere-agent ]
43304404 # Also runs when publish-release FAILED (not when skipped/cancelled): a Central
43314405 # publish-poll timeout reds that job after the artifacts were already uploaded —
43324406 # the GitHub release assets must not be lost in that case.
4333- if : ${{ !cancelled() && (needs.publish-release.result == 'success' || needs.publish-release.result == 'failure') && needs.package-fatjars.result == 'success' }}
4407+ if : ${{ !cancelled() && (needs.publish-release.result == 'success' || needs.publish-release.result == 'failure') && needs.package-fatjars.result == 'success' && needs.test-java-llama-atmosphere-agent.result == 'success' }}
43344408 runs-on : ubuntu-latest
43354409 # maven-central so the GPG_PRIVATE_KEY / GPG_PASSPHRASE secret is delivered (it is
43364410 # scoped to this environment) for signing the fat jars below. This environment has
@@ -4353,6 +4427,12 @@ jobs:
43534427 with :
43544428 name : llama-fatjars
43554429 path : release-assets/
4430+ # The agent jar (+ sha256) — built without the core, run next to one of the fat jars above.
4431+ # Same directory, so sign-fatjars.sh signs it and the upload glob attaches it.
4432+ - uses : actions/download-artifact@v8
4433+ with :
4434+ name : llama-atmosphere-agent-jar
4435+ path : release-assets/
43564436 # GPG-sign the fat jars so each carries a detached .asc signature alongside its
43574437 # .sha256 checksum — signature parity with the thin jars (which maven-gpg signs at
43584438 # deploy) and with the BAF / srcmorph sibling fat jars. The .sha256 files (integrity)
0 commit comments