automated-smoke-test

$npx mdskill add striderZA/OpenCodeGameStudios/automated-smoke-test

Runs an automated smoke test on a Godot project via godot-mcp.

  • Automates smoke testing without manual verification.
  • Depends on the godot-mcp server for project interaction.
  • Analyzes debug output for errors, warnings, and assertions.
  • Produces a structured pass/fail report for the user.

SKILL.md

.github/skills/automated-smoke-testView on GitHub ↗
---
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.

More from striderZA/OpenCodeGameStudios

SkillDescription
art-bibleGuided, section-by-section Art Bible authoring. Creates the visual identity specification that gates all asset production. Run after /concept-brainstorm is approved and before /map-systems or any GDD authoring begins.
art-generateGenerates placeholder .aseprite files from asset specs using the Aseprite MCP. Reads asset specs and art bible, creates sprites with correct dimensions/palette/layers, exports PNGs. Run after /asset-spec has produced specs and /art-bible exists.
asset-auditAudits game assets for compliance with naming conventions, file size budgets, format standards, and pipeline requirements. Identifies orphaned assets, missing references, and standard violations.
asset-specGenerate per-asset visual specifications and AI generation prompts from GDDs, level docs, or character profiles. Produces structured spec files and updates the master asset manifest. Run after art bible and GDD/level design are approved, before production begins.
balance-checkAnalyzes game balance data files, formulas, and configuration to identify outliers, broken progressions, degenerate strategies, and economy imbalances. Use after modifying any balance-related data or design. Use when user says 'balance report', 'check game balance', 'run a balance check'.
concept-brainstormGuided game concept ideation — from zero idea to a structured game concept document. Uses professional studio ideation techniques, player psychology frameworks, and structured creative exploration.
content-auditAudit GDD-specified content counts against implemented content. Identifies what's planned vs built.
create-architectureGuided, section-by-section authoring of the master architecture document for the game. Reads all GDDs, the systems index, existing ADRs, and the engine reference library to produce a complete architecture blueprint before any code is written. Engine-version-aware: flags knowledge gaps and validates decisions against the pinned engine version.
create-control-manifestAfter architecture is complete, produces a flat actionable rules sheet for programmers — what you must do, what you must never do, per system and per layer. Extracted from all Accepted ADRs, technical preferences, and engine reference docs. More immediately actionable than ADRs (which explain why).
create-epicsTranslate approved GDDs + architecture into epics — one epic per architectural module. Defines scope, governing ADRs, engine risk, and untraced requirements. Does NOT break into stories — run /create-stories [epic-slug] after each epic is created.