{
  "slug": "game-trailer-from-code",
  "skill": "game-trailer-from-code",
  "upstream": "GameSkill original (onsite/<slug>/original)",
  "sourceHash": "f6e899d2a9554004191fd044c76174a0bd3277eb0358082dcdd98567d86013cb",
  "date": "2026-10-28",
  "engine": "Node 20 + Chrome 156 headless + ffmpeg 7.1 (libx264, AAC)",
  "env": [
    "Node v20.19.2",
    "puppeteer-core 24 from package-lock.json",
    "Google Chrome 156 headless",
    "ffmpeg 7.1 and ffprobe from the system"
  ],
  "trigger": "static",
  "passed": 35,
  "total": 35,
  "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/contact-sheet.png screenshot.png)"
  ],
  "checks": [
    {
      "criterion": "trigger",
      "name": "SKILL.md description says when to use it",
      "pass": true,
      "detail": "Make a Steam-ready gameplay trailer and the store images from your own running game with code, not a video editor. A vir"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Make a Steam trailer for my browser game from gameplay footage\"",
      "pass": true,
      "detail": "rank 1/118, overlap 4"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"My Steam trailer upload failed, what resolution fps and bitrate does Steam want\"",
      "pass": true,
      "detail": "rank 1/118, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "triggers on: \"Generate Steam capsule images, store screenshots and a GIF for my game page\"",
      "pass": true,
      "detail": "rank 1/118, overlap 6"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Add sound effects to my HTML5 game\"",
      "pass": true,
      "detail": "rank 13/118, overlap 0"
    },
    {
      "criterion": "trigger",
      "name": "does not trigger on: \"Tune the recoil of my FPS weapon\"",
      "pass": true,
      "detail": "rank 4/118, overlap 1"
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): Steam trailer spec: a 1080p30 H.264/AAC 48 kHz file passes",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): Steam trailer spec: each broken rule is reported by id",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): loudness window and true peak",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): example cut list: 15 s, shots 1.2-4 s, gameplay first, bilingual captions",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): cut list mistakes are caught",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): time mapping: raw capture time -> trailer time, cut frames give null",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): SRT: zh and en files with the same timings, parse back",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): microtrailer windows: black and still seconds are found",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): PNG size and store asset sizes",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): soundtrack: cues from game state, no clipping, quiet end, valid WAV",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "rule and logic tests (Steam spec, loudness, cut list, time mapping, SRT, microtrailer windows, store sizes, soundtrack): exits 0 with no script errors",
      "pass": true,
      "detail": "exit 0"
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): make-trailer builds the 15 s example from the running game (no game errors) (68s)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): English trailer passes every Steam check (spec, loudness, microtrailer, SRT, store images) (1920x1080 30fps 11975kbps 48000Hz, 28 checks)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): Chinese trailer passes the same checks",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): zh and en SRT: same cue times, Chinese text in the zh file",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): the two language versions differ only where captions are (card and captions burned in) (caption 1.16, uncaptioned 0.01)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): soundtrack follows the game: flaps, gate scores and one crash inside the 15 s (20 flaps, 8 scores, 1 crash)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): capture is frame-exact: frame 200 is byte-identical on a second run",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): store images: 5 screenshots, 9 capsule sizes, transparent logo, loop GIF under 3 MB (gif 1.33 MB)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): a bad export FAILS with the right reasons (25 fps, 1500 kbps, 1024x576, 22 kHz, 1.5 s black open) (common-size, fps, bitrate, sample-rate, microtrailer, opening, freeze)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): a silent export FAILS (no audio track) and the CLI exits 1",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): page images written (contact sheet, preview GIF, store montage)",
      "pass": true
    },
    {
      "criterion": "runs",
      "name": "build the Lantern Moth trailer end to end and check it (good file PASS, bad and silent files FAIL): 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": "7 items"
    },
    {
      "criterion": "single",
      "name": "one job per skill (reviewed)",
      "pass": true,
      "detail": "One job: a gameplay trailer and store images for Steam made from the user's own running game with code (deterministic capture, cut list, captions, synced sound, encode, Steam checks). Launch timing, reviews and sales retros are left to steam-launch-check; platform certification to ccgs-launch-checklist."
    },
    {
      "criterion": "bilingual",
      "name": "English SKILL.md",
      "pass": true
    },
    {
      "criterion": "bilingual",
      "name": "Chinese SKILL.zh.md shipped next to SKILL.md",
      "pass": true,
      "detail": "3100 chars"
    },
    {
      "criterion": "bilingual",
      "name": "Chinese guide written",
      "pass": true,
      "detail": "1439 chars"
    }
  ]
}
