Quickstart / Validation — Mission-Type DRG Node + Cross-Grain Integrity
Validation scenarios (map to Success Criteria). Run in the clone with uv run.
V1 — mission_type is a graph citizen (SC-001)
uv run spec-kitty doctrine regenerate-graph --check # fresh, green
grep -c 'kind: mission_type' src/doctrine/graph.yaml # == 4 (built-in types)
Expected: freshness gate green; 4 mission_type nodes.
V2 — cascade for mission-type traverses (SC-001)
uv run spec-kitty charter activate mission-type research --cascade all --json
Expected: cascade acts (no silent no-op); traverses the mission_type node's edges.
V3 — integrity gate non-vacuous (SC-002)
PWHEADLESS=1 uv run pytest tests/doctrine/drg/test_cross_grain_integrity.py -q
Expected: passes on the shipped (disjoint) tree; the non-vacuity twin fails when pointed at the deliberate-collision temp-tree fixture (asserted within the test).
V4 — hot path stays cheap, gating byte-identical (SC-003)
PWHEADLESS=1 uv run pytest tests/specify_cli/next/test_runtime_bridge_dispatch.py \
tests/charter tests/next -q -n auto --dist loadfile
Expected: the hot .action_sequence path triggers zero load_action_index (spy); charter + next suites green with unchanged activation-gating outputs.
V5 — single union authority, no scaffold survives (SC-004)
rg -n "_resolve_union|load_action_index\(" tests/ | rg -v "test_cross_grain_integrity" # no rogue second union
rg -l "parity_scaffold" src/ tests/ || echo "no parity_scaffold artifact — good"
Expected: the two former test-side unions now assert against production's bundle; no parity_scaffold file remains.
Gate before hand-off
uv run ruff check .
uv run mypy --strict src/charter/mission_type_profiles.py src/doctrine/drg
Expected: zero issues.