EP
← All projectsElements Project

Core Lightning

Modular C implementation of the Lightning Network protocol and node stack.

BitcoinLightning NetworkNormal
Repository coverage

1855 commits in the local evidence base

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.

158security candidates263second-pass queue988AI analyses
144commits · 30 days
227commits · 60 days
805commits · 180 days
1851commits · 365 days
Backfill bands
Aug 5 → Feb 61049 seen37 candidatesComplete
Feb 6 → Jun 6579 seen10 candidatesComplete
Jun 6 → Jul 678 seen1 candidatesComplete
Jul 6 → Aug 5147 seen16 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

70/100 average clarity
431Strong · 80–100
1164Adequate · 60–79
231Thin · 40–59
29Opaque · 0–39
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
dovgopoly1502164
Rusty Russell95873435072
Sangbida Chaudhuri14731124066
Dusty Daemon771358066
ShahanaFarooqui931035063
daywalker9090580062
Níckolas Goline40540076
Lagrang376458069
Christian Decker36411072
Vincenzo Palazzo838080
Chandra Pratap56250082
ekzyis222063
Analysis record

Published AI watches

Last scanned 1 hour ago

Informational 15 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

Revert "doc: require Homebrew GNU make and gpatch on macOS"

This commit is a simple documentation revert. It undoes a previous change that told macOS users to install GNU make and GNU patch from Homebrew and to put those tools first in their command path. The reverted instructions now omit gpatch a…

0cfa949fby Sangbida Chaudhuri+4−81 file
No security note in commit
Informational 15 AI analysisMessage 75 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

Revert "tests: drop obsolete x-prefix in compacter-slow.sh"

This commit re-adds an old-style 'x' prefix to a string comparison in a test helper script. It is a test-only change with no effect on the actual Core Lightning node software, user funds, network behavior, or security. The change simply re…

116fd7cdby Sangbida Chaudhuri+1−11 file
No security note in commit
Informational 15 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

doc: require Homebrew GNU make and gpatch on macOS

This commit only updates macOS installation instructions in the documentation. It tells macOS users to install newer GNU versions of 'make' and 'patch' from Homebrew because Apple's built-in tools are too old for building and running sourc…

d3ff1474by Sangbida Chaudhuri+8−41 file
No security note in commit
Informational 15 AI analysisMessage 83 · Strong
EP Elements ProjectCore Lightning BitcoinLightning Network

tests: drop obsolete x-prefix in compacter-slow.sh

This commit is a trivial shell script cleanup. It removes an old-fashioned 'x' prefix from a string comparison in a test helper script so that a newer version of the Shellcheck linter stops warning about it. The change does not alter progr…

474c272aby Sangbida Chaudhuri+1−11 file
No security note in commit
Informational 18 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

common: hoist amount+currency parsing into common code.

This commit moves existing code that parses payment amounts (Bitcoin millisatoshis, 'any' amount, or fiat currency amounts) from one plugin file into a shared library so it can be reused by a future feature. It is a code refactoring with n…

Refactoring of amount-parsing code into a shared helperAddition of explicit u64 overflow guards (mul_overflows_u64, add_overflows_u64) in the new common codeNo change to wire protocol or RPC interface semantics
e0f86c17by Rusty Russell+112−723 files
No security note in commit
Informational 17 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

lightningd: internal cleanups since all non-command JSON IDs are strings.

This is a routine internal cleanup commit in Core Lightning. It removes an unused helper function and simplifies how JSON-RPC request IDs are stored and formatted, since the project now always uses string IDs for non-command JSON traffic. …

No security-relevant keywords in commit title or messageNo CVE, advisory, or bug reference presentChanges are refactor/cleanup in nature
a70ae963by Rusty Russell+25−378 files
No security note in commit
Informational 15 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

common: hoist hash_str helper into its own header.

This commit is a routine code cleanup: it moves a small string-hashing helper function into a shared header file so it can be reused without being copied and pasted. There is no change to behavior, no bug fix, and no security relevance.

