Version
spec-kit v1.0.1 (.specify/scripts/bash/create-new-feature.sh; the flow is also described in .claude/skills/speckit-specify/SKILL.md, "Create the directory and spec file")
Description
Sequential numbering scans existing specs/ directories, picks max+1, checks for existence, then uses mkdir -p and writes spec.md. Nothing in that sequence is atomic: two concurrent invocations (parallel agents on worktrees sharing a specs dir, or two terminals) can both scan, both select the same number, both pass the existence check (mkdir -p succeeds either way), and both write spec.md into the same directory — the second silently overwrites the first's starting specification.
This matters more now that multi-agent setups routinely run more than one spec-kit session against the same repository.
Expected behavior
Reserve the directory with plain mkdir (no -p) so creation is exclusive; on EEXIST, discard the selected number, rescan, and retry before writing spec.md. A lock file would also work.
Related
Prior sequential-numbering issues (#935, #975, #1332) covered scan-logic bugs in single-invocation scenarios; this one is specifically about the missing atomicity under concurrency.
Version
spec-kit v1.0.1 (
.specify/scripts/bash/create-new-feature.sh; the flow is also described in.claude/skills/speckit-specify/SKILL.md, "Create the directory and spec file")Description
Sequential numbering scans existing
specs/directories, picks max+1, checks for existence, then usesmkdir -pand writesspec.md. Nothing in that sequence is atomic: two concurrent invocations (parallel agents on worktrees sharing a specs dir, or two terminals) can both scan, both select the same number, both pass the existence check (mkdir -psucceeds either way), and both writespec.mdinto the same directory — the second silently overwrites the first's starting specification.This matters more now that multi-agent setups routinely run more than one spec-kit session against the same repository.
Expected behavior
Reserve the directory with plain
mkdir(no-p) so creation is exclusive; onEEXIST, discard the selected number, rescan, and retry before writingspec.md. A lock file would also work.Related
Prior sequential-numbering issues (#935, #975, #1332) covered scan-logic bugs in single-invocation scenarios; this one is specifically about the missing atomicity under concurrency.