EP
← All projectsElements Project

Core Lightning

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

BitcoinLightning NetworkActive incident
Repository coverage

1979 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
26commits · 30 days
185commits · 60 days
659commits · 180 days
1641commits · 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.

71/100 average clarity
484Strong · 80–100
1224Adequate · 60–79
241Thin · 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
daywalker90113895164
Lagrang386578170
Vincenzo Palazzo13411182
dovgopoly15015164
Sangbida Chaudhuri14931146066
Dusty Daemon821378066
ShahanaFarooqui931093063
Peter Neuroth1024101071
Christian Decker36436072
Analysis record

Published AI watches

Last scanned 29 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.

Security candidatecargo: update dependenciesby daywalker90 · fe0c4522 · Jun 16, 2026 · 2 filesMessage 58 · ThinInformational 21Details
Commit message · daywalker90

cargo: update dependencies

cargo update output:
Updating bitflags v2.11.1 -> v2.13.0
Updating cc v1.2.63 -> v1.2.64
Updating chrono v0.4.44 -> v0.4.45
Updating h2 v0.4.14 -> v0.4.15
Updating http v1.4.1 -> v1.4.2
Updating js-sys v0.3.99 -> v0.3.102
Updating log v0.4.30 -> v0.4.32
Updating memchr v2.8.1 -> v2.8.2
Updating prost v0.14.3 -> v0.14.4
Updating prost-build v0.14.3 -> v0.14.4
Updating prost-derive v0.14.3 -> v0.14.4
Updating prost-types v0.14.3 -> v0.14.4
Updating regex v1.12.3 -> v1.12.4
Updating regex-syntax v0.8.10 -> v0.8.11
Updating rustls-native-certs v0.8.3 -> v0.8.4
Updating smallvec v1.15.1 -> v1.15.2
Updating wasm-bindgen v0.2.122 -> v0.2.125
Updating wasm-bindgen-futures v0.4.72 -> v0.4.75
Updating wasm-bindgen-macro v0.2.122 -> v0.2.125
Updating wasm-bindgen-macro-support v0.2.122 -> v0.2.125
Updating wasm-bindgen-shared v0.2.122 -> v0.2.125
Updating web-sys v0.3.99 -> v0.3.102
Updating yoke v0.8.2 -> v0.8.3
Updating zerocopy v0.8.50 -> v0.8.52
Updating zerocopy-derive v0.8.50 -> v0.8.52
Updating zeroize v1.8.2 -> v1.9.0

Also upgraded quick-xml to 0.40

Changelog-None

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
Why it was queued
memory safety
AI analysis · Informational 21/100

This commit is a routine update of third-party Rust libraries used by Core Lightning's REST plugin. It bumps versions in the package lock file and raises one direct dependency (quick-xml) from 0.39 to 0.40. The commit message does not say it fixes any security bug, and no verified security advisory was supplied. Dependency updates can sometimes include security fixes, but this change alone does not demonstrate a vulnerability in Core Lightning.

Security candidatetools: Fix `sign` and `docker` target detection when passed as single argumentby ShahanaFarooqui · 19992371 · Jun 10, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · ShahanaFarooqui

tools: Fix `sign` and `docker` target detection when passed as single argument

The sign target detection uses pattern matching that requires spaces on
both sides of "sign" in the TARGETS variable. When only "sign" is passed
as an argument, TARGETS becomes " sign" (leading space only), causing
the condition to fail.

Add an additional pattern match to detect "sign" with a leading space
but no trailing space, which occurs when "sign" is the only target or
the last target in the list.

This regression seems to have been exposed by GitHub Actions runner
updates (Ubuntu 22.04 → 24.04), which changed argument passing behavior.

Changelog-None: Fixes the release signing issue in CI only.

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

This commit fixes a shell-script pattern-matching bug in the release build tool. When a maintainer ran the release script with only 'sign' or 'docker' as the target, the script failed to detect it because it expected spaces on both sides of the word. The fix adds an extra check for when the word appears at the end of the target list. It is a CI/release workflow bug, not a vulnerability in the Lightning node software itself.