581bbb1fby Rusty Russell+16−176 files
No security note in commit
Informational 23 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

downgrade: we need to remove "impressions" from askrene datastore when downgrading to v26.06.

This is a database downgrade helper fix, not a live network vulnerability. Core Lightning's downgrade tool previously failed to strip out new 'channel impression' records when rolling a database back to version v26.06. The patch teaches th…

Database downgrade path could leave incompatible records in older schemaOffline tool only; no remote or on-chain triggerFix prevents potential node startup failure after version rollback
4d926285by Rusty Russell+43−111 file
No security note in commit
Low 31 AI analysisMessage 68 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

downgrade tool: fix invalid memory bug

This commit fixes a typo in a database downgrade helper tool. The bug caused the tool to pass a negative number (turned into a huge positive size) when copying data, which led to an out-of-memory (OOM) error. The fix swaps two variable nam…

Integer underflow / negative-to-size_t wrap leading to excessive allocationOut-of-memory crash in maintenance toolMemory corruption potential if allocation somehow succeeded
42995326by Lagrang3+8−81 file
No security note in commit
Informational 24 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

xpay: actually tell askrene when a payment succeeded.

This commit fixes a bookkeeping bug in Core Lightning's xpay plugin. Previously, when a payment succeeded, xpay did not tell the askrene routing-helper that the route worked. As a result, askrene kept stale or overly pessimistic ideas abou…

Missing success feedback to routing layer can degrade payment reliabilityStale negative impressions may bias future path selection toward worse or failing routesNo direct funds-loss primitive is introduced or fixed
a66fabd4by Rusty Russell+40−02 files
No security note in commit
Low 49 AI analysisMessage 58 · Thin
EP Elements ProjectCore Lightning BitcoinLightning Network

askrene: correctly order constraints.

This commit fixes a bug in Core Lightning's routing helper (askrene) where two kinds of channel information—hard limits called 'constraints' and usage estimates called 'impressions'—were being applied in the wrong order. Because impression…

Routing decision bug caused by incorrect ordering of time-relative channel statePotential payment failure or acceptance of an over-capacity routeRegression test added demonstrating incorrect route acceptance before fix
4b6fe4a1by Rusty Russell+211−1182 files
No security note in commit
Low 35 AI analysisMessage 68 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

askrene: don't leak channel intel entries

