{
  "slug": "mechanic-one-button-flight",
  "skill": "mechanic-one-button-flight",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "73a1e3b4f0bd64a38887010cc3cf90ac77707847132e131a6b458a75364f8325",
  "date": "2026-10-28",
  "engine": "Canvas 2D in Chrome 156 headless",
  "env": [
    "Node v20.19.2",
    "No runtime dependencies (plain ES modules + Canvas 2D)",
    "puppeteer-core 24 from package-lock.json",
    "Google Chrome 156 headless, touch emulation on"
  ],
  "trigger": "static",
  "passed": 37,
  "total": 37,
  "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/flight.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Build a one-button flight game (tap-to-flap through scrolling gaps) whose course is provably fair: a flap that sets rath"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Make a flappy style one button tap to fly game where gaps are never impossible\"",
      "pass": true,
      "detail": "rank 1/118, overlap 9"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"My tap to flap flight game feels floaty and some gaps are impossible\"",
      "pass": true,
      "detail": "rank 1/118, overlap 7"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"One tap endless flight game with gravity and a fair gap generator\"",
      "pass": true,
      "detail": "rank 1/118, overlap 8"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Export my Godot game for the web\"",
      "pass": true,
      "detail": "rank 31/118, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Compress a glb model with Draco for three.js\"",
      "pass": true,
      "detail": "rank 17/118, overlap 0"
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): ready state hovers and does not fall until the first flap",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): a flap sets (not adds) upward speed, so spam does not rocket the flyer",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): gravity and terminal velocity",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): frame-rate independence: 30 fps and 144 fps land in the same place",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): a long frame is clamped (background tab does not teleport the flyer)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): forgiving hitbox: grazing the drawn edge does not kill, overlapping does",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): gap shrinks with score and stops at gapMin",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): every generated gap is inside the screen and within the fair share of the reachable band",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): same seed, same course",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): fairness proof: the reference autopilot clears 100 gates on 40 seeds",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): score counts each gate once; dying stops the run; restart resets",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): hitting the floor ends the run, the ceiling only stops the climb",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): one flap climbs less than the smallest gap minus the hitbox",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rules tests (flap, gravity, fixed step, hitbox, fair gap generator, autopilot): exits 0 with no script errors",
      "pass": true,
      "detail": "exit 0"
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: page loads and the render loop runs",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: autopilot clears at least 8 gates in the browser (score 8)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: frame is drawn (sky, gates, moth) (55 colour bins)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: screenshot and GIF frames written",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: ready state waits for the first input",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: one tap (touch) starts the run and flaps upward (vy -358)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: Space flaps too (keyboard)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: with no input the moth falls and the run ends",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: a tap after the short lockout restarts",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless Chrome: no console errors, page errors or failed requests",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "demo in headless 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: the rules of a one-button flight game (flap, gravity, fixed step, hitbox, fair gap generation, states). Drawing, sound and juice are left to the page and to other skills."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "2377 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "960 chars"
    }
  ]
}
