{
  "slug": "image-to-3d-hero",
  "skill": "image-to-3d-hero",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "db49426a151f230810602104d95638a2d88621cc841056bb4232b8343489d77e",
  "date": "2026-11-03",
  "engine": "three.js 0.187 in Chrome headless + Blender 5.2 headless + Node (GLB inspector)",
  "env": [
    "Node v22.23.4",
    "three 0.187.0 and puppeteer-core 25 from package-lock.json",
    "Blender 5.2.3 (headless, --factory-startup)",
    "Google Chrome headless"
  ],
  "trigger": "static",
  "passed": 25,
  "total": 25,
  "commands": [
    "(cd ../original && sh -c npm ci --silent --no-audit --no-fund && node test/run.mjs --shot shots/hero.png)",
    "(cd . && cp ../original/shots/hero.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Turn one character image into a playable third-person 3D hero with free, open-source tools only - front A-pose sheet, im"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"I have a picture of my character, make it a 3D hero I can walk around with WASD\"",
      "pass": true,
      "detail": "rank 1/127, overlap 5"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"How do I rig and animate an AI-generated 3D model for free?\"",
      "pass": true,
      "detail": "rank 1/127, overlap 5"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"My GLB character is huge, faces backwards and its animations are not found\"",
      "pass": true,
      "detail": "rank 1/127, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Write the dialogue for my visual novel\"",
      "pass": true,
      "detail": "rank 25/127, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Set up a Steam store page for my game\"",
      "pass": true,
      "detail": "rank 11/127, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: clip names from common tools map to the five roles (13 names)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: example/web/clip-aliases.json is a copy of tools/clip-aliases.json",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: checks(): FAIL for no skin, missing core clips, wrong scale; WARN for feet, facing, size",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: inspect hero-raw.glb: finds centimetre scale, waist origin and backwards facing; maps all five clips (3 findings)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: inspect example/web/hero.glb: PASS, 1.8 m, feet on 0, faces +Z, clips named by role (11 joints, 57 KB)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: Blender: make-hero.py rebuilds the raw stand-in with the same measurements (blender)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: Blender: fix-hero.py turns the raw file into a passing hero (turned 180, scaled, grounded, renamed) (scale 1.07143)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: Blender: fix-hero.py is idempotent on an already fixed hero",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: example and tools call no paid 3D service and hold no keys (6 files)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: three.js: hero.glb loads with nothing to fix, 1.8 m, faces +Z, idle playing",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: three.js: W walks away from the camera and turns the hero; Shift+W runs faster; Space jumps and lands; E waves (walk 1.12 m, run 2.94 m in 0.7 s)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: three.js: the raw stand-in is fixed at load and the HUD says what was fixed (3 fixes)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "clip roles, GLB inspector, Blender build and fix, no paid API or keys, Bram in three.js with real key presses: 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: get a character from one image to a checked, playable rigged GLB with five clips using free tools, and prove it in a third-person controller. Modelling quality, decimation and engine-specific import are left to other skills (blender-game-optimization, glb-godot-acceptance)."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "3016 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1224 chars"
    }
  ]
}
