EL
← All projectsElectrum

Electrum

Long-running lightweight Bitcoin wallet for desktop and mobile platforms.

BitcoinSoftware walletsNormal
Repository coverage

924 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.

64security candidates205second-pass queue89AI analyses
55commits · 30 days
108commits · 60 days
454commits · 180 days
924commits · 365 days
Backfill bands
Aug 5 → Feb 6470 seen11 candidatesComplete
Feb 6 → Jun 6346 seen10 candidatesComplete
Jun 6 → Jul 653 seen2 candidatesComplete
Jul 6 → Aug 554 seen3 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.

65/100 average clarity
191Strong · 80–100
409Adequate · 60–79
285Thin · 40–59
39Opaque · 0–39
2security candidates with opaque commit messaging
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
SomberNight3492533063
f321x3712134070
Sander van Grieken981012057
ThomasV7223056
user322062
Roman Zeyde511053
Sasha Zykov412076
Aaron Fiore411068
Ferdinando Ametrano111096
Oren200043
Ilya Artemov200050
Felipe Micaroni Lalli100050
Analysis record

Published AI watches

Last scanned 50 minutes ago

Informational 19 AI analysisMessage 96 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: strip whitespaces in GUIs, do not strip in CLI

This commit tidies up how Electrum handles extra spaces around Bitcoin addresses, messages, and signatures when signing or verifying messages. Previously, different parts of the program (desktop GUI, mobile-style GUI, command line) behaved…

Behavior normalization across GUI and CLI interfacesNo cryptographic primitive changedNo privilege boundary crossed
4c3064f5by SomberNight+27−185 files
No security note in commit
Informational 22 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: decrypt_message: nicer error msg if pubkey is unrelated

This commit improves the error handling in Electrum's message decryption feature. Previously, if a user tried to decrypt a message using a public key that did not belong to their wallet, the code could proceed and likely fail with a confus…

Input validation added for public key before cryptographic operationUser-facing exception replaces potential internal failureDefensive check prevents use of unrelated key material
92e938f4by SomberNight+5−01 file
No security note in commit
Low 29 AI analysisMessage 35 · Opaque
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: force kwargs

This commit changes how Electrum's message-signing function is called so that callers must explicitly name each argument (address, message, password) rather than passing them by position. The main practical effect is to prevent accidental …

API hardening: keyword-only arguments prevent positional argument swapNo explicit security bug fix or vulnerability disclosure in commit message or diffNo changes to cryptographic logic, password handling, or message parsing
e1eb2a34by SomberNight+9−44 files
No security note in commit
Low 39 AI analysisMessage 45 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: consolidate checks from UIs

This commit moves input-validation checks for signing, verifying, encrypting, and decrypting messages out of the user-interface code and into the shared wallet logic. It also adds type checks so that non-text inputs are rejected earlier. T…

Input validation moved from UI controllers into core wallet logicType checks added at the CLI command entry points for message-crypto operationsUserFacingException used consistently for address, wallet, script-type, and key-format errors
48893760by SomberNight+89−396 files
No security note in commit
Low 27 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: decrypt_message: consolidate checks from UIs

This commit moves input-validation and wallet-type checks for message decryption out of the user-interface and command-line layers and into the core wallet code. It also removes a faster, separate decryption path for imported wallets so al…

Input validation consolidated into a single core methodWatching-only wallet check moved from UI to wallet layerMultisig wallet unsupported-operation check moved from UI to wallet layer
9a0cc0d6by SomberNight+25−173 files
No security note in commit
Informational 15 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: refactor: add encrypt_message method, consolidated from UIs

This commit is a simple code cleanup: it moves the message-encryption logic from two separate places (the command-line tool and the Qt graphical interface) into a single shared method on the wallet class. The actual encryption behavior is …

No change to cryptographic primitives or parametersNo change to trust boundaries or input sourcesPure refactor consolidating duplicate code
5e9c8df0by SomberNight+26−183 files
No security note in commit
Informational 13 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: refactor: add verify_message method, consolidated from UIs

This commit is a routine code cleanup: it moves message-signature verification out of three user-interface files into a single shared helper method in the wallet module. There is no security-relevant behavior change visible in the diff. Th…