Security candidatecontrib: add nGoline's signing key Changelog-Noneby Níckolas Goline · bfe5dd4f · Jun 5, 2026 · 2 filesMessage 60 · AdequateInformational 15Details
Commit message · Níckolas Goline

contrib: add nGoline's signing key
Changelog-None

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
signing boundarydocumentation-only discount
AI analysis · Informational 15/100

This commit simply adds a new developer's PGP public key to the project's list of trusted signing keys. It is an administrative/key-management change, not a code change, and introduces no security vulnerability.

Security candidatecontrib: add daywalker90's signing keyby daywalker90 · dfc7d557 · Jun 4, 2026 · 2 filesMessage 45 · ThinInformational 15Details
Commit message · daywalker90

contrib: add daywalker90's signing key

Changelog-None

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing boundarydocumentation-only discount
AI analysis · Informational 15/100

This commit simply adds a new developer's PGP public key to the project's list of trusted signing keys. It is an administrative/key-management change, not a code change, and introduces no security vulnerability by itself.

Security candidatecontrib: add Lagrang3's signing keyby Lagrang3 · 0bdb5b0c · Jun 4, 2026 · 2 filesMessage 60 · AdequateInformational 15Details
Commit message · Lagrang3

contrib: add Lagrang3's signing key

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
Why it was queued
signing boundarydocumentation-only discount
AI analysis · Informational 15/100

This commit simply adds a new developer's PGP public key to the project's list of trusted signing keys. It is an administrative/key-management change, not a code change, and introduces no security vulnerability by itself.

Security candidategossipd: be more robust against channel_update spamming.by Rusty Russell · bad9d6d3 · May 21, 2026 · 2 filesMessage 65 · AdequateHigh 76Details
Commit message · Rusty Russell

gossipd: be more robust against channel_update spamming.

Reported-by: chandrapratap376@gmail.com
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
Why it was queued
resource exhaustion
AI analysis · High 76/100

This update fixes a memory exhaustion weakness in Core Lightning's gossip daemon. An unauthenticated remote peer could send a flood of fake Lightning channel identifiers, causing the node to keep allocating memory until the process crashed or the host ran out of memory. The patch caps two internal queues at 10,000 entries so memory use stays bounded.

Security candidateaskrene: askrene-remove-channel-updateby Lagrang3 · 902242b0 · May 11, 2026 · 15 filesMessage 68 · AdequateInformational 23Details
Commit message · Lagrang3

askrene: askrene-remove-channel-update

Changelog-Added: askrene: askrene-remove-channel-update, a new RPC to remove channel_update entries from layers.

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

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
boot or update path
AI analysis · Informational 23/100

This commit adds a new management command (askrene-remove-channel-update) that lets users delete a previously-added channel override from an AskRene routing 'layer'. It is a routine feature addition: it removes one entry from an in-memory map inside the askrene plugin and does not touch funds, cryptographic operations, or network peers. There is no direct evidence in the commit that this fixes a security bug or introduces a vulnerability, but any new RPC surface slightly enlarges the attack surface and could hide logic bugs in input handling.

Security candidatefix: release txprepare reservations on send failureby Vincenzo Palazzo · 1c5e6329 · May 11, 2026 · 2 filesMessage 100 · StrongLow 47Details
Commit message · Vincenzo Palazzo

fix: release txprepare reservations on send failure

Clean up the original PSBT reservation when withdraw/txsend fail after signing or broadcast.

Include the final withdraw regression coverage, including the liquid-safe address handling needed for CI.

Fixes #8925

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
signing boundarysigning or wallet path
AI analysis · Low 47/100

This commit fixes a bug in Core Lightning's wallet code where, if a prepared Bitcoin transaction failed during signing or broadcast, the coins that had been set aside ('reserved') for that transaction were not released back to the wallet. The fix makes sure those reservations are cleaned up automatically on failure, so funds are not stuck and become usable again. The change also adds tests that simulate a broadcast failure and verify the funds are no longer reserved afterward.

