@deeeed/metamask-harness 0.28.0 → 0.29.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 +19 -0
- package/README.md +41 -0
- package/adapters/extension/build-lavamoat.sh +2 -1
- package/adapters/extension/ensure-browser.sh +82 -9
- package/adapters/extension/inject.mjs +1 -0
- package/adapters/extension/launch-browser.cjs +83 -1
- package/adapters/extension/lib/chrome-args.cjs +325 -1
- package/adapters/extension/lib/playwright-cdp.cjs +34 -0
- package/adapters/extension/lib/slot-title.cjs +2 -4
- package/adapters/extension/lib/validation-launch-supervisor.cjs +292 -0
- package/adapters/extension/lib/validation-process-ownership.cjs +69 -0
- package/adapters/extension/reattach.sh +2 -1
- package/adapters/extension/sidepanel-toggle.sh +14 -96
- package/adapters/extension/wallet-fixture-state.cjs +8 -31
- package/adapters/manifest.json +16 -0
- package/adapters/shared/private-atomic-write.cjs +47 -0
- package/adapters/shared/setup-base.sh +864 -0
- package/dist/adapters/extension/runtime.js +367 -24
- package/dist/adapters/extension/validation-process-ownership.js +10 -0
- package/dist/cli-commands.js +1 -0
- package/dist/command-contract.js +12 -0
- package/dist/commands/launch/extension.js +130 -19
- package/dist/commands/setup-base.js +24 -0
- package/dist/mm-harness-cli.js +28 -2
- package/library/actions/extension/analytics/consent.mjs +203 -0
- package/library/actions/extension/analytics/set_consent.mjs +19 -143
- package/library/actions/extension/perps/perps.mjs +2 -16
- package/library/actions/extension/perps/state.mjs +20 -0
- package/library/actions/extension/wallet/list_accounts.mjs +3 -25
- package/library/actions/extension/wallet/read_state.mjs +3 -23
- package/library/actions/extension/wallet/select_account.mjs +6 -33
- package/library/actions/extension/wallet/setup.mjs +2 -20
- package/library/actions/extension/wallet/state.mjs +111 -0
- package/library/recipes/runner/action-validation.extension.recipe.json +1 -1
- package/library/recipes/runner/action-validation.mobile.recipe.json +1 -1
- package/package.json +7 -4
- package/scripts/site-contrast.mjs +538 -0
- package/site/architecture.html +415 -0
- package/site/assets/progress.mjs +272 -0
- package/site/assets/style.css +808 -0
- package/site/cheatsheet.html +305 -0
- package/site/index.html +643 -0
- package/site/recipes.html +396 -0
- package/site/reviewers.html +374 -0
- package/site/tutorials/index.html +180 -0
- package/site/tutorials/v1.html +211 -0
- package/site/tutorials/v2.html +207 -0
- package/site/tutorials/v3.html +214 -0
- package/site/tutorials/v4.html +195 -0
- package/site/tutorials/v5.html +163 -0
- package/site/tutorials/v6.html +165 -0
- package/site/tutorials/v7.html +184 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>V4 — Cook a recipe from an acceptance criterion</title>
|
|
7
|
+
<meta name="description" content="Turn one acceptance criterion into a proof with the recipe-cook skill: discover, author, validate, run.">
|
|
8
|
+
<link rel="stylesheet" href="../assets/style.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body data-progress-page="v4">
|
|
11
|
+
<a class="skip" href="#steps">Skip to the checklist</a>
|
|
12
|
+
|
|
13
|
+
<header class="topbar">
|
|
14
|
+
<div class="wrap topbar-inner">
|
|
15
|
+
<a class="brand" href="../index.html">
|
|
16
|
+
<span class="brand-mark" aria-hidden="true"></span>
|
|
17
|
+
<span class="brand-name">mm-harness</span>
|
|
18
|
+
</a>
|
|
19
|
+
<nav class="nav" aria-label="Main">
|
|
20
|
+
<a href="../index.html">Start Here</a>
|
|
21
|
+
<a href="../recipes.html">Recipes</a>
|
|
22
|
+
<a href="../cheatsheet.html">Cheatsheet</a>
|
|
23
|
+
<a href="../architecture.html">Architecture</a>
|
|
24
|
+
<a href="index.html" aria-current="page">Tutorials</a>
|
|
25
|
+
<a href="../reviewers.html">For Reviewers</a>
|
|
26
|
+
</nav>
|
|
27
|
+
</div>
|
|
28
|
+
</header>
|
|
29
|
+
|
|
30
|
+
<div class="progress-rail">
|
|
31
|
+
<div class="wrap progress-inner">
|
|
32
|
+
<div class="progress-track" role="progressbar" aria-label="Tutorial progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
|
|
33
|
+
<div class="progress-fill"></div>
|
|
34
|
+
</div>
|
|
35
|
+
<span class="progress-label">0/5 steps</span>
|
|
36
|
+
<button type="button" class="progress-reset">Reset</button>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<main>
|
|
41
|
+
<section class="wrap hero" style="padding-bottom:1rem">
|
|
42
|
+
<span class="eyebrow">Tutorial V4 · 8–10 minutes</span>
|
|
43
|
+
<h1>Cook a recipe from an acceptance criterion</h1>
|
|
44
|
+
<p class="lede">
|
|
45
|
+
Take one criterion off a ticket and end with a rerunnable proof of it. The
|
|
46
|
+
<code>recipe-cook</code> skill drives this; you steer at the gates.
|
|
47
|
+
</p>
|
|
48
|
+
<div class="hero-meta">
|
|
49
|
+
<span>prerequisite: <a href="v3.html">V3</a></span>
|
|
50
|
+
<span>skill maturity: experimental</span>
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<section class="wrap">
|
|
55
|
+
<div class="vid-thumb" style="border-radius:var(--radius);border:1px solid var(--line);margin-bottom:1.5rem">
|
|
56
|
+
<div style="text-align:center;padding:1rem">
|
|
57
|
+
<div class="vid-id" style="font-size:2.6rem">V4</div>
|
|
58
|
+
<p style="color:var(--text-dim);margin:.5rem 0 0;font-size:.92rem">Video recording in progress</p>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<h2>The flow</h2>
|
|
63
|
+
<p>Cook classifies the request, then runs one checklist to completion.</p>
|
|
64
|
+
|
|
65
|
+
<div class="stack">
|
|
66
|
+
<div class="layer layer-static">
|
|
67
|
+
<span class="layer-n">1</span><span class="layer-name">Classify</span>
|
|
68
|
+
<span class="layer-sub">dev · fix-bug · review-pr</span>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="arrow" aria-hidden="true">↓</div>
|
|
71
|
+
<div class="layer layer-static">
|
|
72
|
+
<span class="layer-n">2</span><span class="layer-name">List and select a template</span>
|
|
73
|
+
<span class="layer-sub">discovery, then your pick</span>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="arrow" aria-hidden="true">↓</div>
|
|
76
|
+
<div class="layer layer-static">
|
|
77
|
+
<span class="layer-n">3</span><span class="layer-name">Materialize one task</span>
|
|
78
|
+
<span class="layer-sub">an immutable checklist, one harness</span>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="arrow" aria-hidden="true">↓</div>
|
|
81
|
+
<div class="layer layer-static">
|
|
82
|
+
<span class="layer-n">4</span><span class="layer-name">Execute the gates</span>
|
|
83
|
+
<span class="layer-sub">author, validate, run, mark</span>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<p>
|
|
88
|
+
Template discovery runs through <code>mm-harness execution-template</code>, the same discovery
|
|
89
|
+
contract as actions and recipes. Your team's library can supply its own templates.
|
|
90
|
+
</p>
|
|
91
|
+
|
|
92
|
+
<div class="note">
|
|
93
|
+
<span class="note-title">Step 2 stops for you</span>
|
|
94
|
+
<p>
|
|
95
|
+
For <code>dev</code> and <code>fix-bug</code>, Cook prints the compatible template IDs with a
|
|
96
|
+
recommendation and then stops. It takes no further action until you reply with a number or an
|
|
97
|
+
exact ID. This is the steering point: the flow is chosen by you, not inferred.
|
|
98
|
+
</p>
|
|
99
|
+
</div>
|
|
100
|
+
</section>
|
|
101
|
+
|
|
102
|
+
<section class="wrap">
|
|
103
|
+
<h2 id="steps">Follow along</h2>
|
|
104
|
+
<p>Pick a small, real criterion — one observable behaviour, not a whole epic.</p>
|
|
105
|
+
|
|
106
|
+
<ol class="steps">
|
|
107
|
+
<li class="step" data-step="invoke">
|
|
108
|
+
<div class="step-head">
|
|
109
|
+
<input type="checkbox" class="step-check" id="v4-invoke" aria-labelledby="t4-invoke">
|
|
110
|
+
<h3 class="step-title" id="t4-invoke">Start Cook in your checkout</h3>
|
|
111
|
+
</div>
|
|
112
|
+
<p class="step-why">In Claude or Cursor, invoke the skill with your task in plain language:</p>
|
|
113
|
+
<div class="cmd"><pre><code>/mms-recipe-cook Prove that a resting limit order can be repriced without losing its trigger</code></pre></div>
|
|
114
|
+
<p class="step-why">In Codex, the same skill is addressed as <code>$mms-recipe-cook</code>. Product is auto-detected; you will not be asked which repo you are in.</p>
|
|
115
|
+
</li>
|
|
116
|
+
|
|
117
|
+
<li class="step" data-step="select">
|
|
118
|
+
<div class="step-head">
|
|
119
|
+
<input type="checkbox" class="step-check" id="v4-select" aria-labelledby="t4-select">
|
|
120
|
+
<h3 class="step-title" id="t4-select">Choose the template</h3>
|
|
121
|
+
</div>
|
|
122
|
+
<p class="step-why">
|
|
123
|
+
Cook lists compatible IDs with one recommended. Reply with the number. It recommends an
|
|
124
|
+
interactive template when human judgment is still needed and an autonomous one when it is not.
|
|
125
|
+
</p>
|
|
126
|
+
</li>
|
|
127
|
+
|
|
128
|
+
<li class="step" data-step="discover">
|
|
129
|
+
<div class="step-head">
|
|
130
|
+
<input type="checkbox" class="step-check" id="v4-discover" aria-labelledby="t4-discover">
|
|
131
|
+
<h3 class="step-title" id="t4-discover">Watch discovery set the boundary</h3>
|
|
132
|
+
</div>
|
|
133
|
+
<p class="step-why">
|
|
134
|
+
Before authoring anything, the vocabulary is fixed. Run it yourself to see what Cook is choosing
|
|
135
|
+
from:
|
|
136
|
+
</p>
|
|
137
|
+
<div class="cmd"><pre><code><span class="p">$ </span>mm-harness actions --categories
|
|
138
|
+
<span class="p">$ </span>mm-harness actions --action assert_orders</code></pre></div>
|
|
139
|
+
<p class="step-why">
|
|
140
|
+
An action outside this list cannot be written into a working recipe — validation rejects it
|
|
141
|
+
before execution. That constraint is what makes the output trustworthy rather than plausible.
|
|
142
|
+
</p>
|
|
143
|
+
</li>
|
|
144
|
+
|
|
145
|
+
<li class="step" data-step="plan">
|
|
146
|
+
<div class="step-head">
|
|
147
|
+
<input type="checkbox" class="step-check" id="v4-plan" aria-labelledby="t4-plan">
|
|
148
|
+
<h3 class="step-title" id="t4-plan">Validate before executing</h3>
|
|
149
|
+
</div>
|
|
150
|
+
<p class="step-why">Exit 5 means the recipe is wrong and nothing ran.</p>
|
|
151
|
+
<div class="cmd"><pre><code><span class="p">$ </span>mm-harness run ./my-recipe.json --plan</code></pre></div>
|
|
152
|
+
<div class="out"><span class="ok">✓</span> [static] validate.schema: recipe document schema + action existence/platform vs the adapter manifest
|
|
153
|
+
<span class="dim">·</span> [conditional] execute.nodes: would execute 4 recipe node(s)</div>
|
|
154
|
+
</li>
|
|
155
|
+
|
|
156
|
+
<li class="step" data-step="prove">
|
|
157
|
+
<div class="step-head">
|
|
158
|
+
<input type="checkbox" class="step-check" id="v4-prove" aria-labelledby="t4-prove">
|
|
159
|
+
<h3 class="step-title" id="t4-prove">Run it, then try to break it</h3>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="cmd"><pre><code><span class="p">$ </span>mm-harness run ./my-recipe.json --artifacts-dir ./proof</code></pre></div>
|
|
162
|
+
<div class="doctrine">
|
|
163
|
+
<p>
|
|
164
|
+
<span class="k">Then revert the change and run it again.</span> A recipe you have watched fail
|
|
165
|
+
for the right reason is one you can trust when it passes. If reverting the behaviour leaves it
|
|
166
|
+
green, it is not proving what you think.
|
|
167
|
+
</p>
|
|
168
|
+
</div>
|
|
169
|
+
<p class="step-why">
|
|
170
|
+
Expect one failure-and-fix loop during authoring. Each error names its own next command; follow
|
|
171
|
+
it rather than guessing. <a href="../recipes.html#falsifiability">The falsifiability test</a>
|
|
172
|
+
lists the four shapes that pass for the wrong reasons.
|
|
173
|
+
</p>
|
|
174
|
+
</li>
|
|
175
|
+
</ol>
|
|
176
|
+
|
|
177
|
+
<hr class="sep">
|
|
178
|
+
<div class="btn-row">
|
|
179
|
+
<a class="btn btn-primary" href="v5.html">Next: PR QA review →</a>
|
|
180
|
+
<a class="btn btn-ghost" href="../recipes.html">What makes a recipe good</a>
|
|
181
|
+
<a class="btn btn-ghost" href="index.html">Back to the series</a>
|
|
182
|
+
</div>
|
|
183
|
+
</section>
|
|
184
|
+
</main>
|
|
185
|
+
|
|
186
|
+
<footer class="footer">
|
|
187
|
+
<div class="wrap">
|
|
188
|
+
<p>Internal getting-started guide for the MetaMask agentic coding workflow. Not official MetaMask product documentation.</p>
|
|
189
|
+
<p>Verified against mm-harness 0.26+.</p>
|
|
190
|
+
</div>
|
|
191
|
+
</footer>
|
|
192
|
+
|
|
193
|
+
<script type="module" src="../assets/progress.mjs"></script>
|
|
194
|
+
</body>
|
|
195
|
+
</html>
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>V5 — PR QA review from one link</title>
|
|
7
|
+
<meta name="description" content="Give the review skill one pull request URL and get a per-criterion verdict table backed by on-device evidence.">
|
|
8
|
+
<link rel="stylesheet" href="../assets/style.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body data-progress-page="v5">
|
|
11
|
+
<a class="skip" href="#flow">Skip to the flow</a>
|
|
12
|
+
|
|
13
|
+
<header class="topbar">
|
|
14
|
+
<div class="wrap topbar-inner">
|
|
15
|
+
<a class="brand" href="../index.html">
|
|
16
|
+
<span class="brand-mark" aria-hidden="true"></span>
|
|
17
|
+
<span class="brand-name">mm-harness</span>
|
|
18
|
+
</a>
|
|
19
|
+
<nav class="nav" aria-label="Main">
|
|
20
|
+
<a href="../index.html">Start Here</a>
|
|
21
|
+
<a href="../recipes.html">Recipes</a>
|
|
22
|
+
<a href="../cheatsheet.html">Cheatsheet</a>
|
|
23
|
+
<a href="../architecture.html">Architecture</a>
|
|
24
|
+
<a href="index.html" aria-current="page">Tutorials</a>
|
|
25
|
+
<a href="../reviewers.html">For Reviewers</a>
|
|
26
|
+
</nav>
|
|
27
|
+
</div>
|
|
28
|
+
</header>
|
|
29
|
+
|
|
30
|
+
<div class="progress-rail">
|
|
31
|
+
<div class="wrap progress-inner">
|
|
32
|
+
<div class="progress-track" role="progressbar" aria-label="Tutorial progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
|
|
33
|
+
<div class="progress-fill"></div>
|
|
34
|
+
</div>
|
|
35
|
+
<span class="progress-label">0/4 steps</span>
|
|
36
|
+
<button type="button" class="progress-reset">Reset</button>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<main>
|
|
41
|
+
<section class="wrap hero" style="padding-bottom:1rem">
|
|
42
|
+
<span class="eyebrow">Tutorial V5 · 8–10 minutes</span>
|
|
43
|
+
<h1>PR QA review from one link</h1>
|
|
44
|
+
<p class="lede">
|
|
45
|
+
One pull request URL in, a per-criterion verdict table with evidence paths out. You confirm nothing
|
|
46
|
+
gets posted.
|
|
47
|
+
</p>
|
|
48
|
+
<div class="hero-meta">
|
|
49
|
+
<span class="badge soon">skill not merged yet</span>
|
|
50
|
+
<span>maturity: experimental</span>
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<section class="wrap">
|
|
55
|
+
<div class="vid-thumb" style="border-radius:var(--radius);border:1px solid var(--line);margin-bottom:1.5rem">
|
|
56
|
+
<div style="text-align:center;padding:1rem">
|
|
57
|
+
<div class="vid-id" style="font-size:2.6rem">V5</div>
|
|
58
|
+
<p style="color:var(--text-dim);margin:.5rem 0 0;font-size:.92rem">Video recording in progress</p>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="note">
|
|
63
|
+
<span class="note-title">Status: shipping, not yet merged</span>
|
|
64
|
+
<p>
|
|
65
|
+
The PR QA review skill is on a branch, not on the skills repo's main branch. This page describes
|
|
66
|
+
the flow as built so you know what is coming; there is no install command here yet, because one
|
|
67
|
+
that does not resolve is worse than none. <a href="v4.html">V4's</a> <code>recipe-cook</code> is
|
|
68
|
+
merged and available today — the review flow is one of its modes.
|
|
69
|
+
</p>
|
|
70
|
+
</div>
|
|
71
|
+
</section>
|
|
72
|
+
|
|
73
|
+
<section class="wrap">
|
|
74
|
+
<h2 id="flow">The flow</h2>
|
|
75
|
+
|
|
76
|
+
<ol class="steps">
|
|
77
|
+
<li class="step" data-step="url">
|
|
78
|
+
<div class="step-head">
|
|
79
|
+
<input type="checkbox" class="step-check" id="v5-url" aria-labelledby="t5-url">
|
|
80
|
+
<h3 class="step-title" id="t5-url">One URL, matched to your checkout</h3>
|
|
81
|
+
</div>
|
|
82
|
+
<p class="step-why">
|
|
83
|
+
Exactly one pull request from <code>metamask-mobile</code> or <code>metamask-extension</code>. A
|
|
84
|
+
URL for the other client is rejected before any checkout or runtime work — the review runs
|
|
85
|
+
against a real build, so it has to be the right one. Given no URL, it reads the current branch's
|
|
86
|
+
pull request.
|
|
87
|
+
</p>
|
|
88
|
+
</li>
|
|
89
|
+
|
|
90
|
+
<li class="step" data-step="ac">
|
|
91
|
+
<div class="step-head">
|
|
92
|
+
<input type="checkbox" class="step-check" id="v5-ac" aria-labelledby="t5-ac">
|
|
93
|
+
<h3 class="step-title" id="t5-ac">Criteria are extracted, then frozen</h3>
|
|
94
|
+
</div>
|
|
95
|
+
<p class="step-why">
|
|
96
|
+
Supply criteria and they are preserved verbatim, never merged with or overwritten by the pull
|
|
97
|
+
request body. Supply none and they are extracted from it. Either way they are frozen before any
|
|
98
|
+
runtime work starts, so the thing being proven cannot drift to match what turned out to be
|
|
99
|
+
provable.
|
|
100
|
+
</p>
|
|
101
|
+
<div class="note blue">
|
|
102
|
+
<span class="note-title">Missing criteria are a finding, not a gap to fill</span>
|
|
103
|
+
<p>
|
|
104
|
+
A pull request with nothing to extract produces a hygiene finding. The skill does not invent
|
|
105
|
+
criteria to have something to test.
|
|
106
|
+
</p>
|
|
107
|
+
</div>
|
|
108
|
+
</li>
|
|
109
|
+
|
|
110
|
+
<li class="step" data-step="run">
|
|
111
|
+
<div class="step-head">
|
|
112
|
+
<input type="checkbox" class="step-check" id="v5-run" aria-labelledby="t5-run">
|
|
113
|
+
<h3 class="step-title" id="t5-run">Proof runs on a real device</h3>
|
|
114
|
+
</div>
|
|
115
|
+
<p class="step-why">
|
|
116
|
+
The branch is checked out, the app launched under harness control, and each criterion exercised
|
|
117
|
+
against the running build. Evidence lands in a bundle you can open — the same structure
|
|
118
|
+
<a href="v2.html">V2</a> walks.
|
|
119
|
+
</p>
|
|
120
|
+
</li>
|
|
121
|
+
|
|
122
|
+
<li class="step" data-step="verdict">
|
|
123
|
+
<div class="step-head">
|
|
124
|
+
<input type="checkbox" class="step-check" id="v5-verdict" aria-labelledby="t5-verdict">
|
|
125
|
+
<h3 class="step-title" id="t5-verdict">A verdict table you post yourself</h3>
|
|
126
|
+
</div>
|
|
127
|
+
<p class="step-why">
|
|
128
|
+
Output is a QA report plus a proposed review reply, per criterion, with evidence paths.
|
|
129
|
+
</p>
|
|
130
|
+
<div class="doctrine">
|
|
131
|
+
<p>
|
|
132
|
+
<span class="k">It never posts.</span> The reply comes back for you to read, edit, and submit.
|
|
133
|
+
A machine-generated review that appears on a colleague's pull request without a human deciding
|
|
134
|
+
to send it is not review — it is noise with your name on it.
|
|
135
|
+
</p>
|
|
136
|
+
</div>
|
|
137
|
+
<p class="step-why">
|
|
138
|
+
The verdict that matters most is the honest one: a criterion the surface genuinely cannot
|
|
139
|
+
demonstrate is reported as needing a human, not quietly passed. A gesture-driven interaction with
|
|
140
|
+
no automatable surface is the standard example — it gets classified, not faked.
|
|
141
|
+
</p>
|
|
142
|
+
</li>
|
|
143
|
+
</ol>
|
|
144
|
+
|
|
145
|
+
<hr class="sep">
|
|
146
|
+
<div class="btn-row">
|
|
147
|
+
<a class="btn btn-primary" href="v6.html">Next: release validation →</a>
|
|
148
|
+
<a class="btn btn-ghost" href="../reviewers.html">How to read the evidence it produces</a>
|
|
149
|
+
<a class="btn btn-ghost" href="index.html">Back to the series</a>
|
|
150
|
+
</div>
|
|
151
|
+
</section>
|
|
152
|
+
</main>
|
|
153
|
+
|
|
154
|
+
<footer class="footer">
|
|
155
|
+
<div class="wrap">
|
|
156
|
+
<p>Internal getting-started guide for the MetaMask agentic coding workflow. Not official MetaMask product documentation.</p>
|
|
157
|
+
<p>Verified against mm-harness 0.26+.</p>
|
|
158
|
+
</div>
|
|
159
|
+
</footer>
|
|
160
|
+
|
|
161
|
+
<script type="module" src="../assets/progress.mjs"></script>
|
|
162
|
+
</body>
|
|
163
|
+
</html>
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>V6 — Release validation</title>
|
|
7
|
+
<meta name="description" content="Validate one team's changes on a frozen release candidate, with a four-verdict vocabulary that includes NOT RUN.">
|
|
8
|
+
<link rel="stylesheet" href="../assets/style.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body data-progress-page="v6">
|
|
11
|
+
<a class="skip" href="#flow">Skip to the flow</a>
|
|
12
|
+
|
|
13
|
+
<header class="topbar">
|
|
14
|
+
<div class="wrap topbar-inner">
|
|
15
|
+
<a class="brand" href="../index.html">
|
|
16
|
+
<span class="brand-mark" aria-hidden="true"></span>
|
|
17
|
+
<span class="brand-name">mm-harness</span>
|
|
18
|
+
</a>
|
|
19
|
+
<nav class="nav" aria-label="Main">
|
|
20
|
+
<a href="../index.html">Start Here</a>
|
|
21
|
+
<a href="../recipes.html">Recipes</a>
|
|
22
|
+
<a href="../cheatsheet.html">Cheatsheet</a>
|
|
23
|
+
<a href="../architecture.html">Architecture</a>
|
|
24
|
+
<a href="index.html" aria-current="page">Tutorials</a>
|
|
25
|
+
<a href="../reviewers.html">For Reviewers</a>
|
|
26
|
+
</nav>
|
|
27
|
+
</div>
|
|
28
|
+
</header>
|
|
29
|
+
|
|
30
|
+
<div class="progress-rail">
|
|
31
|
+
<div class="wrap progress-inner">
|
|
32
|
+
<div class="progress-track" role="progressbar" aria-label="Tutorial progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
|
|
33
|
+
<div class="progress-fill"></div>
|
|
34
|
+
</div>
|
|
35
|
+
<span class="progress-label">0/4 steps</span>
|
|
36
|
+
<button type="button" class="progress-reset">Reset</button>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<main>
|
|
41
|
+
<section class="wrap hero" style="padding-bottom:1rem">
|
|
42
|
+
<span class="eyebrow">Tutorial V6 · 6 minutes</span>
|
|
43
|
+
<h1>Release validation</h1>
|
|
44
|
+
<p class="lede">
|
|
45
|
+
One release candidate, one team's changes, one report. For leads and QA deciding whether a build is
|
|
46
|
+
ready for sign-off.
|
|
47
|
+
</p>
|
|
48
|
+
<div class="hero-meta">
|
|
49
|
+
<span class="badge soon">skill not merged yet</span>
|
|
50
|
+
<span>maturity: experimental</span>
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<section class="wrap">
|
|
55
|
+
<div class="vid-thumb" style="border-radius:var(--radius);border:1px solid var(--line);margin-bottom:1.5rem">
|
|
56
|
+
<div style="text-align:center;padding:1rem">
|
|
57
|
+
<div class="vid-id" style="font-size:2.6rem">V6</div>
|
|
58
|
+
<p style="color:var(--text-dim);margin:.5rem 0 0;font-size:.92rem">Video recording in progress</p>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="note">
|
|
63
|
+
<span class="note-title">Status: shipping, not yet merged</span>
|
|
64
|
+
<p>
|
|
65
|
+
Like <a href="v5.html">V5</a>, this skill lives on a branch rather than the skills repo's main
|
|
66
|
+
branch. No install command here until it lands.
|
|
67
|
+
</p>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<p>
|
|
71
|
+
<a href="v5.html">V5</a> reviews one pull request head. This sits a layer above: it takes the team's
|
|
72
|
+
changes that actually shipped into one frozen release head and validates their assembled flows on
|
|
73
|
+
that build.
|
|
74
|
+
</p>
|
|
75
|
+
</section>
|
|
76
|
+
|
|
77
|
+
<section class="wrap">
|
|
78
|
+
<h2 id="flow">The flow</h2>
|
|
79
|
+
|
|
80
|
+
<ol class="steps">
|
|
81
|
+
<li class="step" data-step="target">
|
|
82
|
+
<div class="step-head">
|
|
83
|
+
<input type="checkbox" class="step-check" id="v6-target" aria-labelledby="t6-target">
|
|
84
|
+
<h3 class="step-title" id="t6-target">Two things, both exact</h3>
|
|
85
|
+
</div>
|
|
86
|
+
<p class="step-why">
|
|
87
|
+
One release target — a <code>release/X.Y.Z</code> ref, its release pull request, or an
|
|
88
|
+
unambiguous version — and one team scope, given as explicit pull request URLs, owned paths,
|
|
89
|
+
release labels, or a repository team definition. Ambiguity in either is refused rather than
|
|
90
|
+
guessed, because a report scoped to the wrong changes is worse than no report.
|
|
91
|
+
</p>
|
|
92
|
+
</li>
|
|
93
|
+
|
|
94
|
+
<li class="step" data-step="assemble">
|
|
95
|
+
<div class="step-head">
|
|
96
|
+
<input type="checkbox" class="step-check" id="v6-assemble" aria-labelledby="t6-assemble">
|
|
97
|
+
<h3 class="step-title" id="t6-assemble">Criteria assembled across the release</h3>
|
|
98
|
+
</div>
|
|
99
|
+
<p class="step-why">
|
|
100
|
+
It reuses the same acceptance-criteria contract as PR review, then combines the criteria from
|
|
101
|
+
every in-scope change into the user flows they add up to on the release build. A flow can break
|
|
102
|
+
from the interaction of two individually correct changes; that is the class of problem this
|
|
103
|
+
catches and per-PR review cannot.
|
|
104
|
+
</p>
|
|
105
|
+
</li>
|
|
106
|
+
|
|
107
|
+
<li class="step" data-step="verdicts">
|
|
108
|
+
<div class="step-head">
|
|
109
|
+
<input type="checkbox" class="step-check" id="v6-verdicts" aria-labelledby="t6-verdicts">
|
|
110
|
+
<h3 class="step-title" id="t6-verdicts">Four verdicts, not two</h3>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="table-scroll">
|
|
113
|
+
<table>
|
|
114
|
+
<thead><tr><th>Verdict</th><th>Means</th></tr></thead>
|
|
115
|
+
<tbody>
|
|
116
|
+
<tr><td><span class="verdict pass">PASS</span></td><td>Demonstrated on the release build, with evidence.</td></tr>
|
|
117
|
+
<tr><td><span class="verdict fail">FAIL</span></td><td>Exercised and did not hold. A real result.</td></tr>
|
|
118
|
+
<tr><td><code>UNTESTABLE</code></td><td>The surface cannot demonstrate it. Needs a human.</td></tr>
|
|
119
|
+
<tr><td><code>NOT RUN</code></td><td>In scope, not attempted. Stated rather than omitted.</td></tr>
|
|
120
|
+
</tbody>
|
|
121
|
+
</table>
|
|
122
|
+
</div>
|
|
123
|
+
<p class="step-why">
|
|
124
|
+
<code>NOT RUN</code> is the one that keeps the report honest. A run that skipped something says
|
|
125
|
+
so, instead of leaving a silent gap that reads as coverage.
|
|
126
|
+
</p>
|
|
127
|
+
</li>
|
|
128
|
+
|
|
129
|
+
<li class="step" data-step="signoff">
|
|
130
|
+
<div class="step-head">
|
|
131
|
+
<input type="checkbox" class="step-check" id="v6-signoff" aria-labelledby="t6-signoff">
|
|
132
|
+
<h3 class="step-title" id="t6-signoff">Ready for sign-off, which is not sign-off</h3>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="doctrine">
|
|
135
|
+
<p>
|
|
136
|
+
<span class="k">A first autonomous release QA result, not an approval.</span> The report frames
|
|
137
|
+
itself as ready for team QA sign-off. The sign-off is still a person's, and the report is the
|
|
138
|
+
evidence they read to give it.
|
|
139
|
+
</p>
|
|
140
|
+
</div>
|
|
141
|
+
<p class="step-why">
|
|
142
|
+
What changes is where the human starts: from a report with per-criterion verdicts and evidence
|
|
143
|
+
paths, rather than from a build and a list of tickets.
|
|
144
|
+
</p>
|
|
145
|
+
</li>
|
|
146
|
+
</ol>
|
|
147
|
+
|
|
148
|
+
<hr class="sep">
|
|
149
|
+
<div class="btn-row">
|
|
150
|
+
<a class="btn btn-primary" href="v7.html">Next: a ticket end to end →</a>
|
|
151
|
+
<a class="btn btn-ghost" href="index.html">Back to the series</a>
|
|
152
|
+
</div>
|
|
153
|
+
</section>
|
|
154
|
+
</main>
|
|
155
|
+
|
|
156
|
+
<footer class="footer">
|
|
157
|
+
<div class="wrap">
|
|
158
|
+
<p>Internal getting-started guide for the MetaMask agentic coding workflow. Not official MetaMask product documentation.</p>
|
|
159
|
+
<p>Verified against mm-harness 0.26+.</p>
|
|
160
|
+
</div>
|
|
161
|
+
</footer>
|
|
162
|
+
|
|
163
|
+
<script type="module" src="../assets/progress.mjs"></script>
|
|
164
|
+
</body>
|
|
165
|
+
</html>
|