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.
Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.
This commit rewrites how a Lightning wallet talks to Esplora block-explorer servers so that many status checks happen in parallel instead of one at a time. It is a performance/refactoring change. There is no direct evidence in the commit t…
Concurrency/timing change in transaction confirmation logicNew inconsistency check preserved when a previously-confirmed tx is reported unconfirmedAdded defensive error path for missing pre-fetched block status
This change stops the Electrum-based transaction sync client from downloading the very transaction that created an output it is watching. Previously, the client could request that transaction from Electrum, even though a transaction can ne…
Avoids unnecessary Electrum transaction.get requests for watched outputsReduces information disclosure to Electrum server about watched outpointsAdds regression test verifying request suppression
This change improves how the Lightning Dev Kit's Electrum and Esplora transaction-sync clients track watched Bitcoin transactions. Previously, the code ignored the script pubkey (the 'address' associated with a transaction) supplied when r…
Previously ignored `script_pubkey` argument in `register_tx` for transaction watchersElectrum script-history queries previously used an arbitrary transaction output, which could be OP_RETURN and therefore unindexed by some Electrum serversNew logic prefers caller-supplied script pubkey and falls back to non-OP_RETURN outputs
This commit changes how LDK stores pending event notifications. It adds serialization support for several event types that previously were not fully saved to disk, and introduces a helper method so the code can decide which events are wort…
Data-loss prevention: previously non-round-trippable event variants are now fully serialized, avoiding accidental event loss when users serialize Event queues themselvesState-consistency hardening: ChannelManager now explicitly skips events that describe non-surviving restart state, preventing replay of stale eventsDefensive assertion: debug builds assert that every persisted event round-trips to Some(event), catching serialization mismatches
This commit only adds documentation comments to two source files. It explains that certain funding-signing events can become stale if the underlying negotiation fails, and that callers may see specific harmless errors as a result. No code …
This commit removes a fixed-version pin for the honggfuzz fuzzing tool in a continuous-integration script. The project now uses the current release of honggfuzz instead of an older pinned version. There is no change to the actual Lightning…
This commit changes the Rust toolchain used in the continuous integration (CI) fuzzing job from a fixed older version (1.75) to the latest stable release. It is purely a build/test infrastructure change to fix a dependency compatibility is…
This commit makes a previously internal helper function public so that outside developers can build dummy-hop tails for blinded payment paths without recreating the logic themselves. It is an API usability change, not a fix for a known sec…
No security-relevant behavior change in the diffAPI visibility broadened from crate-public to publicCLTV expiry overflow check already present and unchanged
This change adds a safety check in a Bitcoin Lightning Network library (LDK). Previously, if the software tried to verify a peer's commitment signature before it had learned the peer's channel parameters, it could crash with a panic. Now i…
Defensive check added on peer-driven code path to prevent panicMissing counterparty_parameters could previously cause panic during commitment transaction constructionChannel closure returned instead of panic
This commit only changes the wording of an error message sent to peers when a commitment transaction fails validation. It replaces the vague phrase 'Failed to validate our commitment' with the clearer 'Received commitment failed validation…
This commit moves the checks that validate a counterparty's signatures on the holder's commitment and HTLC transactions out of the general channel code and into the signer module (InMemorySigner). Previously, these signature checks were do…
Moved signature validation from channel state machine into signer moduleAdded new tests that corrupt signatures and verify rejectionChanged error message from 'Invalid commitment tx signature from peer' / 'Invalid funding_created signature from peer' to 'Failed to validate our commitment'
This change fixes a Lightning channel splicing bug: when two peers temporarily disconnect during a splice, any half-finished signature the other side already sent is now discarded. Before the fix, that stale signature could be reused after…
State-invalidation bug in multi-step protocol (splice negotiation)Stale cryptographic signature not cleared on disconnectPotential reuse of old commitment state after reconnect
This fix prevents a Lightning channel from being accidentally force-closed. During a splice (a way to resize a payment channel), one side's initial signature could be kept in memory after the peers disconnected. If the peers later reconnec…
State inconsistency: in-memory buffered message not cleared on disconnectDuplicate message processing after reconnectionForce-close consequence for active Lightning channel
This commit is a simple rename of a public function from `matches_invoice_signing_pubkey` to `key_can_sign_invoice`, plus matching updates to its documentation, callers, tests, and changelog. No behavior changed. It is not a security fix.
This commit is a simple rename of a function and its documentation from matches_invoice_signing_pubkey to key_can_sign_invoice. No logic, behavior, or security properties changed. It is a follow-up code-review naming cleanup.
This commit adds a new public helper method, Offer::matches_invoice_signed_by (later renamed matches_invoice_signing_pubkey), that lets callers check whether an invoice signing key belongs to the recipient named by a BOLT 12 offer. It also…
Refactors existing BOLT 12 invoice-signing-pubkey validation into a reusable helperAdds public API to bind an invoice signing key to an offer recipientAdds unit tests for issuer-id vs. path-last-hop matching behavior
This commit is a feature enhancement for LDK's internal serialization macros. It allows developers to mark old protocol fields as 'retired' (reserved but no longer used) in more places, so those type numbers cannot be accidentally reused. …
TLV type-number reservation mechanism extended to more macro-generated code pathsPrevents accidental reuse of retired protocol field type numbersAvoids UnknownRequiredFeature decode failures for obsolete even-type fields
This commit is a test-only cleanup in the Lightning Dev Kit (LDK) Rust codebase. It removes low-level byte-level tests for splice failure events and replaces them with a single cross-version test that actually loads a 0.2 node with seriali…
Cross-version serialization compatibility test addedRemoval of byte-level tests that could not detect real 0.2 mismatchesNo production code changes
This commit only adds a code comment explaining an existing quirk: if a revoked old channel transaction contains two identical-looking payment forwards and the other side claims both, the software may only claim one upstream while letting …
Behavioral quirk in revoked-commitment HTLC resolution documentedDuplicate (payment_hash, amount) HTLCs can map to the same upstream sourcePotential missed upstream preimage claim on second identical HTLC
This commit fixes a state-handling bug in Lightning Dev Kit's splicing feature. When a user tries to speed up or replace a pending splice (an 'RBF' attempt) and the older splice transaction unexpectedly gets confirmed on-chain, the softwar…
State-conflict handling between confirmed splice candidate and active RBF negotiationStructured abort propagation through chain-event pathConditional abort based on holder signature progress to avoid unsafe cancellation
Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.
Lower-priorityFilter stale closed hop sends in chanmon fuzzby Joost Jager · 53b399c4 · Jul 7, 2026 · 1 fileMessage 78 · AdequateInformational 15Details
Commit message · Joost Jager
Filter stale closed hop sends in chanmon fuzz
Hop sends can route over an open SCID while LDK's non-strict forwarding still selects a parallel channel that the harness has already tracked closed but a node still lists. Skip those API sends until the stale listing clears, while keeping the existing open-id checks for fully dropped closed channels.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100
This change only modifies a fuzzing test harness, not the production Lightning Dev Kit code. It adds a filter so that simulated multi-hop payments skip test scenarios where the harness's view of a closed channel is temporarily out of sync with a node's own channel list. This prevents the fuzzer from generating misleading test cases where a payment appears to stall because the test state is inconsistent. It does not fix a vulnerability in real LDK software and cannot be exploited by users or attackers.
When stale message events are delivered after a channel close, the recipient can respond with the expected STFU warning instead of the control error path. Treat that warning as expected for channels the harness already tracks closed, while documenting that stale events should still be delivered so handlers exercise their normal error paths.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100
This commit changes only a fuzzing test harness (a tool that randomly exercises code to find bugs). It teaches the test harness to accept a specific warning message as expected when a test delivers an outdated 'STFU' message after a channel is already closed. It does not change the actual Lightning protocol handling code, so it cannot directly affect real users or funds.
ln: persist the paid BOLT 12 invoice and build payer proofs
Carry the paid `Bolt12Invoice` through the outbound payment so it survives restarts, and surface it as a `PaidBolt12Invoice` on `Event::PaymentSent` so the payer can build a payer proof. The payer signing key is re-derived from the invoice's own payer metadata, so no extra key material is stored.
`PaidBolt12Invoice` now lives in `offers::payer_proof`; existing async payment tests and a test helper are updated to construct it via the new API. Adds an end-to-end test that pays a BOLT 12 offer and builds + verifies a payer proof from the resulting `Event::PaymentSent`.
Co-Authored-By: Claude Opus 4.8 (1M context) <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
signing boundary
AI analysis · Low 25/100
This commit is a feature addition, not a vulnerability fix. It extends rust-lightning's BOLT 12 payment support so that when a wallet pays a BOLT 12 invoice, the paid invoice is saved through retries and restarts and is later exposed in the PaymentSent event as a PaidBolt12Invoice. The wallet can then use that object to build a cryptographic 'payer proof' that selectively discloses invoice fields to prove to a third party that it paid. The payer signing key is re-derived from data already in the invoice, so no extra secret key storage is needed. There is no indication in the commit that this fixes a security bug; it is new functionality with tests.
Throw arbitrary bytes at `PayerProof::try_from` to exercise the merkle-root reconstruction and the deserialization path together.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidencesecond-pass: broader security terminology
AI analysis · Informational 15/100
This commit only adds a new fuzz test target. Fuzz tests are automated tools that throw random or crafted input at a piece of code to look for crashes or bugs. The commit does not change any production code, protocol behavior, or user-facing functionality, so it does not introduce or fix a security issue by itself.
Move the invoice/refund payer key derivation logic into reusable helpers so payer proofs can derive the same signing keys without duplicating the metadata and signer flow.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
secret or key materialsigning boundarysigning or wallet path
AI analysis · Informational 17/100
This commit is a code cleanup (refactor) in the Lightning Dev Kit library. It moves existing payer key-derivation logic into shared helper functions so that future 'payer proof' features can reuse the same code. The change does not appear to fix a security bug; it reorganizes existing logic and adds a new public method to re-derive a payer's signing keys from invoice data. No vulnerability or exploit is described in the commit itself.
Extend the BOLT 12 merkle module with selective-disclosure support: build the full merkle tree from a TLV stream, compute the omitted-TLV markers and the minimal set of missing hashes for omitted subtrees, and reconstruct the merkle root from a partial disclosure. These are the primitives a payer proof is built on.
Co-Authored-By: Rusty Russell <rusty@rustcorp.com.au> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 25/100
This commit adds new code to support BOLT 12 "selective disclosure" payer proofs in the Lightning Dev Kit. It lets someone prove they have a valid signed invoice without revealing every field. The change is a feature addition, not a fix for a known bug, and the commit message and diff do not describe any security vulnerability. However, cryptographic merkle-tree code like this is security-critical because any mistake in how hashes are combined or how omitted fields are reconstructed could let an attacker forge a proof or hide data. The patch includes tests and validation, but because it is brand-new, complex code, it deserves careful review.
Add the `payer_proof` module: `PayerProof`/`UnsignedPayerProof`, the `PayerProofBuilder` (with selective disclosure and a derived-key path), bech32 `lnp` encoding, and parse-time verification, implementing the payer proof extension to BOLT 12 (https://github.com/lightning/bolts/pull/1295). Also exposes the offer/invoice TLV-type constants and an invoice-bytes accessor used to build proofs, and a `Sha256` `Writeable`/`Readable` impl for the proof hashes.
Co-Authored-By: Rusty Russell <rusty@rustcorp.com.au> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: OpenAI Codex <codex@openai.com>
86/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
defensive validation
AI analysis · Low 32/100
This commit adds a new feature to rust-lightning called BOLT 12 payer proofs. It lets someone who paid a BOLT 12 invoice cryptographically prove they paid it, while optionally hiding some invoice details. The change is a large new module plus small supporting changes in invoice, offer, nonce, and serialization code. There is no indication this is a security patch or fixes a vulnerability; it is a new protocol feature implementation with extensive tests and spec test vectors.
Security candidateUpload new fuzz corpus entries as a short-lived CI artifactby Matt Corallo · b9f55b6c · Jul 5, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · Matt Corallo
Upload new fuzz corpus entries as a short-lived CI artifact
Fork-PR runs get no credentials from Forgejo — neither secrets nor authorized-integration identity tokens — so the fuzz job cannot push new corpus entries to the corpus repo from CI. Instead, clone the corpus from this Forgejo instance (rather than the GitHub copy, so new entries are detected against the repo they will land in), stage the new entries plus any SIG* crashes like the GitHub workflow does, and upload them as an `hfuzz-corpus` artifact with a two-day retention. The ldk-fuzzing-corpus repo's nightly job sweeps these artifacts into a corpus pull request and deletes them once processed.
Unlike the GitHub workflow's version, the crash-staging loop here uses the `rust-lightning/<target>` prefix the corpus entries are actually staged under (upstream checks the wrong path, so no crash file is ever picked up there), and it stages crashes for targets that produced no new corpus entries rather than only creating the target directory as a side effect of staging corpus files.
Co-Authored-By: Claude Fable 5 <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 evidencecredential or privilege state
AI analysis · Informational 15/100
This commit changes a CI workflow for the rust-lightning project. It stops trying to push new fuzz test inputs directly to a corpus repository from automated test runs, and instead uploads them as a temporary artifact that a separate scheduled job later collects. This is a workflow reliability and credential-handling improvement, not a security fix or vulnerability.
Add upgrade test for legacy post-close monitor update persistence
60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 17/100
This commit only adds a new regression test. It does not change any production code. The test verifies that modern LDK can still read and write very old (pre-0.1) channel monitor update records that used a special sentinel value (u64::MAX) for updates after a channel was closed. There is no vulnerability being fixed here; it is defensive test coverage for an already-handled legacy data format.
AI review queuedci: don't double-assign reviewers, support manual assignment runsby Matt Corallo · 24651a1a · Jul 3, 2026 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · Matt Corallo
ci: don't double-assign reviewers, support manual assignment runs
The assign-reviewer workflow blindly picked a random reviewer every time it ran, so a re-run (or any future non-opened trigger) could request review from a second person even when someone was already on the PR. Teach it to inspect the PR state first:
* Anyone already requested as a reviewer or who has submitted a review is never picked. The author self-reviewing (commenting on their own PR) doesn't count. * On automatic runs (including re-runs), skip assignment entirely if anyone from the REVIEWERS pool has already reviewed or been requested; reviews from people outside the pool are ignored.
Also add a workflow_dispatch trigger taking a PR number so a reviewer can be assigned manually. Manual runs skip the "someone is already on it" check and always add a new (not-yet-involved) reviewer if an eligible candidate remains.
This should let us fully emulate the old bot's second-reviewer assignment logic fully via the action. A first reviewer can go hunt in the actions page and trigger a second assignment (but we'll add a UI element in the PR page above merge to trigger this in a nice UI).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
90/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100
This is a routine update to the project's automated reviewer-assignment workflow. It prevents the bot from accidentally adding a second random reviewer when one is already assigned, and adds a manual trigger so maintainers can request an additional reviewer on demand. There is no security-relevant change here.
AI review queuedFix assign-reviewer's auth by setting the authorized integration audienceby Matt Corallo · 055d334d · Jul 3, 2026 · 1 fileMessage 55 · ThinInformational 18Details
Commit message · Matt Corallo
Fix assign-reviewer's auth by setting the authorized integration audience
55/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Names security-relevant behavior explicitly! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 18/100
This is a one-line fix to a Forgejo workflow that assigns reviewers. The workflow requests a temporary identity token from the CI system so it can call another service. The change adds an explicit audience parameter to that token request, ensuring the token is only valid for the intended recipient. Without this, the token might be accepted by a broader set of services or rejected by the intended one, depending on how the CI and target service are configured. It is a hardening/configuration fix rather than a user-facing vulnerability in the Lightning library itself.
Extract the all-node broadcaster drain into a helper and use it from the finish-time mempool cleanup loop. This leaves relay behavior unchanged while giving cleanup paths a shared relay primitive.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100
This is a minor code cleanup inside a fuzzing test harness. It extracts a small loop that collects broadcast transactions from all simulated nodes into a new helper function, then calls that helper from an existing cleanup loop. The actual behavior is unchanged; only duplicated code is removed.
Lower-priorityfuzz: sync reloaded monitors from their own best blockby Joost Jager · 3d9a10d2 · Jul 3, 2026 · 1 fileMessage 83 · StrongLow 26Details
Commit message · Joost Jager
fuzz: sync reloaded monitors from their own best block
A node's channel monitors can be persisted at different heights, so on reload they are not all at the same chain tip. Driving them to the tip through the shared ChainMonitor from the oldest monitor's height replays blocks that monitors already ahead have seen, which they interpret as a reorg. That reorg discards force-close claims registered at a later height, leaving the closed channel with no transaction to broadcast.
Sync each monitor to the tip from its own best block instead, and sync the manager separately, matching LDK's per-listener startup contract.
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 evidence
AI analysis · Low 26/100
This commit fixes a bug in LDK's internal fuzz testing harness (not production code). When the test reloaded saved channel data, it incorrectly synchronized all channel monitors from the oldest monitor's block height. Monitors that were already ahead got blocks replayed, which they interpreted as a blockchain reorganization. That fake reorg could discard already-registered force-close transactions, leaving a closed channel with nothing to broadcast. The fix makes each monitor catch up from its own saved height, matching how LDK expects real callers to do startup sync.
Route BumpTransaction events through the wallet-backed handler and drain raw ChainMonitor events during normal event processing. This matches the background processor path and lets anchor commitments and claim transactions enter the harness mempool from fuzz opcodes as well as final cleanup.
During settle_all, alternate event processing, relay, and mining until tracked force-closed channels no longer report claimable balances. The bounded loop catches stuck on-chain cleanup instead of leaving broadcasts or claims unresolved.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 14/100
This commit changes only a fuzzing test harness (chanmon_consistency.rs). It improves how simulated force-closed channels are settled on the fake blockchain during fuzz tests, so the test can catch stuck cleanup states. There is no change to production code, no user-facing behavior change, and no indication of a real-world security vulnerability being fixed.
ln/test: add tests for mpp accumulation of trampoline forwards
60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 13/100
This commit only adds new unit tests for an existing trampoline forwarding feature in a Lightning network implementation. It does not change production behavior, fix a bug, or alter security logic. The tests exercise validation rules that already exist in the code, such as checking fees, timeouts, and payment secrets for multi-part trampoline payments.
✓ Descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 15/100
This commit only adds new test code for multi-path trampoline payments in the Lightning Dev Kit. It does not change any production logic, so it cannot introduce a security vulnerability on its own.
ln/tests: return BlindedPaymentPath from trampoline helper
Now that PaymentParameters are required, surface path along with blinded tail for use in tests.
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 is a test-only refactor. It changes a helper function used in Lightning Dev Kit's internal tests so that it returns both a blinded payment tail and the full blinded payment path. This lets tests register the path in payment parameters, matching a recent requirement in the codebase. There is no change to production code, user-facing behavior, or security-sensitive logic.
Lower-priorityln: process added trampoline htlcs with CLTV validation in testsby Carla Kirk-Cohen · 4329fe92 · Jul 2, 2026 · 2 filesMessage 95 · StrongInformational 23Details
Commit message · Carla Kirk-Cohen
ln: process added trampoline htlcs with CLTV validation in tests
We can't perform proper validation because we don't know the outgoing channel id until we forward the HTLC, so we just perform a basic CLTV check.
We don't yet have proper handling of trampoline forwards on restart, so we only enable this in our tests.
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
AI analysis · Informational 23/100
This commit changes how the Lightning node handles a special kind of forwarded payment called a 'trampoline' payment. Previously, trampoline forwards were always rejected. Now, in test builds only, the code allows them through after checking basic fee and timeout (CLTV) rules. The commit also removes one test that expected trampoline forwards to be rejected. This is a development/testing change, not a fix for an active security flaw, and production behavior still rejects these forwards.
ln: handle DecodedOnionFailure for local trampoline failures
While proper error handling will be added in a followup, we add the bare minimum required here for testing.
Note that we intentionally keep the behavior of not setting `payment_failed_permanently` for local failures because we can possibly retry it because we're the sender as a trampoline forwarder.
For example, a local ChannelClosed error is considered to be permanent, but we can still retry along another channel.
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
AI analysis · Low 26/100
This commit fixes a code path in the Lightning Dev Kit where a specific kind of local payment failure (called a 'TrampolineForward' failure) was not being handled. Previously, the code only expected failures from regular outbound routes and would panic with 'unreachable!' if a trampoline forward failure occurred. The change adds handling for that case, returning a decoded failure with no specific short channel ID. It is described by the author as a minimal fix for testing, with fuller error handling planned later.
ln: double encrypt errors received from downstream failures
If we're a trampoline node and received an error from downstream that we can't fully decrypt, we want to double-wrap it for the original sender. Previously not implemented because we'd only focused on receives, where there's no possibility of a downstream error.
While proper error handling will be added in a followup, we add the bare minimum required here for testing.
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
AI analysis · Low 34/100
This commit adds missing encryption wrapping for error messages in the Lightning Dev Kit when acting as a 'trampoline' forwarding node. Previously, if a downstream node returned an error that the trampoline could not fully decrypt, the error would not be properly re-wrapped for the original sender. The change ensures the error is encrypted with both the trampoline's own shared secret and the incoming shared secret, so it can travel back to the payer correctly. The commit message explicitly says this is the 'bare minimum' and that proper error handling will follow later.
ln: add trampoline mpp accumulation with rejection on completion
Add our MPP accumulation logic for trampoline payments, but reject them when they fully arrive. This allows us to test parts of our trampoline flow without fully implementing outbound dispatch.
This commit keeps the same first_claimable_htlc debug_assert behavior as MPP claims, asserting that we do not fail our check_claimable_incoming_htlc merge for the first HTLC that we add to a set. This assert can only be hit if our first part exceeds the `MAX_VALUE_MSAT`, which should not be hit because we check individual amounts elsewhere in the codebase (the check exists to check that multiple parts combined don't hit this overflow).
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✓ Names security-relevant behavior explicitly
Why it was queued
memory safety
AI analysis · Low 25/100
This commit adds partial support in the Lightning Dev Kit node software for receiving and temporarily holding multi-part trampoline payments, then deliberately rejects them once all parts arrive because full outbound forwarding is not yet implemented. It is a development/testing step for the trampoline routing feature, not a finished payment path. The code includes safety checks and debug assertions to catch inconsistent payment data, and it explicitly fails unsupported forwards rather than silently mishandling them.
Make SpliceFundingFailed::contribution non-optional
`SpliceFundingFailed` is only constructed from a concrete `FundingContribution`, so store it directly. `Event::SpliceNegotiationFailed::contribution` still needs to be optional as it could be read from a prior version that did not store contribution data.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 13/100
This commit is a small internal cleanup in the Lightning Dev Kit code. It removes an unnecessary 'Option' wrapper from a data field called `contribution` inside `SpliceFundingFailed`, because that field is always created from a real value. The public `Event::SpliceNegotiationFailed::contribution` field remains optional for backward compatibility with older stored data. There is no security fix here.
Lower-priorityCheck channel is live while handling counterparty tx_init_rbfby Wilmer Paulino · 43c0fc71 · Jul 2, 2026 · 1 fileMessage 73 · AdequateLow 44Details
Commit message · Wilmer Paulino
Check channel is live while handling counterparty tx_init_rbf
This mirrors what we do for counterparty `splice_init` messages, making sure we don't accept RBFs once a channel has requested shutdown.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 44/100
This commit adds a safety check in the Lightning Dev Kit's code that handles a message called tx_init_rbf, which is used to propose bumping the fee on a channel's on-chain transaction. Before this change, the code did not verify that the channel was still 'live' (active and not shutting down). The fix rejects RBF requests once a channel has requested shutdown, matching an existing safeguard already in place for splice_init messages. The change prevents a counterparty from initiating fee-bump negotiations after shutdown has begun, which could otherwise lead to protocol confusion or inconsistent channel state.
Prefer tx_abort over disconnection for splice negotiation errors
We keep some `WarnAndDisconnect` cases as mandated by the spec, but otherwise prefer sending `tx_abort` to terminate quiescence and avoid reconnection loops.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Low 37/100
This commit changes how the Lightning Dev Kit node responds to mistakes or disagreements during splicing (a way to resize a payment channel). Instead of immediately disconnecting from the peer in many cases, it now sends a 'tx_abort' message. This keeps the connection alive, avoids endless reconnect-and-fail loops, and makes the process more robust. It is a protocol-robustness improvement rather than a fix for a critical vulnerability.
Lower-priorityPrefer tx_abort over disconnection for inability to RBFby Wilmer Paulino · ff3d3886 · Jul 2, 2026 · 3 filesMessage 65 · AdequateLow 37Details
Commit message · Wilmer Paulino
Prefer tx_abort over disconnection for inability to RBF
Send `tx_abort` to terminate quiescence and avoid reconnection loops.
65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Low 37/100
This change makes a Lightning node send a 'tx_abort' message instead of disconnecting from a peer when an RBF (fee-bump) request cannot be honored during a splice. The goal is to avoid unnecessary reconnections and keep the channel usable. It is a protocol-robustness improvement rather than a fix for a critical vulnerability.