Fix release for 1.1.1: the minimal path end to end, engine commands that run on Godot, Unity and Unreal, hook warnings you can see, and verdicts that say when they could not check. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.1 → v1.1.2). Fixes #67 Fixes #131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
9.3 KiB
Skill Test Spec: /test-helpers
Skill Summary
/test-helpers [system-name | all | scaffold] generates test helper files in
the engine's helper root — the only place its test runner compiles them:
tests/helpers/ on Godot, Assets/Tests/EditMode/Helpers/ on Unity (inside the
EditModeTests assembly), Source/<Module>/Private/Tests/Helpers/ on Unreal. It
writes base assertion and factory helpers (scaffold), and a
[helper root]/[system]_factory.[ext] per system built from that system's GDD
([system-name] or all). No argument runs scaffold when no helpers exist,
else all. It reads engine.name, engine.language and testing.framework
from project.yaml (falling back to technical-preferences.md), samples up to
5 existing test files for house style, and section-greps the GDD (Formulas,
Edge Cases, Detailed Rules/Design) rather than reading it whole.
Helpers must assert through the configured framework's API — never bare
assert() — and must not extend the framework's test-suite base class. If the
framework's assertion API cannot be confirmed, the skill says so and generates
no helper. It never overwrites an existing helper: it skips it with a message.
After presenting the file list it asks "May I write these helper files to
[helper root]?". No director gates apply. Verdict: COMPLETE when helper files
are created.
Static Assertions (Structural)
Checked against the SKILL.md by /skill-test spec — no fixture needed.
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings
- Contains verdict keyword: COMPLETE
- Contains "May I write" collaborative protocol language before writing helpers
- Has a next-step handoff (Next Steps:
/test-setup,/dev-story,/skill-test)
Director Gate Checks
None. /test-helpers is a scaffolding utility. No director gates apply.
Test Cases
Case 1: Happy Path — Player helper generated for Godot/GDScript
Fixture:
project.yamlhasengine.name: Godot,engine.language: GDScript,testing.framework: gdUnit4;addons/gdUnit4/is installed, so its assertion API can be confirmed from the projecttests/unit/player/player_movement_test.gdexistsdesign/gdd/player.mdhas a Formulas section bounding health to 0–100- No existing files in
tests/helpers/; the user approves the write
Input: /test-helpers player
Expected behavior:
- Skill reads engine, language and framework; samples the existing test file
- Skill greps
design/gdd/player.mdfor the Formulas / Edge Cases / Detailed Rules headings instead of reading it whole - Skill drafts
tests/helpers/player_factory.gd: aclass_namehelper thatextends RefCounted, staticmake_*factories with default parameters, bound constants commented as coming from the GDD, and a header line "Based on: design/gdd/player.md" - Every assertion goes through gdUnit4's confirmed API — no bare
assert(), noFAIL_IFplaceholder - Skill presents the file list and asks "May I write these helper files to
tests/helpers/?" - Files written on approval; verdict COMPLETE, followed by the per-engine usage note
Assertions:
- Generated helper is GDScript at
tests/helpers/player_factory.gd - Bound constants trace to the GDD's Formulas section (not invented values)
- Helper extends
RefCounted, not the test-suite base class, and uses no Autoload/singleton - No bare
assert()and no unresolvedFAIL_IFreaches the file - Verdict is COMPLETE
Case 2: Engine Not Configured — Stops with /setup-engine
Fixture:
project.yamlhas noengineblock;technical-preferences.mdshows[TO BE CONFIGURED]for Engine
Input: /test-helpers player
Expected behavior:
- Skill checks
project.yaml, thentechnical-preferences.md— no engine in either - Skill outputs: "Engine not configured. Run
/setup-enginefirst." - Skill stops — no test scan, no draft, no write
Assertions:
- The message states the engine is not configured
/setup-engineis named as the prerequisite- No write tool is called
- Verdict is not COMPLETE (nothing was created)
Case 3: Helper Already Exists — Skipped, never overwritten
Fixture:
- Godot/GDScript/gdUnit4 configured as in Case 1
tests/helpers/game_assertions.gdalready exists with hand-written additionstests/helpers/game_factory.gdandtests/helpers/scene_runner_helper.gddo not exist; the user approves the write
Input: /test-helpers scaffold
Expected behavior:
- Skill drafts the Godot base helpers only —
game_assertions.gd,game_factory.gdandscene_runner_helper.gd; no system-specific helpers inscaffoldmode - Skill asks "May I write these helper files to
tests/helpers/?" - The two missing files,
tests/helpers/game_factory.gdandtests/helpers/scene_runner_helper.gd, are created - For the existing file, skill reports: "Skipping
tests/helpers/game_assertions.gd— already exists. Remove the file manually if you want it regenerated." - Verdict COMPLETE
Assertions:
scaffoldmode generates no[system]_factoryhelper- The existing
game_assertions.gdis left byte-for-byte unchanged - The skip message names the existing file and how to regenerate it
- Only the two missing files are written; Verdict is COMPLETE
Case 4: Framework Assertion API Unconfirmed — No helper generated
Fixture:
project.yamlhasengine.name: Godot,engine.language: GDScript;testing.frameworkis absent andtechnical-preferences.mdshows no Framework- No
addons/gdUnit4/and no existing test files to learn the API from
Input: /test-helpers scaffold
Expected behavior:
- Skill cannot confirm which assertion call registers a failure with the runner
- Skill says so, and generates no helper rather than guessing a form such as
assert_that,assert_eq,assert_trueor a bareassert() - No "May I write" is asked and nothing is written
Assertions:
- The skill states it cannot confirm the framework's assertion API
- No helper file is written
- No guessed assertion form (and no
FAIL_IFplaceholder) is presented as ready to write - Verdict is not COMPLETE
Case 5: Director Gate Check — No gate; test-helpers is a scaffolding utility
Fixture:
- Engine and framework configured as in Case 1, no existing helpers
Input: /test-helpers player
Expected behavior:
- Skill generates and writes the helper file
- No director agents are spawned
- No gate IDs appear in output
Assertions:
- No director gate is invoked
- No gate skip messages appear
- Verdict is COMPLETE without any gate check
Case 6: Unity — Helpers under the engine's test root
Fixture:
project.yamlhasengine.name: Unity,engine.language: C#,testing.framework: NUnit;com.unity.test-frameworkis inPackages/manifest.json, so NUnit's assertion API can be confirmed from the installed package/test-setuphas createdAssets/Tests/EditMode/EditModeTests.asmdef- No helpers exist yet; the user approves the write
Input: /test-helpers scaffold
Expected behavior:
- The helper root is
Assets/Tests/EditMode/Helpers/— inside theEditModeTestsassembly, where Unity compiles it - Skill drafts
GameAssertions.csandGameFactory.csfor that folder, asserting through NUnit'sAssert - Skill asks "May I write these helper files to
Assets/Tests/EditMode/Helpers/?" - Files written on approval; the usage note says to reference the test assembly; verdict COMPLETE
Assertions:
- Helpers are written under
Assets/Tests/EditMode/Helpers/ - Nothing is written under
tests/helpers/— outsideAssets/, Unity never compiles it - The "May I write" ask names the Unity helper root
- Verdict is COMPLETE
Protocol Compliance
- Reads engine, language and test framework before generating any helper
- Writes helpers only to the engine's helper root (
tests/helpers/,Assets/Tests/EditMode/Helpers/orSource/<Module>/Private/Tests/Helpers/) - Section-greps the GDD for system helpers (numbered headings such as
## 4. Formulasincluded); constants trace to its Formulas section - Godot signal asserts keep their flag in a Dictionary the lambda mutates and connect a variadic lambda (
func(...args)) — a capturedboolnever changes in the caller, and a one-argument lambda fails on any other signal - Asserts only through the configured framework — never bare
assert()— and generates nothing when that API cannot be confirmed - Helpers never extend the framework's test-suite base class
- Never overwrites an existing helper; reports the skip instead
- Asks "May I write" before any file is created
- Verdict is COMPLETE when helper files are written
Coverage Notes
allmode (one factory per system with test files) follows Case 1 per system; not separately tested.- Unreal helper generation (
Source/<Module>/Private/Tests/Helpers/) follows Case 6's pattern for its own helper root; not separately tested. Nor is a Unity project whose PlayMode tests need the helpers too (the skill asks before creating a sharedTestHelpers.asmdef). - A requested system with no GDD is not tested; the skill does not define that path.