No security-relevant functional changeRefactoring only: code deduplicationException handling broadened safely (ValueError covers binascii.Error and unicode errors)
ff5bbb04by SomberNight+26−304 files
No security note in commit
Informational 19 AI analysisMessage 96 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

qml: strip whitespace from message before signing, as in qt gui

This commit fixes a minor consistency bug in Electrum's newer QML (mobile-style) user interface. When signing a message, the app now removes accidental spaces at the start or end of the message and address, just like the older desktop Qt i…

Behavioral inconsistency between GUI implementations could cause user confusion or failed verificationNo cryptographic weakness introduced; change is input normalizationNo memory-unsafe code, no privilege changes, no network changes
72507328by Ferdinando Ametrano+3−01 file
No security note in commit
Moderate 52 AI analysisMessage 93 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

lnwallet: don't blacklist htlc failures without channel update

This change fixes how Electrum's Lightning wallet reacts when a payment route fails but the failing node no longer provides a channel update message, as now allowed by the Lightning protocol spec. Previously, Electrum would permanently bla…

Denial-of-service via over-blacklisting: prior behavior could cause legitimate channels to be blacklisted, degrading payment success and potentially isolating the wallet from usable routes.Spec compliance fix: aligns Electrum with updated Lightning BOLT protocol behavior.No cryptographic bypass or funds theft signal: the change is about routing policy, not key leakage or transaction authorization.
a865e336by f321x+48−142 files
No security note in commit
Informational 15 AI analysisMessage 35 · Opaque
EL ElectrumElectrum BitcoinSoftware wallets

hww/qt: followup 898a4c270

This commit simply renames an internal variable from `dialog_label` to `_dialog_label` to mark it as private. It is a minor code cleanup with no visible behavior change and no security relevance.

f3af41deby f321x+4−41 file
No security note in commit
Low 25 AI analysisMessage 68 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

trezor: drop session after closing it

This commit fixes a bug in Electrum's support for Trezor hardware wallets. After a Trezor session times out or is closed, Electrum now forgets the old session ID. Previously it kept the stale session ID, so the next attempt to sign a trans…

Fixes a stale-session reference that caused InvalidSessionError on re-authenticationEnsures PIN re-prompt after session timeout/closureFailure mode was denial-of-service (transaction signing crash), not unauthorized signing
071b1e24by f321x+8−51 file
No security note in commit
Informational 12 AI analysisMessage 83 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

test_lnwallet: add unittest for unchanged channel update from failed htlc

This commit only adds a new unit test to Electrum's Lightning wallet test suite. It checks that when a payment fails due to a temporary lack of liquidity (TEMPORARY_CHANNEL_FAILURE) and the accompanying channel policy update is identical t…

Lightning payment routing failure handling behavior is being testedTEMPORARY_CHANNEL_FAILURE no longer (or is confirmed not to) blacklist channels when the channel update is unchangedLiquidity hints are used as an alternative to blacklisting for retry amounts
1f5b9adbby f321x+61−21 file
No security note in commit
Informational 15 AI analysisMessage 83 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

test_lnwallet: add unittest for single channel mpp split config

This commit adds a new automated test to the Electrum project. It does not change any production wallet or Lightning code. The test verifies that when Electrum splits a multi-part payment across a single channel, all payment parts actually…

14f7fa0bby f321x+22−01 file
No security note in commit
Low 47 AI analysisMessage 80 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

json_db: set_modified after incomplete data

This commit fixes a bug in Electrum's wallet storage recovery. If a wallet file was partially corrupted (a 'patch' was cut off mid-write), the app could recover the old data but then fail to mark the wallet as changed. As a result, later u…

Data-loss / integrity failure in wallet storage recovery pathMissing dirty flag after fallback data recoveryAppend-only storage file not rewritten after corruption cleanup
f75f1958by f321x+22−12 files
No security note in commit
Low 44 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet_db: register onion_keys converter

This commit fixes a bug in Electrum's Lightning wallet database handling. After a wallet restart, a specific type of encryption key used in Lightning payments was being loaded as a text string instead of raw bytes. This mismatch could caus…

Type confusion between str and bytes in cryptographic key handlingLightning payment error path affected after wallet restartMissing data converter in wallet database layer
5b2eb060by f321x+2−02 files
No security note in commit
Informational 18 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

qml: update ConfirmTxDialog onValidChanged

