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 only updates documentation comments for a Rust function called get_per_commitment_point. It removes an outdated warning that the method was non-asynchronous and that returning an error could cause a crash, and replaces it with …
Documentation-only changeRemoves outdated panic warningAdds retry/unblock guidance for signer errors
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 swaps the ID number used by an automated workflow that randomly assigns code reviewers. The old number pointed to a real person's account, so the workflow's assignments appeared to come from that person. The new number points t…
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 updates a dependency used to talk to Esplora blockchain servers from version 0.12 to 0.13, switching the underlying HTTP library from reqwest to bitreq. It also removes two CI workarounds that pinned older versions of idna_adap…
Dependency version bump (esplora-client 0.12 -> 0.13)HTTP backend switch (reqwest -> bitreq) in a transitive dependencyRemoval of MSRV pins for idna_adapter and hyper-rustls
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 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 a…
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, …
OIDC token audience now explicitly scopedCI workflow authentication hardeningNo change to application code or cryptographic logic
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
Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.
AI review queuedEnforce that `ChanelSigner::pubkeys` is only called onceby Matt Corallo · 491b6949 · Oct 27, 2025 · 1 fileMessage 83 · StrongTriage 12Details
Commit message · Matt Corallo
Enforce that `ChanelSigner::pubkeys` is only called once
In the previous commit we partially reverted 9d291e01f98417c2f6b2d4321bbf806464c424a6 renaming `ChannelSigner::new_pubkeys` to `pubkeys` again, but we still don't want to go back to requiring that `pubkeys` return the same contents on each call. Thus, here, we add test logic to check that `pubkeys` isn't called more than once.
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 or wallet pathsecond-pass: security-sensitive path
AI review queuedAdd `rust-version` to all crates' `Cargo.toml`sby Elias Rohrer · 165a6b3a · Oct 22, 2025 · 14 filesMessage 45 · ThinTriage 12Details
Commit message · Elias Rohrer
Add `rust-version` to all crates' `Cargo.toml`s
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 queuedDrop `AddSigned` traitby Elias Rohrer · 2f868720 · Oct 22, 2025 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Elias Rohrer
Drop `AddSigned` trait
.. now that we can, addressing a TODO.
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedDrop unused fields from `lightning-transaction-sync` test utilsby Elias Rohrer · 1d11f2d4 · Oct 22, 2025 · 1 fileMessage 60 · AdequateTriage 12Details
Commit message · Elias Rohrer
Drop unused fields from `lightning-transaction-sync` test utils
60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedBump MSRV to rustc 1.75.0by Elias Rohrer · 87c554dd · Oct 22, 2025 · 22 filesMessage 68 · AdequateTriage 12Details
Commit message · Elias Rohrer
Bump MSRV to rustc 1.75.0
We generally align our MSRV with Debian's stable channel. Debian 13 'Trixie' was just released, shipping rustc 1.85. However, as 1.85.0 is only about ~7months old at this point, we opt to bump to the more conservative 1.75.0, which approaches two years of age.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: unusually broad changesecond-pass: security-sensitive path
AI review queuedCapture stfu send in reconnection testsby Wilmer Paulino · 3c4e70c1 · Oct 14, 2025 · 2 filesMessage 78 · AdequateTriage 12Details
Commit message · Wilmer Paulino
Capture stfu send in reconnection tests
We'll use this in the next commit to test that we'll send a stfu message for a splice we intend to initiate upon reconnecting.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedReplace docs.rs build `doc_auto_cfg` feature with `doc_cfg`by Matt Corallo · 6aea5865 · Oct 13, 2025 · 10 filesMessage 85 · StrongTriage 12Details
Commit message · Matt Corallo
Replace docs.rs build `doc_auto_cfg` feature with `doc_cfg`
These have been merged, causing our docs.rs builds to fail. Sadly, we saw our docs.rs build fail for the 0.1.6 upload because of this.
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 pathsecond-pass: security-sensitive path
AI review queuedCorrect name of `get_counterparty_payment_script` methodby Matt Corallo · 9dbec804 · Oct 10, 2025 · 3 filesMessage 73 · AdequateTriage 12Details
Commit message · Matt Corallo
Correct name of `get_counterparty_payment_script` method
`get_counterparty_payment_script` fetches the countersigner's (i.e. non-broadcaster) payment script, but that could be ours or or counterparty's. Thus, it should read `get_countersigner_payment_script`, which we fix here.
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 queuedAdd a method to fetch all possible remote-closure `script_pubkey`sby Matt Corallo · e2e0d8a0 · Oct 10, 2025 · 1 fileMessage 73 · AdequateTriage 12Details
Commit message · Matt Corallo
Add a method to fetch all possible remote-closure `script_pubkey`s
In the previous commit we (finally) allowed users to opt into a static `remote_key` derivation scheme, enabling them to scan the chain for funds on counterparty commitment transactions without any state at all.
This is only possible, however, of course, if they have the full list of scripts to scan the chain for, which we expose here.
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 queuedTest channel reestablish during splice lifecycleby Wilmer Paulino · 5594f9b6 · Oct 8, 2025 · 3 filesMessage 70 · AdequateTriage 12Details
Commit message · Wilmer Paulino
Test channel reestablish during splice lifecycle
This test captures all the new spec requirements introduced for a splice to the channel reestablish flow.
70/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedGive the `get_change_destination_script` future access to `self`by Matt Corallo · b81fedc7 · Sep 28, 2025 · 1 fileMessage 73 · AdequateTriage 12Details
Commit message · Matt Corallo
Give the `get_change_destination_script` future access to `self`
Its generally useful for trait methods to be able to access `self`, sadly our definition of `get_change_destination_script` was screwed up and couldn't. Luckily its an easy fix as none of the callsites care about the extra `self` lifetime.
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 queuedSupport client_trusts_lsp on LSPS2by Martin Saposnic · 8ce4147e · Sep 25, 2025 · 9 filesMessage 35 · OpaqueTriage 0Details
Commit message · Martin Saposnic
Support client_trusts_lsp on LSPS2
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedAllow passing an `OutputSweeperSync` to the sync-KVStore-async-BPby Matt Corallo · b68f128c · Sep 25, 2025 · 3 filesMessage 73 · AdequateTriage 12Details
Commit message · Matt Corallo
Allow passing an `OutputSweeperSync` to the sync-KVStore-async-BP
`OutputSweeper::new_with_kv_store_sync` is a pretty strange API - it allows building an async `OutputSweeper` where the only `await`s are on a sync `KVStore`, ie will immediately block until the IO operation completes.
While this isn't broken (futures are allowed to take their time, and async runtimes have to handle this, though they often don't handle it particularly well), its pretty weird. It seems to exist largely for `process_events_async_with_kv_store_sync`, which does async `Event` handling but sync `KVStore` operations (like the existing pre-0.2 "async" background processor).
Instead, we allow passing an `OutputSweeperSync` to `process_events_async_with_kv_store_sync`, keeping the API consistent such that a user would use the appropriate `OutputSweeper` variant, but fetching the inner async `OutputSweeper` inside the BP.
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
As the LSP of an async sender, when we receive an update_add with the hold_htlc flag set, after its onion is decoded we transition the pending HTLC to the ChannelManager::pending_intercepted_htlcs. However, if we receive the release_held_htlc message from the receiver *before* we've had a chance to make this transition, we'll fail to release the HTLC and it will sit in the pending intercepts map until it is failed backwards.
To fix this race condition, if we receive release_held_htlc from the recipient we'll not only check the pending_intercepted_htlcs map for the presence of this HTLC but also check the map where we keep HTLCs prior to their onions being decoded.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
AI review queuedAdd `test_p2a_anchor_values_under_trims_and_rounds`by Leo Nash · 1618c77e · Sep 24, 2025 · 2 filesMessage 30 · OpaqueTriage 0Details
✓ Specific, descriptive subject! Too few words to establish purpose! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedAdjust the weight of htlc success and timeout witnesses in 0FC channelsby Leo Nash · bb3eeeda · Sep 24, 2025 · 2 filesMessage 50 · ThinTriage 12Details
Commit message · Leo Nash
Adjust the weight of htlc success and timeout witnesses in 0FC channels
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 queuedRelax feerate requirements in `TxBuilder::get_next_commitment_stats`by Leo Nash · ec13990d · Sep 23, 2025 · 2 filesMessage 73 · AdequateTriage 12Details
Commit message · Leo Nash
Relax feerate requirements in `TxBuilder::get_next_commitment_stats`
We sometimes do not have easy access to the `dust_exposure_limiting_feerate`, yet we are still interested in basic stats on commitments like balances and transaction fees. So we relax the requirement that the `dust_exposure_limiting_feerate` is always set when `feerate_per_kw` is not 0.
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 dust exposure due to excess fees in `get_next_commitment_stats`by Leo Nash · 6c6361de · Sep 23, 2025 · 1 fileMessage 62 · AdequateTriage 12Details
Commit message · Leo Nash
Cleanup dust exposure due to excess fees in `get_next_commitment_stats`
62/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Explains rationale or failure mode! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedMake `TxBuilder::get_next_commitment_stats` fallibleby Leo Nash · 63abd10a · Sep 23, 2025 · 3 filesMessage 63 · AdequateTriage 12Details
Commit message · Leo Nash
Make `TxBuilder::get_next_commitment_stats` fallible
Anytime we ask `TxBuilder` for stats on a commitment transaction, `TxBuilder` can now return an error to indicate that a balance not including the commitment transaction fee has been overdrawn. We then map this error to the appropriate action depending on where in the life cycle of the channel the error occurred.
We now do not require that `channel_value_satoshis * 1000` is greater than or equal to `value_to_holder_msat`; we previously would panic in this case.
signing or wallet pathsecond-pass: broader security terminologysecond-pass: security-sensitive path
AI review queuedMarginally simplify `TestStore`by Matt Corallo · 6199bcbe · Sep 22, 2025 · 1 fileMessage 35 · OpaqueTriage 0Details
Commit message · Matt Corallo
Marginally simplify `TestStore`
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedCorrect `maximum_pending_updates` of 0 in MonitorUpdatingPersisterby Matt Corallo · 8d6ed644 · Sep 22, 2025 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Matt Corallo
Correct `maximum_pending_updates` of 0 in MonitorUpdatingPersister
Though users maybe shouldn't use `MonitorUpdatingPersister` if they don't actually want to persist `ChannelMonitorUpdate`s, we also shouldn't panic if `maximum_pending_updates` is set to zero.
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 queuedSet HTLC tx version 3 on handling `BumpTransactionEvent::HTLCResolution`by Leo Nash · 67ed89dd · Sep 22, 2025 · 1 fileMessage 50 · ThinTriage 12Details
Commit message · Leo Nash
Set HTLC tx version 3 on handling `BumpTransactionEvent::HTLCResolution`
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 queuedAdd forwards-compatibility logic in `LocalHTLCFailureReason` serby Matt Corallo · 21a8b757 · Sep 21, 2025 · 1 fileMessage 93 · StrongTriage 0Details
Commit message · Matt Corallo
Add forwards-compatibility logic in `LocalHTLCFailureReason` ser
We recently created a `LocalHTLCFailureReason` enum to cover detailed reasons why an HTLC may have failed, in excess of the on-the-wire failure encoding.
Sadly, when we did so we introduced a serialization format which isn't particularly conducive to introducing new failure reasons in the future. Luckily, `LocalHTLCFailureReason` already has logic that works for forwards-compatibility - it can be converted to, and from, the on-the-wire error codes.
Thus, here, we take advantage of that, writing both the on-the-wire error code as well as a code for the specific case. If we don't recognize the specific case on deserialization, we'll fall back to the default case for the on-the-wire code we've written.
We also, of course, include a length-prefixed TLV stream to allow for additional fields in the future.
Fixes #4087
93/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
Why it was queued
second-pass: broader security terminology
AI review queuedFix lint CI jobby Matt Corallo · f013d957 · Sep 18, 2025 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Matt Corallo
Fix lint CI job
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Actually remove forward<>intercepted htlcs lock dep
8513341b1f7c39da3e6ad4521d4161362b0f4562 purported to remove a lock dependency between ChannelManager::pending_intercepted_htlcs and ::forward_htlcs. However, in practice the dependency remained because the locks of the two maps were still held at the same time in some cases. Here we fix this.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode