CI: add test that we can downgrade the node and run it under v25.09.
What changed, and why it matters
This commit only adds a new automated CI test job that checks whether Core Lightning can be downgraded to the previous release (v25.09). It does not change any production code, wallet logic, network handling, or cryptographic operations. There is no security-relevant change visible in the diff.
No security action required. This is a routine CI/infrastructure change. If reviewing for release readiness, verify that `tests/test_downgrade.py` itself covers downgrade safety (database schema compatibility, RPC behavior, etc.), but that file is not part of this commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch extends .github/workflows/ci.yaml with a check-downgrade job. The job downloads a pre-built current CLN artifact, fetches the v25.09 release binary, and runs tests/test_downgrade.py against sqlite3/postgres and regtest/liquid-regtest configurations. It also adds the job to the final complete aggregation step. No application source code is modified.
Changed components
.github/workflows/ci.yamlInspect captured patch +82 / −0
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 14ff3135..cd400b61 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -235,6 +235,86 @@ jobs:
./configure --enable-debugbuild --enable-fuzzing --enable-address-sanitizer --enable-ub-sanitizer --disable-valgrind CC=clang
uv run make -j $(nproc) check-fuzz
+ check-downgrade:
+ name: Check we can downgrade the node
+ runs-on: ubuntu-22.04
+ needs:
+ - compile
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - CFG: compile-gcc
+ TEST_DB_PROVIDER: sqlite3
+ TEST_NETWORK: regtest
+ VALGRIND: 1
+ - CFG: compile-gcc
+ TEST_DB_PROVIDER: postgres
+ TEST_NETWORK: regtest
+ - CFG: compile-gcc
+ TEST_DB_PROVIDER: sqlite3
+ TEST_NETWORK: liquid-regtest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Python 3.10
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.10"
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v5
+
+ - name: Install dependencies
+ run: |
+ bash -x .github/scripts/setup.sh
+
+ - name: Install bitcoind
+ env:
+ TEST_NETWORK: ${{ matrix.TEST_NETWORK }}
+ run: .github/scripts/install-bitcoind.sh
+
+ - name: Download build
+ uses: actions/download-artifact@v4
+ with:
+ name: cln-${{ matrix.CFG }}.tar.bz2
+
+ - name: Unpack pre-built CLN
+ env:
+ CFG: ${{ matrix.CFG }}
+ run: |
+ tar -xaf cln-${CFG}.tar.bz2
+
+ - name: Fetch and unpack previous CLN
+ run: |
+ mkdir /tmp/old-cln
+ cd /tmp/old-cln
+ wget https://github.com/ElementsProject/lightning/releases/download/v25.09/clightning-v25.09-Ubuntu-22.04-amd64.tar.xz
+ tar -xaf clightning-v25.09-Ubuntu-22.04-amd64.tar.xz
+
+ - name: Switch network
+ if: ${{ matrix.TEST_NETWORK == 'liquid-regtest' }}
+ run: |
+ # Loading the network from config.vars rather than the envvar is a terrible idea...
+ sed -i 's/TEST_NETWORK=regtest/TEST_NETWORK=liquid-regtest/g' config.vars
+ cat config.vars
+
+ - name: Test
+ env:
+ SLOW_MACHINE: 1
+ PYTEST_PAR: 10
+ TEST_DEBUG: 1
+ TEST_DB_PROVIDER: ${{ matrix.TEST_DB_PROVIDER }}
+ TEST_NETWORK: ${{ matrix.TEST_NETWORK }}
+ LIGHTNINGD_POSTGRES_NO_VACUUM: 1
+ VALGRIND: ${{ matrix.VALGRIND }}
+ PREV_LIGHTNINGD: /tmp/old-cln/usr/bin/lightningd
+ run: |
+ env
+ cat config.vars
+ uv run eatmydata pytest tests/test_downgrade.py -vvv -n ${PYTEST_PAR} ${PYTEST_OPTS}
+
integration:
name: Test CLN ${{ matrix.name }}
runs-on: ubuntu-22.04
@@ -627,6 +707,7 @@ jobs:
- integration-valgrind
- integration-sanitizers
- min-btc-support
+ - check-downgrade
if: ${{ always() }}
steps:
- name: Complete
@@ -638,6 +719,7 @@ jobs:
SANITIZERS: ${{ needs['integration-sanitizers'].result }}
DOCS: ${{ needs['update-docs-examples'].result }}
BTC: ${{ needs['min-btc-support'].result }}
+ CHECK_DOWNGRADE: ${{ needs['check-downgrade'].result }}
run: |
failed=""
for name in $JOB_NAMES; do
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.