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
Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.
AI review queuedAvoid oversized relayed failure messagesby Matt Corallo · 6b1dfb1a · Aug 4, 2026 · 1 fileMessage 78 · AdequateTriage 5Details
Commit message · Matt Corallo
Avoid oversized relayed failure messages
A downstream peer could send a maximum-sized update_fail_htlc without attribution data. Adding attribution data while relaying the failure made the message exceed the Noise framing limit and panic during encryption.
Drop the attribution data again when adding it would push the relayed failure over the wire limit, while preserving attribution for packets that fit. The message length is derived from serialized_length on the message and on the attribution data itself rather than from hardcoded field sizes, which also lets us replace a stale assertion on the maximum failure data length. Add a regression test for relaying a maximum-sized failure and correct the existing size test to include the message type.
Reported by Project Loupe.
Co-Authored-By: Elias Rohrer <dev@tnull.de> Co-Authored-By: HAL 9000
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 review queuedReject attempts to advance one-hop blinded forward pathsby Matt Corallo · 969a40cf · Aug 4, 2026 · 4 filesMessage 83 · StrongTriage 5Details
Commit message · Matt Corallo
Reject attempts to advance one-hop blinded forward paths
A malicious reply path can contain a single decryptable forward hop. Advancing that path removed its only hop, causing onion construction to panic when a handler attempted to respond.
Reject paths with fewer than two hops before attempting to advance them. The regression test exercises the untrusted response path and verifies that it returns an error without panicking.
Reported by Project Loupe.
Test written by: Elias Rohrer <dev@tnull.de>, which was Co-Authored-By: HAL 9000
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 evidencesecond-pass: broader security terminology
AI review queuedAllow filtered block rescans at the current tipby Elias Rohrer · 686f9860 · Aug 4, 2026 · 3 filesMessage 88 · StrongTriage 0Details
Commit message · Elias Rohrer
Allow filtered block rescans at the current tip
A valid same-block replay through Listen could panic OutputSweeper and ChannelManager because both required every filtered_block_connected call to advance the chain.
Treat callbacks matching the current tip as rescans, process their additional transaction data, and skip the duplicate best-block update while retaining chain-order checks for new blocks.
Fixes #3920
Reported by Project Loupe
Co-Authored-By: HAL 9000
88/100 · StrongMessage clarity
✓ 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 queuedAvoid panic when reorged claims cannot mergeby Matt Corallo · f1dc8487 · Aug 4, 2026 · 2 filesMessage 78 · AdequateTriage 5Details
Commit message · Matt Corallo
Avoid panic when reorged claims cannot merge
Previously, a deep reorg could resurrect an HTLC package at a height where it was no longer mergeable with its surviving claim. This caused `OnchainTxHandler::blocks_disconnected` to panic on an assertion.
When merging fails, we now preserve the resurrected package in `locktimed_packages` so normal block processing registers and broadcasts it as an independent claim. Add a regression test covering the reorg and subsequent broadcast.
Thanks to Kyle W. Santiago for reporting this issue.
Co-authored-by: Elias Rohrer <dev@tnull.de>
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 review queuedCorrect docs on `ChannelSigner::get_per_commitment_point`by Matt Corallo · 5057809b · Jul 28, 2026 · 1 fileMessage 65 · AdequateTriage 12Details
Commit message · Matt Corallo
Correct docs on `ChannelSigner::get_per_commitment_point`
This was apparently missed in 1f7b24900d16c841d55fc83e0e2057e241d5e
65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
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
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
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
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
Monitor event draining expects BumpTransaction events, which the harness must mine, plus SpendableOutputs and DiscardFunding events, which it intentionally ignores because it does not model an external wallet. Make that whitelist explicit by panicking on any other monitor event instead of silently ignoring it.
80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
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 review queuedFix assign-reviewer's auth by setting the authorized integration audienceby Matt Corallo · 055d334d · Jul 3, 2026 · 1 fileMessage 55 · ThinTriage 12Details
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 review queuedci: don't double-assign reviewers, support manual assignment runsby Matt Corallo · 24651a1a · Jul 3, 2026 · 1 fileMessage 90 · StrongTriage 12Details
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
Only emit Event::SpliceNegotiated when contributing
There's no need to inform users of negotiated splices when they're not contributing as it just produces noise. Once they do start contributing, they cannot stop, so we always emit the event going forward. Note that we still emit `Event::ChannelReady` with the new locked funding outpoint for each locked splice, so users can still learn that a splice occurred that way.
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
Use the account name present on this Forgejo instance so Joost stays in the reviewer rotation.
Co-Authored-By: HAL 9000
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: security-sensitive path
AI review queuedFix lightning-invoice bitcoin dependency versionby Daniel Roberts · fbc22051 · Jun 29, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · Daniel Roberts
Fix lightning-invoice bitcoin dependency version
`lightning-invoice` since 743f43fcfd5acba55242792ed1e9337f2ab52858 will not build against `rust-bitcoin` older than v0.32.7.
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 workflow to assign a random reviewer on new PRsby Matt Corallo · 311a74cf · Jun 28, 2026 · 1 fileMessage 78 · AdequateTriage 12Details
Commit message · Matt Corallo
Add workflow to assign a random reviewer on new PRs
Forgejo has no built-in random/round-robin reviewer assignment, so add a small Forgejo Actions workflow that, on pull request open, picks a random developer from the maintainer pool (excluding the author) and requests their review via the API.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
78/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedDrop the BufReader wrapperby Abeeujah · b582ce15 · Jun 24, 2026 · 1 fileMessage 58 · ThinTriage 0Details
Commit message · Abeeujah
Drop the BufReader wrapper
Post `0.32.4` deserialization of consensus objects now use `Read` as the trait bounds, making the BufReader no longer needed for deserialization.
AI review queuedDeserialize consensus objects using Read typeby Abeeujah · deee085c · Jun 24, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · Abeeujah
Deserialize consensus objects using Read type
The BufReader wrapping is no longer needed after the rust-bitcoin `0.32.4` release which contains the standardisation of the trait bounds for deserialization to `Read` instead of `BufReader`.
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 queuedDrop duplicate Hasher importby Abeeujah · b4f74165 · Jun 23, 2026 · 1 fileMessage 35 · OpaqueTriage 0Details
Commit message · Abeeujah
Drop duplicate Hasher import
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedAvoid over-allocating when reading corrupted lengths for `HashMap`sby Matt Corallo · 5b4626fa · Jun 18, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Matt Corallo
Avoid over-allocating when reading corrupted lengths for `HashMap`s
Luckily this was only used in `ChannelManager` and scorer deserialization, though we anticipate occasionally fetching the second from an only semi-trusted source.
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 queuedFix invalid dummy pubkey in send_to_routeby Valentine Wallace · 54cdd85f · Jun 17, 2026 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Valentine Wallace
Fix invalid dummy pubkey in send_to_route
If a caller of send_payment_with_route provided a route with either no paths, or where the first path had 0 hops, the method would panic due to attempting to unwrap a dummy pubkey that was initialized with 32 bytes instead of the required 33.
Reported by Project Loupe.
80/100 · StrongMessage clarity
✓ 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 queuedCorrect deserialization of `u16::MAX` byte-Featuresby Matt Corallo · 87c8c326 · Jun 17, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Matt Corallo
Correct deserialization of `u16::MAX` byte-Features
This shouldn't really matter in practice, but it aligns the serialization and deserialization logic.
Reported by Project Loupe.
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 queuedDon't panic when a composite sub-handler returns `Ok(None)`by Jeffrey Czyz · 77ac339b · Jun 17, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · Jeffrey Czyz
Don't panic when a composite sub-handler returns `Ok(None)`
A handler built with `composite_custom_message_handler!` routes an incoming message type to the sub-handler whose pattern matches it and assumed the sub-handler would always decode it. But per the `CustomMessageReader` contract a sub-handler returns `Ok(None)` for a type it doesn't recognize, and a sub-handler's pattern -- a range in particular -- can be broader than the types it actually decodes.
Since the message type comes from peer input, this let a remote peer panic the message-processing thread with a single custom message whose type falls in a sub-handler's pattern but isn't decoded by it. Report such a message as unknown instead, matching how `wire::do_read` handles an undecoded custom message.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Replayed intercepted HTLC events should not duplicate queued payments or panic after restart. Ignore already-queued intercept IDs so persisted queues remain stable across event replay.
Co-Authored-By: HAL 9000
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context