EP
← All projectsElements Project

Core Lightning

Modular C implementation of the Lightning Network protocol and node stack.

BitcoinLightning NetworkActive incident
Repository coverage

2008 commits in the local evidence base

Every captured commit receives deterministic security triage and a separate communication-quality score. Security candidates and broader second-pass signals receive full-patch Ollama analysis.

184security candidates280second-pass queue1894AI analyses
55commits · 30 days
210commits · 60 days
682commits · 180 days
1670commits · 365 days
Backfill bands
Aug 5 → Feb 61049 seen37 candidatesComplete
Feb 6 → Jun 6579 seen10 candidatesComplete
Jun 6 → Jul 678 seen1 candidatesComplete
Jul 6 → Aug 5147 seen16 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

70/100 average clarity
488Strong · 80–100
1231Adequate · 60–79
259Thin · 40–59
30Opaque · 0–39
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
cdecker14910384
Níckolas Goline63844277
Rusty Russell96475958172
daywalker90117895165
Lagrang386578170
Vincenzo Palazzo13411182
dovgopoly15015164
Sangbida Chaudhuri14931146066
Dusty Daemon821378066
ShahanaFarooqui931093063
Peter Neuroth1024101071
Christian Decker36436072
Analysis record

Published AI watches

Last scanned 43 minutes ago

Informational 15 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

contrib: add jaonoctus's signing key

This commit simply adds a new person's PGP public-key fingerprint to the list of trusted release signers in two documentation files. It does not change any code, fix any bug, or alter any security behavior of the software itself.

41278b4eby jaonoctus+2−02 files
No security note in commit
Informational 15 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

wallet: fixed timestamps for invented bookkeeper deposits

This is a tiny internal fix to make a bookkeeping migration produce stable event ordering. It changes the timestamp used when creating historical 'deposit' records during a one-time database migration, so the records sort consistently with…

498e5086by daywalker90+2−01 file
No security note in commit
Informational 21 AI analysisMessage 85 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

docs: document missing and fix erroneous JSON-RPC error codes

This commit is a documentation-only cleanup of the JSON-RPC command help files. It corrects which numeric error codes are listed for each command so the published schemas match what the software actually returns. No program logic, validati…

Documentation-only change with no executable code modificationsCorrects RPC schema error-code metadata to match actual handler behaviorNo change to input parsing, authorization, cryptography, or network behavior
d1b6963bby daywalker90+204−1224 files
No security note in commit
Low 46 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

channeld: initialize tx_sigs_allowed on startup

This commit fixes a bug where a setting that controls whether unexpected transaction signatures are allowed was not initialized when the channel daemon starts. If a peer sent such signatures before the channel was fully ready, the program …

use of uninitialized variableundefined behavior (invalid bool load)network-triggered code path
c09c4520by Erick Cestari+1−01 file
No security note in commit
Informational 15 AI analysisMessage 100 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

ci: fix the coverage nightly's profile handling

This commit fixes the project's internal nightly code-coverage CI workflow. It changes how test coverage files are collected, ensures the same LLVM compiler version is used to generate and merge coverage data, and uploads a Codecov-compati…

5685c9a3by cdecker+12−211 file
No security note in commit
Low 37 AI analysisMessage 78 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

schemas: make required fields match the code

This commit is a large cleanup of Core Lightning's API schemas, generated RPC bindings, and related plugin code. The stated goal is to make the documented 'required' fields match what the C code actually always produces or expects. In prac…

Large schema-only change with no accompanying security advisory or CVEOne semantic change to plugin hook response: invoice_payment hook can now reject with only failure_message and no resultMany fields change from optional to required in public RPC/protobuf interfaces
ddbd2963by daywalker90+1786−173950 files
No security note in commit
Informational 15 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

doc: document error 313 on every command which can return it

This commit only updates documentation. It adds error code 313 to the documented error lists for several Core Lightning commands (fundpsbt, utxopsbt, txprepare, multiwithdraw, and upgradewallet). The error code already existed in the code …

a34b9758by Peter Neuroth+30−86 files
No security note in commit
Low 25 AI analysisMessage 88 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

tools/build-release.sh: name the checksum file when verifying the signature

