Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Self-diagnostic skill for godotmaker itself. Invoked when the main pipeline can't make progress (e.g. several fixgap rounds in a row failed to converge). NOT a "smarter fixgap" — does not modify game code, does not write files, only reports diagnosis to chat. If a godotmaker-side defect is the root cause, drafts an issue the user can post upstream. Explicit invocation only — use /gm-rescue.
.claude/skills/randallliuxin-gm-rescue/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 347% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 103% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 161% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -9% | 0% |
$ARGUMENTS
You are a diagnostic skill. Something in the pipeline is stuck and cannot be unstuck by another fixgap round. Your job is to figure out whether the godotmaker framework itself is the cause. You are NOT here to complete the user's game.
This skill lives outside the main pipeline. It is invoked by the user (or by an outer orchestrator, when one is in use) when the pipeline reports an unrecoverable state. Nothing else in the pipeline depends on this skill running.
You are answering exactly one question:
> Is the inability to make progress caused by a defect in godotmaker (skills, hooks, config, templates), or by something outside godotmaker's responsibility?
.godotmaker/.<!-- redact-check: ... --> comment.FIRST ACTION — before anything else: Write rescue to .godotmaker/current_role.
(That file write is the only file system mutation this skill performs. The When Done section's event log append is the only other one. Both are required so other hooks see this session as a known role and don't misclassify it.)
Rescue has no prerequisites at the godotmaker level — the caller (user or orchestrator) decides when to invoke it. So:
/gm-rescue while the main pipeline appears healthy (most recent stage event is accept with decision == "accept", or finalize, with no error indicators), warn that rescue is intended for stuck-pipeline situations and ask the user to confirm before proceeding. If they confirm, continue; if not, exit cleanly.Read the runtime artifacts that describe the stuck state:
.godotmaker/current_role — what stage was last active.godotmaker/stage.jsonl — recent role-completion events (most recent first).godotmaker/evaluation.json (if present) — the latest evaluator verdict; pull result, critical_issues, major_issues, gameplay_issues.godotmaker/metrics.jsonl — last 50–100 events for chronology.godotmaker/traces/ — most recent few worker / verifier / reviewer outputs (sort by mtime, take latest 3–5)PLAN.md (current tag header + which tasks are not verified), GAP.md (if present), MEMORY.md (recent reviewer findings)Synthesize a one-paragraph "what is the pipeline trying to do, and what specifically blocks it?" before any further analysis. Do not skip this — it disciplines the rest of the diagnosis.
Translate the symptom into one or two falsifiable hypotheses. Bad hypothesis: "the build is broken". Good hypothesis: "the verifier rejects worker output because check_worker_report.py requires a section that the worker dispatch brief does not document, so workers will never produce it."
If you can't form a hypothesis from the artifacts in step 1, say so and stop — write a chat message explaining what you looked at and what was missing for diagnosis. Do not invent.
Use references/diagnostic-checklist.md as the order of inspection. Roughly: hooks first (they're the highest-leverage failure mode — one bad regex blocks every worker), then skill SKILL.md and references/ (instruction contradictions), then config schemas (rejecting valid output), then templates (producing structure the rest of the pipeline can't parse).
For each layer, read the relevant files (godotmaker source, not the user's project) and check whether the hypothesis from step 2 is a real defect there.
Output to chat (not a file). Required structure:
## Diagnosis
**Symptom:** <the one-paragraph synthesis from step 1>
**Hypothesis:** <the falsifiable claim from step 2>
**Conclusion:** <one of: GODOTMAKER DEFECT | NOT A GODOTMAKER DEFECT | INSUFFICIENT EVIDENCE>Then branch:
GODOTMAKER DEFECT## Where it lives
<file path inside godotmaker repo>:<line range>
<short paste of the offending lines>
## Why it fails
<2–4 sentence explanation tying the lines to the symptom>
## Suggested upstream fix (NOT to be applied here)
<one-paragraph sketch — implementor will need to verify>
## Issue draft for the user
(The user — not you — will copy this to a GitHub issue. Review for
sensitive content before posting; everything below is what we'll send.)
---
**Title:** <short imperative description>
**Pipeline state when blocked:**
- Stage: <stage>
- Current tag: <Tag>
- Evaluation result: <approve|reject|n/a>
**Reproducer:**
<the minimal sequence — describe in terms of "ran /gm-X, then /gm-Y";
do NOT paste user game code or GDD contents>
**Suspected root cause:**
<file path:line range, the offending pattern>
**Workaround the user can try locally:**
<if any; otherwise "none — needs upstream fix">
---End the message with: If you'd like me to refine the issue draft, tell me what to change. I will not submit it on your behalf.
NOT A GODOTMAKER DEFECT## Why this is not godotmaker's fault
<3–5 sentence explanation: what godotmaker is doing correctly,
why the symptom is rooted elsewhere>
## Where the problem actually lives
<one of: GDD logic, missing user assets, environment, AI implementation
difficulty, etc.>
## Suggested next step
<concrete user action — e.g. "edit GDD to remove the contradiction
between section 3 and 5", or "the assets/ directory is missing
fonts/main.ttf which ASSETS.md row 12 declares as `provided`",
or "this is an AI capability ceiling — try splitting v0.3.0 into
two tags so each is smaller">Be honest. If the most likely cause is "the AI isn't smart enough for this in one tag", say that — the user needs to know whether to split work or wait for a stronger model.
INSUFFICIENT EVIDENCE## What I checked
<bullet list of files read>
## What's missing
<bullet list of artifacts that would have allowed diagnosis>
## Suggested next step
<usually: re-run the failing stage with verbose logging, or capture
the full trace, then re-invoke /gm-rescue>Do not loop, do not retry under a different framing, do not switch hypotheses mid-report. One diagnosis, one report.
After delivering the diagnosis chat message:
python tools/append_stage_event.py rescue --conclusion=<defect|external|insufficient> to append a {"role": "rescue", "ts": "<server-generated UTC>", "conclusion": "<defect|external|insufficient>"} 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.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 5,846 | 15,247 | +161% | 1 | 1 | 0% | 875 | 3,907 | +347% | 0 | 0 | — |
case-08 | fail→pass | 11,822 | 8,545 | -28% | 1 | 1 | 0% | 1,857 | 3,777 | +103% | 0 | 0 | — |
case-01 | fail→fail | 14,219 | 5,354 | -62% | 1 | 1 | 0% | 2,225 | 2,304 | +4% | 0 | 0 | — |
case-02 | fail→fail | 20,163 | 6,443 | -68% | 1 | 1 | 0% | 2,944 | 2,322 | -21% | 0 | 0 | — |
case-14 | fail→pass | 10,899 | 12,432 | +14% | 1 | 1 | 0% | 1,596 | 4,167 | +161% | 0 | 0 | — |
case-03 | fail→fail | 18,432 | 6,918 | -62% | 1 | 1 | 0% | 2,680 | 2,418 | -10% | 0 | 0 | — |
case-04 | fail→fail | 14,679 | 8,269 | -44% | 1 | 1 | 0% | 2,952 | 2,474 | -16% | 0 | 0 | — |
case-05 | pass→fail | 12,280 | 11,478 | -7% | 1 | 1 | 0% | 1,989 | 2,777 | +40% | 0 | 0 | — |
case-06 | pass→fail | 19,201 | 9,095 | -53% | 1 | 1 | 0% | 3,775 | 2,522 | -33% | 0 | 0 | — |
case-09 | pass→fail | 6,382 | 5,540 | -13% | 1 | 1 | 0% | 971 | 2,453 | +153% | 0 | 0 | — |
case-10 | fail→pass | 13,852 | 5,529 | -60% | 1 | 1 | 0% | 2,192 | 3,034 | +38% | 0 | 0 | — |
case-11 | fail→pass | 16,936 | 1,798 | -89% | 1 | 1 | 0% | 2,436 | 2,225 | -9% | 0 | 0 | — |
case-12 | fail→pass | 6,606 | 3,936 | -40% | 1 | 1 | 0% | 1,013 | 2,630 | +160% | 0 | 0 | — |
case-13 | fail→pass | 6,925 | 12,349 | +78% | 1 | 1 | 0% | 1,228 | 3,261 | +166% | 0 | 0 | — |
case-15 | fail→pass | 10,851 | 2,648 | -76% | 1 | 1 | 0% | 1,554 | 2,440 | +57% | 0 | 0 | — |
case-16 | fail→pass | 9,529 | 1,898 | -80% | 1 | 1 | 0% | 1,386 | 2,259 | +63% | 0 | 0 | — |
case-17 | fail→fail | 8,523 | 2,055 | -76% | 1 | 1 | 0% | 1,242 | 2,277 | +83% | 0 | 0 | — |
case-18 | fail→pass | 12,114 | 6,111 | -50% | 1 | 1 | 0% | 1,784 | 2,304 | +29% | 0 | 0 | — |
case-19 | pass→pass | 5,027 | 4,752 | -5% | 1 | 1 | 0% | 739 | 2,673 | +262% | 0 | 0 | — |
case-20 | fail→pass | 9,584 | 7,008 | -27% | 1 | 1 | 0% | 1,426 | 3,091 | +117% | 0 | 0 | — |
case-21 | fail→fail | 15,539 | 3,230 | -79% | 1 | 1 | 0% | 2,332 | 2,513 | +8% | 0 | 0 | — |
case-22 | fail→pass | 11,243 | 5,136 | -54% | 1 | 1 | 0% | 1,632 | 2,802 | +72% | 0 | 0 | — |
case-23 | fail→fail | 7,245 | 2,400 | -67% | 1 | 1 | 0% | 1,270 | 2,368 | +86% | 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. 23 cases were attempted, and 17 counted toward the lift figure. The other 6 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 +39 percentage points is the difference between those two pass rates over the 17 comparable cases. 6 cases got worse with the skill loaded, and they are 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.