✔ pose instances flip their grid, anchor and points inside the part (8.6945ms) ✔ mirrored poses reflect parts, points and markers around the origin corner and inherit timing (1.7912ms) ✔ pose origins become recipe or frame anchors and markers become atlas points (1.2816ms) ✔ autotile compiler composes every blob mask from the template pieces its neighbours call for (6.0566ms) ✔ autotile variants become palette-cycled frames with one animation per mask (3.2076ms) ✔ the autotile op draws the quarters a mask selects, exactly like four copies, and the compiler emits one per frame (9.9795ms) ✔ canvas-only overlays survive unrelated base edits but refuse changes to the frames they touch (12.3304ms) ✔ PNG import keeps up to 256 colours as compact, lossless palette grids (5.8054ms) ✔ a compiled mirror placed by its anchor draws exactly what drawFrame draws when flipping the original (3.9492ms) ✔ hex shorthand, alpha and named colors (2.1601ms) ✔ grid dots skip existing pixels, with exact palette colors (3.1726ms) ✔ grid shape and color errors include the exact source path (0.4135ms) ✔ non-square stamp rotates clockwise and flips before rotation (0.4757ms) ✔ Bresenham line includes both endpoints in every direction (0.7244ms) ✔ outlined ellipse has a transparent center; rectangles can be outlined (0.3707ms) ✔ flood fill respects boundaries and fills the target region exactly (0.3155ms) ✔ clear erases alpha and replace matches the full RGBA value (0.2303ms) ✔ layer opacity applies once after the layer is flattened (0.2265ms) ✔ frame inheritance copies pixels without mutating the parent (0.3276ms) ✔ animation direction preserves timings and avoids duplicate pingpong endpoints (0.2576ms) ✔ atlas positions include scaled padding and no color interpolation (0.7177ms) ✔ clipping warns once, and invalid fill seeds are rejected (0.3305ms) ✔ invalid references, duplicate names, typos and resource limits fail early (4.7611ms) ✔ prototype-like palette keys are safe and are not inherited (0.3686ms) ✔ integer scaling replicates pixels exactly (0.1264ms) ✔ portable output names reject devices, case collisions and null options (0.4322ms) ✔ dither draws a canvas-anchored ordered pattern, ramps density and respects over/erase (5.8168ms) ✔ noise dither is seeded and non-periodic, and a rising density only ever adds pixels (17.5925ms) ✔ value dither grows seeded clumps of a chosen size and keeps density as the share of pixels drawn (116.3498ms) ✔ outline adds inside, middle, width and direction masks (1.994ms) ✔ rewrite rules grow, clean and decorate deterministically (4.3617ms) ✔ cleanup finds doubled corners and strays without touching filled areas or right-angle corners (0.9082ms) ✔ a cleanup patch proposes corrections with a report, and diagnostics count what it would change (22.1086ms) ✔ rotation keeps colours, turns around the pivot pixel and is exact at right angles (2.1085ms) ✔ easing presets start at 0, end at 1 and keep their character (0.4522ms) ✔ diorama: the committed sources match build.mjs (151.1221ms) ✔ diorama: every scene, lit or re-themed, keeps exactly its palette (491.8113ms) ✔ diorama: the hero is drawn behind the barrel it walks past, and the smear only shows during the strike (66.7311ms) ✔ the studio keeps one draft with its name and time, and forgets it on request (1.0769ms) ✔ a draft that cannot be stored or read never breaks the studio (0.3438ms) ✔ Emberfall double jump, landing, dash cooldown, pause and restart form a coherent movement cycle (3.6545ms) ✔ Emberfall elemental interactions persist and charged shots consume breakable health (2.4512ms) ✔ Emberfall checkpoint healing, death, retry and portal gating preserve progression (0.5298ms) ✔ Emberfall guided tour traverses gaps, destroys scenery, defeats boss and wins without unbounded effects (123.2107ms) ✔ PNG encodes exact RGBA scanlines including transparency (2.6535ms) ✔ APNG contains exact durations, loop flag and source replacement (0.8115ms) ✔ bundle emits CSS for variable duration and multi-row atlas (22.4663ms) ✔ exports are deterministic, including ZIP bytes (5.6425ms) ✔ export refuses overwrite before changing any existing files (31.4543ms) ✔ all bundled examples validate and produce complete exports (18.3973ms) ✔ formatJSON keeps short records on one line and grids one row per line, and parses back to the same value (0.9659ms) ✔ clipping reports each source location and pixel count (4.1238ms) ✔ copy takes rectangles from symbols or earlier frames, with transforms, and validates its source (1.396ms) ✔ frame copies remap exact colours named by palette key or hex (0.9076ms) ✔ outline wraps the current buffer, 4-connected by default or 8-connected with diagonal (0.5778ms) ✔ remap recolors palette characters for one operation only (0.45ms) ✔ frame palettes recolor declared keys for that frame, including symbols and corrections (1.2825ms) ✔ layer palettes recolor keys for one layer only, on top of the frame palette (2.6169ms) ✔ wrapping translation scrolls pixels around the canvas without clipping (0.2216ms) ✔ anchors and named points reach the atlas in exported pixels with a normalized pivot (1.1548ms) ✔ trimmed atlases pack visible bounds deterministically and keep full-canvas source coordinates (1.1388ms) ✔ tile view repeats frames 3x3 and reports doubled edges and wrap steps instead of edge equality (2.1232ms) ✔ palette file references and astral grid characters fail with actionable paths (0.3075ms) ✔ every fluid example compiles to its golden recipe, using only its palette and grid operations (1829.3883ms) ✔ looping examples close their loop and one-shot examples end empty or at rest (56.8804ms) ✔ the committed fluid GIFs match the examples (97.6242ms) ✔ heat rises and curls, smoke thins, obstacles stay clear and a still pool stays still (18.5045ms) ✔ sparks draw as blocks of their size, with a streak back along their path (4.2673ms) ✔ loops repeat their forcing, blend their seam and wrap sparks round (43.9059ms) ✔ fluid sources fail early with paths an agent can act on (86.0811ms) ✔ limits are reported with the effect path, extreme settings stay finite, and any palette key draws its own colour (114.7994ms) ✔ the fluid schema lists exactly the fields the compiler reads (49.0142ms) ✔ fluid sources compile from the CLI with a shared palette, and preview and sequence accept them (567.4482ms) ✔ MCP pixel_compile builds fluid sources and pixel_help serves their schema (86.7365ms) ✔ the documented fluid example compiles as written (32.6891ms) ✔ the package ships the fluid schema and example sources (5.2334ms) ✔ effects compile deterministically into ordinary frames, one animation per effect (9.6841ms) ✔ gravity, floors, trails, variants, remaps and dissolve bake into stamps, grids, lines and pixels (3.72ms) ✔ looping effects warm up so the first frame continues the last (1.3924ms) ✔ effect sources fail early with paths an agent can act on (2.6975ms) ✔ rotated pose parts bake into editable symbols and carry their points (5.8216ms) ✔ tweened poses interpolate offsets and angles, switch shapes at the eased midpoint and keep attachments (4.7227ms) ✔ scene trajectories ease each segment and still land on whole pixels (3.8008ms) ✔ the CLI compiles effect sources and keeps their shared palette link (494.207ms) ✔ GIF frames, colours, timing and loop flag are read back exactly by a separate decoder (3.2489ms) ✔ GIF blends onto a background instead of thresholding, and keeps a sequence's length when rounding delays (0.6725ms) ✔ GIF uses a table per frame when the animation needs more than 256 colours, and never quantizes (29.0607ms) ✔ GIF compression survives dictionary resets and 12-bit codes on noisy frames (65.831ms) ✔ a busy opaque animation keeps unchanged pixels under a transparent index and stays within 1.5x of ffmpeg, every frame exact (1749.0654ms) ✔ GIF writes the end code as wide as a decoder reads it after the last code fills the table (0.3295ms) ✔ a sprite with transparency is cleared only where a pixel turns transparent, also when the loop restarts (0.525ms) ✔ GIF keeps unchanged pixels only where a table has room, and stays exact when it has none (2.4228ms) ✔ an animation exports as a GIF with a default scale, notes about what GIF cannot keep, and named errors (42.3054ms) ✔ CLI gif writes only the requested file and refuses to replace it (520.5286ms) ✔ MCP pixel_render writes GIFs on request and leaves nothing behind when one is refused (697.134ms) ✔ framesGIF times frames on the frame-rate grid, counts plays and keeps every colour of every frame (2.334ms) ✔ numbered frames are read in number order, with gaps and other files reported and mixed sequences refused (0.5305ms) ✔ CLI gif-frames turns a folder of PNG frames into an exact GIF and writes only --out (936.3357ms) ✔ grids read pixels back as palette keys, transparency and one shared legend (7.0445ms) ✔ inspection keeps frame order, crops regions and rejects bad options with paths (1.4451ms) ✔ contact sheet scales cells exactly over a checkerboard inside dark gutters (0.3926ms) ✔ automatic layout picks the largest readable scale and enforces size limits (71.6108ms) ✔ a stride picks the A or B frames of a strobe that evenly spaced samples would mix (95.1829ms) ✔ CLI inspect takes --step and --offset (454.2381ms) ✔ the legacy CLI agrees on help, stdin validation, errors and every rendered byte (1473.5297ms) ✔ both CLI names initialize Pixelbolt and expose the same eight MCP tools and schemas (181.3723ms) ✔ CLI help describes its text output and commands for checkout and portable builds (79.0705ms) ✔ CLI consumes stdin, emits machine-readable diagnostics and handles unknown flags (235.9047ms) ✔ CLI init protects an existing recipe with an actionable JSON error and honours --force (242.4883ms) ✔ MCP handshake, discovery, help, errors and render work over stdio (31.7987ms) ✔ MCP pixel_inspect returns a contact sheet and ruled grids, saving only its revision (13.4ms) ✔ MCP revisions let pixel_patch edit, compare and export without resending the recipe (43.5577ms) ✔ MCP revisions from validate, inspect and paint survive process restarts before export (332.3032ms) ✔ MCP render previews every frame or an animation in playback order, with exact timing and cells (224.0258ms) ✔ CLI patch previews by default and writes only the requested recipe and image (411.3089ms) ✔ MCP exports a maximum-length animation with a bounded, explicit sampled preview (403.4175ms) ✔ CLI inspect prints cells and grids, and writes a PNG only when asked (588.2447ms) ✔ studio serves only its assets and exports ZIP over same-origin requests (489.184ms) ✔ studio returns frames for a video editor as one ZIP, built as the sequence command builds them (106.4461ms) ✔ every sample the studio lists is served, and the sidebar counts the list itself (2.5417ms) ✔ MCP answers an oversized request with an error, recovers its id and keeps serving (70.0513ms) ✔ MCP compiles pose sources and autotile templates into revisions it can render and review in scenes (121.0068ms) ✔ MCP imports PNGs, applies overlays, explains topics and resolves palettes only inside its root (65.2518ms) ✔ CLI resolves shared palettes, keeps the link when writing edits, builds autotiles and reports clipping (490.699ms) ✔ MCP compiles particle effects, explains the fx topic and previews cleanup patches (56.1975ms) ✔ registry source is metadata-only with a short description (289.8607ms) ✔ release workflow guards and assets use the renamed repository (3.762ms) ✔ MCPB builds are byte-identical, including across CRLF and LF checkouts (128.7992ms) ✔ the standalone verifier runs bundled MCP help, render, import and scene export (393.3211ms) ✔ the verifier reports missing help and scene export assets and cleans up (416.389ms) ✔ the verifier refuses traversal paths and a manifest/package version mismatch (115.0877ms) ✔ the builder refuses template versions, non-stable versions and different existing artifacts (92.7204ms) ✔ registry entry identifies the exact release bundle and preserves source metadata (7.9776ms) ✔ registry entry refuses bad tags, mismatched versions and packages in metadata (31.1304ms) ✔ registry entry cannot replace server.json or the bundle (5.1455ms) ✔ shipped JavaScript and studio resources make no external network calls (126.154ms) ✔ the network check rejects regressions with the file and line (6.0272ms) ✔ the studio sends a self-only default Content-Security-Policy (58.2015ms) ✔ a generated pass rounds a shape: rims lean outward, the middle faces the viewer, and keys encode their directions (13.7413ms) ✔ the pass lines up with its colour recipe in a scene, and lights each side toward the light (7.7276ms) ✔ each separate shape rounds on its own; bevel flattens the top; mirrored frames get mirrored normals (2.6184ms) ✔ detail raises lighter colours, ramps keep materials level, and the canvas border is not an edge unless frames wrap (4.7253ms) ✔ normals sources are validated with paths (0.9621ms) ✔ the normals schema lists exactly the fields the compiler accepts (9.5281ms) ✔ the CLI compiles a normals source whose recipe file sits beside it, keeping the colour palette link out of the pass (309.2775ms) ✔ MCP compiles a normals source from a saved revision and explains the normals topic (35.132ms) ✔ the bundled spirit normal pass is what its source compiles to, and its night scene lights it (18.5777ms) ✔ patches address items by name, index or end and report what they replaced (5.8769ms) ✔ patch errors name the change that failed (1.3094ms) ✔ canvas painting replaces exact pixels after translated layers, and inherited frames keep the corrections (10.0726ms) ✔ paint rejects wrong targets and invalid pixels without mutating the source (1.3055ms) ✔ comparison reports changed, inherited, added and retimed frames with exact pixels (3.1555ms) ✔ comparison crops to the change, summarizes recolors and reports resized canvases (10.6792ms) ✔ native RGBA PNG and atlas roundtrip preserve hidden RGB, alpha, order, timing and once flags (10.3847ms) ✔ scene honors anchors, playback durations, state changes and persistent aftermath (4.5261ms) ✔ material passes align exactly; light direction changes hand-authored normals and unlit pixels remain intact (14.6321ms) ✔ tile repeat exposes a seeded doubled edge line and leaves a clean tile unflagged (1.1075ms) ✔ quality examples validate, preserve source poses and create deterministic scenes (95.535ms) ✔ PF-EF-001: ZIP32 accepts 65,535 entries and preflights overflow before reading entries (479.236ms) ✔ PF-EF-003: stamp references have the same string type as the schema (1.7597ms) ✔ PF-EF-002: oversized animation sheets can sample endpoints with honest omission metadata (139.1771ms) ✔ review views preserve pixels; silhouette is solid even for translucent detail (1.6188ms) ✔ layer isolation preserves inherited placement and validates the full source before hiding it (0.6902ms) ✔ onion neighbors follow reverse, sparse, repeated and pingpong positions with once boundaries (1.2182ms) ✔ diagnostics expose deliberate isolated pixels, undeclared colors and a loop jump, without rejecting holds (1.3765ms) ✔ regional grids preserve dots and masks, erase explicitly, and report inherited versus frame scope (5.205ms) ✔ overlapping masked moves carry highlights and recoloring respects exact selected pixels (2.0775ms) ✔ named correction overlays survive identical rebuilds and refuse moved bases atomically (4.4009ms) ✔ large regional batches preflight bounded edit work without changing their source (0.6038ms) ✔ authored part replacements keep held objects attached and export timing in expanded order (2.6251ms) ✔ revisions persist across store instances and concurrent saves do not overwrite snapshots (31.4296ms) ✔ revision reads reject traversal and corruption, and never overwrite damaged files (34.5945ms) ✔ older rendered recipes recover the same revision id without modifying the bundle (30.27ms) ✔ Canvas player respects durations, once/loop behavior, pause/resume and scaled atlas rectangles (4.6376ms) ✔ runtime helpers look up frames by time and draw trimmed, anchored and mirrored frames (2.0021ms) ✔ Canvas player keeps the full source size and draws trimmed frames at their offset (0.7539ms) ✔ placements can start hidden and be hidden again by a cue; named cues write related times once (11.6659ms) ✔ an attached placement follows a named point of another placement's current frame (4.9062ms) ✔ placements sorted by ground draw by the y of their placement point, so a hero passes behind a post (2.452ms) ✔ tilemap placements expand a character map into frames, variants and animations as one declaration (9.5456ms) ✔ autotile legends pick compiled blob tiles from each cell's neighbours (6.5763ms) ✔ lighting scope "all" darkens plain assets too, and clipping names the placements (1.3361ms) ✔ banded lighting keeps a coloured light's hue: channels change band together (0.6469ms) ✔ null legend entries are context cells: matched by neighbours, never drawn (3.9162ms) ✔ scene file and revision references must be resolved before rendering (0.2546ms) ✔ anchor "frame" places each drawn frame by its own anchor, so animated placements follow per-frame anchors (1.1373ms) ✔ every operation field the schema lists is one the renderer accepts, and no others (20.6346ms) ✔ scene fields in the schema match what prepareScene accepts (9.7539ms) ✔ every generated schema defines each definition it references, and carries none it does not (6.9086ms) ✔ frame rates are exact fractions, including the NTSC rates (2.2321ms) ✔ each video frame shows the pose that is active when the frame starts (2.6888ms) ✔ a sprite is enlarged by a whole number and placed on a video-sized canvas (2.1755ms) ✔ a recipe becomes numbered PNG frames with exact pixels, straight alpha, a sidecar and working instructions (10.2662ms) ✔ cover fills the canvas with the sprite and crops what hangs over (4.8413ms) ✔ a background blends the alpha away, and the notes say what the frame grid changed (2.6059ms) ✔ a scene becomes a shot: each frame is the scene at that moment, and still moments share a file (1964.5658ms) ✔ CLI sequence writes a new folder for a recipe, an effects source and a scene, and never half of one (1165.8832ms) ✔ MCP render and scene tools write a sequence on request, beside what they already write (736.7013ms) ✔ validate --fps lists durations off the video frame grid and agrees with the sequence it predicts (282.1272ms) ✔ shade moves each pixel along its own ramp, clamped at the ends, and keeps the palette (9.7105ms) ✔ ramps and shade validate with actionable paths (2.0521ms) ✔ shade placements darken whatever lies beneath along its ramps, so one shadow suits any floor (17.8045ms) ✔ ramp lighting moves colours along ramps instead of multiplying them, so a lit scene keeps its palette (1.986ms) ✔ shared palette files may carry ramps, and themes override palette keys per scene or per asset (17.0849ms) ✔ new environment names take precedence and old names remain fallbacks when unset (0.9582ms) ✔ the build ZIP is deterministic, compressed where it helps and read back exactly (3.9728ms) ✔ the macOS and Linux archive keeps permissions, carries no host details and is read back exactly (143.5135ms) ✔ START HERE is one text with blocks for each system (0.7046ms) ✔ the macOS and Linux builds hold shell launchers marked executable, their own START HERE and the right runtime (691.1829ms) ✔ the build ships exactly the files npm pack ships (1077.1924ms) ✔ every relative README link and image is shipped in the portable package (4.9806ms) ✔ the portable layout holds the package, runtime, launchers and build facts, and nothing from development (213.2659ms) ✔ a release build takes its files from the commit, whatever line endings the working copy holds (519.3141ms) ✔ the launcher is preview with a browser: the usual port, a free one beside it, and a dropped recipe opens (625.0136ms) ✔ the browser is opened by each system's own handler, with no shell to quote for (0.9499ms) ✔ the connect helper prints the same server for four agents and changes nothing (115.072ms) ✔ the Windows connect helper pauses after failure only when started without arguments (42.7679ms) ✔ an assembled build passes the release checks from a folder with a space and an accent (9966.1111ms) ✔ the built-in font covers printable ASCII, western European letters and common symbols, with tabular digits (9.9539ms) ✔ text is laid out with glyph spacing, line height and alignment (1.2486ms) ✔ the text operation draws exact glyph pixels, placed by align and changed by the usual transforms (9.1036ms) ✔ text errors name the field and the character (1.5809ms) ✔ the schema describes the text operation the renderer accepts (8.2934ms) ✔ every module the browser imports is served by the studio and packed with scene exports (36.5399ms) ✔ Tidewatch: every recipe validates without clipping warnings (156.3939ms) ✔ Tidewatch: compiled recipes and metadata match their authoritative pose, autotile and effect sources (70.0602ms) ✔ Tidewatch: particle effects keep the animations, anchor and hand-drawn frames the game uses (8.4502ms) ✔ Tidewatch: exported game atlases match the recipes byte for byte (1350.8981ms) ✔ Tidewatch: material passes stay aligned with their colour recipes (17.0683ms) ✔ Tidewatch: Pixelbolt blob masks give every sand and grass cell a compiled tile (16.2772ms) ✔ Tidewatch: the game places sprites from atlas anchors and reads reach, held items and glyph advances from points (2.3929ms) ✔ Tidewatch: the island can be completed in a deterministic headless run (7.0452ms) ✔ rule tiles choose by the characters around a cell and may draw into a neighbouring cell (8.7839ms) ✔ rule chances and variant weights are seeded by position, and unweighted variants keep their old picks (9.9945ms) ✔ tilemap legends and rules fail with paths that name the entry (2.1325ms) ✔ a recipe tilemap composes symbols and autotile templates, and later operations see the composed result (3.79ms) ✔ autotile variants may redraw the set from their own template (5.6654ms) ℹ tests 237 ℹ suites 0 ℹ pass 237 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 11273.8424