Fix release for 1.1.2: the 14 longest skills keep their later phases after a compaction, a question nobody answered is never taken as an answer, settings read the same from a subfolder, the commit check works for a project in a subfolder of a larger repository, every skill opens with a title, and the shipped allow rules no longer approve deleting a branch or writing files without asking. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.2 → v1.1.3). Refs #83 Refs #133 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0185en4t76fPn7315q4c3nko
4.2 KiB
/dev-story — Phase 5: Test Evidence Requirements
Part of
/dev-story.SKILL.mdnames when to read this file; the settings it resolved and the rules under its later headings still apply here.
Phase 5: Test Evidence Requirements
The test requirement was included in the Phase 4 programmer agent brief (item 7). This phase summarizes what evidence each story type requires — used when collecting the Phase 6 summary.
Skip this phase at qa.level: minimal (resolved earlier) — no test evidence
is required, so there is nothing to gate; do not flag the story unverifiable for a
missing test. The Visual/Feel and UI screenshot line at the end of this phase
still applies — qa.level waives tests, never the look.
Say so in the Phase 6 summary. A skipped phase must announce itself in the output, not only in this file (
.claude/rules/skill-authoring.md, obligation 3). For a Logic or Integration story — the types Phase 4 item 7 briefs a test for — emit the line:Test evidence: waived at
qa.level: minimal— no test was required or written for this story.Without it, a minimal-tier summary that simply lacks a tests row is indistinguishable from a
standard-tier run where the programmer forgot to write them — and the permissive reading is the one that gets believed.
Otherwise:
Resolve the gate level for this story's type from testing.strict in
project.yaml. BLOCKING means a missing test marks the story unverifiable;
ADVISORY means a missing test is noted but does not block:
- Map the Story Type to a
testing.strictkey — Logic→logic, Integration→integration, Visual/Feel→visual, UI→ui, Config/Data→config. Taketesting.strict.<key>from the the resolved-config block at the top of this skill, not fromproject.yamldirectly. If its value istrue(case-insensitive) → BLOCKING; iffalse→ ADVISORY;unset→ fall through.
testing.strict.*is locally overridable (/settings --local testing.strict.logic=false). Readingproject.yamlon its own ignoresproject.local.yamlentirely, so the override is accepted and then does nothing.resolve_configmerges the two.
- Else read
testing.strictas a plain boolean (legacy single-value form) — if its value istrueorfalse, it applies to every type. - Else use the Default Gate Level column below.
Only true and false (case-insensitive) are recognized at steps 1–2. A key
that is present but holds any other value — maybe, 1, yes, etc. — is
treated as unset: continue to the next step, and surface the unrecognized value
to the user.
| Story Type | Required Evidence | Default Gate Level |
|---|---|---|
| Logic | Automated unit test at path from story's Test Evidence section | BLOCKING |
| Integration | Integration test OR documented playtest record | BLOCKING |
| Visual/Feel | Retained screenshot + evidence doc at production/qa/evidence/[slug]-evidence.md |
BLOCKING |
| UI | Retained screenshot of each screen touched, in production/qa/evidence/ |
BLOCKING |
| Config/Data | None — smoke check serves as evidence | ADVISORY |
The test is written alongside the implementation (Phase 4, item 7) regardless of
the gate level — strictness controls only how a missing test is reported in the
Phase 6 summary. At a BLOCKING level, a missing test is flagged "story
unverifiable — test required before /story-done". At an ADVISORY level it is
noted as a recommendation. The Default Gate Level column applies when
testing.strict is unset.
Visual/Feel and UI default to BLOCKING: for a game the rendered result is the
product, and an advisory visual gate gets deferred in favour of whatever does
block. A project that genuinely does not need it sets testing.strict.visual or
testing.strict.ui to false.
For Visual/Feel and UI stories, include in the Phase 6 summary: "Retained screenshot required under production/qa/evidence/[story-slug]/ before this story can be closed — at the default BLOCKING level a story with no screenshot on disk is unverifiable." For Visual/Feel, add that the sign-off in production/qa/evidence/[slug]-evidence.md is also required.