Security candidatecommon: expose is_signature_field as is_tlv_signature_field.by Rusty Russell · bc2411b5 · May 11, 2026 · 2 filesMessage 65 · AdequateInformational 15Details
Commit message · Rusty Russell

common: expose is_signature_field as is_tlv_signature_field.

Proof code needs this.

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
Why it was queued
signing boundary
AI analysis · Informational 15/100

This commit simply renames an internal helper function and makes it publicly available in a header file so other parts of the codebase can use it. There is no bug fix, behavior change, or security-sensitive logic alteration. It is a routine code-organization change.

Security candidatetxprepare: fix withdraw returning unsigned transactionby Vincenzo Palazzo · 16cf06b4 · May 9, 2026 · 2 filesMessage 100 · StrongLow 33Details
Commit message · Vincenzo Palazzo

txprepare: fix withdraw returning unsigned transaction

The withdraw command was returning an unsigned raw transaction in
its 'tx' response field. This happened because signpsbt_done() used
psbt_txid() to extract utx->tx, which internally calls
wally_psbt_extract() with WALLY_PSBT_EXTRACT_NON_FINAL — stripping
all signature and witness data.

The broadcast itself succeeded because sendpsbt internally finalizes
the PSBT via psbt_final_tx(), but the 'tx' field returned to the
user had empty scriptSigs and no witness data.

This is a regression from 908f834d6 ("Update libwally to 0.8.8,
support PSBTv2") which rewrote psbt_txid() from manually copying
final_scriptsig/redeem_script into the cloned tx, to using
wally_psbt_extract(WALLY_PSBT_EXTRACT_NON_FINAL) which strips all
signing data by design.

Fix by finalizing the signed PSBT in signpsbt_done() and extracting
the fully signed transaction via psbt_final_tx(). The txid
verification still uses psbt_txid() (which is correct for txid
computation since txids exclude witness data).

Fixes: https://github.com/ElementsProject/lightning/issues/8701
Changelog-Fixed: withdraw now returns a fully signed transaction in the `tx` response field.
Signed-off-by: Vincenzo Palazzo <vincenzopalazzo@member.fsf.org>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
signing boundarydefensive validationsigning or wallet path
AI analysis · Low 33/100

This commit fixes a bug in Core Lightning's 'withdraw' command where the transaction shown to the user was returned without valid signatures or witness data, even though the actual network broadcast worked correctly. The returned 'tx' field looked like a real transaction but would be rejected if a user tried to broadcast it themselves. The fix ensures the returned transaction is fully signed and final.

Security candidatetests: add regression tests for withdraw returning unsigned txby Vincenzo Palazzo · c000fc90 · May 9, 2026 · 1 fileMessage 100 · StrongLow 46Details
Commit message · Vincenzo Palazzo

tests: add regression tests for withdraw returning unsigned tx

Adds two tests to reproduce issue #8701 where the withdraw command
returns an unsigned raw transaction in the 'tx' response field:

1. test_withdraw_returns_signed_tx: verifies that withdraw's 'tx' field
contains witness data for all inputs (basic wallet UTXOs).

2. test_withdraw_close_output_signed: verifies signing works when
withdrawing funds that include channel close outputs (anchor/P2WSH
with CSV locks), which was the exact scenario in the reported issue.

The root cause is that psbt_txid() uses WALLY_PSBT_EXTRACT_NON_FINAL
which strips signatures/witnesses, and the withdraw response returns
this unsigned tx instead of the finalized one.

Changelog-None
Signed-off-by: Vincenzo Palazzo <vincenzopalazzo@member.fsf.org>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
signing boundaryfuzzing or regression evidencesigning or wallet path
AI analysis · Low 46/100

This commit only adds two new automated tests that demonstrate an existing bug: the 'withdraw' command returns an unsigned raw transaction in its 'tx' field because an internal helper strips away signatures. The tests are marked as expected-to-fail, so the actual code flaw is not fixed here. A user relying on the returned transaction could receive a version that looks valid but would be rejected by the Bitcoin network because it lacks required witness data. The commit documents the regression but does not change the wallet logic itself.

Security candidatebitcoin/tx.c: use 330 sat dust limit for P2TR/P2WPKH change outputs Fixes #8395 Fix by checking is_elements: Elements keeps 546 sat, Bitcoin uses 330 sat. Changelog-Fixed: Transactions now correctly create change outputs >= 330 sat for P2TR/P2WPKH instead of absorbing them as feesby Andezion · fcd6671a · May 8, 2026 · 2 filesMessage 81 · StrongLow 36Details
Commit message · Andezion

bitcoin/tx.c: use 330 sat dust limit for P2TR/P2WPKH change outputs Fixes #8395
Fix by checking is_elements: Elements keeps 546 sat, Bitcoin uses 330 sat.
Changelog-Fixed: Transactions now correctly create change outputs >= 330 sat for P2TR/P2WPKH instead of absorbing them as fees

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 boundary
AI analysis · Low 36/100

This commit fixes a bug in Core Lightning where small change outputs on Bitcoin were being treated as too tiny to keep, causing them to be silently added to transaction fees instead of returned to the user. The fix lowers the threshold for P2TR/P2WPKH change outputs on Bitcoin from 546 satoshis to 330 satoshis, matching current Bitcoin network rules. Elements/Liquid still uses 546. Users could previously lose small change amounts as extra fees.

Security candidateopening: reject fundchannel_complete with unsigned non-segwit inputsby wqxoxo · 508ce922 · May 7, 2026 · 2 filesMessage 73 · AdequateLow 49Details
Commit message · wqxoxo

opening: reject fundchannel_complete with unsigned non-segwit inputs

We can't know the txid of an unsigned PSBT with non-segwit (legacy
P2PKH/P2SH) inputs. wally_psbt_extract() fills in an empty scriptSig
for unsigned inputs, giving a txid that changes once the user signs
and broadcasts. openingd then waits forever for a tx it will never see.