This commit fixes a release-script check that verifies the cryptographic signature on a file of checksums. Previously, the script only told GPG to verify the signature file itself. If someone replaced that signature file with an inline-sig…

Incorrect cryptographic verification logic in release toolingPotential false-positive signature verification with inline-signed .asc substitutionRelease-integrity hardening
8e495707by Peter Neuroth+5−21 file
No security note in commit
Low 42 AI analysisMessage 95 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

doc: pass the manifest explicitly to gpg --verify

This commit updates Core Lightning's release documentation to tell users and release managers to run gpg --verify with both the signature file and the manifest file named explicitly. The old one-argument form can silently succeed even if t…

Verification bypass risk in release artifact validationgpg --verify single-argument form can exit 0 without reading the intended manifestDocumentation-only hardening of release process
2dee8699by Peter Neuroth+9−62 files
Vendor flagged security relevance
Low 25 AI analysisMessage 58 · Thin
EP Elements ProjectCore Lightning BitcoinLightning Network

Cargo.lock: update dependencies

This commit is a routine update to the Rust dependency lock file (Cargo.lock), bumping many third-party libraries to newer patch or minor versions. The commit message gives no security reason for the update, and no verified references link…

Routine dependency refresh with no stated security rationaleUpdates to security-sensitive transitive crates (rustls, hyper, h2, tokio, webpki-roots) but no evidence these versions fix known vulnerabilitiesNo source-code changes or patch-specific fixes visible in the diff
c1551c55by daywalker90+298−2761 file
No security note in commit
High 80 AI analysisMessage 85 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

common: bound JSON nesting depth when parsing

This commit fixes a stack-overflow risk in Core Lightning's JSON parser. Before the fix, an attacker could send a valid JSON-RPC message containing thousands of nested brackets or braces. The parser's own helper functions used recursion fo…

Stack-overflow via deeply nested JSONRecursive JSON traversal without depth boundDenial-of-service vector in JSON-RPC input parsing
83f92e4bby Níckolas Goline+90−22 files
Vendor flagged security relevance
Informational 15 AI analysisMessage 28 · Opaque
EP Elements ProjectCore Lightning BitcoinLightning Network

common: minor typo fixes

This commit only fixes typos and comment style. It changes two C-style comments from // to /* */ and corrects a grammar error in a documentation comment ('element' to 'elements'). There are no code behavior changes, no bug fixes, and no se…

273d7f02by w3lld1+3−32 files
No security note in commit
Informational 20 AI analysisMessage 90 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

pyln-testing: truncate long testnames

This change fixes a test-infrastructure bug in Core Lightning's Python testing helpers. When running tests against a PostgreSQL database, very long test names could be silently shortened by PostgreSQL, causing different test runs or nodes …

No security-relevant signal: change is in test framework code onlyFixes a test reliability issue, not a runtime vulnerabilityNo input sanitization, authentication, cryptography, or network changes
c4fe4cbaby Peter Neuroth+59−12 files
No security note in commit
Moderate 60 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

wallet: exclude immature coinbase outputs from fee rescue selection

This fix prevents Core Lightning from trying to use freshly created bitcoins (immature coinbase rewards) as emergency funds for fee-bump transactions. Such a transaction would be invalid under Bitcoin's rules and would be rejected by the n…

Consensus-invalid transaction generation preventedFee rescue / CPFP failure mode mitigatedCoinbase maturity check added to coin selection
34883ff7by cdecker+5−12 files
Vendor flagged security relevance
Moderate 59 AI analysisMessage 91 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

askrene: fix crash loading node bias with description

This commit fixes a bug in Core Lightning's askrene plugin that could prevent a node from restarting. When a saved routing layer contained a node bias with a description, the plugin accidentally freed the description's memory while using i…

Use-after-free / double-take of a tal-allocated string during plugin startupDenial-of-service-like symptom: lightningd aborts before replying to init, node cannot restartFixes publicly reported issue #9433 by endothermicdev
4681177dby Vincenzo Palazzo+2−32 files
No security note in commit
Informational 12 AI analysisMessage 91 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

tests: restart the node which owns the layer in node bias test

This commit only fixes a test case so it actually exercises the intended code path. It does not change any production code, so it cannot introduce or fix a real-world security vulnerability by itself. The test change is a reproducer for a …

