{
  "slug": "procedural-lowpoly-building",
  "skill": "procedural-lowpoly-building",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "2f96748671f52ab6c4b93c1e8cd69d9ed1b9764c095ec71a1aa272ff505beb39",
  "date": "2026-10-28",
  "engine": "three.js r186 (0.186.1) in Chrome 156 headless",
  "env": [
    "Node v20.19.2",
    "Kit, specs and validator are plain ES modules (no dependencies)",
    "three.js r186 vendored in vendor/three for the renders",
    "puppeteer-core 24 from package-lock.json",
    "Google Chrome 156 headless (SwiftShader WebGL)"
  ],
  "trigger": "static",
  "passed": 34,
  "total": 34,
  "commands": [
    "(cd ../original && sh -c npm ci --silent --no-audit --no-fund && node --test --test-reporter=tap test/logic.test.mjs)",
    "(cd ../original && node test/browser.test.mjs)",
    "(cd . && cp ../original/shots/sheet.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Build stylised low-poly buildings in code (no mesh files) from a small spec on top of a ModelKit of closed, outward-woun"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Make low-poly buildings in code for my city builder without importing models\"",
      "pass": true,
      "detail": "rank 1/118, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"This procedural building does not look right from the side, how do I check it\"",
      "pass": true,
      "detail": "rank 1/118, overlap 5"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Generate stylised low poly houses with three.js and keep them under a triangle budget\"",
      "pass": true,
      "detail": "rank 1/118, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Add drift boost to my kart game\"",
      "pass": true,
      "detail": "rank 1/118, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Set up Stripe payments for my game\"",
      "pass": true,
      "detail": "rank 6/118, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): kit primitives are closed, outward and have the right volume",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): window grids: rows x cols boxes, on the face, grouped",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): the three example buildings pass every check",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): detail budget grows with tier, and each building stays inside its own",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): catches a building outside its plot, below ground or too tall",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): catches open meshes and inward faces",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): catches floating details and unsupported masses",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): level roof: a single raised vertex is caught",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): silhouettes: the tower narrows on the side elevation only",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): a tower that tapers evenly (or not at all) fails the side-only intent",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): top view shows the footprint inside the plot",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "ModelKit and validator tests (primitives, buildings, budgets, plot, mesh closure and winding, support, level roof, silhouette taper intent): exits 0 with no script errors",
      "pass": true,
      "detail": "exit 0"
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): contact sheet renders all three buildings in four views (133 colour bins)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): bakery: validator passes in the browser (100 tris)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): bakery: rendered front and side silhouettes match the measured geometry (IoU 100.0% / 100.0%)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): clock-hall: validator passes in the browser (326 tris)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): clock-hall: rendered front and side silhouettes match the measured geometry (IoU 100.0% / 100.0%)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): harbor-tower: validator passes in the browser (736 tris)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): harbor-tower: rendered front and side silhouettes match the measured geometry (IoU 100.0% / 98.9%)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): turntable view: buttons switch the building",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): turntable frame is drawn",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "contact sheet and turntable in headless Chrome (render vs measured silhouettes): 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: building stylised low-poly buildings from code specs and validating them (plot, budget, mesh, support, roof and taper intent, front/side/top views). Game rules and city layout are out of scope."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "2507 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1099 chars"
    }
  ]
}