Changelog-Fixed: fundchannel_complete: reject PSBTs with unsigned non-segwit inputs (txid is indeterminate until signed).

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundary
AI analysis · Low 49/100

This commit fixes a bug in Core Lightning's channel-funding command. If a user supplied an unsigned old-style (non-SegWit) bitcoin input when completing a channel open, the software would compute a transaction ID that could change later when the user actually signed and broadcast the transaction. The node would then wait forever for a funding transaction it would never recognize, leaving the channel opening process stuck. The fix rejects such inputs up front with a clear error message.

Security candidatelightning-downgrade: prepare for downgrading to v26.04.by Rusty Russell · cc8c043f · Apr 30, 2026 · 2 filesMessage 65 · AdequateInformational 15Details
Commit message · Rusty Russell

lightning-downgrade: prepare for downgrading to v26.04.

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
Why it was queued
update trustsigning or wallet path
AI analysis · Informational 15/100

This commit is routine release bookkeeping. It adds a new version marker (v26.04) to the downgrade tool and a comment in the database migration list so that users who later downgrade from v26.04 to an earlier release have the correct metadata. There is no bug fix, behavior change, or security-sensitive code change.

Security candidatewire: add shim patch for when we regenerate.by Rusty Russell · bcf4d72f · Apr 30, 2026 · 2 filesMessage 68 · AdequateInformational 12Details
Commit message · Rusty Russell

wire: add shim patch for when we regenerate.

The current BOLTVERSION doesn't match our implementation, so when we
`make extract-bolt-csv` we get a change.

Fold the changes into a single splice patch.

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
Why it was queued
boot or update path
AI analysis · Informational 12/100

This commit is a housekeeping change to two patch files used when regenerating Lightning protocol wire definitions. It merges two separate patches into one and updates the generated diff context so that running `make extract-bolt-csv` produces no unexpected changes. There is no runtime code change, no bug fix, and no security-relevant behavior described.

