Skip to content

Conversation

@metamaskbot
Copy link
Collaborator

@metamaskbot metamaskbot commented Nov 28, 2025

🚀 v13.11.1 Testing & Release Quality Process

Hi Team,
As part of our new MetaMask Release Quality Process, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment.


📋 Key Processes

Testing Strategy

  • Developer Teams:
    Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows.
  • QA Team:
    Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing.
  • Customer Success Team:
    Validate new functionalities and provide feedback to support release monitoring.

GitHub Signoff

  • Each team must sign off on the Release Candidate (RC) via GitHub by the end of the validation timeline (Tuesday EOD PT).
  • Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed.

Issue Resolution

  • Resolve all Release Blockers (Sev0 and Sev1) by Tuesday EOD PT.
  • For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines.

Cherry-Picking Criteria

  • Only critical fixes meeting outlined criteria will be cherry-picked.
  • Developers must ensure these fixes are thoroughly reviewed, tested, and merged by Tuesday EOD PT.

🗓️ Timeline and Milestones

  1. Today (Friday): Begin Release Candidate validation.
  2. Tuesday EOD PT: Finalize RC with all fixes and cherry-picks.
  3. Wednesday: Buffer day for final checks.
  4. Thursday: Submit release to app stores and begin rollout to 1% of users.
  5. Monday: Scale deployment to 10%.
  6. Tuesday: Full rollout to 100%.

✅ Signoff Checklist

Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion:

Team sign-off checklist

  • Extension Platform

This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀

Feel free to reach out if you have questions or need clarification.

Many thanks in advance

Reference


Note

Fixes intro modal gating by stripping prerelease versions and using previousAppVersion, adds comprehensive hook tests, and bumps version to 13.11.1 with changelog update.

  • Hooks/UI:
    • Update useMultichainAccountsIntroModal to parse/strip prerelease versions with semver.parse and compare against BIP44_ACCOUNTS_INTRODUCTION_VERSION.
    • Read state.metamask.previousAppVersion instead of getLastUpdatedFromVersion.
    • Export BIP44_ACCOUNTS_INTRODUCTION_VERSION.
  • Tests:
    • Replace custom logic with renderHookWithProvider-based tests in ui/hooks/useMultichainAccountsIntroModal.test.ts.
    • Add cases for prerelease versions (e.g., 13.4.0-flask.0) and threshold boundaries.
  • Release:
    • Bump package.json version to 13.11.1.
    • Update CHANGELOG.md with 13.11.1 (Fixes crash when updating Flask) and comparison links.

Written by Cursor Bugbot for commit 7ecad24. This will update automatically on new commits. Configure here.

@metamaskbot metamaskbot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Nov 28, 2025
This PR updates the change log for 13.11.1. (Hotfix - no test plan
generated.)

---------

Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
Co-authored-by: Gauthier Petetin <gauthierpetetin@hotmail.com>
@metamaskbot
Copy link
Collaborator Author

