Files
DonchitosandClaude Opus 5.5 be8993bbc5 Release 1.1.3 — long skills keep their later steps
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
2026-10-08 17:52:48 +11:00

4.2 KiB
Raw Permalink Blame History

/dev-story — Phase 5: Test Evidence Requirements

Part of /dev-story. SKILL.md names 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:

  1. Map the Story Type to a testing.strict key — Logic→logic, Integration→integration, Visual/Feel→visual, UI→ui, Config/Data→config. Take testing.strict.<key> from the the resolved-config block at the top of this skill, not from project.yaml directly. If its value is true (case-insensitive) → BLOCKING; if false → ADVISORY; unset → fall through.

testing.strict.* is locally overridable (/settings --local testing.strict.logic=false). Reading project.yaml on its own ignores project.local.yaml entirely, so the override is accepted and then does nothing. resolve_config merges the two.

  1. Else read testing.strict as a plain boolean (legacy single-value form) — if its value is true or false, it applies to every type.
  2. 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.