# Publish QA

<!-- funnelsgrove:generated:start contract-v3/qa/publish -->
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/publish -->

## Preview gate

1. Run `fgrove status`, `git status --short`, tests, lint, `fgrove validate`, and relevant local/analytics/payment QA.
2. Choose exactly one source path. GitHub-connected funnels use git push, `fgrove github pull`, terminal status, then publish; never use `fgrove sync up` for the same diff. Non-GitHub funnels use `fgrove sync up`.
3. Publish preview with a clear message.
   `fgrove publish` reports validation, GitHub sync, queue, build, image optimization, and upload progress on stderr; its final URL/version row remains the only stdout output. If compatibility guidance requests a newer CLI, run `fgrove update` so every NVM/Homebrew installation visible on `PATH` is updated together.
4. Test the preview URL across supported breakpoints and real navigation entry points.
5. Confirm preview-mode suppression and production configuration separation.
6. Review route, analytics, answer, experiment, and payment evidence.
7. Confirm the `imageVariants` stage completed, supported browsers receive AVIF/WebP, and the original raster remains the fallback.

## Production gate

Publish production only after explicit approval and successful preview QA. Confirm the selected project/funnel/environment immediately before publishing, then smoke-test the live journey without creating duplicate conversions.
