Help us improve
Share bugs, ideas, or general feedback.
From summer
Runs a disciplined debug loop for Godot/Summer projects: script errors → diagnostics → console → debugger → hypothesis → fix → verify. Use when the user reports crashes, errors, freezes, or unexpected behavior.
npx claudepluginhub summerengine/summer-engine-agent --plugin summerHow this skill is triggered — by the user, by Claude, or both
Slash command
/summer:debug**/*.gd**/*.cs**/*.tscn**/*.tresproject.godotThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
The disciplined debugging loop for Godot/Summer projects. Read the error before guessing. Form a hypothesis before editing. Verify the fix before declaring victory. Never grep the codebase before reading the actual error.
Debugs Godot errors and crashes including parser/syntax issues, identifier scope problems, null references, and runtime failures with GDScript fixes.
Provides persistent godot-mcp and AI Bridge workflows for Godot 4.x projects, handling .tscn/.gd/.gdshader/.tres files and live editor tasks like scene inspection, node edits, refresh/run/test loops, runtime diagnostics, hybrid validation.
Debugs Godot 4.3+ projects in GDScript and C# using print techniques, breakpoints, signal tracing, profiler, scene inspection, and common error fixes.
Share bugs, ideas, or general feedback.
The disciplined debugging loop for Godot/Summer projects. Read the error before guessing. Form a hypothesis before editing. Verify the fix before declaring victory. Never grep the codebase before reading the actual error.
Core principle: The debugger already knows what's wrong. Your job is to listen to it before doing anything else.
gdscript-patterns, scene-composition).make-game territory. Listen → Diagnose → Hypothesize → Propose → Fix → Verify
Do not skip steps. Do not loop back to "Hypothesize" without re-running the cheap diagnostic.
Ask the user one focused question and wait for the answer:
What's happening, and when does it happen?
If they already gave a clear symptom in the request, skip the question. If they say "something's broken", that one question is your only call until they reply. Don't run tools yet.
In strict order. Stop at the first one that returns useful signal.
| Order | Tool | When |
|---|---|---|
| 1 | summer_get_script_errors | Always start here. Catches GDScript parse errors, missing identifiers, signature mismatches. Cheapest, no side effects. |
| 2 | summer_get_diagnostics | Aggregate console + debugger error counts. One call, broad picture. |
| 3 | summer_get_console | Read the editor Output panel — print statements, warnings, errors that didn't crash. |
| 4 | summer_get_debugger_errors | Runtime errors caught by the debugger. Use AFTER summer_play for runtime-only bugs. |
If summer_get_script_errors is clean and the user says it crashes only when running: it's a runtime bug. Go to step 2b.
summer_clear_console
summer_play
─▶ ASK USER: "Reproduce the bug now."
(wait for confirmation)
summer_get_debugger_errors
summer_stop
Do not skip the "reproduce now" prompt. Auto-running and grabbing whatever's in the buffer leads you to chase ghosts from previous sessions.
If summer_get_script_errors returns "Summer Engine is not running" or the tool isn't available:
Do NOT loop on MCP retry. Do NOT pretend the engine will come back. Use the fallback the moment it fails once.
State exactly one hypothesis, in one sentence, naming the file and line.
Good: "Typo at
scripts/player.gd:14—GRAVTYshould beGRAVITY." Bad: "Could be a typo, missing import, or wrong scope."
If you have multiple plausible theories, pick the highest-prior-probability one. The user can correct you if you're wrong; chasing all three at once wastes their time.
Verify the hypothesis without editing. If the error mentions a missing node, call summer_inspect_node to confirm. If it's a missing resource, summer_inspect_resource. If it's a scene-graph issue, summer_get_scene_tree. Confirm the world state matches the error before proposing a fix.
Surface the proposed fix in plain language and ask permission. Two patterns:
Code fix:
May I edit
scripts/player.gdto renameGRAVTY→GRAVITYon line 14?
Scene fix vs code fix:
The script calls
audio.play()but theAudioStreamPlayerchild is gone. Two options:
- Re-add the
AudioStreamPlayerto./Coin(preserves the original behavior).- Null-check in
coin.gd(defensive, but the audio is silent).Which one do you want?
Never unilaterally pick when there are two equally valid fixes (scene vs code, defensive vs strict, fast vs correct). Ask.
Read the 20–40 lines around the error, Edit the exact change. Don't read the whole file. Don't reformat. Don't rename other things.summer_* tool (summer_add_node, summer_set_prop, summer_replace_node). Group multi-step changes in summer_batch for one undo step.summer_set_resource_property against an inline sub_resource — the value is silently dropped. If the property is on a nested resource, first call summer_set_prop with the resource class name to instantiate a standalone resource, then drill in. See references/mcp-tools-reference.md.The fix is not done until the same diagnostic that found the bug returns clean.
summer_get_script_errors.summer_clear_console, then summer_play and confirm clean output.If the diagnostic is still red after the fix, you formed the wrong hypothesis. Go back to step 3 — do not make a second edit on top of the first. Revert if the first edit didn't help, then re-hypothesize.
| Don't | Why |
|---|---|
| Grep the whole project before reading the error | The error already names the file and line. Save the user's tokens. |
| Read whole files | 20–40 lines around the error is enough 90% of the time. |
| Run multiple diagnostics in parallel | They mask each other's signal. Cheapest first, escalate. |
| Edit before asking | The user owns the fix decision, you own the diagnosis. |
| "Try this, see if it works" | That's not a hypothesis, that's gambling. State the theory or ask another question. |
| Reformat the file while you're in it | Out-of-scope edits make the diff hostile to review. |
| Auto-fix linter warnings unrelated to the bug | Same reason. |
| Declare victory after editing | Re-run the diagnostic. Always. |
| Symptom | First tool | Common cause |
|---|---|---|
| "Identifier X not declared" | summer_get_script_errors | Typo, missing import, wrong scope |
| "Invalid call. Nonexistent function 'X' in base 'Nil'" | summer_get_debugger_errors after summer_play | Node was deleted in editor, code still references it |
| "Cannot find type 'X'" | summer_get_script_errors | Class name mismatch, missing autoload, missing class_name |
| Game runs but visuals wrong | summer_get_console + summer_inspect_node | Material/light/camera misconfigured |
| Game freezes (no crash) | summer_get_console after summer_play for ~3s | Infinite loop in _process or _ready |
summer_set_resource_property "succeeded" but nothing changed | n/a | Inline sub-resource silent-fail. Use summer_set_prop with class name first. |
A debug session is done when:
Tell the user one short sentence: "Fixed <file>:<line> — <change>. Diagnostic clean." Then stop.
The summer_* tools are powerful for static + boot-time issues but can't substitute for play-testing. Knowing the gaps prevents false-clean reports.
summer_get_script_errors) — full text + file:line. Reliable.summer_get_console) — print statements, editor-side warnings, std startup messages. Full text.summer_get_debugger_errors) — returns errors_data with error, error_descr, callstack, file, function, line. Reliable for errors.summer_get_diagnostics) — counts of console errors, debugger errors, debugger warnings, script errors. Tells you where to drill.summer_get_scene_tree, summer_inspect_node) — only the edited scene, not the running game's live tree.summer_is_running) — and on which scene.summer_get_debugger_errors returns a warnings: <count> integer but no warnings_data array. You see "the game has 66 warnings" but you can't read them through MCP. Tell the user: "I see N warnings exist but the MCP doesn't expose their text — paste the Debugger panel if any feel relevant."summer_get_scene_tree returns the editor's edited scene, not what's currently instantiated in the running game. When debugging runtime state, you can't introspect the live nodes.A clean summer_get_diagnostics after summer_play only proves: the game booted without parse errors or @implicit_ready null-derefs. It does NOT prove gameplay works. Auto-fire weapons, level transitions, spell casting, boss attacks, UI interactions all happen after boot and won't surface in the diagnostics until they fire.
When you've made code changes and want to declare them "verified":
summer_get_script_errors clean on every modified file.summer_play boot returns 0 errors (use the scene most likely to exercise the change).summer_get_diagnostics.A typical cautionary scenario: many parallel agents write thousands of lines of game code in one batch with verification static-only. The build is "diagnostic-clean" yet the running game has telegraph meshes that render the wrong axis, parse-valid scripts that crash on first autoload because of a guard pattern that doesn't compile, projectile tracers sized so they read as straight lines instead of projectiles, transform-leaked colliders from a copied scene, and @onready paths that throw on every boot when the script is loaded into a sibling scene that lacks one of the referenced children. None of these surface in summer_get_diagnostics until the user actually plays.
Static analysis is necessary but never sufficient.