{
  "slug": "mechanic-picker",
  "skill": "mechanic-picker",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "fac6a768228084eb092455152fa068dbbcfa9594f14e369da7f6d176f6c6408b",
  "date": "2026-11-03",
  "engine": "Node (picker, lint, bot playtest) + Chrome headless (grey box)",
  "env": [
    "Node v22.23.4",
    "No runtime dependencies: tools/pick.mjs and tools/check-brief.mjs use Node built-ins only",
    "puppeteer-core 24 from package-lock.json",
    "Google Chrome headless"
  ],
  "trigger": "static",
  "passed": 31,
  "total": 31,
  "commands": [
    "(cd ../original && sh -c npm ci --silent --no-audit --no-fund && node test/run.mjs --shot shots/ferry.png)",
    "(cd . && cp ../original/shots/ferry.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Pick 2 or 3 game mechanics that work together before building anything, then write a one-page build brief and prove the "
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"I have a game idea but no mechanics yet, which mechanics should I combine?\"",
      "pass": true,
      "detail": "rank 1/122, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Help me scope a small game for a weekend jam with two or three mechanics\"",
      "pass": true,
      "detail": "rank 1/122, overlap 4"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"My game keeps getting bigger with every feature, help me pick the mechanics that matter\"",
      "pass": true,
      "detail": "rank 1/122, overlap 5"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Export my Godot project to the web\"",
      "pass": true,
      "detail": "rank 35/122, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Make a pixel art sprite for a coin\"",
      "pass": true,
      "detail": "rank 28/122, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: 24 mechanic cards, unique ids, every field filled in English and Chinese (24)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: cards: inputs, days 1-3, clashes point at real cards",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: example: Lantern Ferry keeps carry-weight and gets closing-window as its partner (score 7)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: example: the picker is deterministic and example/brief.md is its exact output",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: 300 random briefs: every pick has 2-3 cards, fits the days and the input, no clash, no avoided card (266 picked)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: picker refuses 4 mechanics and a clashing pair",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: check-brief: the generated brief passes",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: check-brief: rejects 4 mechanics, a missing playtest question, and \"a remake of\" another game",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: first try caught: always carrying the full load is within 1 of the best plan on every level (carry weight is no decision yet) (12/13, 10/10, 12/12)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: tuned: full load is at least 2 lanterns worse than the best plan on 2+ levels (6/10, 6/9, 12/12)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: tuned: no single load wins everywhere (best fixed load differs per level) (best loads 3, 2, 4)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: tuned: skill shows: the best plan beats a random player by 30%+ on average (x1.49)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: both mechanics matter: with no drag the full load is always best; with no tide everything gets delivered",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: session fits the brief: all three tides add up to 3 minutes or less (140 s)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: grey box level 1 plays the best plan with no errors and the same score as the rules (10 lanterns)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: grey box level 2 plays the best plan with no errors and the same score as the rules (9 lanterns)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: grey box level 3 plays the best plan with no errors and the same score as the rules (12 lanterns)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: screenshot: a still frame at 16 s (same pixels every run)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "cards, 300 random briefs, brief lint, Lantern Ferry bot playtest and grey box: 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 2-3 mechanics that need each other, write them on one page with playtest questions, and check the pair with a bot playtest. Building each mechanic is left to engine skills such as godot-one-mechanic."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "1298 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1012 chars"
    }
  ]
}
