Quickstart / Verification — Doctor mission-state legacy repair & report fidelity

Reproduce the defects (pre-fix)

# Seed a mission whose meta.json has change_mode: regular, then:
PYTHONPATH=src spec-kitty doctor mission-state --fix          # aborts that mission: errors=N, "Invalid change_mode 'regular'"
PYTHONPATH=src spec-kitty doctor mission-state --teamspace-dry-run   # "N validation errors." with no detail

Verify the fix

# 1. Legacy change_mode is repaired (US1 / FR-001..003, FR-011)
PYTHONPATH=src spec-kitty doctor mission-state --fix
#   → legacy mission counted as updated; stored change_mode gone; exit 0; action normalized_change_mode recorded.

# 2. Idempotent (NFR-002)
PYTHONPATH=src spec-kitty doctor mission-state --fix          # → zero further changes for that mission.

# 3. Per-mission detail in terminal + json (US2 / FR-005,006)
PYTHONPATH=src spec-kitty doctor mission-state --fix --json | jq '.missions[] | select(.status!="unchanged")'

# 4. Dry-run parity + detail (US3 / FR-007,008,009)
PYTHONPATH=src spec-kitty doctor mission-state --teamspace-dry-run          # names each affected mission + reason
PYTHONPATH=src spec-kitty doctor mission-state --teamspace-dry-run --json | jq '.errors'

# 5. Audit and fix agree (US4 / FR-010)
PYTHONPATH=src spec-kitty doctor mission-state --audit --json   # legacy change_mode not flagged fatal-in-one/valid-in-other

Test commands (ATDD)

PWHEADLESS=1 .venv/bin/python -m pytest \
  tests/specify_cli/test_mission_metadata_change_mode.py \
  tests/unit/migration/ tests/integration/migration/ \
  tests/cli/commands/test_doctor_mission_state.py \
  tests/audit/ tests/status/ -q
make test-fast    # baseline

Done when

  • SC-001 (all legacy-change_mode missions repaired, exit 0), SC-002 (triage from terminal/json alone), SC-003 (dry-run parity), SC-004 (audit/fix agree), SC-005 (idempotent), SC-006 (behavior-preservation test green).