From 4763a50f1677632760e9c53c6de27ca71bccf51d Mon Sep 17 00:00:00 2001 From: Tom Fanning Date: Sun, 12 Jul 2026 21:00:07 +0000 Subject: [PATCH] chore(sdl): pin ax25sdl to a reproducible latest commit (stop floating main) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pico-node's Rust sdl/ module already consumes the latest SDL source (ax25sdl main, 6 commits ahead of the v0.10.0 tag) and builds 724-green — but CI floated on main unpinned (silent-drift risk). Pin both CI jobs + the parity-manifest [sdl] block to 14ad468a (reproducible latest). Corrects an earlier "0.8.0 Rust vs 0.10.0 C# skew" mischaracterisation: those are different version schemes (Rust crate vs git-tag/NuGet), not a lag. The v0.10.0 tag ships Rust crate 0.7.0 (pre-no_std) and can't satisfy the dep; the no_std backend landed on main afterwards (ADR-0003). The main-vs-tag delta is tooling/codegen/distribution, not SDL semantics — so pico-node is behaviourally SDL-aligned with C#'s 0.10.0. Co-Authored-By: Claude Code --- .github/workflows/ci.yml | 18 +++++++++++++++--- parity-manifest.toml | 39 ++++++++++++++++++++++----------------- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 04ab57a..5a0d4d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,13 +38,19 @@ jobs: # a sibling checkout (kept a path dep deliberately, co-developed, no crates.io # pin). Provide that sibling: it resolves to $GITHUB_WORKSPACE/../ax25sdl # (a level up from this repo's checkout). ax25sdl is public, so this needs no - # token. Tracks ax25sdl main, matching local dev. The rm -rf makes it + # token. Pinned to a reproducible SHA (below), not floating main. The rm -rf makes it # idempotent across the self-hosted runner's persistent _work tree (the dir # lives outside the checkout, so actions/checkout does not clean it). - name: Check out the ax25sdl sibling (path dependency) run: | rm -rf "${GITHUB_WORKSPACE}/../ax25sdl" - git clone --depth 1 https://github.com/m0lte/ax25sdl.git "${GITHUB_WORKSPACE}/../ax25sdl" + # Pinned to a reproducible ax25sdl commit — the latest SDL source. A + # release tag can't be used: the no_std Rust backend landed post-v0.10.0 + # (ADR-0003), so the tags carry the old pre-no_std crate. To advance the + # SDL, bump this SHA (both jobs) + the parity-manifest.toml [sdl] block. + git init -q "${GITHUB_WORKSPACE}/../ax25sdl" + git -C "${GITHUB_WORKSPACE}/../ax25sdl" fetch --depth 1 https://github.com/packet-net/ax25sdl.git 14ad468a80635a6a574962fc60eed469e6cc975c + git -C "${GITHUB_WORKSPACE}/../ax25sdl" checkout -q FETCH_HEAD - name: Install Rust 1.93.1 (+ clippy) uses: dtolnay/rust-toolchain@1.93.1 @@ -78,7 +84,13 @@ jobs: - name: Check out the ax25sdl sibling (path dependency) run: | rm -rf "${GITHUB_WORKSPACE}/../ax25sdl" - git clone --depth 1 https://github.com/m0lte/ax25sdl.git "${GITHUB_WORKSPACE}/../ax25sdl" + # Pinned to a reproducible ax25sdl commit — the latest SDL source. A + # release tag can't be used: the no_std Rust backend landed post-v0.10.0 + # (ADR-0003), so the tags carry the old pre-no_std crate. To advance the + # SDL, bump this SHA (both jobs) + the parity-manifest.toml [sdl] block. + git init -q "${GITHUB_WORKSPACE}/../ax25sdl" + git -C "${GITHUB_WORKSPACE}/../ax25sdl" fetch --depth 1 https://github.com/packet-net/ax25sdl.git 14ad468a80635a6a574962fc60eed469e6cc975c + git -C "${GITHUB_WORKSPACE}/../ax25sdl" checkout -q FETCH_HEAD - name: Install Rust 1.93.1 (+ thumbv6m target) uses: dtolnay/rust-toolchain@1.93.1 diff --git a/parity-manifest.toml b/parity-manifest.toml index bb0540f..d231689 100644 --- a/parity-manifest.toml +++ b/parity-manifest.toml @@ -18,24 +18,29 @@ stack = "pico-node" reference = "packet-net/packet.net" # C# Packet.* is the reference runtime [sdl] -# Session / connected-mode vectors are only meaningful if all three stacks drive -# the SAME SDL version. Surface the pin here so a skew is a visible, reviewable -# diff rather than a silent behavioural divergence. +# pico-node's Rust `sdl/` module consumes the generated typed tables from the +# ax25sdl Rust crate (spec/rust). The pin is recorded here AND in ci.yml — bump +# both together to advance the SDL. # -# KNOWN CAVEAT — version skew, un-pinned (to resolve in a follow-up): -# * the Rust crate ax25sdl/spec/rust is at 0.8.0 -# * C# pins Packet.Ax25.Sdl at 0.10.0 -# * pico-node CI currently floats on ax25sdl `main` (no pin at all) -# Three different SDL snapshots drive three "identical" session machines. This only -# bites the SDL-DRIVEN sets (session lifecycle, mod-128 establishment, XID -# negotiation, SREJ recovery); the pure wire codecs (frame / KISS / AXUDP / NET-ROM -# byte layout) never touch the SDL crate, so codec parity is unaffected. Mitigation: -# pin pico-node to a `crate-v*` tag equal to the version C#/TS consume, then bump -# `version`/`pin` here in lockstep. -crate = "ax25sdl" -repo = "packet-net/ax25sdl" # formerly m0lte/ax25sdl (GitHub org-rename redirect) -version = "0.8.0" # Rust crate today; C# NuGet = 0.10.0 -> SKEW to pin later -pin = "main" # TODO: pin a `crate-v*` tag, not a floating branch +# Versioning note (this tripped an earlier "0.8.0 vs 0.10.0 skew" report — +# corrected here; the two numbers are different schemes, not a lag): +# * ax25sdl carries THREE independent version schemes that are NOT comparable: +# the Rust crate's Cargo.toml version, the git tags (v0.x.y), and the C# +# `Packet.Ax25.Sdl` NuGet version. Git tag v0.10.0 (= C# NuGet 0.10.0) ships +# Rust crate 0.7.0; the no_std Rust backend + typed closed sets only landed on +# `main` afterwards (ADR-0003, commit 6bfe59d, Rust crate → 0.8.0). So the +# v0.10.0 tag cannot even satisfy this path dependency. +# * The commits `main` is ahead of v0.10.0 are tooling/codegen/distribution +# (Rust backend, licence, SVG renders, Scriban bump, SDL-source→submodule) — +# NOT SDL state-machine changes. pico-node (on `main`) is therefore +# behaviourally SDL-aligned with C#'s 0.10.0; there is no session-behaviour skew. +# pico-node was already on the latest SDL source; the only real fix was to stop +# floating `main` (silent-drift risk) and pin a reproducible commit. +crate = "ax25sdl" +repo = "packet-net/ax25sdl" # formerly m0lte/ax25sdl (GitHub org-rename redirect) +rust_crate = "0.8.0" # the Rust crate version this pin provides (main; no_std backend) +csharp_nuget = "0.10.0" # what C# pins — git tag v0.10.0; behaviourally aligned (delta is tooling) +pin = "14ad468a80635a6a574962fc60eed469e6cc975c" # reproducible latest; MUST match ci.yml # --------------------------------------------------------------------------- # opted-IN: pico-node runs the shared corpus for these; CI fails on any mismatch.