{
  "slug": "free-game-stack",
  "skill": "free-game-stack",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "bf90699332e1e9df4b05efa8c6f9c60756985e943c1379c165e558e6c53fc782",
  "date": "2026-11-03",
  "engine": "Node (picker, ink, Matter.js, Colyseus, ship check) + Chrome headless (packed game)",
  "env": [
    "Node v22.23.4",
    "kaplay 3001.0.19, inkjs 2.4.0, matter-js 0.20.0, @colyseus/core 0.18.25 + sdk 0.18.9 from package-lock.json",
    "puppeteer-core 25 from package-lock.json",
    "Google Chrome headless"
  ],
  "trigger": "static",
  "passed": 27,
  "total": 27,
  "commands": [
    "(cd ../original && sh -c npm ci --silent --no-audit --no-fund && node test/run.mjs --shot shots/courier.png)",
    "(cd . && cp ../original/shots/courier.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Choose the smallest free, open-source tool stack for a game and wire it up - engine, physics, levels, pixel art, audio, "
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"I want to make a game for free, which open-source engine and libraries should I use?\"",
      "pass": true,
      "detail": "rank 1/127, overlap 7"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Turn this list of 12 free GitHub repos into a game project, but only use what I need\"",
      "pass": true,
      "detail": "rank 1/127, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Add branching dialogue and online multiplayer to my small browser game and ship it to itch.io\"",
      "pass": true,
      "detail": "rank 1/127, overlap 7"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Balance the damage numbers in my RPG spreadsheet\"",
      "pass": true,
      "detail": "rank 6/127, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Rig a character in Blender for a cutscene\"",
      "pass": true,
      "detail": "rank 34/127, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: stack.json: 12 tools, unique ids, every field filled in English and Chinese (godot,phaser,babylon,matter,pixi,kaplay,ldtk,piskel,howler,ink,colyseus,butler)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: stack.json: every licence is permissive and dated (MIT, Apache-2.0)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: SKILL.md and SKILL.zh.md name all 12 tools and link each repo",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: example: Lantern Courier gets Kaplay + ink + Colyseus + Matter.js + butler (butler+colyseus+ink+matter)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: example/stack.md is the picker's exact output",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: picker rules hold on every target x size x need combination (3840 briefs)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: picker rejects unknown targets and needs",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: ink: story.ink compiles with no errors and story.json is up to date",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: ink: every choice path (the tide question shows once) reaches the start tag with the promised count ({\"0\":1,\"1\":3,\"20\":1,\"21\":3})",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: Matter.js: the crate hits the ramp, settles on the dock, same result twice (x=383.0 y=324.9)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: Colyseus: two clients share one room; the server clamps steps and counts deliveries (Ann:0:1,Bo:1:0)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: pack-web + check-ship: dist/ has no node_modules paths and passes (6 files, 330 KB)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: check-ship catches a root path, node_modules, a missing index and a key (4 problems)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: Lantern Courier (dist/) in headless Chrome: briefing, three deliveries, chime, no errors (21 colours)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "stack data, picker on 3,840 briefs, ink paths, Matter.js, two-client Colyseus room, pack + ship check, Lantern Courier in Chrome: 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: choose the smallest free stack for a game from twelve open-source tools, wire the chosen pieces and check the build before itch.io. Deep engine work is left to engine skills such as the godot-* pages and pixijs-skills."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "3665 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1207 chars"
    }
  ]
}