Security candidateBOLT quotes: split cross-section quotes; prepare for new `...` semantics.by Rusty Russell · 07d1db00 · Apr 30, 2026 · 11 filesMessage 83 · StrongInformational 15Details
Commit message · Rusty Russell

BOLT quotes: split cross-section quotes; prepare for new `...` semantics.

The new check_quotes.py tool will treat `...` at the start of a quote as
"immediately follows previous quote in BOLT text". To prepare for that,
we change existing quotes which used leading `...` to mean "skip some
text": split them into two consecutive BOLT comments (the second starting
with `...` to use the existing wildcard match), and add explicit `*...`
markers between consecutive BOLT test vector sections which cross `# From`
headers.

Also remove leading `...` from nonce quotes in cryptomsg.c/handshake.c
where the actual BOLT text starts a fresh sentence (no prior quote in file).

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

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidencecryptography-sensitive path
AI analysis · Informational 15/100

This commit is a documentation and code-comment cleanup. It splits BOLT (Bitcoin Lightning specification) quote comments so a new internal tool can check them more accurately, and removes a few stray leading ellipses from comments. There is no change to actual program logic, network behavior, or security-sensitive code.

Security candidateUpdate outdated BOLT quotes in channel open/close handling.by Rusty Russell · 39ac3f14 · Apr 30, 2026 · 4 filesMessage 86 · StrongInformational 18Details
Commit message · Rusty Russell

Update outdated BOLT quotes in channel open/close handling.

Some of these are malformed (thus were unchecked!), some are from the
stricter interpretation of `...` which won't cross section boundaries.

Several BOLT quotes had drifted from the current spec text:
- connectd/queries.c: BOLT #7 uses 'full_information' not 'complete';
remove a second quote that referenced query_channel_range but was
actually wrong (that requirement is for query_short_channel_ids).
- lightningd/dual_open_control.c: channel reserve is 1% rounded down
(not just 1%); witness weight check now says SHOULD broadcast rather
than MUST fail; RBF quotes simplified to match actual BOLT wording.
- openingd/openingd.c: 'The sending node' became 'The sender';
invalid signature response now says MUST send warning/error not just
MUST fail the channel.
- openingd/dualopend.c: same invalid-signature quote as openingd.c.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

86/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
signing boundary
AI analysis · Informational 18/100

This commit updates code comments that quote the Lightning Network specification (BOLT) in four files. Most changes are cosmetic: fixing outdated wording, malformed quote markers, and removing one incorrect quote. One change in connectd/queries.c removes a stale BOLT requirement comment but does not alter the actual behavior, which already replies with sync_complete=false for an unknown chain. Another change in dual_open_control.c updates a comment about what to do when a transaction's effective feerate is too low, but the surrounding code still calls a failure path. Overall, the commit is primarily documentation cleanup and does not appear to introduce or fix a security vulnerability on its own.

Security candidatecommon: follow BOLT 4 requirements to make decryption constant time.by Rusty Russell · d5508e1e · Apr 30, 2026 · 1 fileMessage 73 · AdequateModerate 67Details
Commit message · Rusty Russell

common: follow BOLT 4 requirements to make decryption constant time.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Fixed: Protocol: use BOLT4's paranoid advice about doing constant-time error decryption.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
constant-time or timing behavior
AI analysis · Moderate 67/100

This change fixes a privacy weakness in how Core Lightning processes returned error messages from the Lightning network routing protocol. Previously, the software stopped decrypting as soon as it found the error's origin, which could let a malicious routing node figure out its position in the payment path by measuring how quickly the sender reacted. The patch now always performs 27 decryption rounds and uses dummy keys after the real origin is found, following the BOLT 4 specification's 'paranoid' advice to make the process take the same amount of time regardless of where the failure occurred.

Security candidatepytest: fix flake in test_closing_anchorspend_htlc_tx_rbfby Níckolas Goline · 26b162dc · Apr 27, 2026 · 1 fileMessage 96 · StrongInformational 15Details
Commit message · Níckolas Goline

pytest: fix flake in test_closing_anchorspend_htlc_tx_rbf

