Skip to content

Commit f9ccf4f

Browse files
chore: release: 7.74.0 (#28948)
# 🚀 v7.74.0 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 - [x] Accounts Framework - [x] Assets - [x] Card - [x] Confirmations - [x] Core Extension UX - [x] Core Platform - [x] Design System - [x] Earn - [x] Engagement - [x] Mobile Platform - [x] Mobile UX - [x] Money Movement - [x] Networks - [x] Onboarding - [x] Perps - [x] Predict - [x] Rewards - [x] Social AI - [x] Swaps And Bridge - [x] Transactions - [x] Wallet Integrations 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 - Testing plan sheet - https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?gid=404070372#gid=404070372 <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Touches release/CI automation (runner images, new composite action, smart E2E selection behavior) and Android test dependencies/Braze push handling, which can affect build stability and E2E reliability despite limited product-code changes. > > **Overview** > Bumps the app to **v7.74.0** (Android `versionName`/`versionCode`) and adds the `7.74.0` release notes + updated compare links in `CHANGELOG.md`. > > Reworks **release/CI automation**: introduces a local composite action `setup-e2e-env`, switches most iOS jobs to Cirrus `macos-runner:tahoe` + Xcode `26.3`, updates Smart E2E selection to *skip AI and force full E2E* on `release/*` PRs, adds new smoke suites for `SmokeSeedlessOnboarding`, and updates RC auto-builds to trigger whenever a release branch has an open PR and to post an **AI-generated test plan** (removing the old `generate-rc-test-plan` workflow). Also adds a temporary `temp-bitrise-ios-e2e` POC workflow plus a `use_bitrise_runner` toggle for iOS E2E jobs. > > Tightens **testing/tooling and ownership**: bans external Jest snapshots (`toMatchSnapshot()`), migrates several component tests away from snapshot assertions and deletes `.snap` files, updates ESLint rules (including banning the JS `in` operator in perps/core-sync-relevant paths), adds CODEOWNERS entries for Social/AI, and adds an agent skill doc for syncing perps controller to core. > > Makes a few **platform/build fixes**: pins/excludes Espresso deps from Detox androidTest to avoid incompatibilities, adjusts a Braze yarn patch to prevent debug deps leaking to consumers, and updates Android `MainActivity`/Braze config to populate push payload and allow automatic push deep link handling. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 4fcf97c. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
2 parents 980fd8b + 46e2208 commit f9ccf4f

2,594 files changed

Lines changed: 139325 additions & 391537 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
---
2+
name: perps-core-sync
3+
description: Sync the perps controller from mobile to the core monorepo with change detection, automated validation, failure resolution, and post-sync commit guidance. Use after perps controller changes land in mobile.
4+
---
5+
6+
# Perps Core Sync
7+
8+
## Purpose
9+
10+
Use this skill to sync `app/controllers/perps/` from mobile to `packages/perps-controller/src/` in the core monorepo. The sync is driven by `scripts/perps/validate-core-sync.sh` — a 9-step pipeline (preflight, conflict check, copy, install, verify, eslint fix, build, lint, write sync state).
11+
12+
Use when:
13+
14+
- New commits touch `app/controllers/perps/` since the last sync
15+
- A perps PR is merged and needs to propagate to core
16+
- You need to verify mobile changes are core-compatible before pushing
17+
18+
Do not use when:
19+
20+
- Changes are UI-only (`app/components/UI/Perps/`) — these don't sync
21+
- Changes are test-only (`*.test.ts`) — tests are excluded from sync
22+
- The core repo is not checked out locally
23+
24+
## Pre-Sync: Detect Changes
25+
26+
Read the sync state from core to find what changed since the last sync:
27+
28+
```bash
29+
cat <core-path>/packages/perps-controller/.sync-state.json
30+
```
31+
32+
Extract `lastSyncedMobileCommit` and run:
33+
34+
```bash
35+
# Commits since last sync
36+
git log <lastSyncedMobileCommit>..HEAD --oneline -- app/controllers/perps/
37+
38+
# File-level summary (excluding tests)
39+
git diff <lastSyncedMobileCommit>..HEAD --stat -- app/controllers/perps/ ':!*.test.ts'
40+
```
41+
42+
Pay special attention to:
43+
44+
- **New files** — need exports wired in core's `index.ts`, may need `tsconfig` references or new dependencies
45+
- **Deleted files** — rsync `--delete` handles removal, but verify no stale imports remain in core
46+
- **Changes to `PerpsPlatformDependencies`** — DI interface changes affect extension consumers
47+
- **Public API changes** — state shape, method signatures, event names affect all consumers
48+
49+
## Execute Sync
50+
51+
```bash
52+
bash scripts/perps/validate-core-sync.sh --core-path <core-path>
53+
```
54+
55+
Options:
56+
57+
- `--skip-build` — skip the build step for faster iteration when debugging lint/copy issues
58+
- `--skip-test` — skip the test step for faster iteration
59+
- `--verbose` — show full output for every step (useful for debugging)
60+
61+
The script runs these 12 steps in order:
62+
63+
| Step | What it does |
64+
| ----------------------- | --------------------------------------------------------------------------------------- |
65+
| 1. Pre-flight checks | Confirms mobile source, core destination, required tools |
66+
| 2. Conflict check | Fetches origin/main, checks for upstream perps-controller changes, validates sync state |
67+
| 3. Copy source files | rsync `.ts` files (excluding tests, mocks, fixtures) |
68+
| 4. Install dependencies | `yarn install` in core |
69+
| 5. Verify build fixes | Checks for `__DEV__`, mobile imports, closure fixes |
70+
| 6. ESLint auto-fix | Runs `--fix`, `--suppress-all`, `--prune-suppressions`, checks suppression delta |
71+
| 7. Format fix (oxfmt) | Runs `yarn lint:misc --write` — core uses oxfmt, not prettier |
72+
| 8. Build | `yarn workspace @metamask/perps-controller build` |
73+
| 9. Lint | Final lint pass to confirm zero violations |
74+
| 10. Test | `yarn workspace @metamask/perps-controller test` — catches DI/fixture mismatches |
75+
| 11. Changelog check | Verifies `CHANGELOG.md` has been updated (core CI requirement) |
76+
| 12. Write sync state | Updates `.sync-state.json` with commit hashes and checksum |
77+
78+
## Failure Resolution
79+
80+
| Failure | Cause | Fix |
81+
| -------------------------------------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
82+
| `__DEV__` found | Mobile code uses `__DEV__` guard | Replace with `false` in the mobile source file, or route through `PerpsPlatformDependencies` for environment-aware behavior. Fix in mobile, then re-sync. |
83+
| Mobile imports (Engine, react-native, Sentry, DevLogger) | Direct platform import in controller | Route through `PerpsPlatformDependencies` (DI). All platform services must come through the `infrastructure` constructor param. Fix in mobile. |
84+
| Suppression delta increase | Sync introduces new ESLint violations | Fix violations in mobile first (e.g., `'x' in y``hasProperty(y, 'x')` from `@metamask/utils`). Re-run sync after fixing. |
85+
| Build failure | Missing tsconfig references, missing dependencies, type errors | Check `packages/perps-controller/tsconfig.json` references. Ensure new imports have corresponding `dependencies` in `package.json`. |
86+
| Lint failure after fix | Auto-fix didn't resolve all issues | Re-run the eslint fix step. If persistent, check for new rule violations that need manual fixes in mobile. |
87+
| Format fix failure | oxfmt can't auto-fix some files | Check for syntax errors that prevent parsing. Core uses `oxfmt` (not prettier) for TS formatting. |
88+
| Test failure | Test fixtures missing new DI dependencies | Add mocks for new `PerpsPlatformDependencies` fields (e.g., `diskCache`) in `tests/defer-eligibility.test.ts`. |
89+
| Changelog check failure | `CHANGELOG.md` not updated | Add entries under `## [Unreleased]` with `### Added`, `### Fixed`, `### Changed` sections linking to the PR. |
90+
| Conflict check: behind origin/main | Someone pushed perps-controller changes to main | `cd <core-path> && git merge origin/main` before re-running sync. |
91+
| Conflict check: checksum mismatch | Core source was hand-edited since last sync | Review the edits. Either port them back to mobile or discard and re-sync. |
92+
93+
## Post-Sync
94+
95+
After all 12 steps pass:
96+
97+
1. **Review the diff in core:**
98+
99+
```bash
100+
cd <core-path> && git diff --stat
101+
```
102+
103+
2. **Update `CHANGELOG.md`** before committing. Core CI requires entries under `## [Unreleased]`. Sections must follow [Keep a Changelog](https://keepachangelog.com/) order:
104+
105+
```
106+
### Added — new features, exports, files
107+
### Changed — refactors, dependency bumps
108+
### Deprecated — soon-to-be-removed features
109+
### Removed — removed features
110+
### Fixed — bug fixes
111+
### Security — vulnerability fixes
112+
```
113+
114+
Each entry must link to the PR: `([#NNNN](https://github.com/MetaMask/core/pull/NNNN))`.
115+
Validate locally: `yarn workspace @metamask/perps-controller changelog:validate`
116+
117+
3. **Commit in core** with conventional format:
118+
119+
```
120+
feat(perps): sync controller from mobile
121+
122+
Syncs app/controllers/perps/ from mobile commit <short-hash>.
123+
124+
Changes:
125+
- <summarize key changes from the pre-sync commit list>
126+
```
127+
128+
4. **Verify `.sync-state.json` was updated** — it should contain the current mobile HEAD commit.
129+
130+
5. **Check suppression count** — if non-zero, note it in the PR description. Target is zero suppressions.
131+
132+
6. **Use `--verbose` when debugging** — without it, step output is captured to temp files and only shown on failure. With `--verbose`, all output streams to the terminal.
133+
134+
## Portability Rules
135+
136+
Reference: `docs/perps/perps-review-antipatterns.md` (Controller Portability section).
137+
138+
- **No `__DEV__`** — must not appear in controller files. Core has no React Native dev mode.
139+
- **No mobile imports** — no `react-native`, `Engine`, `Sentry`, `DevLogger`. Everything through `PerpsPlatformDependencies` DI.
140+
- **No direct controller imports from app code** — app files must import from `@metamask/perps-controller`, not relative paths.
141+
- **Public API = publisher contract** — changing state shape, method signatures, or event names affects extension consumers. Coordinate breaking changes.
142+
- **New dependencies must be in DI interface** — controller code must not reach outside its boundary.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface:
2+
display_name: "Core Sync"
3+
short_description: "Sync perps controller from mobile to core monorepo."
4+
default_prompt: "Use $perps-core-sync to detect changes and sync app/controllers/perps/ to core."

.agents/skills/pr-codeowners/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ description: Identify code owners for changed files and map them to Slack group
3838
| wallet-api-platform | wallet-integrations-team |
3939
| ramp | ramp-team |
4040
| predict | predict-team |
41+
| social-ai | social-ai-team |
4142
| rewards | rewards-team |
4243
| design-system-engineers | metamask-design-system-team |
4344
| core-platform | core-platform-team |

.claude/commands/unit-test.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,18 @@
55
## Steps
66

77
1. **Get changed files**
8-
98
- Run `git diff --name-only --diff-filter=ACMR` for all changes (staged + unstaged)
109
- Filter for `.js`, `.jsx`, `.ts`, `.tsx` files
1110
- Display list
1211

1312
2. **Find test files**
14-
1513
- Check if file is already a test file (contains `.test.`)
1614
- For source files, find related tests: `{basename}.test.{ext}`
1715
- Exclude snapshots (`.snap`)
1816
- Collect unique test files
17+
- **Flag any `toMatchSnapshot()` calls found** — these are banned; note them for migration to explicit assertions or `toMatchInlineSnapshot()`
1918

2019
3. **Run tests**
21-
2220
- Execute `yarn jest` with all found test files
2321
- Run without coverage
2422
- Capture results
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
name: perps-core-sync
3+
summary: Sync perps controller from mobile to core monorepo with change detection.
4+
---
5+
6+
Follow `.agents/skills/perps-core-sync/SKILL.md`.

.cursor/rules/ui-development-guidelines.mdc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,19 @@ Always prioritize @metamask/design-system-react-native components and Tailwind C
1717
**Before writing any new component or choosing what to use, ask: "Does @metamask/design-system-react-native have this?"**
1818

1919
1. **FIRST**: Use `@metamask/design-system-react-native` components
20-
- **Always use for**: Box (layout), Text (typography), Button/ButtonBase/ButtonIcon, Icon, Checkbox
20+
- **Always use for**: Box (layout), Text, SensitiveText, TextButton (inline links only)
21+
- **Always use for**: Button, ButtonBase, ButtonIcon, ButtonSemantic, Icon, Checkbox, RadioButton
2122
- **Always use for**: Avatar variants (Account, Base, Favicon, Group, Icon, Network, Token)
2223
- **Always use for**: Badge variants (Count, Icon, Network, Status, Wrapper)
24+
- **Always use for**: BottomSheet, BottomSheetFooter, BottomSheetHeader, BottomSheetDialog, BottomSheetOverlay
25+
- **Always use for**: HeaderBase, HeaderRoot, HeaderSearch, HeaderStandard
26+
- **Always use for**: BannerAlert, Card, ListItem, Skeleton, Label, Input, TextField
27+
- **Always use for**: KeyValueRow, KeyValueColumn, ActionListItem, MainActionButton, TabEmptyState
28+
2329
- **Rule**: If it exists in the design system, you MUST use it
2430

2531
2. **SECOND**: Use `app/component-library` ONLY if design system lacks it
26-
- **Use for**: BottomSheet, Tabs, Headers, ListItems, Skeleton, Tags, Modal, Overlay, Toast, RadioButton, etc.
32+
- **Use for**: Tabs, Tags, Cells, Modal, Overlay, Toast, Pickers, Select, Sheet/SheetHeader, etc.
2733
- **Rule**: These are MetaMask-specific implementations not (yet) in the design system
2834
- **Important**: component-library components should themselves use design system primitives internally
2935

@@ -40,10 +46,12 @@ Always prioritize @metamask/design-system-react-native components and Tailwind C
4046
### Decision Tree
4147
```
4248
Need a component?
43-
├─ Is it Box, Text, Button, Icon, Avatar, Badge, or Checkbox?
49+
├─ Is it Box, Text, Button, Icon, Avatar, Badge, Checkbox, RadioButton,
50+
│ BottomSheet, Header, BannerAlert, Card, ListItem, Skeleton, Label,
51+
│ TextField, Input, KeyValueRow, SensitiveText, TextButton, or ActionListItem?
4452
│ └─ YES → Use @metamask/design-system-react-native [STOP]
4553
46-
├─ Is it BottomSheet, Tabs, Header, ListItem, Skeleton, Tag, Modal, etc?
54+
├─ Is it Tabs, Tags, Cells, Modal, Overlay, Toast, Pickers, Select, Sheet?
4755
│ └─ YES → Use app/component-library [STOP]
4856
4957
├─ Is it feature-specific UI (e.g., BridgeInputSelector, StakeInputView)?

0 commit comments

Comments
 (0)