Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Implement game mechanic functions via worker dispatch. Covers risk-first then main implementation. Dispatches workers until PLAN is clean, then runs one verify+review pass; loops until convergence. Explicit invocation only — use /gm-build.
.claude/skills/randallliuxin-gm-build/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 151% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 133% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 472% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 174% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 74% | 0% |
$ARGUMENTS
You are implementing a Godot game by dispatching Worker subagents. Risk tasks first, then main tasks — both surfaced from PLAN.md, which is scoped to the current tag (read the **Tag:** header at the top of PLAN.md). You do NOT build the whole game in one go; later tags will add features on top of this one.
FIRST ACTION — before anything else: Write build to .godotmaker/current_role.
Read .godotmaker/stage.jsonl (treat as empty if missing) — each line is {"role": X, "ts": Y}.
project.godot does not exist → STOP. Tell user to run /gm-scaffold first.ROADMAP.md does not exist → STOP. Tell user to run /gm-gdd first.role == "gdd" exists anywhere in the file → STOP. Tell user to run /gm-gdd first.PLAN.md is missing the **Tag:** header → STOP. Tell user the file is stale and to re-run /gm-gdd to regenerate it for the current tag.Read .godotmaker/verify_report.json if it exists.
Define pending verify feedback as:
.godotmaker/verify_report.json exists.result is "fail".ts is later than the latest role == "build" event in stage.jsonl, or there is no prior build event.Apply the resume gates in this order:
build and all PLAN.md tasks are already verified.role == "build" AND all PLAN.md tasks are verified → STOP. Tell the user:> "Build already completed for the current tag at {timestamp}. Recommended next: /gm-verify. > If you need to redo this step or have other plans, just tell me."
Then read context:
PLAN.md → current tag's **Tag:** header + Tag Mechanics + Inherited Mechanics + Playable Unit + pending/in_progress/completed tasks (anything not verified)STRUCTURE.md → architecture and build order (current tag scope: previous tags' systems already exist on disk and may be touched only when PLAN.md explicitly lists a refactor task for them)ASSETS.md → the generated-runtime authority; for a visual task, derive each asset with tools/asset_result_registration.py --snapshotMEMORY.md index + sub-files (cross-tag accumulating notebook) → avoid repeating known mistakesdocs/tags/<prev_tag>/STRUCTURE.md (only if PLAN.md has Inherited Mechanics or refactor tasks touching prior systems) → know what already exists before adding/refactoringASSETS.md is the sole runtime-asset authority. For a visual task, derive the snapshot with tools/asset_result_registration.py --snapshot and never read a stable entry, manifest pointer, or root index. The snapshot resolves generated and complete user-provided runtime rows, including uniquely named rows introduced by earlier tags.
references/repair-attempt-accounting.md.references/reviewer-finding-triage.md (mandatory for critical/major; optional for minor).Tasks transition forward only:
pending → in_progress → completed → verifiedverified → pending)When you ACCEPT a reviewer finding against a verified task: Do NOT change the existing task's state. Add a NEW task (status pending) describing the fix. The original task stays verified. The new task goes through the full lifecycle. (REJECT or SKIP findings go to MEMORY.md instead — see references/reviewer-finding-triage.md.)
This way the state is always monotonic and the audit trail is preserved.
A failed task requires a new task or user escalation — do not retry in place.
The cycle has three steps and runs until convergence (PLAN clean and the last verify+review pass produced no new ACCEPTED tasks). Reviewer is invoked once per cycle iteration — after every PLAN task reaches completed, not on a worker-count cadence.
Run this step before Step 1 only if pending verify feedback exists. Otherwise → skip to Step 1.
Translate failures into pending tasks at the bottom of PLAN.md.
Project-code tasks (any checks.<name>.result == "fail") — go through the normal Worker → Verifier → Reviewer cycle:
checks.build.errors[] → one task per distinct compile error (file + line + message in Notes).checks.unit_tests.failures[] → one task per failing test. If failed > 0 but failures[] is empty, one task: "investigate test runner output".checks.lint.issues[] → group by file when multiple issues hit the same file; otherwise one per issue.checks.lint.format_drift → one task: "run <format_drift.command> to format the drifted files (<file_count> files)".checks.static_check.issues[] → one task per issue, using check as the title prefix (e.g. missing_unit_test: s_player_input). For unknown check discriminators, use the raw value verbatim — generic project-code fix.Config tasks (any checks.<name>.result == "error", paired with one tooling_notes[] entry) — main agent applies directly, NO worker dispatch:
exclude_file / scope_narrow / add_gdlintrc_rule / skip_check) WITH operand present (per the fallback table in gm-verify/SKILL.md Section B) → apply the structured edit using the note's operand. Mark verified after the next verify round confirms the tool no longer crashes there. Hard Rule 1 only restricts .gd/.tscn/.tres.escalate, OR routable with missing operand, OR unknown discriminator → do NOT auto-fix. Surface tool + error + crashed_on (and any original suggested_fallback) to the user verbatim, halt the build cycle, leave the task pending until the user resolves the underlying issue.Do NOT delete project code as a "fix" for a tool crash.
references/worker-dispatch.md for the brief templatereferences/repair-attempt-accounting.md after every workerhandoff. Increment dispatch_count for the handoff, then classify it from the report evidence before changing any retry counter or task state.
subagent_type: "worker". Each worker implements ONE game mechanic function + its tests.Asset Runtime Snapshot andVisual Asset Contract sections from references/worker-dispatch.md. The snapshot is tools/asset_result_registration.py --snapshot output pasted verbatim. If it fails for an asset, report its error instead of dispatching against an invented path.
isolation: "worktree" (send all Agent calls in one message).completed.main_scene retarget is your job. Scaffold leaves run/main_scene="res://scenes/main.tscn" (placeholder). After the worker that creates this tag's entry scene (per SCENES.md) completes and the .tscn is on disk, Edit project.godot's [application] run/main_scene to res://<path>.pending or in_progress tasks (everything is completed or verified). Then go to Step 2.Run ONE verifier, then ONE reviewer, on the integrated state:
Verifier:
references/verifier-dispatch.md for the brief templatesubagent_type: "verifier". Pass all completed-but-not-yet-verified workers' deliverables.pending fix tasks in PLAN.md. Failed tasks stay completed. Go back to Step 1.completed → verified.Reviewer (after verifier passes):
references/reviewer-dispatch.md for the brief templatesubagent_type: "reviewer". Reviewer reports back; do not let it modify project files.Asset Runtime Snapshot when reviewed files use visual assets.references/reviewer-finding-triage.md into one of three options:pending fix task to PLAN.md.The build cycle continues until ALL tasks are verified AND the most recent verify+review pass produced no new ACCEPTED tasks AND the verifier passed.
Five effective production repairs, not five dispatches, are the only failure gate. Apply references/repair-attempt-accounting.md: incomplete handoffs and orchestration failures use its no-progress process, keep the task continuable, and do not consume the repair budget.
isolation: "worktree"references/worker-dispatch.md → Parallel Worker Dispatch for merge procedureMEMORY.md <- Index + cross-cutting knowledge
memory/
{system_name}.md <- Per-system details (template: .claude/templates/memory_subsystem.md)| Skill | Purpose | Path | |-------|---------|------| | gecs | ECS framework API + patterns | .claude/skills/gecs/SKILL.md | | headless-build | Compile verification | .claude/skills/headless-build/SKILL.md | | gdunit-driver | Unit test execution | .claude/skills/gdunit-driver/SKILL.md | | godot-api | Godot API reference | .claude/skills/godot-api/SKILL.md | | screenshot | Gameplay screenshot capture | .claude/skills/screenshot/SKILL.md | | mcp-driver | Runtime debugging via godot-mcp | .claude/skills/mcp-driver/SKILL.md |
Asset analysis: Dispatch an Analyst subagent (subagent_type: "analyst", see references/analyst-dispatch.md) when you need to analyze user-provided assets.
Your context window is finite. Protect it:
In your context: PLAN.md status, STRUCTURE.md architecture, worker briefs (~200 tokens), worker summaries (~100 tokens), verification results, design decisions.
Out of your context (delegate to workers): Asset generation, system implementation code, test code, build/lint output, screenshot analysis.
When context gets large: Summarize completed phases. Reference documents by path. Write decisions to MEMORY.md for recovery after compaction.
When ALL PLAN.md tasks are verified AND the most recent verify+review pass produced no new ACCEPTED fix tasks:
python tools/append_stage_event.py build to append a {"role": "build", "ts": "<server-generated UTC>"} line to .godotmaker/stage.jsonl. Do NOT hand-write the JSON or the timestamp — the helper exists so the timestamp comes from the system clock, not your own output.git add -A && git commit -m "chore(build): <Tag>"Build complete. Recommended next: /gm-verify| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,661 | 5,370 | +47% | 1 | 1 | 0% | 156 | 3,615 | +2217% | 0 | 0 | — |
case-02 | fail→fail | 5,163 | 6,300 | +22% | 1 | 1 | 0% | 181 | 3,730 | +1961% | 0 | 0 | — |
case-03 | fail→fail | 4,786 | 5,859 | +22% | 1 | 1 | 0% | 316 | 3,686 | +1066% | 0 | 0 | — |
case-04 | fail→pass | 10,316 | 2,670 | -74% | 1 | 1 | 0% | 1,499 | 3,758 | +151% | 0 | 0 | — |
case-05 | fail→pass | 10,551 | 2,838 | -73% | 1 | 1 | 0% | 1,627 | 3,792 | +133% | 0 | 0 | — |
case-06 | fail→pass | 4,698 | 2,276 | -52% | 1 | 1 | 0% | 650 | 3,720 | +472% | 0 | 0 | — |
case-07 | fail→pass | 9,474 | 2,794 | -71% | 1 | 1 | 0% | 1,389 | 3,808 | +174% | 0 | 0 | — |
case-08 | fail→pass | 15,120 | 2,836 | -81% | 1 | 1 | 0% | 2,160 | 3,765 | +74% | 0 | 0 | — |
case-09 | fail→pass | 9,690 | 5,055 | -48% | 1 | 1 | 0% | 1,395 | 3,739 | +168% | 0 | 0 | — |
case-10 | fail→pass | 9,429 | 4,610 | -51% | 1 | 1 | 0% | 1,251 | 4,127 | +230% | 0 | 0 | — |
case-11 | fail→pass | 8,034 | 2,210 | -72% | 1 | 1 | 0% | 1,089 | 3,696 | +239% | 0 | 0 | — |
case-12 | pass→pass | 6,548 | 3,973 | -39% | 1 | 1 | 0% | 978 | 4,032 | +312% | 0 | 0 | — |
case-13 | fail→fail | 14,420 | 3,462 | -76% | 1 | 1 | 0% | 2,140 | 3,892 | +82% | 0 | 0 | — |
case-14 | fail→fail | 8,468 | 7,270 | -14% | 1 | 1 | 0% | 1,567 | 3,809 | +143% | 0 | 0 | — |
case-15 | fail→pass | 9,522 | 3,783 | -60% | 1 | 1 | 0% | 1,423 | 3,923 | +176% | 0 | 0 | — |
case-16 | pass→pass | 7,821 | 9,642 | +23% | 1 | 1 | 0% | 1,084 | 4,018 | +271% | 0 | 0 | — |
case-17 | fail→pass | 15,713 | 3,750 | -76% | 1 | 1 | 0% | 2,174 | 3,961 | +82% | 0 | 0 | — |
case-18 | fail→pass | 11,366 | 3,360 | -70% | 1 | 1 | 0% | 1,680 | 3,829 | +128% | 0 | 0 | — |
case-19 | pass→pass | 7,676 | 4,461 | -42% | 1 | 1 | 0% | 1,258 | 4,063 | +223% | 0 | 0 | — |
case-20 | fail→fail | 13,576 | 6,210 | -54% | 1 | 1 | 0% | 2,418 | 3,733 | +54% | 0 | 0 | — |
case-21 | pass→fail | 9,503 | 6,805 | -28% | 1 | 1 | 0% | 1,475 | 4,022 | +173% | 0 | 0 | — |
case-22 | fail→fail | 18,128 | 6,687 | -63% | 1 | 1 | 0% | 3,092 | 3,724 | +20% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 15 counted toward the lift figure. The other 7 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 15 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.