Treat IDs, artifact filenames, and command invocation strings as part of a naming contract: they must be deterministic for dispatch, glob matching, and resume/compatibility.
Rules 1) Constrain stable identifiers
2) Preserve glob/dispatch landing targets
stories/<id>-*.md (or similar) glob, every possible outcome (including early halts) must land on a filename that still matches that glob.-unresolved, -ambiguous) rather than changing the target path scheme.3) Avoid “naive concatenation” artifact names
prfaq.md-distillate.md).4) Use canonical invocation strings
Example (ID + sentinel filename)
# stories.yaml entry
- id: "3-2" # always quoted; letters/digits/dashes only
# For dispatch-driven write-back, keep within stories/<id>-*.md
{spec_folder}/stories/{story_id}-unresolved.md
{spec_folder}/stories/{story_id}-ambiguous.md
{spec_folder}/stories/{story_id}-{slug}.md