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 changes how the Lightning networking code handles oversized encrypted messages. Previously, certain conditions would cause the program to crash with a panic. Now the code returns errors instead, which is a defensive improvement…
panic-to-error conversion for oversized message encryption/decryptiondenial-of-service hardening against oversized peer messagesdebug_assert retained to preserve test coverage of invariant violations
This commit simply updates the 'repository' web links in 15 package metadata files from GitHub to a self-hosted Forgejo instance. It does not change any program code, build logic, dependencies, or security behavior. There is no security is…
This commit fixes a bug in the Lightning Dev Kit where, after a disconnection, a node could fail to retransmit a 'splice_locked' message to a peer that was still waiting for transaction signatures. Without this retransmission, the two peer…
Protocol state desynchronization between channel peers after reconnectionMissing retransmission of splice_locked for 0-conf splice channelsPotential channel unusability or stuck splice negotiation
This commit fixes a small accounting bug in how the Lightning wallet estimates the size (and therefore transaction fee) of a special Bitcoin transaction that sweeps funds back to the user after a channel closes. The old code always assumed…
debug assertion failure possible in development/testing buildstransaction weight/fee estimate overestimation up to 3 WUconstant replaced with per-descriptor length computation
This commit changes the project's internal code-review workflow. It stops automatically assigning a human reviewer when a pull request is opened; instead, contributors must manually click a button to request a reviewer after first addressi…
This commit fixes a bug in LDK's Lightning channel reconnection logic after a splice (a way to resize a channel's on-chain funds). If one peer had already received the splice signatures but the other had not, and then they disconnected and…
Protocol-state inconsistency on reconnection after splice signature exchangePotential channel stall/force-close due to quiescence not being exited before commitment updateFuzzer-discovered edge case in Lightning splicing retransmission
This commit adds a new option for Lightning invoice creators to explicitly tell payers not to use multi-path payments (MPP) when paying an invoice. It does not change any enforcement rules; it only changes what feature bits are advertised …
New API surface for feature advertisement controlExplicit documentation that the method does not enforce single-HTLC receipt, shifting enforcement responsibility to callersNo removal or weakening of existing validation logic
This commit adjusts the project's continuous integration (CI) test script to pin an older version of a build-time helper crate called `jobserver` when using older Rust compilers. It is a build compatibility fix, not a security patch, and d…
This commit only adds new test code. It exercises how a newer version of LDK exchanges saved channel data with the older LDK 0.2 release when a channel has a pending splice. There is no change to production logic, no bug fix, and no securi…
This commit removes the 'Option' wrapper from several HTLC amount fields, making them required instead of optional. It is a cleanup/refactoring change that simplifies the code by assuming the amount is always known. The commit message fram…
Removal of Option wrapper for financial amount fieldsSerialization format change from optional to required TLV fieldsLoss of backward compatibility with older serialized monitor/channel state
This commit is a code cleanup inside the project's test suite. It replaces a helper function with several hard-to-read positional arguments (like bare `false` and `None`) with a 'builder' pattern that names each option. This makes the test…
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 th…
New BOLT 12 payer proof feature: persists paid invoice across retries/restarts and exposes it in Event::PaymentSentPayer signing key re-derived from invoice payer metadata rather than storing extra key materialAdds end-to-end test for proof creation, verification, and bech32 round-trip
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 …
Refactor only: moves existing key derivation/verification logic into helpers without changing algorithmsAdds new public API `Bolt12Invoice::derive_payer_signing_keys` for payer proof key recoveryNo mention of vulnerability, bug, CVE, security fix, or exploit in commit title/message
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 sched…
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 …
New trampoline forward handling path accumulates MPP parts before rejectingDebug assertion guards first-HTLC failure in MPP mergeTODO comment flags possible MPP inconsistency in next_node_id across trampoline parts
This commit removes a redundant 32-byte shared secret field from an internal data structure used when forwarding trampoline payments in the Lightning Dev Kit. The developers realized the secret was already stored inside each previous hop's…
Removes redundant secret field from in-memory/persisted stateChanges TLV serialization layout for HTLCSource::TrampolineForwardBreaking persistence change acknowledged by commit author
This commit changes the project's automated reviewer-assignment workflow to stop using a long-lived secret token and instead request a short-lived authentication token from the Forgejo CI service. This is a security-hardening improvement: …
Removal of long-lived repository secret from CI workflowAdoption of OIDC-based short-lived token for API authorizationWorkflow runs in pull_request_target context with no code checkout
This commit only adds new fuzz-testing commands to an existing test harness. It lets the fuzzer temporarily block and then re-enable the local node's own signing operations during simulated channel failures. There is no change to productio…
This commit hardens the project's automated build and test scripts by replacing loose version tags like 'actions/checkout@v4' with exact commit hashes served from a specific domain. This prevents a compromised or renamed third-party action…
CI/CD supply-chain hardeningAction reference pinning to immutable commit hashUse of explicit action mirror URL
This commit fixes a logic bug in the Lightning Dev Kit's channel splicing code. Previously, the code wrongly assumed that no unrelated monitor update could be pending when a splice `tx_signatures` message arrived while the channel was quie…
Assertion relaxation in state-machine handling of splice `tx_signatures`Race condition between unrelated HTLC preimage monitor update and splice signature exchangePotential panic or protocol stall due to overly strict debug assertion
Validate HTTPS scheme in LSPS5 URL Readable deserialization
The `Readable` implementations for `LSPSUrl` and `LSPS5WebhookUrl` were bypassing URL validation, allowing non-HTTPS URLs (e.g., http://, ftp://) to be deserialized from the wire protocol without rejection. Only the serde `Deserialize` and `new()`/`parse()` paths were correctly validating the HTTPS scheme.
Route `LSPSUrl::Readable` through `LSPSUrl::parse()` and add a length check to `LSPS5WebhookUrl::Readable` so that wire-deserialized URLs receive the same validation as JSON-deserialized ones.
Fixes #4559
Reported-by: Thomas Kilbride of Block Security Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
98/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
! Very short subject! Too few words to establish purpose! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedFetch blocks from source in parallel during initial syncby Matt Corallo · 0f130eee · Mar 30, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Matt Corallo
Fetch blocks from source in parallel during initial sync
In `init::synchronize_listeners` we may end up spending a decent chunk of our time just fetching block data. Here we parallelize that step across up to 36 blocks at a time.
On my node with bitcoind on localhost, the impact of this is somewhat muted by block deserialization being the bulk of the work, however a networked bitcoind would likely change that. Even still, fetching a batch of 36 blocks in parallel happens on my node in ~615 ms vs ~815ms in serial.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
AI review queuedPass a `BestBlock` to `init::synchronize_listeners`by Matt Corallo · 2664d599 · Mar 30, 2026 · 4 filesMessage 85 · StrongTriage 0Details
Commit message · Matt Corallo
Pass a `BestBlock` to `init::synchronize_listeners`
On restart, LDK expects the chain to be replayed starting from where it was when objects were last serialized. This is fine in the normal case, but if there was a reorg and the node which we were syncing from either resynced or was changed, the last block that we were synced as of might no longer be available. As a result, it becomes impossible to figure out where the fork point is, and thus to replay the chain.
Luckily, changing the block source during a reorg isn't exactly common, but we shouldn't end up with a bricked node.
To address this, `lightning-block-sync` allows the user to pass in `Cache` which can be used to cache recent blocks and thus allow for reorg handling in this case. However, serialization for, and a reasonable default implementation of a `Cache` was never built.
Instead, here, we start taking a different approach. To avoid developers having to persist yet another object, we move `BestBlock` to storing some number of recent block hashes. This allows us to find the fork point with just the serialized state.
In a previous commit, we moved deserialization of various structs to return the `BestBlock` rather than a `BlockHash`. Here we move to actually using it, taking a `BestBlock` in place of `BlockHash` to `init::synchronize_listeners` and walking the `previous_blocks` list to find the fork point rather than relying on the `Cache`.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
second-pass: broader security terminology
AI review queuedConsolidate all the pub aync utils to `native_async`by Matt Corallo · 112f2c52 · Mar 30, 2026 · 12 filesMessage 50 · ThinTriage 12Details
Commit message · Matt Corallo
Consolidate all the pub aync utils to `native_async`
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedCreate better helper functions in `tx_builder`by Leo Nash · 670e5f81 · Mar 26, 2026 · 1 fileMessage 45 · ThinTriage 12Details
Commit message · Leo Nash
Create better helper functions in `tx_builder`
Reduce line count and indentation
45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedShakedown zero reserve channelsby Leo Nash · d6fc690d · Mar 26, 2026 · 1 fileMessage 35 · OpaqueTriage 0Details
Commit message · Leo Nash
Shakedown zero reserve channels
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedMerge rbf_channel into splice_channel and expose prior contributionby Jeffrey Czyz · a052afa9 · Mar 25, 2026 · 7 filesMessage 85 · StrongTriage 0Details
Commit message · Jeffrey Czyz
Merge rbf_channel into splice_channel and expose prior contribution
Users previously had to choose between splice_channel (fresh splice) and rbf_channel (fee bump) upfront. Since splice_channel already detects pending splices and computes the minimum RBF feerate, rbf_channel was redundant. Merging into a single API lets the user call one method and discover from the returned FundingTemplate whether an RBF is possible.
The FundingTemplate now carries the user's prior contribution from the previous splice negotiation when one is available. This lets users reuse their existing contribution for an RBF without performing new coin selection. A PriorContribution enum distinguishes whether the contribution has been adjusted to the minimum RBF feerate (Adjusted) or could not be adjusted due to insufficient fee buffer or max_feerate constraints (Unadjusted).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
signing or wallet pathmerge-commit duplicate discountsecond-pass: security-sensitive path
AI review queuedSkip mixed-mode assertion for replayed monitor updatesby Joost Jager · 88f99de0 · Mar 23, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Joost Jager
Skip mixed-mode assertion for replayed monitor updates
When a node restarts and switches from async to sync persistence, the in-flight monitor updates from the previous session are replayed as background events. These replayed updates are resubmitted to the Watch which now returns Completed, while earlier in-flight updates are still queued as background events. This triggered a false panic in the assertion that guards against out-of-order monitor update completion.
Track whether an update is a replay (already present in in_flight_monitor_updates) and skip the assertion for replays, since the remaining in-flight updates will be submitted by subsequent background events.
AI tools were used in preparing this commit.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
AI review queuedAdd .cargo/config.toml for fuzz cfg flagsby Joost Jager · 43cf3800 · Mar 23, 2026 · 4 filesMessage 90 · StrongTriage 5Details
Commit message · Joost Jager
Add .cargo/config.toml for fuzz cfg flags
Set fuzzing, secp256k1_fuzz, and hashes_fuzz cfg flags in fuzz/.cargo/config.toml so they are automatically applied to plain cargo commands (cargo test, cargo run) run from the fuzz directory. Remove the now-redundant RUSTFLAGS from the README crash reproduction examples, the CI cargo test step, and generate_fuzz_coverage.sh.
The honggfuzz and cargo-fuzz docs are unchanged because those tools build their own RUSTFLAGS env var (which overrides config.toml) and require the flags to be exported separately.
AI tools were used in preparing this commit.
90/100 · StrongMessage clarity
✓ 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 evidencesecond-pass: broader security terminology
AI review queuedDrop unused `LSPS1OnchainPayment` typeby Elias Rohrer · 029ad804 · Mar 18, 2026 · 1 fileMessage 35 · OpaqueTriage 0Details
Commit message · Elias Rohrer
Drop unused `LSPS1OnchainPayment` type
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedFix clippy lintsby Elias Rohrer · ed9a8672 · Mar 18, 2026 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Elias Rohrer
Fix clippy lints
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedDrop `OutboundCRChannel`by Elias Rohrer · 9cc5257e · Mar 18, 2026 · 1 fileMessage 33 · OpaqueTriage 0Details
Commit message · Elias Rohrer
Drop `OutboundCRChannel`
The `OutboundChannel` construct simply wrapped `ChannelOrder` which we can now simply use directly.
33/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Provides an explanatory body! Too few words to establish purpose
Why it was queued
second-pass: opaque commit message
AI review queuedRemove TaprootChannelSignerby Wilmer Paulino · 747788b8 · Mar 12, 2026 · 11 filesMessage 40 · ThinTriage 12Details
Commit message · Wilmer Paulino
Remove TaprootChannelSigner
We plan to have a single channel signer type going forward, so this is unnecessary.
40/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides an explanatory body! Too few words to establish purpose
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedRustfmt reorg_tests.rsby Wilmer Paulino · 102bcd63 · Mar 12, 2026 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Wilmer Paulino
Rustfmt reorg_tests.rs
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedTell claude to be DRYby Matt Corallo · 95488160 · Mar 10, 2026 · 1 fileMessage 38 · OpaqueTriage 0Details
Commit message · Matt Corallo
Tell claude to be DRY
38/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component! No meaningful explanatory body
AI review queuedReject offer_amount of 0 as invalid per BOLT 12by Vincenzo Palazzo · a06c4469 · Mar 9, 2026 · 2 filesMessage 76 · AdequateTriage 0Details
Commit message · Vincenzo Palazzo
Reject offer_amount of 0 as invalid per BOLT 12
Per the spec clarification in https://github.com/lightning/bolts/pull/1316: - Writers MUST set offer_amount greater than zero when present - Readers MUST NOT respond to offers where offer_amount is zero
Reject amount_msats(0) in the builder with InvalidAmount, and reject parsed offers with amount=0 (with or without currency) during TLV deserialization.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
76/100 · AdequateMessage clarity
✓ 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 review queuedCheck that funder covers the fee spike buffer multiple after a spliceby Leo Nash · f784731e · Feb 25, 2026 · 5 filesMessage 73 · AdequateTriage 12Details
Commit message · Leo Nash
Check that funder covers the fee spike buffer multiple after a splice
We do this for HTLCs, so we should also do this for splices. This only applies to channels with non-zero-fee HTLC transactions.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedCleanup unused codeby Elias Rohrer · 9a64a659 · Feb 25, 2026 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Elias Rohrer
Cleanup unused code
.. for which we got warnings
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedLet callers handle errors on `get_available_balances_for_scope`by Leo Nash · 69b6b265 · Feb 24, 2026 · 3 filesMessage 85 · StrongTriage 0Details
Commit message · Leo Nash
Let callers handle errors on `get_available_balances_for_scope`
`get_available_balances_for_scope` only errors if some party in the channel cannot afford the HTLCs outbound from said party, and the anchors and transaction fee if they are the funder. We do not account for the channel reserve here, so this error should be exceedingly rare, but could nonetheless happen due to concurrent updates on the channel's state. The upcoming zero-reserve channel type could also make this case more reachable.
`send_htlc` maps such an error to its own error type since it proposes an update to the channel's state. The other callers only read the channel's state, so it would not be a good fit to have them return an error too. Hence, we choose to let these callers panic in debug mode, and return saturated values in release mode.
Note that we now handle the if-we-removed-it-already-but-haven't -fully-resolved-they-can-still-send-an-inbound-HTLC case, as `LocalRemoved` HTLCs are considered resolved when calculating `AvailableBalances`. We update the documentation accordingly.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
second-pass: broader security terminology
AI review queuedReturn `AvailableBalances` in `get_channel_stats`by Leo Nash · 5f44a098 · Feb 24, 2026 · 2 filesMessage 58 · ThinTriage 12Details
Commit message · Leo Nash
Return `AvailableBalances` in `get_channel_stats`
Note that `AvailableBalances` will always refer to the holder's balances, even when `local` is set to `false`, when calling `TxBuilder::get_channel_stats`.