0f3f67a0by Vincenzo Palazzo+3−21 file
No security note in commit
High 78 AI analysisMessage 68 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

dualopend: bound the feerates a peer opens at

This commit fixes a bug in Core Lightning's experimental dual-funded channel feature. When another node tried to open a channel, Core Lightning was not checking whether the proposed transaction fees were reasonable. A peer could request a …

Missing input validation on wire-parsed feerate fieldsPeer could induce signing and storage of feerate == 0RBF remote path allowed unbounded upward feerate walks
ba08356fby cdecker+140−04 files
Vendor flagged security relevance
High 72 AI analysisMessage 100 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

tests: regression coverage for out-of-range feerates

This commit adds regression tests for three related bugs where wildly wrong Bitcoin transaction feerates could enter Core Lightning. In the worst case, a malicious or broken fee source could make the node think a feerate was zero (due to a…

Integer overflow in feerate conversion (u32 wrap from 0xFFFFFFFF perkb to 0 perkw)Absurd feerate from external fee source bypassing sanity ceilingDatabase-stored out-of-range feerate causing startup abort/crash loop
65bdbc47by cdecker+137−02 files
No security note in commit
Moderate 64 AI analysisMessage 86 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

lightningd: don't assert on funding feerates read from the db

This update fixes a crash bug in Core Lightning. When the software tried to list details of a channel opening in progress, it could crash if a stored fee rate was extremely large or zero. The crash happened because the code used an interna…

Integer overflow in RBF escalation (u32 * 25 / 24) leading to assertion failureAssertion failure in read-only introspection RPC (listpeerchannels) causing crash-loop at startupDatabase value treated as invariant despite originating from external fee estimator
d67c4936by cdecker+72−227 files
Vendor flagged security relevance
Moderate 53 AI analysisMessage 86 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

wallet: clamp absurd inflight funding feerates on upgrade

This commit fixes a bug where Core Lightning nodes could get stuck in a crash loop. If a node had previously stored an extremely high or zero fee rate for an in-progress channel funding operation (a 'splice' or dual-funded channel RBF), a …

Integer overflow in fee-rate calculation (u32 overflow when multiplying by 25/24)Assertion failure leading to daemon crash loop at startupDatabase migration clamps out-of-range stored funding feerates
f057c692by cdecker+34−01 file
Vendor flagged security relevance
Repository ledger

Explore captured commits

Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.

Lower-prioritybwatch: add wire formatby Sangbida Chaudhuri · 02e0df87 · May 11, 2026 · 2 filesMessage 51 · ThinInformational 12Details
Commit message · Sangbida Chaudhuri

bwatch: add wire format

This wire file primarily contains datastructures that is used to serialize data for storing in the datastore. We have 2 types of datastores for bwatch.
The block history datastore and the watch datastore. For block history we store height, the hash and the hash of the previous block.
For watches we have 4 types of watches - utxo, scriptpubkey, scid and blockdepth watches, each of these have their unique info stored in the datastore. The common info for all watches includes the start block and the list of owners interested in watching.

51/100 · ThinMessage clarity
✓ Subject identifies a change✓ Provides detailed explanatory context
AI analysis · Informational 12/100

This commit adds a new internal data-format definition (a 'wire format') for a Core Lightning plugin called 'bwatch'. It describes how the plugin will store block history and 'watch' records in its database. There is no executable code in the change—only a build-file update and a CSV file that defines data structures. Nothing in the commit suggests a security vulnerability, fix, or exposure.

Lower-prioritycommon/json_stream: use json_out_addstrn for better efficiency.by Rusty Russell · 988f1219 · May 11, 2026 · 1 fileMessage 65 · AdequateInformational 15Details
Commit message · Rusty Russell

common/json_stream: use json_out_addstrn for better efficiency.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Informational 15/100

This is a small internal code cleanup in how JSON strings are added to output streams. It replaces a less efficient formatting-based path with a direct string-copying helper, and consolidates two similar functions. There is no user-visible behavior change and no security relevance in the diff itself.

AI review queuedsetconfig: fix crash on dynamic multi-value plugin optionsby wqxoxo · e9fee876 · May 11, 2026 · 14 filesMessage 81 · StrongLow 45Details
Commit message · wqxoxo

setconfig: fix crash on dynamic multi-value plugin options

We had an assert(!(ot->type & OPT_MULTI)) which crashed when using
setconfig on a plugin option marked as both dynamic and multi.

The fix changes plugin_set_dynamic_opt to accept an array of values
(scalar options pass a 1-element array, multi options pass the complete
set). For multi options, setconfig replaces ALL values atomically - an
empty array clears them.

Fixes: #8295

Changelog-Fixed: setconfig no longer crashes on dynamic multi-value plugin options

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
second-pass: broader security terminology
AI analysis · Low 45/100

This commit fixes a crash in Core Lightning's `setconfig` command. Previously, if a user tried to change a plugin option that accepts multiple values and can be changed while running, the node would hit an internal assertion and crash. The fix allows `setconfig` to handle these multi-value options properly by accepting an array of values and replacing all existing values at once.

Lower-priorityxpay: config option xpay-user-layerby Lagrang3 · 2346d379 · May 11, 2026 · 4 filesMessage 68 · AdequateInformational 15Details
Commit message · Lagrang3

xpay: config option xpay-user-layer

This option allow user to configure xpay to always use the layers
specified.

Changelog-Added: xpay: config option xpay-user-layer

Signed-off-by: Lagrang3 <lagrang3@protonmail.com>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit adds a new user-facing configuration option called xpay-user-layer for the xpay payment plugin in Core Lightning. It lets node operators permanently specify routing layers that xpay will apply to every payment, which is useful when xpay is handling the older pay command where layers cannot be passed directly. The change is a straightforward feature addition with no security-relevant behavior.

Lower-prioritylibplugin: add helpers for multi-string optionsby Lagrang3 · 03e5d22a · May 11, 2026 · 3 filesMessage 60 · AdequateInformational 15Details
Commit message · Lagrang3

libplugin: add helpers for multi-string options

Changelog-None

Signed-off-by: Lagrang3 <lagrang3@protonmail.com>

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Informational 15/100

This commit is a routine code cleanup: it moves two small helper functions for handling plugin options that can be set multiple times from a test-only file into the shared plugin library so other plugins can reuse them. There is no security-relevant change.

Lower-prioritypytest: fix use of deprecated `getroute` in tests/test_misc.py::test_graceful_htlcby Rusty Russell · b1d77a62 · May 11, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · Rusty Russell

pytest: fix use of deprecated `getroute` in tests/test_misc.py::test_graceful_htlc

Merge conflict:

```
FAILED tests/test_misc.py::test_graceful_htlc - pyln.client.lightning.RpcError: RPC call failed: method: getroute, payload: {'id': '03cecbfdc68544cc596223b68ce0710c9e5d2c9cb317ee07822d95079acc703d31', 'amount_msat': 10000, 'riskfactor': 1, 'cltv': 9}, error: {'code': -32601, 'message': 'Command "getroute" is deprecated'}
```

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100

This is a routine test-only fix. A single pytest test case was still calling an old, deprecated RPC command named 'getroute'. The patch replaces it with the current helper method 'single_route'. There is no change to production code, no security bug, and no vulnerability.

Lower-priorityconfig: change message-padding to false by default.by Rusty Russell · 04fc51f5 · May 11, 2026 · 4 filesMessage 85 · StrongInformational 19Details
Commit message · Rusty Russell

config: change message-padding to false by default.

Too many reports of problems with weird nodes.

Changelog-Changed: Protocol: `message-padding` defaults to false, due to poor detection of broken implementations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Informational 19/100

This change turns off a privacy feature that made all network messages the same size by default. The feature was causing connection problems with some other Lightning nodes that didn't handle the extra padding bytes correctly, and the existing detection of those broken nodes wasn't reliable enough. It is a compatibility and reliability fix, not a security patch for an exploitable vulnerability.

Lower-prioritygraceful: add a timeout for user simplicity.by Rusty Russell · 8ee0a613 · May 11, 2026 · 4 filesMessage 60 · AdequateInformational 18Details
Commit message · Rusty Russell

graceful: add a timeout for user simplicity.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Informational 18/100

This commit adds an optional timeout to the 'graceful' RPC command in Core Lightning, which operators use when preparing a node to shut down. Previously, graceful would wait indefinitely until all payment commitments (HTLCs) finished and idle peers disconnected. Now, if a timeout is provided, the command returns after that many seconds and reports any still-pending HTLC expiry heights and connected peers. This is a usability improvement for scripting shutdowns, not a security fix. The code changes are straightforward and do not appear to introduce a vulnerability.

Lower-prioritylightningd.service: shut down lightningd properly.by Rusty Russell · bd8e8e64 · May 11, 2026 · 1 fileMessage 81 · StrongInformational 20Details
Commit message · Rusty Russell

lightningd.service: shut down lightningd properly.

And use the new graceful shutdown to make it even smoother!

Fixes: #7697
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Fixed: contrib: the systemd lightningd.service script now shuts down lightningd properly.

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI analysis · Informational 20/100

This commit updates the systemd service file that manages the Core Lightning daemon so that it shuts down the service gracefully instead of abruptly killing it. The change adds a two-step stop command: first a graceful shutdown with a 20-second window, then a hard stop if needed, plus a 60-second timeout. This is an operational reliability fix, not a security vulnerability fix. It reduces the risk of data corruption or inconsistent state from a forced shutdown, but it does not introduce or patch an exploit.

AI review queuedgraceful: new command to instruct CLN to start shutting down.by Rusty Russell · a87062b2 · May 11, 2026 · 16 filesMessage 81 · StrongInformational 22Details
Commit message · Rusty Russell

graceful: new command to instruct CLN to start shutting down.

Based on "lightningd: add "snub-idle-channels" dynamic config variable" by
Matt Whitlock <c-lightning@mattwhitlock.name>.

Fixes: https://github.com/ElementsProject/lightning/issues/4842
Changelog-Added: JSON-RPC: `graceful` command to prepare CLN for shutdown.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 22/100

This commit adds a new JSON-RPC command called 'graceful' that lets a Core Lightning node operator tell their node to prepare for shutdown. When invoked, the node stops accepting new HTLCs (payment forwarding commitments), declines to reestablish idle channels, disconnects peers that have no active HTLCs, and waits for any remaining in-flight HTLCs to resolve before returning. It is an operational/administrative feature, not a vulnerability fix. The commit does not change authentication or authorization rules; it only adds a new state (LD_STATE_GRACE) and the logic to enter and exit it safely.

Lower-priorityaskrene: make failure messages clearer:by Rusty Russell · 3e4af7de · May 11, 2026 · 3 filesMessage 68 · AdequateInformational 15Details
Commit message · Rusty Russell

askrene: make failure messages clearer:

If all channels are disabled, say so clearly. Also reword: it's not
the source or destination which have disabled the channels. While
we're here, remove the double space, lest people think I'm Satoshi.

Before:
Failed after 1 attempts.
Unexpected error (invalid_onion_payload) from final node: disabling 103x1x0/1 for this payment.
Then routing failed: We could not find a usable set of paths. The source has disabled 1 of 1 channels, leaving capacity only 0msat of 1000000000msat.

After:
Failed after 1 attempts.
Unexpected error (invalid_onion_payload) from final node: disabling 103x1x0/1 for this payment.
Then routing failed: We could not find a usable set of paths. All 1 channels to the source are disabled.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit only changes user-facing error messages in the Core Lightning routing plugin (askrene). It makes failure explanations clearer when payment channels are disabled, and removes double spaces from messages. There is no code behavior change, no security fix, and no vulnerability.

Lower-priorityxpay: ensure unique_id is always valid.by Rusty Russell · 7c89e23c · May 11, 2026 · 2 filesMessage 80 · StrongInformational 22Details
Commit message · Rusty Russell

xpay: ensure unique_id is always valid.

In implementing shadow, I added a call to payment_log in xpay_core,
which caused a valgrind error because we set unique_id later. This
was a premature optimization, so we didn't assign unique_id for
payments which didn't even start, but it's a footgun, and there are
other (less common) calls to payment_log too early which make the same
mistake.

Simplify: unique_id is assigned at creation.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Informational 22/100

This is a code-quality fix inside Core Lightning's xpay plugin. It moves the assignment of a payment's unique ID earlier in the payment's lifetime so that logging functions can safely use it. The bug caused valgrind warnings (use of uninitialized data) and could have led to confusing log output, but it is not an exploitable security vulnerability.

Lower-priorityaskrene: all remove_small_channel_layer when maxparts=1.by Rusty Russell · a577e530 · May 11, 2026 · 1 fileMessage 65 · AdequateLow 26Details
Commit message · Rusty Russell

askrene: all remove_small_channel_layer when maxparts=1.

We were doing it for "auto.no_mpp_support", but not maxparts=1.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Low 26/100

This change adjusts how the Core Lightning routing plugin (askrene) decides to ignore very small payment channels. Previously it only removed small channels when the payer did not support multi-part payments. Now it also does so when the caller explicitly requests a single payment part (maxparts=1). The effect is to make single-part route searches faster and more reliable, but it could also change which routes are chosen or whether any route is found at all.

Lower-priorityaskrene: improve errors we return.by Rusty Russell · b74305b5 · May 11, 2026 · 6 filesMessage 60 · AdequateInformational 19Details
Commit message · Rusty Russell

askrene: improve errors we return.

In particular, we can return PAY_ROUTE_TOO_EXPENSIVE.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Informational 19/100

This change improves the error messages returned by Core Lightning's routing plugin (askrene). Previously, almost all routing failures were reported with a single generic 'route not found' error code. Now the plugin distinguishes cases such as 'route too expensive' or 'timed out' and returns the appropriate error code. This is a quality-of-life improvement for callers, not a fix for an exploitable vulnerability.

Lower-priorityaskrene: deprecate `auto.no_mpp_support` layer in favor of `maxparts=1`.by Rusty Russell · 052386ab · May 11, 2026 · 4 filesMessage 73 · AdequateInformational 19Details
Commit message · Rusty Russell

askrene: deprecate `auto.no_mpp_support` layer in favor of `maxparts=1`.

This layer predated the maxparts parameter.

Changelog-Deprecated: JSON-RPC: `getroutes` layer `auto.no_mpp_support`: use `maxparts=1` parameter instead (available since v25.09).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 19/100

This commit is a routine deprecation of an old way to request single-path routing in the Core Lightning `getroutes` RPC. The `auto.no_mpp_support` layer still works for now, but it is marked deprecated and internally is converted to the newer `maxparts=1` option. There is no security vulnerability here.

Lower-priorityxpay: remove internal "disable_mpp" flag.by Rusty Russell · f27b6d3f · May 11, 2026 · 1 fileMessage 68 · AdequateInformational 18Details
Commit message · Rusty Russell

xpay: remove internal "disable_mpp" flag.

We already have `maxparts`: simply set that to 1 for the same effect.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 18/100

This is a small internal cleanup in Core Lightning's xpay plugin. It removes a redundant 'disable_mpp' flag and instead uses the existing 'maxparts' setting (set to 1) to achieve the same effect of disabling multi-part payments. The behavior appears functionally equivalent.

Lower-priorityxpay: extract payment creation logic.by Rusty Russell · b70fd6e3 · May 11, 2026 · 1 fileMessage 60 · AdequateInformational 15Details
Commit message · Rusty Russell

xpay: extract payment creation logic.

Simple refactor so we can use it for `xkeysend` too.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Informational 15/100

This is a routine code cleanup in Core Lightning's xpay plugin. The developer extracted the logic that creates a new payment object into a reusable helper function so it can later be used for a new 'xkeysend' feature. No security bug is being fixed here; the behavior of existing payment handling is intended to remain the same.

Lower-priorityxpay: process channel_update from error for the current payment.by Rusty Russell · 1529b2b6 · May 11, 2026 · 2 filesMessage 73 · AdequateLow 37Details
Commit message · Rusty Russell

xpay: process channel_update from error for the current payment.

Applying it globally as `pay` did risks leaking information, but applying
it for retries doesn't really. And doing that is fairly easy with layers.

Changelog-Added: Protocol: `xpay` will now update for the current payment if it gets a `channel_update` in an error message.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 37/100

This change improves the 'xpay' payment plugin in Core Lightning so that when a payment attempt fails and the error message contains a channel update, xpay uses that update only for the current payment's retry instead of applying it globally. The commit message explicitly says the old global behavior risked leaking information, and the new scoped behavior reduces that privacy risk while still helping payments succeed.

Lower-priorityxpay: when acting as pay, imitate its idempotent behavior.by Rusty Russell · 48b37869 · May 11, 2026 · 1 fileMessage 65 · AdequateLow 33Details
Commit message · Rusty Russell

xpay: when acting as pay, imitate its idempotent behavior.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Low 33/100

This change makes the newer 'xpay' payment plugin behave like the older 'pay' plugin when an invoice has already been paid. Previously, if xpay tried to pay an invoice that was already settled, it would give up with an error. Now it looks up the previous successful payment details and returns them as if the current request succeeded. This is a compatibility fix to avoid surprising users and callers who expected the old pay plugin's idempotent behavior.

Lower-prioritypyln: add getroutes wrapper to pyln-client, add single_route helper to pyln-testing.by Rusty Russell · 63e67d45 · May 11, 2026 · 2 filesMessage 75 · AdequateInformational 15Details
Commit message · Rusty Russell

pyln: add getroutes wrapper to pyln-client, add single_route helper to pyln-testing.

And remove the two getroute() calls inside pyln-testing.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

75/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit adds a new Python helper for a Lightning RPC command and updates test utilities to use it. There is no security issue visible in the change itself.

Lower-prioritytests: use getroutes, not getroute (simple cases)by Rusty Russell · 4e852086 · May 11, 2026 · 5 filesMessage 78 · AdequateInformational 15Details
Commit message · Rusty Russell

tests: use getroutes, not getroute (simple cases)

We add a nice getroutes wrapper and use it to replace the simple
getroute() calls which simply hand the result to sendpay().

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only changes test code. It replaces direct calls to the older getroute() RPC helper with a new single_route() wrapper that internally uses the newer getroutes() API. There is no change to production code, no bug fix, and no security relevance.

Lower-prioritypytest: convert remaining getroute cases.by Rusty Russell · 96e9bc7c · May 11, 2026 · 4 filesMessage 78 · AdequateInformational 15Details
Commit message · Rusty Russell

pytest: convert remaining getroute cases.

Excluding explicit getroute tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only updates test code. It replaces old calls to the `getroute` RPC with newer helper methods like `single_route` and `getroutes`, and updates the field names used in test assertions (for example, `amount_msat` becomes `amount_out_msat`). There is no change to the actual Core Lightning node software, so it cannot affect real users or introduce a security vulnerability.

Lower-prioritypyln-testing: allow bitcoind mocks to return None to mean "don't mock".by Rusty Russell · 363a1778 · May 11, 2026 · 1 fileMessage 75 · AdequateInformational 15Details
Commit message · Rusty Russell

pyln-testing: allow bitcoind mocks to return None to mean "don't mock".

Good for conditional mocks, like in next patch.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

75/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
AI analysis · Informational 15/100

This is a small change to a Python testing helper used only in Core Lightning's test suite. It lets a fake Bitcoin RPC call return None as a signal to fall through to the real RPC call. There is no production code affected and no security issue visible in the patch.

Lower-prioritygetroute: deprecate in favor of `getroutes`by Rusty Russell · e6575520 · May 11, 2026 · 6 filesMessage 68 · AdequateInformational 15Details
Commit message · Rusty Russell

getroute: deprecate in favor of `getroutes`

Changelog-Deprecated: JSON-RPC: `getroute` (use `getroutes` with layers `["auto.localchans","auto.sourcefree"]` and `maxparts=1`) (since v25.09).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit simply marks an older command, getroute, as deprecated and tells users to switch to a newer command, getroutes. It does not fix a bug or change security behavior. The old command still works for now, but tests that use it must explicitly allow deprecated APIs. There is no security issue here.

Lower-prioritykeysend: deprecate in favor of `xkeysend`.by Rusty Russell · 98315531 · May 11, 2026 · 9 filesMessage 68 · AdequateInformational 20Details
Commit message · Rusty Russell

keysend: deprecate in favor of `xkeysend`.

Changelog-Deprecated: JSON-RPC: `keysend` (use `xkeysend`). `xkeysend` will take over `keysend` in v27.03.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 20/100

This commit simply marks the old `keysend` RPC command as deprecated and tells users to switch to a newer command called `xkeysend`. It updates documentation, schemas, and test settings so that tests continue to work while the old command is still available. There is no security bug being fixed here.