✔ derives automatic frame names from current animation name and position (0.6403ms) ✔ keeps custom frame names and restores automatic names when cleared (0.0937ms) ✔ builds non-repeating animation edit context names (0.0948ms) ✔ selects saved animation preview frames by ordered durations (0.6116ms) ✔ loads every preview frame through revision-checked pagination (1.3323ms) ✔ validates configurable animation preview concurrency (0.2673ms) ✔ rejects mixed revisions instead of showing a partial animation (0.3507ms) ✔ validates frame duration only when explicitly called (0.3759ms) ✔ moves selected frames as one ordered group (0.2669ms) ✔ protects an eight pixel ring around interactive drag controls (0.1664ms) ✔ reorders mixed library keys without mutating the source list (0.1138ms) ✔ restores drag eligibility after protected pointer cancellation and drag end (0.3556ms) ✔ animation workspace exposes two previews and the simplified control order (6.8075ms) ✔ normal and pixel modes expose independent ranges and presets (1.1726ms) ✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2138ms) ✔ pixel stamps clip at every canvas edge (0.1787ms) ✔ normal circle geometry remains unchanged (0.0899ms) ✔ line interpolation includes endpoints without coordinate gaps (0.1821ms) ✔ v1 tools migrate into normal mode while v2 restores both sizes (0.2555ms) ✔ pixel mode markup and grid stay accessible and non-interactive (6.9068ms) ✔ pixel undo history stores changed snapshots, caps entries, and clears (0.5017ms) ✔ canvas view clamps scale and keeps a visible section in the viewport (0.4704ms) ✔ zooming around an anchor preserves its logical position (0.2555ms) ✔ floating editor button stays inside its safe viewport bounds (0.1233ms) ✔ canvas editor markup, guarded input, and checkpoint events stay wired (1.9429ms) ✔ normalizes and converts hexadecimal colors (1.1363ms) ✔ converts RGB and HSV boundaries (0.2535ms) ✔ round trips representative colors within 8-bit rounding (0.9763ms) ✔ recent colors deduplicate, normalize, and evict the oldest (0.2321ms) ✔ formats and projects looping playback without moving paused content (1.0057ms) ✔ seek dispatcher keeps one request in flight and flushes the newest position (2.948ms) ✔ topbar current display dialog exposes static close and animation controls (3.2173ms) ✔ device workspace exposes the compact immediate pure-color test flow (5.2123ms) ✔ font catalog normalization, grouping, and search are stable (1.7571ms) ✔ font picker implements commit-only searchable combobox keyboard behavior (2.9703ms) ✔ settings places unrestricted FRP maintenance at the bottom (4.612ms) ✔ FRP editor uses raw server storage and official validation errors (1.0223ms) ✔ network diagnostics renders layered evidence (1.448ms) ✔ unavailable controls never masquerade as indefinite loading (5.6542ms) ✔ action controls do not bypass the shared state module (6.0127ms) ✔ HTTP requests time out with a stable user-facing error (18.0299ms) ✔ demo library actions stay black, explain restrictions, and preserve copy (1.1572ms) ✔ sortable cards protect controls and keep demo cards fixed (1.0358ms) ✔ media import workspace exposes streaming upload, crop controls, and queue polling (1.1099ms) ✔ free framing starts from the complete source and keeps one pixel visible (0.6589ms) ✔ free framing copy is stable and catalogued (0.0881ms) ✔ upload action has visible ordinary-build copy (0.193ms) ✔ media naming happens after analysis and conflicts keep the draft (0.1455ms) ✔ awaiting-settings cards survive polling without hiding server transitions (0.1182ms) ✔ creates a fixed 64x64 RGB scene (1.9085ms) ✔ serializes pixelRgb as base64 and round trips an independent scene (6.1668ms) ✔ moves a valid v1 draft to the stable key before removing exact legacy keys (9.1938ms) ✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (2.3183ms) ✔ preserves and blocks a future stable draft instead of falling back or writing blank (1.224ms) ✔ preserves and blocks a damaged stable draft (0.4343ms) ✔ does not discard a damaged higher-priority legacy key during fallback migration (1.1675ms) ✔ rejects damaged scene roots while skipping only damaged elements (0.6392ms) ✔ normalizes text fields and creates a centered lowercase ok element (0.2164ms) ✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (8.2449ms) ✔ supports independent add, update, and delete operations for multiple text elements (0.5292ms) ✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.3276ms) ✔ alpha-composites full RGBA layers in array order without mutating inputs (1.1463ms) ✔ settings brightness explains an active temporary display-test override (5.305ms) ✔ settings exposes full OTA upload progress and service recovery polling (2.9085ms) ✔ settings automatically opens and safely copies a detailed OTA failure log (1.5356ms) ✔ settings exposes a transactional performance-mode switch with the fixed warning (1.3568ms) ✔ settings exposes persisted animation preview concurrency below performance mode (1.3258ms) ✔ template edit baseline distinguishes clean, dirty, and unbound scenes (0.9501ms) ✔ template manager uses a monitor and unified four-row card actions (6.2269ms) ✔ animation editing backs up and restores template edit ownership (1.0747ms) ✔ special editor exposes the agreed modes and guarded editing flow (6.7948ms) ✔ latched WiFi draft state remains dirty until explicitly cleared (1.022ms) ✔ WiFi settings expose independent network and prompt-delay controls (2.1695ms) ✔ workspace order resolves saved ids and appends new registrations (1.0454ms) ✔ workspace order movement is immutable and respects both boundaries (0.2573ms) ✔ drawer exposes one editable list and commits only from the save action (5.2391ms) ℹ tests 76 ℹ suites 0 ℹ pass 76 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 502.5316