This is a small user-interface fix for the Electrum mobile/QML app. When sweeping private keys, the confirmation dialog that shows how much money will be moved initially displayed an amount of 0 because it did not refresh after the transac…

bd776e24by f321x+3−01 file
No security note in commit
Informational 18 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qml: emit a single dataChanged when updating blockchain height

This change is a performance cleanup in Electrum's mobile/QML user interface. When the wallet learns that the Bitcoin blockchain has grown taller, it now refreshes the transaction list with a single 'everything changed' signal instead of s…

No security-relevant logic changePerformance/efficiency optimization onlyNo input validation, parsing, cryptography, or network changes
fbe9e2d8by f321x+8−41 file
No security note in commit
Informational 20 AI analysisMessage 85 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

qml: don't compute notification balance delta for large tx batches

This commit is a performance fix, not a security patch. It stops the Electrum mobile/QML wallet from calculating the total balance change when more than 20 new transactions arrive at once, because that calculation could freeze the user int…

No security-relevant signal present in the diff or commit messagePerformance/DoS mitigation against accidental UI freezing from large transaction batches
7b4759c5by f321x+5−21 file
No security note in commit
Informational 15 AI analysisMessage 60 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qml: change event callback logs to debug

This commit simply changes two logging messages from 'info' level to 'debug' level in the mobile/QML wallet interface. It reduces routine log output when many transactions occur. There is no security-relevant change.

a6cc4e08by f321x+2−21 file
No security note in commit
Informational 18 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qml: don't force-build address model from tx event handlers

This is a performance and responsiveness fix for the Electrum mobile/QML wallet. It stops the app from doing heavy work (building the address coin list) every time a new transaction arrives, which was causing the user interface to freeze. …

35fc4a13by f321x+4−21 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-prioritytests: try to make "backup" regtest less flakyby SomberNight · 5828b738 · May 20, 2026 · 3 filesMessage 78 · AdequateTriage 0Details
Commit message · SomberNight

tests: try to make "backup" regtest less flaky

Kind of shooting in the dark, but looking at logs, when the "backup" test fails,
Alice logs "Sending CHANNEL_REESTABLISH" and "Sending ERROR", but
Bob never receives them, instead he logs "Disconnecting: LightningPeerConnectionClosed()".
Maybe Alice's TCP socket should just be flushed, as done here.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Lower-prioritysubmarine_swaps: wait for broadcast in wait_for_htlcs_and_broadcastby f321x · 2a1eda4c · May 20, 2026 · 1 fileMessage 83 · StrongTriage 0Details
Commit message · f321x

submarine_swaps: wait for broadcast in wait_for_htlcs_and_broadcast

Wait for broadcast of the funding transaction in
`SwapManager.wait_for_htlcs_and_broadcast` before returning.
Previously it might have returned the swap funding txid before the
funding tx was broadcast.
This caused the regtest `test_swapserver_success_forward` to fail
as it expected the funding tx to be broadcast once the CLI command
returned.

See:
```
.***** test_swapserver_success_forward ******
initializing alice
funding alice
ec354953f96e0de7be4354ab156611da9e31bd85c2d25664bdb995950530c12e
initializing bob
funding bob
1df19a419b5ae5b961bae6cfaf4e7c8e772c6632d30782fab8de6992a8901e4a
mining 1 blocks
starting daemon (PID 7471)
/tmp/alice/regtest/wallets/default_wallet
true
starting daemon (PID 7502)
/tmp/bob/regtest/wallets/default_wallet
true

alice opens channel
mining 3 blocks
wait until alice sees channel open.
wait until alice sees channel open..
wait until alice sees channel open...
alice initiates forward-swap
{
"lightning_amount": "0.01967661",
"onchain_amount": "0.02",
"txid": "b0f9ba48b670ee4a1f182655fe18f3f7d5c310923b7c85ad396b24e0a2f8e0cc"
}
utxo b0f9ba48b670ee4a1f182655fe18f3f7d5c310923b7c85ad396b24e0a2f8e0cc:0 does not exist
FDaemon stopped
Daemon stopped

======================================================================
FAIL: test_swapserver_success_forward (tests.regtest.TestLightningSwapserver.test_swapserver_success_forward)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/cirrus-ci-build/tests/regtest.py", line 105, in test_swapserver_success_forward
self.run_shell(['swapserver_success_forward'])
File "/tmp/cirrus-ci-build/tests/regtest.py", line 19, in run_shell
assert process.returncode == 0
^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
```

