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 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 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 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 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 patch fixes a bug in the Lightning Dev Kit where a delayed message from a peer could accidentally force-close a live payment channel. During a failed 'splice' (a way to resize a channel), the peer might already have sent a signature f…
Force-closure of a live Lightning channel due to stale signature validationRace condition between splice cancellation and in-flight commitment_signedIncorrect signature validation against post-abort channel state
This commit only changes a CI script to pin a dependency version so older Rust toolchains can still build the project. It is a build-maintenance fix with no security relevance.
This commit fixes a remote denial-of-service bug in rust-lightning's LSPS (Lightning Service Provider Specification) code. An attacker could send a specially crafted date string from before 1970 (like "1900-01-01T00:00:00Z") in certain pee…
Remote-triggerable panic (DoS) via peer-controlled inputInteger conversion panic: i64 negative timestamp coerced to u64 with .expect()Input validation bypass: serde transparent deserialization skipped custom parser
This commit fixes a validation bug in how Lightning Dev Kit checks 'fake' short channel IDs (SCIDs) used for routing tricks like phantom and intercept payments. The old check compared only the lowest byte of the vout field, so an attacker …
Input validation bypass in fake SCID checksType-cast truncation bug (u16 to u8) leading to incorrect equality checkPotential for spurious HTLCIntercepted event generation
This commit removes an old cryptographic nonce from the data carried inside Lightning "blinded paths" used when sending BOLT 12 offers and refunds. The nonce is no longer needed because a newer "payer metadata" field already carries the sa…
Removes a redundant nonce from blinded-path context, relying on payer metadata for invoice authenticationRetains and enforces payment_id matching to prevent cross-payment invoice delivery over captured blinded pathsMaintains backward-compatible persistence of the nonce for downgrade/retry scenarios
This commit changes how BOLT12 invoices are verified in the Lightning Dev Kit. Previously, some invoices could be verified using a nonce stored in the blinded reply path context. Now, the nonce is always included inside the encrypted payer…
BOLT12 invoice verification now depends only on data inside the invoice request/refund, reducing reliance on external contextRemoves a verification path (verify_using_payer_data) that used reply-path context instead of invoice-contained metadataBreaks backward compatibility for prior-version invoice requests/refunds with blinded paths, causing payment failures
This commit fixes a bug in how Lightning Dev Kit describes anchor outputs when preparing transactions for external wallets to sign. Previously, for a type of anchor tied to a specific channel key, the code returned the raw 'witness script'…
Incorrect scriptPubKey in PSBT witness_utxo metadata for anchor prevoutsPotential wallet/signer validation failure when signing fee-bumping transactionsRisk of misidentification of on-chain anchor output during CPFP/RBF bumping
This commit changes a fuzz test (a randomized testing harness) so it no longer crashes when a simulated splice-funding signing event becomes stale. The change only affects test code, not the production Lightning library, and it ignores an …
Error-handling change in fuzz targetReference to tx_abort invalidating queued signing eventsNo production code modified
This commit is a pure code cleanup: it renames internal Rust macros from impl_writeable_tlv_based* to impl_ser_tlv_based* across many files. The generated serialization and deserialization code is unchanged, so there is no functional or se…
This change is a developer convenience tweak for the project's internal fuzz-testing programs. It adds an environment variable switch (LDK_FUZZ_SUPPRESS_LOGS) that lets automated fuzzing runs stay quiet, while keeping normal manual runs ve…
No changes to production library codeNo changes to parsing, serialization, or cryptographic codeOnly affects fuzz target harness logging behavior
This commit only fixes compiler warnings that appear when building the project's fuzzing test harness. It removes one unused import, narrows three conditional compilation flags so they don't conflict during fuzz builds, and reduces the vis…
Register every send as pending, then move immediate outcomes through one strict pending-to-resolved transition. Reuse that transition for terminal events and manager rollback, while handling repeated terminal events only after confirming the payment was already resolved.
Keep abandoned payments pending while they still have outbound HTLC state, including holding-cell HTLCs. Later success checks need complete tracker state and must reject terminal events for payments the harness never recorded.
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
Lower-priorityblinded_path: only compact introduction nodes via channels enabled both waysby Vincenzo Palazzo · 0c352c55 · Jul 27, 2026 · 1 fileMessage 81 · StrongTriage 0Details
Commit message · Vincenzo Palazzo
blinded_path: only compact introduction nodes via channels enabled both ways
When selecting a channel to reference a compact (DirectedShortChannelId) introduction node, only consider channels that are enabled in both directions. Disabled channels cannot be used to reach the introduction node, and such channels may linger in the local network graph long after being disabled or even closed (e.g., when sourcing gossip from rapid gossip sync, which never removes closed channels). Previously, the oldest channel of the introduction node was selected unconditionally, which could produce blinded paths that senders cannot resolve or route to, silently breaking long-lived paths such as those embedded in BOLT 12 offers.
If no enabled channel is found, the NodeId encoding is kept.
Fixes #4826.
81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Stop assigning reviewers when pull requests are opened. Keep the manual workflow trigger available for Forgejo's "Assign random reviewer" button. Only members of the reviewer pool may request an additional reviewer.
Document that contributors should address the initial AI review before requesting human review. Clarify that one human reviewer is the default, with a second requested when the primary reviewer considers it necessary.
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 addressing an AI review. It also limits who can request extra reviewers. There is no change to the actual Lightning node software, cryptography, network protocol, or any user-facing security behavior.
Lower-priorityf names in test lookupsby Matt Corallo · 081a8e10 · Jul 24, 2026 · 1 fileMessage 48 · ThinTriage 0Details
Commit message · Matt Corallo
f names in test lookups
48/100 · ThinMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Lower-priorityExpose DNS query failure on invalid proofs or bad BIP 353 recordsby Matt Corallo · 204134c0 · Jul 24, 2026 · 1 fileMessage 85 · StrongTriage 0Details
Commit message · Matt Corallo
Expose DNS query failure on invalid proofs or bad BIP 353 records
In the previous commit we started handling the new `DNSSECError` onion messages and using them to expose when a BIP 353 resolution over onion messages should be considered failed due to all of our queries having filed. However, queries can also fail if all of our queries either errored or returned bogus proofs, or if we received a valid proof which proved there is no BIP 353 record or `Offer`.
Here we consider such failures and expose them as well.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Lower-priorityf note that only one resolution will fail at a timeby Matt Corallo · a2fe23f5 · Jul 24, 2026 · 1 fileMessage 50 · ThinTriage 0Details
Commit message · Matt Corallo
f note that only one resolution will fail at a time
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Generate `DNSSECError` messages when DNSSEC resolution fails
https://github.com/lightning/blips/pull/71 updated the DNSSEC resolution bLIP to include an explicit error message when DNS(SEC) resolution was attempted but failed, allowing for faster fallback to LN-Address (for clients that do) and faster payment failure.
Here we add service-side support for generating the error messages, informing requesters that their resolutions have failed.
Largely written by an LLM
81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Lower-priorityCorrect DNSSEC proof validity time gap applied to header timeby Matt Corallo · d14c22a3 · Jul 24, 2026 · 1 fileMessage 95 · StrongTriage 0Details
Commit message · Matt Corallo
Correct DNSSEC proof validity time gap applied to header time
We intended to apply DNSSEC proof validity tests to constrain them to within two hours of the latest block header time, but the code landed with a two minute gap instead.
Given DNSSEC proof validity is usually many hours and grace periods are used to ensure records close to expiry aren't used, this is somewhat unlikely to have bitten anyone.
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
Lower-priorityRename `OMNameResolver::resolve_name` to `initiate_resolution`by Matt Corallo · 0460fda6 · Jul 24, 2026 · 2 filesMessage 65 · AdequateTriage 0Details
Commit message · Matt Corallo
Rename `OMNameResolver::resolve_name` to `initiate_resolution`
This better captures what the method actually does.
65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-priorityReport the used success probabilities in scorer accessor methodsby Matt Corallo · 68123876 · Jul 24, 2026 · 1 fileMessage 85 · StrongTriage 0Details
Commit message · Matt Corallo
Report the used success probabilities in scorer accessor methods
`live_estimated_payment_success_probability` and `historical_estimated_payment_success_probability` allow clients to fetch the estimated success probability of a channel directly, rather than as a score.
Sadly, because they did not check that the amount was strictly smaller than `max_liquidity_msat`, `success_probability` could hit a (otherwise-harmless) debug assertion, which is fixed here.
While doing so, we also update them to return the actual probability estimate used in scoring, applying the 1% lower-bound.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI review queuedFormat changed functionsby Matt Corallo · 05ce4204 · Jul 24, 2026 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · Matt Corallo
Format changed functions
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
Lower-priorityCorrect + update scoring attempts right at the maximum amountsby Matt Corallo · a6964ab9 · Jul 24, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Matt Corallo
Correct + update scoring attempts right at the maximum amounts
While sending a payment at exactly a channel's max or the liquidity upper bound we've calculated is unlikely to work, we shouldn't consider it impossible. Here we fix a few cases where we previously did so.
This isn't really fixing anything, as we only shift the boundary by 1 msat, but it makes the next commit more logical.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Handle missing splice tx_signatures on reestablish
When reconnecting after one side has received `tx_signatures` for a splice but the peer has not, `channel_reestablish` may need to recover two different pieces of state: the missing `tx_signatures` and a later commitment update generated after quiescence ended locally.
Previously the lost-remote-commitment path discarded any `tx_signatures` prepared while processing the peer's `next_funding` TLV, as we assumed that if a `tx_signatures` is owed, then no pending updates must exist. That left the peer awaiting splice signatures and still treating the channel as quiescent, so the subsequent HTLC commitment update was rejected as a normal update while quiescent.
This was incorrect as the fuzzer highlighted that a new update can be made after the `tx_signatures` exchange (while the counterparty has yet to process the responding `tx_signatures`) and both messages need to be retransmistted after a reconnect.
We fix this by carrying `tx_signatures` through that reestablish branch and making the `tx_signatures/commitment_update` order explicit. Initial splice funding retransmission remains commitment_signed-before-tx_signatures, while post-splice reconnect recovery sends tx_signatures before normal commitment updates so the peer can exit quiescence first.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundaryfuzzing or regression evidencesigning or wallet path
AI analysis · Moderate 60/100
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 reconnected, the recovering peer could drop its own splice signatures while trying to resend a later commitment update. That left the counterparty still waiting for splice signatures and still treating the channel as 'frozen' (quiescent), so it would reject the normal commitment update. The fix ensures both the missing splice signatures and any later commitment update are retransmitted in the correct order after reconnect.
Preserve the MPP-enabled default for invoice-request response builders so existing OffersMessageFlow callers retain their prior behavior.
Allow callers with single-path requirements to explicitly remove the advertised MPP feature before signing. This controls feature advertisement only; receive-side enforcement remains the caller's responsibility.
Co-Authored-By: HAL 9000
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
channelmanager: upgrade best_block_updated log from trace to info
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI review queuedChange assign-reviewer authorized integration token to a bot acctby Matt Corallo · f734d1eb · Jul 20, 2026 · 1 fileMessage 81 · StrongTriage 12Details
Commit message · Matt Corallo
Change assign-reviewer authorized integration token to a bot acct
I didn't realize using my own authorized integration token would result in every assignment being listed as coming from me, which is weird so here we swap it for a bot.
Fixes #4804
81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
Increase the base and historical-liquidity penalties fivefold. This applies to both the fixed and payment-size parts, so their balance stays the same. The router will now pay more to avoid longer routes and routes the scorer considers less likely to work.
I tested this using the graph and scorer pulled from my ldk-server. The scorer was kept unchanged during the test. Codex randomly assigned 600 different high-degree nodes to the old or new settings, with 300 probes per setting. The test was balanced across 100 rounds and used amounts of 1,000, 10,000, and 30,000 sats. Only one probe ran at a time.
The old settings reached 167/300 targets (55.7%) within 10 seconds. The 5x settings reached 214/300 (71.3%), an improvement of 15.7 percentage points. Results were 69% vs 82% at 1,000 sats, 47% vs 72% at 10,000 sats, and 51% vs 60% at 30,000 sats.
Across the 587 targets where both settings found a route, the quoted fee rose by 2.4 sats on average. These probes used one node and did not settle, so they do not guarantee payment success elsewhere.
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
Pending outbound HTLC details do not identify which payment or inbound HTLC produced them. A payment hash cannot provide that mapping when multiple parts of a multipart payment share both a hash and route.
Expose an optional source enum containing the payment ID for locally initiated HTLCs, the inbound HTLC for normal forwards, or all inbound HTLCs aggregated by a trampoline forward. Derive it from the existing HTLC source for committed and holding-cell HTLCs.
Serialize the source as an optional upgradable TLV so older data remains readable and unknown future source variants degrade to None.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Handle `DNSSECError` messages when attempting DNSSEC resolution
https://github.com/lightning/blips/pull/71 updated the DNSSEC resolution bLIP to include an explicit error message when DNS(SEC) resolution was attempted but failed, allowing for faster fallback to LN-Address (for clients that do) and faster payment failure.
Here we add client-side support for the new message, accepting `DNSSECError` messages and marking payments as failed when all our queries have failed.
Largely writen by an LLM
81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Add infrastructure for handling `DNSSECError` onion messages
https://github.com/lightning/blips/pull/71 updated the DNSSEC resolution bLIP to include an explicit error message when DNS(SEC) resolution was attempted but failed, allowing for faster fallback to LN-Address (for clients that do) and faster payment failure.
Here we simply add the new message framing and empty handlers.
Largely writen by an LLM
81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Security candidatePin jobserver to 0.1.34 on pre-1.85 rustcby Matt Corallo · a4641403 · Jul 9, 2026 · 1 fileMessage 45 · ThinTriage 18Details
Commit message · Matt Corallo
Pin jobserver to 0.1.34 on pre-1.85 rustc
45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
access control
AI review queuedBump esplora-client to 0.13 to switch from `reqwest` to `bitreq`by Matt Corallo · 5cd499e0 · Jul 9, 2026 · 2 filesMessage 50 · ThinTriage 12Details
Commit message · Matt Corallo
Bump esplora-client to 0.13 to switch from `reqwest` to `bitreq`
...fixing MSRV builds
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
Test cross-version serialization of pending splices
Add tests exercising the 0.2/current wire boundary for pending splices: - A current node with a single pending splice (whether or not we contributed to it) is loadable by LDK 0.2. - A current node with a splice under RBF is refused by 0.2 via the even RBF-gate TLV. - A single pending splice written by 0.2 is read by current with no contribution recorded, since 0.2 never tracked one.
The downgrade reload configs enable anchors so 0.2 accepts the current channel type rather than refusing it before the splice state is reached.
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