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
23 KiB
Skill Test Spec: /team-polish
Skill Summary
Orchestrates the polish team through a six-phase pipeline: performance assessment
(performance-analyst, whose report carries the optimisation list with an owner per
item) → optimization (the list implemented by its owners in the active set —
engine-programmer for engine-level root causes, tools-programmer for a content
tool; performance-analyst writes no game code) → visual polish
(technical-artist, parallel with Phase 2) → audio polish (sound-designer, parallel
with Phase 2) → hardening (qa-tester) → sign-off (orchestrator collects all results
and issues READY FOR RELEASE, NOT ASSESSED or NEEDS MORE WORK — NOT ASSESSED when a
budget is uncommitted or a phase did not run). Phase 0 resolves review_mode,
automation and team.size and the skill announces the active set before Phase 1
— the default individual spawns performance-analyst + technical-artist only, so
no programmer is active and the report names the optimisation list as handed to
/dev-story; small adds sound-designer, qa-tester and engine-programmer (the full
pipeline); studio keeps that set and adds an adversarial pass. Each agent writes a
date-stamped report to a named path under production/polish/ under the bounded
write exception (no per-write prompt), and the orchestrator states that nothing
reads production/polish/ yet. The code, shader, audio and asset changes of
Phases 2–4 are outside that exception: one ask covers the whole set. Uses
AskUserQuestion at each phase transition. Engine-programmer is spawned
conditionally only when Phase 1 identifies engine-level root causes.
Static Assertions (Structural)
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings
- Contains verdict keywords: READY FOR RELEASE, NOT ASSESSED, NEEDS MORE WORK — and states that NOT ASSESSED ranks above READY FOR RELEASE and below NEEDS MORE WORK
- Contains "File Write Protocol" section
- File writes are delegated to sub-agents — orchestrator does not write files directly
- Names a destination per agent under
production/polish/:[area]-report-[date].md(performance-analyst),[area]-render-notes-[date].md(technical-artist),[area]-engine-fixes-[date].md(engine-programmer),[area]-tool-fixes-[date].md(tools-programmer),[area]-audio-notes-[date].md(sound-designer),[area]-verification-[date].md(qa-tester) - Sub-agents write those named
production/paths without a per-write prompt (bounded exception), and must ask for any write outside it; implementation files (code, shaders, audio, assets) are outside it — each agent lists the files it will create or change, and the skill asks once for the set before any is written — one ask for the whole Phase 2–4 set, never one per phase - The
smallandstudiosets includeengine-programmer; atindividualno programmer is active and the report names the optimisation list as handed to/dev-story - Defines a phase gate as a decision point the pipeline itself lists, whatever the
automationmode, and claims no director spawn at phase gates - Has a next-step handoff at the end (references
/release-checklist,/sprint-plan update,/gate-check) - Error Recovery Protocol section is present: verify a named artifact is on disk, surface BLOCKED immediately, always produce a partial report, full procedure in
.claude/docs/error-recovery-protocol.md AskUserQuestionis used at phase transitions before proceeding (collaborativemode)- Phase 0 resolves
team.size, and the skill requires a one-line active-set announcement before Phase 1 - Phase 3 (visual polish) and Phase 4 (audio polish) are explicitly run in parallel with Phase 2
- Phase 1's report carries the optimisation list with an owner per item; performance-analyst writes no game code in any phase
- engine-programmer is conditionally spawned in Phase 2 only when Phase 1 identifies engine-level root causes
- Phase 6 sign-off compares metrics against budgets before issuing verdict
- Phase 6 lists every remaining issue with its severity, the measured gap where there is one (e.g. "3 ms over budget") and a recommendation
Test Cases
Case 1: Happy Path — Full pipeline completes, READY FOR RELEASE verdict
Fixture:
- Resolved config block:
team.size: small,automation: collaborative - Feature exists and is functionally complete (e.g.,
combatsystem) - Performance budgets are defined in
project.yaml(performance.target_framerate: 60,performance.frame_budget_ms: 16.6,performance.draw_call_limit: 2000,performance.memory_ceiling_mb: 2048) - No frame budget violations exist before polishing begins
- No audio events are missing; VFX assets are complete
- No regressions are introduced by polish changes
Input: /team-polish combat
Expected behavior:
- Before any spawn, one line announces the active set for
team.size: small(the full pipeline) - Phase 1: performance-analyst is spawned; profiles the combat system, measures frame budget, checks memory usage; writes
production/polish/combat-report-[date].mdshowing all metrics within budget AskUserQuestionpresents performance report; user approves before Phases 2, 3, and 4 begin- Phase 2: the report's optimisation list holds only minor rendering items (e.g., draw call batching), owned by technical-artist, so they join its Phase 3 brief; no engine-level root cause was identified, so engine-programmer is not spawned; performance-analyst changes no code
- Phases 3 and 4 are launched in parallel alongside Phase 2:
- Phase 3: technical-artist reviews VFX for quality, optimizes particle systems, adds screen shake and visual juice; writes
production/polish/combat-render-notes-[date].md - Phase 4: sound-designer reviews audio events for completeness, checks mix levels, adds ambient audio layers; writes
production/polish/combat-audio-notes-[date].md - The agents changing shaders, VFX or assets first list the files; one
AskUserQuestioncovers the whole Phase 2–4 set, and nothing is edited before the yes
- Phase 3: technical-artist reviews VFX for quality, optimizes particle systems, adds screen shake and visual juice; writes
- All three parallel phases complete;
AskUserQuestionpresents results; user approves before Phase 5 begins - Phase 5: qa-tester runs edge case tests, soak tests, stress tests, and regression tests; all pass; writes
production/polish/combat-verification-[date].md AskUserQuestionpresents test results; user approves before Phase 6- Phase 6: orchestrator collects all results; compares before/after performance metrics against budgets; all metrics pass
- The report says the
production/polish/files are a record that nothing in the repo reads yet - Verdict: READY FOR RELEASE
Assertions:
- Active-set line naming
team.size: smallappears before the first agent is spawned - performance-analyst is spawned first in Phase 1 before any other agents
AskUserQuestionappears after Phase 1 output and before Phases 2/3/4 launch- Phases 3 and 4 Agent calls are issued at the same time as Phase 2 (not after Phase 2 completes)
- engine-programmer is NOT spawned when Phase 1 finds no engine-level root causes
- performance-analyst edits no code, shader or asset in any phase
- Implementation files of Phases 2–4 are listed by each agent and asked for in one
AskUserQuestionfor the whole set — not once per phase — before any is edited - qa-tester (Phase 5) is not launched until the parallel phases complete and user approves
- Each agent writes to its named
production/polish/[area]-…-[date].mdpath without a per-write prompt, and the orchestrator confirms the file exists before treating the phase as done - Phase 6 verdict is based on comparison of metrics against defined budgets
- Summary report includes: before/after performance metrics, visual polish changes, audio polish changes, test results
- Summary states that nothing reads
production/polish/yet - No files are written by the orchestrator directly
- Verdict is READY FOR RELEASE
Case 2: Performance Blocker — Frame budget violation cannot be fully resolved
Fixture:
- Resolved config block:
team.size: small,automation: collaborative - Feature being polished:
particle-stormVFX system - Phase 1 identifies a frame budget violation: particle-storm costs 12ms on target hardware (budget is 6ms for this system)
- Phase 1's optimisation list assigns the particle work to technical-artist and an engine-level particle-update hot path to engine-programmer; after both are applied the cost is 9ms — still over the 6ms budget
- Phase 2 cannot fully resolve the violation without a fundamental design change
Input: /team-polish particle-storm
Expected behavior:
- Phase 1: performance-analyst identifies the 12ms frame cost vs. 6ms budget; reports "FRAME BUDGET VIOLATION: particle-storm costs 12ms, budget is 6ms", with an optimisation list naming each item's owner
AskUserQuestionpresents the violation; user chooses to proceed with optimization attempt- Phase 2: engine-programmer implements the engine-level item and technical-artist the particle items (after the one ask for the set); the re-profile reads 9ms — reduced but still over budget: "Optimization reduced cost to 9ms (was 12ms) — 3ms over budget. No further gains achievable without design changes."
- Phases 3 and 4 run in parallel with Phase 2 (visual and audio polish)
- Phase 5: qa-tester runs regression and edge case tests; all pass
- Phase 6: orchestrator collects results; frame budget violation (9ms vs 6ms budget) remains unresolved
- Verdict: NEEDS MORE WORK
- Report lists the specific unresolved issue with severity: "particle-storm frame cost (9ms) exceeds budget (6ms) by 3ms — requires design scope reduction or budget renegotiation"
- Next Steps: schedule the remaining issue in
/sprint-plan update; re-run/team-polishafter fix
Assertions:
- Frame budget violation is flagged in Phase 1 with specific numbers (actual vs. budget)
- Phase 2 reports the post-optimization metric explicitly (9ms achieved, 3ms still over)
- Verdict is NEEDS MORE WORK (not READY FOR RELEASE) when a budget violation remains
- The specific unresolved issue is listed by name with the remaining gap quantified
- Next Steps references
/sprint-plan updatefor scheduling the remaining fix - Phases 3 and 4 still run (polish work is not abandoned due to a Phase 2 partial resolution)
- Phase 5 qa-tester still runs (regression testing is independent of the performance outcome)
Case 3: No Argument — Usage guidance shown
Fixture:
- Any project state
Input: /team-polish (no argument)
Expected behavior:
- Skill detects no argument is provided
- Outputs usage guidance: e.g., "Usage:
/team-polish [feature or area to polish] [--review full|lean|solo]— specify the feature or area to polish (e.g.,combat,main menu,inventory system,level-1)" - Skill exits without spawning any agents
Assertions:
- Skill does NOT spawn any agents when no argument is provided
- Usage message shows the full argument-hint —
/team-polish [feature or area to polish] [--review full|lean|solo]— and argument examples - Skill does NOT attempt to guess a feature from project files
- No
AskUserQuestionis used — output is direct guidance
Case 4: Engine-Level Bottleneck — engine-programmer spawned conditionally in Phase 2
Fixture:
- Resolved config block:
team.size: small,automation: collaborative - Feature being polished:
open-worldenvironment streaming - Phase 1 identifies a performance bottleneck with a root cause in the rendering pipeline: "draw call overhead is caused by the engine's scene tree traversal in the spatial indexer — this is an engine-level issue, not a game code issue"
- Performance budgets are defined; the rendering overhead exceeds target frame budget
Input: /team-polish open-world
Expected behavior:
- Phase 1: performance-analyst profiles the environment; identifies frame budget violation; root cause analysis points to engine-level rendering pipeline (spatial indexer traversal overhead)
- Phase 1 output explicitly classifies the root cause as engine-level
AskUserQuestionpresents the performance report including the engine-level root cause; user approves before Phase 2- Phase 2: engine-programmer (in the
smallset) is spawned for the engine-level rendering item on the optimisation list, writingproduction/polish/open-world-engine-fixes-[date].md; performance-analyst writes no code - Phases 3 and 4 also run in parallel with Phase 2 (visual and audio polish); engine-programmer lists the engine files it will change along with the other agents' files, and one ask covers the set
- engine-programmer addresses the spatial indexer traversal after the yes; provides profiler validation showing the fix reduces overhead
- Phase 5: qa-tester runs regression tests including tests for the engine-level change
- Phase 6: orchestrator collects all results; if metrics are now within budget, verdict is READY FOR RELEASE; if not, NEEDS MORE WORK
Assertions:
- engine-programmer is NOT spawned in Phase 2 unless Phase 1 explicitly identifies an engine-level root cause
- engine-programmer is spawned in Phase 2 when Phase 1 identifies an engine-level root cause
- engine-programmer's Phase 2 Agent call is issued alongside the Phase 3 and 4 calls (not sequentially), and performance-analyst is not re-spawned to change code
- engine-programmer edits nothing before the one ask for the Phase 2–4 implementation set is answered yes
- Phases 3 and 4 also run in parallel with Phase 2 (not deferred until Phase 2 completes)
- engine-programmer's output includes profiler validation of the fix
- qa-tester in Phase 5 runs regression tests that cover the engine-level change
- Verdict correctly reflects whether all metrics including the engine fix now meet budgets
Case 5: Regression Found — Polish change broke an existing feature
Fixture:
- Resolved config block:
team.size: small,automation: collaborative - Feature being polished:
inventory-ui - Phases 1–4 complete successfully; performance and polish changes are applied
- Phase 5: qa-tester runs regression tests and finds that a shader optimization applied in Phase 3 broke the item highlight glow effect on hover — an existing feature that was working before the polish pass
Input: /team-polish inventory-ui (Phase 5 scenario)
Expected behavior:
- Phases 1–4 complete; polish changes include a shader optimization from technical-artist
- Phase 5: qa-tester runs regression tests and detects "Item highlight glow on hover no longer renders — regression introduced by shader optimization in Phase 3"
- qa-tester writes its findings to
production/polish/inventory-ui-verification-[date].md(no per-write prompt) and returns the regression as a CONCERNS/BLOCKED line in its return contract - The orchestrator confirms the verification file exists, then at the Phase 5 → Phase 6 transition writes qa-tester's full analysis in conversation — naming the broken behavior and the Phase 3 shader change that caused it — and captures the decision via
AskUserQuestionwith qa-tester's proposals as options - Phase 6: the regression is listed among remaining issues with severity and a recommendation
- Verdict: NEEDS MORE WORK
- Next Steps: schedule the fix in
/sprint-plan updateand re-run/team-polishafter fixes
Assertions:
- Regression is surfaced before Phase 6 sign-off
- The specific broken behavior and the responsible change are both named in the report
- qa-tester's findings are written to
production/polish/inventory-ui-verification-[date].mdwithout a separate approval prompt AskUserQuestionat the Phase 5 → 6 transition presents the regression and qa-tester's proposed resolutions as selectable options- Phase 6 lists the regression as a remaining issue with severity
- Verdict is NEEDS MORE WORK when a regression is present and unresolved
- Next Steps directs the fix to
/sprint-plan updateand a/team-polishre-run — no in-session fix is reported as verified
Case 6: No Budgets Committed — NOT ASSESSED, not READY FOR RELEASE
Fixture:
- Resolved config block:
team.size: small,automation: collaborative project.yamlsets none ofperformance.target_framerate,performance.frame_budget_ms,performance.draw_call_limitorperformance.memory_ceiling_mb, and no design doc states a budget for the area- Feature being polished:
main-menu; every phase completes, and qa-tester finds no regressions
Input: /team-polish main-menu
Expected behavior:
- Phase 1: performance-analyst profiles the menu via
/perf-profile; each metric is reported as measured butNOT ASSESSED— no committed budget — never as within budget or with headroom against a placeholder such as 16.67 ms - Phases 2–5 run normally; nothing is found over budget and there are no regressions
- Phase 6: no known problem, but the budget comparison could not run, so the verdict is NOT ASSESSED — not READY FOR RELEASE — and the report names each unset
performance.*key - Next Steps: commit the budgets in
project.yamland re-run/team-polish;/release-checklistis not offered as the next step
Assertions:
- Verdict is NOT ASSESSED, not READY FOR RELEASE
- The report names each unset
performance.*key as the reason - No metric is described as within budget, and no headroom is computed against a placeholder budget
- Next Steps asks for the budgets and a re-run rather than handing off to
/release-checklist - A regression found in the same run would make the verdict NEEDS MORE WORK instead — the missing budgets do not mask a known problem
Case 7: Default individual — the optimisation list is handed to /dev-story
Fixture:
- Resolved config block:
team.size: individual,automation: collaborative - Budgets committed in
project.yaml(as in Case 1) - Feature being polished:
crafting-menu; Phase 1 finds a draw-call overrun owned by technical-artist and a script hot path in the crafting logic owned by gameplay-programmer — no engine-level root cause
Input: /team-polish crafting-menu
Expected behavior:
- The active-set line names performance-analyst + technical-artist; the not-spawned line names sound-designer, qa-tester, engine-programmer and tools-programmer
- Phase 1: performance-analyst writes
production/polish/crafting-menu-report-[date].mdwith the optimisation list, each item naming its owner - Phase 2: no programmer is active, so no agent implements the script item — performance-analyst does not implement it either; the draw-call item joins technical-artist's Phase 3 brief
- The report lists the gameplay-programmer item under "Optimisation list handed to
/dev-story:production/polish/crafting-menu-report-[date].md" - Phase 6: audio polish and hardening did not run; if the script hot path keeps a metric over budget the verdict is NEEDS MORE WORK, otherwise NOT ASSESSED
- Next Steps: implement the handed-off items with
/dev-story, then re-run/team-polish
Assertions:
- No agent changes code for the gameplay-programmer item in this run, and performance-analyst changes nothing
- The report names the optimisation list as handed to
/dev-story, with the path and each item's owner - Verdict is never READY FOR RELEASE at
individual - An over-budget metric the handed-off item targets makes the verdict NEEDS MORE WORK
Protocol Compliance
- At the default
team.size: individual, the run opens with anActive set (team.size: individual): performance-analyst + technical-artistline and aNot spawned this run:line naming sound-designer, qa-tester, engine-programmer and tools-programmer — before any agent is spawned - Phase 1 (assessment) must complete before any other phase begins
- In
collaborativemode,AskUserQuestionis used after every phase output before the next phase launches - Phases 3 and 4 are launched in parallel with Phase 2 whenever their agents are in the active set (not deferred)
- engine-programmer is only spawned when Phase 1 explicitly identifies engine-level root causes, and only at
smallorstudio - performance-analyst produces the optimisation list and never implements it; an item whose owner is not active is named as handed to
/dev-story - Phase 2–4 implementation files are asked for once, as a set — not once per phase
- No files are written by the orchestrator directly — all writes are delegated to sub-agents
- Sub-agents skip the per-write prompt only for their named
production/polish/paths; any other write requires a "May I write" ask - A phase whose named artifact is missing on disk is treated as failed, not done
- BLOCKED status from any agent is surfaced immediately — not silently skipped
- A partial report is always produced when some agents complete and others block
- Verdict is exactly one of READY FOR RELEASE, NOT ASSESSED or NEEDS MORE WORK — a known problem is NEEDS MORE WORK even when something else went unchecked, and READY FOR RELEASE is reachable only when every measured metric had a committed budget and every phase ran
- At
team.size: individual, sound-designer's audio polish and qa-tester's hardening are named as not run, so the verdict is NOT ASSESSED unless a known problem makes it NEEDS MORE WORK - NEEDS MORE WORK verdict always lists specific remaining issues with severity, the measured gap where there is one, and a recommendation
- Next Steps handoff references
/release-checklist(on success),/sprint-plan updateand a/team-polishre-run (on failure),/gate-checkbefore handing off to release, and, on NOT ASSESSED, supplying the missing budgets or phases before a re-run - At
team.size: studio, Phase 5's qa-tester is told to find how the polished feature breaks rather than confirm it holds, and the report says the adversarial pass ran; no engine specialist is added
Coverage Notes
- The tools-programmer optional agent (for content pipeline tool fixes) is not
separately tested — it follows the same conditional spawn pattern as engine-programmer
and is invoked in Phase 2, at
smallorstudio, only when Phase 1 traces a cause to a content authoring tool. - The "Retry with narrower scope" and "Skip this agent" resolution paths from the Error
Recovery Protocol are not separately tested — they follow the same
AskUserQuestion- partial-report pattern validated in Cases 2 and 5.
- Phase 6 sign-off logic (collecting and comparing all metrics) is validated implicitly by Cases 1 and 2. The distinction between READY FOR RELEASE and NEEDS MORE WORK is exercised in both directions across these cases, and NOT ASSESSED by Case 6.
- The
individualpath — audio polish and hardening not run, the optimisation list handed to/dev-story— is given Case 7. - Soak testing and stress testing (Phase 5) are validated implicitly by Case 1's qa-tester output. Case 5 focuses on the regression detection aspect of Phase 5.
- The "minimum spec hardware" test path in Phase 5 is not separately tested — it follows the same qa-tester delegation pattern when the hardware is available.
- The
studioaddition (the adversarial review pass) is asserted in Protocol Compliance but not given its own case.