| name | speckit-bug-test |
| description | Validate that a previously fixed bug is resolved and record the verification report |
| compatibility | Requires spec-kit project structure with .specify/ directory |
| metadata | {"author":"github-spec-kit","source":"bug:commands/speckit.bug.test.md"} |
Test Bug Fix
Validate that the fix recorded by /speckit-bug-fix actually resolves the bug described by /speckit-bug-assess. The output is a verification report at .specify/bugs/<slug>/test.md.
User Input
$ARGUMENTS
The user input should identify the bug to validate. Accept any of:
slug=<bug-slug> or --slug <bug-slug> or a bare slug-like token.
- A path that contains the slug (e.g.
.specify/bugs/login-timeout/).
- Nothing — fall back to context (see below).
Slug Resolution
Resolve BUG_SLUG in this order, stopping at the first match:
- Explicit user input — a slug passed in
$ARGUMENTS (any of the forms above).
- Conversation context — if the current session has just run
/speckit-bug-assess or /speckit-bug-fix, the slug it reported is the working slug. Reuse it without re-prompting. Confirm it by checking that .specify/bugs/<slug>/fix.md exists; if it does not, fall through.
- Single candidate on disk — list
.specify/bugs/*/fix.md. If exactly one bug has a fix.md, use it.
- Disambiguate:
- Interactive mode: ask the user which bug to validate and list the candidates.
- Automated mode: stop with an error listing the candidates. Do not guess.
Once resolved, set BUG_SLUG and BUG_DIR = .specify/bugs/<BUG_SLUG>, and briefly state in your reply which resolution path was used (explicit / from context / single candidate / asked).
Prerequisites
BUG_DIR/assessment.md MUST exist.
BUG_DIR/fix.md MUST exist. If not, stop and instruct the user to run /speckit-bug-fix first.
- If
BUG_DIR/test.md already exists, ask the user whether to overwrite it (interactive mode) or refuse (automated mode).
- Read both
assessment.md and fix.md in full so you know:
- The original symptom and reproduction steps (from
assessment.md).
- The actual code changes and tests added (from
fix.md).
Execution
-
Plan the validation
- Decide which checks prove the bug is gone:
- Re-run the reproduction steps from the assessment (or their automated equivalent).
- Run the tests added or updated in the fix.
- Run any broader regression suite that touches the changed files.
- Decide which checks prove nothing was broken:
- Existing test suites for the changed modules.
- Lint / type-check if the project uses them.
-
Run the checks
- Execute each planned check. Capture command, exit status, and a short excerpt of relevant output (last few lines, or the failing assertion).
- If a check is destructive, network-dependent, or expensive, skip it and record it as
skipped with a reason; do not run it without explicit user consent.
- If you cannot run a check at all (missing tooling, no test framework configured), record it as
not-run with a reason instead of fabricating a result.
-
Judge the outcome
- Mark the fix as:
- verified — all critical checks pass and the original symptom no longer reproduces.
- partial — the original symptom is gone but unrelated regressions appeared, or some checks are inconclusive.
- failed — the symptom still reproduces or the regression suite is broken by the fix.
- Do not over-claim. If reproduction was not actually performed (e.g., the bug required a production environment), say so explicitly.
-
Write the verification report
Write to BUG_DIR/test.md using this structure:
# Bug Verification: <short title>
- **Slug**: <BUG_SLUG>
- **Tested**: <ISO 8601 date>
- **Assessment**: ./assessment.md
- **Fix**: ./fix.md
- **Result**: verified | partial | failed
## Summary
<One or two sentences: does the bug reproduce, did the fix hold, were any regressions found.>
## Checks Performed
| Check | Command / Action | Result | Notes |
|-------|------------------|--------|-------|
| Reproduction (post-fix) | <command or manual steps> | pass / fail / skipped / not-run | <short note> |
| New / updated tests | `<command>` | pass / fail | <short note> |
| Regression suite | `<command>` | pass / fail / skipped | <short note> |
| Lint / type-check | `<command>` | pass / fail / skipped | <short note> |
## Output Excerpts
<Short snippets of relevant output (e.g., final summary line of a test run, the failing assertion). Keep it tight — no full logs.>
## Residual Risks
- <known limitation, environment not covered, etc.>
## Recommendation
<One paragraph. Examples:>
- "Close the bug — verified end-to-end."
- "Hold — reproduction inconclusive; needs verification in staging."
- "Reopen — symptom still reproduces; rerun `/speckit-bug-assess`."
-
Report back with:
- The slug and
BUG_DIR/test.md path.
- The result (
verified, partial, failed).
- If the result is
failed, recommend re-running /speckit-bug-assess with the new evidence captured in test.md.
Guardrails
- This command MUST NOT modify source code. It only runs checks and writes inside
.specify/bugs/<slug>/.
- Never overwrite an existing
test.md without confirmation.
- Never mark a fix as
verified based on tests alone if the original assessment listed a reproduction that you did not actually exercise — downgrade to partial and say so.