Can be reproduced with:
```diff
diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py
index f83d653f9..242aef070 100644
--- a/electrum/submarine_swaps.py
+++ b/electrum/submarine_swaps.py
@@ -1052,6 +1052,7 @@ class SwapManager(Logger):
@log_exceptions
async def broadcast_funding_tx(self, swap: SwapData, tx: Transaction) -> None:
swap.funding_txid = tx.txid()
+ await asyncio.sleep(5)
await self.network.broadcast_transaction(tx)

async def reverse_swap(
```

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Lower-prioritytests: lnhelpers: (trivial) mark method private, add type hintsby SomberNight · 07c45705 · May 20, 2026 · 2 filesMessage 60 · AdequateTriage 0Details
Commit message · SomberNight

tests: lnhelpers: (trivial) mark method private, add type hints

60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI review queuedtests: move create_test_channels to lnhelpers.pyby SomberNight · cf91aa86 · May 20, 2026 · 4 filesMessage 55 · ThinTriage 12Details
Commit message · SomberNight

tests: move create_test_channels to lnhelpers.py

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 queuedtest_lnwallet: unittest channel rebalancingby f321x · b183a529 · May 20, 2026 · 1 fileMessage 60 · AdequateTriage 12Details
Commit message · f321x

test_lnwallet: unittest channel rebalancing

Add some unittest coverage for the channel rebalance flow.

Co-authored-by: SomberNight <somber.night@protonmail.com>

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides an explanatory body✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
Lower-priorityLNWallet: don't allow rebalancing through frozen channelsby f321x · 784d9665 · May 20, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · f321x

LNWallet: don't allow rebalancing through frozen channels

Don't allow rebalancing through a channel if it is frozen for the
direction required for the rebalance.
If this is allowed by the gui it creates opaque failures as then
pathfinding potentially fails downstream.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-prioritylnworker: fix rebalance with frozen channelsby f321x · 89a2f1d7 · May 20, 2026 · 1 fileMessage 98 · StrongTriage 0Details
Commit message · f321x

lnworker: fix rebalance with frozen channels

Don't exclude r_tags for frozen channels from the route creation in
create_route_for_single_htlc if the start_node of the routing hint
is unequal to our node id.

When doing a rebalance us (chan_1) -> bob -> us (chan_2, frozen for sending),
we would exclude the invoice r_tag for chan_2 because the chan
is our chan and frozen for sending,
resulting in us being unable to find a route back to us trough bob.

This is a regression from #9692 (964ffbd2).

98/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Lower-prioritytests: ln graph_definition: allow multiple chans between peersby SomberNight · d4de5a9f · May 20, 2026 · 4 filesMessage 60 · AdequateTriage 0Details
Commit message · SomberNight

tests: ln graph_definition: allow multiple chans between peers

60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Lower-prioritytests: split off helpers from test_lnpeer into new lnhelpers.pyby SomberNight · d86b0c59 · May 20, 2026 · 3 filesMessage 60 · AdequateTriage 0Details
Commit message · SomberNight

tests: split off helpers from test_lnpeer into new lnhelpers.py

60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI review queuedlnwatcher: introduce loop to trigger callbacksby f321x · 2460b030 · May 20, 2026 · 3 filesMessage 68 · AdequateTriage 12Details
Commit message · f321x

lnwatcher: introduce loop to trigger callbacks

Introduce a taskgroup and polling loop to LNWatcher to guarantee
the callbacks get called at least once every
LNWatcher.MAX_CALLBACK_TRIGGER_DELAY_SEC (10 min).
This should prevent callbacks that operate on time instead of
blockheight from becoming (very) stale if there are no blockchain
events triggering the callbacks for a longer time.
Not entirely set about the 10 min delay, might as well be 5/2/1 min?

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
Lower-priorityutil: dedup now() helper functionby f321x · 98b36662 · May 19, 2026 · 4 filesMessage 68 · AdequateTriage 0Details
Commit message · f321x

util: dedup now() helper function

