@deeeed/metamask-harness 0.47.4 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +3 -2
- package/adapters/extension/lib/macos-focus.cjs +2 -2
- package/adapters/extension/live.sh +6 -8
- package/adapters/mobile/bridge-runtime/lib/bridge-errors.cjs +1 -0
- package/adapters/shared/ensure-runner-deps.sh +6 -0
- package/dist/adapters/extension/runtime-decision.js +18 -1
- package/dist/adapters/extension/runtime.js +5 -5
- package/dist/adapters/extension/surface.js +1 -0
- package/dist/app-lifecycle.js +3 -1
- package/dist/command-contract.js +2 -0
- package/dist/commands/call.js +1 -8
- package/dist/commands/device-target.js +12 -3
- package/dist/commands/doctor.js +7 -5
- package/dist/commands/fixtures.js +1 -1
- package/dist/commands/help.js +17 -5
- package/dist/commands/launch/index.js +10 -0
- package/dist/commands/manifest.js +3 -1
- package/dist/commands/mobile-device-view.js +13 -3
- package/dist/commands/parse-args.js +2 -0
- package/dist/commands/run-engine.js +29 -4
- package/dist/commands/run.js +1 -1
- package/dist/commands/runtime-launch.js +10 -1
- package/dist/commands/status.js +8 -4
- package/dist/devices.js +31 -9
- package/dist/execution-provenance.js +8 -7
- package/dist/funding-execution-context.js +62 -17
- package/dist/heal-bounds.js +3 -3
- package/dist/live-adapter-contract.js +4 -0
- package/dist/manifest.js +2 -13
- package/dist/metamask-action-validation.js +3 -2
- package/dist/mm-harness-cli.js +4 -2
- package/dist/runner.js +14 -3
- package/docs/RECIPES.md +135 -24
- package/docs/RELEASE-QA-CAPABILITY-MAP.md +3 -2
- package/library/actions/core/perps/_controller.mjs +24 -24
- package/library/actions/core/perps/assert_orders.mjs +3 -5
- package/library/actions/core/perps/assert_positions.mjs +3 -5
- package/library/actions/core/perps/close_orders.mjs +39 -19
- package/library/actions/core/perps/close_positions.mjs +53 -12
- package/library/actions/core/perps/edit_order.mjs +2 -0
- package/library/actions/core/perps/ensure_orders.mjs +3 -4
- package/library/actions/core/perps/ensure_positions.mjs +4 -5
- package/library/actions/core/perps/place_order.mjs +7 -14
- package/library/actions/core/perps/read_account.mjs +2 -0
- package/library/actions/core/perps/read_orders.mjs +2 -0
- package/library/actions/core/perps/read_positions.mjs +3 -1
- package/library/actions/core/perps/read_snapshot.mjs +3 -0
- package/library/actions/core/perps/start_state.mjs +3 -14
- package/library/actions/core/perps/teardown_state.mjs +3 -14
- package/library/actions/core/perps/update_position_tpsl.mjs +13 -19
- package/library/actions/core/wallet/list_accounts.mjs +3 -0
- package/library/actions/extension/analytics/consent.mjs +2 -0
- package/library/actions/extension/analytics/set_consent.mjs +2 -0
- package/library/actions/extension/assets/home-token-identity.mjs +31 -0
- package/library/actions/extension/assets/import_custom_token.mjs +63 -79
- package/library/actions/extension/assets/open_details.mjs +19 -7
- package/library/actions/extension/assets/prepare_send.mjs +1 -0
- package/library/actions/extension/assets/read_details.mjs +62 -29
- package/library/actions/extension/assets/read_visible_state.mjs +5 -1
- package/library/actions/extension/assets/review_send.mjs +1 -0
- package/library/actions/extension/assets/select_network_scope.mjs +17 -9
- package/library/actions/extension/assets/send.mjs +2 -0
- package/library/actions/extension/assets/set_custom_gas.mjs +1 -0
- package/library/actions/extension/assets/set_token_visibility.mjs +86 -17
- package/library/actions/extension/assets/verify_sorting.mjs +63 -14
- package/library/actions/extension/deeplink/open.mjs +1 -0
- package/library/actions/extension/networks/add_chainlist.mjs +2 -0
- package/library/actions/extension/networks/add_custom.mjs +21 -17
- package/library/actions/extension/networks/custom_network.mjs +10 -3
- package/library/actions/extension/networks/read_visible_state.mjs +2 -0
- package/library/actions/extension/networks/remove_custom.mjs +1 -0
- package/library/actions/extension/performance/_navigation-memory.mjs +37 -6
- package/library/actions/extension/performance/compare_idle_navigation_memory.mjs +5 -2
- package/library/actions/extension/performance/measure_detached_dom.mjs +5 -2
- package/library/actions/extension/performance/measure_navigation_memory.mjs +5 -2
- package/library/actions/extension/perps/assert_orders.mjs +1 -0
- package/library/actions/extension/perps/assert_positions.mjs +1 -0
- package/library/actions/extension/perps/assert_visible_consistency.mjs +11 -4
- package/library/actions/extension/perps/close_orders.mjs +4 -1
- package/library/actions/extension/perps/close_positions.mjs +1 -0
- package/library/actions/extension/perps/close_visible_position.mjs +160 -11
- package/library/actions/extension/perps/compare_provider_market.mjs +2 -0
- package/library/actions/extension/perps/edit_margin.mjs +3 -1
- package/library/actions/extension/perps/ensure_orders.mjs +1 -0
- package/library/actions/extension/perps/ensure_positions.mjs +1 -0
- package/library/actions/extension/perps/mutation-receipt.mjs +54 -3
- package/library/actions/extension/perps/open_balance_action.mjs +17 -7
- package/library/actions/extension/perps/open_position_action.mjs +1 -0
- package/library/actions/extension/perps/perps.mjs +550 -69
- package/library/actions/extension/perps/place_order.mjs +1 -0
- package/library/actions/extension/perps/read_eligibility.mjs +1 -0
- package/library/actions/extension/perps/read_funds_confirmation.mjs +10 -0
- package/library/actions/extension/perps/read_orders.mjs +1 -0
- package/library/actions/extension/perps/read_positions.mjs +1 -0
- package/library/actions/extension/perps/read_snapshot.mjs +4 -1
- package/library/actions/extension/perps/read_visible_state.mjs +12 -6
- package/library/actions/extension/perps/search_markets.mjs +8 -2
- package/library/actions/extension/perps/select_activity_filter.mjs +2 -1
- package/library/actions/extension/perps/select_market_filter.mjs +75 -45
- package/library/actions/extension/perps/set_market_favorite.mjs +7 -3
- package/library/actions/extension/perps/state.mjs +2 -0
- package/library/actions/extension/perps/update_position_tpsl.mjs +3 -1
- package/library/actions/extension/perps/visible-mutation-identity.mjs +6 -2
- package/library/actions/extension/platform/cdp.mjs +50 -142
- package/library/actions/extension/settings/set_basic_functionality.mjs +1 -0
- package/library/actions/extension/swap_bridge/quote-state.mjs +56 -0
- package/library/actions/extension/swap_bridge/read_visible_state.mjs +5 -1
- package/library/actions/extension/swap_bridge/select_assets.mjs +12 -1
- package/library/actions/extension/swap_bridge/set_amount.mjs +11 -8
- package/library/actions/extension/swap_bridge/set_max_amount.mjs +18 -18
- package/library/actions/extension/swap_bridge/set_slippage.mjs +1 -9
- package/library/actions/extension/ui/locators.mjs +1 -0
- package/library/actions/extension/ui/navigate.mjs +60 -14
- package/library/actions/extension/wallet/ensure_unlocked.mjs +2 -0
- package/library/actions/extension/wallet/import.mjs +2 -0
- package/library/actions/extension/wallet/list_accounts.mjs +1 -0
- package/library/actions/extension/wallet/lock.mjs +4 -1
- package/library/actions/extension/wallet/read_state.mjs +1 -0
- package/library/actions/extension/wallet/reset.mjs +2 -0
- package/library/actions/extension/wallet/secret-input.mjs +2 -0
- package/library/actions/extension/wallet/select_account.mjs +2 -0
- package/library/actions/extension/wallet/setup.mjs +1 -0
- package/library/actions/extension/wallet/state.mjs +2 -0
- package/library/actions/extension/wallet/visible-session.mjs +2 -0
- package/library/actions/mobile/analytics/consent-settings.mjs +1 -0
- package/library/actions/mobile/analytics/set_consent.mjs +1 -0
- package/library/actions/mobile/app/network-control.mjs +2 -0
- package/library/actions/mobile/app/network.mjs +1 -0
- package/library/actions/mobile/app/network_assert.mjs +1 -0
- package/library/actions/mobile/app/network_capture.mjs +1 -0
- package/library/actions/mobile/assets/import_custom_token.mjs +3 -0
- package/library/actions/mobile/assets/open_details.mjs +1 -0
- package/library/actions/mobile/assets/read_details.mjs +1 -0
- package/library/actions/mobile/assets/read_visible_state.mjs +4 -1
- package/library/actions/mobile/assets/set_token_visibility.mjs +15 -9
- package/library/actions/mobile/assets/verify_sorting.mjs +90 -7
- package/library/actions/mobile/deeplink/open.mjs +1 -0
- package/library/actions/mobile/networks/add_custom.mjs +1 -0
- package/library/actions/mobile/networks/network-management.mjs +23 -15
- package/library/actions/mobile/networks/read_visible_state.mjs +1 -0
- package/library/actions/mobile/networks/remove_custom.mjs +7 -2
- package/library/actions/mobile/perps/assert_orders.mjs +1 -0
- package/library/actions/mobile/perps/assert_positions.mjs +1 -0
- package/library/actions/mobile/perps/capture_performance.mjs +1 -0
- package/library/actions/mobile/perps/close_orders.mjs +1 -0
- package/library/actions/mobile/perps/close_positions.mjs +1 -0
- package/library/actions/mobile/perps/ensure_orders.mjs +1 -0
- package/library/actions/mobile/perps/ensure_positions.mjs +1 -0
- package/library/actions/mobile/perps/measure_homepage_visible.mjs +1 -0
- package/library/actions/mobile/perps/performance-capture.mjs +2 -0
- package/library/actions/mobile/perps/perps.mjs +8 -1
- package/library/actions/mobile/perps/place_order.mjs +1 -0
- package/library/actions/mobile/perps/prepare_local_snapshot_endpoint.mjs +2 -0
- package/library/actions/mobile/perps/read-visible-state-loop.mjs +3 -0
- package/library/actions/mobile/perps/read_orders.mjs +1 -0
- package/library/actions/mobile/perps/read_positions.mjs +1 -0
- package/library/actions/mobile/perps/read_visible_state.mjs +1 -0
- package/library/actions/mobile/perps/search_markets.mjs +1 -0
- package/library/actions/mobile/perps/set_market_favorite.mjs +17 -19
- package/library/actions/mobile/platform/bridge.mjs +16 -4
- package/library/actions/mobile/platform/native-session-name.mjs +1 -0
- package/library/actions/mobile/platform/native-session.mjs +28 -17
- package/library/actions/mobile/platform/observe-ui.mjs +4 -2
- package/library/actions/mobile/platform/tool-paths.mjs +1 -0
- package/library/actions/mobile/swap_bridge/native-session.mjs +1 -0
- package/library/actions/mobile/swap_bridge/read_visible_state.mjs +1 -0
- package/library/actions/mobile/swap_bridge/select_assets.mjs +2 -0
- package/library/actions/mobile/swap_bridge/set_amount.mjs +1 -0
- package/library/actions/mobile/swap_bridge/set_max_amount.mjs +1 -0
- package/library/actions/mobile/swap_bridge/set_slippage.mjs +1 -0
- package/library/actions/mobile/swap_bridge/submit_transaction.mjs +2 -0
- package/library/actions/mobile/ui/locators.mjs +1 -0
- package/library/actions/mobile/ui/native-navigation.mjs +2 -0
- package/library/actions/mobile/ui/navigate.mjs +3 -1
- package/library/actions/mobile/wallet/ensure_unlocked.mjs +2 -0
- package/library/actions/mobile/wallet/home.mjs +1 -0
- package/library/actions/mobile/wallet/import.mjs +2 -0
- package/library/actions/mobile/wallet/list_accounts.mjs +1 -0
- package/library/actions/mobile/wallet/lock.mjs +1 -0
- package/library/actions/mobile/wallet/native-ui.mjs +2 -0
- package/library/actions/mobile/wallet/read_state.mjs +2 -0
- package/library/actions/mobile/wallet/reset-helper.mjs +1 -0
- package/library/actions/mobile/wallet/reset.mjs +1 -0
- package/library/actions/mobile/wallet/select_account.mjs +2 -0
- package/library/actions/mobile/wallet/setup.mjs +2 -0
- package/library/actions/shared/analytics/assert_events.mjs +3 -0
- package/library/actions/shared/analytics/consent.mjs +3 -0
- package/library/actions/shared/analytics/read_events.mjs +2 -0
- package/library/actions/shared/analytics/start_capture.mjs +3 -0
- package/library/actions/shared/app/network-artifact.mjs +2 -0
- package/library/actions/shared/app/network-assert.mjs +2 -0
- package/library/actions/shared/assets/visible-state.mjs +2 -0
- package/library/actions/shared/deeplink/url.mjs +3 -0
- package/library/actions/shared/networks/visible-state.mjs +2 -0
- package/library/actions/shared/perps/visible-state.mjs +16 -3
- package/library/actions/shared/swap-bridge/transaction.mjs +3 -0
- package/library/actions/shared/swap-bridge/visible-state.mjs +2 -0
- package/library/actions/shared/ui/locators.mjs +2 -0
- package/library/actions/shared/wallet/import-source.mjs +3 -0
- package/library/manifests/core.action-manifest.json +34 -2
- package/library/manifests/extension.action-manifest.json +50 -17
- package/library/manifests/mobile.action-manifest.json +11 -10
- package/library/recipes/core/perps/smoke.recipe.json +23 -0
- package/library/recipes/core/perps/snapshot.recipe.json +26 -1
- package/library/recipes/extension/assets/release-custom-network-token-persistence.recipe.json +25 -8
- package/library/recipes/extension/performance/navigation-memory-suite.recipe.json +219 -0
- package/library/recipes/extension/performance/navigation-memory.recipe.json +61 -156
- package/library/recipes/extension/wallet/smoke.recipe.json +17 -8
- package/library/recipes/mobile/app/lifecycle-smoke.recipe.json +89 -0
- package/library/recipes/mobile/networks/release-custom-network-persistence.recipe.json +31 -6
- package/library/recipes/mobile/networks/release-multichain-visibility.recipe.json +5 -4
- package/library/recipes/mobile/wallet/smoke.recipe.json +17 -8
- package/library/recipes/{assets → shared/assets}/release-token-address-import.recipe.json +7 -0
- package/library/recipes/{assets → shared/assets}/release-token-details.recipe.json +2 -2
- package/library/recipes/shared/assets/release-token-hide-readd.recipe.json +91 -0
- package/library/recipes/{assets → shared/assets}/release-token-persistence.recipe.json +3 -0
- package/library/recipes/{assets → shared/assets}/release-token-search-import.recipe.json +4 -1
- package/library/recipes/{assets → shared/assets}/release-token-sorting.recipe.json +13 -2
- package/library/recipes/{swap-bridge → shared/swap-bridge}/release-quote.recipe.json +29 -3
- package/package.json +3 -3
- package/site/assets/help-recipes.json +220 -27
- package/library/recipes/assets/release-token-hide-readd.recipe.json +0 -57
- package/library/recipes/core/perps/clean-market-testnet.recipe.json +0 -44
- package/library/recipes/core/perps/order-lifecycle.recipe.json +0 -82
- package/library/recipes/core/perps/read-markets.recipe.json +0 -36
- package/library/recipes/core/perps/trading-lifecycle.recipe.json +0 -80
- package/library/recipes/extension/perps/release-activity-filters.recipe.json +0 -51
- package/library/recipes/extension/perps/release-funds-flows.recipe.json +0 -76
- package/library/recipes/extension/perps/release-live-limit-order.recipe.json +0 -109
- package/library/recipes/extension/perps/release-market-filters.recipe.json +0 -97
- package/library/recipes/extension/perps/release-order-entry.recipe.json +0 -158
- package/library/recipes/extension/perps/release-order-validation.recipe.json +0 -259
- package/library/recipes/extension/perps/release-visible-consistency.recipe.json +0 -47
- package/library/recipes/extension/perps/source-dev-snapshot-consistency.recipe.json +0 -76
- package/library/recipes/mobile/app/lifecycle.android-smoke.recipe.json +0 -69
- package/library/recipes/mobile/perps/chase-assert-running.recipe.json +0 -110
- package/library/recipes/mobile/perps/chase-place.recipe.json +0 -145
- package/library/recipes/mobile/perps/chase-terminate.recipe.json +0 -98
- package/library/recipes/mobile/perps/performance.recipe.json +0 -722
- package/library/recipes/mobile/perps/pro-order-setup.recipe.json +0 -111
- package/library/recipes/mobile/perps/pro-order-start-state.recipe.json +0 -53
- package/library/recipes/mobile/perps/scale-assert-orders.recipe.json +0 -126
- package/library/recipes/mobile/perps/scale-place.recipe.json +0 -186
- package/library/recipes/mobile/perps/twap-assert-active.recipe.json +0 -97
- package/library/recipes/mobile/perps/twap-place.recipe.json +0 -146
- package/library/recipes/mobile/runner/action-validation.recipe.json +0 -336
- package/library/recipes/perps/clean-market-testnet.recipe.json +0 -49
- package/library/recipes/perps/lifecycle.recipe.json +0 -144
- package/library/recipes/perps/release-live-market-order.recipe.json +0 -139
- package/library/recipes/perps/release-watchlist.recipe.json +0 -111
- package/library/recipes/swap-bridge/release-max-quote.recipe.json +0 -72
- /package/library/recipes/{assets → shared/assets}/release-token-list.recipe.json +0 -0
- /package/library/recipes/{perps → shared/perps}/release-market-details.recipe.json +0 -0
- /package/library/recipes/{perps → shared/perps}/release-market-search.recipe.json +0 -0
- /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-custom-slippage.recipe.json +0 -0
- /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-live-max-swap.recipe.json +0 -0
- /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-live-swap.recipe.json +0 -0
- /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-surface.recipe.json +0 -0
- /package/library/recipes/{wallet → shared/wallet}/import.recipe.json +0 -0
- /package/library/recipes/{wallet → shared/wallet}/reset-import.recipe.json +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
|
|
3
|
+
"title": "Extension multi-screen retained-memory suite",
|
|
4
|
+
"description": "Broad maintainer suite: retain all eight screen slopes, detached-DOM checks, and equal-duration idle attribution. Use performance.navigation-memory for one screen. Verify these reference screen markers against the tested build.",
|
|
5
|
+
"proofTargets": [
|
|
6
|
+
{
|
|
7
|
+
"id": "screen-slopes",
|
|
8
|
+
"claim": "Eight representative Extension screens remain within separate post-GC retained-node and listener growth bounds during navigation churn."
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "detached-dom",
|
|
12
|
+
"claim": "Detached DOM retained after forced garbage collection does not grow beyond the declared bound."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "idle-control",
|
|
16
|
+
"claim": "Navigation-attributable listener growth remains within its declared bound after subtracting an equal-duration idle control."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"workflow": {
|
|
20
|
+
"entry": "require-cdp",
|
|
21
|
+
"nodes": {
|
|
22
|
+
"require-cdp": {
|
|
23
|
+
"action": "cdp.target",
|
|
24
|
+
"required": true,
|
|
25
|
+
"require_reachable": true,
|
|
26
|
+
"intent": "Confirm the live Extension CDP target is reachable before measuring retained memory.",
|
|
27
|
+
"next": "ensure-unlocked"
|
|
28
|
+
},
|
|
29
|
+
"ensure-unlocked": {
|
|
30
|
+
"action": "metamask.wallet.ensure_unlocked",
|
|
31
|
+
"intent": "Ensure the representative screens are reachable from an unlocked wallet.",
|
|
32
|
+
"next": "market-detail"
|
|
33
|
+
},
|
|
34
|
+
"market-detail": {
|
|
35
|
+
"action": "call",
|
|
36
|
+
"ref": "performance.navigation-memory",
|
|
37
|
+
"params": {
|
|
38
|
+
"screen_hash": "#/perps/market/ETH",
|
|
39
|
+
"screen_test_id": "parent-selector-perps-market-detail",
|
|
40
|
+
"return_hash": "#/",
|
|
41
|
+
"cycles": 8,
|
|
42
|
+
"timeout_ms": 400000,
|
|
43
|
+
"max_nodes_per_cycle": 2,
|
|
44
|
+
"max_listeners_per_cycle": 4
|
|
45
|
+
},
|
|
46
|
+
"intent": "Measure the post-GC navigation slope for Perps market detail.",
|
|
47
|
+
"proves": [
|
|
48
|
+
"screen-slopes"
|
|
49
|
+
],
|
|
50
|
+
"next": "order-entry"
|
|
51
|
+
},
|
|
52
|
+
"order-entry": {
|
|
53
|
+
"action": "call",
|
|
54
|
+
"ref": "performance.navigation-memory",
|
|
55
|
+
"params": {
|
|
56
|
+
"screen_hash": "#/perps/trade/ETH?direction=long&mode=new",
|
|
57
|
+
"screen_test_id": "parent-selector-perps-order-entry",
|
|
58
|
+
"return_hash": "#/",
|
|
59
|
+
"cycles": 6,
|
|
60
|
+
"timeout_ms": 400000,
|
|
61
|
+
"max_nodes_per_cycle": 2,
|
|
62
|
+
"max_listeners_per_cycle": 4
|
|
63
|
+
},
|
|
64
|
+
"intent": "Measure the post-GC navigation slope for Perps order entry.",
|
|
65
|
+
"proves": [
|
|
66
|
+
"screen-slopes"
|
|
67
|
+
],
|
|
68
|
+
"next": "perps-home"
|
|
69
|
+
},
|
|
70
|
+
"perps-home": {
|
|
71
|
+
"action": "call",
|
|
72
|
+
"ref": "performance.navigation-memory",
|
|
73
|
+
"params": {
|
|
74
|
+
"screen_hash": "#/perps-home",
|
|
75
|
+
"screen_test_id": "perps-home-page",
|
|
76
|
+
"return_hash": "#/",
|
|
77
|
+
"cycles": 6,
|
|
78
|
+
"timeout_ms": 400000,
|
|
79
|
+
"max_nodes_per_cycle": 2,
|
|
80
|
+
"max_listeners_per_cycle": 4
|
|
81
|
+
},
|
|
82
|
+
"intent": "Measure the post-GC navigation slope for Perps home.",
|
|
83
|
+
"proves": [
|
|
84
|
+
"screen-slopes"
|
|
85
|
+
],
|
|
86
|
+
"next": "market-list"
|
|
87
|
+
},
|
|
88
|
+
"market-list": {
|
|
89
|
+
"action": "call",
|
|
90
|
+
"ref": "performance.navigation-memory",
|
|
91
|
+
"params": {
|
|
92
|
+
"screen_hash": "#/perps/market-list",
|
|
93
|
+
"screen_test_id": "parent-selector-perps-market-list",
|
|
94
|
+
"return_hash": "#/",
|
|
95
|
+
"cycles": 6,
|
|
96
|
+
"timeout_ms": 400000,
|
|
97
|
+
"max_nodes_per_cycle": 2,
|
|
98
|
+
"max_listeners_per_cycle": 4
|
|
99
|
+
},
|
|
100
|
+
"intent": "Measure the post-GC navigation slope for the Perps market list.",
|
|
101
|
+
"proves": [
|
|
102
|
+
"screen-slopes"
|
|
103
|
+
],
|
|
104
|
+
"next": "perps-activity"
|
|
105
|
+
},
|
|
106
|
+
"perps-activity": {
|
|
107
|
+
"action": "call",
|
|
108
|
+
"ref": "performance.navigation-memory",
|
|
109
|
+
"params": {
|
|
110
|
+
"screen_hash": "#/perps/activity",
|
|
111
|
+
"screen_test_id": "parent-selector-perps-activity",
|
|
112
|
+
"return_hash": "#/",
|
|
113
|
+
"cycles": 6,
|
|
114
|
+
"timeout_ms": 400000,
|
|
115
|
+
"max_nodes_per_cycle": 2,
|
|
116
|
+
"max_listeners_per_cycle": 4
|
|
117
|
+
},
|
|
118
|
+
"intent": "Measure the post-GC navigation slope for Perps activity.",
|
|
119
|
+
"proves": [
|
|
120
|
+
"screen-slopes"
|
|
121
|
+
],
|
|
122
|
+
"next": "asset-details"
|
|
123
|
+
},
|
|
124
|
+
"asset-details": {
|
|
125
|
+
"action": "call",
|
|
126
|
+
"ref": "performance.navigation-memory",
|
|
127
|
+
"params": {
|
|
128
|
+
"screen_hash": "#/asset/0x1/",
|
|
129
|
+
"screen_test_id": "asset-price-chart",
|
|
130
|
+
"return_hash": "#/",
|
|
131
|
+
"cycles": 6,
|
|
132
|
+
"timeout_ms": 400000,
|
|
133
|
+
"max_nodes_per_cycle": 2,
|
|
134
|
+
"max_listeners_per_cycle": 4
|
|
135
|
+
},
|
|
136
|
+
"intent": "Measure the post-GC navigation slope for asset details.",
|
|
137
|
+
"proves": [
|
|
138
|
+
"screen-slopes"
|
|
139
|
+
],
|
|
140
|
+
"next": "swaps-bridge"
|
|
141
|
+
},
|
|
142
|
+
"swaps-bridge": {
|
|
143
|
+
"action": "call",
|
|
144
|
+
"ref": "performance.navigation-memory",
|
|
145
|
+
"params": {
|
|
146
|
+
"screen_hash": "#/cross-chain/swaps/prepare-bridge-page",
|
|
147
|
+
"screen_test_id": "bridge-source-button",
|
|
148
|
+
"return_hash": "#/",
|
|
149
|
+
"cycles": 6,
|
|
150
|
+
"timeout_ms": 400000,
|
|
151
|
+
"max_nodes_per_cycle": 2,
|
|
152
|
+
"max_listeners_per_cycle": 4
|
|
153
|
+
},
|
|
154
|
+
"intent": "Measure the post-GC navigation slope for Swaps and Bridge.",
|
|
155
|
+
"proves": [
|
|
156
|
+
"screen-slopes"
|
|
157
|
+
],
|
|
158
|
+
"next": "settings-control"
|
|
159
|
+
},
|
|
160
|
+
"settings-control": {
|
|
161
|
+
"action": "call",
|
|
162
|
+
"ref": "performance.navigation-memory",
|
|
163
|
+
"params": {
|
|
164
|
+
"screen_hash": "#/settings",
|
|
165
|
+
"screen_test_id": "settings-tab-bar-grouped",
|
|
166
|
+
"return_hash": "#/",
|
|
167
|
+
"cycles": 6,
|
|
168
|
+
"timeout_ms": 400000,
|
|
169
|
+
"max_nodes_per_cycle": 2,
|
|
170
|
+
"max_listeners_per_cycle": 4
|
|
171
|
+
},
|
|
172
|
+
"intent": "Measure a non-Perps control screen with the same retained-memory gate.",
|
|
173
|
+
"proves": [
|
|
174
|
+
"screen-slopes"
|
|
175
|
+
],
|
|
176
|
+
"next": "detached-market-detail"
|
|
177
|
+
},
|
|
178
|
+
"detached-market-detail": {
|
|
179
|
+
"action": "metamask.performance.measure_detached_dom",
|
|
180
|
+
"screen_hash": "#/perps/market/ETH",
|
|
181
|
+
"screen_test_id": "parent-selector-perps-market-detail",
|
|
182
|
+
"return_hash": "#/",
|
|
183
|
+
"cycles": 5,
|
|
184
|
+
"timeout_ms": 400000,
|
|
185
|
+
"max_detached_growth": 50,
|
|
186
|
+
"intent": "Compare retained detached DOM before and after market-detail navigation churn.",
|
|
187
|
+
"proves": [
|
|
188
|
+
"detached-dom"
|
|
189
|
+
],
|
|
190
|
+
"next": "idle-control-market-detail"
|
|
191
|
+
},
|
|
192
|
+
"idle-control-market-detail": {
|
|
193
|
+
"action": "metamask.performance.compare_idle_navigation_memory",
|
|
194
|
+
"screen_hash": "#/perps/market/ETH",
|
|
195
|
+
"screen_test_id": "parent-selector-perps-market-detail",
|
|
196
|
+
"return_hash": "#/",
|
|
197
|
+
"rounds": 8,
|
|
198
|
+
"round_duration_ms": 10000,
|
|
199
|
+
"timeout_ms": 400000,
|
|
200
|
+
"max_attributable_listeners_per_cycle": 2,
|
|
201
|
+
"intent": "Subtract equal-duration idle growth from the market-detail navigation slope.",
|
|
202
|
+
"proves": [
|
|
203
|
+
"idle-control"
|
|
204
|
+
],
|
|
205
|
+
"next": "return-home"
|
|
206
|
+
},
|
|
207
|
+
"return-home": {
|
|
208
|
+
"action": "ui.navigate",
|
|
209
|
+
"page": "home",
|
|
210
|
+
"intent": "Leave the Extension on a known screen after the audit.",
|
|
211
|
+
"next": "done"
|
|
212
|
+
},
|
|
213
|
+
"done": {
|
|
214
|
+
"action": "end",
|
|
215
|
+
"status": "pass"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -1,169 +1,74 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
|
|
3
|
-
"title": "Extension
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"claim": "Navigation-attributable listener growth remains within its declared bound after subtracting an equal-duration idle control."
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"workflow": {
|
|
20
|
-
"entry": "require-cdp",
|
|
21
|
-
"nodes": {
|
|
22
|
-
"require-cdp": {
|
|
23
|
-
"action": "cdp.target",
|
|
24
|
-
"required": true,
|
|
25
|
-
"require_reachable": true,
|
|
26
|
-
"intent": "Confirm the live Extension CDP target is reachable before measuring retained memory.",
|
|
27
|
-
"next": "ensure-unlocked"
|
|
3
|
+
"title": "Extension one-screen retained-memory measurement",
|
|
4
|
+
"description": "Measure retained DOM-node and listener growth for one screen in an already-unlocked runtime. This does not prove detached-DOM or idle attribution; use performance.navigation-memory-suite for those checks. Run with --hud hide for a consistent measurement condition.",
|
|
5
|
+
"paramsSchema": {
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"screen_hash",
|
|
10
|
+
"screen_test_id"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"screen_hash": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Exact in-app hash route to measure."
|
|
28
16
|
},
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"next": "market-detail"
|
|
33
|
-
},
|
|
34
|
-
"market-detail": {
|
|
35
|
-
"action": "metamask.performance.measure_navigation_memory",
|
|
36
|
-
"screen_hash": "#/perps/market/ETH",
|
|
37
|
-
"screen_test_id": "perps-market-detail-page",
|
|
38
|
-
"return_hash": "#/",
|
|
39
|
-
"cycles": 8,
|
|
40
|
-
"timeout_ms": 400000,
|
|
41
|
-
"max_nodes_per_cycle": 2,
|
|
42
|
-
"max_listeners_per_cycle": 4,
|
|
43
|
-
"intent": "Measure the post-GC navigation slope for Perps market detail.",
|
|
44
|
-
"proves": ["screen-slopes"],
|
|
45
|
-
"next": "order-entry"
|
|
17
|
+
"screen_test_id": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "Current screen marker that must appear before each sample."
|
|
46
20
|
},
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"return_hash": "#/",
|
|
52
|
-
"cycles": 6,
|
|
53
|
-
"timeout_ms": 400000,
|
|
54
|
-
"max_nodes_per_cycle": 2,
|
|
55
|
-
"max_listeners_per_cycle": 4,
|
|
56
|
-
"intent": "Measure the post-GC navigation slope for Perps order entry.",
|
|
57
|
-
"proves": ["screen-slopes"],
|
|
58
|
-
"next": "perps-home"
|
|
21
|
+
"return_hash": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"default": "#/",
|
|
24
|
+
"description": "Route to visit between measured-screen entries."
|
|
59
25
|
},
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"cycles": 6,
|
|
66
|
-
"timeout_ms": 400000,
|
|
67
|
-
"max_nodes_per_cycle": 2,
|
|
68
|
-
"max_listeners_per_cycle": 4,
|
|
69
|
-
"intent": "Measure the post-GC navigation slope for Perps home.",
|
|
70
|
-
"proves": ["screen-slopes"],
|
|
71
|
-
"next": "market-list"
|
|
26
|
+
"cycles": {
|
|
27
|
+
"type": "integer",
|
|
28
|
+
"minimum": 2,
|
|
29
|
+
"default": 8,
|
|
30
|
+
"description": "Post-GC samples; choose the count before measuring."
|
|
72
31
|
},
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"cycles": 6,
|
|
79
|
-
"timeout_ms": 400000,
|
|
80
|
-
"max_nodes_per_cycle": 2,
|
|
81
|
-
"max_listeners_per_cycle": 4,
|
|
82
|
-
"intent": "Measure the post-GC navigation slope for the Perps market list.",
|
|
83
|
-
"proves": ["screen-slopes"],
|
|
84
|
-
"next": "perps-activity"
|
|
32
|
+
"max_nodes_per_cycle": {
|
|
33
|
+
"type": "number",
|
|
34
|
+
"minimum": 0,
|
|
35
|
+
"default": 2,
|
|
36
|
+
"description": "Declared retained DOM-node growth budget per cycle."
|
|
85
37
|
},
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"cycles": 6,
|
|
92
|
-
"timeout_ms": 400000,
|
|
93
|
-
"max_nodes_per_cycle": 2,
|
|
94
|
-
"max_listeners_per_cycle": 4,
|
|
95
|
-
"intent": "Measure the post-GC navigation slope for Perps activity.",
|
|
96
|
-
"proves": ["screen-slopes"],
|
|
97
|
-
"next": "asset-details"
|
|
38
|
+
"max_listeners_per_cycle": {
|
|
39
|
+
"type": "number",
|
|
40
|
+
"minimum": 0,
|
|
41
|
+
"default": 4,
|
|
42
|
+
"description": "Declared retained listener growth budget per cycle."
|
|
98
43
|
},
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"cycles": 6,
|
|
105
|
-
"timeout_ms": 400000,
|
|
106
|
-
"max_nodes_per_cycle": 2,
|
|
107
|
-
"max_listeners_per_cycle": 4,
|
|
108
|
-
"intent": "Measure the post-GC navigation slope for asset details.",
|
|
109
|
-
"proves": ["screen-slopes"],
|
|
110
|
-
"next": "swaps-bridge"
|
|
44
|
+
"screen_timeout_ms": {
|
|
45
|
+
"type": "integer",
|
|
46
|
+
"minimum": 1,
|
|
47
|
+
"default": 15000,
|
|
48
|
+
"description": "Maximum wait for each screen marker."
|
|
111
49
|
},
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
},
|
|
125
|
-
"settings-control": {
|
|
50
|
+
"timeout_ms": {
|
|
51
|
+
"type": "integer",
|
|
52
|
+
"minimum": 1,
|
|
53
|
+
"default": 120000,
|
|
54
|
+
"description": "Total bound for this one-screen measurement."
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"workflow": {
|
|
59
|
+
"entry": "measure",
|
|
60
|
+
"nodes": {
|
|
61
|
+
"measure": {
|
|
126
62
|
"action": "metamask.performance.measure_navigation_memory",
|
|
127
|
-
"screen_hash": "
|
|
128
|
-
"screen_test_id": "
|
|
129
|
-
"return_hash": "
|
|
130
|
-
"cycles":
|
|
131
|
-
"
|
|
132
|
-
"
|
|
133
|
-
"
|
|
134
|
-
"
|
|
135
|
-
"
|
|
136
|
-
"next": "detached-market-detail"
|
|
137
|
-
},
|
|
138
|
-
"detached-market-detail": {
|
|
139
|
-
"action": "metamask.performance.measure_detached_dom",
|
|
140
|
-
"screen_hash": "#/perps/market/ETH",
|
|
141
|
-
"screen_test_id": "perps-market-detail-page",
|
|
142
|
-
"return_hash": "#/",
|
|
143
|
-
"cycles": 5,
|
|
144
|
-
"timeout_ms": 400000,
|
|
145
|
-
"max_detached_growth": 50,
|
|
146
|
-
"intent": "Compare retained detached DOM before and after market-detail navigation churn.",
|
|
147
|
-
"proves": ["detached-dom"],
|
|
148
|
-
"next": "idle-control-market-detail"
|
|
149
|
-
},
|
|
150
|
-
"idle-control-market-detail": {
|
|
151
|
-
"action": "metamask.performance.compare_idle_navigation_memory",
|
|
152
|
-
"screen_hash": "#/perps/market/ETH",
|
|
153
|
-
"screen_test_id": "perps-market-detail-page",
|
|
154
|
-
"return_hash": "#/",
|
|
155
|
-
"rounds": 8,
|
|
156
|
-
"round_duration_ms": 10000,
|
|
157
|
-
"timeout_ms": 400000,
|
|
158
|
-
"max_attributable_listeners_per_cycle": 2,
|
|
159
|
-
"intent": "Subtract equal-duration idle growth from the market-detail navigation slope.",
|
|
160
|
-
"proves": ["idle-control"],
|
|
161
|
-
"next": "return-home"
|
|
162
|
-
},
|
|
163
|
-
"return-home": {
|
|
164
|
-
"action": "ui.navigate",
|
|
165
|
-
"page": "home",
|
|
166
|
-
"intent": "Leave the Extension on a known screen after the audit.",
|
|
63
|
+
"screen_hash": "{{params.screen_hash}}",
|
|
64
|
+
"screen_test_id": "{{params.screen_test_id}}",
|
|
65
|
+
"return_hash": "{{params.return_hash}}",
|
|
66
|
+
"cycles": "{{params.cycles}}",
|
|
67
|
+
"max_nodes_per_cycle": "{{params.max_nodes_per_cycle}}",
|
|
68
|
+
"max_listeners_per_cycle": "{{params.max_listeners_per_cycle}}",
|
|
69
|
+
"screen_timeout_ms": "{{params.screen_timeout_ms}}",
|
|
70
|
+
"timeout_ms": "{{params.timeout_ms}}",
|
|
71
|
+
"intent": "Measure post-GC retained-node and listener slopes for the requested screen",
|
|
167
72
|
"next": "done"
|
|
168
73
|
},
|
|
169
74
|
"done": {
|
|
@@ -2,18 +2,27 @@
|
|
|
2
2
|
"$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
|
|
3
3
|
"title": "MetaMask Extension wallet smoke",
|
|
4
4
|
"description": "Fixture-backed proof that the Extension wallet is reachable, unlocked, readable, and visually capturable without depending on a product feature domain.",
|
|
5
|
+
"paramsSchema": {
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"capture_path": { "type": "string", "default": "screenshots/wallet-smoke.png" }
|
|
10
|
+
}
|
|
11
|
+
},
|
|
5
12
|
"workflow": {
|
|
6
|
-
"entry": "
|
|
13
|
+
"entry": "fixture",
|
|
7
14
|
"nodes": {
|
|
8
|
-
"status": {
|
|
9
|
-
"action": "app.status",
|
|
10
|
-
"next": "fixture",
|
|
11
|
-
"intent": "Confirm the Extension runtime is reachable"
|
|
12
|
-
},
|
|
13
15
|
"fixture": {
|
|
14
16
|
"action": "metamask.wallet.fixture_status",
|
|
17
|
+
"next": "require-fixture",
|
|
18
|
+
"intent": "Read the checkout's wallet fixture readiness without changing it"
|
|
19
|
+
},
|
|
20
|
+
"require-fixture": {
|
|
21
|
+
"action": "assert_output",
|
|
22
|
+
"source": "fixture",
|
|
23
|
+
"assert": { "path": "$.status", "operator": "eq", "value": "ready" },
|
|
15
24
|
"next": "unlock",
|
|
16
|
-
"intent": "
|
|
25
|
+
"intent": "Require a ready on-disk fixture before interacting with the wallet; this does not prove imported account identity"
|
|
17
26
|
},
|
|
18
27
|
"unlock": {
|
|
19
28
|
"action": "metamask.wallet.ensure_unlocked",
|
|
@@ -27,7 +36,7 @@
|
|
|
27
36
|
},
|
|
28
37
|
"screenshot": {
|
|
29
38
|
"action": "ui.screenshot",
|
|
30
|
-
"path": "
|
|
39
|
+
"path": "{{params.capture_path}}",
|
|
31
40
|
"next": "done",
|
|
32
41
|
"intent": "Record the visible wallet state as evidence"
|
|
33
42
|
},
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
|
|
3
|
+
"title": "MetaMask Mobile lifecycle smoke",
|
|
4
|
+
"description": "Cold-launch the installed dev client on the selected Android device or iOS simulator, verify its bridge, unlock the fixture-backed wallet, then prove same-process background/foreground recovery and capture the final app state. Requires a source-dev runtime; does not rebuild or reset wallet data.",
|
|
5
|
+
"paramsSchema": {
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"capture_path": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"default": "screenshots/app-lifecycle-smoke.png",
|
|
12
|
+
"description": "Use a distinct path when composing repeated lifecycle checks."
|
|
13
|
+
},
|
|
14
|
+
"runtime_ready_timeout_ms": {
|
|
15
|
+
"type": "integer",
|
|
16
|
+
"minimum": 1000,
|
|
17
|
+
"default": 60000,
|
|
18
|
+
"description": "Bound the selected bridge/route readiness check after each launch or foreground operation."
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"workflow": {
|
|
23
|
+
"entry": "terminate-before",
|
|
24
|
+
"nodes": {
|
|
25
|
+
"background-app": {
|
|
26
|
+
"action": "app.lifecycle",
|
|
27
|
+
"command": "background",
|
|
28
|
+
"settle_ms": 1000,
|
|
29
|
+
"require_process_continuity": true,
|
|
30
|
+
"intent": "Background the selected app without terminating its process",
|
|
31
|
+
"next": "foreground-app"
|
|
32
|
+
},
|
|
33
|
+
"foreground-app": {
|
|
34
|
+
"action": "app.lifecycle",
|
|
35
|
+
"command": "foreground",
|
|
36
|
+
"runtime_ready_timeout_ms": "{{params.runtime_ready_timeout_ms}}",
|
|
37
|
+
"require_process_continuity": true,
|
|
38
|
+
"intent": "Resume the selected app in the same process and await its bridge",
|
|
39
|
+
"next": "bridge-after"
|
|
40
|
+
},
|
|
41
|
+
"bridge-after": {
|
|
42
|
+
"action": "cdp.target",
|
|
43
|
+
"require_reachable": true,
|
|
44
|
+
"intent": "Confirm the mobile React Native debug bridge recovered after foregrounding",
|
|
45
|
+
"next": "screenshot-after"
|
|
46
|
+
},
|
|
47
|
+
"screenshot-after": {
|
|
48
|
+
"action": "ui.screenshot",
|
|
49
|
+
"path": "{{params.capture_path}}",
|
|
50
|
+
"intent": "Record the foreground app state as evidence",
|
|
51
|
+
"next": "end"
|
|
52
|
+
},
|
|
53
|
+
"end": {
|
|
54
|
+
"action": "end",
|
|
55
|
+
"status": "pass"
|
|
56
|
+
},
|
|
57
|
+
"start-state": {
|
|
58
|
+
"action": "app.status",
|
|
59
|
+
"intent": "Record the stable run start status after setup relaunch",
|
|
60
|
+
"next": "background-app"
|
|
61
|
+
},
|
|
62
|
+
"bridge-before": {
|
|
63
|
+
"action": "cdp.target",
|
|
64
|
+
"require_reachable": true,
|
|
65
|
+
"intent": "Confirm the mobile React Native debug bridge is reachable after setup relaunch",
|
|
66
|
+
"next": "ensure-unlocked"
|
|
67
|
+
},
|
|
68
|
+
"ensure-unlocked": {
|
|
69
|
+
"action": "metamask.wallet.ensure_unlocked",
|
|
70
|
+
"intent": "Unlock the fixture-backed wallet before the background/foreground proof and protected-screen capture boundary",
|
|
71
|
+
"next": "start-state"
|
|
72
|
+
},
|
|
73
|
+
"launch-before": {
|
|
74
|
+
"action": "app.lifecycle",
|
|
75
|
+
"command": "launch",
|
|
76
|
+
"runtime_ready_timeout_ms": "{{params.runtime_ready_timeout_ms}}",
|
|
77
|
+
"intent": "Launch the selected app through the Expo dev-client deep link from a cold process",
|
|
78
|
+
"next": "bridge-before"
|
|
79
|
+
},
|
|
80
|
+
"terminate-before": {
|
|
81
|
+
"action": "app.lifecycle",
|
|
82
|
+
"command": "terminate",
|
|
83
|
+
"settle_ms": 3000,
|
|
84
|
+
"intent": "Terminate the selected app before lifecycle smoke",
|
|
85
|
+
"next": "launch-before"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|