From a8f9bf82f52b4c2c0dec055e7fbec522f87c8982 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:46:41 +0200 Subject: [PATCH 1/5] propose(CH-003): CI builds the native client on Linux only Opens CH-003, proposing that build.yml's build job run only on ubuntu-latest now that the published container image is the default way to run the client, with ADR-002 recording the choice. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- .clue/id-ledger.yaml | 6 ++++++ .../proposal.md | 21 +++++++++++++++++++ .../tasks.md | 15 +++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 changes/CH-003-ci-native-build-linux-only/proposal.md create mode 100644 changes/CH-003-ci-native-build-linux-only/tasks.md diff --git a/.clue/id-ledger.yaml b/.clue/id-ledger.yaml index fee05ca..56f7a70 100644 --- a/.clue/id-ledger.yaml +++ b/.clue/id-ledger.yaml @@ -20,3 +20,9 @@ events: - {id: CH-002, kind: numeric, state: live, prefix: CH, component: "2"} - {id: TASK-001, kind: numeric, state: reserved, prefix: TASK, component: "1"} - {id: TASK-001, kind: numeric, state: live, prefix: TASK, component: "1"} + - {id: CH-003, kind: numeric, state: reserved, prefix: CH, component: "3"} + - {id: ADR-002, kind: numeric, state: reserved, prefix: ADR, component: "2"} + - {id: CH-003, kind: numeric, state: live, prefix: CH, component: "3"} + - {id: ADR-002, kind: numeric, state: live, prefix: ADR, component: "2"} + - {id: TASK-002, kind: numeric, state: reserved, prefix: TASK, component: "2"} + - {id: TASK-002, kind: numeric, state: live, prefix: TASK, component: "2"} diff --git a/changes/CH-003-ci-native-build-linux-only/proposal.md b/changes/CH-003-ci-native-build-linux-only/proposal.md new file mode 100644 index 0000000..1dd34ec --- /dev/null +++ b/changes/CH-003-ci-native-build-linux-only/proposal.md @@ -0,0 +1,21 @@ +--- +id: CH-003 +type: change +status: open +links: [G-001] +title: CI builds the native client on Linux only +--- + +# CH-003 — CI builds the native client on Linux only + +This change is plan-less: no plan exists in this repository, and it follows CH-002 (launchers default to the published GHCR image) as scoped by the maintainer. + +## What + +`.github/workflows/build.yml`'s `build` job stops running on a Windows and macOS matrix and runs only on `ubuntu-latest`. The `docker` job is unchanged. The README states that CI builds and tests the native client on Linux only, so running natively on Windows or macOS is possible but not CI-tested. ADR-002 records the choice. + +Native execution stays supported as `SECURITY.md` describes; this change narrows what CI verifies, not what the client does. + +## Why + +The three-OS matrix arrived with the native ZIP/TAR distributions (commit c1c7d32). Since CH-002, the published container image is the default way to run the client, and Docker Desktop on Windows and macOS runs that same Linux image. Building only on Linux is the usual setup for a container-shipped client, and the Windows and macOS jobs cost CI time for a path few contributors use. diff --git a/changes/CH-003-ci-native-build-linux-only/tasks.md b/changes/CH-003-ci-native-build-linux-only/tasks.md new file mode 100644 index 0000000..15b7fba --- /dev/null +++ b/changes/CH-003-ci-native-build-linux-only/tasks.md @@ -0,0 +1,15 @@ +--- +id: TASK-002 +type: tasks +status: open +links: [CH-003] +title: Tasks for CH-003 +--- + +# Tasks — CH-003 + +- [ ] Record ADR-002: CI builds and tests the native client on Linux only, while the container image remains the cross-platform path. +- [ ] Reduce `.github/workflows/build.yml`'s `build` job to `ubuntu-latest`, removing the OS matrix and the Windows-only step. +- [ ] State in `README.md` that native Windows and macOS runs are not CI-tested. +- [ ] Update `docs/architecture/README.md`'s durable choices to link ADR-002. +- [ ] Add a `CHANGELOG.md` `[Unreleased]` entry. From bc707c606560d6e28589a548e0195a15784245ca Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:47:43 +0200 Subject: [PATCH 2/5] implement(CH-003): CI builds the native client on Linux only build.yml's build job runs only on ubuntu-latest; the OS matrix and the Windows-only gradlew step are removed. Adds ADR-002, links it from the architecture overview, notes in the README that native Windows and macOS runs are not CI-tested, and adds an Unreleased changelog entry. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- .github/workflows/build.yml | 13 +++---------- CHANGELOG.md | 1 + README.md | 2 +- .../CH-003-ci-native-build-linux-only/tasks.md | 10 +++++----- docs/architecture/README.md | 2 +- .../ADR-002-ci-native-build-linux-only.md | 17 +++++++++++++++++ docs/decisions/README.md | 1 + 7 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 docs/decisions/ADR-002-ci-native-build-linux-only.md diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 83cdcd9..c139f59 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,10 +10,7 @@ permissions: jobs: build: - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Read the pinned Tank Royale commit @@ -33,12 +30,8 @@ jobs: 11 17 cache: gradle - - if: runner.os != 'Windows' - run: ./gradlew --no-configuration-cache -PtankRoyaleSource=tank-royale-source build - - if: runner.os == 'Windows' - run: .\gradlew.bat --no-configuration-cache "-PtankRoyaleSource=tank-royale-source" build - - if: runner.os == 'Linux' - uses: actions/upload-artifact@v4 + - run: ./gradlew --no-configuration-cache -PtankRoyaleSource=tank-royale-source build + - uses: actions/upload-artifact@v4 with: name: native-distributions path: build/distributions/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 4704be0..07ca336 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ### Changed - The `docker/rumble.sh` and `docker/rumble.ps1` launchers now default to the published `ghcr.io/robocode-dev/rumble-client:latest` image instead of the local-only `rumble-client:dev`, so you can pull and run without building or tagging an image. To use a locally built image, pass its name as the launcher's image argument. +- CI now builds and tests the native client on Linux only. Running natively on Windows or macOS still works but is no longer CI-tested; the container image is the tested path on every host OS. ## [0.1.0] - 2026-09-13 diff --git a/README.md b/README.md index bc5e85b..78a22e2 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Without `-PtankRoyaleSource`, `gradle build` runs the unit and contract tests an If you already have JDK 17 and Gradle installed on your machine, the equivalent host command is `./gradlew --no-configuration-cache clean build`. -The build produces native ZIP and TAR archives under `build/distributions/`. Run `./gradlew run --args="--check-runtimes"` to verify the required native installations; the check never installs or changes them. +The build produces native ZIP and TAR archives under `build/distributions/`. Run `./gradlew run --args="--check-runtimes"` to verify the required native installations; the check never installs or changes them. CI builds and tests the native client on Linux only, so running it natively on Windows or macOS works but is not CI-tested; the container image is the tested path on every host OS. The container and native preflight currently target Java 25, .NET 10, Python 3.14, and Node.js 24 (Node.js installer 24.21.0). This block is refreshed by the scheduled runtime update workflow. diff --git a/changes/CH-003-ci-native-build-linux-only/tasks.md b/changes/CH-003-ci-native-build-linux-only/tasks.md index 15b7fba..0d2cbc7 100644 --- a/changes/CH-003-ci-native-build-linux-only/tasks.md +++ b/changes/CH-003-ci-native-build-linux-only/tasks.md @@ -8,8 +8,8 @@ title: Tasks for CH-003 # Tasks — CH-003 -- [ ] Record ADR-002: CI builds and tests the native client on Linux only, while the container image remains the cross-platform path. -- [ ] Reduce `.github/workflows/build.yml`'s `build` job to `ubuntu-latest`, removing the OS matrix and the Windows-only step. -- [ ] State in `README.md` that native Windows and macOS runs are not CI-tested. -- [ ] Update `docs/architecture/README.md`'s durable choices to link ADR-002. -- [ ] Add a `CHANGELOG.md` `[Unreleased]` entry. +- [x] Record ADR-002: CI builds and tests the native client on Linux only, while the container image remains the cross-platform path. +- [x] Reduce `.github/workflows/build.yml`'s `build` job to `ubuntu-latest`, removing the OS matrix and the Windows-only step. +- [x] State in `README.md` that native Windows and macOS runs are not CI-tested. +- [x] Update `docs/architecture/README.md`'s durable choices to link ADR-002. +- [x] Add a `CHANGELOG.md` `[Unreleased]` entry. diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 978662b..7378f62 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -37,7 +37,7 @@ flowchart LR Submit --> Issues[GitHub Issues result inbox] ``` -Architecture documents describe the system's shape, not individual feature details. Durable choices include Java 17, Gradle, Gson for JSON contracts, the Tank Royale Battle Runner dependency, Docker/Podman isolation for runtime execution, and GHCR as the published-image distribution point (see [ADR-001](../decisions/ADR-001-ghcr-image-publishing-on-tag.md)). +Architecture documents describe the system's shape, not individual feature details. Durable choices include Java 17, Gradle, Gson for JSON contracts, the Tank Royale Battle Runner dependency, Docker/Podman isolation for runtime execution, GHCR as the published-image distribution point (see [ADR-001](../decisions/ADR-001-ghcr-image-publishing-on-tag.md)), and CI verification of the native build on Linux only (see [ADR-002](../decisions/ADR-002-ci-native-build-linux-only.md)). diff --git a/docs/decisions/ADR-002-ci-native-build-linux-only.md b/docs/decisions/ADR-002-ci-native-build-linux-only.md new file mode 100644 index 0000000..3aeb41e --- /dev/null +++ b/docs/decisions/ADR-002-ci-native-build-linux-only.md @@ -0,0 +1,17 @@ +--- +id: ADR-002 +type: decision +status: inferred +author: agent +accepted-by: [] +links: [CAP-001] +title: CI builds and tests the native client on Linux only +--- + +# ADR-002 — CI builds and tests the native client on Linux only + +The `build` job in `.github/workflows/build.yml` builds and tests the native client on `ubuntu-latest` only, not on Windows or macOS. The published container image (CAP-001) is the default way to run the client, and Docker Desktop and Podman Desktop on Windows and macOS run that same Linux image, so the Linux build covers the supported default path on every host OS. + +Native execution remains supported (see `SECURITY.md`), but native Windows and macOS runs are not verified by CI. Restoring an OS to the matrix is the way to promise CI coverage for it again; do so when native use on that OS matters enough to pay its CI time. + +This affects the durable technology choices in the [architecture overview](../architecture/README.md). diff --git a/docs/decisions/README.md b/docs/decisions/README.md index 937c531..e6eb028 100644 --- a/docs/decisions/README.md +++ b/docs/decisions/README.md @@ -22,4 +22,5 @@ A decision that changes a methodology contract inventories every live carrier th - [ADR-001 — Publish the container image to GHCR, triggered only by version tags](ADR-001-ghcr-image-publishing-on-tag.md) · `inferred` — The container image (CAP-001) is published to GitHub Container Registry (`ghcr.io/robocode-dev/rumble-client`) rather than Docker Hub or another registry, because it authenticates with the workflow's… +- [ADR-002 — CI builds and tests the native client on Linux only](ADR-002-ci-native-build-linux-only.md) · `inferred` — The `build` job in `.github/workflows/build.yml` builds and tests the native client on `ubuntu-latest` only, not on Windows or macOS. From f5d9dcfe37bc9313ca7f4b0adcfedc919ae92ba1 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:47:44 +0200 Subject: [PATCH 3/5] digest(CH-003): fold CI platform scope into the corpus Deletes the CH-003 change workspace now that every task is done; ADR-002, the architecture overview, and the README carry the durable record. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- .../proposal.md | 21 ------------------- .../tasks.md | 15 ------------- 2 files changed, 36 deletions(-) delete mode 100644 changes/CH-003-ci-native-build-linux-only/proposal.md delete mode 100644 changes/CH-003-ci-native-build-linux-only/tasks.md diff --git a/changes/CH-003-ci-native-build-linux-only/proposal.md b/changes/CH-003-ci-native-build-linux-only/proposal.md deleted file mode 100644 index 1dd34ec..0000000 --- a/changes/CH-003-ci-native-build-linux-only/proposal.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: CH-003 -type: change -status: open -links: [G-001] -title: CI builds the native client on Linux only ---- - -# CH-003 — CI builds the native client on Linux only - -This change is plan-less: no plan exists in this repository, and it follows CH-002 (launchers default to the published GHCR image) as scoped by the maintainer. - -## What - -`.github/workflows/build.yml`'s `build` job stops running on a Windows and macOS matrix and runs only on `ubuntu-latest`. The `docker` job is unchanged. The README states that CI builds and tests the native client on Linux only, so running natively on Windows or macOS is possible but not CI-tested. ADR-002 records the choice. - -Native execution stays supported as `SECURITY.md` describes; this change narrows what CI verifies, not what the client does. - -## Why - -The three-OS matrix arrived with the native ZIP/TAR distributions (commit c1c7d32). Since CH-002, the published container image is the default way to run the client, and Docker Desktop on Windows and macOS runs that same Linux image. Building only on Linux is the usual setup for a container-shipped client, and the Windows and macOS jobs cost CI time for a path few contributors use. diff --git a/changes/CH-003-ci-native-build-linux-only/tasks.md b/changes/CH-003-ci-native-build-linux-only/tasks.md deleted file mode 100644 index 0d2cbc7..0000000 --- a/changes/CH-003-ci-native-build-linux-only/tasks.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: TASK-002 -type: tasks -status: open -links: [CH-003] -title: Tasks for CH-003 ---- - -# Tasks — CH-003 - -- [x] Record ADR-002: CI builds and tests the native client on Linux only, while the container image remains the cross-platform path. -- [x] Reduce `.github/workflows/build.yml`'s `build` job to `ubuntu-latest`, removing the OS matrix and the Windows-only step. -- [x] State in `README.md` that native Windows and macOS runs are not CI-tested. -- [x] Update `docs/architecture/README.md`'s durable choices to link ADR-002. -- [x] Add a `CHANGELOG.md` `[Unreleased]` entry. From 39efaf49209468e35c6a64dce79a7786fff2d189 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:50:19 +0200 Subject: [PATCH 4/5] fix(CH-003): drop the CI-only changelog entry CI platform scope is not a user-facing change, so it does not belong in the changelog; the README note on native Windows and macOS covers users. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07ca336..22ffcf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ### Changed - The `docker/rumble.sh` and `docker/rumble.ps1` launchers now default to the published `ghcr.io/robocode-dev/rumble-client:latest` image instead of the local-only `rumble-client:dev`, so you can pull and run without building or tagging an image. To use a locally built image, pass its name as the launcher's image argument. -- CI now builds and tests the native client on Linux only. Running natively on Windows or macOS still works but is no longer CI-tested; the container image is the tested path on every host OS. - ## [0.1.0] - 2026-09-13 ### Changed From 65023413de1850c92a2bbae020b670f4fc6cd927 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:51:49 +0200 Subject: [PATCH 5/5] docs(changelog): file the launcher default under 0.1.0 The launchers are not part of the image, so the change to their default image concerns using the published 0.1.0 image rather than a new release. Move the entry from Unreleased to 0.1.0 and restore the blank line lost before the 0.1.0 heading. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22ffcf0..e070817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ## [Unreleased] -### Changed - -- The `docker/rumble.sh` and `docker/rumble.ps1` launchers now default to the published `ghcr.io/robocode-dev/rumble-client:latest` image instead of the local-only `rumble-client:dev`, so you can pull and run without building or tagging an image. To use a locally built image, pass its name as the launcher's image argument. ## [0.1.0] - 2026-09-13 ### Changed - Updated the pinned Tank Royale Battle Runner and container source to 1.3.1. +- The `docker/rumble.sh` and `docker/rumble.ps1` launchers now default to the published `ghcr.io/robocode-dev/rumble-client:latest` image instead of the local-only `rumble-client:dev`, so you can pull and run without building or tagging an image. To use a locally built image, pass its name as the launcher's image argument. ### Added