[Bug]: /speckit-taskstoissues dedup matches bare task IDs across features β valid tasks are silently skippedΒ #4271
Copy link
Copy link
Open
Labels
bug-assessseverity-hightriage-must-haveVerdict: high-value, important work for Spec Kit β do firstVerdict: high-value, important work for Spec Kit β do first
Description
Version
spec-kit v1.0.1 (.claude/skills/speckit-taskstoissues/SKILL.md, dedup step around the list_issues flow)
Description
Task IDs like T001 are local to one feature's tasks.md and restart from T001 in every feature. The dedup step, however, matches repository issues by task ID without scoping to the current feature: if feature 001-auth already produced an issue titled with T001, then running /speckit-taskstoissues for feature 002-billing sees "T001 exists" and skips creating the issue for billing's T001 β a silent gap in the tracker, in exactly the multi-feature repos this command targets.
This is the inverse of #2968 (which was about creating duplicates): the fix direction there makes the matching aggressive enough to now suppress valid tasks.
Expected behavior
- Include a stable feature identifier (the
NNN-namespec dir) in each created issue's title or a label, and require both the feature identity and the task ID to match before skipping. - Re-check for existing feature+task issues immediately before creation so two concurrent invocations don't race the fetch-then-create sequence.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bug-assessseverity-hightriage-must-haveVerdict: high-value, important work for Spec Kit β do firstVerdict: high-value, important work for Spec Kit β do first
Activity
fix(taskstoissues): scope issue dedup to the feature the tasks belong to
fix(taskstoissues): ask about a bare legacy title instead of guessing
github-actions commentedon Oct 15, 2026
Bug assessment β cross-feature-dedup: Valid Β· severity high
Bug Assessment: /speckit-taskstoissues dedup matches bare task IDs across features
Report (summarized)
The reporter states that task IDs such as
T001restart for every feature. The taskstoissues deduplication step searches repository issue titles by task ID alone, so an issue created forT001under one feature can suppress creation of the unrelatedT001under a later feature. The report requests feature-scoped matching and a final pre-create recheck for concurrent invocations. The issue identifies Spec Kit v1.0.1 and the Claude taskstoissues skill, and notes this is the inverse of #2968's duplicate-prevention change.Symptom
When two features both contain the same task ID, running taskstoissues for the second feature can report that the ID already has an issue and skip creating the second feature's issue. Expected behavior is to deduplicate only when both the feature identity and task ID identify the same task.
Reproduction
001-authwith atasks.mdcontainingT001, then run taskstoissues and create its issue.002-billingwith atasks.mdcontainingT001.002-billingagainst the same GitHub repository.T001issue from001-authis treated as a match and the billing task is skipped.The first two steps and the observed cross-feature setup are supported by the report. Exact command invocation and the task descriptions are [NEEDS CLARIFICATION: not provided in the issue].
Suspected Code Paths
extensions/github/commands/speckit.github.taskstoissues.md:67β instructs the agent to match issue titles using\bT\d{3,}\band mark a matching task ID as already having an issue, without requiring the feature directory identity.extensions/github/commands/speckit.github.taskstoissues.md:68β defines the canonical created title asT001: <description>, which contains no feature identifier and therefore cannot support feature-scoped deduplication.templates/commands/taskstoissues.md:75β the deprecated core command carries the same bare-ID matching rule.templates/commands/taskstoissues.md:76β the deprecated core command carries the same feature-less canonical title rule.tests/extensions/github/test_taskstoissues_deprecation.py:55-64β verifies that deduplication and safety instructions exist, but does not assert that matching is scoped to a feature.Root Cause Hypothesis
The deduplication key is defined as the task ID extracted from an issue title, even though task IDs are only unique within a feature's
tasks.md. The issue title format also omits the feature directory, so the command has no stable feature identity to compare. Confidence: high; the current checked-out command instructions explicitly implement both parts of this behavior.Proposed Remediation
Preferred: Include the active feature directory basename (the
NNN-namespec directory) in every newly created issue title, for example[002-billing] T001: Create project structure. During deduplication, parse both the feature identity and task ID, and skip only when both match the current feature. Preserve compatibility with pre-existing bareT001: ...issues by treating them as legacy matches only when no feature-prefixed issue for that task exists, or otherwise define a migration policy that avoids creating duplicates during upgrade. Apply the same wording to the bundled GitHub extension and the deprecated core template so generated integrations remain consistent.The concurrent fetch-then-create race should be addressed separately or in the same change with an explicit final check immediately before each create operation, subject to the available issue API semantics.
Files likely to change:
extensions/github/commands/speckit.github.taskstoissues.mdtemplates/commands/taskstoissues.mdtests/extensions/github/test_taskstoissues_deprecation.pyand/or a focused taskstoissues contract testTests to add or update:
T001; an issue for feature A must not suppress feature B.Risks & Considerations
T001as the task key.Open Questions
NNN-namedirectory basename, a normalized value, or a dedicated GitHub label?]