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.
Security candidateReturn `Err`s` instead of panicking on oversized messagesby Matt Corallo · 08f12bc7 · Aug 4, 2026 · 3 filesMessage 85 · StrongLow 47Details
Commit message · Matt Corallo
Return `Err`s` instead of panicking on oversized messages
While this code should remain unreachable as it likely indicates we're going to end up force-closing a channel due to being unable to communicate with a peer, we shouldn't bring down the whole process for it if we can avoid it.
Instead, at least return an `Err` so we can figure out what to do with it in `PeerManager`.
Co-Authored-By: Claude <noreply@anthropic.com>
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
cryptography-sensitive path
AI analysis · Low 47/100
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. However, one important call site still uses `.expect("TODO: Handled in the next commit")`, meaning the crash risk is not fully removed there yet. The commit is a partial patch toward making the node more resilient against denial-of-service from malformed or oversized peer traffic.
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
seed or entropy pathsigning or wallet path
AI analysis · Informational 15/100
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 issue here.
Retransmit splice_locked for 0-conf channels missing tx_signatures
When a 0-conf channel successfully negotiates a 0-conf splice only for one peer and a disconnection happens prior to the other peer receiving `tx_signatures`, we'd previously fail to handle the inferred `splice_locked` upon reconnection via the `my_current_funding_locked_txid` TLV since the peer had not considered the splice fully negotiated yet. In this case, an explicit retransmission of `splice_locked` is required as per the BOLT-2 requirement:
> Each node: > - If option_zeroconf has been negotiated: > - SHOULD send splice_locked immediately after exchanging tx_signatures.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundary
AI analysis · Moderate 54/100
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 peers could get stuck and not agree on the new channel funding, potentially leaving the channel unusable or in an inconsistent state. The fix ensures the required message is resent so both nodes converge correctly.
Include to_self_delay size in DelayedPaymentOutput weight calculation
SpendableOutputDescriptor::create_spendable_outputs_psbt estimated the witness weight of a to_local (DelayedPaymentOutput) input using MAX_WITNESS_LENGTH, which assumes the maximum 4-byte OP_CSV push of to_self_delay in the redeemscript. The real push can be as small as 1 byte for small to_self_delays, causing the estimate to overshoot by up to 3 WU. If this overshoot occurred in addition to a short signature, the max-overshoot debug_assert in KeysManager::spend_spendable_outputs would fail.
Add DelayedPaymentOutput::max_witness_length, which computes the witness length from the descriptor's actual to_self_delay, and use it in place of the MAX_WITNESS_LENGTH constant. This produces a more accurate weight estimate so that the debug_assert in spend_spendable_outputs never fails.
This bug was discovered using Smite.
90/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Names security-relevant behavior explicitly
Why it was queued
signing boundarysigning or wallet path
AI analysis · Low 26/100
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 the largest possible 4-byte encoding of a delay value, even when the real value used only 1 byte. That could make the fee estimate slightly too high and, in rare cases with a short digital signature, trigger an internal debug-only assertion failure. The fix computes the exact size based on the actual delay value and adds a regression test. It is not a remote exploit and does not risk loss of funds.
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.
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
Why it was queued
signing boundary
AI analysis · Informational 19/100
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 in the invoice. The existing default behavior (MPP allowed) is preserved for current callers.
Security candidatePin jobserver to 0.1.34 on pre-1.85 rustcby Matt Corallo · a4641403 · Jul 9, 2026 · 1 fileMessage 45 · ThinInformational 15Details
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 analysis · Informational 15/100
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 does not change any production code that handles payments, networking, or cryptography.
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
Why it was queued
update trust
AI analysis · Informational 15/100
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 security patch. It is purely a regression test to confirm that downgrade and upgrade paths behave as designed.
Require `htlc_value_satoshis` in [pending] `HTLCUpdate`s
In 0.0.100 we started tracking the amounts being claimed in `OnchainEvent::HTLCUpdate` and then also in `MonitorEvent::HTLCUpdate`'s `HTLCUpdate`. It was always set, but stored as an `Option` to support further downgrade. Because these objects time out after `ANTI_REORG_DELAY` (6) blocks, there's not really much reason to keep supporting backwards compatibility to upgrade with such objects without an amount.
In 0.0.115, we started providing the amount in `PaymentForwarded`. For whatever reason, despite the event only being generated in cases where we had amounts, the field was added as an `Option`.
Still, in 0.0.118 we started generating them from both off-chain and on-chain claims. For off-chain claims it was always set, but for claims which originated from on-chain claims, the amounts came from the `MonitorEvent::HTLCUpdate` and thus were always an `Option`. If we no longer care about `MonitorEvent::HTLCUpdate`'s without a claim amount, we no longer need to worry about `Event::PaymentForwarded` either. Thus, we make it required here as well.
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
update trust
AI analysis · Low 25/100
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 frames this as removing legacy downgrade support, not as fixing a security bug. There is no direct evidence in the diff of an exploitable vulnerability.
Use a builder for sign_interactive_funding_tx arguments
The signing helper had accumulated several boolean/option parameters beyond the two nodes, so call sites passed opaque positional `false`s and bare `None`s whose meaning was unclear without consulting the signature.
Replace the two overloaded functions with a single `sign_interactive_funding_tx` taking a `SignInteractiveFundingTxArgs` builder, mirroring `PassAlongPathArgs`: `new(initiator, acceptor)` defaults to a first-attempt splice on a confirmed channel with no acceptor contribution, and each non-default behavior is opted into by a named method (`zero_conf`, `with_acceptor_contribution`, `replacing`).
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 boundary
AI analysis · Informational 15/100
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 tests easier to read and maintain, but it does not change any production behavior or fix a security bug.
ln: persist the paid BOLT 12 invoice and build payer proofs
Carry the paid `Bolt12Invoice` through the outbound payment so it survives restarts, and surface it as a `PaidBolt12Invoice` on `Event::PaymentSent` so the payer can build a payer proof. The payer signing key is re-derived from the invoice's own payer metadata, so no extra key material is stored.
`PaidBolt12Invoice` now lives in `offers::payer_proof`; existing async payment tests and a test helper are updated to construct it via the new API. Adds an end-to-end test that pays a BOLT 12 offer and builds + verifies a payer proof from the resulting `Event::PaymentSent`.
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
Why it was queued
signing boundary
AI analysis · Low 25/100
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 the PaymentSent event as a PaidBolt12Invoice. The wallet can then use that object to build a cryptographic 'payer proof' that selectively discloses invoice fields to prove to a third party that it paid. The payer signing key is re-derived from data already in the invoice, so no extra secret key storage is needed. There is no indication in the commit that this fixes a security bug; it is new functionality with tests.
Move the invoice/refund payer key derivation logic into reusable helpers so payer proofs can derive the same signing keys without duplicating the metadata and signer flow.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
secret or key materialsigning boundarysigning or wallet path
AI analysis · Informational 17/100
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 to fix a security bug; it reorganizes existing logic and adds a new public method to re-derive a payer's signing keys from invoice data. No vulnerability or exploit is described in the commit itself.
Security candidateUpload new fuzz corpus entries as a short-lived CI artifactby Matt Corallo · b9f55b6c · Jul 5, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · Matt Corallo
Upload new fuzz corpus entries as a short-lived CI artifact
Fork-PR runs get no credentials from Forgejo — neither secrets nor authorized-integration identity tokens — so the fuzz job cannot push new corpus entries to the corpus repo from CI. Instead, clone the corpus from this Forgejo instance (rather than the GitHub copy, so new entries are detected against the repo they will land in), stage the new entries plus any SIG* crashes like the GitHub workflow does, and upload them as an `hfuzz-corpus` artifact with a two-day retention. The ldk-fuzzing-corpus repo's nightly job sweeps these artifacts into a corpus pull request and deletes them once processed.
Unlike the GitHub workflow's version, the crash-staging loop here uses the `rust-lightning/<target>` prefix the corpus entries are actually staged under (upstream checks the wrong path, so no crash file is ever picked up there), and it stages crashes for targets that produced no new corpus entries rather than only creating the target directory as a side effect of staging corpus files.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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 evidencecredential or privilege state
AI analysis · Informational 15/100
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 scheduled job later collects. This is a workflow reliability and credential-handling improvement, not a security fix or vulnerability.
ln: add trampoline mpp accumulation with rejection on completion
Add our MPP accumulation logic for trampoline payments, but reject them when they fully arrive. This allows us to test parts of our trampoline flow without fully implementing outbound dispatch.
This commit keeps the same first_claimable_htlc debug_assert behavior as MPP claims, asserting that we do not fail our check_claimable_incoming_htlc merge for the first HTLC that we add to a set. This assert can only be hit if our first part exceeds the `MAX_VALUE_MSAT`, which should not be hit because we check individual amounts elsewhere in the codebase (the check exists to check that multiple parts combined don't hit this overflow).
100/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✓ Names security-relevant behavior explicitly
Why it was queued
memory safety
AI analysis · Low 25/100
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 implemented. It is a development/testing step for the trampoline routing feature, not a finished payment path. The code includes safety checks and debug assertions to catch inconsistent payment data, and it explicitly fails unsupported forwards rather than silently mishandling them.
ln: remove incoming trampoline secret from HTLCSource
We don't need to track a single trampoline secret in our HTLCSource because this is already tracked in each of our previous hops contained in the source. This field was unnecessarily added under the belief that each inner trampoline onion we receive for inbound MPP trampoline would have the same session key.
It can be removed with breaking changes to persistence because we currently refuse to decode trampoline forwards, and will not read HTLCSource::Trampoline to prevent downgrades.
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
update trust
AI analysis · Informational 23/100
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 data, so keeping a single copy at the top level was unnecessary. The change also updates serialization so older saved state cannot be cleanly loaded, but the code currently refuses to decode trampoline forwards anyway, so that downgrade risk is intentional and noted.
Request a local Authorized Integration JWT in the reviewer workflow.
Use bearer authorization for the reviewer request API call.
This avoids a long-lived user token.
The workflow still gets the missing reviewer-request capability.
Co-Authored-By: HAL 9000
73/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
access controlsigning or wallet path
AI analysis · Informational 19/100
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: it reduces the risk that a stolen or leaked long-lived token could be misused. There is no indication of an active vulnerability being fixed, and the change itself does not introduce obvious new weaknesses.
Allow chanmon consistency fuzz inputs to block holder-side signer operations and retry monitor-driven claim signing. The new commands extend the existing signer-op blocking machinery to the holder commitment and holder HTLC transaction paths.
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 boundaryfuzzing or regression evidence
AI analysis · Informational 15/100
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 production code, user-facing behavior, or real wallet security.
Security candidatePin actions/checkout + actions/cache to a full URL and commit hashby Matt Corallo · 3a56fcc2 · Jun 28, 2026 · 6 filesMessage 73 · AdequateInformational 18Details
Commit message · Matt Corallo
Pin actions/checkout + actions/cache to a full URL and commit hash
Reference the checkout action by its explicit data.forgejo.org URL pinned to a commit hash (v6) rather than the bare `actions/checkout@v4` short form.
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
Why it was queued
access control
AI analysis · Informational 18/100
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 from silently injecting malicious code into the project's CI runs. It is a defensive security improvement, not a fix for an active bug or breach.
Security candidateLower strictness of pending monitor update while awaiting tx_signaturesby Wilmer Paulino · b8a76c17 · Jun 25, 2026 · 2 filesMessage 73 · AdequateModerate 57Details
Commit message · Wilmer Paulino
Lower strictness of pending monitor update while awaiting tx_signatures
We previously assumed that no monitor update should ever be pending when receiving `tx_signatures` while quiescent, with the exception of the `RenegotiatedFunding` variant. This was a bit too strict, as we did not consider that if an HTLC was sent via the same channel, its preimage could be received from upstream leading to a monitor update to durably persist it.
This commit ensures that if the recipient of a `tx_signatures` has not yet echoed theirs back, and it is awaiting a monitor update completion, then the pending monitor update must be of the `RenegotiatedFunding` variant. If the pending monitor update is of another variant, then we must remain quiescent with no pending updates available to send until after the `tx_signatures` exchange.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundary
AI analysis · Moderate 57/100
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 quiescent. In reality, an unrelated HTLC preimage could trigger a pending monitor update at the same time. The fix relaxes the strictness so the protocol does not panic or get stuck, and adds a regression test covering the scenario.
After we complete a splice negotiation and see a `FundingTransactionReadyForSigning` event, the counterparty may already have sent its initial `commitment_signed` for the splice funding transaction. If we then cancel the funding contribution, our local channel state no longer tracks the pending splice attempt and queues `tx_abort`, but the in-flight `commitment_signed` can still arrive first. Handling that message against the post-abort channel state attempts to validate a signature for the now-stale splice funding transaction and can force-close the still-live channel.
We fix this by checking the optional `funding_txid` (which we expect all implementations to always include by default) included in `commitment_signed` before validating the commitment signature. If it does not match the channel's locked funding txid, we can safely ignore the stale message.
73/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
signing boundarydefensive validation
AI analysis · Moderate 64/100
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 for the now-canceled new funding transaction. Before this fix, the software would try to check that signature against the old channel state, fail, and wrongly close the channel. The fix makes the software first check whether the signature belongs to the currently active funding transaction and ignore it if it is stale.
Security candidatePin zeroize for old Rust CIby Joost Jager · a8a4767f · Jun 24, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Joost Jager
Pin zeroize for old Rust CI
zeroize 1.9.0 uses Rust 2024 metadata, which Cargo 1.75 cannot parse. Pin it to 1.8.2 for older toolchains so the transaction sync HTTPS feature check keeps passing on the MSRV job.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
access controlmemory safety
AI analysis · Informational 15/100
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.
Run rustfmt on the possiblyrandom crate so its cfg attributes match the current formatting rules.
50/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides an explanatory body
Why it was queued
seed or entropy path
AI analysis · Informational 15/100
This commit is purely a code-formatting cleanup. It runs rustfmt on a small Rust source file so that multi-line conditional compilation (cfg) attributes are collapsed onto single lines. No logic, behavior, or security properties of the code change.
Security candidateGet real rand in `possiblyrandom` on supported platforms w/o featby Matt Corallo · b7c9935b · Jun 18, 2026 · 1 fileMessage 78 · AdequateModerate 61Details
Commit message · Matt Corallo
Get real rand in `possiblyrandom` on supported platforms w/o feat
It turns out that conditionally-enabling a dependency via `target` in `Cargo.toml` does not enable the corresponding dependency `feature` when compiling the code. As a result, only when building `possiblyrandom` with an explicit `getrandom` feature did we ever actually return random values.
This fixes this by matching the `target` cfg in `Cargo.toml` to the cfg in `lib.rs`.
Reported by Project Loupe
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
seed or entropy path
AI analysis · Moderate 61/100
This commit fixes a bug in a small helper crate called `possiblyrandom` used by the Lightning Dev Kit. The crate was supposed to return real random bytes on normal operating systems, but due to a Cargo.toml misconfiguration it was silently returning zeros unless an explicit feature flag was turned on. Randomness is important for cryptographic operations; using predictable zeros could weaken security in places that expect random input. The patch makes the code actually call the system's random source on supported platforms.
Security candidateReject pre-epoch `LSPSDateTime` at parse timeby Elias Rohrer · 837763a6 · Jun 18, 2026 · 1 fileMessage 80 · StrongHigh 76Details
Commit message · Elias Rohrer
Reject pre-epoch `LSPSDateTime` at parse time
`LSPSDateTime::is_past` coerced `chrono`'s `i64` timestamp into a `u64` via `try_into().expect(...)`. Because `LSPSDateTime` is parsed from peer-controlled RFC 3339 strings (which can be pre-1970 and so yield negative timestamps), this could be triggered remotely: an attacker-supplied `valid_until` / `expires_at` field of e.g. `"1900-01-01T00:00:00Z"` would parse successfully, land in LSPS state before any HMAC / promise check, and panic the LSP thread on the next `prune_pending_requests` sweep. Concretely reachable today via LSPS2 `opening_fee_params.valid_until` (in the buy request) and the LSPS1 expiry fields.
Make `LSPSDateTime::from_str` reject pre-epoch datetimes, and route serde deserialization through it: `#[serde(transparent)]` was delegating Deserialize directly to `chrono`'s impl and bypassing our parser, so peer JSON had to be guarded separately. With both paths funnelled through one parser, no `LSPSDateTime` value with a negative inner timestamp can be constructed and `is_past` is safe by construction.
Co-Authored-By: HAL 9000
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
explicit security language
AI analysis · High 76/100
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 peer messages. The date would be accepted, and later when the software checked whether it had expired, it would panic and crash the LSP thread. The fix rejects any pre-1970 date during parsing, including when reading JSON from peers, so the dangerous value can never be created.