cmp-qa-preplisted
Install: claude install-skill kvdm-co-pilot/create-cmp
# cmp-qa-prep — E2E harness bring-up for a CMP app
Current scaffolds ship **Maestro** flows (`qa/e2e/*.yaml`). Two ways to bring the harness up; the
first is almost always the one you want:
1. **Let the lane do it:** `node qa/verify.mjs`. With nothing attached it boots the project's AVD
headless (`CMP_AVD` overrides), installs the debug build, runs every flow in `qa/e2e/`, writes
the receipt, and shuts the emulator down. This is the done-gate; a green run here IS the proof.
2. **By hand, for an interactive session:** check disk first (`df -h ~`, ≥ 3 GB free — Gradle
fails with "No space left on device"); boot **headless** —
```
emulator -avd <name> -no-window -no-audio -no-boot-anim -no-snapshot -gpu swiftshader_indirect
```
— then `adb wait-for-device` (the AVD `cmp-doctor` created; one AVD per app);
`./gradlew :composeApp:installDebug`; `maestro test qa/e2e/smoke.yaml`
(CLI: `curl -fsSL https://get.maestro.mobile.dev | bash`).
Device proof is a checkpoint, never an inner loop — the project's PreToolUse hook reminds you.
**Headless is the rule, not a preference** (Karel, 2026-09-09: *"always run device tests in headless
mode"*). Those flags are `HEADLESS_ARGS` in the cmp profile's `device-provider.mjs`, and they are
what path 1 already uses — so **do not hand-boot a windowed emulator in front of a lane that would
have booted its own**. A window costs GPU and RAM the build wants, makes the run depend on a
desktop session, and differs from wh