Builds ready [e56057d]
UI Startup Metrics (1249 ± 95 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1249106916549513151379
load106590514579011271193
domContentLoaded105989914548911211187
domInteractive241488172172
firstPaint50979124241310401163
backgroundConnect2151952529219231
firstReactRender29195893448
getState351562124258
initialActions104112
loadScripts851694123988910973
setupStore1162131319
numNetworkReqs1257821573
BrowserifyPower User HomeuiStartup18841593278218619972198
load1020886190516210071439
domContentLoaded100487918811619861427
domInteractive37161803432134
firstPaint5538614683909571379
backgroundConnect22520226511231248
firstReactRender79451131589105
getState17314525924191220
initialActions1011113
loadScripts79668616451597811216
setupStore221159102645
numNetworkReqs1366931152176258
WebpackStandard HomeuiStartup813734134489830977
load616552112587618775
domContentLoaded611548111886615767
domInteractive2314103182071
firstPaint24885760177221642
backgroundConnect1263471630
firstReactRender28203853336
getState291492113643
initialActions103112
loadScripts608546110884613756
setupStore1171931417
numNetworkReqs1257720571
WebpackPower User HomeuiStartup14661215217215215691680
load6856011224114678995
domContentLoaded6745931217115662982
domInteractive38171983633137
firstPaint2811111225218245733
backgroundConnect1584851723
firstReactRender83461101495102
getState15413621413157179
initialActions104113
loadScripts6715911208112660972
setupStore211064102541
numNetworkReqs1536631555189296
FirefoxBrowserifyStandard HomeuiStartup12081049166211812721465
load102189812138210761179
domContentLoaded101989812138210751179
domInteractive54302083376130
firstPaint------
backgroundConnect3721139223888
firstReactRender22175562234
getState11613915918
initialActions102012
loadScripts99887911757610561154
setupStore12418519928
numNetworkReqs1156616661
BrowserifyPower User HomeuiStartup23621879306824325392768
load1107934163713810941489
domContentLoaded1106934163613910931489
domInteractive11834542103112424
firstPaint------
backgroundConnect972846163111236
firstReactRender77461411989112
getState25460763210322711
initialActions218137
loadScripts1074913157312910651394
setupStore1279749164136644
numNetworkReqs93582234481206
WebpackStandard HomeuiStartup14151262175211314661654
load1208107614279212751404
domContentLoaded1207107614269212741404
domInteractive55291693379132
firstPaint------
backgroundConnect4021131204196
firstReactRender27196682842
getState116130151017
initialActions103122
loadScripts1181105913878312521331
setupStore12685111133
numNetworkReqs1256917761
WebpackPower User HomeuiStartup26472191339828328333224
load13641140186818515161776
domContentLoaded13641140186818515161776
domInteractive1062955810694419
firstPaint------
backgroundConnect1021748874118249
firstReactRender78381842187115
getState27282915223377741
initialActions3033427
loadScripts13261118184418114791741
setupStore117675817295645
numNetworkReqs926019936111163

@metamaskbot metamaskbot added the release-13.11.1 Issue or pull request that will be included in release 13.11.1 label Nov 28, 2025
…ling cp-13.11.1 (#38396)

- fix: Prevent crash in modal version handling cp-13.11.1 (#38382)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Fixes a crash caused by `useMultichainAccountsIntroModal` that entirely
bricks Flask. The crash occurs because the version handling doesn't
handle our versioning scheme well. This PR changes the logic to use
`previousAppVersion` and strips the `prerelease` part of the version
(which indicates the build type) for a proper comparison.

Also updates the tests for this hook which were flawed as they didn't
use the hook in question at all.

[![Open in GitHub

Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/38382?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Fixes a crash when updating Flask

## **Manual testing steps**

1. Force `lastUpdatedFromVersion` to `13.9.0.150` and
`previousAppVersion` to `13.9.0-flask.0`
2. See that it crashes without this PR

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<img width="454" height="634" alt="image"

src="https://github.com/user-attachments/assets/ea140cfa-66ef-402e-a6cd-3ca3a2bc6402"
/>


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Fixes modal logic by parsing/stripping prerelease versions and using
`previousAppVersion`, preventing crashes; rewrites tests to exercise the
hook with provider-backed state.
> 
> - **Hook (`ui/hooks/useMultichainAccountsIntroModal.ts`)**:
> - Export `BIP44_ACCOUNTS_INTRODUCTION_VERSION` and switch version
source to `state.metamask.previousAppVersion`.
> - Parse versions with `semver.parse` and strip prerelease before
comparing with `semver.lt`.
> - Maintain display conditions (unlocked, feature flag, not previously
shown, upgrade, main route) and set `showMultichainIntroModal`
accordingly.
> - **Tests (`ui/hooks/useMultichainAccountsIntroModal.test.ts`)**:
> - Replace standalone logic tests with `renderHookWithProvider` to test
the actual hook.
> - Add cases for prerelease versions (e.g., `13.4.0-flask.0`) and
threshold boundaries; verify behavior across route, lock state, feature
flag, prior display, and fresh install.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a46d32a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


[a3c1ac2](a3c1ac2)

Co-authored-by: Frederik Bolding <frederik.bolding@gmail.com>
@gauthierpetetin gauthierpetetin marked this pull request as ready for review November 28, 2025 13:21
@github-actions
Copy link
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbot
Copy link
Collaborator Author

Builds ready [7ecad24]
UI Startup Metrics (1216 ± 90 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1216104715209012851369
load103389212868410981160
domContentLoaded102688712828210911150
domInteractive221484151967
firstPaint53274117940010161149
backgroundConnect20818929813211230
firstReactRender29174983646
getState341871124060
initialActions107113
loadScripts825677106582888948
setupStore1164051225
numNetworkReqs1257821577
BrowserifyPower User HomeuiStartup18341565302320419342158
load99087619591739681430
domContentLoaded97686819451749481418
domInteractive35151773631141
firstPaint546921961382919985
backgroundConnect2171992429223236
firstReactRender79431431987121
getState16613035426175201
initialActions102112
loadScripts77467217281727491217
setupStore2095292344
numNetworkReqs1506730656181296
WebpackStandard HomeuiStartup815722106473843972
load61055382162623776
domContentLoaded60554879660620769
domInteractive231494171974
firstPaint22182823155204571
backgroundConnect1153371528
firstReactRender3021153133337
getState301370113846
initialActions104111
loadScripts60354678658617759
setupStore1263051423
numNetworkReqs1257719569
WebpackPower User HomeuiStartup14331214215414615271657
load6695931299113661961
domContentLoaded6595861292113647949
domInteractive35171793329123
firstPaint27693977196243670
backgroundConnect1473651626
firstReactRender80421521791101
getState15012620515158177
initialActions103112
loadScripts6565841282111645937
setupStore19953102145
numNetworkReqs1486831354184286
FirefoxBrowserifyStandard HomeuiStartup1260112015129413271462
load106293912237411261187
domContentLoaded106093912237411261187
domInteractive64242414183137
firstPaint------
backgroundConnect4022130184681
firstReactRender22185552331
getState1068481017
initialActions102122
loadScripts103792011987010931160
setupStore1063351023
numNetworkReqs1157016663
BrowserifyPower User HomeuiStartup24721902317427726903005
load1140962167413811351507
domContentLoaded1139956167313811341506
domInteractive12234528109117470
firstPaint------
backgroundConnect983030152119217
firstReactRender82411442092122
getState25192889211290766
initialActions3133337
loadScripts1109939163713311091482
setupStore18511760213231683
numNetworkReqs92522274580213
WebpackStandard HomeuiStartup14371267175212514911724
load1231106214939912891441
domContentLoaded12301061149210012891441
domInteractive61272133881141
firstPaint------
backgroundConnect4018116204299
firstReactRender26198272733
getState1165171119
initialActions103112
loadScripts1206104814719212691381
setupStore136159181034
numNetworkReqs1256818664
WebpackPower User HomeuiStartup26462215326123027943090
load13871212191316914271737
domContentLoaded13871212191316914271737
domInteractive11534501103111423
firstPaint------
backgroundConnect1033154768114218
firstReactRender83451982392115
getState25252835209348740
initialActions4148637
loadScripts13481170188916013931708
setupStore1299676167115596
numNetworkReqs90542113993180

@gauthierpetetin gauthierpetetin merged commit 2347881 into stable Nov 28, 2025
491 of 496 checks passed
@github-actions github-actions bot locked and limited conversation to collaborators Nov 28, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.11.1 Issue or pull request that will be included in release 13.11.1 team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants