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…
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