Deduplicate the now() helper function declared in 3 different modules
into electrum.util.
Use it consistently in submarine_swaps.py.
Cleanup imports of lnchannel.py.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-priorityLNGossip: put maintain_db on threadby f321x · 62656fa0 · May 19, 2026 · 2 filesMessage 68 · AdequateTriage 0Details
Commit message · f321x

LNGossip: put maintain_db on thread

I regularly see asyncio (debug) warnings that maintain_db
is blocking the event loop on my relatively fast laptop.

E.g. 3 warnings during a single session:
```
2.41 | I | channel_db.ChannelDB | Deleting 903 old policies
2.68 | I | channel_db.ChannelDB | Deleting 3954 orphaned channels
2.68 | W | asyncio | Executing <Task pending name='Task-22' coro=<LNGossip.maintain_db() running at /var/home/user/code/vibecoding_vm/electrum/electrum/lnworker.py:728> wait_for=<Future pending cb=[Task.task_wakeup()] created at /usr/lib64/python3.14/asyncio/base_events.py:459> cb=[set.discard(), TaskGroup._on_done()] created at /var/home/user/code/vibecoding_vm/electrum/electrum/util.py:1756> took 0.335 seconds
...
242.71 | I | channel_db.ChannelDB | Deleting 151 old policies
243.69 | I | channel_db.ChannelDB | Deleting 11819 orphaned channels
243.69 | W | asyncio | Executing <Task pending name='Task-22' coro=<LNGossip.maintain_db() running at /var/home/user/code/vibecoding_vm/electrum/electrum/lnworker.py:728> wait_for=<Future pending cb=[Task.task_wakeup()] created at /usr/lib64/python3.14/asyncio/base_events.py:459> cb=[set.discard(), TaskGroup._on_done()] created at /var/home/user/code/vibecoding_vm/electrum/electrum/util.py:1756> took 1.010 seconds
...
363.72 | I | channel_db.ChannelDB | Deleting 108 old policies
363.90 | I | channel_db.ChannelDB | Deleting 2922 orphaned channels
363.90 | W | asyncio | Executing <Task pending name='Task-22' coro=<LNGossip.maintain_db() running at /var/home/user/code/vibecoding_vm/electrum/electrum/lnworker.py:728> wait_for=<Future pending cb=[Task.task_wakeup()] created at /usr/lib64/python3.14/asyncio/base_events.py:459> cb=[set.discard(), TaskGroup._on_done()] created at /var/home/user/code/vibecoding_vm/electrum/electrum/util.py:1756> took 0.205 seconds
```

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-prioritytests: lnchannel: also test with SRK chan typeby SomberNight · e8551d64 · May 18, 2026 · 1 fileMessage 86 · StrongTriage 0Details
Commit message · SomberNight

tests: lnchannel: also test with SRK chan type

fix regression from https://github.com/spesmilo/electrum/pull/10622,
where the default for `TEST_ANCHOR_CHANNELS` was flipped from False to True.

86/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Lower-prioritytest_lnchannel: unittest should_be_closed_due_to_expiring_htlcsby f321x · 0066b684 · May 18, 2026 · 1 fileMessage 40 · ThinTriage 0Details
Commit message · f321x

test_lnchannel: unittest should_be_closed_due_to_expiring_htlcs

40/100 · ThinMessage clarity
✓ Specific, descriptive subject! No meaningful explanatory body
Lower-prioritylnchannel: give offered htlcs some time to fail on restartby f321x · 77d14d42 · May 18, 2026 · 3 filesMessage 85 · StrongTriage 0Details
Commit message · f321x

lnchannel: give offered htlcs some time to fail on restart

Wait for 30 seconds after restart before force closing channels
due to timed-out htlcs we offered to the peer. Maybe the peer
will fail them offchain once we reestablished the connection.
This should prevent some unnecessary force closes.
We could skip the whole loop but this seems more readable.

Note: it might take some time until the lnwatcher callback calls
should_be_closed_due_to_expiring_htlcs again, however the same issue
affects the existing 30sec timeout above as well.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Lower-priorityadd builder keys for svanstaaby Sebastian van Staa · 73e1e18f · May 16, 2026 · 1 fileMessage 45 · ThinTriage 0Details
Commit message · Sebastian van Staa

add builder keys for svanstaa

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI review queuednew 'stored_at' syntaxby ThomasV · 5f6a491f · May 14, 2026 · 7 filesMessage 28 · OpaqueTriage 12Details
Commit message · ThomasV

