Problem: the process lets a generic game pass. Verified on main: packages/jgengine/src/skills.ts minimal set (now fixed in #1695); game-design/SKILL.md:14 and level-design/SKILL.md:14 say "not a mandatory step"; the visual scorecard lives at .claude/skills/jgengine-ui/references/visual-scorecard.md and nothing cites it; scripts/check-game-shape.ts:31-34, check-game-front-end.ts:9-12, check-content-gate.ts all exit clean when Games/ is missing (always true in engine CI); the scaffold in packages/jgengine/src/templates/gameFiles.ts (lines ~1104-1129 scene, ~1206-1219 models, ~1266-1276 world) ships the same rogue, two crates, three trees on an infinite plane.
Done: task 0 (default skills include game-design and jgengine-ui) landed in #1695.
Tasks, one PR each, in order:
-
Remove the opt-out from the design skills. Edit .claude/skills/game-design/SKILL.md and .claude/skills/level-design/SKILL.md: delete the "not a mandatory step" sentence; state that for a greenfield build the greenfield contract in game-design/references/application-playbook.md (promise, pillars, anti-pillars, core decision, falsifier) is required output before code, and that audits may read only the audit sections. Run bun run check-skills. Docs only; [skip changelog] in the commit message.
-
Move the visual scorecard under verify and cite it. git mv .claude/skills/jgengine-ui/references/visual-scorecard.md .claude/skills/jgengine-verify/references/visual-scorecard.md; fix every link (grep -rn visual-scorecard .claude apps packages); add one paragraph to jgengine-verify/SKILL.md (evidence section) and one line to workflow/SKILL.md saying a PR touching a rendered surface includes the ten-category scorecard table. Run bun run check-skills, bun run check-doc-symbols. Docs only.
-
Art-direction artifact and gate. In packages/jgengine/src/templates/gameFiles.ts add src/art-direction.md to the scaffold with these sections, each starting with the placeholder line TODO: fill in: Reference images (3 links), World palette (5 hex values with roles), Material language, Lighting mood, Silhouette rules, UI typography, Chosen look (cinematic | flat). Add scripts/check-art-direction.ts: for each game dir under Games/* and the cwd when run inside a created game, fail if the file is missing or any TODO: fill in remains; print the offending section. Register it in scripts/run-stages.ts next to check-game-front-end, add a "check-art-direction" script to root package.json, and call it from jgengine doctor (packages/jgengine/src/doctor.ts). Add .claude/skills/jgengine/SKILL.md step 1 output: "write src/art-direction.md before any code". Tests: a fixture with placeholders fails, a filled one passes (scripts/check-art-direction.test.ts, mirror check-game-front-end's test style). CHANGELOG under Added.
-
Break the identical scaffold. In gameFiles.ts, make the starter scene, player model id, and ground read from an object the create command fills from three new flags (--player <asset id>, --ground flat|terrain, --scene empty|starter), defaulting to empty scene and terrain ground so no two games start identical; keep --scene starter for the old content. Update packages/jgengine/src/create.ts arg parsing and its tests. CHANGELOG under Changed (CLI line).
-
Feel gate. scripts/check-game-feel.ts over Games/*/src (and cwd for a created game): fail a game that declares input with a fire/attack/interact action but has zero audio.play/ctx.game.audio calls, or has combat features with no hitReaction/impactPresets/cameraShake reference, or sets camera with no targetSmoothing/smoothing field. Ratchet against scripts/game-feel-baseline.json exactly like scripts/check-game-front-end.ts and its baseline (copy that structure). Register in run-stages.ts and root package.json. Tests with two fixture dirs.
-
Perf targets in the verify skill. In jgengine-verify/SKILL.md perf rung, add a table: flat look 16.6 ms frame / 300 draw calls / 500k triangles; cinematic look 16.6 ms / 600 / 1.5M; and require a debug_snapshot before/after pair in PRs that add world content. Docs only.
-
Make the game gates run in CI. In .github/workflows/*.yml add a job that runs bun run games:clone (uses scripts/ensure-games.ts; needs a token secret with read access to Noisemaker111/JGengine-games, name it GAMES_CLONE_TOKEN and read it in ensure-games.ts when present) and then bun run check-game-shape, check-game-front-end, check-content-gate, check-art-direction, check-game-feel. Remove the "no Games/ → exit 0" branches from those scripts when CI=true so a missing clone fails loudly. If the secret cannot be added, document that in the PR and keep the local-only behavior.
Acceptance: tasks 1 to 7 merged. Closes #1690 on task 7.
Rules: wait for bun run agent:bootstrap --check; branch claude/<slug> off origin/main; claim comment first; one task per PR with Refs #1690; bun run gen after export changes; CHANGELOG bullet for packages/*/src changes; run check-types and test for touched packages plus check-stateful-ratchet, check-doc-symbols, check-orphan-ratchet; merge origin/main before pushing; squash auto-merge; fix CI on the same branch.
Problem: the process lets a generic game pass. Verified on main:
packages/jgengine/src/skills.tsminimal set (now fixed in #1695);game-design/SKILL.md:14andlevel-design/SKILL.md:14say "not a mandatory step"; the visual scorecard lives at.claude/skills/jgengine-ui/references/visual-scorecard.mdand nothing cites it;scripts/check-game-shape.ts:31-34,check-game-front-end.ts:9-12,check-content-gate.tsall exit clean whenGames/is missing (always true in engine CI); the scaffold inpackages/jgengine/src/templates/gameFiles.ts(lines ~1104-1129 scene, ~1206-1219 models, ~1266-1276 world) ships the same rogue, two crates, three trees on an infinite plane.Done: task 0 (default skills include
game-designandjgengine-ui) landed in #1695.Tasks, one PR each, in order:
Remove the opt-out from the design skills. Edit
.claude/skills/game-design/SKILL.mdand.claude/skills/level-design/SKILL.md: delete the "not a mandatory step" sentence; state that for a greenfield build the greenfield contract ingame-design/references/application-playbook.md(promise, pillars, anti-pillars, core decision, falsifier) is required output before code, and that audits may read only the audit sections. Runbun run check-skills. Docs only;[skip changelog]in the commit message.Move the visual scorecard under verify and cite it.
git mv .claude/skills/jgengine-ui/references/visual-scorecard.md .claude/skills/jgengine-verify/references/visual-scorecard.md; fix every link (grep -rn visual-scorecard .claude apps packages); add one paragraph tojgengine-verify/SKILL.md(evidence section) and one line toworkflow/SKILL.mdsaying a PR touching a rendered surface includes the ten-category scorecard table. Runbun run check-skills,bun run check-doc-symbols. Docs only.Art-direction artifact and gate. In
packages/jgengine/src/templates/gameFiles.tsaddsrc/art-direction.mdto the scaffold with these sections, each starting with the placeholder lineTODO: fill in: Reference images (3 links), World palette (5 hex values with roles), Material language, Lighting mood, Silhouette rules, UI typography, Chosen look (cinematic|flat). Addscripts/check-art-direction.ts: for each game dir underGames/*and the cwd when run inside a created game, fail if the file is missing or anyTODO: fill inremains; print the offending section. Register it inscripts/run-stages.tsnext tocheck-game-front-end, add a"check-art-direction"script to rootpackage.json, and call it fromjgengine doctor(packages/jgengine/src/doctor.ts). Add.claude/skills/jgengine/SKILL.mdstep 1 output: "writesrc/art-direction.mdbefore any code". Tests: a fixture with placeholders fails, a filled one passes (scripts/check-art-direction.test.ts, mirrorcheck-game-front-end's test style). CHANGELOG under Added.Break the identical scaffold. In
gameFiles.ts, make the starter scene, player model id, and ground read from an object thecreatecommand fills from three new flags (--player <asset id>,--ground flat|terrain,--scene empty|starter), defaulting toemptyscene andterrainground so no two games start identical; keep--scene starterfor the old content. Updatepackages/jgengine/src/create.tsarg parsing and its tests. CHANGELOG under Changed (CLI line).Feel gate.
scripts/check-game-feel.tsoverGames/*/src(and cwd for a created game): fail a game that declaresinputwith a fire/attack/interact action but has zeroaudio.play/ctx.game.audiocalls, or hascombatfeatures with nohitReaction/impactPresets/cameraShakereference, or setscamerawith notargetSmoothing/smoothingfield. Ratchet againstscripts/game-feel-baseline.jsonexactly likescripts/check-game-front-end.tsand its baseline (copy that structure). Register inrun-stages.tsand rootpackage.json. Tests with two fixture dirs.Perf targets in the verify skill. In
jgengine-verify/SKILL.mdperf rung, add a table:flatlook 16.6 ms frame / 300 draw calls / 500k triangles;cinematiclook 16.6 ms / 600 / 1.5M; and require adebug_snapshotbefore/after pair in PRs that add world content. Docs only.Make the game gates run in CI. In
.github/workflows/*.ymladd a job that runsbun run games:clone(usesscripts/ensure-games.ts; needs a token secret with read access toNoisemaker111/JGengine-games, name itGAMES_CLONE_TOKENand read it inensure-games.tswhen present) and thenbun run check-game-shape,check-game-front-end,check-content-gate,check-art-direction,check-game-feel. Remove the "no Games/ → exit 0" branches from those scripts whenCI=trueso a missing clone fails loudly. If the secret cannot be added, document that in the PR and keep the local-only behavior.Acceptance: tasks 1 to 7 merged.
Closes #1690on task 7.Rules: wait for
bun run agent:bootstrap --check; branchclaude/<slug>offorigin/main; claim comment first; one task per PR withRefs #1690;bun run genafter export changes; CHANGELOG bullet forpackages/*/srcchanges; runcheck-typesandtestfor touched packages pluscheck-stateful-ratchet,check-doc-symbols,check-orphan-ratchet; mergeorigin/mainbefore pushing; squash auto-merge; fix CI on the same branch.