feat(core): adjust Eckhart screen border
What changed, and why it matters
This commit is a cosmetic tweak for the Trezor hardware wallet's screen border. It shifts the decorative border inward by one pixel and updates the corner icons so the line looks evenly thick on different physical screens. There is no security-relevant change here.
No security action needed. Treat as a normal UI/visual-quality change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change adjusts the Eckhart layout’s full-screen border overlay. It introduces a 1 px inset (SCREEN_SHRUNK), renames the border width constant from WIDTH to TOTAL_WIDTH (5 px, with a 4 px visible line), and swaps the corner TOIF assets to new versions offset by 1 px. The loader and hold-to-confirm animations are updated to use the new constants. UI test fixture hashes are regenerated accordingly. No cryptographic, input-validation, memory-safety, or authentication logic is touched.
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 +108 / −96
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 44d632d0..f7ce2c0d 100644
--- a/core/embed/rust/src/ui/layout_eckhart/cshape/loader.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/cshape/loader.rs
@@ -1,5 +1,4 @@
use crate::ui::{
- constant::SCREEN,
geometry::{Alignment2D, Offset, Point, Rect},
lerp::Lerp,
shape::{self, Renderer},
@@ -10,6 +9,8 @@ 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.
@@ -55,41 +56,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::WIDTH),
+ Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH),
// Top end
Point::new(
SCREEN.width() - CLIP_SIZE / 2,
- -CLIP_SIZE / 2 + ScreenBorder::WIDTH,
+ -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH,
),
// Right start
Point::new(
- SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
+ SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
CLIP_SIZE / 2,
),
// Right end
Point::new(
- SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
+ SCREEN.width() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
SCREEN.height() - CLIP_SIZE / 2 - 60,
),
// Bottom start
Point::new(
- SCREEN.width() - CLIP_SIZE / 2 - ScreenBorder::WIDTH,
- SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
+ SCREEN.width() - CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
+ SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
),
// Bottom end
Point::new(
CLIP_SIZE / 2,
- SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::WIDTH,
+ SCREEN.height() + CLIP_SIZE / 2 - ScreenBorder::TOTAL_WIDTH,
),
// Left start
Point::new(
- -CLIP_SIZE / 2 + ScreenBorder::WIDTH,
+ -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH,
SCREEN.height() - CLIP_SIZE / 2 - 60,
),
// Left end
- Point::new(-CLIP_SIZE / 2 + ScreenBorder::WIDTH, CLIP_SIZE / 2),
+ Point::new(-CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH, CLIP_SIZE / 2),
// Top start - duplicate to close the loop
- Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::WIDTH),
+ Point::new(CLIP_SIZE / 2, -CLIP_SIZE / 2 + ScreenBorder::TOTAL_WIDTH),
];
// Calculate which segment we're in and how far along that segment
@@ -148,7 +149,7 @@ fn get_progress_covers(progress_ratio: f32) -> impl Iterator<Item = Rect> {
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::WIDTH),
+ Offset::new(width, ScreenBorder::TOTAL_WIDTH),
Alignment2D::BOTTOM_LEFT,
)
};
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 19e0bad3..7cbb8aa5 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,51 +1,55 @@
use crate::ui::{
display::Color,
- geometry::{Alignment2D, Rect},
+ geometry::{Alignment2D, Insets, Rect},
shape::{self, Renderer},
};
use super::super::{
- constant,
+ constant::SCREEN,
theme::{ICON_BORDER_BL, ICON_BORDER_BR, ICON_BORDER_TOP},
};
-/// Custom shape for a full screen border overlay, parameterizable by color.
+/// 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.
pub struct ScreenBorder {
color: Color,
side_bars: [Rect; 3],
}
impl ScreenBorder {
- pub const WIDTH: i16 = 4;
+ pub const TOTAL_WIDTH: i16 = 5;
+ pub const LINE_WIDTH: i16 = Self::TOTAL_WIDTH - 1;
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 {
- let screen = constant::screen();
-
// Bottom bar: from the right edge of bottom-left icon to the left edge of
// bottom-right icon.
let bottom_bar_rect = Rect {
- x0: screen.x0 + ICON_BORDER_BL.toif.width(),
- y0: screen.y1 - Self::WIDTH,
- x1: screen.x1 - ICON_BORDER_BR.toif.width(),
- y1: screen.y1,
+ 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,
};
// Left bar: from the bottom edge of top-left icon to the top edge of
// bottom-left icon.
let left_bar_rect = Rect {
- x0: screen.x0,
- y0: screen.y0 + Self::TOP_ARC_HEIGHT,
- x1: screen.x0 + Self::WIDTH,
- y1: screen.y1 - ICON_BORDER_BL.toif.height(),
+ 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(),
};
+
// Right bar: from the bottom edge of top-right icon to the top edge of
// bottom-right icon.
let right_bar_rect = Rect {
- x0: screen.x1 - Self::WIDTH,
- y0: screen.y0 + Self::TOP_ARC_HEIGHT,
- x1: screen.x1,
- y1: screen.y1 - ICON_BORDER_BR.toif.height(),
+ 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(),
};
Self {
color,
@@ -54,9 +58,6 @@ impl ScreenBorder {
}
pub fn render<'s>(&'s self, alpha: u8, target: &mut impl Renderer<'s>) {
- let screen = constant::screen();
-
- // Draw the four side bars.
self.side_bars.iter().for_each(|bar| {
shape::Bar::new(*bar)
.with_bg(self.color)
@@ -64,20 +65,20 @@ impl ScreenBorder {
.render(target);
});
- // Draw the four corners.
+ // Draw the irregular corner shapes
[
(
- screen.top_left(),
+ Self::SCREEN_SHRUNK.top_left(),
ICON_BORDER_TOP.toif,
Alignment2D::TOP_LEFT,
),
(
- screen.bottom_left(),
+ Self::SCREEN_SHRUNK.bottom_left(),
ICON_BORDER_BL.toif,
Alignment2D::BOTTOM_LEFT,
),
(
- screen.bottom_right(),
+ Self::SCREEN_SHRUNK.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 ba0a9dc0..ab3ba1d1 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
@@ -215,8 +215,10 @@ 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::WIDTH / 2)),
- Offset::new(clip_width, ScreenBorder::WIDTH),
+ SCREEN
+ .top_center()
+ .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
+ Offset::new(clip_width, ScreenBorder::TOTAL_WIDTH),
)
}
@@ -224,11 +226,15 @@ 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::WIDTH / 2)),
+ SCREEN
+ .top_center()
+ .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
Offset::zero(),
);
const TOP_GAP_FULL: Rect = Rect::from_center_and_size(
- SCREEN.top_center().ofs(Offset::y(ScreenBorder::WIDTH / 2)),
+ SCREEN
+ .top_center()
+ .ofs(Offset::y(ScreenBorder::TOTAL_WIDTH / 2)),
Offset::new(SCREEN.width(), ScreenBorder::TOP_ARC_HEIGHT),
);
match progress {
@@ -239,8 +245,8 @@ impl HoldToConfirmAnim {
let clip = Rect::from_center_and_size(
SCREEN
.bottom_center()
- .ofs(Offset::y(-ScreenBorder::WIDTH / 2)),
- Offset::new(width, ScreenBorder::WIDTH),
+ .ofs(Offset::y(-ScreenBorder::TOTAL_WIDTH / 2)),
+ Offset::new(width, ScreenBorder::TOTAL_WIDTH),
);
(clip, TOP_GAP_FULL)
}
@@ -250,7 +256,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::WIDTH, SCREEN.height(), sides_progress);
+ let height = i16::lerp(ScreenBorder::TOTAL_WIDTH, SCREEN.height(), sides_progress);
let clip = Rect::from_bottom_left_and_size(
SCREEN.bottom_left(),
Offset::new(SCREEN.width(), height),
@@ -272,7 +278,9 @@ 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::WIDTH / 2)),
+ SCREEN
+ .top_center()
+ .ofs(Offset::y(ScreenBorder::TOTAL_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_1.png b/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.png
new file mode 100644
index 00000000..8eeaf775
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.png 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
new file mode 100644
index 00000000..e8517979
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/border/BL_1.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
new file mode 100644
index 00000000..25c012e5
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.png 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
new file mode 100644
index 00000000..6d130370
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/border/BR_1.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
new file mode 100644
index 00000000..1d5ceb4b
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.png 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
new file mode 100644
index 00000000..3d9555c5
Binary files /dev/null and b/core/embed/rust/src/ui/layout_eckhart/res/border/TOP_1.toif 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
new file mode 100644
index 00000000..409f51b9
--- /dev/null
+++ b/core/embed/rust/src/ui/layout_eckhart/res/border/note.md
@@ -0,0 +1,2 @@
+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 1511c415..ed1b4134 100644
--- a/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/theme/mod.rs
@@ -132,9 +132,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.toif");
-include_icon!(ICON_BORDER_BR, "layout_eckhart/res/border/BR.toif");
-include_icon!(ICON_BORDER_TOP, "layout_eckhart/res/border/TOP.toif");
+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");
// 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 96dee76f..9688016f 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -28215,12 +28215,12 @@
"T3W1_cs_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "3bb21d2f49b2bc4c2f2d1ce326cda133c7041cea259365c05602e81c2803aec8",
"T3W1_cs_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "e1c6ebcb468f2c8c98706d054067de1a8df6b23c6045ca4150809b1991aa06b8",
"T3W1_cs_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "51011707842c87d6feaf7afec3633015f79f6d7073074537709747153027e435",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "4c6265aac97a36efcc0497907d7720eb29d1637d94a84fb4538c1e87d3b98202",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "8dea27cdb55dbde10821046982a4d0678d239c8dc624db02f07a5cf800af7ac9",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_full_completion": "501122840ffb899d4b0ad994a640389ce8f77191ca42ca71f911b41241cbaa0f",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_close": "d0243518be96b9d0524cd57e32a074d4e66a2f590eb153127b07f2f1d5e19d97",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "62ef74d4e5df1f24cb86d3265014b74c1f4c372d6181b438bd479db1a5843f88",
-"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_restart": "71ad0b18b77e4933072a40f16eee02291631591b1b125cee572b5026d02bae17",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "4753917b6da404295f1d2b166457453b73587afc8acf63409028f0a5541abca2",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "32dc6d7318a6c39bf054785bcfc72bc938e7cb622cb179ccde155dbdb730885b",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_full_completion": "04ace738f77076105cf941e6b63c6a238ec93c40fbdaf394ccf059810c75f4bb",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_close": "12ca3e05cc0416564227ee172593a4c9e74b7b546b0dc0ad38d85e59450aa0d1",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "4f259784e8004a768c7a929047ff70de636686d673401580de58e47d808a49df",
+"T3W1_cs_test_tutorial_eckhart.py::test_tutorial_restart": "6d4ff879eea8187d8cd30c39a4eb3d41cefcdfc0ea1ee2dd29a3bf5249e71173",
"T3W1_de_test_autolock.py::test_autolock_does_not_interrupt_signing": "ffa3051e3ddabc28ee384a9ecb6776c4918c3e19cd5816d789635caf07ce73a3",
"T3W1_de_test_autolock.py::test_autolock_interrupts_passphrase": "36098e847593e7d01586794b235b92bed97d62f44b93113a4ad006dd16a935ff",
"T3W1_de_test_autolock.py::test_autolock_interrupts_signing": "02a0391667ae0002a14f549213fe715a1a46bd62c1bad43669de3c1d4ad0ba06",
@@ -28273,12 +28273,12 @@
"T3W1_de_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "76f827e0fa64010ccb4a2125ae673b4965247747a2e253125a3d627d65fa8d98",
"T3W1_de_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "6c6976d6d208bf3aff0648b29538083595402b1f6999a4e30ffd639def4a52c1",
"T3W1_de_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "0a380bc3a7be45d2615dcdbce8ecb286f979e4e6b6447fa40c70aeb6e074c4d5",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "32b01c5d96b50d85800bc5d8a76ff7aaa952f3af5199376a4d8286442c84f07a",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "5c9b6da6d0c5f7ead7cc862e6fc40657df31ee0c2ed51605040c58492ec6226f",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_full_completion": "c622037d42cb7d7007873f39987f37f0912c3e0dd2312f452967f62408f39742",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_close": "73c6e748fccd58398145a4739775fc373d260eb85e547e5d38c9ce54ec0fe4e6",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "e71430785c7da303425339e42f135f0b2be3d1bfcbfab67a497329e79ccbe619",
-"T3W1_de_test_tutorial_eckhart.py::test_tutorial_restart": "6c9a2f8021fb9ffd043b5b9b73ad26c74ffe517a23dc1bacdf28bef81a579519",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "a1e79cbc49b90f639bf9072302d60136ec3cb0f6efddd811af79e5cf3987c039",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "547cb6d0b32cc0ae8c115082ff7712bd3413ac56b377a79bd8cda1efcf59514f",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_full_completion": "6a6be7863e9dab80b0a918e80e5c2de49f81efb75614e8cc353070c0449f36a5",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_close": "826bafc4e60eb013b2dbd71b32651147483f65a71cf0b7a06bcc1f63bfe90ca6",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "09919b8390f846b127a2739b7601a38c95d002fae60819139b72e10ad2594e2c",
+"T3W1_de_test_tutorial_eckhart.py::test_tutorial_restart": "f14dfe3710eb0b2a2234d5d7471c53a3042d4fdc76f92e11c7544734c239f762",
"T3W1_en_test_autolock.py::test_autolock_does_not_interrupt_signing": "f183235b07db5cfdcbba6e1926ddd72bed8bbdc788d1a5da45dad9371f91954a",
"T3W1_en_test_autolock.py::test_autolock_interrupts_passphrase": "3dc6f6d7cd5d6329a603da3fb2df4c4dae48189794aba9817d9a45cbf29f9d62",
"T3W1_en_test_autolock.py::test_autolock_interrupts_signing": "675c090a10a6c7d018d2701ccadb1b23e999411215c0f6cf62aa771cb1a0a354",
@@ -28331,12 +28331,12 @@
"T3W1_en_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "c02fc959fad69f366f11d7c9622ca5382c2f8943c2797feaa20040baa32e69c7",
"T3W1_en_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "cacdcb58af22dc3d6d672c61f30f410945d1d4aa3c799463f3bb01b01fa66c8b",
"T3W1_en_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "87a1141cf63fa3e2911aa487976b411d84a5f0f1990a59a7eaa1ef3a35ea477e",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "4247fc0c05b74772af3f3e4ab2c62499efb30eecd87d9cae38010ffab68ecc8b",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "eed35f2fd62dc835cc5266ba210cb2cbae382aeb1d987f26cdfd2b47e9cc1f1e",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_full_completion": "54104fc01adbe7922146c1ef84a5e10a1e32bc86c8603029a0d4ad500209380c",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_close": "144f2fa44c288118d23b584b728f35a68d3592f8a5f8be5e7dbe07ff381da978",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "fef519aca5877361e68d3cf943229d4d8d65c55f4c0ca061876b704fc7a1fece",
-"T3W1_en_test_tutorial_eckhart.py::test_tutorial_restart": "510768c4311159f66e3d102e57200b99abf9be76ecad4aa76e4f9713e24628f2",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "84fa5096ba3c51bd416103603012a81f57c85cc9c54ffc947909a2de7e464ff9",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "109959c7a60f8fcd2cdc3ab4fcafd0d71d99c0d3ef7e5bd17a6d41763338a03c",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_full_completion": "5a276fdf6a9387356f5381605e026c31b8e30c00ac729f855f9871a352c72c3e",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_close": "98bc1afddb07777f6b86eec9be924388f2717c54f40d6782405767c0181b764b",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "22be15dc217eb62077c3c28ab3d9e26641e725e0c73cd2c5101438f34e3f1b39",
+"T3W1_en_test_tutorial_eckhart.py::test_tutorial_restart": "96c7b74965470037e4bc10a628a1632e9b64b7bc5caede93718458f37c33acf3",
"T3W1_es_test_autolock.py::test_autolock_does_not_interrupt_signing": "fea5f6c72ef33953739a79f3043c67762c4e768255ae6853207e494fd24e727a",
"T3W1_es_test_autolock.py::test_autolock_interrupts_passphrase": "bab045ad1b782021e3d94087a6eb8e8e5f8779c91988925e79a4f6eefae6e3e9",
"T3W1_es_test_autolock.py::test_autolock_interrupts_signing": "70adaac90519bc3f377d90b25082ed70a97dc49155f2736cb80c48828a993bbe",
@@ -28389,12 +28389,12 @@
"T3W1_es_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "4b35f89ea6ac407721aaf4d1e4a64fb98dd307b8bf8c2c16b43cbba6f84e3cea",
"T3W1_es_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "aa2dec5ddd390c27ab7509e96943193e7df60329c676e7f39f0fd71912e1a028",
"T3W1_es_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "94c3d2f6d5152ef8df7fd3c08daeed77741eb3e859cebea50ac80bd8ea22826e",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "4474826bf72ad5a145e988aa3a30af3863bb3a19f5c5015e670f4fdda0bfcf58",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "e4f7c630fd1edb0ad82916365d49cb24390ca8c6d92fc54fb5b63f55dfcc273c",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_full_completion": "09c10121351f3e4333e372397ef8634b77835848a99838ac22edd226d760915f",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_close": "fb0f8bb6c6e3f2c419ffac25a8b4cb81f948b5e415d9ca8311ac0c90b9076a5f",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "2b81ebcd2cb4bb10e249dfe11391e3caf2f6965208514bb33c017515cc67abb5",
-"T3W1_es_test_tutorial_eckhart.py::test_tutorial_restart": "6f1eff08fe516ba33c8da27e9bfbc0e1da4985fa915245f1790c4374dca62abc",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "c77b57589b211fbb87586f67ca5ed309aea63040664d33d315349494bbf4a139",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "f3c00d5666dad23171e5c4432b9218351374f4e26976a25e899b0809d399c0ba",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_full_completion": "fdb09cba0fbab418b17eedfbe7a24e13e9fa48621afd9cee85b398158e0a6985",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_close": "3396faaabc0a4724bebdb026bdc5cc4a6b05a53cdb92c6f914ea60f3f096b437",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "e28419ac6a82af0e3ccdb43eb244c6ea9768da016b263bb9622ec15f42593b88",
+"T3W1_es_test_tutorial_eckhart.py::test_tutorial_restart": "3c51f3e3726b15cc9b8c419f90f8f5c006dd8cc2372f29ace5f4d837a51e82c5",
"T3W1_fr_test_autolock.py::test_autolock_does_not_interrupt_signing": "ec86f44f8e35cd5547ed1855cd15cfea55be39463025b82aae767e79e6b912d5",
"T3W1_fr_test_autolock.py::test_autolock_interrupts_passphrase": "5e6154e5acec8860f313ce1cf6df8f07f19c30195d7d9eb60e8a3ea803e50b73",
"T3W1_fr_test_autolock.py::test_autolock_interrupts_signing": "1a542d350699b9f549b2c6096ea0d517233b84c723b7676200527f8f72acad87",
@@ -28447,12 +28447,12 @@
"T3W1_fr_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "84f536993407527c3d9bd26be1c5a7136e0e61ee1cb291b599926a4ca3300bf9",
"T3W1_fr_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "abe6e4fd541696c50ae4839c6df1aee11a2abac4c47ce21bfdb9351130c9d072",
"T3W1_fr_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "c34ac8f0c1d994964ec20b17a03cd8e7e350fc155222d1916d5ceaf790a9a9c4",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "7b8916d5784d11cea0ecbb8f7bb1062fa99943824660efc84c575a04884ebbf5",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "4a087fca8279fc11c545b32812b7bee0e2989e806c99a04c8a88480dbbabe5c8",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_full_completion": "61a8a40250adcc63f7a34b75c81f7000476d589b76549704854aa76486de6c30",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_close": "91ffb80b03f38c55a0876076a2c2c55a4582e464a9c0cb30eba5076ce14b0cd8",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "4aa170614e416fbad9150bc817f6203591e6a62da47ed6e8cc4db714fbf11609",
-"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_restart": "1dc100f6b2892060d78b7ab64110ffc6e3094732c13fa3f7ac35ebff604379fe",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "9fccbb58ac55f87a843ed1b14ece8d7d24ce6846fd7e768cfdd87c6556470263",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "e940dcafab53426885c4ea0f7e75149ad63d1206a289079f462efc2cdfe03de7",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_full_completion": "48da9beff4ef131bea8a762549420adf76fd44255bc4a461cd11b56d37322655",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_close": "0bd0ad425d38a1960ae65a2b65a556fe8d48350125fa85f586a34856aaa181ca",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "208a767f91a7b95156fb94f1cc6326cceaa92f046f5801bafffd5655ac61228d",
+"T3W1_fr_test_tutorial_eckhart.py::test_tutorial_restart": "66645111aef3264caa931fa29e3fd5b17955e425c530bff320b5ec795333ab20",
"T3W1_pt_test_autolock.py::test_autolock_does_not_interrupt_signing": "fc37ecc1dd4edea7f27afb67b991e3602f95c2325deeb9a102e6a2e8c7d34087",
"T3W1_pt_test_autolock.py::test_autolock_interrupts_passphrase": "4278d793886ce2bcb88c228424862bccd6ed169d08564d44a8f85d3d7a4b55be",
"T3W1_pt_test_autolock.py::test_autolock_interrupts_signing": "4bb53dd2d613ecb493cb734f80af4bc58839a1d43095bd8b3369a81ca7a59af9",
@@ -28505,12 +28505,12 @@
"T3W1_pt_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "e98022fb618ffbe26ab12db7d72af3abcc12a08f7a63a7ec8eb5d7212ad54d4e",
"T3W1_pt_test_reset_slip39_basic.py::test_reset_slip39_basic[16of16]": "3cbb669525a9328b0fca6e64e9777aba41e635a715059e6d36d421352570b24f",
"T3W1_pt_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "e8926d1241ea1513297c154f8885e5be62446fce0a0fb9219de7f2ea42965fe7",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "4f5f3211353648afc4d7ddb38b3e905849f91aca8e162b16d3c639ddbf008b30",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "f6b1651e0e7cd9ae0413bad5e381bbee4c20b2b8a3c2df95c0b65d95078feb18",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_full_completion": "dfca5efff1fc73f278305241fcbaf067a9538165bf18833299eb342edd51fc25",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_close": "d76605ef95a81f56b6ebf9aaac22fca47c69035288b7179f3bc4a4b71663f355",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "babaf757113598e193b0785a38815a8e1536d0b08ecf555d0d874089ce8955a4",
-"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_restart": "9d4b6c11da5c076e0c8eb598b0897f0cb29d5ad2114d817405a3cb5fabe6221e"
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_confirm_menu": "28465870a973dd9a01256a413141e4f4e61f3038a3b7972036b7ff3008a4398a",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_cancel_from_main_menu": "cdd23fdd396fa8f9fd6506bad4e3703ec2816ea686e42a312aaa707fa61334dd",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_full_completion": "475a7e4389923c41bf6666b020d6687dd32a3381a54edc3e5c4bf13c0e6209a6",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_close": "bc307b2f78e8506727e81fd85ce17bb116db066f8f684c2294d961667a0ca243",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_menu_tropic": "84dd6b49e69ce7eb16c48bd35201d01e5541ecfe75549106ecd2f7ad3763711b",
+"T3W1_pt_test_tutorial_eckhart.py::test_tutorial_restart": "1f61c28171d582346894d40db246e7bc91833001f975111348ffba9aa2e257c1"
},
"device_tests": {
"T3W1_cs_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "81622562877598a2113092887f68a727b7780dcaa30e5250e6761311c5f59a2c",
@@ -29811,8 +29811,8 @@
"T3W1_cs_test_basic.py::test_device_id_different": "6710c04260b4abde5251dd362c96ecd1554994c099ff71cfe73bc8a66c972b21",
"T3W1_cs_test_basic.py::test_device_id_same": "f8f699b8848d2482a2b73feab47557d4e0833aeedd3e94c662be80e96d68d5d9",
"T3W1_cs_test_basic.py::test_ping": "535037bfe5f1459cfdf305915835d8bf2a9a427c3f60264a8cc3ca6f306a61b1",
-"T3W1_cs_test_busy_state.py::test_busy_expiry_core": "353edcfd4f20be56e02ca547de55a464055ee6b80085fae1b1dd2a853ebafd7e",
-"T3W1_cs_test_busy_state.py::test_busy_state": "a5870ec7cabc6700d30457d75e77a52330269ec41c8fcfe930dae25f28ff3619",
+"T3W1_cs_test_busy_state.py::test_busy_expiry_core": "7436aaa10e0a663599275a91f958e19619af784232050e6724b8df86b6ea95eb",
+"T3W1_cs_test_busy_state.py::test_busy_state": "28ec5e956bed6d9580dd7796db552112233d05ff6100247af6bd2549f6a3a1b5",
"T3W1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "73b02bcdeb7c00d19d4292a97a9a0a22aae68e7a6c284e9461c5755f7bb43b57",
"T3W1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "e79363b2d51047dee8023ad51a203714d0a9d35d8f46ddcd24a784002f984254",
"T3W1_cs_test_cancel.py::test_cancel_on_paginated": "0b591b6adb293c78e63dbaa16fb6aa5d144642001a7335886dfc24657c246a60",
@@ -31267,8 +31267,8 @@
"T3W1_de_test_basic.py::test_device_id_different": "534ba8afd9c060374f3438350c750e973f7ccba36e5374d404031ffc1c331761",
"T3W1_de_test_basic.py::test_device_id_same": "e8117f0795e2dbd3e0dd8168200d1f9122579fc824f6df26248b9a85590a6636",
"T3W1_de_test_basic.py::test_ping": "2bf2200d3f158d1cffae639cd632a3b651fe53af5942b65eb881cfce12817592",
-"T3W1_de_test_busy_state.py::test_busy_expiry_core": "aaf498d62f57f19475b5d08253c749b9dafc2b924db049c96585afdf0d539202",
-"T3W1_de_test_busy_state.py::test_busy_state": "11f550085745163caeba7e4066ebf48a5dc596a4594cb5765df2b156a047c55d",
+"T3W1_de_test_busy_state.py::test_busy_expiry_core": "838f8bf2d1bba13bd2fe0c1031bb890102daea8703c92b792487887e58ed2109",
+"T3W1_de_test_busy_state.py::test_busy_state": "a7e8d28ab327a6a00ab8c1af4a37ee666a267533bf2d5a9364bc24494e38e4cf",
"T3W1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "e02a44bb8fd70b7c8673c17e8f47e624f0d83ab55329f23e02ed5e79529b37c7",
"T3W1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "1fa17ad1ea4e476cc7cf2a08b1704d620203b632490d57e6acef7ca3d05e6e5d",
"T3W1_de_test_cancel.py::test_cancel_on_paginated": "e32fc2c1cdb5ff164fdf74f06b297588a2ac8f53df14b9bec50cbf856193ca60",
@@ -32723,8 +32723,8 @@
"T3W1_en_test_basic.py::test_device_id_different": "e238390e3dec793e4d7061e0c1075c5a417a0bb02054a13b94a0a6220e36282f",
"T3W1_en_test_basic.py::test_device_id_same": "42d26173bdfa282228a5e6736a5877fc6da8f0c5695769e5e1f41cf8c5bd5b24",
"T3W1_en_test_basic.py::test_ping": "2b19d878184abddf53159d4acb504a1e86a7c2d5fd15de433495742ba7df9cc8",
-"T3W1_en_test_busy_state.py::test_busy_expiry_core": "e63a5655edbd310630288f5d3a74c4d2281d5f2b75db2b60adaff2eb4e523a1f",
-"T3W1_en_test_busy_state.py::test_busy_state": "ef400894b68eac24bff3bc277de77667ca519711d90e156e72c9186841babc31",
+"T3W1_en_test_busy_state.py::test_busy_expiry_core": "406376686ad62e59a6774d42026d339fe6b96525ee6f32f1435b70b94d2a3ccc",
+"T3W1_en_test_busy_state.py::test_busy_state": "e1c1e1911c76c66620370c17438b54074f87cb879b701c352beb7f83ffafac71",
"T3W1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "33bacb7d7fb58748c6a4985501bcc7bba869eb73324bbb06cbd1f47ad5daffe9",
"T3W1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "3f8b7da734875be5fba833577c9427cf096556c9a7a0a8b1cead93ee9715d563",
"T3W1_en_test_cancel.py::test_cancel_on_paginated": "86885b2911a929e3a18e112459edcac2a73e5e602bae7f74c574477d8b0c9625",
@@ -34179,8 +34179,8 @@
"T3W1_es_test_basic.py::test_device_id_different": "5341e3ee4ea7806e579153767399dcc7e44e9000cba19ab9796d2853979ad188",
"T3W1_es_test_basic.py::test_device_id_same": "f53f98abb8c6234cdf73e8ef95cd10cde275312bdfde028b79e6b9f51c72e30f",
"T3W1_es_test_basic.py::test_ping": "991c2fedae415c4284948d276edc08daeea466ca5849934ed2784cc8884ee589",
-"T3W1_es_test_busy_state.py::test_busy_expiry_core": "7ad82e6522cf1d475f09aa0dfd8b3fc1571ca18ede933f16805873208fe0005e",
-"T3W1_es_test_busy_state.py::test_busy_state": "93e636ba3e44e7e3d36dc06444664bc36720a99fd65dc626c5d0d65ffedd2bcd",
+"T3W1_es_test_busy_state.py::test_busy_expiry_core": "95b0839b791943000123abdc74dd860480dd729093ac0c0ee303f9f34551f66a",
+"T3W1_es_test_busy_state.py::test_busy_state": "826f09e64e35c42c47255e1e5b748a481a6411c374f0af087da68162317d69c4",
"T3W1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "6c0517dd411d00dfa256d34d143941be45bea1e8d82e05c3b83ccb13e5e905ff",
"T3W1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "b42d03f50c8f2961d1e7a44530fbd453c6e1d6f9e1168fcd301948d834b8d331",
"T3W1_es_test_cancel.py::test_cancel_on_paginated": "d135e77c99c1562ae097148e6453acb1eb795be1a800d9b5d86e1aa91cc64417",
@@ -35635,8 +35635,8 @@
"T3W1_fr_test_basic.py::test_device_id_different": "ed2b7be311948365eb8a62650b9722b469d00bf5ef5438b6a4fa18496ba6bdd9",
"T3W1_fr_test_basic.py::test_device_id_same": "374b8857d14f8d01a19bb34d9ea862ff1bde341c3aff2c26624e55f3164915f5",
"T3W1_fr_test_basic.py::test_ping": "250f727140e1737e1e25e4620b4557d886c40e53f8205987dacb8904050dc474",
-"T3W1_fr_test_busy_state.py::test_busy_expiry_core": "21222a51fc4729461b2ad7265c524aaba338afd92b1eb54ed2e285972568b668",
-"T3W1_fr_test_busy_state.py::test_busy_state": "ab59c0c565da504070e3fe2934e0beb370586770f3033591aeb9a74700403503",
+"T3W1_fr_test_busy_state.py::test_busy_expiry_core": "094c8555b5d5bb4e6bf9f5e352bab0c84f9ef227cba9a77c415a1dc45ea41f83",
+"T3W1_fr_test_busy_state.py::test_busy_state": "018121372ec61b252b14c69a18183366d2e724882f2591548c75a2fbc1c7dde3",
"T3W1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "d21f97334f8fcf68bbb905cc888fa4bca3640d57c14bb82bcbdf9605a1f6e90b",
"T3W1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "91710e2590c17f22e4d722424b5778af26c26b846bc5c571e29a8f0b61c09c9d",
"T3W1_fr_test_cancel.py::test_cancel_on_paginated": "b4b0e24caa8b81b26e692e51643e12262601cb75d4d1f5137fc48ada56d385ba",
@@ -37091,8 +37091,8 @@
"T3W1_pt_test_basic.py::test_device_id_different": "064df1b7abf522917429cc035928586750497dfbb2d8cacccd5e1decfdccf9bf",
"T3W1_pt_test_basic.py::test_device_id_same": "60687ff1d794f567ef669ce5758d1cc5cb39d709562f4f7ccf255b1be6f6ff18",
"T3W1_pt_test_basic.py::test_ping": "637658c0c6bbf3267f67895c12aeea91280f0471133d7865e4b0d19bdd1da874",
-"T3W1_pt_test_busy_state.py::test_busy_expiry_core": "ee2b2a162ebca8b02718d0d3ff7ea25f622ffcc9526eed9a34b75a0898739472",
-"T3W1_pt_test_busy_state.py::test_busy_state": "fb256dfc59490066d09ad93ef7625576065e10798452b8a79dc3ec2cf5013ebf",
+"T3W1_pt_test_busy_state.py::test_busy_expiry_core": "0f72082eb23cfb048bd4ece183c9eff7f1b569f754ad8c4d58d8c3e96088a8cd",
+"T3W1_pt_test_busy_state.py::test_busy_state": "3da2af9ef1accf685bcc9de6ee2e961f37d7ef2b4544935d6b36807d1c125a4e",
"T3W1_pt_test_cancel.py::test_cancel_message_via_cancel[message0]": "da10c6372d4aefe02846258e5d0c4cbca34599dfae32e64f1cd6e3dd74a1c5d9",
"T3W1_pt_test_cancel.py::test_cancel_message_via_cancel[message1]": "5080c713562a58244f16d530ee4aa650b1226a856c8d27413712174102c54b66",
"T3W1_pt_test_cancel.py::test_cancel_on_paginated": "b1eb7063de3fe9620ae9f97622889a97d1bcc9a126e1eb4563db8d56cb8ab870",
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.