new 'stored_at' syntax

backported from levelDB branch

28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: opaque commit messagesecond-pass: security-sensitive path
Lower-priorityci: security review: log effort levelby f321x · de7a8bdb · May 14, 2026 · 1 fileMessage 77 · AdequateTriage 0Details
Commit message · f321x

ci: security review: log effort level

If the model is logged it makes sense to log the effort level as well.

77/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body✓ Names security-relevant behavior explicitly
Lower-priorityci: security review: pass prompt as system promptby f321x · a6cfdc5b · May 14, 2026 · 2 filesMessage 85 · StrongTriage 0Details
Commit message · f321x

ci: security review: pass prompt as system prompt

By appending the prompt to the system prompt it is prioritized over
the actual user prompt (the diff), so it apparently is more persistent
in the context. This e.g. could improve the output if a large diff
is provided as the actual task (system prompt) is treated with higher
priority than the large diff itself.

85/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Security candidateci: security review: give more permissions to claudeby f321x · 39cdb23e · May 14, 2026 · 2 filesMessage 100 · StrongInformational 20Details
Commit message · f321x

ci: security review: give more permissions to claude

With `--dangerously-skip-permissions` claude can also execute
commands. I thought the `-p` flag for headless usage already
did that, but apparently not
(looking at https://code.claude.com/docs/en/headless).

As it runs in the isolated CI container this seems fine and
might make it more powerful (e.g. allowing it to run and
modify unittests to verify behavior).

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
credential or privilege state
AI analysis · Informational 20/100

This commit changes Electrum's automated CI security-review bot so that the Claude AI assistant is allowed to run shell commands and modify files on its own, rather than only answering questions. The change is intentional and runs inside an isolated CI container under a non-root user. It is a tooling/configuration change, not a fix for a vulnerability in Electrum wallet software itself.

Security candidatetests: regtest: make test_just_in_time less flakyby f321x · 12547f94 · May 13, 2026 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · f321x

tests: regtest: make test_just_in_time less flaky

The regtest just_in_time is flaky on the CI because it tries to open
two channels right after each other (mining 3 blocks in between).
If the channel opener (LSP/Bob) hasn't caught up yet and is still
on the same height as the previous channel open it will refuse to open
another channel due to the anchor channel key derivation limitation.

This adds a helper to pause the test until bob has caught up to the newly
mined 3 blocks before attempting the second open.

90/100 · StrongMessage clarity
✓ 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
secret or key material
AI analysis · Informational 15/100

This commit only changes a test script. It adds a wait helper so a test that opens two Lightning channels in a row does not fail randomly on continuous integration. There is no change to Electrum's actual wallet or Lightning code, so users are not affected.

Lower-priorityLNWallet: make get_invoice_features base feature independentby f321x · 16f73521 · May 12, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · f321x

LNWallet: make get_invoice_features base feature independent

Makes the LNWallet._get_invoice_features method modify any
given base features instead of constructing the base
features internally. This way it can be used independently
of bolt11/12.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Lower-prioritylnutil: update LN_FEATURES_IMPLEMENTEDby f321x · b2e519fe · May 12, 2026 · 2 filesMessage 50 · ThinTriage 0Details
Commit message · f321x

lnutil: update LN_FEATURES_IMPLEMENTED

Add missing LNWALLET_FEATUERS features to LN_FEATURES_IMPLEMENTED.

50/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides an explanatory body
Lower-prioritylnutil: add to_tlv_bytes() to LnFeaturesby Sander van Grieken · a7d552ad · May 12, 2026 · 2 filesMessage 45 · ThinTriage 0Details
Commit message · Sander van Grieken

lnutil: add to_tlv_bytes() to LnFeatures

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-prioritylnutil: make dependencies context dependentby f321x · 9150de11 · May 12, 2026 · 5 filesMessage 68 · AdequateTriage 8Details
Commit message · f321x

lnutil: make dependencies context dependent

Make transitive dependencies of lightning features context dependent.
This allows to validate different transitive dependencies for the same
feature in different contexts.
For example BASIC_MPP_* depends on payment_secret for bolt 11 invoices,
but has no dependencies when being used in the context of bolt 12 invoices.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
defensive validation