✔ derives automatic frame names from current animation name and position (0.8344ms) ✔ keeps custom frame names and restores automatic names when cleared (0.1109ms) ✔ builds non-repeating animation edit context names (0.0981ms) ✔ selects saved animation preview frames by ordered durations (0.609ms) ✔ loads every preview frame through revision-checked pagination (0.555ms) ✔ validates configurable animation preview concurrency (1.0187ms) ✔ rejects mixed revisions instead of showing a partial animation (0.4183ms) ✔ validates frame duration only when explicitly called (0.4254ms) ✔ moves selected frames as one ordered group (0.2261ms) ✔ protects an eight pixel ring around interactive drag controls (0.1889ms) ✔ reorders mixed library keys without mutating the source list (0.1202ms) ✔ restores drag eligibility after protected pointer cancellation and drag end (0.4112ms) ✔ animation workspace exposes two previews and the simplified control order (6.6239ms) ✔ normal and pixel modes expose independent ranges and presets (1.1758ms) ✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2195ms) ✔ pixel stamps clip at every canvas edge (0.1762ms) ✔ normal circle geometry remains unchanged (0.0804ms) ✔ line interpolation includes endpoints without coordinate gaps (0.2975ms) ✔ older tools migrate while v3 restores the coordinate guide choice (0.2289ms) ✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1372ms) ✔ coordinate guide ticks preserve logical values through zoom and pan (0.1836ms) ✔ pixel mode markup and grid stay accessible and non-interactive (6.5794ms) ✔ pixel undo history stores changed snapshots, caps entries, and clears (0.3632ms) ✔ canvas view clamps scale and keeps a visible section in the viewport (0.1771ms) ✔ zooming around an anchor preserves its logical position (0.121ms) ✔ floating editor button stays inside its safe viewport bounds (0.0683ms) ✔ canvas editor markup, guarded input, and checkpoint events stay wired (2.1547ms) ✔ normalizes and converts hexadecimal colors (1.0959ms) ✔ converts RGB and HSV boundaries (0.2125ms) ✔ round trips representative colors within 8-bit rounding (0.2085ms) ✔ recent colors deduplicate, normalize, and evict the oldest (0.2279ms) ✔ formats and projects looping playback without moving paused content (1.0028ms) ✔ seek dispatcher keeps one request in flight and flushes the newest position (2.277ms) ✔ topbar current display dialog exposes static close and animation controls (2.8138ms) ✔ device workspace exposes the compact immediate pure-color test flow (5.2814ms) ✔ font catalog normalization, grouping, and search are stable (1.2077ms) ✔ font picker implements commit-only searchable combobox keyboard behavior (3.0832ms) ✔ settings places unrestricted FRP maintenance at the bottom (4.0794ms) ✔ FRP editor uses raw server storage and official validation errors (0.9054ms) ✔ network diagnostics renders layered evidence (1.276ms) ✔ unavailable controls never masquerade as indefinite loading (5.2608ms) ✔ action controls do not bypass the shared state module (6.9201ms) ✔ HTTP requests time out with a stable user-facing error (22.2398ms) ✔ demo library actions stay black, explain restrictions, and preserve copy (0.9731ms) ✔ sortable cards protect controls and keep demo cards fixed (0.9556ms) ✔ media import workspace exposes streaming upload, crop controls, and queue polling (1.1751ms) ✔ free framing starts from the complete source and keeps one pixel visible (0.6278ms) ✔ free framing copy is stable and catalogued (0.0933ms) ✔ upload action has visible ordinary-build copy (0.2064ms) ✔ media naming happens after analysis and conflicts keep the draft (0.1499ms) ✔ awaiting-settings cards survive polling without hiding server transitions (0.1005ms) ✔ old scene migration rejects unknown fields and duplicate text without filtering (49.3698ms) ✔ PNG compression round trips sparse and full brush pixels without DOM (4.3169ms) ✔ blank and black are distinct; independent backgrounds follow layer order (3.1915ms) ✔ disabled background colors stay independent through storage and copy (12.446ms) ✔ extended pixels survive storage but never enter the central output (5.3709ms) ✔ move preview does not mutate source; confirmed clipping removes only outside ink (9.928ms) ✔ text clipping follows anchor and scale and is retained after edit/reload/copy (7.5961ms) ✔ multiple text groups isolate edits, copies and IDs (0.9609ms) ✔ strict v2 storage protects unknown data and the final brush invariant (3.8003ms) ✔ creates a fixed 64x64 RGB scene (6.227ms) ✔ serializes pixelRgb as base64 and round trips an independent scene (30.277ms) ✔ moves a valid v1 draft to the stable key before removing exact legacy keys (30.4664ms) ✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (16.3615ms) ✔ preserves and blocks a future stable draft instead of falling back or writing blank (6.9734ms) ✔ preserves and blocks a damaged stable draft (0.2876ms) ✔ does not discard a damaged higher-priority legacy key during fallback migration (1.4569ms) ✔ rejects damaged scene roots while skipping only damaged elements (10.0087ms) ✔ normalizes text fields and creates a centered lowercase ok element (0.4748ms) ✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (8.6045ms) ✔ supports independent add, update, and delete operations for multiple text elements (0.4692ms) ✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.2556ms) ✔ alpha-composites full RGBA layers in array order without mutating inputs (1.8318ms) ✔ settings brightness explains an active temporary display-test override (5.5205ms) ✔ settings exposes full OTA upload progress and service recovery polling (3.2091ms) ✔ settings automatically opens and safely copies a detailed OTA failure log (1.5628ms) ✔ settings exposes a transactional performance-mode switch with the fixed warning (1.5066ms) ✔ settings exposes persisted animation preview concurrency below performance mode (2.5054ms) ✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.984ms) ✔ template manager uses a monitor and unified four-row card actions (8.406ms) ✔ animation editing backs up and restores template edit ownership (1.8903ms) ✔ special editor exposes the agreed modes and guarded editing flow (5.876ms) ✔ latched WiFi draft state remains dirty until explicitly cleared (1.131ms) ✔ WiFi settings expose independent network and prompt-delay controls (2.1816ms) ✔ workspace order resolves saved ids and appends new registrations (0.8661ms) ✔ workspace order movement is immutable and respects both boundaries (0.1794ms) ✔ drawer exposes one editable list and commits only from the save action (5.1424ms) ℹ tests 87 ℹ suites 0 ℹ pass 87 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 544.9717