Fixes: #9088

```
FAILED tests/test_closing.py::test_closing_anchorspend_htlc_tx_rbf - assert (None or 3001.3083296990844 < (3000 + 1))
+ where None = did_short_sig(<fixtures.LightningNode object at 0x7f1a89bb9c90>)
```

The previous fix #9027 misdiagnosed the cause: the identical value
3001.3083296990844 appears with and without a short signature, so this
is not signature-length variation but deterministic floating-point
rounding in `fees / weight * 1000` for this specific transaction
structure. Replace the hand-rolled ±1 assertions with check_feerate(),
which already uses a ±2 window and has the did_short_sig escape hatch
built in.

Changelog-None

96/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
signing boundary
AI analysis · Informational 15/100

This commit fixes a flaky automated test in Core Lightning. The test was occasionally failing because of tiny floating-point rounding differences when calculating transaction fees, not because of a real bug or security issue. The change replaces a strict hand-rolled tolerance check with a more forgiving helper function already designed for this purpose. There is no security impact.

Security candidateconnectd: rescue constant message size feature by exploiting OPT_ONION_MESSAGES (LND)by Rusty Russell · 52b70043 · Apr 10, 2026 · 1 fileMessage 65 · AdequateLow 34Details
Commit message · Rusty Russell

connectd: rescue constant message size feature by exploiting OPT_ONION_MESSAGES (LND)

I 🧡 Laolu!

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
Why it was queued
explicit security language
AI analysis · Low 34/100

This change adjusts when Core Lightning pads its network messages to a constant size. Previously padding was controlled by a developer/testing flag. Now it is enabled only when the connected peer advertises support for 'onion messages' (a newer Lightning feature). The commit message says this works around a bug in LND (another Lightning implementation) where LND would disconnect if it received certain padded 'ping' messages. The fix uses onion-message support as a signal that the remote LND version is new enough to tolerate the padding. There is no direct evidence in the diff of a security vulnerability; it reads as a compatibility/interoperability fix that incidentally preserves a privacy feature (uniform packet sizes).

Security candidateconnectd: rescue constant message size feature by exploiting option 154 (Eclair).by Rusty Russell · a65c6975 · Apr 10, 2026 · 1 fileMessage 65 · AdequateLow 35Details
Commit message · Rusty Russell

connectd: rescue constant message size feature by exploiting option 154 (Eclair).

I 🧡 tbast!

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
Why it was queued
explicit security language
AI analysis · Low 35/100

This commit adjusts when Core Lightning pads ping messages to keep packet sizes uniform. It now skips padding when talking to Eclair nodes that advertise feature bit 154, because Eclair had a similar bug where it did not reply to certain padded pings, which could cause connection problems. The change is a compatibility workaround, not a direct fix for a vulnerability in Core Lightning itself.

Security candidatesplice: Remove experiemental splicing featureby daywalker90 · 3a17da61 · Apr 9, 2026 · 29 filesMessage 45 · ThinInformational 15Details
Commit message · daywalker90

splice: Remove experiemental splicing feature

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathboot or update path
AI analysis · Informational 15/100

This commit removes the experimental flag that previously had to be enabled for splicing, making splicing a default feature. It is a feature-promotion and cleanup change, not a security fix. There are no code changes that patch a vulnerability, no mention of a CVE, and no security advisory.

Security candidatepytest: fix flake in test_easy_splice_out_into_channelby Rusty Russell · 3e878280 · Apr 2, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · Rusty Russell

pytest: fix flake in test_easy_splice_out_into_channel

