{
  "slug": "reanimate",
  "skill": "reanimate",
  "upstream": "NiazMorshed2007/reanimate@3f7a55a2986a84ca2173e86ee9127eefe31d046d",
  "upstreamSha": "3f7a55a2986a84ca2173e86ee9127eefe31d046d",
  "date": "2026-11-03",
  "engine": "reanimate scripts on Bun with Playwright Chromium (headless shell, SwiftShader)",
  "env": [
    "Node v22.23.4",
    "Bun 1.4.2 with the skill's bun.lock: playwright 1.64.1, pixelmatch 8, pngjs 7, ffmpeg-static 5 (ffmpeg 7.0.2)",
    "Playwright Chromium headless shell, software GL (SwiftShader), virtual clock",
    "Python 3 test driver, stdlib only",
    "WebGL tracing (--gl) and gl.ts were not exercised; the screenshot is the skill's own compare sheet for the wrong attempt"
  ],
  "trigger": "static",
  "passed": 27,
  "total": 27,
  "commands": [
    "(cd examples && python3 tests/run_tests.py)",
    "(cd examples && python3 tests/run_tests.py --sheet ../screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Clone a section, widget, page or animation from any reference (a live website URL, a screen recording, an mp4/mov/webm, "
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Clone the hero animation from this website into my menu and verify it frame by frame\"",
      "pass": true,
      "detail": "rank 1/125, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Make my title screen move like this gif: same easing and stagger\"",
      "pass": true,
      "detail": "rank 1/125, overlap 5"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Recreate this loader animation from a screen recording and match it exactly\"",
      "pass": true,
      "detail": "rank 1/125, overlap 7"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Rig and animate my 3D character in Blender\"",
      "pass": true,
      "detail": "rank 36/125, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Balance the upgrade costs in my idle game\"",
      "pass": true,
      "detail": "rank 7/125, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: setup.sh installs playwright, pixelmatch and a static ffmpeg and prints ready",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: capture.ts (virtual clock) records 51 frames, video.mp4, inspect.json and track.json",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: inspect.json gives the title's exact CSS timing",
      "pass": true,
      "detail": "700 ms, delay 200, cubic-bezier(0.34, 1.56, 0.64, 1)"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: inspect.json gives the button stagger",
      "pass": true,
      "detail": "delays 700, 820, 940 ms"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: easing.ts names the title's curve from pixels",
      "pass": true,
      "detail": "easeOutBack, overshoot ~10%, ~700 ms"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: easing.ts finds the third button's start at ~940 ms",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: WAAPI clone passes compare.ts",
      "pass": true,
      "detail": "pixels and timing, mean mismatch 0, timing error 0 s"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: linear, slow-stagger attempt fails both",
      "pass": true,
      "detail": "mismatch > 5%, end and peak late by more than 80 ms"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: easing.ts on the wrong attempt reports linear with no overshoot, so the fix is the easing",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: sheet.ts filmstrip writes labelled sheets of the reference",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: sheet.ts compare writes reference | clone | diff sheets for the failed attempt",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: frames.ts --probe reads the recorded video",
      "pass": true,
      "detail": "480x320, about 2 s"
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: frames.ts extracts 20 cropped frames (240x160) at 10 fps",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: --seed 7 gives the same Math.random sequence on two captures; --seed 8 a different one",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: two virtual-clock captures of the random embers pass compare.ts with mean mismatch < 0.1%",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "Lantern Menu: capture, inspect, easing fits, good and bad clone compares, sheets, video frames, seeded canvas: exits 0 with no script errors",
      "pass": true,
      "detail": "exit 0"
    },
    {
      "criterion": "output",
      "name": "screenshot screenshot.png rendered",
      "pass": true
    },
    {
      "criterion": "output",
      "name": "self-check list has at least 3 items",
      "pass": true,
      "detail": "6 items"
    },
    {
      "criterion": "single",
      "name": "one job per skill (reviewed)",
      "pass": true,
      "detail": "One job: rebuild a reference animation and prove by recording and comparison that the copy moves the same. Art, fonts and brand are left to the user."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md from upstream",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1456 chars"
    }
  ]
}
