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 tightens how LND handles invoice payment updates, especially for newer 'AMP' invoices and old-style 'keysend' payments. It adds checks so that the wrong kind of payment cannot be processed against the wrong kind of invoice, and…
Added preimage/hash mismatch checks for both regular and AMP invoice replaysAMP records now require an MPP payload, preventing AMP processing on the legacy pathLegacy path now rejects AMP invoices and invoices missing invoice-level preimages
This commit adds support in LND for a new Lightning protocol message called InvoiceError. It is used to politely tell another node why their payment invoice or invoice request was rejected, sent privately through an onion-routed message. T…
New unsigned onion message type added with no cryptographic signature or bech32 formWriter-side validation prevents empty or non-UTF-8 error strings and disallowed suggested_value without erroneous_fieldReader-side BOLT 1 must-understand rule enforced: unknown even TLVs rejected, unknown odd TLVs tolerated
This commit adds validation checks for BOLT 12 invoices in the LND Lightning node software. It ensures invoices contain required fields (creation time, amount, payment hash, node ID, payment paths), match their originating invoice requests…
New validation gate added to Invoice.Encode() to reject malformed invoices before serializationReader rejects unknown even invoice TLV types and unknown even feature bitsReader enforces chain compatibility against activeChain
This commit adds new code to support BOLT 12 invoices in the LND Lightning node. It introduces a data structure, encoding/decoding logic, and helper functions to filter fallback addresses and blinded payment paths. There is no bug fix or s…
This commit is a hardening and cleanup of a GitHub Actions workflow that automatically labels pull requests by severity. It does not change any LND node code, wallet logic, or network protocol. Instead, it splits the workflow into two jobs…
Principle of least privilege: write token moved out of the model-bearing jobUntrusted input (model-generated comment) sanitized before privileged API useExternal action pinned to immutable commit SHA instead of mutable tag
This commit is a straightforward internal code cleanup in LND's channel-opening machinery. It swaps one internal type name (channeldb.OpenChannel) for another (chanstate.OpenChannel) across function signatures in the funding manager and it…
This commit fixes a bug in how the Lightning Network Daemon (LND) copies payment channel data. When the program made a copy of an HTLC (a pending payment in a Lightning channel), it failed to copy several important fields and did not prope…
Incomplete deep copy of security-relevant channel stateMissing fields in HTLC clone (RHash, OnionBlob, HtlcIndex, LogIndex)Nil-slice copy bug for Signature and ExtraData
This commit adds a new RPC called SubmitPackage to LND's WalletKit. It lets users submit a group of related Bitcoin transactions together so a zero-fee parent can be accepted because a later child transaction pays its fee. This is a featur…
New RPC endpoint gated by onchain:write macaroon permissionPackage size bounded to 25 transactions to limit deserialization workFee-rate ceiling passed through to backend; explicit 0 disables limit
This commit adds validation checks for BOLT 12 invoice requests in the LND Lightning node. It ensures that invoice requests follow protocol rules when being created (written) and received (read), rejecting malformed or non-compliant reques…
New input validation functions added for protocol messagesValidation now runs before encoding, preventing malformed outbound messagesOverflow guard added for amount*quantity calculation
This commit adds a new data structure and serialization code for BOLT 12 invoice requests in the LND Lightning node. It is purely an implementation of a protocol message format and includes a round-trip test. There is no indication in the …
This is a large dependency upgrade for the LND Lightning node software. It moves LND from older btcd Bitcoin library packages to new 'v2' packages and updates related wallet and network libraries. The commit is almost entirely mechanical i…
Large dependency upgrade touching core Bitcoin primitives (wire, txscript, chainhash, btcutil, psbt, address)Migration to new v2 module layout with API changes in address handlingPins new upstream releases (btcd 0.26.0, btcwallet 0.17.0, neutrino 0.18.0, lightning-onion 1.4.0) that may include undisclosed fixes
This commit fixes a bug in LND's DNS seed bootstrap code that could crash the node. The code assumed every record in a DNS response was an SRV record, so a non-SRV record (like a normal A or CNAME record) would cause a panic. The fix safel…
Unconditional type assertion panic in DNS fallback pathMissing bounds check on LookupHost result before array indexingMissing network deadline on manually dialed DNS TCP connection
This commit removes a temporary security workaround in a Go module file. The workaround forced the use of a newer, fixed version of a compression library (xz) to avoid a known historical vulnerability. The commit message says the library i…
Removal of a dependency-level vulnerability workaroundReference to historical advisory GHSA-25xm-hr59-7c27 in deleted commentNo code changes; only go.mod cleanup
This commit removes an old workaround in LND's dependency file (go.mod) that pinned a safe version of the 'xz' compression library. The workaround was originally added because another dependency once pulled in a vulnerable version of xz. T…
Removal of a dependency override that was a security mitigation for CVE-2021-29482Commit explicitly references the original GHSA advisory (GHSA-25xm-hr59-7c27)No actual downgrade or re-introduction of the vulnerable module is visible in the diff
This commit is a cleanup-only change that removes unnecessary loop-variable copies in Go test files. Since Go 1.22, loop variables are already scoped per-iteration, so the old `x := x` workarounds are redundant. The change affects only tes…
This commit only changes a dependency version label in LND's package manifest. The underlying code (commit 70a94ea39e9c) stays exactly the same; the dependency is simply tagged as v0.16.18 instead of being referenced by a pseudo-version. T…
This commit updates a dependency version in LND's build files. It bumps the internal 'kvdb' submodule from version 1.5.0 to 1.5.1 so that downstream projects importing kvdb directly do not pull in an older, vulnerable telemetry library (Op…
Dependency bump explicitly motivated by a known vulnerability identifier (GO-2026-4394)No source code changes in LND itself; only module metadata updatedVendor describes the root build as already unaffected, limiting direct security impact on LND
This commit removes support for obsolete Tor v2 onion addresses from the Lightning Network Daemon (lnd). Tor v2 services were shut down by the Tor network in October 2021, so lnd will no longer create, accept, or dial v2 onion addresses. H…
Removal of deprecated network protocol (Tor v2) reduces attack surface and prevents futile/unsafe dials to unreachable services.Input validation added at operator boundaries (ParseAddressString, parseAddr) to reject v2 .onion addresses with a clear error.On-disk legacy key fallback now validates decrypted key type and rejects non-v3 (RSA1024) keys before passing them to Tor.
This commit simply updates a software library dependency (neutrino) used by the Lightning Network Daemon (LND). The new version is said to add a faster way to import blockchain headers and fix a bug that could stop peer-to-peer header sync…
Dependency update to a newer tagged release of neutrinoCommit message references a 'ResetHeaderState fix' for P2P sync continuation after chain importNo direct code-level security fix is visible in the supplied diff
This commit fixes a bug in LND's remote-signing setup where zero-value previous transaction outputs were wrongly ignored when preparing a PSBT for a remote signer. The most concrete affected use case is BIP-322 message attestation, where t…
Functional denial-of-service in remote-signer BIP-322 workflows due to PSBT rejectionIncorrect zero-value UTXO validation caused legitimate outputs to be droppedFix removes Value check while preserving non-empty PkScript sanity check
Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.
AI review queuedlnwallet+channeldb: integrate LocalNonces in channel sync logicby Olaoluwa Osuntokun · 3333c84e · Mar 25, 2026 · 3 filesMessage 50 · ThinTriage 12Details
Commit message · Olaoluwa Osuntokun
lnwallet+channeldb: integrate LocalNonces in channel sync logic
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedlnwallet: add tests for LocalNonces syncby Olaoluwa Osuntokun · 665adade · Mar 25, 2026 · 1 fileMessage 55 · ThinTriage 12Details
Commit message · Olaoluwa Osuntokun
lnwallet: add tests for LocalNonces sync
55/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedlnrpc: add lncli command hint for API docs generatorby Oli · aee7eb68 · Mar 24, 2026 · 3 filesMessage 50 · ThinTriage 12Details
Commit message · Oli
lnrpc: add lncli command hint for API docs generator
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedpeer: fix nil deref in newPingPayload on BestBlockHeader errorby Elle Mouton · 9a2c4c67 · Mar 24, 2026 · 1 fileMessage 85 · StrongTriage 0Details
Commit message · Elle Mouton
peer: fix nil deref in newPingPayload on BestBlockHeader error
The condition guarding the early return used && when it should have used ||. When BestBlockHeader returns an error with a nil header, the old code only short-circuited if the nil header equalled lastBlockHeader. Otherwise it fell through to header.Serialize(), causing a nil pointer dereference panic.
Change the condition to return the cached serialized header whenever there is an error OR when the header is unchanged.
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
second-pass: broader security terminology
AI review queuedci: update pinned grpc dependency to v1.79.1by Olaoluwa Osuntokun · 54688752 · Mar 10, 2026 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Olaoluwa Osuntokun
ci: update pinned grpc dependency to v1.79.1
In this commit, we update the CI workflow pinned dependency check for google.golang.org/grpc from v1.59.0 to v1.79.1. While btcwallet only requires v1.73.0, we upgrade to the latest stable release for bug fixes and improvements.
80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
AI review queuedlnrpc: regenerate protobuf definitions for grpc v1.79.1by Olaoluwa Osuntokun · 07f2d1aa · Mar 10, 2026 · 17 filesMessage 73 · AdequateTriage 12Details
Commit message · Olaoluwa Osuntokun
lnrpc: regenerate protobuf definitions for grpc v1.79.1
In this commit, we regenerate all protobuf Go stubs to match the updated grpc and protobuf library versions. This is a mechanical change with no functional differences; the generated code simply uses the newer protobuf runtime APIs.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedmod: bump google.golang.org/grpc to v1.79.1by Olaoluwa Osuntokun · ae286f27 · Mar 10, 2026 · 2 filesMessage 68 · AdequateTriage 0Details
Commit message · Olaoluwa Osuntokun
mod: bump google.golang.org/grpc to v1.79.1
In this commit, we bump the grpc dependency from the v1.73.0 version (pulled in transitively by btcwallet) to v1.79.1 which is the latest release and includes several bug fixes. This also bumps a number of related transitive deps including google.golang.org/protobuf to v1.36.10 and several golang.org/x packages.
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 queuedlnwallet: add aux test utilsby George Tsagkarelis · 1edf8123 · Mar 4, 2026 · 1 fileMessage 78 · AdequateTriage 12Details
Commit message · George Tsagkarelis
lnwallet: add aux test utils
We add this constructor for an AuxHtlcDescriptor that allows setting some of the internal fields. This is useful for testing purposes for code external to this package that may need to extensively test the AuxHtlcView.
78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedlnwallet: add and use AuxHtlcValidator to lightning channelby George Tsagkarelis · 773b2c1c · Mar 4, 2026 · 1 fileMessage 73 · AdequateTriage 12Details
Commit message · George Tsagkarelis
lnwallet: add and use AuxHtlcValidator to lightning channel
Previously we'd perform aux bandwidth checks during path finding. This could lead to issues where multiple HTLCs where querying the same bandwidth but were not accounting for each other before being added to the commitment log. We now add a new validator function that will serve as the last point of checks before adding the HTLC to the commitment.
During path finding HTLCs could query channel bandwidth asynchronously. At this new call site all HTLCs that are about to be added to the channel have been organised in sequence, so it's safe to query bandwdith again at this point as we're getting the actual up-to-date values.
We remove the aux bandwidth check from the helper canSendHtlc, which was called from CheckHTLCTransit and CheckHTLCForward (both are methods of the htlcswitch).
For forwards we now fail at the link level, following the introduction of the AuxHtlcValidator.
For payments, we now may fail either at the pathfinding level, or at the link level. The htlcswitch may no longer fail for aux bandwidth checks.
Finally, when fetching the latest htlc view (for bandwidth checks during pathfinding) we'd silently set the nextHeight of the view to the default zero value. We now make sure to set it to the correct nextHeight value.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedinvoices: add TODO to change the return type of the queryby ziggie · e2dfd8f0 · Mar 4, 2026 · 3 filesMessage 30 · OpaqueTriage 0Details
Commit message · ziggie
invoices: add TODO to change the return type of the query
30/100 · OpaqueMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body! Contains work-in-progress language
Why it was queued
second-pass: opaque commit message
AI review queuedscripts: fix backwards compatibility test timing issuesby ziggie · f6f60649 · Mar 4, 2026 · 5 filesMessage 95 · StrongTriage 0Details
Commit message · ziggie
scripts: fix backwards compatibility test timing issues
The backwards compatibility test was failing intermittently due to two related timing issues in the test setup.
The issue was that Dave's `wait_graph_sync dave 3` was hanging for up to 60 minutes. Dave's initial gossip sync with Charlie could complete before Charlie had forwarded the alice-bob channel announcement, leaving Dave stuck at 2 channels until lnd's historical syncer fired at its default interval of 1 hour. After this 1-hour idle, some routing state had become stale, causing the subsequent payment from alice to dave to fail with FAILURE_REASON_NO_ROUTE.
This issues is now addressed by setting `--historicalsyncinterval=10s` on all nodes. This causes nodes to periodically re-sync the full gossip state from their peers every 10 seconds instead of every hour. Dave therefore picks up any missed channel announcements and routing policies within seconds, and alice's routing graph stays up-to-date throughout the test.
Additionally, lnd debug logs from all containers are now collected before teardown on failure and uploaded as a CI artifact, making future failures easier to diagnose.
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
Why it was queued
second-pass: broader security terminology
AI review queuedmulti: add --protocol.no-onion-messages flagby Gijs van Dam · aef47fd6 · Mar 2, 2026 · 5 filesMessage 68 · AdequateTriage 7Details
Commit message · Gijs van Dam
multi: add --protocol.no-onion-messages flag
This commit adds a configuration flag to disable onion messaging support. When set, lnd will: - Not advertise the onion messages feature bit (39) in init and node announcements - Skip creating the OnionEndpoint at server startup - Not register an onion message handler with peers, so incoming onion messages are not processed
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
parser or protocol pathsecond-pass: security-sensitive path
AI review queuedmulti: actor-based onion message forwardingby Gijs van Dam · ba27627a · Mar 2, 2026 · 22 filesMessage 68 · AdequateTriage 0Details
Commit message · Gijs van Dam
multi: actor-based onion message forwarding
Add onion message forwarding capability using the OnionPeerActor for communication. Messages are routed through a receptionist pattern where each peer has a dedicated OnionPeerActor for handling message sends.
The OnionEndpoint uses the sphinx router for decoding and decrypting the onion message packet and the encrypted recipient data in the payload of the onion messages.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: unusually broad change
AI review queuedpayments/db: normalize LegacyPayload flag in migration comparisonby ziggie · 00025ef3 · Feb 26, 2026 · 2 filesMessage 83 · StrongTriage 0Details
Commit message · ziggie
payments/db: normalize LegacyPayload flag in migration comparison
LegacyPayload was a hint used exclusively by the KV store to decide how to serialize and deserialize the hop payload (legacy format vs TLV). The SQL store does not serialize hop data at all — every hop field is persisted natively in its own column — so this flag has no meaning there and is never stored.
Clear LegacyPayload for all hops inside normalizePaymentForCompare so that deep-equality checks between KV and SQL payments succeed even when the KV source data carries LegacyPayload=true.
A dedicated test (TestMigrationLegacyPayloadNormalized) is added to verify that a payment with LegacyPayload=true hops migrates and compares correctly.
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
second-pass: broader security terminology
AI review queuedmod: update new direct dependency via go mod tidyby ziggie · c862e701 · Feb 25, 2026 · 1 fileMessage 45 · ThinTriage 0Details
Commit message · ziggie
mod: update new direct dependency via go mod tidy
45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Copy the core payments/db code into payments/db/migration1 and add the required sqlc-generated types/queries from sqldb/sqlc. This effectively freezes the migration code so it stays robust against future query or schema changes in the main payments package.
Replace the delegation to channeldb.ReadElement/WriteElement with self-contained, frozen implementations that only handle the exact types required by this migration package. This removes the dependency on the live channeldb codec so that future changes to channeldb serialization cannot silently corrupt or break the migration.
UnknownElementType is also defined locally for the same reason.
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 queuedpaymentsdb: fix duplicate interface check and down migration drop orderby ziggie · e9a88267 · Feb 25, 2026 · 2 filesMessage 73 · AdequateTriage 0Details
Commit message · ziggie
paymentsdb: fix duplicate interface check and down migration drop order
- Remove duplicate compile-time interface assertion for SQLStore.
- Fix the down migration to drop payment_intents before payments to respect the foreign key dependency order. This was not a bug in the first place bc we have the CASCADE when deleting payments.
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 queuedpaymentsdb: fix SettleAttempt and FailAttempt to use caller-provided timestampsby ziggie · 0c2951aa · Feb 25, 2026 · 2 filesMessage 83 · StrongTriage 0Details
Commit message · ziggie
paymentsdb: fix SettleAttempt and FailAttempt to use caller-provided timestamps
The SQL backend introduced in this PR was ignoring the SettleTime and FailTime fields provided in HTLCSettleInfo and HTLCFailInfo, instead always recording time.Now() as the resolution timestamp. The KV backend correctly serializes and deserializes these fields.
The timestamps are set by the caller using a mockable clock (p.router.cfg.Clock.Now() in payment_lifecycle.go), so ignoring them means the stored timestamp reflects when the DB write happened rather than when the event occurred, breaking deterministic testing.
This commit also extends the test assertions in assertPaymentInfo to verify that SettleTime and FailTime are correctly stored and retrieved by the SQL backend, and updates the relevant call sites to pass explicit timestamps so regressions are caught.
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
second-pass: broader security terminology
AI review queuedrouting: add TODO to also delete payments without HTLCsby ziggie · 253e4fd8 · Feb 25, 2026 · 1 fileMessage 30 · OpaqueTriage 0Details
Commit message · ziggie
routing: add TODO to also delete payments without HTLCs
30/100 · OpaqueMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body! Contains work-in-progress language
Why it was queued
second-pass: opaque commit message
AI review queuedlnrpc: fix linterby ziggie · ea4e183c · Feb 25, 2026 · 1 fileMessage 28 · OpaqueTriage 0Details
Commit message · ziggie
lnrpc: fix linter
28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedpaymentsdb: add more commentsby ziggie · bfd59aac · Feb 25, 2026 · 2 filesMessage 35 · OpaqueTriage 0Details
Commit message · ziggie
paymentsdb: add more comments
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI review queuedlnwallet: expose channel stateby bitromortac · 19860bb9 · Feb 20, 2026 · 2 filesMessage 58 · ThinTriage 12Details
Commit message · bitromortac
lnwallet: expose channel state
We create a deep copy of the channel state as we want to later expose the data structure to the rpc, which already has helper methods to marshal this representation to the rpc representation.
signing or wallet pathsecond-pass: security-sensitive path
AI review queuedgraph/db: update policy builders to support v2 fieldsby Elle Mouton · 40e3ac96 · Feb 13, 2026 · 3 filesMessage 73 · AdequateTriage 0Details
Commit message · Elle Mouton
graph/db: update policy builders to support v2 fields
Update buildChanPolicy and related functions in both KV and SQL stores to properly construct ChannelEdgePolicy with version-specific fields:
KVStore changes: - Reject non-v1 policies in updateEdgePolicy and serializeChanEdgePolicy since KV store only supports v1 gossip protocol. - Set Version to GossipVersion1 when deserializing policies from KV.
SQLStore changes: - Add isNode1 parameter to buildChanPolicy functions to properly set SecondPeer field (v2 uses SecondPeer instead of ChannelFlags direction). - Extract Version from database and populate version-specific fields: - For v1: MessageFlags, ChannelFlags, LastUpdate, ExtraOpaqueData - For v2: DisableFlags, LastBlockHeight, ExtraSignedFields - Thread isNode1 through buildChanPolicyWithBatchData and buildCachedChanPolicies call sites.
This enables the SQL store to read and reconstruct both v1 and v2 channel policies from the database with proper field mapping.
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 queuedmulti: add version to models.ChannelEdgeInfoby Elle Mouton · 4480352d · Feb 13, 2026 · 18 filesMessage 68 · AdequateTriage 8Details
Commit message · Elle Mouton
multi: add version to models.ChannelEdgeInfo
And set it to V1 version everywhere.
Add a Version field to ChannelEdgeInfo to distinguish between v1 and v2 channel announcements. Set it to GossipVersion1 for all existing channels.
Both KV and SQL stores now validate that only v1 channels are currently supported, returning an error for v2 channels. The KV store automatically sets version to v1 when deserializing (since all persisted channels in KV format are v1).
This versioning is essential for handling the different field requirements and validation logic between v1 and v2 channels.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context