{
  "slug": "style-cards",
  "skill": "style-cards",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "8fff386798e70ea78c99efd57768372242f152afbf64d200c932b11a944743ec",
  "date": "2026-11-03",
  "engine": "Blender 5.2.3 LTS (background, Workbench, glTF) + Python 3 standard library",
  "env": [
    "Node v22.11.0",
    "Python 3 standard library only for cards, the PNG checker and pixelize.py",
    "Blender 5.2.3 LTS (linux x64), background mode, no add-ons, for the example and the GLB checker"
  ],
  "trigger": "static",
  "passed": 34,
  "total": 34,
  "commands": [
    "(cd ../original && env BLENDER={blender} python3 test/run_tests.py)",
    "(cd . && cp ../original/shots/style-switch.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Keep every asset in a game in one art style by writing the style down as a card with hard, checkable limits (canvas size"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Write a style guide for my game's art so every asset looks consistent\"",
      "pass": true,
      "detail": "rank 1/122, overlap 7"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Show me my game's props in pixel art, low-poly and voxel so I can pick a style\"",
      "pass": true,
      "detail": "rank 1/122, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"My AI-generated assets all look different, how do I keep one art style?\"",
      "pass": true,
      "detail": "rank 1/122, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Set up a multiplayer lobby in Godot\"",
      "pass": true,
      "detail": "rank 29/122, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Write a save system for my RPG\"",
      "pass": true,
      "detail": "rank 27/122, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: 12 style cards",
      "pass": true,
      "detail": "flat-vector-2d, ink-two-tone, low-poly-flat, low-poly-gradient, one-bit-dither, paper-cutout, pixel-16-tiny, pixel-32, pixel-4-tone, toon-outline, voxel-chunky, voxel-micro"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: every card has id = file name, name, kind, use_for, limits, prompt, avoid",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: 7 image cards set max_colours and alpha",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: 5 mesh cards set max_tris and max_materials",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: palettes fit their colour limit",
      "pass": true,
      "detail": "pixel-32, pixel-4-tone"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: card.py prints a paste-ready block with the limits and palette",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: Blender builds the lighthouse as low-poly and voxel GLBs and renders all three",
      "pass": true,
      "detail": "example/out"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: pixel version passes pixel-32 (64x64, binary alpha, card palette only)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: the raw render before pixelize.py fails pixel-32 (off-palette)",
      "pass": true,
      "detail": "at most 16 colours, every visible pixel is a palette colour"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: low-poly GLB passes low-poly-flat (tris, flat shading, 6 materials, no textures)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: voxel GLB passes voxel-chunky (0.25 m grid, axis-aligned, flat)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: low-poly GLB is rejected by voxel-chunky on grid and axes",
      "pass": true,
      "detail": "every vertex on the 0.25 m grid, every face axis-aligned"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: the smooth low-poly render is rejected by pixel-32 (soft alpha, colours)",
      "pass": true,
      "detail": "alpha is 0 or 255 only (no soft edges), at most 16 colours, every visible pixel is a palette colour"
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: a mesh checked against an image card is refused, not passed",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: an ordered-dither gradient passes one-bit-dither",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: one grey pixel fails one-bit-dither",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: a 16x16 tile in the four shades passes pixel-4-tone",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: a transparent pixel fails pixel-4-tone (must be opaque)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: a 30x30 canvas fails the 8 px grid",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: a second build gives pixel-identical pixel art",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: shots/style-switch.png written (pixel-32 | low-poly-flat | voxel-chunky)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "12 cards, checkers, and one lighthouse switched between pixel-32, low-poly-flat and voxel-chunky: 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: define an art style as measurable limits, check assets against them, and switch styles by switching the card. Making the assets themselves is left to the art skills (pixelfx, codixel, construct, Blender skills)."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "1523 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "963 chars"
    }
  ]
}
