Makefile: update next and prev versions now we've released.
What changed, and why it matters
This is a routine post-release maintenance commit for Core Lightning. It updates version numbers in the build files and test infrastructure after a new release, adjusts downgrade tests to reflect that downgrading past the new release no longer fails on a recently-added database feature, and removes some temporary test workarounds for APIs that are no longer considered deprecated. There is no direct security fix here; it is housekeeping that keeps the CI and downgrade tooling aligned with the current release cycle.
No security action required. Treat as normal maintenance; ensure CI passes after the version bump and downgrade matrix is updated.
Security signals we found
No direct security patch
Routine release/version housekeeping
Test-only changes for downgrade compatibility
Deprecation lifecycle cleanup
Evidence from the diff
The commit bumps CLN_NEXT_VERSION from v25.12 to v26.04 and CLN_PREV_VERSION from v25.09 to v25.12 in the Makefile, and updates the CI workflow to download the new previous release (v25.12) for downgrade testing. It adapts tests/test_downgrade.py so that the node-bias downgrade case now succeeds (return code 0) instead of expecting a database downgrade failure, because v25.12 supports the askrene node-bias schema. It also updates tests/test_pay.py, tests/test_plugin.py, and tests/test_xpay.py to stop relying on deprecated-API flags for features whose deprecation period has ended, and updates tools/lightning-downgrade.c to register v25.12 as a supported downgrade target with no special migration needed.
Changed components
Makefile.github/workflows/ci.yamltests/test_downgrade.pytests/test_pay.pytests/test_plugin.pytests/test_xpay.pytools/lightning-downgrade.cInspect captured patch +17 / −17
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 28557a9..6088499 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -299,8 +299,8 @@ jobs:
run: |
mkdir /tmp/old-cln
cd /tmp/old-cln
- wget https://github.com/ElementsProject/lightning/releases/download/v25.09/clightning-v25.09-ubuntu-24.04-amd64.tar.xz
- tar -xaf clightning-v25.09-ubuntu-24.04-amd64.tar.xz
+ wget https://github.com/ElementsProject/lightning/releases/download/v25.12/clightning-v25.12-ubuntu-24.04-amd64.tar.xz
+ tar -xaf clightning-v25.12-ubuntu-24.04-amd64.tar.xz
- name: Switch network
if: ${{ matrix.TEST_NETWORK == 'liquid-regtest' }}
diff --git a/Makefile b/Makefile
index 5b5f33b..a5ab6dc 100644
--- a/Makefile
+++ b/Makefile
@@ -7,10 +7,10 @@ VERSION ?= $(shell git describe --tags --always --dirty=-modded --abbrev=7 2>/de
$(info Building version $(VERSION))
# Next release.
-CLN_NEXT_VERSION := v25.12
+CLN_NEXT_VERSION := v26.04
# Previous release (for downgrade testing)
-CLN_PREV_VERSION := v25.09
+CLN_PREV_VERSION := v25.12
# --quiet / -s means quiet, dammit!
ifeq ($(findstring s,$(word 1, $(MAKEFLAGS))),s)
diff --git a/tests/test_downgrade.py b/tests/test_downgrade.py
index e460f3d..939aa99 100644
--- a/tests/test_downgrade.py
+++ b/tests/test_downgrade.py
@@ -84,7 +84,8 @@ def test_downgrade(node_factory, executor):
# Should be able to upgrade without any trouble
l1.daemon.opts['database-upgrade'] = True
l1.start()
- assert l1.daemon.is_in_log("Updating database from version")
+ # Note: currently a noop, this will break on first database upgrade.
+ assert not l1.daemon.is_in_log("Updating database from version 280")
l1.connect(l2)
inv2 = l2.rpc.invoice(1000, 'test_downgrade2', 'test_downgrade2')
@@ -96,8 +97,8 @@ def test_downgrade(node_factory, executor):
assert bias['bias'] == 1
-def test_downgrade_fail(node_factory, executor):
- """If we have created as node bias, we cannot downgrade"""
+def test_downgrade_bias(node_factory, executor):
+ """If we have created as node bias, we *can* downgrade this version."""
l1, l2 = node_factory.line_graph(2, opts={'may_reconnect': True}, wait_for_announce=True)
l1.rpc.askrene_bias_node('xpay', l2.info['id'], 'in', 1)
@@ -108,5 +109,4 @@ def test_downgrade_fail(node_factory, executor):
p = subprocess.Popen(cmd_line, stdout=subprocess.DEVNULL,
stderr=subprocess.PIPE)
_, err = p.communicate(timeout=TIMEOUT)
- assert p.returncode == ERROR_DBFAIL
- assert 'Askrene has a node bias, which is not supported in v25.09' in err.decode('utf-8')
+ assert p.returncode == 0
diff --git a/tests/test_pay.py b/tests/test_pay.py
index 06b8281..18bd3e1 100644
--- a/tests/test_pay.py
+++ b/tests/test_pay.py
@@ -6082,8 +6082,8 @@ def test_fetch_no_description_with_amount(node_factory):
def test_decodepay(node_factory, chainparams):
"""Test we don't break (deprecated) decodepay command"""
- l1 = node_factory.get_node(options={'allow-deprecated-apis': True},
- broken_log="DEPRECATED API USED decodepay")
+ l1 = node_factory.get_node(options={'allow-deprecated-apis': True,
+ 'i-promise-to-fix-broken-api-user': 'decodepay'})
addr1 = l1.rpc.newaddr('bech32')['bech32']
addr2 = '2MxqzNANJNAdMjHQq8ZLkwzooxAFiRzXvEz' if not chainparams['elements'] else 'XGx1E2JSTLZLmqYMAo3CGpsco85aS7so33'
diff --git a/tests/test_plugin.py b/tests/test_plugin.py
index 6e2a94f..b50a347 100644
--- a/tests/test_plugin.py
+++ b/tests/test_plugin.py
@@ -4177,9 +4177,9 @@ def test_sql(node_factory, bitcoind):
def test_sql_deprecated(node_factory, bitcoind):
l1, l2 = node_factory.line_graph(2, opts=[{'allow-deprecated-apis': True}, {}])
- # l1 allows it, l2 doesn't
- ret = l1.rpc.sql("SELECT max_total_htlc_in_msat FROM peerchannels;")
- assert ret == {'rows': [[-1]]}
+ # Even with deprecated APIs, this isn't there.
+ with pytest.raises(RpcError, match="Deprecated column table peerchannels.max_total_htlc_in_msat"):
+ l1.rpc.sql("SELECT max_total_htlc_in_msat FROM peerchannels;")
# It's deprecated in l2, so that will fail!
with pytest.raises(RpcError, match="Deprecated column table peerchannels.max_total_htlc_in_msat"):
diff --git a/tests/test_xpay.py b/tests/test_xpay.py
index 08219de..e576d15 100644
--- a/tests/test_xpay.py
+++ b/tests/test_xpay.py
@@ -674,12 +674,12 @@ def test_xpay_no_mpp(node_factory, chainparams):
@pytest.mark.parametrize("deprecations", [False, True])
def test_xpay_bolt12_no_mpp(node_factory, chainparams, deprecations):
- """In deprecated mode, we use MPP even if BOLT12 invoice doesn't say we should"""
+ """If we force it, we use MPP even if BOLT12 invoice doesn't say we should"""
# l4 needs dev-allow-localhost so it considers itself to have an advertized address, and doesn't create a blinded path from l2/l4.
opts = [{}, {}, {'dev-force-features': -17, 'dev-allow-localhost': None}, {}]
if deprecations is True:
for o in opts:
- o['allow-deprecated-apis'] = True
+ o['i-promise-to-fix-broken-api-user'] = 'xpay.ignore_bolt12_mpp'
o['broken_log'] = 'DEPRECATED API USED: xpay.ignore_bolt12_mpp'
l1, l2, l3, l4 = node_factory.get_nodes(4, opts=opts)
diff --git a/tools/lightning-downgrade.c b/tools/lightning-downgrade.c
index 6b52dff..3bf41c6 100644
--- a/tools/lightning-downgrade.c
+++ b/tools/lightning-downgrade.c
@@ -168,7 +168,7 @@ static const char *downgrade_askrene_layers(const tal_t *ctx, struct db *db)
static const struct db_version db_versions[] = {
{ "v25.09", 276, downgrade_askrene_layers, false },
- /* When we implement v25.12 downgrade: { "v25.12", 280, ???}, */
+ { "v25.12", 280, NULL, true },
};
static const struct db_version *version_db(const char *version)
Why this scored 18/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.