# design-check - Phase 3.1 driving the plan and capturing

## Per batch

Each batch of `inventory.plan` (filtered to the scoped ids) is one launch:

1. Launch once with the batch's `launch` driver (or the plain mock activation for the `(default launch)` batch).
2. Navigate to the screen (`ios_tap` / `ios_swipe` / `ios_type_text` route through idb; Android uses the `android_*` equivalents).
3. Capture the batch's relaunch target.
4. For each in-app target in the batch: flip its selector (scenario case / scenario code), let the screen re-render, capture. No relaunch between these.

## Per-target activation by `driver.type`

| `driver.type` | Activation |
|---|---|
| `launch-arg` | `design_mock_launch({ launch_arg: "<mock activation> <driver.launchArg>" })` - the mock switch AND the target's flag together |
| `intent-extra` | `design_mock_launch({ intent_extra: "<mock extra> <driver.intentExtra>" })` |
| `scenario` | Set `driver.enum` to `driver.case` through the build's debug scenario picker (navigate to it, select, return), then drive the flow that consumes it |
| `code` (from `prefix-code`) | Type a reference beginning with `driver.code` at the entry field the flow starts from, then walk to `driver.appliesTo`. The prefix decides which fixture the mock repository returns, so this is how most per-screen variants are reached |
| `code` (from `code-scenario`) | Same entry field, but the code is flow-wide rather than owned by one screen |
| `fixture` | Activate the launch arg / scenario that reads `driver.file`; when nothing does, the target is a skip with reason "fixture not reachable from any driver" |
| `deep-link` | `ios_open_url` / `android_open_url` with `driver.url` |
| `manual` | Config-declared: follow the config's note, or skip with that note as the reason |

## Sub-states

While a target's state is on screen, also capture the sub-states reachable from it by tapping - overlays, bottom sheets, modals, popups, inline errors, QR / share sheets. These cost no relaunch and belong to the target that exposed them; record them as additional captures under that target id (`<id>#<sub-label>`).

## Per capture

`ios_screenshot` / `android_screenshot` (save the PNG into the Phase 0 report dir) + `mcp__multi-agent-toolkit__design_ui_geometry` (live boxes + screen size) → append to `state.designCheck.captured[]` with the target id and a human label.

## Skip reasons

An unreachable target is recorded as `{ id, reason }` in `state.designCheck.skipped[]` with a concrete reason, for example "scenario picker not present in this build", "needs a live order", "crashes on launch: <symbol>".
