What changed, and why it matters
This commit is a visual design tweak for the Trezor hardware wallet's screen border. It changes how the decorative border is drawn so it sits exactly at the screen edges instead of being inset by one pixel. There is no security relevance: no cryptography, authentication, memory handling, or user-confirmation logic is changed.
No security action needed. Treat as a normal UI/visual regression fix.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit reverts an earlier 1-pixel inset border approach (PR #5510) for the Eckhart layout. It removes the SCREEN_SHRUNK constant and the *_1 variants of border icons, switches back to edge-aligned assets, and updates loader/hold-to-confirm clip calculations to use the new ScreenBorder::WIDTH and full SCREEN dimensions. The only functional change is pixel-level rendering alignment; the diff contains no security-sensitive code paths.
Changed components
core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rscore/embed/rust/src/ui/layout_eckhart/cshape/loader.rscore/embed/rust/src/ui/layout_eckhart/firmware/hold_to_confirm.rscore/embed/rust/src/ui/layout_eckhart/theme/mod.rscore/embed/rust/src/ui/layout_eckhart/res/border/*Inspect captured patch +94 / −109
diff --git a/core/embed/rust/src/ui/layout_eckhart/cshape/loader.rs b/core/embed/rust/src/ui/layout_eckhart/cshape/loader.rs
index 51406603..3cad0071 100644
--- a/core/embed/rust/src/ui/layout_eckhart/cshape/loader.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/cshape/loader.rs
@@ -1,4 +1,5 @@
use crate::ui::{
+ constant::SCREEN,
geometry::{Alignment2D, Offset, Point, Rect},
lerp::Lerp,
shape::{self, Renderer},
@@ -10,8 +11,6 @@ use super::{
ScreenBorder,
};
-const SCREEN: Rect = ScreenBorder::SCREEN_SHRUNK;
-
/// Renders the loader. Higher `progress` reveals the `border` from the top in
/// clock-wise direction. Used in ProgressScreen and Bootloader. `progress` goes
/// from 0 to 1000.
@@ -59,41 +58,41 @@ fn get_clip_indeterminate(progress_ratio: f32) -> Rect {
// bit upwards to account for the irregular corner shape
const PATH_POINTS: [Point; 9] = [
// Top start
- Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH),
+ Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::WIDTH),
// Top end
Point::new(
SCREEN.width() - CLIP_SIZE / 2,
- -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH,
+ -CLIP_SIZE / 2 + ScreenBorder::WIDTH,
),
// Right start
Point::new(
- SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
+ SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
CLIP_SIZE / 2,
),
// Right end
Point::new(
- SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
+ SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
SCREEN.height() - CLIP_SIZE / 2 - 60,
),
// Bottom start
Point::new(
- SCREEN.width() - CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
- SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
+ SCREEN.width() - CLIP_SIZE / 2 - ScreenBorder::WIDTH,
+ SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
),
// Bottom end
Point::new(
CLIP_SIZE / 2,
- SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
+ SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
),
// Left start
Point::new(
- -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH,
+ -CLIP_SIZE / 2 + ScreenBorder::WIDTH,
SCREEN.height() - CLIP_SIZE / 2 - 60,
),
// Left end
- Point::new(-CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH, CLIP_SIZE / 2),
+ Point::new(-CLIP_SIZE / 2 + ScreenBorder::WIDTH, CLIP_SIZE / 2),
// Top start - duplicate to close the loop
- Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH),
+ Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::WIDTH),
];
// Calculate which segment we're in and how far along that segment
@@ -134,7 +133,7 @@ fn get_progress_covers(progress_ratio: f32) -> impl Iterator<Item = Rect> {
// Top-right to bottom-right
const PROGRESS_PORTION: f32 = 0.3;
const PROGRESS_START: f32 = 0.11;
- const FULL_HEIGHT: i16 = 502;
+ const FULL_HEIGHT: i16 = SCREEN.height() - ScreenBorder::TOP_ARC_HEIGHT;
let progress = ((progress_ratio - PROGRESS_START) / PROGRESS_PORTION).clamp(0.0, 1.0);
let height = ((1.0 - progress) * FULL_HEIGHT as f32) as i16;
Rect::snap(
@@ -147,12 +146,13 @@ fn get_progress_covers(progress_ratio: f32) -> impl Iterator<Item = Rect> {
// Bottom-right to bottom-left
const PROGRESS_PORTION: f32 = 0.18;
const PROGRESS_START: f32 = 0.41;
- const FULL_WIDTH: i16 = 298;
+ const FULL_WIDTH: i16 =
+ SCREEN.width() - ICON_BORDER_BL.toif.width() - ICON_BORDER_BR.toif.width();
let progress = ((progress_ratio - PROGRESS_START) / PROGRESS_PORTION).clamp(0.0, 1.0);
let width = ((1.0 - progress) * FULL_WIDTH as f32) as i16;
Rect::snap(
SCREEN.bottom_left() + Offset::x(ICON_BORDER_BL.toif.width()),
- Offset::new(width, ScreenBorder::TOTAL_WIDTH),
+ Offset::new(width, ScreenBorder::WIDTH),
Alignment2D::BOTTOM_LEFT,
)
};
@@ -160,7 +160,7 @@ fn get_progress_covers(progress_ratio: f32) -> impl Iterator<Item = Rect> {
// Bottom-left to top-left
const PROGRESS_PORTION: f32 = 0.3;
const PROGRESS_START: f32 = 0.59;
- const FULL_HEIGHT: i16 = 502;
+ const FULL_HEIGHT: i16 = SCREEN.height() - ScreenBorder::TOP_ARC_HEIGHT;
let progress = ((progress_ratio - PROGRESS_START) / PROGRESS_PORTION).clamp(0.0, 1.0);
let height = ((1.0 - progress) * FULL_HEIGHT as f32) as i16;
Rect::snap(
diff --git a/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs b/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs
index 7cbb8aa5..fdc0d2ce 100644
--- a/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/cshape/screen_border.rs
@@ -1,6 +1,6 @@
use crate::ui::{
display::Color,
- geometry::{Alignment2D, Insets, Rect},
+ geometry::{Alignment2D, Rect},
shape::{self, Renderer},
};
@@ -9,47 +9,42 @@ use super::super::{
theme::{ICON_BORDER_BL, ICON_BORDER_BR, ICON_BORDER_TOP},
};
-/// Custom shape for a full screen border overlay, parameterizable by color. In
-/// order to look same-width along the whole screen, the border is placed 1px
-/// from the actual border to account for minor variations in display
-/// production.
+/// Custom shape for a full screen border overlay, parameterizable by color.
pub struct ScreenBorder {
color: Color,
side_bars: [Rect; 3],
}
impl ScreenBorder {
- pub const TOTAL_WIDTH: i16 = 5;
- pub const LINE_WIDTH: i16 = Self::TOTAL_WIDTH - 1;
+ pub const WIDTH: i16 = 5;
pub const TOP_ARC_HEIGHT: i16 = ICON_BORDER_TOP.toif.height();
- pub const SCREEN_SHRUNK: Rect = SCREEN.inset(Insets::uniform(1));
pub const fn new(color: Color) -> Self {
// Bottom bar: from the right edge of bottom-left icon to the left edge of
// bottom-right icon.
let bottom_bar_rect = Rect {
- x0: Self::SCREEN_SHRUNK.x0 + ICON_BORDER_BL.toif.width(),
- y0: Self::SCREEN_SHRUNK.y1 - Self::LINE_WIDTH,
- x1: Self::SCREEN_SHRUNK.x1 - ICON_BORDER_BR.toif.width(),
- y1: Self::SCREEN_SHRUNK.y1,
+ x0: SCREEN.x0 + ICON_BORDER_BL.toif.width(),
+ y0: SCREEN.y1 - Self::WIDTH,
+ x1: SCREEN.x1 - ICON_BORDER_BR.toif.width(),
+ y1: SCREEN.y1,
};
// Left bar: from the bottom edge of top-left icon to the top edge of
// bottom-left icon.
let left_bar_rect = Rect {
- x0: Self::SCREEN_SHRUNK.x0,
- y0: Self::SCREEN_SHRUNK.y0 + Self::TOP_ARC_HEIGHT,
- x1: Self::SCREEN_SHRUNK.x0 + Self::LINE_WIDTH,
- y1: Self::SCREEN_SHRUNK.y1 - ICON_BORDER_BL.toif.height(),
+ x0: SCREEN.x0,
+ y0: SCREEN.y0 + Self::TOP_ARC_HEIGHT,
+ x1: SCREEN.x0 + Self::WIDTH,
+ y1: SCREEN.y1 - ICON_BORDER_BL.toif.height(),
};
// Right bar: from the bottom edge of top-right icon to the top edge of
// bottom-right icon.
let right_bar_rect = Rect {
- x0: Self::SCREEN_SHRUNK.x1 - Self::LINE_WIDTH,
- y0: Self::SCREEN_SHRUNK.y0 + Self::TOP_ARC_HEIGHT,
- x1: Self::SCREEN_SHRUNK.x1,
- y1: Self::SCREEN_SHRUNK.y1 - ICON_BORDER_BR.toif.height(),
+ x0: SCREEN.x1 - Self::WIDTH,
+ y0: SCREEN.y0 + Self::TOP_ARC_HEIGHT,
+ x1: SCREEN.x1,
+ y1: SCREEN.y1 - ICON_BORDER_BR.toif.height(),
};
Self {
color,
@@ -68,17 +63,17 @@ impl ScreenBorder {
// Draw the irregular corner shapes
[
(
- Self::SCREEN_SHRUNK.top_left(),
+ SCREEN.top_left(),
ICON_BORDER_TOP.toif,
Alignment2D::TOP_LEFT,
),
(
- Self::SCREEN_SHRUNK.bottom_left(),
+ SCREEN.bottom_left(),
ICON_BORDER_BL.toif,
Alignment2D::BOTTOM_LEFT,
),
(
- Self::SCREEN_SHRUNK.bottom_right(),
+ SCREEN.bottom_right(),
ICON_BORDER_BR.toif,
Alignment2D::BOTTOM_RIGHT,
),
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/hold_to_confirm.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/hold_to_confirm.rs
index d9db40d2..10aa709a 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/hold_to_confirm.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/hold_to_confirm.rs
@@ -225,10 +225,8 @@ impl HoldToConfirmAnim {
let progress = (elapsed / self.rollback_duration()).clamp(0.0, 1.0);
let clip_width = (progress * SCREEN.width() as f32) as i16;
Rect::from_center_and_size(
- SCREEN
- .top_center()
- .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
- Offset::new(clip_width, ScreenBorder::TOTAL_WIDTH),
+ SCREEN.top_center().ofs(Offset::y(ScreenBorder::WIDTH / 2)),
+ Offset::new(clip_width, ScreenBorder::WIDTH),
)
}
@@ -236,15 +234,11 @@ impl HoldToConfirmAnim {
let progress = (elapsed / self.total_duration).clamp(0.0, 1.0);
const TOP_GAP_ZERO: Rect = Rect::from_center_and_size(
- SCREEN
- .top_center()
- .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
+ SCREEN.top_center().ofs(Offset::y(ScreenBorder::WIDTH / 2)),
Offset::zero(),
);
const TOP_GAP_FULL: Rect = Rect::from_center_and_size(
- SCREEN
- .top_center()
- .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
+ SCREEN.top_center().ofs(Offset::y(ScreenBorder::WIDTH / 2)),
Offset::new(SCREEN.width(), ScreenBorder::TOP_ARC_HEIGHT),
);
match progress {
@@ -255,8 +249,8 @@ impl HoldToConfirmAnim {
let clip = Rect::from_center_and_size(
SCREEN
.bottom_center()
- .ofs(Offset::y(-ScreenBorder::TOTAL_WIDTH / 2)),
- Offset::new(width, ScreenBorder::TOTAL_WIDTH),
+ .ofs(Offset::y(-ScreenBorder::WIDTH / 2)),
+ Offset::new(width, ScreenBorder::WIDTH),
);
(clip, TOP_GAP_FULL)
}
@@ -266,7 +260,7 @@ impl HoldToConfirmAnim {
let sides_progress = ((p - Self::BOTTOM_DURATION_RATIO)
/ Self::SIDES_DURATION_RATIO)
.clamp(0.0, 1.0);
- let height = i16::lerp(ScreenBorder::TOTAL_WIDTH, SCREEN.height(), sides_progress);
+ let height = i16::lerp(ScreenBorder::WIDTH, SCREEN.height(), sides_progress);
let clip = Rect::from_bottom_left_and_size(
SCREEN.bottom_left(),
Offset::new(SCREEN.width(), height),
@@ -288,9 +282,7 @@ impl HoldToConfirmAnim {
let eased_progress = ease.eval(top_progress);
let width = i16::lerp(SCREEN.width(), 0, eased_progress);
let top_gap = Rect::from_center_and_size(
- SCREEN
- .top_center()
- .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
+ SCREEN.top_center().ofs(Offset::y(ScreenBorder::WIDTH / 2)),
Offset::new(width, ScreenBorder::TOP_ARC_HEIGHT),
);
(SCREEN, top_gap)
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BL.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BL.png
index 03f3117b..e54b86fd 100644
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BL.png and b/core/embed/rust/src/ui/layout_eckhart/res/border/BL.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BL.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/BL.toif
index 53230c1b..6b046416 100644
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BL.toif and b/core/embed/rust/src/ui/layout_eckhart/res/border/BL.toif differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.png
deleted file mode 100644
index 8eeaf775..00000000
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.png and /dev/null differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.toif
deleted file mode 100644
index e8517979..00000000
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.toif and /dev/null differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BR.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BR.png
index 76da10a6..8cfaaf9d 100644
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BR.png and b/core/embed/rust/src/ui/layout_eckhart/res/border/BR.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BR.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/BR.toif
index 37314093..4b2c73ef 100644
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BR.toif and b/core/embed/rust/src/ui/layout_eckhart/res/border/BR.toif differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.png
deleted file mode 100644
index 25c012e5..00000000
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.png and /dev/null differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.toif
deleted file mode 100644
index 6d130370..00000000
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.toif and /dev/null differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.png b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.png
index fb7822f7..64792615 100644
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.png and b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.png differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.toif
index ba931577..f72d44de 100644
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.toif and b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP.toif differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.png b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.png
deleted file mode 100644
index 1d5ceb4b..00000000
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.png and /dev/null differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.toif b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.toif
deleted file mode 100644
index 3d9555c5..00000000
Binary files a/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.toif and /dev/null differ
diff --git a/core/embed/rust/src/ui/layout_eckhart/res/border/note.md b/core/embed/rust/src/ui/layout_eckhart/res/border/note.md
deleted file mode 100644
index 409f51b9..00000000
--- a/core/embed/rust/src/ui/layout_eckhart/res/border/note.md
+++ /dev/null
@@ -1,2 +0,0 @@
-TOP, BL, BR icons are supposed to be used completely at the edge of the display.
-TOP_1, BL_1, BR_1 are adjusted to be rendered with 1px offset from the edge. See screen_border.rs for more details.
diff --git a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
index 1bf304e2..aee0bbde 100644
--- a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
@@ -136,9 +136,9 @@ include_icon!(ICON_BATTERY_LOW, "layout_eckhart/res/battery/low.toif");
include_icon!(ICON_BATTERY_EMPTY, "layout_eckhart/res/battery/empty.toif");
// Border overlay icons for bootloader screens and hold to confirm animation
-include_icon!(ICON_BORDER_BL, "layout_eckhart/res/border/BL_1.toif");
-include_icon!(ICON_BORDER_BR, "layout_eckhart/res/border/BR_1.toif");
-include_icon!(ICON_BORDER_TOP, "layout_eckhart/res/border/TOP_1.toif");
+include_icon!(ICON_BORDER_BL, "layout_eckhart/res/border/BL.toif");
+include_icon!(ICON_BORDER_BR, "layout_eckhart/res/border/BR.toif");
+include_icon!(ICON_BORDER_TOP, "layout_eckhart/res/border/TOP.toif");
// Icons for number input screen
include_icon!(ICON_PLUS, "layout_eckhart/res/plus.toif");
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index b7f3dc31..f55b68c2 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -28874,12 +28874,12 @@
"T3W1_cs_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "b2bc45653ec49f979d64969ed19e8e1a117c11392831e03a5a551f32e1abedb3",
"T3W1_cs_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "e4c0500a5957ce0f4e216c471a35bcf811385e3d6bb101349f6afb2e459f30de",
"T3W1_cs_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "17bb4ef41fb5e048fe97fa036e94c3c4d9e7c2424042924168d1e24e4d944146",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "c2612523954bea8eea8b72cf327c05c2acfa54b89c9d4209a8c7a67e9b112568",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "cad9bb653d24d3d32e8ad1f7135c90cb2a6c857ef004d03878da120e8b0b6868",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_full_completion": "a61451827469b199bf515daf87723c16b1eb7b972e9186b4bad14f98d062deef",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_close": "2e154e4adb500e3f1e121de6279d20c18a1ff5e5f5f7603f41080314eca1ecb2",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "4576e3b6a31fdd5e7a24e3f2d1e8f5fd5ca1259b43515a801c855dc68661dcf6",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_restart": "d26eb48e6ed5c1b1ce4c638f676ba46cf968137cc0f9d2f7822b99b7bfc1c7d4",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "544320b07f75b03662a6fae4d3888bcc37386a215e02b82c5bd8488d68f21b9e",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "b2ff92cdb5c7a0363670ff04d543ae3f30c9e5d7ec61a1fdafb5d9185fd6b355",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_full_completion": "9c9c1d9fda29d886241aff91e417b2b523be3fa2b51aef700869040ded49ba2b",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_close": "d3f8fd51dd89bbbba0ed35a039aa8a80d0c18588456e39e3e88a05a01d72cfea",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "cb1a8c2e5615127355373f6ce8f6451acc1ff7446a580df4f700d556ef12f6fb",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_restart": "1317eddb39cddbee649858594b1eddac5f0f482787a6866851d42bbd09d1ebe4",
"T3W1_de_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "4e7039853f8840b953a1003575b84b1b207017df9eff5ec1bf70ebec37f97be5",
"T3W1_de_test_autolock.py::test_autolock_does_not_interrupt_signing": "2b9a53a874d2fbd1632d2147ea690658ac589268d6fbe1e1dbc3168d8f593a7a",
"T3W1_de_test_autolock.py::test_autolock_interrupts_passphrase": "985ae0cb82525e634741bb72815aaf2e06d7684ece8c05942de8ba82f654c0fb",
@@ -28934,12 +28934,12 @@
"T3W1_de_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "c178a70ea6b252792473c314c5bf1450a54fc3639f2ffc9952c9adfea42be056",
"T3W1_de_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "147ee89707421eec71e2ad900e391a0c7967cab224efd8c19f40702e765a1ffa",
"T3W1_de_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "1c880156e427d8c05d51687a6c0806412db423e1bb67c4f8b19937d18076f09d",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "7be1088ca6a69d88403be0f70aa5f500edf32f0c781ae7867448891c83f9d6b1",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "ec8b568f2bebf21b421f39d3d27d4ec04d2202b950cd0e55455707610471965c",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_full_completion": "6447f19ea4bf60b00726ade4d93a86ff1fee1e7c8e8ad956fe8d127331cef68d",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_close": "9e6b1a9a8e135d8a2772f77e3126f6a195cafbec3acecb1f1a4671fb77ed0263",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "e30e7a3617aaa6f0926f9b557d0b68042ba6ba6c8c9f1f20c05773c5f0669107",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_restart": "1b57a4cf08cea5d0a64d00ce96251e90152232ee80004b0ddf7718b1b24ae09e",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "36d4faf56cd46cc8aa177b102c652cca4dfbee8031e375725d2ba532fffed8bf",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "dd3509af393ef778680bb86694e9e3e58d64560f08504bddb6beb100a72068b1",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_full_completion": "704dad46ff9389302fad268ed76b20e85d91ffccd8777dcc10daabff46821ebf",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_close": "e5b18caa9285069b67689c75d047f4a1e5e5d07dd90d3f6fadf17701c5731385",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "a4f36da07e8cd6f472e53f311e74a78558a7054df6e6c51ffe7aa80758c08f39",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_restart": "f6afc8654d4481f12ee0faca1f78d50644766475e8888506fe98c5874fbe378e",
"T3W1_en_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "060a9daf0f5d8ceed76e223755059f9fd7728a64818644964cdd0631979d05ee",
"T3W1_en_test_autolock.py::test_autolock_does_not_interrupt_signing": "2ee6ce1fdd78d5869690d1a3b9f1aad441e8d17a69efa6f064f0070f5686aedb",
"T3W1_en_test_autolock.py::test_autolock_interrupts_passphrase": "5f60b98ad8a3919e0dc65dd7415e0c5bdbc5461500ab8070185272a55e15a6d7",
@@ -28994,12 +28994,12 @@
"T3W1_en_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "5328c1e36d1399bb171989504fc2b6d2aff34d12a9ffd8e29fdd0aead6e484b7",
"T3W1_en_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "93bc1848aa4150aef6c66501c1f48b50cc9f4481b8f13e0dd9992a82d3f68eb0",
"T3W1_en_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "dedf31317f3c18482a93faa020771eef40bddff10d5e00f4e9bbd97185c1f908",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "e056bd2d4b14125c9696f77a9de0b6b71595e4cea88926cab0272425d2dde284",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "25a3f38a19de41600dc01ca376061559bc1702dcc802ba50da1b62f252f6d4a2",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_full_completion": "2a4add811d8026f543192a11f04004dface1f766817e1114469a2df46cd09d0e",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_close": "40d872f1a3ab1466aa43f203814e65bb40965fc237ce5223fe70f80080616b77",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "faf6ee6a1e7fda0d464374694e99ec8b15096e561081d2165037de861db3ccd5",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_restart": "13ae50ecc4d56d37a92464e39e98dec321966687d47df9a805143ec7bcfcaca0",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "a403e96b3dd17bd7d12c6762f54af65520d5692d04e3951ebd4f914394516ef4",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "c323dea6e4acbedbc5b7e6a569cf58af5922debad7822e7e3ec889df5abf6239",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_full_completion": "5384266a47026700d8508605bb7995288bfe7a3a0fd0664566ed615fcb6ec657",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_close": "8cc7ceca4f5f26a1a6427653f2d732159e9f2a9ab609544873126cadea3a3bc0",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "5551c6f9776497b11a1a27a7051ba8d21b93ce092278b7b9d45f083f43681d88",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_restart": "372810298d4e9f06857043e19758fd7d78723414b03e2154d3097ac7df64d6d5",
"T3W1_es_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "09f47a5867ebf5d878a9b1a0ef4fc9ab88ad418ff0e2fe10b1a7c986e6dd377c",
"T3W1_es_test_autolock.py::test_autolock_does_not_interrupt_signing": "2d9ac3411ef9a28225282838562eeeac38885e40dbc820ffd26e8d9303a54b75",
"T3W1_es_test_autolock.py::test_autolock_interrupts_passphrase": "0ab05f9c2618121252cfabffe49b09d3bc8661f51c835d81fb350784f40a9877",
@@ -29054,12 +29054,12 @@
"T3W1_es_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "d27bc4cf25b1bece8772d45e2a6559f0145e76e1bb2caac6930b8a6b094a599c",
"T3W1_es_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "f2443596c7dbf679c352d8c2cc2b03fb1a84fad7cacdd748f2d9cd91f6793101",
"T3W1_es_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "092f9fce969f4b5b726de340394bbc62a701629277be125d89e6c816e020278c",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "2afe6d2495ad916757cc9a257921b34e84d7e8c8bb2a12092a148bdcba2da51b",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "d63c6ad81c463dd4bb80c4dda2466b6c86ae20e83973d2c0487e7a0d451241e4",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_full_completion": "e1c0258586293050dda14dfbcead0f6814af834dceb963eb1b6de5257384f8e4",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_close": "e69d1f05df0d5a5c46e9112d060d122fda6470454773f368fda37b51502900ce",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "c3694bce95fe663aeea056e8cb9eda3cd43fda5aa6816fc6d8a6eb09d9d277a2",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_restart": "9d98d98b79be99b4b9a268d1a898bfc3e262323586ec922694c5ebd83b10512b",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "9b7b5505289a6ec449d420f2622f737b4b15fc83afad4e645864a1a6faabd1e6",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "d0db2a30992f179a8b1f911b79ab6390bc1ede023c7e56101f5c863f62905fff",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_full_completion": "f77e4ebd3d08e0ffb6f6240e384aded9fe7bc0609bccbe3c3528f038184311d0",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_close": "77f4ec21af4a215a09b792a8220b53b93274d53dfd3fd59e3fda8cf47b85042d",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "a105c977844a6785a11c7a8c7be9c35ca92cf0f378e15f89e05c071d530e05a6",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_restart": "a7385f00520cc607e85a70f7c4dc05e71cc0af0f8eb569db28299d9c8de26e50",
"T3W1_fr_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "839938053ffdd3a920d70a2bde8427be63e16d0e7555b960ac3e2c52cb4f25c5",
"T3W1_fr_test_autolock.py::test_autolock_does_not_interrupt_signing": "0c370820106050b9b8f45cd449b9249677f2bf28f9d900329ec7b337061c6a90",
"T3W1_fr_test_autolock.py::test_autolock_interrupts_passphrase": "38cf3fe298bc5a265c14eb39431532db87fb08f4a9efe9d890aeae9a578c8af5",
@@ -29114,12 +29114,12 @@
"T3W1_fr_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "0c3a0bfddee02c38bdd959f3b371695037d8b0c995c15bcf9bdce1dae5f3a8a2",
"T3W1_fr_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "e333ac7711de6e8ae6249c4230184f3a2cb85bfd29f1b2bf7cd0c7a91d979c40",
"T3W1_fr_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "3e2289387038faf3b975d271fffd3ee555939441ce96c7c7d6cae270cc3e668a",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "a9655da68efbfa36c3a559b965d9faa1fc3b1eac7ed2b4dd827844c936e3d85b",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "ac62bf51dd769b685b312a827985ffdebdfa75a557533c6b8dac1f1904289bcc",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_full_completion": "25a2debc2db1c49beaba01677afec0fdad82fff6f00538d489ce07d327dfb036",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_close": "a9a96a96885f737bafdcea22b38fcf197e289cef31f5b542a0f084bed011ba26",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "fe3bdc50199bb57e0e26aa0f1b92c3b9c884f0396d8f53ae7acc8f73e8e9cb68",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_restart": "1555e0f32eec04b54d6915d7557d39049a044649248895f6121b176fe35a775e",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "730488e1b466a7fdab80512c6ebd458e2aaa49b17b56e28fe448fff1a9084cb4",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "1048fc68a6985b578208aa09166b3cb62d0fd61a9db67128fc27421954f3afe5",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_full_completion": "4038af73c76bafd3ca0dc922187930d226666062445e51e8dd15764867f74265",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_close": "95985c12fe9bc738823023c5f1fb7c4b5b1aacdd65f7154e5e80f3cabacd75ed",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "f8a3c08d6657c40fbebb1747da541e4be6bc16d16e44f261abedf1c962940c51",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_restart": "dbd7e4df52fd969f03cf82499f7d8758f88e8c494a9ae134a1cb8d16536a75e4",
"T3W1_pt_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "55a6c9b57d940b275aa38784364015e35b6bbcdcf25dd7525056ce9b31c778e3",
"T3W1_pt_test_autolock.py::test_autolock_does_not_interrupt_signing": "5970508fe5625ab6f3bbc0b3fb84b30d4d31f97f9e9501a02ff4bdd3a6607612",
"T3W1_pt_test_autolock.py::test_autolock_interrupts_passphrase": "c3aeaec58a097cbd25929f482856d37bfd036bac4278f9072a615458a43d2cbe",
@@ -29174,12 +29174,12 @@
"T3W1_pt_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "71e75f5d384a7913677a99f33879db2976d28f5cd2216b01f44bb5bbc0a0bf82",
"T3W1_pt_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "38c64edd71dd779aaa24c8428ffd47e520d823a8af2476a0a575907a2eeeaae7",
"T3W1_pt_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "592663a97b60ba2d4c092a31b0e6d88f88eae786c07d8a931b8011e9f19ad3a3",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "b64b3f5aee1b0feaaad4a30142837928fa9c35fb9b01451cf1dc633808dfa35e",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "8fda2f078e713161476a3869c6e53cb7fea8ae11287dd819983340c66b556afd",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_full_completion": "b65f83fd7c4e6e63dee0108e48cb87fa084ef882c435017119c1afa856b5b9e5",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_close": "1fc5d8e7a3118d8d2c42031846cc0a4707b8197fe962d0406c7ab20aed470d74",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "d0a1800e87e6e820b879e7f6fd4f958e7a76018074a487300a2294b00668843b",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_restart": "b7690a69bd982101c9d7316ea070ccd3aea2c21f81d447bb03f9fbf6eaf598e2"
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "73b04d7932eaf3fbb460bdc5cc28d3cec88287f8dcf0783d7341a018aec50741",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "a89020b7737aeb53418891a373177ec896ce8fd73b46e685bf10239d0df98e88",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_full_completion": "c0bdbcdbfe84ab3529546279d0e3ce426e6cdf050dfa9cd75de40b9422159f2d",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_close": "99d0f9f944fddb5ecce7cb49b69cadabe0a2bfd35c2f6f28192db5673dd418c5",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "cc19b0c582057059a8e86c2cbdc4323476a270d51c7f59d3938a9794ae4b23cb",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_restart": "3c4de0f6ca7631f53c35e6b772b60ade6786a73287a128bd3182a87c3384563d"
},
"device_tests": {
"T3W1_cs_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "fedf1f334e68809f7e921c7de5d8e9cb43ef2bcc46e6d61539eca3c05c5964d2",
@@ -30508,8 +30508,8 @@
"T3W1_cs_test_basic.py::test_device_id_same": "853a32ceeb8812c211a9facd79dac1993c6977cc360d3ee1445ee8f79080935a",
"T3W1_cs_test_basic.py::test_ping": "c24521e569c08e3605b164212c876f8ac57c5eef6cca6f2ca53a635a883ebc4b",
"T3W1_cs_test_ble.py::test_ble_unpair_all": "1eff8f365d4986e5e52a4271966d3150f00008cc0de1e804ad2c8f8ff2221950",
-"T3W1_cs_test_busy_state.py::test_busy_expiry_core": "9f4d831de73e586dac1af47d844bf78be2d67408d4e3540dc30c6bce94c9a183",
-"T3W1_cs_test_busy_state.py::test_busy_state": "9d1f87a21fa3b63f415323c39a419b99b6ac75984313826900c94fb62788ca79",
+"T3W1_cs_test_busy_state.py::test_busy_expiry_core": "33261c6dd5c0144526e35f9ac62e996de72663e965be7c425948fdfb5753b470",
+"T3W1_cs_test_busy_state.py::test_busy_state": "7161c906a082532fef968bcc5f4657f8f01a229d058a2c6c74d061e8b6e27034",
"T3W1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "62bed332244d46efd965f95dedc03a8bdfb440d2ea5f05631b8bbb54b3b50ffe",
"T3W1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "250a29674c9500455d83905a9bda0e9c34636cce65412b3f542f56e30e34142c",
"T3W1_cs_test_cancel.py::test_cancel_on_paginated": "27e2727c98f7ded08467447834bb0f15d2add9217d1f7b73ae37202199f0c545",
@@ -31997,8 +31997,8 @@
"T3W1_de_test_basic.py::test_device_id_same": "15200963c2c43c983dedefcb92c8b47e5f9289d40c2dd1b10d67ff4aa105eca2",
"T3W1_de_test_basic.py::test_ping": "98735f888f827501b25c78c6a737c1983a800c620f709c65b1d95f6c8c9a2b90",
"T3W1_de_test_ble.py::test_ble_unpair_all": "c182d267bcf82e528564cb200f444cbee91f2d92bb7ddb51d247bd4811dc6178",
-"T3W1_de_test_busy_state.py::test_busy_expiry_core": "fe8e5dbe730131ba33c6800cbc7ea5e3f6ec35952e74b403257435e4c8ae9542",
-"T3W1_de_test_busy_state.py::test_busy_state": "b8fa50f8f94612b08a667112f2c9bcfe93d5b9858ff20e8b110c5375d8a62a5c",
+"T3W1_de_test_busy_state.py::test_busy_expiry_core": "fa8b0078cbe5b6eb14bd294f549ee8a754b7e7dbe86a4f7afa2a980f8ba6b2d6",
+"T3W1_de_test_busy_state.py::test_busy_state": "3e32188d8cd260c51815d9a286eb34c1be6324f2f71f75a92d98d72864684e57",
"T3W1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "8466d6aa0191cbf44d11437c15187148c41044a77716991e5506fde4fd7b6518",
"T3W1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "4527eac516deffe3a3b72422ecaa1b219c7a61718684b51252e732198bbc0b7c",
"T3W1_de_test_cancel.py::test_cancel_on_paginated": "2e2fb25dc3be1ff0718dc6652af314a54d5f99b96c7585124af3d6ed198d882f",
@@ -33486,8 +33486,8 @@
"T3W1_en_test_basic.py::test_device_id_same": "f568c7c8e69544ab1b6bab4afa1bc95f85b014c2f75695d30a85d01b1a99871f",
"T3W1_en_test_basic.py::test_ping": "931d9afceb0ba1e4faae891775819277242d889644d5c0c5863fc8c9fcf859b1",
"T3W1_en_test_ble.py::test_ble_unpair_all": "4be9606be0d89e633be35e0f05b23fac0f45c21b658817bad7d8bd474a81da50",
-"T3W1_en_test_busy_state.py::test_busy_expiry_core": "9911b2c22ec3e01fd2997c8ea579dd4a40cb8f83924925704e0aa8fd163a92a9",
-"T3W1_en_test_busy_state.py::test_busy_state": "26e350c7f41d424f82fc66c37267fbf4fae2a94ddc40b3434ee050c51ece0887",
+"T3W1_en_test_busy_state.py::test_busy_expiry_core": "cf458ac4c1e883ef76eb944610e852c42c8bec52ea6150efc6f8dc3905695cc1",
+"T3W1_en_test_busy_state.py::test_busy_state": "bade9824a8479d83a70ed0dff5dc34ee7ffbcd518b811d6e30d2bdbdc59ba605",
"T3W1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "554305cd87d6bbdbcabf796978bc16c32ac8395b114bddfe1d856b359f2423a7",
"T3W1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "2949fdae8a2569a1bb5c9bf0d7cce480c2ac518e1a882924f13520c5f3553639",
"T3W1_en_test_cancel.py::test_cancel_on_paginated": "d6b95cec1952edbc484cb5237e81f3dc7b0242db77baf8d64276c93ae832f752",
@@ -34975,8 +34975,8 @@
"T3W1_es_test_basic.py::test_device_id_same": "2d116b70b067cdfb6eeaeca58c1881078947117d3c0b06a984a730b474bb9869",
"T3W1_es_test_basic.py::test_ping": "56536ae9cd7c4ff8022def4ec3350031d3614064d961f53a2850f2be425af201",
"T3W1_es_test_ble.py::test_ble_unpair_all": "4b05204c78c0dd4029dbdae60fc26187b2570af1a488bf21ed0f0201e4b74b0d",
-"T3W1_es_test_busy_state.py::test_busy_expiry_core": "bdb4e38629312d5a49ccf65b2f3c8fc5c9ac65146ed08ee52cb6d01a20bafedd",
-"T3W1_es_test_busy_state.py::test_busy_state": "cd8693c04c5886f710a11aa8da4a607d78009dbbb00712075d050670d6b2362d",
+"T3W1_es_test_busy_state.py::test_busy_expiry_core": "57b59b7fe0dfc179f76f91e0241a16f1138a65dd848dd7ddddaeabe374ab6f18",
+"T3W1_es_test_busy_state.py::test_busy_state": "e0a8e423ff3cca5040984a1ce57a1450be95c8056e7b594148bdaf4052b6215c",
"T3W1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "0a74d5a1c99fc831e116192316a95f13c352cd62500cd1dbc2b31f5d8092247a",
"T3W1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "85692699923c07c0ec90a77a84d7b712ea31fe9e68027babc1ed741867a05cdc",
"T3W1_es_test_cancel.py::test_cancel_on_paginated": "89a34e1d9a32ebf4b64f9050e04a25df36e78d3993e562a169e75263a57b0e10",
@@ -36464,8 +36464,8 @@
"T3W1_fr_test_basic.py::test_device_id_same": "6dceb920c1ee1a73f5f4004c25b83dfc6f60bf45dac361fc7f2f8820ad90713f",
"T3W1_fr_test_basic.py::test_ping": "e8156cf4eda1d29060f05b4a18d50032b0b344230609b7de7cababfe0a86b20b",
"T3W1_fr_test_ble.py::test_ble_unpair_all": "9c3cf89d2b61e0ed040b50ca72d25e3894a62ae2be1585e5c0f3b6306920f4b7",
-"T3W1_fr_test_busy_state.py::test_busy_expiry_core": "69d2c1c33ee7f284bb47e79ddd1bd15b980309a3dcf8d6afd2a7928842c301a0",
-"T3W1_fr_test_busy_state.py::test_busy_state": "1f84ef541654e0be19fe7cbb573ea7882a54f829dd01f0aea9377b8149860d11",
+"T3W1_fr_test_busy_state.py::test_busy_expiry_core": "531be89d3f190815797a4090e0a0aea136b930832d9ebc61d1b35264d292217d",
+"T3W1_fr_test_busy_state.py::test_busy_state": "fbf565b5287a6f0c677b2cb16cd3e85d000d6643d27047d005f462b71be02b8a",
"T3W1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "7e9993594536860786bdb06982f25e4e4e5f7fc33c2efbc68be309b6c1345c36",
"T3W1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "daee8f81f9023bcae2961f99340c0f9749532e53fcf2bea32f18d38a2442feab",
"T3W1_fr_test_cancel.py::test_cancel_on_paginated": "1a4cbacbb9aa4088c4341c4c9ac0d56bdeb0e8f934c831556d5e0ba261651d0a",
@@ -37953,8 +37953,8 @@
"T3W1_pt_test_basic.py::test_device_id_same": "3ba1688915fd0c28ad222eed14e19c7e235e230a63995dd90ee0dd071a1f593c",
"T3W1_pt_test_basic.py::test_ping": "1c74667c078e25e7e0d37c7b2aa35f7c8ab02cd88e74695ecb355c82a293b0cc",
"T3W1_pt_test_ble.py::test_ble_unpair_all": "cfb8077edf93d6acf1fd52dd1ed04518e6ec6e7d58bee1a95b0dbcc699a7f904",
-"T3W1_pt_test_busy_state.py::test_busy_expiry_core": "9c300b20e5174425dfdfcf08f6a1a672fdd56dc8d14acb87331a35a19e60c47c",
-"T3W1_pt_test_busy_state.py::test_busy_state": "f9f909a57882de27b2036aa83c1da116940826b787728168586818d60ba322c3",
+"T3W1_pt_test_busy_state.py::test_busy_expiry_core": "7f49c21dd6a8d6fe6fd9bd31e2bd6c07bc05fe52d874783ab4db133616b04b5f",
+"T3W1_pt_test_busy_state.py::test_busy_state": "48b57eb695a3e8287edf816478e2874ed4978e46c3a7ada7281c680a8566687c",
"T3W1_pt_test_cancel.py::test_cancel_message_via_cancel[message0]": "947b4ab58e7807a316763c0364f3b454a0c5be8cffd3796a2b6fd6a6b7d3a346",
"T3W1_pt_test_cancel.py::test_cancel_message_via_cancel[message1]": "d4dd1f545dee63af94a760831aea535c0477277b0eaf27c465e4da7951d4fb8a",
"T3W1_pt_test_cancel.py::test_cancel_on_paginated": "041e30819d4fda45245d4eda8d9ac2f0457a38c462f55a7f944ba554c874666e",
@@ -38124,7 +38124,7 @@
"T3W1_en_test_shamir_persistence.py::test_abort": "39df8d4cf330bc8b1aff54e2bb95c0bcdb763b4d3ede66e622d3dee7ad1cfd21",
"T3W1_en_test_shamir_persistence.py::test_recovery_multiple_resets": "fe4f7320c12bed47864d1ae4473f706a587dac64b43d40f82d7bef0fd10be06c",
"T3W1_en_test_shamir_persistence.py::test_recovery_single_reset": "90ea0b3249a93fbb9f0b2169faa274a40a90700fa53494de67c4a31dc1cc2dd8",
-"T3W1_en_test_wipe_code.py::test_wipe_code_activate_core": "f14893d37e3487474f58b21dfbff3fd82314ece82a7a66f2b5dcee756af335e6"
+"T3W1_en_test_wipe_code.py::test_wipe_code_activate_core": "fa7079f0135e2adb726c17f0ea280c30b31738bf3168efd22878a7983e389536"
}
}
}
Why this scored 15/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.