Quickstart — Validating Mission Completion Terminal State
End-to-end acceptance validation for the mission. All commands are black-box against the canonical CLI (directive 036); none hand-edit the event log.
Scenario A — canceled-with-provenance completes (SC-001, #2945 repro → green)
# In a scratch mission with WP01..WP03 approved and WP04 a replanned cancellation:
spec-kitty agent tasks move-task WP04 --to canceled \
--note "Canceled by replan: scope absorbed by WP02's documentation fix."
spec-kitty accept --mission <handle> --json | jq '.canceled_wps, .blockers'
# → canceled_wps: [{wp_id:"WP04", reason:"Canceled by replan…", actor, at}]
# → blockers: [] (accept passes)
spec-kitty merge --mission <handle> --dry-run
# → plans WP01..WP03; WP04 excluded from done/review assertions & order; audit retained
Scenario B — canceled without operator provenance is blocked (SC-002)
spec-kitty agent tasks move-task WP04 --to canceled --force # no --note
spec-kitty accept --mission <handle> --json | jq '.blockers'
# → a structured blocker naming WP04 and "operator-authored cancellation provenance required"
# → WP04 is NOT in canceled_wps
Scenario C — non-terminal lane still blocks (FR-006) & gate integrity (SC-005)
# WP03 left in in_review, WP04 canceled-with-provenance:
spec-kitty accept --mission <handle> --json | jq '.blockers'
# → WP03 blocker present; acceptance-matrix / issue-matrix verdict gates still evaluated
Scenario D — dependency on a canceled WP does not strand the dependent (SC-005/FR-009)
# WP05 depends on WP04; cancel WP04 with provenance:
spec-kitty agent tasks move-task WP04 --to canceled --note "replan"
spec-kitty agent tasks status --mission <handle> --json | jq '.wps[] | select(.wp_id=="WP05")'
# → WP05 is claimable (dependency resolved), can reach an acceptable ending
Scenario E — authoring-time warning is advisory (FR-007/FR-008, SC-003)
# Author a decomposition containing a post-integration-only WP:
spec-kitty agent mission finalize-tasks --mission <handle>
# → warning naming the WP + matched phrase; finalize still succeeds (advisory)
# Ordinary all-code decomposition → no warning (negative corpus).
Regression gate (NFR-001/SC-004)
# Baseline commit: a59460ec15
PWHEADLESS=1 pytest \
tests/status/test_transitions.py tests/status/test_reducer.py \
tests/specify_cli/test_canonical_acceptance.py \
tests/specify_cli/test_acceptance_regressions.py \
tests/specify_cli/cli/commands/agent/test_finalize_canceled_work_packages.py \
-n0 -q
ruff check . && mypy src/specify_cli/status_lanes.py src/specify_cli/acceptance src/specify_cli/merge
Classify any red per the baseline-red gotcha (known-P0 reds are not this mission's).