mirror of
https://github.com/Donchitos/Claude-Code-Game-Studios.git
synced 2026-10-16 01:37:05 +00:00
Release 1.1.0 — one config file, and a process weight you choose
`project.yaml` at the repo root is now the single source of truth for a project's configuration, replacing `production/stage.txt`, `production/review-mode.txt` and `.claude/docs/technical-preferences.md` (all three still read as a fallback; nothing is force-deleted). **`modes.rigor` — one question instead of six.** `minimal`, `standard` or `full` fronts six knobs: `modes.workflow`, `docs.density`, `qa.level`, `modes.story_granularity`, `modes.review_mode` and `team.size`. It defaults to `minimal`, which is a change from 1.0's behaviour: the heavier tier was measured costing several times more to reach working code without producing a better result, and returning nothing when a fresh developer inherited the project. Pin `modes.rigor: standard` to keep 1.0's process level. Also in this release: - `/settings` to view or change any setting, and `project.local.yaml` for per-developer preferences that should not be committed. - `system_overrides` to hold one system to a higher standard than the rest of the project, and `testing.strict` to set per test type whether missing evidence blocks a story or warns. - A story that changes anything the player sees is not closed until the game has been launched, observed, and a screenshot retained in `production/qa/evidence/`. A parse check is not a run. This holds at every rigor level, including `minimal`, where automated tests are waived but the look is not. - The code root is engine-specific and enforced as such: Godot `src/`, Unity `Assets/`, Unreal `Source/<Module>/`. Two of the three will not build a project laid out any other way. - Migration tooling for existing projects: `.claude/scripts/migrate-v1-config.sh` converts a 1.0 layout, non-destructively by default, with a report to review before `--finalize` deletes anything. - Ask-before-write holds regardless of personal automation settings. Upgrading from 1.0 or earlier: see UPGRADING.md. Full list of changes: CHANGELOG.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016xvzG3i7pWQg4LjyDwWMXd
This commit is contained in:
co-authored by
Claude Opus 5
parent
984023ddac
commit
d05699707f
+123
-26
@@ -1,11 +1,10 @@
|
||||
---
|
||||
name: team-qa
|
||||
description: "Orchestrate the QA team through a full testing cycle. Coordinates qa-lead (strategy + test plan) and qa-tester (test case writing + bug reporting) to produce a complete QA package for a sprint or feature. Covers: test plan generation, test case writing, smoke check gate, manual QA execution, and sign-off report."
|
||||
description: "Orchestrate the QA team through a full testing cycle — qa-lead strategy and test plan, qa-tester case writing, execution, sign-off."
|
||||
argument-hint: "[sprint | feature: system-name] [--review full|lean|solo]"
|
||||
user-invocable: true
|
||||
allowed-tools: Read, Glob, Grep, Write, Task, AskUserQuestion
|
||||
allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion
|
||||
model: sonnet
|
||||
agent: qa-lead
|
||||
---
|
||||
|
||||
When this skill is invoked, orchestrate the QA team through a structured testing cycle.
|
||||
@@ -13,20 +12,58 @@ When this skill is invoked, orchestrate the QA team through a structured testing
|
||||
**Decision Points:** At each phase transition, use `AskUserQuestion` to present
|
||||
the user with the subagent's proposals as selectable options. Write the agent's
|
||||
full analysis in conversation, then capture the decision with concise labels.
|
||||
The user must approve before moving to the next phase.
|
||||
In `collaborative` mode, the user must approve before moving to the next phase.
|
||||
In `guided` mode the pipeline advances automatically unless a phase is BLOCKED;
|
||||
in `autonomous` mode it runs end to end, recording each phase outcome via
|
||||
`log_decision`. Decisions in `automation_always_ask` categories
|
||||
(`is_always_ask_category` helper) always prompt regardless of mode. See
|
||||
`.claude/docs/automation-modes.md`.
|
||||
|
||||
## Phase 0: Resolve Review Mode
|
||||
## Phase 0: Resolve Config
|
||||
|
||||
1. If `--review [mode]` was passed as an argument, use that mode.
|
||||
2. Else read `production/review-mode.txt` — use whatever is written there.
|
||||
3. Else default to `lean`.
|
||||
!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size`
|
||||
|
||||
Modes:
|
||||
Resolved above — use as-is; `--review` overrides `review_mode`. No block →
|
||||
defaults in `.claude/docs/config-resolution.md`.
|
||||
|
||||
`review_mode` sets gate depth:
|
||||
- `full` — spawn all director and lead gates as described
|
||||
- `lean` — skip director gates unless they are PHASE-GATE type (CD-PHASE-GATE, TD-PHASE-GATE, PR-PHASE-GATE, AD-PHASE-GATE)
|
||||
- `solo` — skip all director gate spawning entirely; run the skill without any agent gates
|
||||
|
||||
Store the resolved mode for use in all subsequent phases.
|
||||
`automation` drives the Decision Points note above. See the Decision Points note above and
|
||||
`.claude/docs/automation-modes.md` for how each mode changes pipeline behavior.
|
||||
|
||||
**`team.size`**: which agents are active (orthogonal to review_mode gate-depth and workflow docs).
|
||||
- **`individual`** (default): `qa-tester` only; `qa-lead` invoked at phase gates only.
|
||||
- **`small`**: `qa-lead` + `qa-tester` pipeline (as documented).
|
||||
- **`studio`**: `qa-lead` + per-story `qa-tester` spawn + sign-off.
|
||||
Directors (CD/TD/PR) still spawn at phase gates regardless of size; a non-core agent needed at `individual` routes through the nearest active core agent with an informational note. **"Phase gate" means any phase that ends in an `AskUserQuestion` decision point before the pipeline advances** — not every phase. Apply the test literally: if the phase below has no decision point, it is not a gate, and an agent restricted to "phase gates only" is not spawned for it. This active-set scoping applies throughout the pipeline below: any phase that names an agent outside the active set routes through the nearest core agent rather than spawning it.
|
||||
|
||||
**Announce the active set before Phase 1 — never let the collapse be silent.**
|
||||
Before spawning anything, state in one line which agents this run will actually
|
||||
spawn, and which the pipeline below names but will **not** spawn at the resolved
|
||||
`team.size`. For example:
|
||||
|
||||
> `Active set (team.size: <resolved>): <the agents listed for that size above>.`
|
||||
> `Not spawned this run: <every other agent this pipeline names> — consulted`
|
||||
> `through <nearest active core agent>. Raise team.size (or modes.rigor) to widen.`
|
||||
|
||||
Fill it from the `team.size` list directly above and the agents this file's own
|
||||
pipeline names — not from an example. Both sets differ per orchestrator.
|
||||
|
||||
The pipeline below reads as a multi-agent fan-out and at the shipped default it
|
||||
is one or two agents — `team-release` names eight and runs one, `team-narrative`
|
||||
names six across five phases and runs `writer` alone. **The collapse is correct**:
|
||||
`team.size` is rigor-fronted and the narrow default is the token lever, measured
|
||||
at roughly 10x. What was wrong is that nothing said so, so a reader could not
|
||||
distinguish a correctly-collapsed run from a broken pipeline, and the per-agent
|
||||
"routes through the nearest core agent with an informational note" rule above
|
||||
fires at routing time and never states the shape of the run as a whole.
|
||||
|
||||
This is the same rule as the skipped-check reporting elsewhere in this file: **a constraint that is enforced but never surfaced is
|
||||
indistinguishable, to the person reading the output, from one that was never
|
||||
enforced.**
|
||||
|
||||
## Team Composition
|
||||
|
||||
@@ -35,11 +72,17 @@ Store the resolved mode for use in all subsequent phases.
|
||||
|
||||
## How to Delegate
|
||||
|
||||
Use the Task tool to spawn each team member as a subagent:
|
||||
Use the `Agent` tool to spawn each team member as a subagent:
|
||||
- `subagent_type: qa-lead` — Strategy, planning, classification, sign-off
|
||||
- `subagent_type: qa-tester` — Test case writing and bug report writing
|
||||
|
||||
Always provide full context in each agent's prompt (story file paths, QA plan path, scope constraints). Launch independent qa-tester tasks in parallel where possible (e.g., multiple stories in Phase 5 can be scaffolded simultaneously).
|
||||
**Brief each agent — do not dump context.** Read the shared inputs **once** and pass a distilled brief inline: the lines each agent actually needs, never a file path for a document you have already read (an agent handed a path re-reads the whole file). Pass a path only for a document you have not read and only that agent needs.
|
||||
|
||||
**End every agent prompt with a return contract:** "Write your full output to `[path]` — that named path is your write authorisation under the bounded exception below, so write it without a separate approval prompt. Return **only** (1) the path written, (2) a ≤5-bullet summary of decisions, (3) any BLOCKED/CONCERNS items, one line each. Do not restate the documents you read." Without it, an agent returns everything it read back into this session.
|
||||
|
||||
> **Why this does not violate the Collaboration Protocol.** `CLAUDE.md` requires an agent to ask "May I write this to [filepath]?" before Write/Edit. A subagent spawned here writes **without** asking, and that is a deliberate, bounded exception rather than an oversight — the same call already made for `consistency-check` appending to `active.md`. The exception holds only when all three are true: (1) the path is one **you** named in the prompt, so the user approved the destination when they approved the phase; (2) it is a new artifact under `production/`, `docs/` or `tests/`, never an edit to existing source or config; (3) the phase that produced it is itself gated by an `AskUserQuestion` before the pipeline advances. Outside those three, the agent must ask. **Do not "fix" this by asking per subagent** — a prompt per agent per phase makes an orchestrator unusable, which is why the exception exists.
|
||||
|
||||
Launch independent qa-tester tasks in parallel where possible (e.g., multiple stories in Phase 5 can be scaffolded simultaneously).
|
||||
|
||||
## Pipeline
|
||||
|
||||
@@ -52,14 +95,14 @@ Before doing anything else, gather the full scope:
|
||||
- If argument is `feature: [system-name]`: glob story files tagged for that system
|
||||
- If no argument: read `production/session-state/active.md` and `production/sprint-status.yaml` (if present) to infer the active sprint
|
||||
|
||||
2. Read `production/stage.txt` to confirm the current project phase.
|
||||
2. Read `project.stage` from `project.yaml` (fallback `production/stage.txt`) to confirm the current project phase.
|
||||
|
||||
3. Count stories found and report to the user:
|
||||
> "QA cycle starting for [sprint/feature]. Found [N] stories. Current stage: [stage]. Ready to begin QA strategy?"
|
||||
|
||||
### Phase 2: QA Strategy (qa-lead)
|
||||
|
||||
Spawn `qa-lead` via Task to review all in-scope stories and produce a QA strategy.
|
||||
Spawn `qa-lead` via `Agent` to review all in-scope stories and produce a QA strategy.
|
||||
|
||||
Prompt the qa-lead to:
|
||||
- Read each story file
|
||||
@@ -117,11 +160,20 @@ Write only after receiving approval.
|
||||
|
||||
For each story requiring manual QA (Visual/Feel, UI, Integration without automated tests):
|
||||
|
||||
Spawn `qa-tester` via Task for each story (run in parallel where possible), providing:
|
||||
Spawn `qa-tester` via `Agent` for each story (run in parallel where possible), providing:
|
||||
- The story file path
|
||||
- The relevant section of the QA plan for that story
|
||||
- The GDD acceptance criteria for the system being tested (if available)
|
||||
- Instructions to write detailed test cases covering all acceptance criteria
|
||||
- **The output path: `production/qa/test-cases/[story-slug]-cases.md`.** Name it
|
||||
explicitly in the prompt, one per story.
|
||||
|
||||
> **Why the path is stated here rather than left to the orchestrator.** The
|
||||
> bounded write exception above holds only when "the path is one **you** named in
|
||||
> the prompt". This is the phase that spawns agents *in parallel*, so it is where
|
||||
> an unnamed destination does the most damage: each agent improvises its own, and
|
||||
> two runs file the same artifact in two places. The phase reads correctly right
|
||||
> up until two agents need somewhere to put their output.
|
||||
|
||||
Each test case set should include:
|
||||
- **Preconditions**: game state required before testing begins
|
||||
@@ -157,7 +209,28 @@ options:
|
||||
- "BLOCKED — cannot test yet (reason)"
|
||||
```
|
||||
|
||||
After each FAIL result: use `AskUserQuestion` to collect the failure description, then spawn `qa-tester` via Task to write a formal bug report in `production/qa/bugs/`.
|
||||
After each FAIL result: use `AskUserQuestion` to collect the failure description, then spawn `qa-tester` via `Agent` to write a formal bug report in `production/qa/bugs/`.
|
||||
|
||||
**After each PASS or PASS WITH NOTES on a Visual/Feel or UI story, write the
|
||||
evidence artifact** to `production/qa/evidence/[story-slug]-evidence.md`, from
|
||||
`.claude/docs/templates/test-evidence.md`, carrying the sign-off table intact.
|
||||
Save the screenshot you took while testing into the same directory and reference
|
||||
it from the doc — `/story-done` checks for a retained image, not just the
|
||||
write-up.
|
||||
|
||||
> **This is not optional bookkeeping — it is the artifact the next skill gates
|
||||
> on.** `/story-done` globs `production/qa/evidence/` for Visual/Feel and UI
|
||||
> stories and reads the sign-off table; `/story-readiness`,
|
||||
> `/test-evidence-review` and `gate-release` read the same directory. Write
|
||||
> anywhere else and a story can pass a full manual QA cycle here, then be told by
|
||||
> `/story-done` that no visual evidence exists. Visual/Feel and UI gates are
|
||||
> **BLOCKING by default**, so that is a deadlock — QA passed, story cannot
|
||||
> close. It is a merely confusing flag only where `testing.strict.ui` or
|
||||
> `.visual` has been explicitly set to `false`.
|
||||
>
|
||||
> Leave the sign-off rows **unchecked** unless the sign-off actually happened in
|
||||
> this session. An evidence file with pre-ticked approvals is worse than none: it
|
||||
> converts a missing signature into a recorded one.
|
||||
|
||||
Bug report naming: `BUG-[NNN]-[short-slug].md` (increment NNN from existing bugs in the directory).
|
||||
|
||||
@@ -169,7 +242,7 @@ After collecting all results, summarize:
|
||||
|
||||
### Phase 6: QA Sign-Off Report
|
||||
|
||||
Spawn `qa-lead` via Task to produce the sign-off report using all results from Phases 4–6.
|
||||
Spawn `qa-lead` via `Agent` to produce the sign-off report using all results from Phases 4–6.
|
||||
|
||||
The sign-off report format:
|
||||
|
||||
@@ -188,7 +261,7 @@ The sign-off report format:
|
||||
|----|-------|----------|--------|
|
||||
| BUG-001 | [story] | S2 | Open |
|
||||
|
||||
### Verdict: APPROVED / APPROVED WITH CONDITIONS / NOT APPROVED
|
||||
### Verdict: NOT ASSESSED / APPROVED / APPROVED WITH CONDITIONS / NOT APPROVED
|
||||
|
||||
**Conditions** (if any): [list what must be fixed before the build advances]
|
||||
|
||||
@@ -197,11 +270,33 @@ The sign-off report format:
|
||||
```
|
||||
|
||||
Verdict rules:
|
||||
|
||||
**Precondition, checked first.** APPROVED and APPROVED WITH CONDITIONS both
|
||||
require that **every story in scope produced executed evidence** — a test that
|
||||
ran, or a manual case that was walked. If any story is BLOCKED, unexecuted, or
|
||||
has no evidence, the verdict is **NOT ASSESSED** and the other three rules are
|
||||
not evaluated.
|
||||
|
||||
- **NOT ASSESSED — NO EVIDENCE**: One or more stories produced no executed
|
||||
evidence (BLOCKED, tests not written, cases not walked, or smoke check FAIL /
|
||||
UNKNOWN). This is **not** a pass and **not** a fail; it means QA did not
|
||||
happen. Say which stories and why.
|
||||
- **APPROVED**: All stories PASS or PASS WITH NOTES; no S1/S2 bugs open
|
||||
- **APPROVED WITH CONDITIONS**: S3/S4 bugs open, or PASS WITH NOTES issues documented; no S1/S2 bugs
|
||||
- **NOT APPROVED**: Any S1/S2 bugs open; or stories FAIL without documented workaround
|
||||
|
||||
> **Why the precondition exists.** The three rules below it assume
|
||||
> every story resolves to PASS or FAIL. A sprint where nothing was executed
|
||||
> trips none of the NOT APPROVED conditions and **vacuously satisfies "no S1/S2
|
||||
> bugs open"** — because zero executed tests means zero observed failures. Read
|
||||
> literally, and without this precondition, the rules let a completely untested
|
||||
> build reach APPROVED — a `qa-lead` reaching NOT APPROVED on intent would find
|
||||
> the letter of the rules did not support it. A
|
||||
> sign-off asserts verified quality; without this precondition the rules cannot
|
||||
> tell "verified good" from "never looked".
|
||||
|
||||
Next step guidance by verdict:
|
||||
- NOT ASSESSED: "QA did not run to completion. Produce the missing evidence — write the Logic tests, walk the manual cases, run `/smoke-check` — then re-run `/team-qa`. Do not advance the build on this verdict."
|
||||
- APPROVED: "Build is ready for the next phase. Run `/gate-check` to validate advancement."
|
||||
- APPROVED WITH CONDITIONS: "Resolve conditions before advancing. S3/S4 bugs may be deferred to polish."
|
||||
- NOT APPROVED: "Resolve S1/S2 bugs and re-run `/team-qa` or targeted manual QA before advancing."
|
||||
@@ -212,15 +307,17 @@ Write only after receiving approval.
|
||||
|
||||
## Error Recovery Protocol
|
||||
|
||||
If any spawned agent (via Task) returns BLOCKED, errors, or cannot complete:
|
||||
**First, verify the artifact.** If the return contract named a path, check the
|
||||
path exists before treating the phase as done — **a named artifact that is not
|
||||
on disk is a failed phase, however fluent the response reads.** An agent can
|
||||
burn a full phase and return a plausible preamble having written nothing, which
|
||||
is neither BLOCKED nor an error nor "cannot complete", so the trigger below
|
||||
never fires. Resume it naming the unmet contract; the context is
|
||||
usually still there.
|
||||
|
||||
1. **Surface immediately**: Report "[AgentName]: BLOCKED — [reason]" to the user before continuing to dependent phases
|
||||
2. **Assess dependencies**: Check whether the blocked agent's output is required by subsequent phases. If yes, do not proceed past that dependency point without user input.
|
||||
3. **Offer options** via AskUserQuestion with choices:
|
||||
- Skip this agent and note the gap in the final report
|
||||
- Retry with narrower scope
|
||||
- Stop here and resolve the blocker first
|
||||
4. **Always produce a partial report** — output whatever was completed. Never discard work because one agent blocked.
|
||||
If any spawned agent returns BLOCKED, errors, or cannot complete: **surface it
|
||||
immediately, don't proceed past a dependency it blocks, and always produce a
|
||||
partial report.** Full procedure: `.claude/docs/error-recovery-protocol.md`.
|
||||
|
||||
Common blockers:
|
||||
- Input file missing (story not found, GDD absent) → redirect to the skill that creates it
|
||||
|
||||
Reference in New Issue
Block a user