From b8c3959a718c093bab4ebb4e1cbcf8b02c9ae1e4 Mon Sep 17 00:00:00 2001 From: R0ck Date: Thu, 3 Sep 2026 17:21:05 +0100 Subject: [PATCH 1/2] radioserver v3: the DIO1 fix, and a protocol that grew a field Two reasons this cannot go out as another v2. The stats record went from 37 bytes to 39 when it started reporting the DIO1 routing mask, and this file versions the wire protocol rather than the build, precisely so the two ends can say which they need. And the publish step edits a release in place when its tag already exists, replacing every asset. MeshBench pins radioserver-v2 by digest, so re-cutting v2 would swap the binaries under a pin and every existing MeshBench build would fail its own integrity check. A bump is the only safe way to publish. What v3 carries that v2 does not: DIO1 gated on the DIO1 mask rather than the IRQ enable mask, which is what made an emulated board hear every advert and forward about one in three, and the routing mask reported so that fault is visible from outside the chip. The release notes also stop telling people this wants VirtualSX1262.cpp beside it. It wants the submodule. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Q9HbD44EKWWTRYgxbFGxf6 --- .github/workflows/build.yml | 3 ++- radioserver.version | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b03b369..29c9dad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -420,7 +420,8 @@ jobs: echo echo "Not versioned against upstream MeshCore: this is ours, has no role," echo "and moves independently of the per-role releases. Wants neither a" - echo "MeshCore checkout nor Crypto - just \`VirtualSX1262.cpp\` beside it." + echo "MeshCore checkout nor Crypto, just the chip model in" + echo "\`vendor/virtual-sx1262\`." echo for f in "${assets[@]}"; do echo "- \`$(basename "$f")\`"; done } > notes.md diff --git a/radioserver.version b/radioserver.version index 0cfbf08..00750ed 100644 --- a/radioserver.version +++ b/radioserver.version @@ -1 +1 @@ -2 +3 From 05fe77a0b2959eba785b6d817ea17a2e7e231f59 Mon Sep 17 00:00:00 2001 From: R0ck Date: Thu, 3 Sep 2026 17:22:41 +0100 Subject: [PATCH 2/2] and a way to publish radioserver without rebuilding every role Cutting a radioserver release meant running the whole workflow, which with a blank ref input means every upstream tag plus main and dev, for every live platform. That is an hour of runners and a great many ways to fail, to publish one translation unit that needs neither a MeshCore checkout nor Crypto. radioserver_only skips the role build and its publish and leaves the two radioserver jobs, which is what a protocol version bump actually needs. discover still runs, because that is where the radioserver platform list comes from. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Q9HbD44EKWWTRYgxbFGxf6 --- .github/workflows/build.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 29c9dad..6c44647 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,6 +20,10 @@ on: description: 'Rebuild even if a release already exists' type: boolean default: false + radioserver_only: + description: 'Publish only radioserver, skipping every firmware role' + type: boolean + default: false permissions: contents: write @@ -153,7 +157,11 @@ jobs: runs-on: ${{ matrix.target.runs_on }} # A platform not in PLATFORMS is skipped, not removed: the entry above is # still the record of how it is built. - if: needs.discover.outputs.any == 'true' + # radioserver versions a wire protocol and is cut on its own schedule, so + # publishing one must not drag every upstream ref for every platform along + # with it: that is an hour of runners and a lot of ways to fail, for a + # change to one translation unit. + if: needs.discover.outputs.any == 'true' && !inputs.radioserver_only steps: - uses: actions/checkout@v4 with: @@ -251,6 +259,7 @@ jobs: needs: [discover, build] if: >- !cancelled() && needs.discover.outputs.any == 'true' + && !inputs.radioserver_only && contains(fromJSON('["success", "failure"]'), needs.build.result) runs-on: ubuntu-latest strategy: