Quickstart — Verifying the Resolution & Activation Foundation

How a reviewer confirms the foundation is in place. All commands run through the clone-local CLI with isolated state, and architectural checks run from the primary checkout (not a worktree).

# Shadow-clone preamble (every command)
export SPEC_KITTY_HOME="$PWD/.spec-kitty-home"
export PATH="$PWD/.venv/bin:$PATH"

1. One resolution door (C-R1 / SC-001)

# exactly one implementation body; home.py delegates
pytest tests/architectural -k "built_in_location or single_door" -q
grep -rn "def get_package_asset_root" src/          # expect ONE def in kernel/paths.py
grep -rn "def _find_relocated_missions_ancestor" src/  # expect ONE def

2. Missions honor SPEC_KITTY_PACKS_ROOT + precedence (C-R2/C-R3 / SC-002)

pytest tests/doctrine -k "missions_root and packs_env" -q     # the new regression (was missing)
# both-vars precedence case is included: PACKS_ROOT wins for missions

3. Activation authority, no implicit backfill (C-A1/C-A2 / NFR-001)

pytest tests/charter/test_pack_context.py tests/charter/test_mission_type_activation_gating.py -q
# absent key on a provisioned project -> provisioned set; authored [] -> empty; no all-four backfill site

4. Fresh-init provisioning + fail-closed (C-A3/C-A4 / SC-003)

# fresh init writes an explicit, non-empty mission_type_activations
tmp=$(mktemp -d); (cd "$tmp" && spec-kitty init --ai claude . >/dev/null 2>&1)
python -c "import yaml,sys; d=yaml.safe_load(open('$tmp/.kittify/config.yaml')); \
  a=d.get('mission_type_activations'); assert a, 'empty/absent activation set'; print('OK:', sorted(a))"

5. Behavior parity + scope fence (C-A6/C-S1 / SC-004/SC-005)

pytest tests/architectural -k "terminology or layer" -q      # NFR-002/NFR-005
# scope-fence: mission-type still not an ArtifactKind; availability readers unchanged
python -c "from doctrine.artifact_kinds import ArtifactKind, MissionTypeNotAnArtifactKind; \
  import pytest; \
  ok=False; \
  \nfrom doctrine import artifact_kinds; print('MissionTypeNotAnArtifactKind present:', bool(MissionTypeNotAnArtifactKind))"

6. Full gate sweep (from the primary checkout)

pytest tests/architectural/ -q                 # layer rules, terminology, built-in-location authority
ruff check . && mypy src/                       # zero issues, zero new suppressions

Done when: one door, missions relocate via PACKS_ROOT (new test green), no implicit backfill, fresh-init provisions explicitly, provisioned-project behavior is unchanged, and the scope-fence guards prove the kind-promotion / availability-reader work was NOT touched.