```
2026-04-01T07:56:01.0560642Z > assert 'inflight' not in p1
2026-04-01T07:56:01.0581633Z E AssertionError: assert 'inflight' not in {'peer_id': '033845802d25b4e074ccfd7cd8b339a41dc75bf9978a034800444b51d42b07799a', 'peer_connected': True, 'reestablished': True, 'channel_type': {'bits': [12, 22], 'names': ['static_remotekey/even', 'anchors/even']}, 'updates': {'local': {'htlc_minimum_msat': 0, 'htlc_maximum_msat': 990000000, 'cltv_expiry_delta': 6, 'fee_base_msat': 1, 'fee_proportional_millionths': 10}, 'remote': {'htlc_minimum_msat': 0, 'htlc_maximum_msat': 990000000, 'cltv_expiry_delta': 6, 'fee_base_msat': 1, 'fee_proportional_millionths': 10}}, 'state': 'CHANNELD_AWAITING_SPLICE', 'scratch_txid': 'bf969125a0929605ba1e007912173fbf55cc67e19963e6d87a66066b7d764d9d', 'last_tx_fee_msat': 4545000, 'lost_state': False, 'feerate': {'perkw': 3750, 'perkb': 15000}, 'owner': 'channeld', 'short_channel_id': '103x2x0', 'direction': 1, 'channel_id': '68c2b5982e67b7dbd42d310e2dd481831c5add0d6a541fec6e26d000fd0ea0f4', 'funding_txid': 'f4a00efd00d0266eec1f546a0ddd5a1c8381d42d0e312dd4dbb7672e98b5c268', 'funding_outnum': 0, 'initial_feerate': '939perkw', 'last_feerate': '939perkw', 'next_feerate': '978perkw', 'inflight': [{'funding_txid': '88f913adf41749a106c97cea7a6f6e448efa73fc6bc9325b78802188d8b0b67d', 'funding_outnum': 1, 'feerate': '939perkw', 'total_funding_msat': 1100000000, 'our_funding_msat': 1000000000, 'splice_amount': 0, 'scratch_txid': '1076f7048d0c1debb7bf2e1d448b3f1345a6973e24dc6a2fadade67ef75133aa'}], 'close_to_addr': 'bcrt1p9r2qj40kfad955p2arkd70lpyh0epugjljrm2djh6483kqffg04q9fufhw', 'close_to': '512028d40955f64f5a5a502ae8ecdf3fe125df90f112fc87b53657d54f1b012943ea', 'private': False, 'opener': 'local', 'alias': {'local': '7654047x8069664x16198', 'remote': '14528636x6434403x24187'}, 'features': ['option_static_remotekey', 'option_anchors'], 'funding': {'local_funds_msat': 1000000000, 'remote_funds_msat': 0, 'pushed_msat': 0, 'psbt': 'cHNidP8BAgQCAAAAAQMEZgAAAAEEAQEBBQECAQYBAwH7BAIAAAAAAQBxAgAAAAE/IGufqbpSEgvYbw685nDEyMxGKL9FlQilR593oz4l8wAAAAAA/f///wLzbOcpAQAAABYAFLikxoEHURUNIRqJZO+hZBpDIRdbgIQeAAAAAAAWABTiR1/vOKdPfmxe7PFjWeVXM/PEamUAAAABAR+AhB4AAAAAABYAFOJHX+84p09+bF7s8WNZ5Vcz88RqAQhrAkcwRAIgffBOLzpOGluuXVQL3+Nh57/v1KiZMmTQ8azbTp1uvq8CIEEJMg/FcFFBRhJEEj7+qSAWJ1zYMoTRkLXnz2kYn1t+ASECAuzPYkKg0uX0lzjSQPmcEN8Qg4GvjKKB1Kggpt1l4X8BDiBsxRVtCsARg7eO1wBCa1Q9QSO1uVsgKM0CdYaTNqNDaQEPBAEAAAABEAT9////DPwJbGlnaHRuaW5nAgIAAQz8CWxpZ2h0bmluZwEItnNGZ/Bz25IAAQMIQEIPAAAAAAABBCIAIAudZByKBPnrEYNlicb4obXo+9D41IAxB52EsOTPC6lrAAEDCAEvDwAAAAAAAQQiUSCfpNJOnaQ8W/j8DZc21ORFI4rNcU0GgRbfUWXQeR26HSEHoyOuZ721tL0aN6eJJY4wZEeSiAU21KuPQRiZUZCCbScJAIgBXIECAAAADPwJbGlnaHRuaW5nAQixrSLGhyK6fAA=', 'withheld': False}, 'to_us_msat': 1000000000, 'min_to_us_msat': 1000000000, 'max_to_us_msat': 1000000000, 'total_msat': 1000000000, 'fee_base_msat': 1, 'fee_proportional_millionths': 10, 'dust_limit_msat': 546000, 'their_max_htlc_value_in_flight_msat': 18446744073709551615, 'our_max_htlc_value_in_flight_msat': 18446744073709551615, 'their_reserve_msat': 10000000, 'our_reserve_msat': 10000000, 'spendable_msat': 978718000, 'receivable_msat': 0, 'minimum_htlc_in_msat': 0, 'minimum_htlc_out_msat': 0, 'maximum_htlc_out_msat': 990000000, 'their_to_self_delay': 5, 'our_to_self_delay': 5, 'max_accepted_htlcs': 483, 'state_changes': [{'timestamp': '2026-04-01T07:52:32.735Z', 'old_state': 'CHANNELD_AWAITING_LOCKIN', 'new_state': 'CHANNELD_NORMAL', 'cause': 'user', 'message': 'Lockin complete'}, {'timestamp': '2026-04-01T07:52:51.053Z', 'old_state': 'CHANNELD_NORMAL', 'new_state': 'CHANNELD_AWAITING_SPLICE', 'cause': 'remote', 'message': 'Splice signatures sent'}], 'status': ['CHANNELD_NORMAL:Channel ready for use.'], 'in_payments_offered': 0, 'in_offered_msat': 0, 'in_payments_fulfilled': 0, 'in_fulfilled_msat': 0, 'out_payments_offered': 0, 'out_offered_msat': 0, 'out_payments_fulfilled': 0, 'out_fulfilled_msat': 0, 'htlcs': []}
2026-04-01T07:56:01.0603053Z
2026-04-01T07:56:01.0607410Z tests/test_splice.py:713: AssertionError
```

