# Release QA capability map

This document maps the current mm-harness release-validation surface to the
MetaMask Extension QA checklists at commit
[`77591c5`](https://github.com/MetaMask/experimental-mm-qa-ai-tasks/tree/77591c5998fcf6368417fd5be01871e6c9c3dc5b/tasks/rc-extension).
It describes reusable capabilities, not a release verdict. A release verdict
must come from the case inventory, terminal traces, and completion gate for that
specific artifact.

The referenced plans contain 135 cases:

- Perps: [64 cases](https://github.com/MetaMask/experimental-mm-qa-ai-tasks/blob/77591c5998fcf6368417fd5be01871e6c9c3dc5b/tasks/rc-extension/perps-rc/perps-rc-regression.md)
- Assets: [22 cases](https://github.com/MetaMask/experimental-mm-qa-ai-tasks/blob/77591c5998fcf6368417fd5be01871e6c9c3dc5b/tasks/rc-extension/assets-rc/assets-rc-regression.md)
- Swap and Bridge: [39 cases](https://github.com/MetaMask/experimental-mm-qa-ai-tasks/blob/77591c5998fcf6368417fd5be01871e6c9c3dc5b/tasks/rc-extension/swap-bridge-rc/swap-bridge-rc-regression.md)
- Networks: [10 cases](https://github.com/MetaMask/experimental-mm-qa-ai-tasks/blob/77591c5998fcf6368417fd5be01871e6c9c3dc5b/tasks/rc-extension/networks-regression-rc/networks-regression-rc.md)

## Artifact boundary

Artifact discovery and download belong to the release-validation workflow. The
workflow supplies mm-harness with a local artifact, expected product identity,
and trusted SHA-256. mm-harness never discovers or downloads a release.

For Extension, `runtime-launch` verifies the ZIP digest and manifest version,
extracts it safely, records archive and tree provenance, copies the exact tree
to an isolated runtime directory, resets only the selected Chrome profile, and
launches without building or patching the checkout.

For Android, `runtime-launch` requires one physical-device serial, verifies the
local APK digest, package ID, version name, and version code, installs it, and
binds subsequent recipes to the installed APK digest and selected device. The
release path does not use Metro, a development bridge, or the HUD.

```sh
mm-harness runtime-launch \
  --adapter extension \
  --target /path/to/metamask-extension \
  --cdp-port 9222 \
  --artifact-file /path/to/metamask-chrome-X.Y.Z.zip \
  --artifact-version X.Y.Z \
  --artifact-sha256 <trusted-digest>

mm-harness runtime-launch \
  --adapter mobile \
  --platform android \
  --target /path/to/metamask-mobile \
  --device <physical-device-serial> \
  --artifact-file /path/to/app.apk \
  --artifact-version X.Y.Z \
  --artifact-build-id <version-code> \
  --artifact-package-id io.metamask \
  --artifact-sha256 <trusted-digest>
```

## Completion gate

[`scripts/validate-release-report.mjs`](../scripts/validate-release-report.mjs)
compares a canonical case inventory with terminal verdicts. It rejects missing
or unknown IDs, duplicate IDs, non-terminal statuses, absent evidence, evidence
outside the declared root, incomplete run directories, and any non-empty
`remainingCases`. A passing gate writes `metadata.json`,
`report-quality.json`, and `report.md`.

Supported verdicts are `PASS`, `FAIL`, `BLOCKED_FUNDS`, `BLOCKED_COST`, and
`BLOCKED_ENVIRONMENT`. Product failures must remain failures; infrastructure,
funding, and cost limits must not be reported as passes.

## Capability matrix

`AVAILABLE` means a typed action or bundled recipe covers the reusable
operation and produces machine-readable evidence. `PARTIAL` means the generic
operation exists but the complete checklist family still depends on task-local
composition, live funds, or deterministic external state. `MISSING` means the
current manifests do not expose the required durable capability.

### Perps

| Case family | Required state and behavior | Current capability | Status |
| --- | --- | --- | --- |
| Navigation, home, markets, and details | Eligible account, live catalog, market summaries, chart, statistics, and route recovery | Visible-state reads, market navigation/search/filter, provider comparison, eligibility reads, and market-detail recipes | **AVAILABLE** for visible live flows |
| Watchlist and activity | Existing favorites and typed activity rows | Favorite mutation, activity-filter selection, and release recipes | **AVAILABLE** |
| Order entry | Funded Perps balance, market/limit inputs, validation, preview, fill, and duplicate protection | Parameterized order placement plus visible order-entry and validation recipes | **PARTIAL**: live state and provider outcomes remain release-dependent |
| Position management | Open position, close, margin, and TP/SL changes | Visible position actions, close, edit-margin, and TP/SL actions | **PARTIAL**: exact outcome depends on live account state |
| Deposit and withdrawal | Wallet funds, Perps balance, confirmations, and resulting activity | Balance actions and confirmation reads with a funds-flow recipe | **PARTIAL**: funds and provider availability are external |
| Perps state helpers | Deterministic position/order creation or cleanup before and after proof | Mobile state helpers can converge supported testnet state; Extension only exposes observation/assertion helpers and no start/readiness or multi-position background-close claim | **PARTIAL**: Extension convergence is **MISSING** and `perps.clean-market-testnet` plus mutating runner validation are omitted there |
| Snapshot assertions | Positions, orders, markets, history, and watchlist | Bounded redacted snapshot when the background hook exists; visible-state reads on untouched releases | **AVAILABLE** with runtime-specific observation paths |
| Deterministic seeded provider state | Balance, positions, limit orders, TP/SL, history, and controlled REST/stream behavior | Existing setup fixtures do not reproduce the complete QA provider model inside an untouched release artifact | **MISSING** |

### Assets

| Case family | Required state and behavior | Current capability | Status |
| --- | --- | --- | --- |
| Token list, prices, details, and sorting | Funded account with known holdings and price data | Visible token-list/details reads, network scope, sorting assertions, and bundled recipes | **AVAILABLE** for EVM token UI |
| Token search/import/hide/persistence | Known contracts and a persistent profile | Custom-token import, visibility changes, restart-safe recipes, and custom-network composition | **AVAILABLE** for Extension EVM tokens |
| Native/token send and gas | Funded owned accounts and live gas | Extension can prepare and review a send and configure gas, but exposes no terminal send/cancel action or submit recipe | **MISSING** for terminal Extension send until domain-specific funding and durable receipt policy exists |
| Aggregate Android holdings | Imported wallet with multi-chain assets | Native-accessibility token-list read on an untouched physical-device release | **AVAILABLE** |
| Balance streaming and aggregation arithmetic | Triggered inbound update and expected cross-network totals | Visible snapshots exist; deterministic inbound trigger and tolerance assertions are not bundled | **PARTIAL** |
| NFTs, DeFi, Solana send, and Bitcoin details | Indexed owned positions/assets and chain-specific transaction flows | Generic visible UI only | **MISSING** |

### Swap and Bridge

| Case family | Required state and behavior | Current capability | Status |
| --- | --- | --- | --- |
| Surface, asset, network, and amount selection | Supported source/destination pair | Exact asset/network selection, amount/Max input, and visible-state reads on Extension; exact native selection and amount input on Android | **AVAILABLE** |
| Quote and slippage | Live quote services and supported route | Surface, quote, Max-quote, and custom-slippage recipes | **AVAILABLE** |
| Submit and confirmation | Sufficient source balance and gas | Mobile retains its typed native submit action; Extension exposes no submission action or live-submit recipe | **MISSING** on Extension until domain-specific funding and durable receipt policy exists |
| Sequential multi-network journey | Balances delivered by preceding swaps and bridges | Extension selection, amount, quote, Max, and slippage evidence remains composable, but no Extension terminal submit step exists | **MISSING** for an Extension end-to-end live journey |
| Activity, balance deltas, and completed bridge tracking | Confirmed transactions and indexed activity | Visible-state evidence exists; reusable terminal activity and arithmetic assertions are incomplete | **PARTIAL** |

### Networks

| Case family | Required state and behavior | Current capability | Status |
| --- | --- | --- | --- |
| Add, select, and remove custom networks | Known RPC configuration and chain identity | Typed custom-network and Chainlist add, visible-state read, select, and remove actions | **AVAILABLE** on Extension |
| Custom-network tokens and persistence | Known token contract and persistent profile | Network actions compose with Assets import/visibility/persistence recipes | **AVAILABLE** on Extension |
| Balance stability and fiat visibility | Funded custom network and live price APIs | Visible-state reads and a bounded balance-stability recipe | **PARTIAL**: external price availability remains uncontrolled |
| Send Max and activity | Funded custom network and recipient | Extension can prepare and review the send, but cannot terminally submit or cancel it | **MISSING** until Extension send has domain-specific funding and durable receipts |
| Bridge tracking and details | Completed supported bridge route | Read-only Swap/Bridge evidence exists, but Extension cannot create the terminal bridge transaction | **MISSING** for a complete Extension bridge journey |
| Android multi-network visibility | Imported wallet with holdings on multiple chains | Native Assets read reports aggregate visible holdings without Metro or a development bridge | **AVAILABLE** |

## Platform scope

The 135-case source inventory targets Extension. It must not be relabeled as an
Android checklist. Android release validation uses a separate case inventory
for the product behaviors exercised on a physical device, while reusing the
same action vocabulary and report gate where the clients expose equivalent
flows. Simulator-only evidence is not accepted for Android release claims.
