emulatelisted
Install: claude install-skill ndisisnd/msg
# emulate
The harness's **local run lane**. `/pre-merge` runs the checks and `/merge`
deploys to a remote target; neither one puts a live app in front of a human on
their own machine. That is this skill's whole job.
`/emulate` is a **leaf**: nothing invokes it and it invokes nothing. It has no
place in the `intake → plan-pm → plan-em → eng → pre-merge → merge` spine and
never blocks it. Run it whenever you want to look at the app.
## Dispatch
Every mode runs the same protocol —
[`refs/protocol.md`](refs/protocol.md). The flags only change what Step 0
resolves. First match wins; flags compose.
| Invocation | Also triggers on (natural language) | Effect |
|---|---|---|
| `/emulate` | "run the app", "open the simulator", "see it running", "show me the app" | Platform resolved from `devkit/PLATFORMS.md` |
| `/emulate --ios` | "boot the iOS sim", "run it on iPhone" | iOS lane, `PLATFORMS.md` not consulted |
| `/emulate --adr` (alias `--android`) | "run it on Android", "open the emulator" | Android lane, `PLATFORMS.md` not consulted |
| `/emulate --expo` | "start Expo", "run Metro", "expo go" | Pins the **runner**; the platform still resolves normally |
| `/emulate --device <name>` | "run it on an iPhone 15 Pro" | Pins the simulator / AVD and skips the device question |
| `/emulate --dry-run` | "what would this do", "don't actually run it" | Prints the plan and the kill list, launches nothing, kills nothing |
| `/emulate --help` | — | This table, then stop |
**Two axes, not o