# Local QA

<!-- funnelsgrove:generated:start contract-v3/qa/local -->
Step contract version: `3`

Contract hash: `d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf`

| Capability | Allowed types | Allowed identities | Required owner |
| --- | --- | --- | --- |
| `browser-registration-completed` | _None_ | _None_ | `trusted-subscription-claim-server` |
| `checkout` | `paywall_offer`, `upsell_offer`, `checkout` | `any` | `named-payment-helpers` |
| `choice-write` | `single_step_choice`, `single_step_choice_emoji`, `multi_select_choice` | `any` | `useStepChoices` |
| `email-capture` | `form_input` | `email-capture` | `submitEmailCapture` |
| `hardcoded-navigation` | _None_ | _None_ | `manifest-flow-controller` |
| `provider-direct-analytics` | _None_ | _None_ | `analytics-adapter-outbox` |
| `subscription-handoff` | `subscription_handoff`, `purchase_completed` | `any` | `runtime-handoff-helper` |
| `subscription-management` | `subscription_management`, `cancellation_offer` | `any` | `runtime-subscription-helpers` |
<!-- funnelsgrove:generated:end contract-v3/qa/local -->

## Automated gate

```bash
npm run test:run
npm run lint
fgrove validate
```

Run the repository’s focused tests first, then its full validation gate. Also run `npm run docs:funnel-agent:check` when editing this source bundle.

## Manual gate

- Test small 375×667, medium 393×852, large 402×874, and desktop-small 1280×800.
- At every declared breakpoint, require no horizontal scrolling, clipping, or overlap. Hiding overflow does not pass when content is clipped.
- Keep the choice/input primary CTA visible without scrolling and every interactive tap target at least 44×44 CSS px.
- Check pointer, keyboard, focus, loading, error, retry, refresh, back, and exit.
- Verify answer persistence and manifest routes.
- Assert every `assetId` resolves. Inspect the network to prove only current and likely-next assets preload; metadata alone is not proof.
- Confirm theme values come from `src/theme/theme.ts` through emitted CSS variables rather than duplicated step-local constants.
- Verify preview suppresses remote API/provider delivery.
- Inspect the console and network for errors or duplicate requests.

Complete the type-specific checklist in the [step-type index](../steps/INDEX.md).
