You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: bug extension: README uses dotted command names, and re-assessing a bug leaves the old fix and test reports in place #5036
README commands don't match the installed skills.extensions/bug/README.md documents the commands as speckit.bug.assess, speckit.bug.fix and speckit.bug.test, and its example (line 59) is /speckit.bug.assess "TypeError: ...". Skills-based integrations install them as speckit-bug-assess etc. (invoked as /speckit-bug-assess in Claude Code and $speckit-bug-assess in Codex), so the documented invocation doesn't work there.
Overwriting an assessment leaves stale fix and test reports.speckit.bug.assess.md line 36 asks before overwriting an existing assessment.md but says nothing about the fix.md and test.md already in that bug directory. speckit.bug.test.md (lines 36-41) then reads assessment.md and fix.md together, so after a re-assessment it validates the old fix against the new assessment.
Steps to Reproduce
Install the bug extension with a skills-based integration (e.g. claude or codex).
Compare .specify/extensions/bug/README.md (line 59) with the installed skill names under .claude/skills/ or .agents/skills/.
For the second problem: run speckit-bug-assess, speckit-bug-fix and speckit-bug-test for a slug; then run speckit-bug-assess again for the same slug and confirm the overwrite; then run speckit-bug-test.
Expected Behavior
The README shows the invocation for each supported integration, or at least the hyphenated skill names.
Re-assessing a bug that already has fix.md / test.md either asks whether to discard them or marks them stale, and speckit-bug-test refuses to validate a fix.md older than the current assessment.md.
Actual Behavior
The README only shows /speckit.bug.*.
The overwrite prompt covers assessment.md only; fix.md and test.md stay, and speckit-bug-test uses them as current.
Specify CLI Version
1.2.2 (bug extension 1.0.1)
AI Agent
Claude Code and Codex CLI
Operating System
macOS 26 (Darwin 25.6.0), arm64
Python Version
Python 3.15.0
Error Logs
(none)
Additional Context
The / prefix shown in Codex skills' hook "To execute" lines is a separate, already-tracked problem: #4954. This issue is only about the README text and the re-assessment flow. Both findings are from reading the extension source at the lines cited; the second has not been run end to end.
AI Disclosure
Both findings were first raised by Sourcery's automated PR review on a downstream project. Claude Code (Claude Opus 5.5, human-supervised) checked them against the extension source and drafted this issue; I reviewed it before filing.
The reporter identifies two related defects in the bundled bug extension v1.0.1 (Specify CLI 1.2.2): the README shows dotted invocations such as /speckit.bug.assess, while skills-based integrations install and invoke hyphenated skill names such as speckit-bug-assess; and reassessing an existing bug can replace assessment.md without invalidating already-generated fix.md and test.md. The latter allows the test stage to read a new assessment together with an old fix. The report cites Claude Code and Codex CLI on macOS and notes that the stale-report scenario was inspected in source rather than run end to end.
Symptom
Skills-based users following the README may invoke a command name that is not present in their installed integration. Separately, after an interactive reassessment overwrites assessment.md, the existing fix.md and test.md remain and speckit.bug.test reads the new assessment with the old fix, so its validation can no longer be trusted as validation of the current assessment.
Reproduction
Install the bug extension with a skills-based integration such as Claude Code or Codex.
Compare the README examples in extensions/bug/README.md with the generated skill names; the README uses /speckit.bug.*, while skills use hyphenated names such as /speckit-bug-assess or $speckit-bug-assess.
Run assessment, fix, and test for one bug slug.
Run assessment again for the same slug and confirm overwriting the existing assessment.
Run the test command for that slug and observe that it reads the newly written assessment.md and the pre-existing fix.md together.
The first mismatch is directly grounded in the repository. The stale-report path is also directly specified by the command templates, but the issue's end-to-end execution of steps 3–5 is [NEEDS CLARIFICATION: not independently reproduced in this assessment].
Suspected Code Paths
extensions/bug/README.md:26-28 — documents the canonical command IDs as the only command forms, without the integration-specific hyphenated skill invocations.
extensions/bug/README.md:59-68 — all three usage examples use dotted slash commands (/speckit.bug.assess, /speckit.bug.fix, /speckit.bug.test).
extensions/bug/extension.yml:17-24 — registers the canonical dotted command IDs. These IDs are valid extension identifiers, but skills integrations derive names by replacing dots with hyphens rather than preserving the dotted spelling.
src/specify_cli/integrations/base.py:1753-1754,1863 — the shared skills integration renders invocation/skill names as speckit- plus the command stem with dots replaced by hyphens.
extensions/bug/commands/speckit.bug.assess.md:36 — the overwrite guard addresses only BUG_DIR/assessment.md; it does not discard, mark, or otherwise invalidate fix.md or test.md when reassessment is confirmed.
extensions/bug/commands/speckit.bug.test.md:36-41 — test prerequisites require both reports and explicitly read assessment.md and fix.md, with no freshness or provenance check between them.
extensions/bug/commands/speckit.bug.fix.md:37-38 — fix generation similarly treats the assessment as the contract but does not provide a mechanism for an assessment overwrite to invalidate an existing fix.
Root Cause Hypothesis
Confidence: high. The README treats the canonical extension command ID (speckit.bug.*) as a universal invocation syntax, although skills integrations intentionally transform that ID to speckit-bug-* and use integration-specific prefixes. Independently, the assessment command's overwrite contract is scoped to assessment.md, while the test command accepts any existing fix.md in the directory and has no generation, timestamp, or content linkage check. Consequently, reassessment can change the contract without changing the downstream artifacts that consume it.
Proposed Remediation
Preferred: Update extensions/bug/README.md to distinguish canonical command IDs from invocation syntax, and show the supported forms for dot-command integrations, hyphen/slash skills integrations, and Codex-style $speckit-bug-* skills where applicable. Keep the dotted IDs in extension.yml; the issue is documentation, not a need to rename the registered commands.
Make reassessment invalidate dependent artifacts as one explicit workflow decision. When an existing assessment is overwritten after confirmation, require the user to discard (or explicitly retain as archived evidence) fix.md and test.md; the safest default is to remove or move them before writing the new assessment and state that a new fix/test cycle is required. Also add a defensive check in the test command so it refuses to validate when the fix is not associated with the current assessment (for example, by requiring a recorded assessment fingerprint/generation in the reports). This prevents stale validation even if artifacts were copied or retained outside the normal reassessment path.
Alternatives (optional):
Preserve all reports but write generation metadata into each report and have speckit.bug.test require matching assessment and fix generations. This retains history but adds report-format and migration complexity.
On reassessment, automatically choose a new slug rather than overwrite the existing bug directory. This is safest for immutability but makes deliberate iterative reassessment less convenient and diverges from the interactive overwrite behavior described by the command.
Files likely to change:
extensions/bug/README.md
extensions/bug/commands/speckit.bug.assess.md
extensions/bug/commands/speckit.bug.test.md
extensions/bug/commands/speckit.bug.fix.md (if report linkage or stale-artifact guidance is added there)
Relevant extension/template tests covering README content and reassessment behavior
Tests to add or update:
Verify generated README examples/documentation cover the invocation forms emitted by Claude/Codex and other skills-based integrations.
Verify reassessment with an existing fix.md and test.md requires discard/archive handling and does not leave them usable as current reports.
Verify speckit.bug.test rejects a fix tied to an older assessment and accepts matching assessment/fix metadata.
Verify the existing non-overwrite behavior remains intact in automated mode and for unconfirmed interactive overwrites.
Risks & Considerations
Deleting dependent reports can lose useful history; archiving or clearly retaining them as stale artifacts is safer if history matters.
Adding report linkage changes the Markdown contract and must account for existing bug directories that lack metadata; those should fail clearly and instruct the user to rerun the fix rather than silently pass.
README examples should reflect each integration's actual prefix and syntax without implying that every integration supports every form.
This is a workflow-integrity issue rather than a source-code execution or data-security issue, but false-positive verification can cause maintainers to believe an unvalidated fix satisfies a newer assessment.
Open Questions
[NEEDS CLARIFICATION: Should reassessment archive stale fix.md/test.md, delete them, or preserve them with an explicit stale marker?]
[NEEDS CLARIFICATION: Which complete set of integration invocation forms should the README document, beyond Claude Code and Codex?]
[NEEDS CLARIFICATION: Should report freshness use a generated assessment ID/fingerprint, or should reassessment always force a new slug?]
Activity
github-actions commentedon Oct 20, 2026
Bug assessment — bug-extension-reassessment: Valid · severity medium
Bug Assessment: Bug extension command names and stale reports after reassessment
Report (summarized)
The reporter identifies two related defects in the bundled
bugextension v1.0.1 (Specify CLI 1.2.2): the README shows dotted invocations such as/speckit.bug.assess, while skills-based integrations install and invoke hyphenated skill names such asspeckit-bug-assess; and reassessing an existing bug can replaceassessment.mdwithout invalidating already-generatedfix.mdandtest.md. The latter allows the test stage to read a new assessment together with an old fix. The report cites Claude Code and Codex CLI on macOS and notes that the stale-report scenario was inspected in source rather than run end to end.Symptom
Skills-based users following the README may invoke a command name that is not present in their installed integration. Separately, after an interactive reassessment overwrites
assessment.md, the existingfix.mdandtest.mdremain andspeckit.bug.testreads the new assessment with the old fix, so its validation can no longer be trusted as validation of the current assessment.Reproduction
bugextension with a skills-based integration such as Claude Code or Codex.extensions/bug/README.mdwith the generated skill names; the README uses/speckit.bug.*, while skills use hyphenated names such as/speckit-bug-assessor$speckit-bug-assess.assessment.mdand the pre-existingfix.mdtogether.The first mismatch is directly grounded in the repository. The stale-report path is also directly specified by the command templates, but the issue's end-to-end execution of steps 3–5 is [NEEDS CLARIFICATION: not independently reproduced in this assessment].
Suspected Code Paths
extensions/bug/README.md:26-28— documents the canonical command IDs as the only command forms, without the integration-specific hyphenated skill invocations.extensions/bug/README.md:59-68— all three usage examples use dotted slash commands (/speckit.bug.assess,/speckit.bug.fix,/speckit.bug.test).extensions/bug/extension.yml:17-24— registers the canonical dotted command IDs. These IDs are valid extension identifiers, but skills integrations derive names by replacing dots with hyphens rather than preserving the dotted spelling.src/specify_cli/integrations/base.py:1753-1754,1863— the shared skills integration renders invocation/skill names asspeckit-plus the command stem with dots replaced by hyphens.src/specify_cli/extensions/__init__.py:1438,5661— extension command skill naming likewise maps dotted command IDs tospeckit-<dotted-name-with-hyphens>.extensions/bug/commands/speckit.bug.assess.md:36— the overwrite guard addresses onlyBUG_DIR/assessment.md; it does not discard, mark, or otherwise invalidatefix.mdortest.mdwhen reassessment is confirmed.extensions/bug/commands/speckit.bug.test.md:36-41— test prerequisites require both reports and explicitly readassessment.mdandfix.md, with no freshness or provenance check between them.extensions/bug/commands/speckit.bug.fix.md:37-38— fix generation similarly treats the assessment as the contract but does not provide a mechanism for an assessment overwrite to invalidate an existing fix.Root Cause Hypothesis
Confidence: high. The README treats the canonical extension command ID (
speckit.bug.*) as a universal invocation syntax, although skills integrations intentionally transform that ID tospeckit-bug-*and use integration-specific prefixes. Independently, the assessment command's overwrite contract is scoped toassessment.md, while the test command accepts any existingfix.mdin the directory and has no generation, timestamp, or content linkage check. Consequently, reassessment can change the contract without changing the downstream artifacts that consume it.Proposed Remediation
Preferred: Update
extensions/bug/README.mdto distinguish canonical command IDs from invocation syntax, and show the supported forms for dot-command integrations, hyphen/slash skills integrations, and Codex-style$speckit-bug-*skills where applicable. Keep the dotted IDs inextension.yml; the issue is documentation, not a need to rename the registered commands.Make reassessment invalidate dependent artifacts as one explicit workflow decision. When an existing assessment is overwritten after confirmation, require the user to discard (or explicitly retain as archived evidence)
fix.mdandtest.md; the safest default is to remove or move them before writing the new assessment and state that a new fix/test cycle is required. Also add a defensive check in the test command so it refuses to validate when the fix is not associated with the current assessment (for example, by requiring a recorded assessment fingerprint/generation in the reports). This prevents stale validation even if artifacts were copied or retained outside the normal reassessment path.Alternatives (optional):
speckit.bug.testrequire matching assessment and fix generations. This retains history but adds report-format and migration complexity.Files likely to change:
extensions/bug/README.mdextensions/bug/commands/speckit.bug.assess.mdextensions/bug/commands/speckit.bug.test.mdextensions/bug/commands/speckit.bug.fix.md(if report linkage or stale-artifact guidance is added there)Tests to add or update:
fix.mdandtest.mdrequires discard/archive handling and does not leave them usable as current reports.speckit.bug.testrejects a fix tied to an older assessment and accepts matching assessment/fix metadata.Risks & Considerations
Open Questions
fix.md/test.md, delete them, or preserve them with an explicit stale marker?]