feat(core): show an explicit warning when `ButtonRequest` ACK is delayed
What changed, and why it matters
This commit adds a user-facing warning message on Trezor devices when the connected computer or phone is slow to respond during a button-confirmation step. It is a usability improvement to prevent users from seeing a confusing blank screen; it does not fix a vulnerability and does not introduce a new attack path.
No security action required; treat as a normal feature/usability improvement. Reviewers may verify the 2-second timeout and the non-abort behavior match the THP synchronization requirements described in the commit message.
Security signals we found
UI/UX hardening against blank-screen confusion during delayed ButtonRequest ACK
THP channel synchronization preserved by continuing to await ACK and not allowing abort
New translated warning string added to communicate communication delay to user
Evidence from the diff
The change modifies the core UI flow so that, after a layout finishes but before the ButtonRequest ACK is received, the device waits up to 2 seconds and then displays a ‘Your Trezor is having trouble communicating with your connected device’ screen. The code still blocks on the ACK and does not allow aborting the flow, because aborting could leave the THP channel in a non-writeable state due to ABP. A new translation key words__comm_trouble is added, and a device test verifies the delayed-ACK behavior.
Changed components
core/src/trezor/ui/__init__.pycore/embed/rust/src/ui/layout_eckhart/ui_firmware.rscore/translations/en.jsontests/device_tests/test_msg_delayed_ack.pyInspect captured patch +86 / −11
diff --git a/core/.changelog.d/5884.added b/core/.changelog.d/5884.added
new file mode 100644
index 00000000..c3e07d0d
--- /dev/null
+++ b/core/.changelog.d/5884.added
@@ -0,0 +1 @@
+Show an explicit warning when `ButtonRequest` ACK is delayed.
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 2c2eb569..e3ca35bf 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -984,6 +984,7 @@ static void _librust_qstrs(void) {
MP_QSTR_words__cancel_and_exit;
MP_QSTR_words__cancel_question;
MP_QSTR_words__chain;
+ MP_QSTR_words__comm_trouble;
MP_QSTR_words__confirm;
MP_QSTR_words__confirm_fee;
MP_QSTR_words__connect;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index c7e094ef..a1020424 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1556,6 +1556,7 @@ pub enum TranslatedString {
ble__must_be_enabled = 1167, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "The Bluetooth must be turned on to pair with a new device."}
#[cfg(feature = "universal_fw")]
ripple__destination_tag_missing = 1168, // "Destination tag is not set. Typically needed when sending to exchanges."
+ words__comm_trouble = 1169, // "Your Trezor is having trouble communicating with your connected device."
}
impl TranslatedString {
@@ -4978,6 +4979,7 @@ impl TranslatedString {
(Self::ble__must_be_enabled, "The Bluetooth must be turned on to pair with a new device."),
#[cfg(feature = "universal_fw")]
(Self::ripple__destination_tag_missing, "Destination tag is not set. Typically needed when sending to exchanges."),
+ (Self::words__comm_trouble, "Your Trezor is having trouble communicating with your connected device."),
];
#[cfg(feature = "micropython")]
@@ -6456,6 +6458,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__cancel_and_exit, Self::words__cancel_and_exit),
(Qstr::MP_QSTR_words__cancel_question, Self::words__cancel_question),
(Qstr::MP_QSTR_words__chain, Self::words__chain),
+ (Qstr::MP_QSTR_words__comm_trouble, Self::words__comm_trouble),
(Qstr::MP_QSTR_words__confirm, Self::words__confirm),
(Qstr::MP_QSTR_words__confirm_fee, Self::words__confirm_fee),
(Qstr::MP_QSTR_words__connect, Self::words__connect),
diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
index ea369999..39ae35c9 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -1616,7 +1616,9 @@ impl FirmwareUI for UIEckhart {
}
fn show_wait_text(text: TString<'static>) -> Result<impl LayoutMaybeTrace, Error> {
- let paragraphs = Paragraph::new(&theme::TEXT_REGULAR, text).into_paragraphs();
+ let paragraphs = Paragraph::new(&theme::TEXT_REGULAR, text)
+ .into_paragraphs()
+ .with_placement(LinearPlacement::vertical());
let screen = TextScreen::new(paragraphs);
let layout = RootComponent::new(screen);
Ok(layout)
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 50f94e71..169911b1 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -1058,6 +1058,7 @@ class TR:
words__cancel_and_exit: str = "Cancel and exit"
words__cancel_question: str = "Cancel?"
words__chain: str = "Chain"
+ words__comm_trouble: str = "Your Trezor is having trouble communicating with your connected device."
words__confirm: str = "Confirm"
words__confirm_fee: str = "Confirm fee"
words__connect: str = "Connect"
diff --git a/core/src/trezor/ui/__init__.py b/core/src/trezor/ui/__init__.py
index a49b4b19..d3ab94be 100644
--- a/core/src/trezor/ui/__init__.py
+++ b/core/src/trezor/ui/__init__.py
@@ -50,6 +50,9 @@ _REQUEST_ANIMATION_FRAME = const(1)
See `trezor::ui::layout::base::EventCtx::ANIM_FRAME_TIMER`.
"""
+_UNRESPONSIVE_WARNING_TIMEOUT_MS = const(2000)
+
+
# allow only one alert at a time to avoid alerts overlapping
_alert_in_progress = False
@@ -79,6 +82,14 @@ def alert(count: int = 3) -> None:
loop.schedule(_alert(count))
+async def _waiting_screen() -> None:
+ from trezor import TR
+ from trezor.ui.layouts import show_wait_text
+
+ await loop.sleep(_UNRESPONSIVE_WARNING_TIMEOUT_MS)
+ show_wait_text(TR.words__comm_trouble)
+
+
class Shutdown(Exception):
pass
@@ -275,14 +286,12 @@ class Layout(Generic[T]):
if is_done is not None:
# Make sure ButtonRequest is ACKed, before the result is returned.
# Otherwise, THP channel may become desynced (due to two consecutive writes).
- if __debug__:
- log.debug(__name__, "waiting for %s", self.button_request_task)
+ self.button_request_box.put(None, replace=True)
+ task = loop.spawn(_waiting_screen())
try:
- self.button_request_box.put(None, replace=True)
await is_done
- except Exception as e:
- if __debug__:
- log.exception(__name__, e)
+ finally:
+ task.close()
return result
finally:
diff --git a/core/translations/en.json b/core/translations/en.json
index a1efdfa8..09dc9b45 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -2190,6 +2190,7 @@
"words__cancel_and_exit": "Cancel and exit",
"words__cancel_question": "Cancel?",
"words__chain": "Chain",
+ "words__comm_trouble": "Your Trezor is having trouble communicating with your connected device.",
"words__confirm": "Confirm",
"words__confirm_fee": "Confirm fee",
"words__connect": "Connect",
diff --git a/core/translations/order.json b/core/translations/order.json
index fc60c4c3..69c37aee 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1167,5 +1167,6 @@
"1165": "sn__action",
"1166": "sn__title",
"1167": "ble__must_be_enabled",
- "1168": "ripple__destination_tag_missing"
+ "1168": "ripple__destination_tag_missing",
+ "1169": "words__comm_trouble"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index d13e4284..c8a6f375 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "733c19bd8f2aa50e24c22db9f46b6f84b6c3deaa5e146dba712a31e067bb18e2",
- "datetime": "2025-10-22T11:55:05.774524+00:00",
- "commit": "72dbae52bdad47b365ed5b575c29fbfbce065fe2"
+ "merkle_root": "00610deac797011f6ba1feea201e7a1fdf9b655dff7191c5e708d09598541f0a",
+ "datetime": "2025-10-22T11:58:04.370192+00:00",
+ "commit": "c770486dabe2f816fb7057c5a643e3ac117d0fdf"
},
"history": [
{
diff --git a/tests/device_tests/test_msg_delayed_ack.py b/tests/device_tests/test_msg_delayed_ack.py
new file mode 100644
index 00000000..fee185e9
--- /dev/null
+++ b/tests/device_tests/test_msg_delayed_ack.py
@@ -0,0 +1,31 @@
+# This file is part of the Trezor project.
+#
+# This library is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the License along with this library.
+# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
+
+import time
+
+from trezorlib import messages
+from trezorlib.debuglink import SessionDebugWrapper as Session
+
+
+def test_delayed_ack(session: Session):
+ br = session.call_raw(messages.Ping(message="delayed", button_protection=True))
+ assert isinstance(br, messages.ButtonRequest)
+ assert br.code == messages.ButtonRequestType.ProtectCall
+ # confirm layout before ButtonAck is sent
+ session.debug_client.debug.press_yes()
+ # "waiting" screen should be shown after 2 seconds on Core models
+ # (following https://github.com/trezor/trezor-firmware/issues/5884)
+ time.sleep(2.5)
+ res = session.call_raw(messages.ButtonAck())
+ assert res.message == "delayed"
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index a001d625..6c9e2894 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -723,6 +723,7 @@
"T1B1_en_test_msg_changepin_t1.py::test_set_invalid[]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1B1_en_test_msg_changepin_t1.py::test_set_mismatch": "d2ec141a42567c2a2ae18c0485f16c6b107bdbcfafd81174fb7fb463b7003128",
"T1B1_en_test_msg_changepin_t1.py::test_set_pin": "8663ab1e684684a9ccdab113c8cb8c2f70091d9e2a722a39e04acb34e2c5d8c0",
+"T1B1_en_test_msg_delayed_ack.py::test_delayed_ack": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"T1B1_en_test_msg_loaddevice.py::test_load_device_1": "0e92c294292142cbb286b613d40d2fdee8977f18285823ce896f40c2269a3ecd",
"T1B1_en_test_msg_loaddevice.py::test_load_device_2": "d8a7756f8a8939f2dba9abf7bafa2ba16a865453ea9372227ce54bd14a61a020",
"T1B1_en_test_msg_loaddevice.py::test_load_device_utf": "7cb1aea488c38c261f63575025964632bc97492cdcd703f7c68ab3744edb7eb2",
@@ -2557,6 +2558,7 @@
"T2T1_cs_test_msg_changepin_t2.py::test_remove_pin": "03d851d7584c25aba9aecf917aae26f68987c92bd678a2212368a7c7bd750508",
"T2T1_cs_test_msg_changepin_t2.py::test_set_failed": "f200a8b04618e33273b9c92648b04663ba150f86ffa562cec7d92740dd38975d",
"T2T1_cs_test_msg_changepin_t2.py::test_set_pin": "4c70bbaab0c6d483d897b0dbb20e1b781ae869d46eb4e02629009089370aa605",
+"T2T1_cs_test_msg_delayed_ack.py::test_delayed_ack": "29bb620730da3abca37bb54fda883d6276873e0ab75b99146d41179c33e713f4",
"T2T1_cs_test_msg_loaddevice.py::test_load_device_1": "7618dbe82b59e4551667b6f3960ea539e9254931af3b90fca66609224490623b",
"T2T1_cs_test_msg_loaddevice.py::test_load_device_2": "764fb0ce2cde551ae8673a6232bf936a2f8b4c6869376d805dc336c380e86b9c",
"T2T1_cs_test_msg_loaddevice.py::test_load_device_slip39_advanced": "7618dbe82b59e4551667b6f3960ea539e9254931af3b90fca66609224490623b",
@@ -4105,6 +4107,7 @@
"T2T1_de_test_msg_changepin_t2.py::test_remove_pin": "bafbe23b1a5be58ab1b69c7c1c1af7349c521aa29e9bc816dd3f51f33053230a",
"T2T1_de_test_msg_changepin_t2.py::test_set_failed": "d014a89098462dcca5a8d4d1bb3e31fb1d3805e8753f54b3177fbd0d9c58b8d4",
"T2T1_de_test_msg_changepin_t2.py::test_set_pin": "17162ce4449f80aae9f336a902a7be9dda936abcd74ada335b04aa06323c65bf",
+"T2T1_de_test_msg_delayed_ack.py::test_delayed_ack": "b1e97e2505b2c986165ca32d5e6d51a4a9e1999181416a00088422d828192750",
"T2T1_de_test_msg_loaddevice.py::test_load_device_1": "adf3cc39e95ed44a34e47201dfc3c9abb907a21abba4b13af924cd132ce096fd",
"T2T1_de_test_msg_loaddevice.py::test_load_device_2": "a0a8e71758a624870efab731aef14dc60949cafce220673c9b459f7776d8a40f",
"T2T1_de_test_msg_loaddevice.py::test_load_device_slip39_advanced": "adf3cc39e95ed44a34e47201dfc3c9abb907a21abba4b13af924cd132ce096fd",
@@ -5653,6 +5656,7 @@
"T2T1_en_test_msg_changepin_t2.py::test_remove_pin": "bc2f4aeb9582d3c43dcaf8c5933f5dae28f97de4450971e2a9aa54c155a6043d",
"T2T1_en_test_msg_changepin_t2.py::test_set_failed": "0e535e0f7a8bffcc473a9e2a6a76f71637a0fe0187b7a36baa09a1756b27c545",
"T2T1_en_test_msg_changepin_t2.py::test_set_pin": "9909b19de8f19e3e555f56f280e625291bd7cdd105759ebd9dddfba597d09bd8",
+"T2T1_en_test_msg_delayed_ack.py::test_delayed_ack": "a6ea62086cba100334a10a1793b67464910490a1cb14b4c690434cd2875fc650",
"T2T1_en_test_msg_loaddevice.py::test_load_device_1": "925e0161d96bc9e1c9ff32a682d8eda903d0c5a3b9750d0c6ae2814d159b8e82",
"T2T1_en_test_msg_loaddevice.py::test_load_device_2": "9b0de519585fc9ab2820fd1846c78a74c772a92db34f2bbf92952447c48255b9",
"T2T1_en_test_msg_loaddevice.py::test_load_device_slip39_advanced": "925e0161d96bc9e1c9ff32a682d8eda903d0c5a3b9750d0c6ae2814d159b8e82",
@@ -7219,6 +7223,7 @@
"T2T1_es_test_msg_changepin_t2.py::test_remove_pin": "8bcefc727d647c5f9c4951ffa69af2bfb88484252f645b38b26111c161a82c35",
"T2T1_es_test_msg_changepin_t2.py::test_set_failed": "cec93b95813ba2d1722e734247c79f25f49b99937eb88eb59553bc51180857ad",
"T2T1_es_test_msg_changepin_t2.py::test_set_pin": "3a5648d003328e4ad12aa57d7a580b911c5f660b10c50ba8a7f4e40d6788c79d",
+"T2T1_es_test_msg_delayed_ack.py::test_delayed_ack": "e186b3a4fa7525fa4ef3faa90fdf71008e1745eb3b081939b4079e5138a4ecab",
"T2T1_es_test_msg_loaddevice.py::test_load_device_1": "3a764b46ed75b95c4c2d4c89cb80d0b4a25702e47663775f37146a0a50df82ca",
"T2T1_es_test_msg_loaddevice.py::test_load_device_2": "1f2cd517a195a83df7ac35ae438fcfdd703dee9aa0a33dadbfba54d9ff6ab136",
"T2T1_es_test_msg_loaddevice.py::test_load_device_slip39_advanced": "3a764b46ed75b95c4c2d4c89cb80d0b4a25702e47663775f37146a0a50df82ca",
@@ -8767,6 +8772,7 @@
"T2T1_fr_test_msg_changepin_t2.py::test_remove_pin": "3564552e620dc11806e1fed98cbcfae44cf028e9b525c07da37f5d54065a822c",
"T2T1_fr_test_msg_changepin_t2.py::test_set_failed": "fca44147e209e696a51c155fe54656c6af53375940a6fbf3f0927792cd96e866",
"T2T1_fr_test_msg_changepin_t2.py::test_set_pin": "1d3bd1cd8ce55ddf4f1c80bb42b9e074ddc7bbc244048c1c85f6dc3d3fa27f90",
+"T2T1_fr_test_msg_delayed_ack.py::test_delayed_ack": "52479c0691b62efd8e6a98912e5e47520b27347542833884b9d453c56d642766",
"T2T1_fr_test_msg_loaddevice.py::test_load_device_1": "e35e29cccc7b118ce5dc8a3b69910e1fade64e04ce83e41f2522db7710fd8963",
"T2T1_fr_test_msg_loaddevice.py::test_load_device_2": "c8c01d1f51b5258d3c874622fe0cf3f831cc94caee759af8749d2e2cbb62fde2",
"T2T1_fr_test_msg_loaddevice.py::test_load_device_slip39_advanced": "e35e29cccc7b118ce5dc8a3b69910e1fade64e04ce83e41f2522db7710fd8963",
@@ -10315,6 +10321,7 @@
"T2T1_pt_test_msg_changepin_t2.py::test_remove_pin": "b5beb25af8baa1b40353e8a80138c0e9484cfb5f4a50252ba21bd6329f2382b2",
"T2T1_pt_test_msg_changepin_t2.py::test_set_failed": "73dc70ff5bfc437af14e1cb5744e7513345246e38135c28e9f7eefbcf83798f4",
"T2T1_pt_test_msg_changepin_t2.py::test_set_pin": "30c99b2ce5993c459895fac06a95d088adbfcf482acc444c5f191b06fe9d4f5d",
+"T2T1_pt_test_msg_delayed_ack.py::test_delayed_ack": "d7a6fff1332fe0df734142c8e97ee5c9c13ae34448488cce1ec0d73eedaabefa",
"T2T1_pt_test_msg_loaddevice.py::test_load_device_1": "a5a16dc50251503b3b1d7986e90127cf0b61a9467cd34adba66132884535ea59",
"T2T1_pt_test_msg_loaddevice.py::test_load_device_2": "e5c26233619b059295eccb9bb52811df34e217758bfb77ffdbc3076c37e8dbff",
"T2T1_pt_test_msg_loaddevice.py::test_load_device_slip39_advanced": "a5a16dc50251503b3b1d7986e90127cf0b61a9467cd34adba66132884535ea59",
@@ -12085,6 +12092,7 @@
"T3B1_cs_test_msg_changepin_t2.py::test_remove_pin": "ac8ecf420d3eb3e18dccd8319654b3619c190839c465906edc7f14bc80ab181e",
"T3B1_cs_test_msg_changepin_t2.py::test_set_failed": "77c181a0d424763033bf1f34a071dfe8ad3e8e67bd2505f3c825f5e5848ad926",
"T3B1_cs_test_msg_changepin_t2.py::test_set_pin": "33a280e34675ceea5d8fa8defc182f7a264093964e5e37238bbf20a6fd7d9a8c",
+"T3B1_cs_test_msg_delayed_ack.py::test_delayed_ack": "18323d202a6605f5c6bd643cf7c604bf222f7f5bf8394c50588ae1f5dd8976b4",
"T3B1_cs_test_msg_loaddevice.py::test_load_device_1": "e32d5448a2803f50ee1d1c043637eb58d8e48f5df2ca559d154bb87631ff674e",
"T3B1_cs_test_msg_loaddevice.py::test_load_device_2": "6a7ce7e923aa1e30063e30b8112c47ed5f04068e2cd23d75e36a3e52eb4ffee7",
"T3B1_cs_test_msg_loaddevice.py::test_load_device_slip39_advanced": "e32d5448a2803f50ee1d1c043637eb58d8e48f5df2ca559d154bb87631ff674e",
@@ -13550,6 +13558,7 @@
"T3B1_de_test_msg_changepin_t2.py::test_remove_pin": "2bc18e0a882f1091c12ef7a7eb62edfcf2634fec02e094dabedffb4ef4f2030c",
"T3B1_de_test_msg_changepin_t2.py::test_set_failed": "ef17c2f383977770569e9bce84604a1e1d8309899eb9c6939471f6c6892368bd",
"T3B1_de_test_msg_changepin_t2.py::test_set_pin": "e2a4e59a8c8866fd153e1be73dac70513d5bf02ccf9ec152218703f19da9b7b1",
+"T3B1_de_test_msg_delayed_ack.py::test_delayed_ack": "3dd2eea6b033858e0d472b4104344b255f7fdf93782c38d5335d13f6b38bd531",
"T3B1_de_test_msg_loaddevice.py::test_load_device_1": "d4990da91256e1b3a0b995d039d3ec38f2d4ee2e52a8ee2ea449c5c6e71e8944",
"T3B1_de_test_msg_loaddevice.py::test_load_device_2": "95c5884a111dac116d84e0870998220d10fb6226d999f728fd57eba3383d806e",
"T3B1_de_test_msg_loaddevice.py::test_load_device_slip39_advanced": "d4990da91256e1b3a0b995d039d3ec38f2d4ee2e52a8ee2ea449c5c6e71e8944",
@@ -15015,6 +15024,7 @@
"T3B1_en_test_msg_changepin_t2.py::test_remove_pin": "b9ec3edbb67e8daa8d97a9affd4da013ef5c932295aac44185d73b544f3175f6",
"T3B1_en_test_msg_changepin_t2.py::test_set_failed": "d77ea683e9423e6ec4c4f21c871c8ac57976eb7a134775185561087be3218ba1",
"T3B1_en_test_msg_changepin_t2.py::test_set_pin": "cb88fe2e4bbbab7aaed93b70bfc563b83c949faed93823a5ccba6e9c468d2e6c",
+"T3B1_en_test_msg_delayed_ack.py::test_delayed_ack": "d434a15276d5080ad07297caef0d9617e0ce1003537b82e2cddb59db358f967a",
"T3B1_en_test_msg_loaddevice.py::test_load_device_1": "6c85bd58c3dffe43cd1aafaea987356622eb7496dbb0f90fc89610c1e55aee4f",
"T3B1_en_test_msg_loaddevice.py::test_load_device_2": "e7c76c7993f13fe66327a2fc0ea973130c69597f082e09fa15660aa983956372",
"T3B1_en_test_msg_loaddevice.py::test_load_device_slip39_advanced": "6c85bd58c3dffe43cd1aafaea987356622eb7496dbb0f90fc89610c1e55aee4f",
@@ -16480,6 +16490,7 @@
"T3B1_es_test_msg_changepin_t2.py::test_remove_pin": "9826b6af61858da0288b9ab33eb3ef09c716824efcb5f1db2d2df7d912a8f2bc",
"T3B1_es_test_msg_changepin_t2.py::test_set_failed": "69fac71427926b773be212350ea8a0bbfa6f526b45128f18f614fbba20f561e2",
"T3B1_es_test_msg_changepin_t2.py::test_set_pin": "0756f229525d6c6a087732563774c8abced61bdeaf95a53eb778e2afb68d324f",
+"T3B1_es_test_msg_delayed_ack.py::test_delayed_ack": "efbf04c3d33bbdb9c262e9c5386aefebd480bdf450eb07f7fd387ff3de7ac074",
"T3B1_es_test_msg_loaddevice.py::test_load_device_1": "81311a6e84476251647a88f9ccaedc51dfc4ac97a075d3d623a7ea9187cf5010",
"T3B1_es_test_msg_loaddevice.py::test_load_device_2": "4412dfdf1f7358f9d3258875873f676e3986fd21b24a550bde4c9af1fcd864c1",
"T3B1_es_test_msg_loaddevice.py::test_load_device_slip39_advanced": "81311a6e84476251647a88f9ccaedc51dfc4ac97a075d3d623a7ea9187cf5010",
@@ -17945,6 +17956,7 @@
"T3B1_fr_test_msg_changepin_t2.py::test_remove_pin": "1ec775969c913dad352792df8917d8cf282bd794e1b4a7b1808566cae8adb294",
"T3B1_fr_test_msg_changepin_t2.py::test_set_failed": "d89ff73878845b9504e2f5de1a4c2ad40032d90f7e8bd06de23d66039b8fef2c",
"T3B1_fr_test_msg_changepin_t2.py::test_set_pin": "dd1f8742458248a1330290bff7defef3b30c0c11b7e77874b9379513d2364f1a",
+"T3B1_fr_test_msg_delayed_ack.py::test_delayed_ack": "e88fbbd09eedb2533fedee44389b9d760a669aece21b855bf6187f37d1db3037",
"T3B1_fr_test_msg_loaddevice.py::test_load_device_1": "5bd1341d536f2a47852ddc30b1ac4af694261fc325a1bceefea730a6eca7488d",
"T3B1_fr_test_msg_loaddevice.py::test_load_device_2": "c39cab7b53d7e3588074b01a311e9abd9c34f69cfd6f469b2b0e881d7435d591",
"T3B1_fr_test_msg_loaddevice.py::test_load_device_slip39_advanced": "5bd1341d536f2a47852ddc30b1ac4af694261fc325a1bceefea730a6eca7488d",
@@ -19410,6 +19422,7 @@
"T3B1_pt_test_msg_changepin_t2.py::test_remove_pin": "475b6a8560c75c314388b3b62b9bdca223028102eba2ae2b02754b97a6e1c6bd",
"T3B1_pt_test_msg_changepin_t2.py::test_set_failed": "4b845b25f7f1019a53d89e3829117711b48c9370cf7b72e7b756c3a534cb3028",
"T3B1_pt_test_msg_changepin_t2.py::test_set_pin": "4a8f11aacfc285300116fd2f32c6d057f735c609de3d762ff0075265f9351bba",
+"T3B1_pt_test_msg_delayed_ack.py::test_delayed_ack": "00857afd206c37502c69f547775338cc3eb323ef0413136690abab3fb8cc12ac",
"T3B1_pt_test_msg_loaddevice.py::test_load_device_1": "9ff9fd4e4be826b570e06480f03c6b0a64da055829d71b39da2a62532856051d",
"T3B1_pt_test_msg_loaddevice.py::test_load_device_2": "8a9baaed8c46d99299c57b3b902d1e8b2c49cfe2619ccdce509ccff0eda117b7",
"T3B1_pt_test_msg_loaddevice.py::test_load_device_slip39_advanced": "9ff9fd4e4be826b570e06480f03c6b0a64da055829d71b39da2a62532856051d",
@@ -21270,6 +21283,7 @@
"T3T1_cs_test_msg_changepin_t2.py::test_remove_pin": "71095b44c37d0aa7e54c57fc35a05542ae5c2b4ff6604ccd64f6eba9f56de03e",
"T3T1_cs_test_msg_changepin_t2.py::test_set_failed": "10f81de263246b760b77729e8cc470278eaa4148d098aab219f3f29b2dceb614",
"T3T1_cs_test_msg_changepin_t2.py::test_set_pin": "e4a9db39af07126d0e51017ef331cf74198f835e31bf40472b3072e16720ef98",
+"T3T1_cs_test_msg_delayed_ack.py::test_delayed_ack": "7a5cd397147d242c07bc1753c4b4bfd70cdab2f80c40cad932beadcdcf3553c5",
"T3T1_cs_test_msg_loaddevice.py::test_load_device_1": "c761edd7b62901ca5a1ad49c3bacf7b38e84641284407509be3b3d75033c884e",
"T3T1_cs_test_msg_loaddevice.py::test_load_device_2": "890e3f3d8455b334144f79f5a8c2b7c893c53684bc7af025d51ead3d636111d4",
"T3T1_cs_test_msg_loaddevice.py::test_load_device_slip39_advanced": "c761edd7b62901ca5a1ad49c3bacf7b38e84641284407509be3b3d75033c884e",
@@ -22766,6 +22780,7 @@
"T3T1_de_test_msg_changepin_t2.py::test_remove_pin": "2a88ff4252b4203f4443c0a72b100231df9673cc2177a8d5d73805234d855f30",
"T3T1_de_test_msg_changepin_t2.py::test_set_failed": "c0d34eeb8a1b8acc0f230d117d4cdc84601d0fa0b128ebc6363d784431771717",
"T3T1_de_test_msg_changepin_t2.py::test_set_pin": "55723e14ef256d9120f7aa35ff9c1ac922b2082fee3918ec2dd759614e1e7b1f",
+"T3T1_de_test_msg_delayed_ack.py::test_delayed_ack": "ef5dd171ff6b1deef542d00ff0701c67051520f70a80b7817d68267eb26194a6",
"T3T1_de_test_msg_loaddevice.py::test_load_device_1": "926fef013ba6d099ff498ad308bdc9de6e831a772a4e2f58ad70b55aead9f3b4",
"T3T1_de_test_msg_loaddevice.py::test_load_device_2": "af7e45b883282dcb19d6d4ff1866910cc9717190ecf284459ee70189d3a9c486",
"T3T1_de_test_msg_loaddevice.py::test_load_device_slip39_advanced": "926fef013ba6d099ff498ad308bdc9de6e831a772a4e2f58ad70b55aead9f3b4",
@@ -24262,6 +24277,7 @@
"T3T1_en_test_msg_changepin_t2.py::test_remove_pin": "cac52dcc418cd1e4cb7d6dbe7929be2911e7d9ef895ca12a364ab418b698f11c",
"T3T1_en_test_msg_changepin_t2.py::test_set_failed": "445212c6399ba523461df825e8467cb00be2f02c63e4d0a8a54ab75bbe29f678",
"T3T1_en_test_msg_changepin_t2.py::test_set_pin": "04ac3b41e7b17a6618b83390d776036322c3a15e3f99137cc4a70346bde99576",
+"T3T1_en_test_msg_delayed_ack.py::test_delayed_ack": "3481ba8f9f50053d4fd3a7c03818f7908dd9038c0d80103d89744c2f8135bd10",
"T3T1_en_test_msg_loaddevice.py::test_load_device_1": "d6a961a55f71b9504b0bf6f1cfebde67e69c387405eda60a5935e673db942e16",
"T3T1_en_test_msg_loaddevice.py::test_load_device_2": "c40b1b36eb45e1305557e1e89fc2acb69b2a6a8af46853ba61319d3a99128174",
"T3T1_en_test_msg_loaddevice.py::test_load_device_slip39_advanced": "d6a961a55f71b9504b0bf6f1cfebde67e69c387405eda60a5935e673db942e16",
@@ -25758,6 +25774,7 @@
"T3T1_es_test_msg_changepin_t2.py::test_remove_pin": "692403dce76c8359c2fa570aea2ff3700398aa229991e92480a6aa0b71b86ce6",
"T3T1_es_test_msg_changepin_t2.py::test_set_failed": "27a61469b98a9247747c0ada5b951c84b9d5010e913473d344dedb3e915a2ced",
"T3T1_es_test_msg_changepin_t2.py::test_set_pin": "3bf0425923fa9cbad2a8c05440c113f05248eae220765349a3aa0f8171bd9a54",
+"T3T1_es_test_msg_delayed_ack.py::test_delayed_ack": "023d087ea3e8ceb1117d117c4417cb26a8c47c89b2e4c156d0db6eaad2e20de1",
"T3T1_es_test_msg_loaddevice.py::test_load_device_1": "3155d20f4c1881078b70a3fc440ead122f144817a4154016f1a7be8b72cd6640",
"T3T1_es_test_msg_loaddevice.py::test_load_device_2": "ddb6b98c074a11e1f8f75d31dd322f3e7163ca5b196c0615e2d111efb68b69ec",
"T3T1_es_test_msg_loaddevice.py::test_load_device_slip39_advanced": "3155d20f4c1881078b70a3fc440ead122f144817a4154016f1a7be8b72cd6640",
@@ -27254,6 +27271,7 @@
"T3T1_fr_test_msg_changepin_t2.py::test_remove_pin": "f6eac17b06837967701586ae98e916eacbf77161151eb5688e6e05f677556dab",
"T3T1_fr_test_msg_changepin_t2.py::test_set_failed": "422e4e52bd46b6cb0f610e984699f1a4448a7286676c98e7be4a701b5f5f2125",
"T3T1_fr_test_msg_changepin_t2.py::test_set_pin": "8f2c6c9ed14c66f3bd02b883a1f9b4bb69bcbc0c79ff3c50d0fac64890590074",
+"T3T1_fr_test_msg_delayed_ack.py::test_delayed_ack": "ca6d2056805368cc9216436f0a2230a780a1e89075bb85991f7cab3f5d3cb151",
"T3T1_fr_test_msg_loaddevice.py::test_load_device_1": "826ca3705cac55c62cf27153a755213a49410e3fd99ef65facfb788ed123caa2",
"T3T1_fr_test_msg_loaddevice.py::test_load_device_2": "e6ffd6e7d7db6c273d7b358dd2c4bca1cff3964a404c2c3197b1e4bac2c97205",
"T3T1_fr_test_msg_loaddevice.py::test_load_device_slip39_advanced": "826ca3705cac55c62cf27153a755213a49410e3fd99ef65facfb788ed123caa2",
@@ -28750,6 +28768,7 @@
"T3T1_pt_test_msg_changepin_t2.py::test_remove_pin": "8045de941cff6c418f2c1fa1d5659148084ead4a7c4804097e17e91060eab983",
"T3T1_pt_test_msg_changepin_t2.py::test_set_failed": "7a9e15a1e1b0990a7750447015adfe23efc27b11e51cadcf5b51ca98511397f5",
"T3T1_pt_test_msg_changepin_t2.py::test_set_pin": "9f2528b7b6972caeb97fa3c6a937c2a27756ad8d33cca6512b6e2a1e1a7e3a3b",
+"T3T1_pt_test_msg_delayed_ack.py::test_delayed_ack": "209e8e7dbe25e5b88a02f949291a703a0f8c648632ededbe62e2940ec9641b4a",
"T3T1_pt_test_msg_loaddevice.py::test_load_device_1": "534dd24e668bdb11c02c61dce689b4ea54d02d4313afa676af720a1888c1f5c4",
"T3T1_pt_test_msg_loaddevice.py::test_load_device_2": "4f38655b7323c4c6c101e38588110c193a202536d3648f7c6c82519495c80f6a",
"T3T1_pt_test_msg_loaddevice.py::test_load_device_slip39_advanced": "534dd24e668bdb11c02c61dce689b4ea54d02d4313afa676af720a1888c1f5c4",
@@ -30890,6 +30909,7 @@
"T3W1_cs_test_msg_changepin_t2.py::test_remove_pin": "236088d59c7a7fa8f0d44b4c7308d553ea22d5b3beb27ce0d29c297103d4f5a2",
"T3W1_cs_test_msg_changepin_t2.py::test_set_failed": "cf44a8f5d255919acced42b1a48860812e5f3158a1fa31967890ab32281b04f7",
"T3W1_cs_test_msg_changepin_t2.py::test_set_pin": "eb440c5dd7908161615a3b5958b09d5ab76b3192b8e6a31df5cb9c01e8311465",
+"T3W1_cs_test_msg_delayed_ack.py::test_delayed_ack": "91c7edda1674f90825ae3cd6a23cf60e44dc48834b2dc4898edfb42e6b61b79e",
"T3W1_cs_test_msg_loaddevice.py::test_load_device_1": "895225763963cbb9b745948b4dd4ddfa98cf86a28c2259d2f05ea8e2d1bf26c2",
"T3W1_cs_test_msg_loaddevice.py::test_load_device_2": "9399e2e0e685d0630e18388907059919f4ef1c7a4b40248f187ecd8f0a638837",
"T3W1_cs_test_msg_loaddevice.py::test_load_device_slip39_advanced": "895225763963cbb9b745948b4dd4ddfa98cf86a28c2259d2f05ea8e2d1bf26c2",
@@ -32391,6 +32411,7 @@
"T3W1_de_test_msg_changepin_t2.py::test_remove_pin": "321273d04426fab3a1a3a241558ca1c292613f739c6e1093d92c09f93b089330",
"T3W1_de_test_msg_changepin_t2.py::test_set_failed": "8c0ad2b6ab235aa7d0755074e2a274e487cdf2fda5b13e4d5dffd2cf2f0a099b",
"T3W1_de_test_msg_changepin_t2.py::test_set_pin": "a7d1e9957e5cdc06849bfbbccc94b5de3e873ea26a4ea6039697c856d4fedfd2",
+"T3W1_de_test_msg_delayed_ack.py::test_delayed_ack": "bdaf6065ad168694ec908937352d3e0c12719263bdfa7125f9eab104f94a3e00",
"T3W1_de_test_msg_loaddevice.py::test_load_device_1": "03f23fcd1f0a7ba80b4cfd8ad5af92bcc8ed733c76bceece110052b7c4c889d4",
"T3W1_de_test_msg_loaddevice.py::test_load_device_2": "52084d14be5d7416acd7532818d433bafb5faeb61741bee2400811e36e240792",
"T3W1_de_test_msg_loaddevice.py::test_load_device_slip39_advanced": "03f23fcd1f0a7ba80b4cfd8ad5af92bcc8ed733c76bceece110052b7c4c889d4",
@@ -33892,6 +33913,7 @@
"T3W1_en_test_msg_changepin_t2.py::test_remove_pin": "51fe72b9f05dc3f484070c2cf1ba8b0d61ede518d4a3d34ffc3810c62434cbd7",
"T3W1_en_test_msg_changepin_t2.py::test_set_failed": "9495c639f97cd071064c106e6a3e9c873dfa9197bb4d9fef556304bdb330557f",
"T3W1_en_test_msg_changepin_t2.py::test_set_pin": "106d9e125d2c1b20e09e39795ab88989662634d2a6b386d549ce7a77da15ccb8",
+"T3W1_en_test_msg_delayed_ack.py::test_delayed_ack": "cc3cfd630b36fcbd1c272181fc697dafd16e69c9efa32818e35d0ac35e583957",
"T3W1_en_test_msg_loaddevice.py::test_load_device_1": "54a4bbfca0c9d3723fc55ba1259769a54feea0039c6b2d6eec08cd4761a8e66b",
"T3W1_en_test_msg_loaddevice.py::test_load_device_2": "673bfd009806848a9bd80e563308a9ded01e299292a462dcc8760b8c830fc199",
"T3W1_en_test_msg_loaddevice.py::test_load_device_slip39_advanced": "54a4bbfca0c9d3723fc55ba1259769a54feea0039c6b2d6eec08cd4761a8e66b",
@@ -35393,6 +35415,7 @@
"T3W1_es_test_msg_changepin_t2.py::test_remove_pin": "170f871cf1dc61b127cc70ab5b5d61f285fd162a06eec925456b8ef070500982",
"T3W1_es_test_msg_changepin_t2.py::test_set_failed": "0efbc2b0ec8664565b07dd68bc51c253de6387f2d25d2f7d4ba08bb43fe00639",
"T3W1_es_test_msg_changepin_t2.py::test_set_pin": "1f6dccaadf2cdf90dc57b786ea24c2f440001feecebc50a912596830c58d4d6a",
+"T3W1_es_test_msg_delayed_ack.py::test_delayed_ack": "22661fdbb4991721c5c99060198d7ff13e64ff6a4106f1240210e017462d6021",
"T3W1_es_test_msg_loaddevice.py::test_load_device_1": "a7f03bd388af6b8e884fba4dc134074b12bb76639a973f7ecf13acf461b16a1a",
"T3W1_es_test_msg_loaddevice.py::test_load_device_2": "26cb61e8ba78803e466acd52bc2ead6c1227c76a5d2490d1823b65bfc9907e37",
"T3W1_es_test_msg_loaddevice.py::test_load_device_slip39_advanced": "a7f03bd388af6b8e884fba4dc134074b12bb76639a973f7ecf13acf461b16a1a",
@@ -36894,6 +36917,7 @@
"T3W1_fr_test_msg_changepin_t2.py::test_remove_pin": "10379e548758f2d92041a1c7c04ffc52611a86e65314337e19704874ef1eb4ed",
"T3W1_fr_test_msg_changepin_t2.py::test_set_failed": "2a6a9f54793695c771a34e93cdc3956d677a1b910267e1cf22e33138f5097475",
"T3W1_fr_test_msg_changepin_t2.py::test_set_pin": "1a6873aa6662c32d42ef2b4d907571f15f3c9c53eac77538bf6c277e05c154fd",
+"T3W1_fr_test_msg_delayed_ack.py::test_delayed_ack": "7bdbb2fd6999e3f3297bd84ddb22059d7e76d06cfd944d215ab41a0ac9fe4862",
"T3W1_fr_test_msg_loaddevice.py::test_load_device_1": "fcbc49b491f93d7557e6e51cbfdbfcd35b4bfcbfca34e7cc15a3cea44138bc3d",
"T3W1_fr_test_msg_loaddevice.py::test_load_device_2": "ff4da85b33163b0a1a16cb6d9e0decd043d7a90906c18f9e401473205e5afb95",
"T3W1_fr_test_msg_loaddevice.py::test_load_device_slip39_advanced": "fcbc49b491f93d7557e6e51cbfdbfcd35b4bfcbfca34e7cc15a3cea44138bc3d",
@@ -38400,6 +38424,7 @@
"T3W1_pt_test_msg_changepin_t2.py::test_remove_pin": "9f76464398c7c6bd7af12ef9e92128f563e80b737376248d8f99389351a5d74e",
"T3W1_pt_test_msg_changepin_t2.py::test_set_failed": "9a797692d706640c90d5cd837e1bf8ab030313ad294fd1298cf723b1f36357a1",
"T3W1_pt_test_msg_changepin_t2.py::test_set_pin": "d534fdecff412031e5aeb5367f7d82dcb8d93bfc28714eecd86a11826b183f9c",
+"T3W1_pt_test_msg_delayed_ack.py::test_delayed_ack": "3e6ad27628f56b007e76766797b26e531083c64b5b412eeab93b9659d47b7151",
"T3W1_pt_test_msg_loaddevice.py::test_load_device_1": "d2178dca657d703851e6a02a48ac9b6f0eae0b7f1e5f25c3f0f11d7cc94904c1",
"T3W1_pt_test_msg_loaddevice.py::test_load_device_2": "9c7d5a875a40294fd03cf8b1647ead3d216a586e3d01df85a0fe6d4128a412b2",
"T3W1_pt_test_msg_loaddevice.py::test_load_device_slip39_advanced": "d2178dca657d703851e6a02a48ac9b6f0eae0b7f1e5f25c3f0f11d7cc94904c1",
Why this scored 19/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.