@deeeed/metamask-harness 0.20.0 → 0.22.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 +22 -0
- package/adapters/core/inject.sh +1 -3
- package/adapters/extension/inject.mjs +1 -1
- package/adapters/mobile/inject.sh +1 -1
- package/dist/adapters/extension/ensure-ready.js +44 -15
- package/dist/cli-commands.js +1 -0
- package/dist/cli.js +2 -0
- package/dist/command-contract.js +57 -0
- package/dist/commands/call.js +1 -1
- package/dist/commands/execution-template.js +28 -0
- package/dist/commands/manifest.js +15 -21
- package/dist/commands/run-engine.js +17 -8
- package/dist/library-provenance.js +33 -0
- package/dist/manifest.js +85 -101
- package/dist/mm-harness-cli.js +35 -1
- package/dist/runner.js +9 -4
- package/docs/RECIPES.md +2 -11
- package/library/actions/extension/ui/navigate.mjs +16 -6
- package/library/manifests/core.action-manifest.json +316 -501
- package/library/manifests/extension.action-manifest.json +609 -920
- package/library/manifests/mobile.action-manifest.json +630 -954
- package/package.json +4 -4
- package/scripts/completions.sh +2 -1
- package/library/library.json +0 -7
|
@@ -1,40 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"supported_official_actions": [
|
|
5
|
-
"command",
|
|
6
|
-
"wait",
|
|
7
|
-
"assert_file",
|
|
8
|
-
"assert_json",
|
|
9
|
-
"assert_exit_code",
|
|
10
|
-
"assert_output",
|
|
11
|
-
"watch_logs",
|
|
12
|
-
"index_artifacts",
|
|
13
|
-
"end",
|
|
14
|
-
"call",
|
|
15
|
-
"switch",
|
|
16
|
-
"ui.navigate",
|
|
17
|
-
"ui.press",
|
|
18
|
-
"ui.key_press",
|
|
19
|
-
"ui.set_input",
|
|
20
|
-
"ui.scroll",
|
|
21
|
-
"ui.wait_for",
|
|
22
|
-
"ui.screenshot",
|
|
23
|
-
"app.lifecycle",
|
|
24
|
-
"app.status",
|
|
25
|
-
"app.hud",
|
|
26
|
-
"cdp.target"
|
|
27
|
-
],
|
|
28
|
-
"action_metadata": {
|
|
2
|
+
"$schema": "https://farmslot.io/schemas/action-manifest-v1.schema.json",
|
|
3
|
+
"actions": {
|
|
29
4
|
"command": {
|
|
30
5
|
"description": "Run a shell command from the project root.",
|
|
31
6
|
"examples": [
|
|
32
7
|
{
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
8
|
+
"action": "command",
|
|
9
|
+
"cmd": "pwd",
|
|
10
|
+
"intent": "Prepare the project state needed for this proof.",
|
|
11
|
+
"next": "done"
|
|
38
12
|
}
|
|
39
13
|
],
|
|
40
14
|
"schema": {
|
|
@@ -63,11 +37,10 @@
|
|
|
63
37
|
"description": "Base wait action.",
|
|
64
38
|
"examples": [
|
|
65
39
|
{
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
40
|
+
"action": "wait",
|
|
41
|
+
"duration_ms": 1,
|
|
42
|
+
"intent": "Allow the requested asynchronous state to settle.",
|
|
43
|
+
"next": "done"
|
|
71
44
|
}
|
|
72
45
|
],
|
|
73
46
|
"schema": {
|
|
@@ -83,40 +56,229 @@
|
|
|
83
56
|
"additionalProperties": false
|
|
84
57
|
}
|
|
85
58
|
},
|
|
86
|
-
"
|
|
87
|
-
"description": "
|
|
59
|
+
"assert_file": {
|
|
60
|
+
"description": "Assert that a project file exists and optionally contains text.",
|
|
61
|
+
"examples": [
|
|
62
|
+
{
|
|
63
|
+
"action": "assert_file",
|
|
64
|
+
"path": "reports/result.txt",
|
|
65
|
+
"contains": "ok",
|
|
66
|
+
"intent": "Confirm the requested project file state.",
|
|
67
|
+
"next": "done"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"schema": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"properties": {
|
|
73
|
+
"path": {
|
|
74
|
+
"type": "string"
|
|
75
|
+
},
|
|
76
|
+
"contains": {
|
|
77
|
+
"type": "string"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"required": [
|
|
81
|
+
"path"
|
|
82
|
+
],
|
|
83
|
+
"additionalProperties": false
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"assert_json": {
|
|
87
|
+
"description": "Assert a JSON file value with a JSONPath-style selector.",
|
|
88
|
+
"examples": [
|
|
89
|
+
{
|
|
90
|
+
"action": "assert_json",
|
|
91
|
+
"path": "reports/result.json",
|
|
92
|
+
"assert": {
|
|
93
|
+
"path": "$.status",
|
|
94
|
+
"operator": "eq",
|
|
95
|
+
"value": "ok"
|
|
96
|
+
},
|
|
97
|
+
"intent": "Confirm the recorded data satisfies the requested condition.",
|
|
98
|
+
"next": "done"
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"schema": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"properties": {
|
|
104
|
+
"path": {
|
|
105
|
+
"type": "string"
|
|
106
|
+
},
|
|
107
|
+
"assert": {
|
|
108
|
+
"type": "object",
|
|
109
|
+
"properties": {
|
|
110
|
+
"path": {
|
|
111
|
+
"type": "string"
|
|
112
|
+
},
|
|
113
|
+
"operator": {
|
|
114
|
+
"type": "string"
|
|
115
|
+
},
|
|
116
|
+
"value": {
|
|
117
|
+
"type": [
|
|
118
|
+
"string",
|
|
119
|
+
"number",
|
|
120
|
+
"integer",
|
|
121
|
+
"boolean",
|
|
122
|
+
"object",
|
|
123
|
+
"array"
|
|
124
|
+
],
|
|
125
|
+
"items": {
|
|
126
|
+
"type": [
|
|
127
|
+
"string",
|
|
128
|
+
"number",
|
|
129
|
+
"integer",
|
|
130
|
+
"boolean",
|
|
131
|
+
"object"
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"all": {
|
|
136
|
+
"type": "array",
|
|
137
|
+
"items": {
|
|
138
|
+
"type": "object"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"any": {
|
|
142
|
+
"type": "array",
|
|
143
|
+
"items": {
|
|
144
|
+
"type": "object"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"none": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"items": {
|
|
150
|
+
"type": "object"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"additionalProperties": false
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"required": [
|
|
158
|
+
"path",
|
|
159
|
+
"assert"
|
|
160
|
+
],
|
|
161
|
+
"additionalProperties": false
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"assert_exit_code": {
|
|
165
|
+
"description": "Assert the exit code captured from a command node output.",
|
|
88
166
|
"examples": [
|
|
89
167
|
{
|
|
168
|
+
"action": "assert_exit_code",
|
|
169
|
+
"source": "run-tests",
|
|
170
|
+
"expected": 0,
|
|
171
|
+
"intent": "Confirm the project command completed with the expected result.",
|
|
172
|
+
"next": "done"
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"schema": {
|
|
176
|
+
"type": "object",
|
|
177
|
+
"properties": {
|
|
178
|
+
"source": {
|
|
179
|
+
"type": "string"
|
|
180
|
+
},
|
|
90
181
|
"node": {
|
|
91
|
-
"
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"
|
|
95
|
-
"default": "warm",
|
|
96
|
-
"intent": "Choose the requested lifecycle preparation path"
|
|
182
|
+
"type": "string"
|
|
183
|
+
},
|
|
184
|
+
"expected": {
|
|
185
|
+
"type": "number"
|
|
97
186
|
}
|
|
187
|
+
},
|
|
188
|
+
"additionalProperties": false
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"assert_output": {
|
|
192
|
+
"description": "Assert stdout or stderr captured from a command node output.",
|
|
193
|
+
"examples": [
|
|
194
|
+
{
|
|
195
|
+
"action": "assert_output",
|
|
196
|
+
"source": "run-tests",
|
|
197
|
+
"stream": "stdout",
|
|
198
|
+
"contains": "PASS",
|
|
199
|
+
"intent": "Confirm the recorded output satisfies the requested condition.",
|
|
200
|
+
"next": "done"
|
|
98
201
|
}
|
|
99
202
|
],
|
|
100
203
|
"schema": {
|
|
101
204
|
"type": "object",
|
|
102
205
|
"properties": {
|
|
103
|
-
"
|
|
104
|
-
|
|
206
|
+
"source": {
|
|
207
|
+
"type": "string"
|
|
208
|
+
},
|
|
209
|
+
"node": {
|
|
210
|
+
"type": "string"
|
|
211
|
+
},
|
|
212
|
+
"stream": {
|
|
213
|
+
"type": "string"
|
|
214
|
+
},
|
|
215
|
+
"contains": {
|
|
216
|
+
"type": "string"
|
|
217
|
+
},
|
|
218
|
+
"match": {
|
|
219
|
+
"type": "string"
|
|
220
|
+
},
|
|
221
|
+
"assert": {
|
|
222
|
+
"type": "object",
|
|
223
|
+
"properties": {
|
|
224
|
+
"path": {
|
|
225
|
+
"type": "string"
|
|
226
|
+
},
|
|
227
|
+
"operator": {
|
|
228
|
+
"type": "string"
|
|
229
|
+
},
|
|
230
|
+
"value": {
|
|
231
|
+
"type": [
|
|
232
|
+
"string",
|
|
233
|
+
"number",
|
|
234
|
+
"integer",
|
|
235
|
+
"boolean",
|
|
236
|
+
"object",
|
|
237
|
+
"array"
|
|
238
|
+
],
|
|
239
|
+
"items": {
|
|
240
|
+
"type": [
|
|
241
|
+
"string",
|
|
242
|
+
"number",
|
|
243
|
+
"integer",
|
|
244
|
+
"boolean",
|
|
245
|
+
"object"
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"all": {
|
|
250
|
+
"type": "array",
|
|
251
|
+
"items": {
|
|
252
|
+
"type": "object"
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
"any": {
|
|
256
|
+
"type": "array",
|
|
257
|
+
"items": {
|
|
258
|
+
"type": "object"
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"none": {
|
|
262
|
+
"type": "array",
|
|
263
|
+
"items": {
|
|
264
|
+
"type": "object"
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
"additionalProperties": false
|
|
269
|
+
}
|
|
105
270
|
},
|
|
106
|
-
"required": ["value", "equals"],
|
|
107
271
|
"additionalProperties": false
|
|
108
|
-
}
|
|
109
|
-
"result_cases": ["match"]
|
|
272
|
+
}
|
|
110
273
|
},
|
|
111
274
|
"watch_logs": {
|
|
112
275
|
"description": "Base log assertion/capture action.",
|
|
113
276
|
"examples": [
|
|
114
277
|
{
|
|
115
|
-
"
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
278
|
+
"action": "watch_logs",
|
|
279
|
+
"path": "logs/app.log",
|
|
280
|
+
"intent": "Observe the runtime behavior needed for this proof.",
|
|
281
|
+
"next": "done"
|
|
120
282
|
}
|
|
121
283
|
],
|
|
122
284
|
"schema": {
|
|
@@ -146,18 +308,17 @@
|
|
|
146
308
|
"description": "Index extra recipe-authored artifacts that already exist on disk. Do not use after ui.screenshot; screenshots are registered by the runner.",
|
|
147
309
|
"examples": [
|
|
148
310
|
{
|
|
149
|
-
"
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
311
|
+
"action": "index_artifacts",
|
|
312
|
+
"artifacts": [
|
|
313
|
+
{
|
|
314
|
+
"path": "reports/result.json",
|
|
315
|
+
"type": "report",
|
|
316
|
+
"category": "validation",
|
|
317
|
+
"label": "Validation report"
|
|
318
|
+
}
|
|
319
|
+
],
|
|
320
|
+
"intent": "Preserve generated evidence in the review package.",
|
|
321
|
+
"next": "done"
|
|
161
322
|
}
|
|
162
323
|
],
|
|
163
324
|
"schema": {
|
|
@@ -213,11 +374,54 @@
|
|
|
213
374
|
"description": "Base terminal action.",
|
|
214
375
|
"examples": [
|
|
215
376
|
{
|
|
216
|
-
"
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
377
|
+
"action": "end",
|
|
378
|
+
"status": "pass"
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
},
|
|
382
|
+
"call": {
|
|
383
|
+
"description": "Invoke a named recipe by ref and run its steps inline.",
|
|
384
|
+
"examples": [
|
|
385
|
+
{
|
|
386
|
+
"action": "call",
|
|
387
|
+
"ref": "mydev.open_perps_setup",
|
|
388
|
+
"intent": "Run a personal Perps setup recipe",
|
|
389
|
+
"next": "done"
|
|
390
|
+
}
|
|
391
|
+
]
|
|
392
|
+
},
|
|
393
|
+
"switch": {
|
|
394
|
+
"description": "Choose a graph branch when one resolved string equals another.",
|
|
395
|
+
"examples": [
|
|
396
|
+
{
|
|
397
|
+
"action": "switch",
|
|
398
|
+
"value": "{{params.mode}}",
|
|
399
|
+
"equals": "background_resume",
|
|
400
|
+
"cases": {
|
|
401
|
+
"match": "background"
|
|
402
|
+
},
|
|
403
|
+
"default": "warm",
|
|
404
|
+
"intent": "Choose the graph path matching the observed state."
|
|
220
405
|
}
|
|
406
|
+
],
|
|
407
|
+
"schema": {
|
|
408
|
+
"type": "object",
|
|
409
|
+
"properties": {
|
|
410
|
+
"value": {
|
|
411
|
+
"type": "string"
|
|
412
|
+
},
|
|
413
|
+
"equals": {
|
|
414
|
+
"type": "string"
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
"required": [
|
|
418
|
+
"value",
|
|
419
|
+
"equals"
|
|
420
|
+
],
|
|
421
|
+
"additionalProperties": false
|
|
422
|
+
},
|
|
423
|
+
"result_cases": [
|
|
424
|
+
"match"
|
|
221
425
|
]
|
|
222
426
|
},
|
|
223
427
|
"ui.navigate": {
|
|
@@ -265,29 +469,23 @@
|
|
|
265
469
|
},
|
|
266
470
|
"examples": [
|
|
267
471
|
{
|
|
268
|
-
"
|
|
269
|
-
"
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
"intent": "Open Perps"
|
|
273
|
-
}
|
|
472
|
+
"action": "ui.navigate",
|
|
473
|
+
"page": "perps",
|
|
474
|
+
"intent": "Open the requested application surface.",
|
|
475
|
+
"next": "done"
|
|
274
476
|
},
|
|
275
477
|
{
|
|
276
|
-
"
|
|
277
|
-
"
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
"intent": "Open ETH Perps market"
|
|
282
|
-
}
|
|
478
|
+
"action": "ui.navigate",
|
|
479
|
+
"page": "perps-market",
|
|
480
|
+
"market": "ETH",
|
|
481
|
+
"intent": "Open the requested application surface.",
|
|
482
|
+
"next": "done"
|
|
283
483
|
},
|
|
284
484
|
{
|
|
285
|
-
"
|
|
286
|
-
"
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
"intent": "Open a raw app route"
|
|
290
|
-
}
|
|
485
|
+
"action": "ui.navigate",
|
|
486
|
+
"route": "PerpsMarketListView",
|
|
487
|
+
"intent": "Open the requested application surface.",
|
|
488
|
+
"next": "done"
|
|
291
489
|
}
|
|
292
490
|
]
|
|
293
491
|
},
|
|
@@ -326,61 +524,119 @@
|
|
|
326
524
|
},
|
|
327
525
|
"examples": [
|
|
328
526
|
{
|
|
329
|
-
"
|
|
330
|
-
"
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
"intent": "Open Perps through its stable testID"
|
|
334
|
-
}
|
|
527
|
+
"action": "ui.press",
|
|
528
|
+
"test_id": "perps-tab",
|
|
529
|
+
"intent": "Activate the requested visible control.",
|
|
530
|
+
"next": "done"
|
|
335
531
|
},
|
|
336
532
|
{
|
|
337
|
-
"
|
|
338
|
-
"
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
"intent": "Press the component containing the visible Ethereum label"
|
|
342
|
-
}
|
|
533
|
+
"action": "ui.press",
|
|
534
|
+
"text": "Ethereum",
|
|
535
|
+
"intent": "Activate the requested visible control.",
|
|
536
|
+
"next": "done"
|
|
343
537
|
},
|
|
344
538
|
{
|
|
345
|
-
"
|
|
346
|
-
"
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
"intent": "Clear the current keypad value through its human reset gesture"
|
|
351
|
-
}
|
|
539
|
+
"action": "ui.press",
|
|
540
|
+
"test_id": "keypad-delete-button",
|
|
541
|
+
"long_press": true,
|
|
542
|
+
"intent": "Activate the requested visible control.",
|
|
543
|
+
"next": "done"
|
|
352
544
|
}
|
|
353
545
|
]
|
|
354
546
|
},
|
|
355
|
-
"ui.
|
|
356
|
-
"description": "
|
|
357
|
-
"examples": [
|
|
358
|
-
{
|
|
359
|
-
"node": {
|
|
360
|
-
"action": "ui.scroll",
|
|
361
|
-
"delta_y": 300,
|
|
362
|
-
"intent": "Scroll through the UI through the Farmslot base platform adapter. Supports deltas and scroll_into_view for selector/test-id proof positioning"
|
|
363
|
-
}
|
|
364
|
-
},
|
|
365
|
-
{
|
|
366
|
-
"description": "Bring a React Native testID into view before screenshot proof",
|
|
367
|
-
"node": {
|
|
368
|
-
"action": "ui.scroll",
|
|
369
|
-
"test_id": "wallet-screen",
|
|
370
|
-
"scroll_into_view": true,
|
|
371
|
-
"intent": "Bring a React Native testID into view before screenshot proof"
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
],
|
|
375
|
-
"proof_effect": "E2E validation must include a passing ui-scroll-into-view trace event with output.intoView=true.",
|
|
547
|
+
"ui.key_press": {
|
|
548
|
+
"description": "Send a trusted keyboard press to the currently focused UI element through the UI transport.",
|
|
376
549
|
"schema": {
|
|
377
550
|
"type": "object",
|
|
378
551
|
"properties": {
|
|
379
|
-
"
|
|
552
|
+
"key": {
|
|
380
553
|
"type": "string"
|
|
381
554
|
},
|
|
382
|
-
"
|
|
383
|
-
"type": "
|
|
555
|
+
"timeout_ms": {
|
|
556
|
+
"type": "number"
|
|
557
|
+
},
|
|
558
|
+
"settle": {
|
|
559
|
+
"type": "boolean"
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"required": [
|
|
563
|
+
"key"
|
|
564
|
+
],
|
|
565
|
+
"additionalProperties": false
|
|
566
|
+
},
|
|
567
|
+
"examples": [
|
|
568
|
+
{
|
|
569
|
+
"action": "ui.key_press",
|
|
570
|
+
"key": "Enter",
|
|
571
|
+
"intent": "Continue the requested keyboard interaction.",
|
|
572
|
+
"next": "done"
|
|
573
|
+
}
|
|
574
|
+
]
|
|
575
|
+
},
|
|
576
|
+
"ui.set_input": {
|
|
577
|
+
"description": "Set text on a React Native TextInput by testID through the app control bridge.",
|
|
578
|
+
"schema": {
|
|
579
|
+
"type": "object",
|
|
580
|
+
"properties": {
|
|
581
|
+
"selector": {
|
|
582
|
+
"type": "string"
|
|
583
|
+
},
|
|
584
|
+
"test_id": {
|
|
585
|
+
"type": "string"
|
|
586
|
+
},
|
|
587
|
+
"testID": {
|
|
588
|
+
"type": "string"
|
|
589
|
+
},
|
|
590
|
+
"value": {
|
|
591
|
+
"type": "string"
|
|
592
|
+
},
|
|
593
|
+
"text": {
|
|
594
|
+
"type": "string"
|
|
595
|
+
},
|
|
596
|
+
"timeout_ms": {
|
|
597
|
+
"type": "number"
|
|
598
|
+
},
|
|
599
|
+
"settle": {
|
|
600
|
+
"type": "boolean"
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
"additionalProperties": false
|
|
604
|
+
},
|
|
605
|
+
"examples": [
|
|
606
|
+
{
|
|
607
|
+
"action": "ui.set_input",
|
|
608
|
+
"test_id": "network-selector-network-search-input",
|
|
609
|
+
"value": "Sepolia",
|
|
610
|
+
"intent": "Provide the requested value in the visible form.",
|
|
611
|
+
"next": "done"
|
|
612
|
+
}
|
|
613
|
+
]
|
|
614
|
+
},
|
|
615
|
+
"ui.scroll": {
|
|
616
|
+
"description": "Scroll through the UI through the Farmslot base platform adapter. Supports deltas and scroll_into_view for selector/test-id proof positioning.",
|
|
617
|
+
"examples": [
|
|
618
|
+
{
|
|
619
|
+
"action": "ui.scroll",
|
|
620
|
+
"delta_y": 300,
|
|
621
|
+
"intent": "Expose the requested content for visible review.",
|
|
622
|
+
"next": "done"
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
"action": "ui.scroll",
|
|
626
|
+
"test_id": "wallet-screen",
|
|
627
|
+
"scroll_into_view": true,
|
|
628
|
+
"intent": "Expose the requested content for visible review.",
|
|
629
|
+
"next": "done"
|
|
630
|
+
}
|
|
631
|
+
],
|
|
632
|
+
"schema": {
|
|
633
|
+
"type": "object",
|
|
634
|
+
"properties": {
|
|
635
|
+
"selector": {
|
|
636
|
+
"type": "string"
|
|
637
|
+
},
|
|
638
|
+
"test_id": {
|
|
639
|
+
"type": "string"
|
|
384
640
|
},
|
|
385
641
|
"testID": {
|
|
386
642
|
"type": "string"
|
|
@@ -463,20 +719,18 @@
|
|
|
463
719
|
},
|
|
464
720
|
"examples": [
|
|
465
721
|
{
|
|
466
|
-
"
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
"
|
|
471
|
-
}
|
|
722
|
+
"action": "ui.wait_for",
|
|
723
|
+
"test_id": "perps-home-heading",
|
|
724
|
+
"expected": "present",
|
|
725
|
+
"intent": "Confirm the requested application state is visible.",
|
|
726
|
+
"next": "done"
|
|
472
727
|
},
|
|
473
728
|
{
|
|
474
|
-
"
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
"
|
|
479
|
-
}
|
|
729
|
+
"action": "ui.wait_for",
|
|
730
|
+
"test_id": "conditional-banner",
|
|
731
|
+
"expected": "absent",
|
|
732
|
+
"intent": "Confirm the requested application state is visible.",
|
|
733
|
+
"next": "done"
|
|
480
734
|
}
|
|
481
735
|
]
|
|
482
736
|
},
|
|
@@ -484,11 +738,10 @@
|
|
|
484
738
|
"description": "Capture registered PNG evidence with xcrun simctl on iOS or adb screencap on Android. Artifact metadata records the native provider, command mode, and selected device; invalid or empty PNG output fails before registration.",
|
|
485
739
|
"examples": [
|
|
486
740
|
{
|
|
487
|
-
"
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
}
|
|
741
|
+
"action": "ui.screenshot",
|
|
742
|
+
"path": "screenshots/example.png",
|
|
743
|
+
"intent": "Preserve the visible application state as review evidence.",
|
|
744
|
+
"next": "done"
|
|
492
745
|
}
|
|
493
746
|
],
|
|
494
747
|
"schema": {
|
|
@@ -514,12 +767,11 @@
|
|
|
514
767
|
"description": "Drive outer mobile app lifecycle for deterministic performance start states without rebuilding: foreground/launch, background, terminate, or restart the installed app.",
|
|
515
768
|
"examples": [
|
|
516
769
|
{
|
|
517
|
-
"
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
}
|
|
770
|
+
"action": "app.lifecycle",
|
|
771
|
+
"command": "background",
|
|
772
|
+
"settle_ms": 1000,
|
|
773
|
+
"intent": "Converge the application to the requested lifecycle state.",
|
|
774
|
+
"next": "done"
|
|
523
775
|
}
|
|
524
776
|
],
|
|
525
777
|
"schema": {
|
|
@@ -571,288 +823,81 @@
|
|
|
571
823
|
"watcher_port": {
|
|
572
824
|
"type": "number"
|
|
573
825
|
},
|
|
574
|
-
"metro_port": {
|
|
575
|
-
"type": "number"
|
|
576
|
-
},
|
|
577
|
-
"launch_url": {
|
|
578
|
-
"type": "string"
|
|
579
|
-
},
|
|
580
|
-
"launchUrl": {
|
|
581
|
-
"type": "string"
|
|
582
|
-
},
|
|
583
|
-
"url": {
|
|
584
|
-
"type": "string"
|
|
585
|
-
},
|
|
586
|
-
"adb_serial": {
|
|
587
|
-
"type": "string"
|
|
588
|
-
},
|
|
589
|
-
"android_device": {
|
|
590
|
-
"type": "string"
|
|
591
|
-
},
|
|
592
|
-
"device": {
|
|
593
|
-
"type": "string"
|
|
594
|
-
},
|
|
595
|
-
"package_id": {
|
|
596
|
-
"type": "string"
|
|
597
|
-
},
|
|
598
|
-
"packageName": {
|
|
599
|
-
"type": "string"
|
|
600
|
-
},
|
|
601
|
-
"app_id": {
|
|
602
|
-
"type": "string"
|
|
603
|
-
},
|
|
604
|
-
"simulator": {
|
|
605
|
-
"type": "string"
|
|
606
|
-
},
|
|
607
|
-
"ios_simulator": {
|
|
608
|
-
"type": "string"
|
|
609
|
-
},
|
|
610
|
-
"bundle_id": {
|
|
611
|
-
"type": "string"
|
|
612
|
-
},
|
|
613
|
-
"bundleId": {
|
|
614
|
-
"type": "string"
|
|
615
|
-
}
|
|
616
|
-
},
|
|
617
|
-
"additionalProperties": false
|
|
618
|
-
}
|
|
619
|
-
},
|
|
620
|
-
"assert_file": {
|
|
621
|
-
"description": "Assert that a project file exists and optionally contains text.",
|
|
622
|
-
"examples": [
|
|
623
|
-
{
|
|
624
|
-
"node": {
|
|
625
|
-
"action": "assert_file",
|
|
626
|
-
"path": "reports/result.txt",
|
|
627
|
-
"contains": "ok",
|
|
628
|
-
"intent": "Assert that a project file exists and optionally contains text"
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
],
|
|
632
|
-
"schema": {
|
|
633
|
-
"type": "object",
|
|
634
|
-
"properties": {
|
|
635
|
-
"path": {
|
|
636
|
-
"type": "string"
|
|
637
|
-
},
|
|
638
|
-
"contains": {
|
|
639
|
-
"type": "string"
|
|
640
|
-
}
|
|
641
|
-
},
|
|
642
|
-
"required": [
|
|
643
|
-
"path"
|
|
644
|
-
],
|
|
645
|
-
"additionalProperties": false
|
|
646
|
-
}
|
|
647
|
-
},
|
|
648
|
-
"assert_json": {
|
|
649
|
-
"description": "Assert a JSON file value with a JSONPath-style selector.",
|
|
650
|
-
"examples": [
|
|
651
|
-
{
|
|
652
|
-
"node": {
|
|
653
|
-
"action": "assert_json",
|
|
654
|
-
"path": "reports/result.json",
|
|
655
|
-
"assert": {
|
|
656
|
-
"path": "$.status",
|
|
657
|
-
"operator": "eq",
|
|
658
|
-
"value": "ok"
|
|
659
|
-
},
|
|
660
|
-
"intent": "Assert a JSON file value with a JSONPath-style selector"
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
],
|
|
664
|
-
"schema": {
|
|
665
|
-
"type": "object",
|
|
666
|
-
"properties": {
|
|
667
|
-
"path": {
|
|
668
|
-
"type": "string"
|
|
669
|
-
},
|
|
670
|
-
"assert": {
|
|
671
|
-
"type": "object",
|
|
672
|
-
"properties": {
|
|
673
|
-
"path": {
|
|
674
|
-
"type": "string"
|
|
675
|
-
},
|
|
676
|
-
"operator": {
|
|
677
|
-
"type": "string"
|
|
678
|
-
},
|
|
679
|
-
"value": {
|
|
680
|
-
"type": [
|
|
681
|
-
"string",
|
|
682
|
-
"number",
|
|
683
|
-
"integer",
|
|
684
|
-
"boolean",
|
|
685
|
-
"object",
|
|
686
|
-
"array"
|
|
687
|
-
],
|
|
688
|
-
"items": {
|
|
689
|
-
"type": [
|
|
690
|
-
"string",
|
|
691
|
-
"number",
|
|
692
|
-
"integer",
|
|
693
|
-
"boolean",
|
|
694
|
-
"object"
|
|
695
|
-
]
|
|
696
|
-
}
|
|
697
|
-
},
|
|
698
|
-
"all": {
|
|
699
|
-
"type": "array",
|
|
700
|
-
"items": {
|
|
701
|
-
"type": "object"
|
|
702
|
-
}
|
|
703
|
-
},
|
|
704
|
-
"any": {
|
|
705
|
-
"type": "array",
|
|
706
|
-
"items": {
|
|
707
|
-
"type": "object"
|
|
708
|
-
}
|
|
709
|
-
},
|
|
710
|
-
"none": {
|
|
711
|
-
"type": "array",
|
|
712
|
-
"items": {
|
|
713
|
-
"type": "object"
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
},
|
|
717
|
-
"additionalProperties": false
|
|
718
|
-
}
|
|
719
|
-
},
|
|
720
|
-
"required": [
|
|
721
|
-
"path",
|
|
722
|
-
"assert"
|
|
723
|
-
],
|
|
724
|
-
"additionalProperties": false
|
|
725
|
-
}
|
|
726
|
-
},
|
|
727
|
-
"assert_exit_code": {
|
|
728
|
-
"description": "Assert the exit code captured from a command node output.",
|
|
729
|
-
"examples": [
|
|
730
|
-
{
|
|
731
|
-
"node": {
|
|
732
|
-
"action": "assert_exit_code",
|
|
733
|
-
"source": "run-tests",
|
|
734
|
-
"expected": 0,
|
|
735
|
-
"intent": "Assert the exit code captured from a command node output"
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
],
|
|
739
|
-
"schema": {
|
|
740
|
-
"type": "object",
|
|
741
|
-
"properties": {
|
|
742
|
-
"source": {
|
|
743
|
-
"type": "string"
|
|
744
|
-
},
|
|
745
|
-
"node": {
|
|
746
|
-
"type": "string"
|
|
747
|
-
},
|
|
748
|
-
"expected": {
|
|
749
|
-
"type": "number"
|
|
750
|
-
}
|
|
751
|
-
},
|
|
752
|
-
"additionalProperties": false
|
|
753
|
-
}
|
|
754
|
-
},
|
|
755
|
-
"assert_output": {
|
|
756
|
-
"description": "Assert stdout or stderr captured from a command node output.",
|
|
757
|
-
"examples": [
|
|
758
|
-
{
|
|
759
|
-
"node": {
|
|
760
|
-
"action": "assert_output",
|
|
761
|
-
"source": "run-tests",
|
|
762
|
-
"stream": "stdout",
|
|
763
|
-
"contains": "PASS",
|
|
764
|
-
"intent": "Assert stdout or stderr captured from a command node output"
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
],
|
|
768
|
-
"schema": {
|
|
769
|
-
"type": "object",
|
|
770
|
-
"properties": {
|
|
771
|
-
"source": {
|
|
772
|
-
"type": "string"
|
|
773
|
-
},
|
|
774
|
-
"node": {
|
|
775
|
-
"type": "string"
|
|
776
|
-
},
|
|
777
|
-
"stream": {
|
|
778
|
-
"type": "string"
|
|
779
|
-
},
|
|
780
|
-
"contains": {
|
|
781
|
-
"type": "string"
|
|
782
|
-
},
|
|
783
|
-
"match": {
|
|
784
|
-
"type": "string"
|
|
785
|
-
},
|
|
786
|
-
"assert": {
|
|
787
|
-
"type": "object",
|
|
788
|
-
"properties": {
|
|
789
|
-
"path": {
|
|
790
|
-
"type": "string"
|
|
791
|
-
},
|
|
792
|
-
"operator": {
|
|
793
|
-
"type": "string"
|
|
794
|
-
},
|
|
795
|
-
"value": {
|
|
796
|
-
"type": [
|
|
797
|
-
"string",
|
|
798
|
-
"number",
|
|
799
|
-
"integer",
|
|
800
|
-
"boolean",
|
|
801
|
-
"object",
|
|
802
|
-
"array"
|
|
803
|
-
],
|
|
804
|
-
"items": {
|
|
805
|
-
"type": [
|
|
806
|
-
"string",
|
|
807
|
-
"number",
|
|
808
|
-
"integer",
|
|
809
|
-
"boolean",
|
|
810
|
-
"object"
|
|
811
|
-
]
|
|
812
|
-
}
|
|
813
|
-
},
|
|
814
|
-
"all": {
|
|
815
|
-
"type": "array",
|
|
816
|
-
"items": {
|
|
817
|
-
"type": "object"
|
|
818
|
-
}
|
|
819
|
-
},
|
|
820
|
-
"any": {
|
|
821
|
-
"type": "array",
|
|
822
|
-
"items": {
|
|
823
|
-
"type": "object"
|
|
824
|
-
}
|
|
825
|
-
},
|
|
826
|
-
"none": {
|
|
827
|
-
"type": "array",
|
|
828
|
-
"items": {
|
|
829
|
-
"type": "object"
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
},
|
|
833
|
-
"additionalProperties": false
|
|
826
|
+
"metro_port": {
|
|
827
|
+
"type": "number"
|
|
828
|
+
},
|
|
829
|
+
"launch_url": {
|
|
830
|
+
"type": "string"
|
|
831
|
+
},
|
|
832
|
+
"launchUrl": {
|
|
833
|
+
"type": "string"
|
|
834
|
+
},
|
|
835
|
+
"url": {
|
|
836
|
+
"type": "string"
|
|
837
|
+
},
|
|
838
|
+
"adb_serial": {
|
|
839
|
+
"type": "string"
|
|
840
|
+
},
|
|
841
|
+
"android_device": {
|
|
842
|
+
"type": "string"
|
|
843
|
+
},
|
|
844
|
+
"device": {
|
|
845
|
+
"type": "string"
|
|
846
|
+
},
|
|
847
|
+
"package_id": {
|
|
848
|
+
"type": "string"
|
|
849
|
+
},
|
|
850
|
+
"packageName": {
|
|
851
|
+
"type": "string"
|
|
852
|
+
},
|
|
853
|
+
"app_id": {
|
|
854
|
+
"type": "string"
|
|
855
|
+
},
|
|
856
|
+
"simulator": {
|
|
857
|
+
"type": "string"
|
|
858
|
+
},
|
|
859
|
+
"ios_simulator": {
|
|
860
|
+
"type": "string"
|
|
861
|
+
},
|
|
862
|
+
"bundle_id": {
|
|
863
|
+
"type": "string"
|
|
864
|
+
},
|
|
865
|
+
"bundleId": {
|
|
866
|
+
"type": "string"
|
|
834
867
|
}
|
|
835
868
|
},
|
|
836
869
|
"additionalProperties": false
|
|
837
870
|
}
|
|
838
871
|
},
|
|
872
|
+
"app.status": {
|
|
873
|
+
"description": "Report the adapter's static status — platform, project root, resolved checkout shape, and headless compatibility mode (no live route or account).",
|
|
874
|
+
"examples": [
|
|
875
|
+
{
|
|
876
|
+
"action": "app.status",
|
|
877
|
+
"intent": "Record the resolved application state before continuing.",
|
|
878
|
+
"next": "done"
|
|
879
|
+
}
|
|
880
|
+
],
|
|
881
|
+
"schema": {
|
|
882
|
+
"type": "object",
|
|
883
|
+
"properties": {},
|
|
884
|
+
"additionalProperties": false
|
|
885
|
+
}
|
|
886
|
+
},
|
|
839
887
|
"app.hud": {
|
|
840
888
|
"description": "Display minimal human-readable recipe progress. The intent must explain the current agent goal; debug metadata and grouping labels are hidden unless explicitly opted in.",
|
|
841
889
|
"examples": [
|
|
842
890
|
{
|
|
843
|
-
"
|
|
844
|
-
"
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
"
|
|
848
|
-
"
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
}
|
|
852
|
-
}
|
|
891
|
+
"action": "app.hud",
|
|
892
|
+
"status": "running",
|
|
893
|
+
"intent": "Show the current goal to the supervising human.",
|
|
894
|
+
"progress": {
|
|
895
|
+
"current": 12,
|
|
896
|
+
"total": 19
|
|
897
|
+
},
|
|
898
|
+
"next": "done"
|
|
853
899
|
}
|
|
854
900
|
],
|
|
855
|
-
"safety_notes": "HUD is reviewer feedback only. It must not mutate product state or carry task assertions; trace/artifacts remain authoritative.",
|
|
856
901
|
"schema": {
|
|
857
902
|
"type": "object",
|
|
858
903
|
"properties": {
|
|
@@ -904,101 +949,14 @@
|
|
|
904
949
|
"additionalProperties": false
|
|
905
950
|
}
|
|
906
951
|
},
|
|
907
|
-
"ui.set_input": {
|
|
908
|
-
"description": "Set text on a React Native TextInput by testID through the app control bridge.",
|
|
909
|
-
"schema": {
|
|
910
|
-
"type": "object",
|
|
911
|
-
"properties": {
|
|
912
|
-
"selector": {
|
|
913
|
-
"type": "string"
|
|
914
|
-
},
|
|
915
|
-
"test_id": {
|
|
916
|
-
"type": "string"
|
|
917
|
-
},
|
|
918
|
-
"testID": {
|
|
919
|
-
"type": "string"
|
|
920
|
-
},
|
|
921
|
-
"value": {
|
|
922
|
-
"type": "string"
|
|
923
|
-
},
|
|
924
|
-
"text": {
|
|
925
|
-
"type": "string"
|
|
926
|
-
},
|
|
927
|
-
"timeout_ms": {
|
|
928
|
-
"type": "number"
|
|
929
|
-
},
|
|
930
|
-
"settle": {
|
|
931
|
-
"type": "boolean"
|
|
932
|
-
}
|
|
933
|
-
},
|
|
934
|
-
"additionalProperties": false
|
|
935
|
-
},
|
|
936
|
-
"examples": [
|
|
937
|
-
{
|
|
938
|
-
"node": {
|
|
939
|
-
"action": "ui.set_input",
|
|
940
|
-
"test_id": "network-selector-network-search-input",
|
|
941
|
-
"value": "Sepolia",
|
|
942
|
-
"intent": "Set text on a React Native TextInput by testID through the app control bridge"
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
]
|
|
946
|
-
},
|
|
947
|
-
"ui.key_press": {
|
|
948
|
-
"description": "Send a trusted keyboard press to the currently focused UI element through the UI transport.",
|
|
949
|
-
"schema": {
|
|
950
|
-
"type": "object",
|
|
951
|
-
"properties": {
|
|
952
|
-
"key": {
|
|
953
|
-
"type": "string"
|
|
954
|
-
},
|
|
955
|
-
"timeout_ms": {
|
|
956
|
-
"type": "number"
|
|
957
|
-
},
|
|
958
|
-
"settle": {
|
|
959
|
-
"type": "boolean"
|
|
960
|
-
}
|
|
961
|
-
},
|
|
962
|
-
"required": [
|
|
963
|
-
"key"
|
|
964
|
-
],
|
|
965
|
-
"additionalProperties": false
|
|
966
|
-
},
|
|
967
|
-
"examples": [
|
|
968
|
-
{
|
|
969
|
-
"node": {
|
|
970
|
-
"action": "ui.key_press",
|
|
971
|
-
"key": "Enter",
|
|
972
|
-
"intent": "Send a trusted Enter key press to the focused UI element"
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
]
|
|
976
|
-
},
|
|
977
|
-
"app.status": {
|
|
978
|
-
"description": "Report the adapter's static status — platform, project root, resolved checkout shape, and headless compatibility mode (no live route or account).",
|
|
979
|
-
"examples": [
|
|
980
|
-
{
|
|
981
|
-
"node": {
|
|
982
|
-
"action": "app.status",
|
|
983
|
-
"intent": "Report the resolved checkout status"
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
],
|
|
987
|
-
"schema": {
|
|
988
|
-
"type": "object",
|
|
989
|
-
"properties": {},
|
|
990
|
-
"additionalProperties": false
|
|
991
|
-
}
|
|
992
|
-
},
|
|
993
952
|
"cdp.target": {
|
|
994
953
|
"description": "Probe the platform debug transport — Chrome CDP for extension, the React Native debug bridge for mobile — and report whether it is reachable.",
|
|
995
954
|
"examples": [
|
|
996
955
|
{
|
|
997
|
-
"
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
}
|
|
956
|
+
"action": "cdp.target",
|
|
957
|
+
"require_reachable": true,
|
|
958
|
+
"intent": "Confirm the requested application target is available.",
|
|
959
|
+
"next": "done"
|
|
1002
960
|
}
|
|
1003
961
|
],
|
|
1004
962
|
"schema": {
|
|
@@ -1032,23 +990,7 @@
|
|
|
1032
990
|
"additionalProperties": false
|
|
1033
991
|
}
|
|
1034
992
|
},
|
|
1035
|
-
"
|
|
1036
|
-
"description": "Invoke a named recipe by ref and run its steps inline.",
|
|
1037
|
-
"examples": [
|
|
1038
|
-
{
|
|
1039
|
-
"node": {
|
|
1040
|
-
"action": "call",
|
|
1041
|
-
"ref": "mydev.open_perps_setup",
|
|
1042
|
-
"intent": "Run a personal Perps setup recipe"
|
|
1043
|
-
}
|
|
1044
|
-
}
|
|
1045
|
-
]
|
|
1046
|
-
}
|
|
1047
|
-
},
|
|
1048
|
-
"custom_actions": [
|
|
1049
|
-
{
|
|
1050
|
-
"name": "metamask.wallet.fixture_status",
|
|
1051
|
-
"owner": "metamask",
|
|
993
|
+
"metamask.wallet.fixture_status": {
|
|
1052
994
|
"description": "Report the on-disk wallet fixture status (accounts and password presence) without launching or mutating the app.",
|
|
1053
995
|
"schema": {
|
|
1054
996
|
"type": "object",
|
|
@@ -1057,20 +999,14 @@
|
|
|
1057
999
|
},
|
|
1058
1000
|
"examples": [
|
|
1059
1001
|
{
|
|
1060
|
-
"
|
|
1061
|
-
"
|
|
1062
|
-
|
|
1063
|
-
"intent": "Check wallet fixture status"
|
|
1064
|
-
}
|
|
1002
|
+
"action": "metamask.wallet.fixture_status",
|
|
1003
|
+
"intent": "Check wallet fixture status",
|
|
1004
|
+
"next": "done"
|
|
1065
1005
|
}
|
|
1066
1006
|
],
|
|
1067
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1068
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1069
1007
|
"execution_capabilities": []
|
|
1070
1008
|
},
|
|
1071
|
-
{
|
|
1072
|
-
"name": "metamask.wallet.setup",
|
|
1073
|
-
"owner": "metamask",
|
|
1009
|
+
"metamask.wallet.setup": {
|
|
1074
1010
|
"description": "Import the wallet fixture accounts and password so the app starts from a known signed-in state.",
|
|
1075
1011
|
"schema": {
|
|
1076
1012
|
"type": "object",
|
|
@@ -1079,22 +1015,16 @@
|
|
|
1079
1015
|
},
|
|
1080
1016
|
"examples": [
|
|
1081
1017
|
{
|
|
1082
|
-
"
|
|
1083
|
-
"
|
|
1084
|
-
|
|
1085
|
-
"intent": "Prepare the wallet fixture for recipe execution"
|
|
1086
|
-
}
|
|
1018
|
+
"action": "metamask.wallet.setup",
|
|
1019
|
+
"intent": "Prepare the wallet fixture for recipe execution",
|
|
1020
|
+
"next": "done"
|
|
1087
1021
|
}
|
|
1088
1022
|
],
|
|
1089
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1090
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1091
1023
|
"execution_capabilities": [
|
|
1092
1024
|
"app-mutation"
|
|
1093
1025
|
]
|
|
1094
1026
|
},
|
|
1095
|
-
{
|
|
1096
|
-
"name": "metamask.wallet.ensure_unlocked",
|
|
1097
|
-
"owner": "metamask",
|
|
1027
|
+
"metamask.wallet.ensure_unlocked": {
|
|
1098
1028
|
"description": "Unlock the wallet with the fixture password when it is currently locked.",
|
|
1099
1029
|
"schema": {
|
|
1100
1030
|
"type": "object",
|
|
@@ -1110,22 +1040,16 @@
|
|
|
1110
1040
|
},
|
|
1111
1041
|
"examples": [
|
|
1112
1042
|
{
|
|
1113
|
-
"
|
|
1114
|
-
"
|
|
1115
|
-
|
|
1116
|
-
"intent": "Ensure the wallet is unlocked before proof steps"
|
|
1117
|
-
}
|
|
1043
|
+
"action": "metamask.wallet.ensure_unlocked",
|
|
1044
|
+
"intent": "Ensure the wallet is unlocked before proof steps",
|
|
1045
|
+
"next": "done"
|
|
1118
1046
|
}
|
|
1119
1047
|
],
|
|
1120
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1121
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1122
1048
|
"execution_capabilities": [
|
|
1123
1049
|
"app-mutation"
|
|
1124
1050
|
]
|
|
1125
1051
|
},
|
|
1126
|
-
{
|
|
1127
|
-
"name": "metamask.wallet.select_account",
|
|
1128
|
-
"owner": "metamask",
|
|
1052
|
+
"metamask.wallet.select_account": {
|
|
1129
1053
|
"description": "mobile action to select a wallet account by address, id, or display name.",
|
|
1130
1054
|
"schema": {
|
|
1131
1055
|
"type": "object",
|
|
@@ -1147,31 +1071,23 @@
|
|
|
1147
1071
|
},
|
|
1148
1072
|
"examples": [
|
|
1149
1073
|
{
|
|
1150
|
-
"
|
|
1151
|
-
"
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
"intent": "Select the requested wallet account"
|
|
1155
|
-
}
|
|
1074
|
+
"action": "metamask.wallet.select_account",
|
|
1075
|
+
"address": "0x8dc623e964475d4d669da601fd15ea9125469003",
|
|
1076
|
+
"intent": "Select the requested wallet account",
|
|
1077
|
+
"next": "done"
|
|
1156
1078
|
},
|
|
1157
1079
|
{
|
|
1158
|
-
"
|
|
1159
|
-
"
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
"intent": "Select the requested wallet account"
|
|
1163
|
-
}
|
|
1080
|
+
"action": "metamask.wallet.select_account",
|
|
1081
|
+
"name": "dev1",
|
|
1082
|
+
"intent": "Select the requested wallet account",
|
|
1083
|
+
"next": "done"
|
|
1164
1084
|
}
|
|
1165
1085
|
],
|
|
1166
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1167
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1168
1086
|
"execution_capabilities": [
|
|
1169
1087
|
"app-mutation"
|
|
1170
1088
|
]
|
|
1171
1089
|
},
|
|
1172
|
-
{
|
|
1173
|
-
"name": "metamask.wallet.list_accounts",
|
|
1174
|
-
"owner": "metamask",
|
|
1090
|
+
"metamask.wallet.list_accounts": {
|
|
1175
1091
|
"description": "List redacted wallet accounts and identify the selected account without mutating the app.",
|
|
1176
1092
|
"schema": {
|
|
1177
1093
|
"type": "object",
|
|
@@ -1192,20 +1108,14 @@
|
|
|
1192
1108
|
},
|
|
1193
1109
|
"examples": [
|
|
1194
1110
|
{
|
|
1195
|
-
"
|
|
1196
|
-
"
|
|
1197
|
-
|
|
1198
|
-
"intent": "Discover the available wallet accounts"
|
|
1199
|
-
}
|
|
1111
|
+
"action": "metamask.wallet.list_accounts",
|
|
1112
|
+
"intent": "Discover the available wallet accounts",
|
|
1113
|
+
"next": "done"
|
|
1200
1114
|
}
|
|
1201
1115
|
],
|
|
1202
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1203
|
-
"safety_notes": "Read-only account metadata; must never expose keys, mnemonics, vault data, or credentials.",
|
|
1204
1116
|
"execution_capabilities": []
|
|
1205
1117
|
},
|
|
1206
|
-
{
|
|
1207
|
-
"name": "metamask.wallet.read_state",
|
|
1208
|
-
"owner": "metamask",
|
|
1118
|
+
"metamask.wallet.read_state": {
|
|
1209
1119
|
"description": "Read the redacted wallet state (selected account, route, and device) from the running app.",
|
|
1210
1120
|
"schema": {
|
|
1211
1121
|
"type": "object",
|
|
@@ -1214,20 +1124,14 @@
|
|
|
1214
1124
|
},
|
|
1215
1125
|
"examples": [
|
|
1216
1126
|
{
|
|
1217
|
-
"
|
|
1218
|
-
"
|
|
1219
|
-
|
|
1220
|
-
"intent": "Read wallet state needed for the proof"
|
|
1221
|
-
}
|
|
1127
|
+
"action": "metamask.wallet.read_state",
|
|
1128
|
+
"intent": "Read wallet state needed for the proof",
|
|
1129
|
+
"next": "done"
|
|
1222
1130
|
}
|
|
1223
1131
|
],
|
|
1224
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1225
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1226
1132
|
"execution_capabilities": []
|
|
1227
1133
|
},
|
|
1228
|
-
{
|
|
1229
|
-
"name": "metamask.perps.read_positions",
|
|
1230
|
-
"owner": "metamask",
|
|
1134
|
+
"metamask.perps.read_positions": {
|
|
1231
1135
|
"description": "mobile Read live Perps positions; without a selector, return all live positions.",
|
|
1232
1136
|
"schema": {
|
|
1233
1137
|
"type": "object",
|
|
@@ -1316,21 +1220,15 @@
|
|
|
1316
1220
|
},
|
|
1317
1221
|
"examples": [
|
|
1318
1222
|
{
|
|
1319
|
-
"
|
|
1320
|
-
"
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
"intent": "Read Perps positions needed for the proof"
|
|
1324
|
-
}
|
|
1223
|
+
"action": "metamask.perps.read_positions",
|
|
1224
|
+
"market": "BTC",
|
|
1225
|
+
"intent": "Read Perps positions needed for the proof",
|
|
1226
|
+
"next": "done"
|
|
1325
1227
|
}
|
|
1326
1228
|
],
|
|
1327
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1328
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1329
1229
|
"execution_capabilities": []
|
|
1330
1230
|
},
|
|
1331
|
-
{
|
|
1332
|
-
"name": "metamask.perps.read_orders",
|
|
1333
|
-
"owner": "metamask",
|
|
1231
|
+
"metamask.perps.read_orders": {
|
|
1334
1232
|
"description": "mobile Read live Perps open orders; without a selector, return all live orders.",
|
|
1335
1233
|
"schema": {
|
|
1336
1234
|
"type": "object",
|
|
@@ -1419,21 +1317,15 @@
|
|
|
1419
1317
|
},
|
|
1420
1318
|
"examples": [
|
|
1421
1319
|
{
|
|
1422
|
-
"
|
|
1423
|
-
"
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
"intent": "Read Perps open orders needed for the proof"
|
|
1427
|
-
}
|
|
1320
|
+
"action": "metamask.perps.read_orders",
|
|
1321
|
+
"market": "BTC",
|
|
1322
|
+
"intent": "Read Perps open orders needed for the proof",
|
|
1323
|
+
"next": "done"
|
|
1428
1324
|
}
|
|
1429
1325
|
],
|
|
1430
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1431
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1432
1326
|
"execution_capabilities": []
|
|
1433
1327
|
},
|
|
1434
|
-
{
|
|
1435
|
-
"name": "metamask.perps.close_positions",
|
|
1436
|
-
"owner": "metamask",
|
|
1328
|
+
"metamask.perps.close_positions": {
|
|
1437
1329
|
"description": "mobile Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested. Close selected live Perps positions. Use selector/mode params to close matching symbols or all positions.",
|
|
1438
1330
|
"schema": {
|
|
1439
1331
|
"type": "object",
|
|
@@ -1522,35 +1414,27 @@
|
|
|
1522
1414
|
},
|
|
1523
1415
|
"examples": [
|
|
1524
1416
|
{
|
|
1525
|
-
"
|
|
1526
|
-
"
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
"intent": "Close selected Perps positions before continuing"
|
|
1530
|
-
}
|
|
1417
|
+
"action": "metamask.perps.close_positions",
|
|
1418
|
+
"mode": "all",
|
|
1419
|
+
"intent": "Close selected Perps positions before continuing",
|
|
1420
|
+
"next": "done"
|
|
1531
1421
|
},
|
|
1532
1422
|
{
|
|
1533
|
-
"
|
|
1534
|
-
"
|
|
1535
|
-
"
|
|
1536
|
-
"
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
"intent": "Close selected Perps positions before continuing"
|
|
1541
|
-
}
|
|
1423
|
+
"action": "metamask.perps.close_positions",
|
|
1424
|
+
"markets": [
|
|
1425
|
+
"BTC",
|
|
1426
|
+
"ETH"
|
|
1427
|
+
],
|
|
1428
|
+
"intent": "Close selected Perps positions before continuing",
|
|
1429
|
+
"next": "done"
|
|
1542
1430
|
}
|
|
1543
1431
|
],
|
|
1544
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1545
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1546
1432
|
"execution_capabilities": [
|
|
1547
1433
|
"app-mutation",
|
|
1548
1434
|
"external-mutation"
|
|
1549
1435
|
]
|
|
1550
1436
|
},
|
|
1551
|
-
{
|
|
1552
|
-
"name": "metamask.perps.close_orders",
|
|
1553
|
-
"owner": "metamask",
|
|
1437
|
+
"metamask.perps.close_orders": {
|
|
1554
1438
|
"description": "mobile Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested. Cancel selected live Perps open orders. Use selector/mode params to cancel matching symbols or all orders.",
|
|
1555
1439
|
"schema": {
|
|
1556
1440
|
"type": "object",
|
|
@@ -1639,32 +1523,24 @@
|
|
|
1639
1523
|
},
|
|
1640
1524
|
"examples": [
|
|
1641
1525
|
{
|
|
1642
|
-
"
|
|
1643
|
-
"
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
"intent": "Cancel selected Perps orders before continuing"
|
|
1647
|
-
}
|
|
1526
|
+
"action": "metamask.perps.close_orders",
|
|
1527
|
+
"mode": "all",
|
|
1528
|
+
"intent": "Cancel selected Perps orders before continuing",
|
|
1529
|
+
"next": "done"
|
|
1648
1530
|
},
|
|
1649
1531
|
{
|
|
1650
|
-
"
|
|
1651
|
-
"
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
"intent": "Cancel selected Perps orders before continuing"
|
|
1655
|
-
}
|
|
1532
|
+
"action": "metamask.perps.close_orders",
|
|
1533
|
+
"market": "BTC",
|
|
1534
|
+
"intent": "Cancel selected Perps orders before continuing",
|
|
1535
|
+
"next": "done"
|
|
1656
1536
|
}
|
|
1657
1537
|
],
|
|
1658
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1659
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1660
1538
|
"execution_capabilities": [
|
|
1661
1539
|
"app-mutation",
|
|
1662
1540
|
"external-mutation"
|
|
1663
1541
|
]
|
|
1664
1542
|
},
|
|
1665
|
-
{
|
|
1666
|
-
"name": "metamask.perps.place_order",
|
|
1667
|
-
"owner": "metamask",
|
|
1543
|
+
"metamask.perps.place_order": {
|
|
1668
1544
|
"description": "mobile Place a Perps order through a supported app/API path. Default to testnet; mainnet order placement requires an explicit user request.",
|
|
1669
1545
|
"schema": {
|
|
1670
1546
|
"type": "object",
|
|
@@ -1775,27 +1651,21 @@
|
|
|
1775
1651
|
},
|
|
1776
1652
|
"examples": [
|
|
1777
1653
|
{
|
|
1778
|
-
"
|
|
1779
|
-
"
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
"intent": "Place the requested Perps order"
|
|
1786
|
-
}
|
|
1654
|
+
"action": "metamask.perps.place_order",
|
|
1655
|
+
"market": "BTC",
|
|
1656
|
+
"side": "long",
|
|
1657
|
+
"notional": "10",
|
|
1658
|
+
"leverage": 2,
|
|
1659
|
+
"intent": "Place the requested Perps order",
|
|
1660
|
+
"next": "done"
|
|
1787
1661
|
}
|
|
1788
1662
|
],
|
|
1789
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1790
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1791
1663
|
"execution_capabilities": [
|
|
1792
1664
|
"app-mutation",
|
|
1793
1665
|
"external-mutation"
|
|
1794
1666
|
]
|
|
1795
1667
|
},
|
|
1796
|
-
{
|
|
1797
|
-
"name": "metamask.perps.assert_positions",
|
|
1798
|
-
"owner": "metamask",
|
|
1668
|
+
"metamask.perps.assert_positions": {
|
|
1799
1669
|
"description": "mobile Assert live Perps positions are present or absent for an explicit market selection or mode=all.",
|
|
1800
1670
|
"schema": {
|
|
1801
1671
|
"type": "object",
|
|
@@ -1898,22 +1768,16 @@
|
|
|
1898
1768
|
},
|
|
1899
1769
|
"examples": [
|
|
1900
1770
|
{
|
|
1901
|
-
"
|
|
1902
|
-
"
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
"intent": "Assert the expected Perps position state"
|
|
1907
|
-
}
|
|
1771
|
+
"action": "metamask.perps.assert_positions",
|
|
1772
|
+
"state": "open",
|
|
1773
|
+
"market": "BTC",
|
|
1774
|
+
"intent": "Assert the expected Perps position state",
|
|
1775
|
+
"next": "done"
|
|
1908
1776
|
}
|
|
1909
1777
|
],
|
|
1910
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1911
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1912
1778
|
"execution_capabilities": []
|
|
1913
1779
|
},
|
|
1914
|
-
{
|
|
1915
|
-
"name": "metamask.perps.assert_orders",
|
|
1916
|
-
"owner": "metamask",
|
|
1780
|
+
"metamask.perps.assert_orders": {
|
|
1917
1781
|
"description": "mobile Assert live Perps open orders are present or absent for an explicit market selection or mode=all.",
|
|
1918
1782
|
"schema": {
|
|
1919
1783
|
"type": "object",
|
|
@@ -2016,22 +1880,16 @@
|
|
|
2016
1880
|
},
|
|
2017
1881
|
"examples": [
|
|
2018
1882
|
{
|
|
2019
|
-
"
|
|
2020
|
-
"
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
"intent": "Assert the expected Perps open order state"
|
|
2025
|
-
}
|
|
1883
|
+
"action": "metamask.perps.assert_orders",
|
|
1884
|
+
"state": "none",
|
|
1885
|
+
"market": "BTC",
|
|
1886
|
+
"intent": "Assert the expected Perps open order state",
|
|
1887
|
+
"next": "done"
|
|
2026
1888
|
}
|
|
2027
1889
|
],
|
|
2028
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
2029
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
2030
1890
|
"execution_capabilities": []
|
|
2031
1891
|
},
|
|
2032
|
-
{
|
|
2033
|
-
"name": "metamask.perps.ensure_positions",
|
|
2034
|
-
"owner": "metamask",
|
|
1892
|
+
"metamask.perps.ensure_positions": {
|
|
2035
1893
|
"description": "mobile Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested. Higher-level wrapper that reads selected positions, closes or places when needed, then asserts final position state.",
|
|
2036
1894
|
"schema": {
|
|
2037
1895
|
"type": "object",
|
|
@@ -2148,45 +2006,35 @@
|
|
|
2148
2006
|
},
|
|
2149
2007
|
"examples": [
|
|
2150
2008
|
{
|
|
2151
|
-
"
|
|
2152
|
-
"
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
"intent": "Converge Perps positions to the requested state"
|
|
2157
|
-
}
|
|
2009
|
+
"action": "metamask.perps.ensure_positions",
|
|
2010
|
+
"state": "none",
|
|
2011
|
+
"market": "BTC",
|
|
2012
|
+
"intent": "Converge Perps positions to the requested state",
|
|
2013
|
+
"next": "done"
|
|
2158
2014
|
},
|
|
2159
2015
|
{
|
|
2160
|
-
"
|
|
2161
|
-
"
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
"intent": "Converge Perps positions to the requested state"
|
|
2166
|
-
}
|
|
2016
|
+
"action": "metamask.perps.ensure_positions",
|
|
2017
|
+
"state": "none",
|
|
2018
|
+
"mode": "all",
|
|
2019
|
+
"intent": "Converge Perps positions to the requested state",
|
|
2020
|
+
"next": "done"
|
|
2167
2021
|
},
|
|
2168
2022
|
{
|
|
2169
|
-
"
|
|
2170
|
-
"
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
"intent": "Converge ETH positions to one explicit testnet precondition"
|
|
2177
|
-
}
|
|
2023
|
+
"action": "metamask.perps.ensure_positions",
|
|
2024
|
+
"market": "ETH",
|
|
2025
|
+
"side": "long",
|
|
2026
|
+
"state": "open",
|
|
2027
|
+
"notional": "10",
|
|
2028
|
+
"intent": "Converge ETH positions to one explicit testnet precondition",
|
|
2029
|
+
"next": "done"
|
|
2178
2030
|
}
|
|
2179
2031
|
],
|
|
2180
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
2181
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
2182
2032
|
"execution_capabilities": [
|
|
2183
2033
|
"app-mutation",
|
|
2184
2034
|
"external-mutation"
|
|
2185
2035
|
]
|
|
2186
2036
|
},
|
|
2187
|
-
{
|
|
2188
|
-
"name": "metamask.perps.ensure_orders",
|
|
2189
|
-
"owner": "metamask",
|
|
2037
|
+
"metamask.perps.ensure_orders": {
|
|
2190
2038
|
"description": "mobile Converge selected testnet orders to open or absent, then independently assert the final state. Creating an open state uses a resting limit order.",
|
|
2191
2039
|
"schema": {
|
|
2192
2040
|
"type": "object",
|
|
@@ -2308,37 +2156,29 @@
|
|
|
2308
2156
|
},
|
|
2309
2157
|
"examples": [
|
|
2310
2158
|
{
|
|
2311
|
-
"
|
|
2312
|
-
"
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
"intent": "Converge Perps orders to the requested state"
|
|
2317
|
-
}
|
|
2159
|
+
"action": "metamask.perps.ensure_orders",
|
|
2160
|
+
"state": "none",
|
|
2161
|
+
"mode": "all",
|
|
2162
|
+
"intent": "Converge Perps orders to the requested state",
|
|
2163
|
+
"next": "done"
|
|
2318
2164
|
},
|
|
2319
2165
|
{
|
|
2320
|
-
"
|
|
2321
|
-
"
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
"intent": "Converge ETH open orders to one deterministic testnet precondition"
|
|
2329
|
-
}
|
|
2166
|
+
"action": "metamask.perps.ensure_orders",
|
|
2167
|
+
"market": "ETH",
|
|
2168
|
+
"side": "short",
|
|
2169
|
+
"state": "open",
|
|
2170
|
+
"notional": 10,
|
|
2171
|
+
"leverage": 2,
|
|
2172
|
+
"intent": "Converge ETH open orders to one deterministic testnet precondition",
|
|
2173
|
+
"next": "done"
|
|
2330
2174
|
}
|
|
2331
2175
|
],
|
|
2332
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
2333
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
2334
2176
|
"execution_capabilities": [
|
|
2335
2177
|
"app-mutation",
|
|
2336
2178
|
"external-mutation"
|
|
2337
2179
|
]
|
|
2338
2180
|
},
|
|
2339
|
-
{
|
|
2340
|
-
"name": "metamask.perps.start_state",
|
|
2341
|
-
"owner": "metamask",
|
|
2181
|
+
"metamask.perps.start_state": {
|
|
2342
2182
|
"description": "mobile Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested. Recommended configurable Perps start state that first restores the fixture-backed unlocked wallet, then composes reusable domain operations before the proof window.",
|
|
2343
2183
|
"schema": {
|
|
2344
2184
|
"type": "object",
|
|
@@ -2660,48 +2500,40 @@
|
|
|
2660
2500
|
},
|
|
2661
2501
|
"examples": [
|
|
2662
2502
|
{
|
|
2663
|
-
"
|
|
2664
|
-
"
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
"
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
"network": "testnet"
|
|
2676
|
-
}
|
|
2503
|
+
"action": "metamask.perps.start_state",
|
|
2504
|
+
"profile": "clean_market_testnet",
|
|
2505
|
+
"market": "BTC",
|
|
2506
|
+
"positions": {
|
|
2507
|
+
"state": "none"
|
|
2508
|
+
},
|
|
2509
|
+
"orders": {
|
|
2510
|
+
"state": "none"
|
|
2511
|
+
},
|
|
2512
|
+
"intent": "Prepare the Perps start state for the proof",
|
|
2513
|
+
"network": "testnet",
|
|
2514
|
+
"next": "done"
|
|
2677
2515
|
},
|
|
2678
2516
|
{
|
|
2679
|
-
"
|
|
2680
|
-
"
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
"
|
|
2685
|
-
"
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
"network": "testnet"
|
|
2692
|
-
}
|
|
2517
|
+
"action": "metamask.perps.start_state",
|
|
2518
|
+
"profile": "open_position_testnet",
|
|
2519
|
+
"market": "ETH",
|
|
2520
|
+
"side": "long",
|
|
2521
|
+
"positions": {
|
|
2522
|
+
"state": "open",
|
|
2523
|
+
"notional": "10",
|
|
2524
|
+
"leverage": 2
|
|
2525
|
+
},
|
|
2526
|
+
"intent": "Prepare the Perps start state for the proof",
|
|
2527
|
+
"network": "testnet",
|
|
2528
|
+
"next": "done"
|
|
2693
2529
|
}
|
|
2694
2530
|
],
|
|
2695
|
-
"proof_effect": "Runs in setup/teardown phase and must be visible in trace.json; proof videos can keep this as trace-only setup.",
|
|
2696
|
-
"safety_notes": "Composes supported app/API paths and must not mutate React/Redux/MobX/DOM/local storage to fabricate proof.",
|
|
2697
2531
|
"execution_capabilities": [
|
|
2698
2532
|
"app-mutation",
|
|
2699
2533
|
"external-mutation"
|
|
2700
2534
|
]
|
|
2701
2535
|
},
|
|
2702
|
-
{
|
|
2703
|
-
"name": "metamask.perps.teardown_state",
|
|
2704
|
-
"owner": "metamask",
|
|
2536
|
+
"metamask.perps.teardown_state": {
|
|
2705
2537
|
"description": "mobile Recommended configurable Perps teardown state that restores the selected environment after proof.",
|
|
2706
2538
|
"schema": {
|
|
2707
2539
|
"type": "object",
|
|
@@ -3027,185 +2859,29 @@
|
|
|
3027
2859
|
},
|
|
3028
2860
|
"examples": [
|
|
3029
2861
|
{
|
|
3030
|
-
"
|
|
3031
|
-
"
|
|
3032
|
-
|
|
3033
|
-
"
|
|
3034
|
-
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
"intent": "Restore Perps state after the proof"
|
|
3042
|
-
}
|
|
2862
|
+
"action": "metamask.perps.teardown_state",
|
|
2863
|
+
"market": "BTC",
|
|
2864
|
+
"positions": {
|
|
2865
|
+
"state": "none"
|
|
2866
|
+
},
|
|
2867
|
+
"orders": {
|
|
2868
|
+
"state": "none"
|
|
2869
|
+
},
|
|
2870
|
+
"page": "home",
|
|
2871
|
+
"intent": "Restore Perps state after the proof",
|
|
2872
|
+
"next": "done"
|
|
3043
2873
|
},
|
|
3044
2874
|
{
|
|
3045
|
-
"
|
|
3046
|
-
"
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
"intent": "Restore Perps state after the proof"
|
|
3050
|
-
}
|
|
2875
|
+
"action": "metamask.perps.teardown_state",
|
|
2876
|
+
"market": "BTC",
|
|
2877
|
+
"intent": "Restore Perps state after the proof",
|
|
2878
|
+
"next": "done"
|
|
3051
2879
|
}
|
|
3052
2880
|
],
|
|
3053
|
-
"proof_effect": "Runs in setup/teardown phase and must be visible in trace.json; proof videos can keep this as trace-only setup.",
|
|
3054
|
-
"safety_notes": "Composes supported app/API paths and must not mutate React/Redux/MobX/DOM/local storage to fabricate proof.",
|
|
3055
2881
|
"execution_capabilities": [
|
|
3056
2882
|
"app-mutation",
|
|
3057
2883
|
"external-mutation"
|
|
3058
2884
|
]
|
|
3059
2885
|
}
|
|
3060
|
-
|
|
3061
|
-
"native_bindings": [
|
|
3062
|
-
{
|
|
3063
|
-
"action": "command",
|
|
3064
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3065
|
-
},
|
|
3066
|
-
{
|
|
3067
|
-
"action": "wait",
|
|
3068
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3069
|
-
},
|
|
3070
|
-
{
|
|
3071
|
-
"action": "assert_file",
|
|
3072
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3073
|
-
},
|
|
3074
|
-
{
|
|
3075
|
-
"action": "assert_json",
|
|
3076
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3077
|
-
},
|
|
3078
|
-
{
|
|
3079
|
-
"action": "assert_exit_code",
|
|
3080
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3081
|
-
},
|
|
3082
|
-
{
|
|
3083
|
-
"action": "assert_output",
|
|
3084
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3085
|
-
},
|
|
3086
|
-
{
|
|
3087
|
-
"action": "watch_logs",
|
|
3088
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3089
|
-
},
|
|
3090
|
-
{
|
|
3091
|
-
"action": "index_artifacts",
|
|
3092
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3093
|
-
},
|
|
3094
|
-
{
|
|
3095
|
-
"action": "end",
|
|
3096
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
3097
|
-
},
|
|
3098
|
-
{
|
|
3099
|
-
"action": "ui.navigate",
|
|
3100
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3101
|
-
},
|
|
3102
|
-
{
|
|
3103
|
-
"action": "ui.press",
|
|
3104
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3105
|
-
},
|
|
3106
|
-
{
|
|
3107
|
-
"action": "ui.key_press",
|
|
3108
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3109
|
-
},
|
|
3110
|
-
{
|
|
3111
|
-
"action": "ui.set_input",
|
|
3112
|
-
"implementation": "@metamask/recipe-runner/mobile/react-native-set-input"
|
|
3113
|
-
},
|
|
3114
|
-
{
|
|
3115
|
-
"action": "ui.scroll",
|
|
3116
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3117
|
-
},
|
|
3118
|
-
{
|
|
3119
|
-
"action": "ui.wait_for",
|
|
3120
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3121
|
-
},
|
|
3122
|
-
{
|
|
3123
|
-
"action": "ui.screenshot",
|
|
3124
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3125
|
-
},
|
|
3126
|
-
{
|
|
3127
|
-
"action": "app.lifecycle",
|
|
3128
|
-
"implementation": "@farmslot/recipe-harness/adapters/app-lifecycle"
|
|
3129
|
-
},
|
|
3130
|
-
{
|
|
3131
|
-
"action": "app.status",
|
|
3132
|
-
"implementation": "@metamask/recipe-runner/platform-status"
|
|
3133
|
-
},
|
|
3134
|
-
{
|
|
3135
|
-
"action": "app.hud",
|
|
3136
|
-
"implementation": "@farmslot/recipe-harness/runtime/react-native-bridge"
|
|
3137
|
-
},
|
|
3138
|
-
{
|
|
3139
|
-
"action": "cdp.target",
|
|
3140
|
-
"implementation": "@metamask/recipe-runner/platform-cdp-target"
|
|
3141
|
-
},
|
|
3142
|
-
{
|
|
3143
|
-
"action": "metamask.wallet.fixture_status",
|
|
3144
|
-
"implementation": "@metamask/recipe-runner/mobile/wallet"
|
|
3145
|
-
},
|
|
3146
|
-
{
|
|
3147
|
-
"action": "metamask.wallet.setup",
|
|
3148
|
-
"implementation": "@metamask/recipe-runner/mobile/wallet"
|
|
3149
|
-
},
|
|
3150
|
-
{
|
|
3151
|
-
"action": "metamask.wallet.ensure_unlocked",
|
|
3152
|
-
"implementation": "@metamask/recipe-runner/mobile/wallet"
|
|
3153
|
-
},
|
|
3154
|
-
{
|
|
3155
|
-
"action": "metamask.wallet.select_account",
|
|
3156
|
-
"implementation": "@metamask/recipe-runner/mobile/wallet"
|
|
3157
|
-
},
|
|
3158
|
-
{
|
|
3159
|
-
"action": "metamask.wallet.list_accounts",
|
|
3160
|
-
"implementation": "@metamask/recipe-runner/mobile/wallet"
|
|
3161
|
-
},
|
|
3162
|
-
{
|
|
3163
|
-
"action": "metamask.wallet.read_state",
|
|
3164
|
-
"implementation": "@metamask/recipe-runner/mobile/wallet"
|
|
3165
|
-
},
|
|
3166
|
-
{
|
|
3167
|
-
"action": "metamask.perps.read_positions",
|
|
3168
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3169
|
-
},
|
|
3170
|
-
{
|
|
3171
|
-
"action": "metamask.perps.read_orders",
|
|
3172
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3173
|
-
},
|
|
3174
|
-
{
|
|
3175
|
-
"action": "metamask.perps.close_positions",
|
|
3176
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3177
|
-
},
|
|
3178
|
-
{
|
|
3179
|
-
"action": "metamask.perps.close_orders",
|
|
3180
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3181
|
-
},
|
|
3182
|
-
{
|
|
3183
|
-
"action": "metamask.perps.place_order",
|
|
3184
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3185
|
-
},
|
|
3186
|
-
{
|
|
3187
|
-
"action": "metamask.perps.assert_positions",
|
|
3188
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3189
|
-
},
|
|
3190
|
-
{
|
|
3191
|
-
"action": "metamask.perps.assert_orders",
|
|
3192
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3193
|
-
},
|
|
3194
|
-
{
|
|
3195
|
-
"action": "metamask.perps.ensure_positions",
|
|
3196
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3197
|
-
},
|
|
3198
|
-
{
|
|
3199
|
-
"action": "metamask.perps.ensure_orders",
|
|
3200
|
-
"implementation": "@metamask/recipe-runner/mobile/perps"
|
|
3201
|
-
},
|
|
3202
|
-
{
|
|
3203
|
-
"action": "metamask.perps.start_state",
|
|
3204
|
-
"implementation": "@metamask/recipe-runner/mobile/perps-domain-dispatcher"
|
|
3205
|
-
},
|
|
3206
|
-
{
|
|
3207
|
-
"action": "metamask.perps.teardown_state",
|
|
3208
|
-
"implementation": "@metamask/recipe-runner/mobile/perps-domain-dispatcher"
|
|
3209
|
-
}
|
|
3210
|
-
]
|
|
2886
|
+
}
|
|
3211
2887
|
}
|