---
name: automated-smoke-test
description: "Run an automated smoke test using the godot-mcp server. Launches the project, captures debug output, and checks for errors or crashes."
argument-hint: "[duration-seconds]"
user-invocable: true
allowed-tools: Read, Glob, Grep, Write, Bash, Task, question
---
# Automated Smoke Test
This skill runs a fully automated smoke test against the Godot project using
the godot-mcp server. It launches the project headlessly, captures debug output
for a configurable duration, and analyzes the output for errors, warnings, and
assertions — producing a structured pass/fail report.
No manual verification required. The entire check is automated through MCP.
---
## Phase 1: Verify godot-mcp Availability
Call `get_godot_version` via the godot-mcp server. If the call succeeds, note
the version string. If it fails, inform the user:
> "godot-mcp server is not available. Install it with:
> `npx @coding-solo/godot-mcp`
> Then configure the MCP server in `opencode.json` (OpenCode) or `pi.json` (Pi)."
Stop if the server is unavailable.
---
## Phase 2: Read Project Info
Call `get_project_info` via godot-mcp. Record:
- **Project title** — from the project info response
- **Main scene** — the configured main scene path
- **Render mode** — e.g. Forward+, Mobile, GL Compatible
If `get_project_info` fails, retry up to 3 times with a 2-second delay between
attempts. If all retries fail: "Could not read project info after 3 attempts. Is
the godot-mcp server running against the correct project?" Then stop.
---
## Phase 3: Run the Project
Parse the optional argument for duration. If no argument is provided, default
to 10 seconds. The argument is in seconds: `/automated-smoke-test 15` means
capture output for 15 seconds.
Call `run_project` via godot-mcp. The project must respond (start or error)
within 30 seconds. If no response within the timeout, treat as a failure:
- Report: "Project failed to respond within 30 seconds — the project may be hung
or the engine may have frozen during launch."
- Verdict: **FAIL**
- Skip to Phase 7 (Report) — the project is unresponsive, stop would also hang
If `run_project` returns an error or the project fails to start:
- Report: "Project failed to start with error: [error message]"
- Verdict: **FAIL**
- Skip to Phase 7 (Report) — project was never launched, no stop needed
---
## Phase 4: Capture Debug Output
> **Duration scaling:** The capture duration should reflect project complexity.
> A minimal 2D project may produce output in 5 seconds; a large 3D project with
> many scenes may need 30+ seconds. Default to 10 seconds but consider the
> project's scope (from Phase 2's project info) and scale up for complex titles.
> For headless CI runs, prefer longer durations to account for slower hardware.
If `get_debug_output` returns an error:
- Report: "Could not capture debug output: [error message]"
- Verdict: **FAIL**
- Skip to Phase 6 (stop project), then continue to Phase 7 for the report
Do not use a fixed sleep. Instead, poll `get_debug_output` in a loop:
1. Every 2 seconds, call `get_debug_output`.
2. If the output contains any ERROR, crash, or assertion pattern (see Phase 5),
stop polling early — the test has already found failures.
3. If no errors appear, continue polling until the configured duration elapses
(default: 10 seconds, configurable via argument).
4. If `get_debug_output` returns an error on any poll tick:
- Report: "Could not capture debug output on poll attempt [N]: [error message]"
- Continue polling (do not abort) unless 3 consecutive polls fail.
- After 3 consecutive failures: "Debug output capture failed after 3
consecutive poll errors."
- Verdict: **FAIL**
- Skip to Phase 6
Once polling ends (duration elapsed or early-stop triggered), use the last
successful output for analysis. If all polls failed (3 consecutive errors),
there is no output to analyze — skip directly to the FAIL verdict.
If the final output is empty or trivially short, note: "Output appears minimal
— the project may not have rendered any frames."
---
## Phase 5: Analyze Output
Scan the debug output for:
| Pattern | Severity | Flags |
|---------|----------|-------|
| `ERROR` | Error | Catch-all for Godot error messages |
| `error:` | Error | Lower-case variant in scripts |
| `crash` | Critical | Game crashed during runtime |
| `NullReferenceException` | Error | Null access in C# script (.NET) |
| `segfault` | Critical | Memory access violation |
| `segmentation fault` | Critical | Full-form segfault message |
| `WARNING` | Warning | Non-fatal warnings |
| `warning:` | Warning | Lower-case variant |
| `Assertion failed` | Error | GDScript or C# assertion failure |
Count the occurrences of each pattern. Record the actual matching lines (up to
10 per pattern for the report).
---
## Phase 6: Stop the Project
Call `stop_project` via godot-mcp to clean up. If it fails, note:
"Could not stop the project cleanly — you may need to close the Godot
editor or kill the process manually."
---
## Phase 7: Report Results
Format the report:
```markdown
## Automated Smoke Test Report
**Date**: [date]
**Project**: [project title]
**Main Scene**: [main scene path]
**Godot Version**: [version from Phase 1]
**Duration**: [X seconds]
---
### Results
| Check | Result |
|-------|--------|
| Project launched | ✅ / ❌ |
| No runtime errors | ✅ / ❌ (N errors found) |
| No critical crashes | ✅ / ❌ (N crashes detected) |
| No warnings | ✅ / ⚠️ (N warnings) |
| No assertion failures | ✅ / ❌ (N assertions failed) |
---
### Error Details
[If errors/crashes found, include the matching lines in a code block.
Otherwise: "No errors detected."]
---
### Warning Details
[If warnings found, include the matching lines in a code block.
Otherwise: "No warnings detected."]
---
### Verdict: [PASS | FAIL | SILENT-FAIL]
**FAIL** if ANY of:
- Project failed to start
- Runtime errors or crashes detected
- Assertion failures found
- Debug output could not be captured after retries
**SILENT-FAIL** if:
- Project launched successfully AND no errors/crashes detected BUT
debug output was empty or trivially short (zero or near-zero lines).
This means the project may have started but produced no frames or
lifecycle output — a configuration problem or silent hang. The user
should verify manually.
**PASS** if ALL of:
- Project launched successfully
- Debug output contains substantive content (not SILENT-FAIL threshold)
- No runtime errors or crashes
- No assertion failures
- Warnings are acceptable (advisory only — do not cause FAIL)
```
Present the report to the user. Do not write it to a file unless asked.