Quickstart — Reproduce & Verify #2533
Reproduce the defect (RED)
Simulated end-to-end (the shape WP02 automates through the real claim gate):
1. Create a solo PR-bound mission on a feature branch: spec-kitty agent mission create "<slug>" --pr-bound --branch-strategy already-confirmed --start-branch feat/<slug> → topology coord, an empty coordination branch is materialized. 2. Author + commit spec.md, plan.md, tasks.md, tasks/WP01-*.md, lanes.json on the feature branch (the coordination branch stays empty). 3. Claim the first work package: spec-kitty agent action implement WP01 --mission <slug> --agent claude.
Observed (buggy): the claim aborts with Planning artifacts not committed: listing the feature-branch-committed artifacts, plus git add -f kitty-specs/<slug> … instructions. Root cause: the precondition diffs those PRIMARY artifacts against the empty coordination branch.
Verify the fix (GREEN)
After WP01+WP02:
manual git add -f, and meta.json topology is unchanged (coord).
HEAD is absent from _files_changed_vs_ref(..., None).
the coordination ref (no regression).
- The same claim proceeds — no "Planning artifacts not committed" output, no
- Unit:
resolve_precondition_ref(None) == "HEAD"; a PRIMARY artifact committed at - Regression: a
lanes_with_coordmission still routes COORD-owned status files to - Move-task:
_mt_untracked_planning_artifact_pathsstaging unchanged.
Test commands
# Pure unit + integration for the claim precondition (parallel-safe):
PWHEADLESS=1 uv run pytest tests/specify_cli/cli/commands/test_implement_cores.py \
tests/specify_cli/cli/commands/test_implement.py -n auto --dist loadfile -q
# Quality gates (must be zero new issues):
uv run ruff check src/specify_cli/cli/commands/
uv run mypy --strict src/specify_cli/cli/commands/implement_cores.py
# Terminology guard (docs campsite touches doctrine-adjacent prose):
uv run pytest tests/architectural/test_no_legacy_terminology.py -q
Sequencing note
The WP that edits tasks_move_task.py must be rebased onto upstream/main after PR #2639 merges (it line-shifts the :1364 consumer). #2570 WP01 is already in base, so implement_cores.py needs no reconciliation.