{
  "prNumber": 46634,
  "prTitle": "release: 13.51.0",
  "generatedAt": "2026-10-01T02:16:18.543Z",
  "modelUsed": "gpt-5",
  "summary": {
    "totalFilesChanged": 895,
    "totalCommitsInRelease": 131,
    "releaseRiskScore": "54/100",
    "highRiskScenarios": 6,
    "mediumRiskScenarios": 5
  },
  "testScenarios": {
    "cherryPickScenarios": [
      {
        "area": "State Migrations - Crash resilience",
        "riskLevel": "high",
        "testSteps": [
          "1. Use a profile from an older version with incomplete/edge-case state (e.g., missing preferences fields) and upgrade directly to 13.51.0.",
          "2. Unlock and verify the extension does not white-screen; wait for migrations to complete and for the home screen to load.",
          "3. Force close or reload the extension mid-migration, then reopen; confirm the migration resumes idempotently and completes.",
          "4. Validate accounts, networks, and assets are intact and no migration loops occur."
        ],
        "whyThisMatters": "Cherry-pick 46683 fixes a migration crash; regressions here can brick wallets or corrupt data on upgrade."
      },
      {
        "area": "Transaction Confirmations - Money account perps pay feature gating",
        "riskLevel": "medium",
        "testSteps": [
          "1. With the feature flag DISABLED, attempt to initiate a money account 'perps pay' confirmation (via test dapp or deep link); verify the route/flow is hidden or blocked without errors.",
          "2. Attempt to access the disabled screen via a direct URL/route; confirm it's gated and does not render the pay UI.",
          "3. Enable the feature flag and retry; verify the perps pay confirmation renders and can be submitted successfully."
        ],
        "whyThisMatters": "Cherry-pick 46709 gates a high-variance confirmation path; incorrect gating can expose unfinished UX or break confirmations."
      },
      {
        "area": "Analytics - Money account events parity",
        "riskLevel": "medium",
        "testSteps": [
          "1. Enable MetaMetrics and from a money account perform Buy, Sell, Deposit, and Withdraw actions; verify analytics events are sent for each action (check DevTools Network).",
          "2. Repeat a single action twice; confirm exactly one event per action (no duplicates) with accurate properties (account type, chain, amount).",
          "3. Toggle MetaMetrics OFF and repeat an action; confirm no events are sent and the action still works normally."
        ],
        "whyThisMatters": "Cherry-pick 46752 ensures parity with mobile tracking; event schema mistakes can harm analytics quality or cause runtime errors."
      },
      {
        "area": "Token Management - Stellar asset details via CAIP19 route",
        "riskLevel": "medium",
        "testSteps": [
          "1. While on Stellar, navigate to an asset details page via a deep link containing a CAIP19 assetId in the route; verify the correct asset name, icon, and actions load.",
          "2. Open the same asset from the portfolio list and compare; details should match the route-driven view.",
          "3. Change only the route param to another Stellar asset and reload; confirm the view updates to the new asset and does not cling to stale state.",
          "4. If the route asset differs from state-selected asset, ensure the route-derived asset takes precedence without UI errors."
        ],
        "whyThisMatters": "Cherry-pick 46764 prioritizes route-derived CAIP19 IDs; incorrect precedence can show the wrong asset or crash the asset details page."
      }
    ],
    "initialScenarios": [
      {
        "area": "State Migrations (upgrade robustness)",
        "riskLevel": "high",
        "testSteps": [
          "1. Install the previous stable extension (e.g., 13.50.x), create a wallet with 2 SRP accounts and 1 imported private key; add a custom network (e.g., Linea) and add custom tokens on at least two networks; connect to a dapp.",
          "2. Update to 13.51.0 and unlock; observe any migration banners/spinners and wait for the home view to render (no white screen/crash).",
          "3. Verify all accounts, connected sites, and custom networks are present; confirm tokens/NFTs appear once per network (no duplicates/missing items).",
          "4. Send a small token on two different networks and sign a message; confirm transactions and signatures complete successfully.",
          "5. Reload the extension and relaunch the browser; ensure no repeated migrations and state remains intact."
        ],
        "whyThisMatters": "Multiple migration files were modified and a new migration (228) was added; migration regressions can corrupt user data or block startup."
      },
      {
        "area": "Onboarding - Passkey PRF Migration (successful path)",
        "riskLevel": "high",
        "testSteps": [
          "1. Use a profile eligible for the Passkey PRF migration (enable the feature/eligibility flag or seed state accordingly) and unlock.",
          "2. Confirm the Passkey PRF migration screen appears; select 'Migrate now' and complete the platform passkey prompt.",
          "3. After success, verify you return to the home screen; confirm account addresses remain the same and you can sign a message and send a small transaction.",
          "4. Lock and unlock again; verify the migration screen does not reappear."
        ],
        "whyThisMatters": "A new, user-facing migration flow was introduced; failures can block onboarding or leave keys/accounts unusable."
      },
      {
        "area": "Onboarding - Passkey PRF Migration (cancel, retry, and gating)",
        "riskLevel": "high",
        "testSteps": [
          "1. Trigger the migration screen and cancel (close the popup or choose 'Remind me later'); relaunch the extension.",
          "2. Verify the migration prompt returns and can resume without errors or duplicate prompts.",
          "3. For a non-eligible profile (no passkey), unlock and confirm the migration UI does not appear.",
          "4. Intentionally reject the platform passkey prompt; confirm a clear error is shown and the user can retry successfully."
        ],
        "whyThisMatters": "Edge cases (deferrals, rejections, ineligible users) must be resilient to avoid onboarding loops or broken states."
      },
      {
        "area": "Token/NFT Management - Asset lists across networks",
        "riskLevel": "high",
        "testSteps": [
          "1. Before upgrading, add multiple watched tokens on Ethereum and another network (e.g., Linea) and add at least one NFT collection.",
          "2. Upgrade to 13.51.0 and review the Assets and NFTs tabs per network; ensure items persist, are not duplicated, and balances are correct.",
          "3. Toggle token detection off/on; verify manually-added tokens persist and are not auto-removed.",
          "4. Remove a watched token, then re-add it; confirm state updates save correctly and portfolio totals update as expected."
        ],
        "whyThisMatters": "Core asset selector logic changed; incorrect selectors/migrations can hide, duplicate, or misattribute assets across networks."
      },
      {
        "area": "Session/Pending Approvals - App state (lock/unlock and resume)",
        "riskLevel": "high",
        "testSteps": [
          "1. From a connected dapp, trigger a connect or signature request so that a confirmation appears in the extension.",
          "2. Lock the wallet while the confirmation is open, then unlock; verify the extension returns to the same pending approval.",
          "3. Close the extension UI and reopen; confirm the pending approval is still actionable and not lost.",
          "4. Initiate two concurrent requests (e.g., a connect plus a network switch); verify both can be processed without deadlocks or stale UI."
        ],
        "whyThisMatters": "App-state-controller changes can break how pending approvals survive lock/unlock and UI lifecycle transitions."
      },
      {
        "area": "Alerts & Notifications - Multiple alert modal and connection indicators",
        "riskLevel": "medium",
        "testSteps": [
          "1. Connect a dapp with Account A, then switch to Account B that is not connected; verify the site connection indicator shows 'Not connected' and no legacy Unconnected Account banner appears.",
          "2. Create multiple alerts simultaneously (e.g., a pending signature and a failed network switch); verify the multiple-alert modal presents/queues them correctly and dismissing one reveals the next.",
          "3. Connect Account B via the connect button and confirm the connection status updates without ghost/overlapping banners.",
          "4. Navigate between tabs and reopen the extension; ensure dismissed alerts do not reappear and active alerts persist correctly."
        ],
        "whyThisMatters": "The unconnected-account alert component was removed and alert modal logic was changed; misbehavior can mislead users or block actions."
      },
      {
        "area": "Analytics/MetaMetrics - Consent gating and event integrity",
        "riskLevel": "medium",
        "testSteps": [
          "1. In Settings > Security & Privacy, toggle MetaMetrics OFF; perform a dapp connect and a token send; in DevTools Network, confirm no analytics calls are made.",
          "2. Toggle MetaMetrics ON; repeat the actions; confirm a single set of analytics calls fire per action (no duplicates).",
          "3. If an opt-in banner is shown, opt-out mid-session and repeat an action; confirm tracking stops and the UX itself remains unaffected.",
          "4. Reload the extension and verify the consent state persists."
        ],
        "whyThisMatters": "Analytics controller and platform adapter changes risk over-collection, under-collection, or runtime errors that could impact core flows."
      }
    ]
  }
}