This commit fixes a memory leak in the askrene plugin of Core Lightning. When individual channel intelligence entries were deleted, the code removed the entry from its array but forgot to free two internal pointers (impression and constrai…

Memory leak in plugin data structure cleanupMissing deallocation of nested pointers before array removalFix located in routing/intelligence plugin (askrene)
8891f414by Lagrang3+5−01 file
No security note in commit
Informational 15 AI analysisMessage 70 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

xpay: tests should expect the new error messages

This commit only updates test files so that automated checks expect slightly different error wording from the xpay payment command. It does not change any production code, so it cannot introduce a security vulnerability or fix one on its o…

0b67601fby Lagrang3+24−32 files
No security note in commit
Low 43 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

offers: limit invoices to 10 minutes for recurring offers in other currencies.

This change tightens the lifetime of recurring invoices priced in foreign currencies (like USD) to 10 minutes by default, and refreshes them with current exchange rates when they expire. Previously, such invoices could remain valid for the…

Fixes stale exchange-rate exposure for currency-denominated recurring invoicesAdds configurable expiry cap for recurring currency invoicesDistinguishes user-cancellation (0s expiry) from natural expiry to avoid misleading errors
446312cfby Rusty Russell+134−148 files
No security note in commit
Low 45 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

offers: limit expiry to offer limit, or 10 minutes with currency conversion.

This commit tightens the expiration time on invoices created from BOLT12 offers. Previously, all such invoices defaulted to a 2-hour payment window. Now, if the offer has an absolute expiry, the invoice expires when the offer expires; and …

BOLT12 invoice expiry now bounded by offer absolute expiryCurrency-converted invoices use short expiry to limit exchange-rate exposureNew regression test added for expiry behavior
a6cf4915by Rusty Russell+55−22 files
No security note in commit
Low 29 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

fetchinvoice: don't bother with checking recurrence timing.

This commit removes local timing checks in Core Lightning's fetchinvoice plugin for recurring payments. Instead of the plugin refusing too-early or too-late invoice requests, it now lets the remote node decide and report back. The change i…

Removal of local input-validation checks for recurring invoice requestsReliance on remote-party enforcement for recurrence period limits and pay windowsTest expectations changed from local rejection to remote failure messages
3e49d908by Rusty Russell+2−682 files
No security note in commit
Low 32 AI analysisMessage 73 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

lightningd: don't do previous invoice checking in createinvoicerequest.

This commit removes a local sanity check in Core Lightning's experimental 'createinvoicerequest' command. Previously, when creating a recurring invoice request, the code looked up past payments by label to verify the previous recurrence wa…

Removal of local payment-state validation for recurring invoice requestsParameter rename from recurrence_label to label in internal RPC callsTest expectations changed from local 'previous invoice has not been paid' errors to remote failure messages
4348d8acby Rusty Russell+5−1224 files
No security note in commit
Low 35 AI analysisMessage 65 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

fetchinvoice: handle weird labels in recurrence_label parameter.

This commit fixes how the fetchinvoice plugin handles user-supplied labels that contain special characters such as backslashes, quotes, tabs, and newlines. Previously these labels were passed as raw strings, which could cause JSON encoding…

JSON injection / improper escaping of user-controlled input passed between RPC componentsPotential mismatch between label parsing and label serialization leading to functional failures or unexpected behaviorFix is narrowly scoped to a single plugin and parameter
d7f87f2dby Rusty Russell+37−102 files
No security note in commit
Informational 15 AI analysisMessage 70 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

Add unit tests for str_to_u64

This commit only adds a new automated test file that checks how a helper function (str_to_u64) converts text strings to unsigned 64-bit integers. It does not change any production code, so it cannot by itself introduce a security vulnerabi…

dddb455dby Lagrang3+203−01 file
No security note in commit
Informational 15 AI analysisMessage 78 · Adequate
EP Elements ProjectCore Lightning BitcoinLightning Network

pytest: add tests for what we want askrene to do.

This commit only adds a new pytest test file. It does not change any production code. The test describes desired future behavior for the askrene routing module's error messages when a payment source or destination lacks enough channel capa…

518620aeby Rusty Russell+67−01 file
No security note in commit
Repository ledger

Explore captured commits

Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.

Lower-priorityci: Enable sccache compiler cache for Rust and Cby Christian Decker · 381f94a6 · Feb 24, 2026 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Christian Decker

ci: Enable sccache compiler cache for Rust and C

[ Cherry-picked from another PR, and read the docs which say you have
to set SCCACHE_GHA_ENABLED to get inter-job caching! --RR ]

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
documentation-only discount
Lower-priorityccan: import new version to change vsprintfs to vsnprintfsby Sangbida Chaudhuri · 6d252dca · Feb 23, 2026 · 4 filesMessage 50 · ThinTriage 0Details
Commit message · Sangbida Chaudhuri

ccan: import new version to change vsprintfs to vsnprintfs

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-prioritymisc: fix uninitialised errors for macOSby Sangbida Chaudhuri · c22538ec · Feb 23, 2026 · 4 filesMessage 60 · AdequateTriage 0Details
Commit message · Sangbida Chaudhuri

misc: fix uninitialised errors for macOS

MacOS SDK is quite strict so treats these uninitialised variable warnings as errors.

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-prioritylightningd: honor `payment-fronting-node` when making bolt12 offers.by Rusty Russell · 9eee744d · Feb 23, 2026 · 5 filesMessage 65 · AdequateTriage 0Details
Commit message · Rusty Russell

lightningd: honor `payment-fronting-node` when making bolt12 offers.

We use all the fronting nodes when creating offers.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-prioritylightningd: don't assert if plugin crashes early.by Rusty Russell · 611341dd · Feb 23, 2026 · 1 fileMessage 80 · StrongTriage 0Details
Commit message · Rusty Russell

lightningd: don't assert if plugin crashes early.

If a plugin exits early, we will not exit with ret == plugins: return
from this function and we will exit because ld->exit_code is set.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Lower-priorityoffers: allow explicit fronting nodes for an offer.by Rusty Russell · 64e45192 · Feb 23, 2026 · 12 filesMessage 73 · AdequateTriage 0Details
Commit message · Rusty Russell

offers: allow explicit fronting nodes for an offer.

The next commit makes us honor these when issuing a payment.

Changelog-Added: JSON-RPC: `offer` now has a `fronting_nodes` option to specify neighbors for payer to use to fetch invoices and make payments.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-prioritylibplugin: support multi options.by Rusty Russell · c168f6a7 · Feb 23, 2026 · 5 filesMessage 58 · ThinTriage 0Details
Commit message · Rusty Russell

libplugin: support multi options.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: libplugin: support for options which accumulate if specified more than once ("multi": true).

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
Lower-prioritylightningd: add payment-fronting-node option.by Rusty Russell · 2a1f647b · Feb 23, 2026 · 4 filesMessage 68 · AdequateTriage 0Details
Commit message · Rusty Russell

lightningd: add payment-fronting-node option.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Config: `payment-fronting-node` option to specify neighbor node(s) to use for all bolt11 invoices, bolt12 offers, invoices and invoice_requests.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-priorityoffers: honor `payment-fronting-nodes` when creating invoices.by Rusty Russell · ae21089a · Feb 23, 2026 · 2 filesMessage 65 · AdequateTriage 0Details
Commit message · Rusty Russell

offers: honor `payment-fronting-nodes` when creating invoices.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-priorityoffers: modify find_best_peer() to only select from fronting nodes if set.by Rusty Russell · 25e2374f · Feb 23, 2026 · 4 filesMessage 65 · AdequateTriage 0Details
Commit message · Rusty Russell

offers: modify find_best_peer() to only select from fronting nodes if set.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-prioritylightningd: honor `payment-fronting-node` when making bolt11 invoices.by Rusty Russell · 5ecb1ef2 · Feb 23, 2026 · 3 filesMessage 65 · AdequateTriage 0Details
Commit message · Rusty Russell

lightningd: honor `payment-fronting-node` when making bolt11 invoices.

We use all the fronting nodes when creating invoices.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-priorityoffers: only use blinded path nodes from offers when creating invoice for invoice_request.by Rusty Russell · 9fa7c937 · Feb 23, 2026 · 2 filesMessage 65 · AdequateTriage 0Details
Commit message · Rusty Russell

offers: only use blinded path nodes from offers when creating invoice for invoice_request.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-priorityoffers: honor `payment-fronting-nodes` when creating invoice_requests.by Rusty Russell · cff488d4 · Feb 23, 2026 · 2 filesMessage 65 · AdequateTriage 0Details
Commit message · Rusty Russell

offers: honor `payment-fronting-nodes` when creating invoice_requests.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI review queuedoffers: encapsulate globals in plugin_get_data()by Rusty Russell · 572d4db8 · Feb 23, 2026 · 7 filesMessage 68 · AdequateInformational 15Details
Commit message · Rusty Russell

offers: encapsulate globals in plugin_get_data()

This is how modern plugins do it, and it has the benefit of not
requiring extra code for memleak tracking.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

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 analysis · Informational 15/100

This commit is a straightforward internal code cleanup in the Core Lightning 'offers' plugin. It moves several global variables into a single per-plugin data structure and provides a helper function to access them. There is no change to user-facing behavior, no bug fix, and no security-related change described in the commit or diff.

Security candidateBuild: don't use HAVE_FUNCTION_SECTIONS for update-mocks.by Rusty Russell · 15ef2fd3 · Feb 23, 2026 · 4 filesMessage 85 · StrongInformational 15Details
Commit message · Rusty Russell

Build: don't use HAVE_FUNCTION_SECTIONS for update-mocks.

I ran `uv run make update-mocks` and many mocks vanished. But that
broke MacOS (and maybe other archs) which doesn't support function
sections and no longer linked.

If this proves problematic, we might end up generating mocks properly:
1. Use #include "mocks-sphinx-xor_cipher_stream_gen.c"
2. Generate those separate files as necessary.
3. Don't commit them, build them locally.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

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
boot or update path
AI analysis · Informational 15/100

This is a build-system fix for a developer-only mock-generation script. It stops using a compiler feature (function sections) that is unsupported on macOS, which had caused test builds to fail after mocks were regenerated. There is no runtime security issue or user impact.

Lower-prioritypytest: fix flake in test_reconnect_remote_sends_no_sigsby Rusty Russell · 1e608584 · Feb 23, 2026 · 1 fileMessage 83 · StrongTriage 0Details
Commit message · Rusty Russell

pytest: fix flake in test_reconnect_remote_sends_no_sigs

Actual order could be either way:

```
FAILED tests/test_connection.py::test_reconnect_remote_sends_no_sigs - AssertionError: assert ['peer_in', 'peer_out'] == ['peer_out', 'peer_in']

At index 0 diff: 'peer_in' != 'peer_out'

Full diff:
[
+ 'peer_in',
'peer_out',
- 'peer_in',
]
```

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Lower-prioritypytest: really fix race in test_buy_liquidity_ad_check_bookkeepingby Rusty Russell · 7b69f5f6 · Feb 23, 2026 · 1 fileMessage 85 · StrongTriage 0Details
Commit message · Rusty Russell

pytest: really fix race in test_buy_liquidity_ad_check_bookkeeping

I thought I fixed this in b15f386df66b31b55e50bb55195bbf835ad1c4c8,
but it happened again, because my fix was insufficent! "all([])" is
true, and we want to make sure the channel really has been seen.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Lower-prioritypytest: fix test_sendpay_grouping regex.by Rusty Russell · 113d2e80 · Feb 23, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · Rusty Russell

pytest: fix test_sendpay_grouping regex.

It doesn't match "after 10 attempts":

```
with pytest.raises(RpcError, match=r'Ran out of routes to try after [1-9]+ attempts'):
> l1.rpc.pay(inv, amount_msat='100001msat')

tests/test_pay.py:5250:
...
elif "error" in resp:
> raise RpcError(method, payload, resp['error'])
E pyln.client.lightning.RpcError: RPC call failed: method: pay, payload: {'bolt11': 'lnbcrt1p5evy5ksp5ndq75geqkggp9jvkal5e36mwpyppf0vm8ftzv7qqv9plkw2u5hkspp53rw3mkve9896muty6wzpjxc6ucau0cvekmakg6ta5h5v0ar07m6qdq8v3jhxccxqyjw5qcqp9rzjqvuytqpdyk6wqaxvl47d3vee5swuwklej79qxjqqg394r4ptqaue5qqqvuqqqqgqqqqqqqqpqqqqqzsqqc9qxpqysgq53phr29544luhuduaqjajvj8d54yep69sy6cqtesk2t3q83htsas8nhluh9jjqm4se274pzzg8ma943xe8a5sg7d286n2vttraqd7dsq8s7k84', 'amount_msat': '100001msat'}, error: {'code': 210, 'message': 'Ran out of routes to try after 10 attempts: see `paystatus`', 'attempts': [{'status': 'failed', 'failreason': 'failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)', 'partid': 0, 'amount_msat': 100001}, {'status': 'pending', 'failreason': 'No path found', 'partid': 1, 'amount_msat': 100001, 'parent_partid': 0}, {'status': 'failed', 'failreason': 'failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)', 'partid': 2, 'amount_msat': 51394, 'parent_partid': 1}, {'status': 'failed', 'failreason': 'failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)', 'partid': 4, 'amount_msat': 51394, 'parent_partid': 2}, {'status': 'failed', 'failreason': 'No path found', 'partid': 6, 'amount_msat': 51394, 'parent_partid': 4}, {'status': 'failed', 'failreason': 'No path found', 'partid': 7, 'amount_msat': 51394, 'parent_partid': 6}, {'status': 'failed', 'failreason': 'failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)', 'partid': 3, 'amount_msat': 48607, 'parent_partid': 1}, {'status': 'failed', 'failreason': 'failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)', 'partid': 5, 'amount_msat': 48607, 'parent_partid': 3}, {'status': 'failed', 'failreason': 'failed: WIRE_TEMPORARY_CHANNEL_FAILURE (reply from remote)', 'partid': 8, 'amount_msat': 48607, 'parent_partid': 5}, {'status': 'failed', 'failreason': 'No path found', 'partid': 9, 'amount_msat': 48607, 'parent_partid': 8}]}

```

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Mentions testing or verification
Lower-prioritypytest: fix flake in test_gossip_store_compact_while_extending and test_gossmap_lost_nodeby Rusty Russell · 0240882d · Feb 23, 2026 · 1 fileMessage 83 · StrongTriage 0Details
Commit message · Rusty Russell

pytest: fix flake in test_gossip_store_compact_while_extending and test_gossmap_lost_node

node_factory.line_graph waits until all nodes have seen all channels,
not all node announcements, so we can get this:

```
> assert post_nodes == pre_nodes
...
E Full diff:
E [
E {
E + 'addresses': [],
E + 'alias': 'JUNIORYARD-b2d9563',
E + 'color': '02287b',
E + 'features': '808898880a8a59a1',
E + 'last_timestamp': 1771565748,
E 'nodeid': '02287bfac8b99b35477ebe9334eede1e32b189e24644eb701c079614712331cec0',
E },
E {
E 'addresses': [],
E 'alias': 'SILENTGOPHER-b2d9563',
E 'color': '033845',
E 'features': '808898880a8a59a1',
...
tests/test_gossip.py:1710: AssertionError
```

Since the same pattern occurs in test_gossmap_lost_node, fix that too.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI review queueddb: add STRICT tables with migration for old databasesby wqxoxo · f318c13b · Feb 23, 2026 · 10 filesMessage 98 · StrongLow 47Details
Commit message · wqxoxo

db: add STRICT tables with migration for old databases

Enables STRICT tables in developer mode, but old databases (~2019) may
have BLOB values in TEXT columns. Migration converts BLOB faildetail
to TEXT with UTF-8 validation, NULLs invalid data.

STRICT is only applied to fresh databases; existing databases being
upgraded skip STRICT to avoid type affinity issues with legacy data.

Also adds security pragmas in developer mode: trusted_schema=OFF,
cell_size_check=ON.

Fixes #5390.

Changelog-Added: Database: STRICT tables and security pragmas in developer mode
Changelog-Fixed: Database migration for old BLOB-typed faildetail values

98/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Low 47/100

This commit hardens Core Lightning's SQLite database handling in developer mode by adding STRICT table enforcement and two security-related SQLite pragmas. It also adds a migration that cleans up old database entries where a text column accidentally stored binary data, converting them to text or wiping them if they aren't valid text. The changes are defensive: they reduce the chance of unexpected data types causing bugs or security issues, but they do not by themselves fix a known exploitable vulnerability.

AI review queuedrenepay: refactor and bugfixesby Lagrang3 · 580c2f78 · Feb 23, 2026 · 8 filesMessage 70 · AdequateLow 47Details
Commit message · Lagrang3

renepay: refactor and bugfixes

We remove the auxiliary RPC renesenday (only used internally) in favor
of a function that builds the onion, stores the shared secrets
needed to recover the onion reply, and calls sendonion/injectpaymentonion.

This solves a concurrency race
```
**BROKEN** plugin-cln-renepay: Unable to parse sendpay_failure
```
in which we are waiting for renesenday to return in order to record the shared
secrets but we get the a sendpay_failure notification with an onionreply
before we have secrets to decode it.

It also solves a missing JSON id seen in the logs
```
DEBUG plugin-cln-renepay: JSON reply with unknown id
```
because renesendpay was using his command variable to issue an RPC
to sendonion/injecpaymentonion and would fail or succeed the command
before those RPCs were done. This also meant that the callback
functions were silently being ignored.

Changelog-Fixed: renepay: fixes a race condition that leads to **BROKEN** plugin-cln-renepay: Unable to parse sendpay_failure

Signed-off-by: Lagrang3 <lagrang3@protonmail.com>

70/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
second-pass: broader security terminology
AI analysis · Low 47/100

This commit fixes a timing bug in Core Lightning's experimental 'renepay' payment plugin. Previously, the plugin used an internal helper command (renesendpay) to send payment routes. Because of the way commands were chained, the plugin could receive a failure notification with an encrypted onion reply before it had saved the secrets needed to decode that reply. That caused error messages and could prevent the plugin from correctly learning why a payment failed. The fix builds the onion and stores the shared secrets directly before calling sendonion/injectpaymentonion, removing the race condition.

Lower-priorityfuzz: fix uninitialized variable in fuzz-handle_onion_messageby wqxoxo · f2fcd6b0 · Feb 23, 2026 · 1 fileMessage 83 · StrongInformational 17Details
Commit message · wqxoxo

fuzz: fix uninitialized variable in fuzz-handle_onion_message

Changelog-Fixed: fuzz: fix build with newer clang.

Fixes: #8683

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 17/100

This commit fixes a fuzz-test build issue in Core Lightning. A fuzz test is an automated testing tool, not the live Lightning node software. The change moves a variable declaration and initializes it to NULL so newer versions of the Clang compiler no longer complain about a potentially uninitialized variable when the test's error-recovery path is taken. It does not appear to fix a vulnerability in production code.

Lower-priorityAdd `-O2` in armv7 Docker build following bug fix Changelog-Noneby Raimo33 · aa3f2469 · Feb 20, 2026 · 1 fileMessage 65 · AdequateTriage 0Details
Commit message · Raimo33

Add `-O2` in armv7 Docker build following bug fix
Changelog-None

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Lower-prioritypytest: fix flake in test_gossip_force_broadcast_channel_msgsby Rusty Russell · 21c2c0f9 · Feb 20, 2026 · 1 fileMessage 83 · StrongTriage 0Details
Commit message · Rusty Russell

pytest: fix flake in test_gossip_force_broadcast_channel_msgs

With the extra padding pings, we can get more!

```
# Make sure the noise is within reasonable bounds
assert tally['query_short_channel_ids'] <= 1
assert tally['query_channel_range'] <= 1
> assert tally['ping'] <= 3
E assert 4 <= 3

tests/test_gossip.py:2396: AssertionError
```

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Lower-prioritypytest: make test_no_delay more robust.by Rusty Russell · d0c158a6 · Feb 20, 2026 · 8 filesMessage 78 · AdequateTriage 0Details
Commit message · Rusty Russell

pytest: make test_no_delay more robust.

Unfortunately the effect of leaving Nagle enabled is subtle. Here it
is in v25.12:

Normal:
tests/test_connection.py::test_no_delay PASSED
====================================================================== 1 passed in 13.87s

Nagle enabled:
tests/test_connection.py::test_no_delay PASSED
====================================================================== 1 passed in 21.70s

So it's hard to both catch this issue and not have false positives. Improve the
test by deliberately running with Nagle enabled, so we can do a direct comparison.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification