Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
298e1bc
Merge branch 'stable' into resolve-conflicts-translations
chloeYue Mar 27, 2026
9303c33
Update Attributions
metamaskbot Mar 27, 2026
cdd198f
Update Attributions
metamaskbot Mar 27, 2026
7c64b95
Merge branch 'release/13.25.0' into resolve-conflicts-translations
chloeYue Mar 27, 2026
5497c97
release(runway): cherry-pick chore: audit brace-expansion cp-13.25.0 …
runway-github[bot] Mar 27, 2026
8bafef2
fix: node forge audit issue cp-13.25.0 (#41297)
bergarces Mar 27, 2026
c2db2d2
chore(release): merge stable into release/13.25.0 (resolve locale con…
chloeYue Mar 27, 2026
12af746
feat: add asset verified badge in swaps asset picker (#41169)
GeorgeGkas Mar 27, 2026
69e6713
fix: hide approvals in batch transactions when simulation fails (#41081)
jpuri Mar 27, 2026
737f832
fix: send flow - update field color for sending to contract alert to …
jpuri Mar 27, 2026
f077800
test: migrate more specs to FixtureBuilderV2 (ppom, send, shield...) …
seaona Mar 27, 2026
3e98c44
fix: flaky test `Add existing token using search renders the balance …
seaona Mar 27, 2026
8eb7345
release: release-changelog/13.25.0 (#41281)
metamaskbot Mar 27, 2026
b79e78e
release(runway): cherry-pick fix: node forge audit issue cp-13.25.0 (…
runway-github[bot] Mar 27, 2026
07f114c
feat: Add support for data services extending `BaseDataService` (#41183)
FrederikBolding Mar 27, 2026
7a99ade
feat: new migration selectors for RatesController (#41232)
bergarces Mar 27, 2026
c8ef374
feat: dapp connection control bar (#40617)
ffmcgee725 Mar 27, 2026
951cb40
chore: remove unused `@metamask/error-reporting-service` (#41301)
cryptodev-2s Mar 27, 2026
33f54c5
fix: cp-13.25.0 update get/buy cta list item styling to match mobile …
nickewansmith Mar 27, 2026
393ac47
chore: filter out native token transfers (#41164)
n3ps Mar 27, 2026
d6a2de1
feat: add real-time dapp phishing scan and enhance hold-to-reveal com…
AugmentedMode Mar 27, 2026
53b6aba
refactor: convert shared/constants/terms.js to TypeScript (#41260)
Copilot Mar 27, 2026
50fa0a4
release: Bump main version to 13.26.0 (#41282)
metamaskbot Mar 27, 2026
e193108
release(runway): cherry-pick fix: cp-13.25.0 update get/buy cta list …
runway-github[bot] Mar 27, 2026
667cb0f
chore: convert setTimeouts to waitForNextUpdate cp-13.25.0 (#41308)
Jwhiles Mar 27, 2026
2aa3fad
chore: remove historicalPrices references (#41242)
bergarces Mar 27, 2026
f530c9b
feat: add hardware wallet recovery MetaMetrics (modal and shared util…
david0xd Mar 27, 2026
5e64b6c
fix: TPSL reset bugs (#41283)
gambinish Mar 27, 2026
f73a848
test: add e2e tests for swap/bridge tx details page (#41269)
micaelae Mar 27, 2026
a255093
release(runway): cherry-pick chore: convert setTimeouts to waitForNex…
runway-github[bot] Mar 27, 2026
b8e1316
chore: update build targets to chrome 113 and firefox 115 (#41170)
davidmurdoch Mar 27, 2026
f21c8d1
ci: removing the "Open in GitHub Codespaces" badge (#41212)
HowardBraham Mar 27, 2026
d6c4b13
refactor: convert shared/lib/rpc.utils.js to TypeScript (level 32) (#…
Copilot Mar 27, 2026
50a000c
chore: point to policy review process in policy updated confirmation …
naugtur Mar 27, 2026
1ef51cc
refactor: convert shared/lib/ui-utils.js to TypeScript (#41264)
Copilot Mar 27, 2026
00dfb67
bump: serialize-javascript to 7.0.5 for yarn audit (#41319)
HowardBraham Mar 27, 2026
49f46cd
bump: mockttp and webpack-dev-server to remove node-forge (#41288)
HowardBraham Mar 27, 2026
ce1a6b6
fix(perps): use preformatted activity amounts in transaction card (#4…
geositta Mar 27, 2026
def6ce0
release(runway): cherry-pick bump: serialize-javascript to 7.0.5 for …
runway-github[bot] Mar 27, 2026
4f50401
release(runway): cherry-pick bump: mockttp and webpack-dev-server to …
runway-github[bot] Mar 27, 2026
ecd923f
chore: remove files that's been converted to typescript (#41323)
DDDDDanica Mar 27, 2026
6058db7
refactor: TypeScript conversion of shared/lib/swaps.utils.js (#41261)
Copilot Mar 27, 2026
299bd11
chore: refactor benchmark platform buildtype (#41217)
DDDDDanica Mar 27, 2026
6212254
feat: add Enter key navigation, migrated to DS and unit test suite - …
smgv Mar 30, 2026
2ee85db
chore: bump accounts dependencies (#41149)
ccharly Mar 30, 2026
110f377
feat: Add legacy support to CancelSpeedup and delete EditGasPopover (…
vinistevam Mar 30, 2026
13894a5
refactor: remove BIP-44 internal logic (#41331)
gantunesr Mar 30, 2026
3132379
refactor: Convert shared/lib/switch-direction.js to TypeScript (#41324)
Copilot Mar 30, 2026
8c7f380
refactor: TypeScript conversion of shared/lib/metamask-controller-uti…
Copilot Mar 30, 2026
38c76da
refactor: convert shared/lib/error-utils.js to TypeScript (#41325)
Copilot Mar 30, 2026
41639c0
refactor: convert shared/constants/tokens.js to TypeScript (#41332)
Copilot Mar 30, 2026
9c1e222
chore: add traffic-light indicators for benchmark performance compari…
DDDDDanica Mar 30, 2026
ab6595c
refactor: convert shared/lib/browser-runtime.utils.js (level 28) to t…
Copilot Mar 30, 2026
8d94415
ci: speedups for some release-related PRs (#41318)
HowardBraham Mar 30, 2026
bb9498a
feat: replaced metamask-earn team with earn in codeowners (#41334)
Matt561 Mar 30, 2026
fa5f8b1
test(webpack): guard MYX warning ignore (#41336)
davidmurdoch Mar 30, 2026
5fb8cd5
ci: fix release version number on stable main sync PR (#41362)
chloeYue Mar 30, 2026
0ef7f84
test: flaky tests due to `importTokenBySearch` (Import Token, Send ER…
seaona Mar 30, 2026
e42a23c
refactor: convert shared/lib/random-id.js to TypeScript (#41330)
Copilot Mar 30, 2026
57824ce
refactor: convert `permissions/background-api.js` to TypeScript (#41359)
Copilot Mar 30, 2026
e3dd93a
refactor: convert `shared/lib/get-first-preferred-lang-code` to TypeS…
Copilot Mar 30, 2026
814d205
chore: update outdated browser warnings (#41063)
davidmurdoch Mar 30, 2026
1eaf56e
refactor: convert `app/scripts/lib/ens-ipfs/contracts/registry.js` to…
Copilot Mar 30, 2026
7a99d2d
refactor: TypeScript conversion of shared/lib/gas.utils (#41263)
Copilot Mar 31, 2026
d87952d
fix: reduce constant re-rendering (#41340)
n3ps Mar 31, 2026
c8478b5
feat: Perps withdraw flow (#41214)
gambinish Mar 31, 2026
3916bf6
chore: Bump Snaps and related dependencies (#41313)
Mrtenz Mar 31, 2026
08aec3e
feat(perps): add limit price warnings for current price and liquidati…
michalconsensys Mar 31, 2026
0abc6e9
test: fix flaky `MetaMask onboarding should prevent network requests…
seaona Mar 31, 2026
efb4de3
feat: analytics pref tracking for social onboarding cp-13.25.0 (#41343)
lwin-kyaw Mar 31, 2026
34eb6aa
test: phishing specs split and fix (#41357)
seaona Mar 31, 2026
84188b5
test: fix flaky `Send ETH - Max Amount adjusts max amount when gas es…
seaona Mar 31, 2026
747fda5
test: Add script to generate feature flag coverage report (#40225)
pnarayanaswamy Mar 31, 2026
dbaaa4f
chore: remove gas fee input hooks and `GasFeeContextProvider` (#41041)
vinistevam Mar 31, 2026
b656e2e
test: fix flaky test `Remove Network: should remove the chainId from …
seaona Mar 31, 2026
9c45072
test: Sync Feature Flag Registry - 2026-03-31 01:33 UTC (#41377)
github-actions[bot] Mar 31, 2026
359d1eb
fix: assets - settings routing loop (#41314)
Copilot Mar 31, 2026
0c969bd
fix(perps): remove locale round-trip from perps inputs to prevent val…
geositta Mar 31, 2026
3756606
feat(perps): display limit orders on market detail screen (#41186)
michalconsensys Mar 31, 2026
750f4b7
fix: improve dapp connection control bar styling (#41390)
ffmcgee725 Mar 31, 2026
1738105
refactor: select hardware to functional components (#40003)
montelaidev Mar 31, 2026
c664bae
chore: add/remove margin adjustments (#41285)
gambinish Mar 31, 2026
f62bf8f
fix: perps close all, cancel all (#41287)
gambinish Mar 31, 2026
7f1c7ac
feat: Add support links (#41286)
gambinish Mar 31, 2026
d68ec43
test: add formatted markdown display for AI-generated test plans in R…
sleepytanya Mar 31, 2026
27a27ba
fix: Can't display position size in $ (#41380)
abretonc7s Mar 31, 2026
6e99d2c
feat(perps): default leverage to 3x for new users, remember last used…
michalconsensys Mar 31, 2026
806ac67
fix: position close designs, partial close bug fix (#41279)
gambinish Mar 31, 2026
2501806
fix: reset bridge page inputs after submitting transaction (#41222)
micaelae Mar 31, 2026
492b4dc
fix(perps): Added an available balance guard for close/modify (#41368)
geositta Apr 1, 2026
f9e5904
refactor(webpack): extract ManifestPlugin zip helpers and make it fas…
davidmurdoch Apr 1, 2026
66aec90
feat: enable webpack e2e in mq (#41374)
itsyoboieltr Apr 1, 2026
a784eb7
feat: localize Contentful banners [GE-56] (#41387)
baptiste-marchand Apr 1, 2026
e1e66b2
release(runway): cherry-pick feat: analytics pref tracking for social…
runway-github[bot] Apr 1, 2026
4da1e31
feat: replace legacy settings with settings v2 (#41194)
NidhiKJha Apr 1, 2026
4490e1a
test: flaky subpath add delay (#41400)
seaona Apr 1, 2026
37a96ca
fix: asset list and select quotes list improvements (#41155)
GeorgeGkas Apr 1, 2026
d304b15
ci: fix post-nightly-builds Slack script (#41413)
chloeYue Apr 1, 2026
e40e8c1
refactor: remove `getIsMultichainAccountsState2Enabled` selector and …
vinistevam Apr 1, 2026
8520968
bump: update @metamask/transaction-controller to version 63.3.0 (#41240)
jpuri Apr 1, 2026
205a421
fix: settings design fixes (#41414)
NidhiKJha Apr 1, 2026
0d0448f
fix: update legacy tooltip icon color for Firefox compatibility (#41404)
nickewansmith Apr 1, 2026
23eef3f
chore: tweak survey banner (#41403)
n3ps Apr 1, 2026
084a8a9
feat: post-transaction toast notification (#40886)
n3ps Apr 1, 2026
fa1557b
refactor(ui): migrate download mobile modal to design-system-react (#…
georgewrmarshall Apr 1, 2026
6d0205a
fix: review permissions displays incorrect networks (#41236)
ffmcgee725 Apr 1, 2026
f3106df
feat: added export your data button (#41427)
NidhiKJha Apr 1, 2026
f7b9263
chore: bump `@metamask-tron-snap-wallet` to `^1.25.0` (#41103)
mikesposito Apr 1, 2026
dcd895a
feat(bridge): add data-asset-id for bridge asset rows and chips (#41369)
rarquevaux Apr 1, 2026
45a01d5
chore(deps): upgrade @metamask/design-system-react to 0.12.0 (#41367)
georgewrmarshall Apr 1, 2026
0b94eec
fix: localized connect message (#41417)
montelaidev Apr 1, 2026
021d11e
Merge pull request #41280 from MetaMask/release/13.25.0
chloeYue Apr 2, 2026
19f4417
Merge origin/main into stable-main-13.26.0
metamaskbot Apr 2, 2026
7ee9d56
bump: lodash and lodash-es to fix audit (#41434)
HowardBraham Apr 2, 2026
45b590d
Merge branch 'main' into stable-main-13.26.0
chloeYue Apr 2, 2026
3dd27e2
Merge pull request #41433 from MetaMask/stable-main-13.26.0
metamaskbotv2[bot] Apr 2, 2026
b82d5b2
refactor: convert `app/scripts/lib/ens-ipfs/contracts/resolver.js` to…
Copilot Apr 2, 2026
f47ee32
feat: set Sentry user id (#40491)
gauthierpetetin Apr 2, 2026
8125dd2
test: fix flaky test `Settings Redirects to ENS domains when user inp…
seaona Apr 2, 2026
bd6c25a
test: Pass new input for Feature Flag Sync PROD job (#41382)
LeVinhGithub Apr 2, 2026
97b8159
refactor: migrate onboarding import-srp and password-outdated-modal u…
smgv Apr 2, 2026
7559485
fix(accounts): prevent crash when account tree references orphaned ac…
gantunesr Apr 2, 2026
7e59505
refactor: convert shared/lib/transactions-controller-utils to TypeScr…
Copilot Apr 2, 2026
e4d0c5f
refactor: convert shared/lib/object.utils to TypeScript (#41329)
Copilot Apr 2, 2026
85081c2
chore: bump @metamask/hw-wallet-sdk (#41443)
david0xd Apr 2, 2026
a6803cd
feat: bump snap bitcoin 1.10.1 (#41422)
cloudonshore Apr 2, 2026
7d06f06
feat: add account ordering to Multichain API (#41068)
jiexi Apr 2, 2026
ace1318
fix(ui): reload extension safely from error Try again in popup (#41364)
gauthierpetetin Apr 2, 2026
8ce58c1
fix: flaky test multi-SRP Reveal Imported SRP (#41438)
Unik0rnMaggie Apr 2, 2026
2e751b8
feat: port mobile A/B testing skill (#41306)
bfullam Apr 2, 2026
68fd19c
fix: design updates in settings (#41440)
NidhiKJha Apr 2, 2026
6b1e342
feat: Add hardware wallet MetaMetrics tracking for recovery flow (#41…
david0xd Apr 2, 2026
5cc482e
chore: remove useBlockie (#40544)
n3ps Apr 2, 2026
4dbf60e
refactor: add useBoolean hook (#41432)
n3ps Apr 2, 2026
76b83c1
ci: add GH_TOKEN to get-requirements.yml (#41459)
HowardBraham Apr 2, 2026
f34f804
release: Bump main version to 13.27.0 (#41458)
metamaskbot Apr 2, 2026
c316fb3
ci(perf): Add Core Web Vitals measurement to benchmarks (INP, LCP, CL…
MajorLift Apr 2, 2026
e5f91ea
fix: leverage not displayed in position details
abretonc7s Apr 3, 2026
acdc130
fix: display leverage in perps position details
abretonc7s Apr 3, 2026
e3d2dbe
fix(perps): combine direction and leverage into single row
abretonc7s Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
111 changes: 111 additions & 0 deletions .agents/skills/ab-testing-implementation/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
name: ab-testing-implementation
description: Implement and review MetaMask Extension A/B tests using the canonical repository standard. Use for any task that adds or modifies A/B test flags, variant configs, useABTest usage, analytics payloads, or A/B-test-related tests and docs.
---

# A/B Testing Implementation

Canonical workflow for implementing and reviewing MetaMask Extension A/B
tests.

Do not use this skill for general analytics work that does not involve A/B
test flags, `useABTest`, `active_ab_tests`, or related tests/docs.

## Required Response Sections

1. `Implementation Checklist`
2. `Files To Modify`
3. `Analytics Payload Changes`
4. `Tests To Run`
5. `Compliance Check Result`

## Agent Execution Standard

For implementation or review tasks, follow this workflow:

1. Run discovery before edits.

```bash
rg -n "useABTest\\(|active_ab_tests|ab_tests|Abtest|feature-flag-registry|RemoteFeatureFlagController" app shared ui test docs
rg -n "Experiment Viewed|ExperimentViewed" app shared ui
```

2. Confirm the intended experiment shape.
- Use a threshold-array remote flag value for production defaults.
- Keep reused variants or metadata centralized in a config module when
multiple files need the same definitions.
- Use the same experiment key format as mobile:
`{teamName}{ticketId}Abtest{TestName}`.
3. Implement the assignment logic correctly.
- Prefer `useABTest(flagKey, variants)` and keep a `control` variant in
the variants object.
- Use `variantName` and `isActive` from the hook for business-event
instrumentation.
- If assignment is missing, invalid, or unresolved, the hook falls back
to `control` and `isActive: false`.
4. Implement analytics correctly.
- Rely on `useABTest` for the automatic `Experiment Viewed` exposure
event.
- Add `active_ab_tests` only to business events, and only when the
assignment is active.
- Never add new `ab_tests:` payloads. If a legacy touchpoint cannot be
migrated in the same change, keep the line annotated with
`LEGACY_AB_TEST_ALLOWED` and explain why.
5. Use the canonical event payload shapes.

```typescript
const experiment = useABTest('swapsSWAPS4135AbtestNumpadQuickAmounts', {
control: { buttons: [25, 50, 75, 'MAX'] },
treatment: { buttons: [50, 75, 90, 'MAX'] },
});

const activeABTests = experiment.isActive
? [
{
key: 'swapsSWAPS4135AbtestNumpadQuickAmounts',
value: experiment.variantName,
},
]
: undefined;
```

6. Update tests and fixtures when behavior or flag plumbing changes.
- Register every new remote A/B test flag in
`test/e2e/feature-flags/feature-flag-registry.ts` with the production
default threshold-array JSON value.
- Use test overrides such as `manifestFlags.remoteFeatureFlags` or
`FixtureBuilder.withRemoteFeatureFlags(...)` when a test needs
deterministic assignment.
- If the change is copy-only or config-only, you may skip new tests with a brief rationale.
7. Run the A/B compliance checker using the repository's current supported
invocation and report the result.
- Checker path:
`.agents/skills/ab-testing-implementation/scripts/check-ab-testing-compliance.ts`

```bash
# Current pre-commit / local implementation example
node --import tsx .agents/skills/ab-testing-implementation/scripts/check-ab-testing-compliance.ts --staged

# Current review-mode / explicit file set example
node --import tsx .agents/skills/ab-testing-implementation/scripts/check-ab-testing-compliance.ts --files app/path/to/file.ts,test/path/to/file.spec.ts --base origin/main
```

## Review Checklist

- Confirm `useABTest` always has a `control` variant.
- Confirm `Experiment Viewed` is not emitted manually when `useABTest` is in
use.
- Confirm business events use `active_ab_tests` rather than `ab_tests`.
- Confirm E2E flag registration and local test overrides remain production-accurate.
- Confirm the compliance checker result is included in the final response.

## Related Files

- `ui/hooks/useABTest.ts`
- `ui/hooks/useABTest.test.ts`
- `ui/selectors/remote-feature-flags.ts`
- `shared/constants/metametrics.ts`
- `test/e2e/feature-flags/feature-flag-registry.ts`

Use `docs/ab-testing.md` only when you need deeper background, additional
examples, FAQ answers, or local override guidance beyond this workflow.
4 changes: 4 additions & 0 deletions .agents/skills/ab-testing-implementation/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "A/B Test Implementation"
short_description: "Implement and validate extension A/B tests."
default_prompt: "Use $ab-testing-implementation to implement or review an A/B test with the extension's canonical useABTest and active_ab_tests standards."
Loading
Loading