{
  "slug": "codixel",
  "skill": "codixel",
  "upstream": "mankidev/codixel@604a9dcbcc4e386bc48188b5f7f49099f5d04db7",
  "upstreamSha": "604a9dcbcc4e386bc48188b5f7f49099f5d04db7",
  "date": "2026-11-03",
  "engine": "Codixel core/pixel.js on Node 22",
  "env": [
    "Node v22.23.4",
    "core/pixel.js as shipped (no dependencies)",
    "Our own painted reference image (reference/lantern-moth.png)"
  ],
  "trigger": "static",
  "passed": 31,
  "total": 31,
  "commands": [
    "(cd examples && node tests/run_tests.mjs)",
    "(cd examples && node tests/screenshot.mjs ../screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Changes how pixel art is made with AI. Instead of drawing from imagination, ask the user for a reference image, pixelate"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Turn this reference image of my character into a pixel art sprite and animate it\"",
      "pass": true,
      "detail": "rank 1/121, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Make pixel art of a dragon creature for my game from a reference picture\"",
      "pass": true,
      "detail": "rank 1/121, overlap 3"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Pixelate a reference drawing, rig it with bones and export a sprite sheet\"",
      "pass": true,
      "detail": "rank 1/121, overlap 4"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Balance the damage numbers in my card game\"",
      "pass": true,
      "detail": "rank 6/121, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Write a Steam store page launch checklist\"",
      "pass": true,
      "detail": "rank 16/121, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: background removed (P.removeBg)",
      "pass": true,
      "detail": "all four corners clear"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: the subject survives the cut",
      "pass": true,
      "detail": "53% of the trimmed box"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: every pixel belongs to a bone (rig.bind)",
      "pass": true,
      "detail": "14287/14287"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: bone body owns its part",
      "pass": true,
      "detail": "43%"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: bone wingL owns its part",
      "pass": true,
      "detail": "29%"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: bone wingR owns its part",
      "pass": true,
      "detail": "29%"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: no wing pixel is owned across the body (ownerMap is clean)",
      "pass": true,
      "detail": "0 wrong"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: 8 frames",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: every frame is 48x37",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: all frames share one small palette",
      "pass": true,
      "detail": "11 colours (limit 12)"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: every pixel colour comes from the first frame's palette",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: silhouettes have no one-pixel nubs or holes (P.edgeCheck after P.smoothEdge)",
      "pass": true,
      "detail": "0 nubs, 0 holes"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: the two rest frames match (the loop returns to its start)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: the wings move during the beat",
      "pass": true,
      "detail": "25% of pixels change between frame 1 and 3"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: deterministic",
      "pass": true,
      "detail": "a second run gives identical frames"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: moth.mjs writes the preview and the sheet",
      "pass": true,
      "detail": "wrote /tmp/moth-VS0r13: steps.png frames.png moth.gif moth-sheet.png (8 frames 48x37, 4 cols)"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: moth.gif is an animated GIF (P.gif)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: P.pack sheet matches its JSON",
      "pass": true,
      "detail": "192x74, 4x2 of 48x37"
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: one steps sheet and one numbered frame sheet for review",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "reference to pixel wing-beat: 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: pixel art made in code, starting from a reference (cut, pixelate, rig, animate, pack), with scene and effect helpers for the same look. Ready-made effect libraries and AI sprite generation are left to pixelfx and sprite-gen."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md from upstream",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1298 chars"
    }
  ]
}