We need to wait for this, as l1 and l3 may not have seen block yet.

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
Why it was queued
signing boundaryaccess control
AI analysis · Informational 15/100

This commit fixes a flaky test in Core Lightning's test suite. The test sometimes failed because it checked immediately whether an 'inflight' splice entry had disappeared from a channel, but the nodes l1 and l3 may not have processed the latest block yet. The fix simply waits for that condition instead of asserting it right away. There is no security issue in the production code.

Security candidatecommon: add tal_free_if_taken() helper for common case.by Rusty Russell · 9b85a247 · Mar 29, 2026 · 29 filesMessage 65 · AdequateInformational 15Details
Commit message · Rusty Russell

common: add tal_free_if_taken() helper for common case.

Uses found and changed by Claude.

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
Why it was queued
cryptography-sensitive pathsigning or wallet path
AI analysis · Informational 15/100

This commit is a straightforward code cleanup: it introduces a small helper function called tal_free_if_taken() and replaces many repeated two-line patterns across the codebase with calls to that helper. The behavior of the program is unchanged; no security vulnerability is introduced or fixed.

Security candidatebitcoin: hoist script_with_len out of wallet/ into here.by Rusty Russell · 8f8cab0e · Mar 22, 2026 · 56 filesMessage 95 · StrongInformational 15Details
Commit message · Rusty Russell

bitcoin: hoist script_with_len out of wallet/ into here.

Vital for hashing. But adding script_with_len_hash here breaks
fuzzing build, so that requires a little modification.

I also noticed that `#include <common/randbytes.h>` is redundant in
all the common/ unit tests, so removed it.

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

95/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidencecryptography-sensitive pathsigning or wallet pathparser or protocol path
AI analysis · Informational 15/100

This commit is a routine code cleanup: it moves a small helper structure and its hash/equality functions from the wallet module to the more general Bitcoin module so other code can reuse them. It also updates many test files to provide a stub for a hash-seed function and removes an unused header include. There is no security fix or vulnerability here.