@deeeed/metamask-harness 0.47.0 → 0.47.1

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 CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.47.1 - 2026-09-04
6
+
7
+ ### Fixed
8
+
9
+ - Open the tutorial on the protected MetaMask GitHub Pages site instead of the public unpkg CDN.
10
+ - Stop shipping the static HTML site in the public npm package; retain only the recipe-help JSON required by the CLI.
11
+
5
12
  ## 0.47.0 - 2026-09-04
6
13
 
7
14
  ### Added
@@ -1,11 +1,11 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { parseArgs } from "./parse-args.js";
3
- const PACKAGE_NAME = "@deeeed/metamask-harness";
4
- function recipeTutorialUrl(harnessVersion, runMode = process.env.MM_HARNESS_RUN_MODE) {
3
+ const PROTECTED_TUTORIAL_URL = "https://glowing-chainsaw-gwzrn8k.pages.github.io/recipes.html#agent-method";
4
+ function recipeTutorialUrl(runMode = process.env.MM_HARNESS_RUN_MODE) {
5
5
  if (runMode === "src") {
6
6
  return "http://127.0.0.1:8765/site/recipes.html#agent-method";
7
7
  }
8
- return `https://unpkg.com/${PACKAGE_NAME}@${harnessVersion}/site/recipes.html#agent-method`;
8
+ return PROTECTED_TUTORIAL_URL;
9
9
  }
10
10
  function openUrl(url) {
11
11
  const command = process.platform === "darwin" ? ["open", url] : process.platform === "win32" ? ["cmd", "/c", "start", "", url] : ["xdg-open", url];
@@ -14,7 +14,7 @@ function openUrl(url) {
14
14
  }
15
15
  function handleTutorial(argv, context) {
16
16
  const parsed = parseArgs(argv, "tutorial");
17
- const url = recipeTutorialUrl(context.harnessVersion);
17
+ const url = recipeTutorialUrl();
18
18
  const noOpen = parsed.options.noOpen === true;
19
19
  const opened = noOpen ? false : (context.open ?? openUrl)(url);
20
20
  const payload = {
@@ -41,12 +41,12 @@ Example:
41
41
  },
42
42
  {
43
43
  name: "tutorial",
44
- summary: "Open the visual recipe tutorial for this harness version.",
44
+ summary: "Open the protected visual recipe tutorial.",
45
45
  example: "mm-harness tutorial",
46
46
  helpText: `mm-harness tutorial [flags]
47
47
 
48
48
  Source checkouts open the local tutorial on port 8765. Installed releases
49
- open the tutorial published with that exact harness version.
49
+ open the protected MetaMask GitHub Pages site.
50
50
 
51
51
  --no-open Print the tutorial URL without opening it
52
52
  --json Print version, URL, and open status as JSON
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deeeed/metamask-harness",
3
- "version": "0.47.0",
3
+ "version": "0.47.1",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mm-harness": "bin/mm-harness"
@@ -64,7 +64,7 @@
64
64
  "dist",
65
65
  "adapters",
66
66
  "library",
67
- "site",
67
+ "site/assets/help-recipes.json",
68
68
  "scripts/completions.sh",
69
69
  "scripts/install-completions.sh",
70
70
  "scripts/site-contrast.mjs",
@@ -1,497 +0,0 @@
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>Architecture — how the pieces fit</title>
7
- <meta name="description" content="Skills, mm-harness, team recipe libraries, product repos: what lives where, the three workflows, and the mistakes newcomers make.">
8
- <link rel="icon" href="assets/metamask-fox.svg" type="image/svg+xml">
9
- <link rel="stylesheet" href="assets/style.css?v=4">
10
- </head>
11
- <body data-progress-page="architecture">
12
- <a class="skip" href="#stack">Skip to the stack map</a>
13
-
14
- <header class="topbar">
15
- <div class="wrap topbar-inner">
16
- <a class="brand" href="index.html">
17
- <img class="brand-mark" src="assets/metamask-fox.svg" alt="" width="22" height="22">
18
- <span class="brand-name">recipes</span>
19
- </a>
20
- <nav class="nav" aria-label="Main">
21
- <a class="nav-cta" href="index.html#prompt">Quick start</a>
22
- <a href="how-it-works.html">How it works</a>
23
- <a href="perps.html">Team / Perps</a>
24
- <a href="cheatsheet.html">Cheatsheet</a>
25
- <a href="architecture.html" aria-current="page">Architecture</a>
26
- <a href="tutorials/index.html">Tutorials</a>
27
- </nav>
28
- </div>
29
- </header>
30
-
31
- <main>
32
- <section class="wrap hero" style="padding-bottom:1rem">
33
- <span class="eyebrow">The stack behind a recipe</span>
34
- <h1>How the pieces fit together</h1>
35
- <p class="lede">
36
- The recipe is the unit of trust; the rest of the stack runs it. Four moving parts, two of which
37
- people routinely confuse. What each layer is, where it lives, which workflow you are in, and the
38
- mistakes that cost newcomers their first afternoon.
39
- </p>
40
- </section>
41
-
42
- <section class="wrap">
43
- <h2 id="model">The one-paragraph model</h2>
44
- <div class="doctrine">
45
- <p>
46
- <span class="k">A recipe proves a task with actions.</span> Recipes are JSON graphs of typed
47
- actions; <code>mm-harness</code> executes them against a real app and produces an evidence bundle
48
- a reviewer can trust. <strong>Skills</strong> teach an agent a workflow — author a recipe, review
49
- a PR, validate a release — and are the layer you work through; they call the harness, which runs
50
- the recipe. <strong>Recipe libraries</strong> hold each team's recipes and domain actions.
51
- Compose in that order, against the product repo under test.
52
- </p>
53
- </div>
54
- </section>
55
-
56
- <section class="wrap">
57
- <h2 id="stack">The layers</h2>
58
- <p>Click a layer to see what it is responsible for and when you touch it.</p>
59
-
60
- <div class="stack">
61
- <button type="button" class="layer" aria-expanded="false" aria-controls="l-skills">
62
- <span class="layer-n">1</span>
63
- <span class="layer-name">Skills</span>
64
- <span class="layer-sub">the workflow an agent follows</span>
65
- </button>
66
- <div class="layer-detail" id="l-skills" hidden>
67
- <p>
68
- A packaged workflow — author a recipe from a criterion, review a pull request, validate a
69
- release — turning "figure it out" into a procedure with gates you can steer.
70
- </p>
71
- <p>
72
- Skills come from the public <code>MetaMask/skills</code> repo plus the internal
73
- <code>Consensys/skills</code> overlay, which needs access to that org; private skills override
74
- public ones on a name collision. Clone each, point <code>METAMASK_SKILLS_DIR</code> and
75
- <code>CONSENSYS_SKILLS_DIR</code> at them, then install per checkout with
76
- <code>yarn skills</code>. <strong>You do not need skills to run a recipe</strong>, only to have
77
- an agent follow a proven workflow instead of improvising one.
78
- <a href="tutorials/v3.html">V3 walks the install.</a>
79
- </p>
80
- </div>
81
-
82
- <div class="arrow" aria-hidden="true">↓</div>
83
-
84
- <button type="button" class="layer" aria-expanded="false" aria-controls="l-harness">
85
- <span class="layer-n">2</span>
86
- <span class="layer-name">mm-harness</span>
87
- <span class="layer-sub">execution and evidence</span>
88
- </button>
89
- <div class="layer-detail" id="l-harness" hidden>
90
- <p>
91
- The CLI: launches the app, exposes the action vocabulary, executes recipe graphs against a real
92
- build, writes the evidence. The only layer everyone needs, and the only one installed globally:
93
- </p>
94
- <div class="cmd"><pre><code><span class="p">$ </span>npm i -g @deeeed/metamask-harness@latest</code></pre></div>
95
- <p style="margin-bottom:0">
96
- It owns MetaMask runtime control and the domain capabilities; the generic graph engine and the
97
- evidence schemas underneath it are separate packages it depends on.
98
- </p>
99
- </div>
100
-
101
- <div class="arrow" aria-hidden="true">↓</div>
102
-
103
- <button type="button" class="layer" aria-expanded="false" aria-controls="l-libs">
104
- <span class="layer-n">3</span>
105
- <span class="layer-name">Team recipe libraries</span>
106
- <span class="layer-sub">your team's recipes and domain actions</span>
107
- </button>
108
- <div class="layer-detail" id="l-libs" hidden>
109
- <p>
110
- A team-owned repo of reusable recipes plus the domain actions they need. The harness ships a
111
- bundled library so a fresh install can prove something immediately; your team's library is where
112
- the recipes that matter to your work live.
113
- </p>
114
- <p>Libraries must be declared, or the harness only sees the bundled set:</p>
115
- <div class="cmd"><pre><code><span class="p">$ </span>export RECIPE_LIBRARY_PATH="perps=$HOME/dev/my-recipe-library"
116
- <span class="p">$ </span>mm-harness run &lt;recipe&gt; --library perps=$HOME/dev/my-recipe-library</code></pre></div>
117
- <p style="margin-bottom:0">
118
- Each library carries its own setup notes — read those before running anything domain-specific.
119
- </p>
120
- </div>
121
-
122
- <div class="arrow" aria-hidden="true">↓</div>
123
-
124
- <button type="button" class="layer" aria-expanded="false" aria-controls="l-product">
125
- <span class="layer-n">4</span>
126
- <span class="layer-name">Product repos</span>
127
- <span class="layer-sub">the thing under test</span>
128
- </button>
129
- <div class="layer-detail" id="l-product" hidden>
130
- <p>
131
- <code>metamask-extension</code>, <code>metamask-mobile</code>, and <code>core</code>. Recipes
132
- execute against a real build, never a mock. Run <code>mm-harness</code> from inside the checkout
133
- and it detects the product, ports, and runtime paths.
134
- </p>
135
- <p style="margin-bottom:0">
136
- They differ, and the harness says so rather than pretending otherwise: Core is headless with
137
- nothing to launch and no UI actions; Extension and iOS can record full-run video; Android
138
- replay video is not implemented yet, so use screenshot evidence there.
139
- </p>
140
- </div>
141
- </div>
142
- </section>
143
-
144
- <section class="wrap">
145
- <h2 id="spec">The spec underneath</h2>
146
- <p>
147
- <code>mm-harness</code> implements <strong><a href="https://farmslot.io">Farmslot</a></strong>, a versioned specification for agentic
148
- proof work. The CLI is one implementation of it, not the thing itself.
149
- </p>
150
-
151
- <div class="stack">
152
- <div class="layer layer-static">
153
- <span class="layer-n">1</span>
154
- <span class="layer-name">The specification</span>
155
- <span class="layer-sub">recipes, action manifests, observations and traces, evidence, handoff</span>
156
- </div>
157
- <div class="arrow" aria-hidden="true">↓</div>
158
- <div class="layer layer-static">
159
- <span class="layer-n">2</span>
160
- <span class="layer-name">mm-harness implements it</span>
161
- <span class="layer-sub">for MetaMask products</span>
162
- </div>
163
- <div class="arrow" aria-hidden="true">↓</div>
164
- <div class="layer layer-static">
165
- <span class="layer-n">3</span>
166
- <span class="layer-name">Skills drive it</span>
167
- <span class="layer-sub">the workflows an agent follows</span>
168
- </div>
169
- </div>
170
-
171
- <p>Schemas are published and versioned. Every recipe carries the URL it validates against:</p>
172
- <div class="out">"$schema": <a href="https://farmslot.io/schemas/recipe-v1.schema.json">"https://farmslot.io/schemas/recipe-v1.schema.json"</a></div>
173
- <p>
174
- Action manifests carry <code>action-manifest-v1</code>; evidence records its own
175
- <code>schemaVersion</code> and <code>runner_protocol_version</code>. Versioning is what keeps a
176
- bundle readable by tooling written after it was produced.
177
- </p>
178
-
179
- <h3>Why the spec is the scaling mechanism</h3>
180
- <p>
181
- The recipe you run from the CLI is the same artifact a control plane dispatches to a worker,
182
- monitors, and gates — dispatch, worker, self-review, human gate, publication, each step speaking
183
- these contracts. Evidence returns in the same shape either way, so a fleet result is reviewable by
184
- whoever wrote the recipe. Parity is structural: one spec, both sides.
185
- </p>
186
- <p>
187
- That is what makes the trust layer scale. A proof written once becomes a permanent guard: it is
188
- replayed by whoever changes that code next, it stays readable as evidence no matter who or what ran
189
- it, and the bug it was written for cannot quietly return. Review does not get weaker as volume
190
- grows.
191
- </p>
192
- <p>The seam shows in the CLI's own help — the flags a control plane supplies:</p>
193
- <div class="out">managed trust boundary (not needed for normal runs; <a href="https://farmslot.io">Farmslot</a> supplies it):
194
- --source-trust, --source-kind, --source-name, --source-digest,
195
- <span class="hint">--approve-plan</span> (binds approval to the exact reviewed plan)</div>
196
- <p>Approve a plan and only that plan runs — which is what keeps the gate a gate.</p>
197
-
198
- <div class="note">
199
- <span class="note-title">What you actually need</span>
200
- <p>
201
- The <a href="https://farmslot.io">Farmslot</a> control plane is <strong>experimental and sole-maintained</strong>. Nothing this site
202
- teaches requires it — the harness, recipes, and skills are complete on their own, and the CLI says
203
- as much: those flags are "not needed for normal runs". The specification is what you adopt; the
204
- control plane is one consumer of it.
205
- </p>
206
- </div>
207
- </section>
208
-
209
- <section class="wrap">
210
- <h2 id="loop">The improvement loop</h2>
211
- <p>
212
- A recipe guards the regression it was written for. This is how a team catches the ones nobody has
213
- written down yet — each run leaving the next one better informed.
214
- </p>
215
-
216
- <div class="doctrine">
217
- <p>
218
- <span class="k">Learnings are written, not collected.</span> The checklist an agent follows carries
219
- a step instructing it to write what it learned as human-readable markdown, bundled beside the
220
- execution plan and the evidence. A run ends with prose — what was hard, what surprised it, what
221
- the next run should know — sitting next to the proof. A deliverable, not telemetry: nobody mines
222
- traces for insight; the agent is asked and answers.
223
- </p>
224
- </div>
225
-
226
- <h3>The chain</h3>
227
- <div class="stack">
228
- <div class="layer layer-static">
229
- <span class="layer-n">1</span>
230
- <span class="layer-name">A checklist step asks for learnings</span>
231
- <span class="layer-sub">part of the execution plan</span>
232
- </div>
233
- <div class="arrow" aria-hidden="true">↓</div>
234
- <div class="layer layer-static">
235
- <span class="layer-n">2</span>
236
- <span class="layer-name">The run writes learnings.md beside its evidence</span>
237
- <span class="layer-sub">prose, in the run artifacts</span>
238
- </div>
239
- <div class="arrow" aria-hidden="true">↓</div>
240
- <div class="layer layer-static">
241
- <span class="layer-n">3</span>
242
- <span class="layer-name">Curation promotes the durable ones</span>
243
- <span class="layer-sub">a human decides what generalises</span>
244
- </div>
245
- <div class="arrow" aria-hidden="true">↓</div>
246
- <div class="layer layer-static">
247
- <span class="layer-n">4</span>
248
- <span class="layer-name">They become team knowledge</span>
249
- <span class="layer-sub">in the library, beside the recipes</span>
250
- </div>
251
- <div class="arrow" aria-hidden="true">↓</div>
252
- <div class="layer layer-static">
253
- <span class="layer-n">5</span>
254
- <span class="layer-name">The next run loads it before acting</span>
255
- <span class="layer-sub">discovery, not recall</span>
256
- </div>
257
- </div>
258
-
259
- <p>
260
- Step 3 is a person on purpose: a run produces plenty of true-but-local detail, and promoting all of
261
- it buries what matters — the same judgement as deciding what belongs in a code comment.
262
- </p>
263
-
264
- <div class="note blue">
265
- <span class="note-title">Where learnings collect</span>
266
- <p>
267
- Scrubbed packages from approved runs land in
268
- <code>MetaMask/experimental-distributed-learnings</code>, a private append-only inbox — the same
269
- repository as <code>experimental-agentic-learnings</code>, which was its earlier name and still
270
- redirects. Capture records the observation, review later decides whether it warrants a proposal,
271
- and proposals go to whichever repo owns the affected layer. Sharing is opt-in: without a local
272
- <code>learning.config.json</code> a run stages locally and publishes nothing. Packages are
273
- date-partitioned and the indexes are scaffolded, but only one day of runs has landed so far —
274
- collection is beginning, so treat it as the destination rather than a corpus to read today.
275
- </p>
276
- </div>
277
-
278
- <h3>What works today</h3>
279
-
280
- <div class="table-scroll">
281
- <table>
282
- <thead><tr><th>Mechanism</th><th>Its part in the loop</th></tr></thead>
283
- <tbody>
284
- <tr>
285
- <td>The evidence bundle</td>
286
- <td>Produces the raw material. <code>diagnostics.json</code> in particular is where side findings land — application warnings and errors captured during the run, kept out of the verdict precisely so they survive as observations rather than being flattened into pass or fail.</td>
287
- </tr>
288
- <tr>
289
- <td>Team recipe libraries</td>
290
- <td>The place shared understanding accumulates. A recipe that encodes "get to a clean market first" <em>is</em> a piece of team knowledge, already reusable by everyone who declares the library.</td>
291
- </tr>
292
- <tr>
293
- <td><code>mm-harness recipe-quality</code></td>
294
- <td>Turns a review's verdicts into a quality artifact, so an assessment of a proof is itself a durable record rather than a comment that scrolls away.</td>
295
- </tr>
296
- <tr>
297
- <td><code>mm-harness execution-template</code></td>
298
- <td>Discovers, validates, and materialises shared agent checklists — a curated procedure written once and picked up by everyone, which is the loop working at the level of process.</td>
299
- </tr>
300
- <tr>
301
- <td>Skills</td>
302
- <td>The same idea for workflows. A skill is a procedure someone got right, packaged so nobody has to rediscover it.</td>
303
- </tr>
304
- </tbody>
305
- </table>
306
- </div>
307
-
308
- <h3>Where this is heading</h3>
309
- <p>
310
- The gap is the middle of the loop: recipes and actions have a home in a team library; the sharper
311
- things a run teaches you do not yet. Worth capturing:
312
- </p>
313
-
314
- <ul>
315
- <li><strong>Gotchas</strong> — the non-obvious precondition that cost someone an afternoon, written down once.</li>
316
- <li><strong>Screen maps</strong> — how a surface is actually reached and identified in the current build, so the next author is not re-deriving it.</li>
317
- <li><strong>Flakes</strong> — the step known to be intermittent, with what is known about when and why, so an author can distinguish a real failure from a familiar one.</li>
318
- </ul>
319
-
320
- <p>
321
- The intended shape is the one proven everywhere else here: <strong>discovery rather than
322
- recall</strong>. Just as you ask the checkout what actions exist, you would ask what is already
323
- known about a surface before authoring against it — a <code>knowledge</code> surface alongside
324
- <code>actions</code> and <code>run --list</code>, resolving the way libraries already do, layered
325
- most-specific-wins: yours, your team's, the workflow's, then defaults shipping with the harness
326
- release so tool facts cannot drift out of date in a document nobody re-reads.
327
- </p>
328
-
329
- <p>
330
- Entries stay small and curated: a short index of what exists and when to load it, topic files under
331
- a size cap, each entry carrying a stable id and the same symptom → cause → what to do shape the
332
- error messages use. Promotion happens through an ordinary reviewed pull request, so a human is in
333
- the loop by construction.
334
- </p>
335
-
336
- <div class="note">
337
- <span class="note-title">Being straight about status</span>
338
- <p style="margin-bottom:0">
339
- <strong>Not shipping yet.</strong> There is no <code>knowledge</code> command today, which is why
340
- you will not find one in a copyable block on this page. Meanwhile the useful part is unblocked:
341
- keep what your runs teach you in the library repo beside the recipes. Tooling makes it
342
- discoverable later; writing it down is what makes it exist.
343
- </p>
344
- </div>
345
-
346
- <div class="doctrine">
347
- <p>
348
- <span class="k">The skills teach the workflow; the knowledge teaches the product.</span> Runs
349
- produce learnings, curation promotes them, discovery serves them to every run after.
350
- </p>
351
- </div>
352
- </section>
353
-
354
- <section class="wrap">
355
- <h2 id="libraries">Where everything lives</h2>
356
- <div class="table-scroll">
357
- <table>
358
- <thead><tr><th>What</th><th>Is</th><th>You need it when</th></tr></thead>
359
- <tbody>
360
- <tr>
361
- <td><code>@deeeed/metamask-harness</code><br><span style="color:var(--text-faint);font-size:.85rem">the <code>mm-harness</code> CLI, on npm</span></td>
362
- <td>The execution engine and evidence producer: <code>doctor</code>, <code>launch</code>, <code>actions</code>, <code>call</code>, <code>run</code>, <code>last</code>.</td>
363
- <td><strong>Always.</strong> Install and update with <code>npm i -g @deeeed/metamask-harness@latest</code>.</td>
364
- </tr>
365
- <tr>
366
- <td><code>Consensys/skills</code><br><span style="color:var(--text-faint);font-size:.85rem">internal repo</span></td>
367
- <td>Agentic skills — recipe authoring, PR QA review, release validation. Installed into a checkout via that repo's tooling.</td>
368
- <td>When you want an agent to follow a proven workflow instead of improvising one.</td>
369
- </tr>
370
- <tr>
371
- <td>Team recipe libraries<br><span style="color:var(--text-faint);font-size:.85rem">e.g. the perps and money-movement libraries</span></td>
372
- <td>Team-owned recipes, domain actions, and domain knowledge. Declared with <code>RECIPE_LIBRARY_PATH</code> or <code>--library</code>.</td>
373
- <td>When running or authoring anything domain-specific. <a href="tutorials/v3.html#steps">V3 walks the setup</a> with the perps library as the worked example.</td>
374
- </tr>
375
- <tr>
376
- <td>Product repos<br><span style="color:var(--text-faint);font-size:.85rem">extension · mobile · core</span></td>
377
- <td>The thing under test. The harness runs against a real checkout and a real build.</td>
378
- <td><strong>Always</strong> — there is nothing to prove without one.</td>
379
- </tr>
380
- </tbody>
381
- </table>
382
- </div>
383
- </section>
384
-
385
- <section class="wrap">
386
- <h2 id="workflows">The three workflows — pick one, do not blend them</h2>
387
- <p>Most confusion here is someone doing two at once. They need different setup and fail differently.</p>
388
-
389
- <div class="grid grid-3">
390
- <div class="card">
391
- <h3>1 · Run an existing recipe</h3>
392
- <p style="color:var(--text-dim);font-size:.92rem">No skills needed. This is the majority of daily use.</p>
393
- <div class="cmd"><pre><code><span class="p">$ </span>mm-harness update
394
- <span class="p">$ </span>cd &lt;product checkout&gt;
395
- <span class="p">$ </span>export RECIPE_LIBRARY_PATH=&lt;name=path&gt;
396
- <span class="p">$ </span>mm-harness doctor
397
- <span class="p">$ </span>mm-harness launch
398
- <span class="p">$ </span>mm-harness run &lt;recipe&gt; \
399
- --artifacts-dir ./out</code></pre></div>
400
- <p style="margin-bottom:0;font-size:.92rem">Evidence lands in the artifacts dir. That is the whole workflow.</p>
401
- </div>
402
-
403
- <div class="card">
404
- <h3>2 · Author a recipe</h3>
405
- <p style="color:var(--text-dim);font-size:.92rem">For a specific acceptance criterion. Skills earn their keep here.</p>
406
- <p style="font-size:.92rem">
407
- Install the recipe-authoring skill. It discovers the vocabulary with
408
- <code>mm-harness actions</code> — <strong>the discovered list is law, action names are never
409
- invented</strong> — composes the graph, validates it with <code>run --plan</code>, then runs it
410
- for real.
411
- </p>
412
- <p style="margin-bottom:0;font-size:.92rem">
413
- Expect one honest failure-and-fix loop. That is the error messages doing their job.
414
- </p>
415
- </div>
416
-
417
- <div class="card">
418
- <h3>3 · Review a PR / validate a release</h3>
419
- <p style="color:var(--text-dim);font-size:.92rem">Requires the QA skills.</p>
420
- <p style="font-size:.92rem">
421
- Give the skill one PR URL. It extracts the acceptance criteria verbatim — missing ones become a
422
- hygiene finding, never an invented criterion — waits for you to confirm or edit the table, runs
423
- the proof on a real device, and produces a per-criterion verdict with evidence paths.
424
- </p>
425
- <p style="margin-bottom:0;font-size:.92rem">
426
- A criterion the surface genuinely cannot prove is reported as needing a human, not quietly
427
- passed.
428
- </p>
429
- </div>
430
- </div>
431
-
432
- <div class="note blue">
433
- <span class="note-title">Why "do not blend them" is a real instruction</span>
434
- <p>
435
- Running a recipe needs no skills; reviewing a PR does. Install everything and ask an agent to
436
- "just handle it" and you get an agent choosing between procedures with no basis to pick. Name the
437
- workflow you are in.
438
- </p>
439
- </div>
440
- </section>
441
-
442
- <section class="wrap">
443
- <h2 id="mistakes">The five mistakes every newcomer makes</h2>
444
-
445
- <ol style="padding-left:1.2rem">
446
- <li style="margin-bottom:1rem">
447
- <strong>Asking the agent to figure it all out from one sentence.</strong> The skills <em>are</em>
448
- the figured-out part. Name the workflow you want; do not make the agent guess which of the three
449
- you are in.
450
- </li>
451
- <li style="margin-bottom:1rem">
452
- <strong>A stale harness.</strong> This one costs the most afternoons. The CLI ships often and
453
- recipes assume current behaviour. Run <code>mm-harness update</code> before you debug anything
454
- that "used to work".
455
- </li>
456
- <li style="margin-bottom:1rem">
457
- <strong>Not declaring the library.</strong> Without <code>RECIPE_LIBRARY_PATH</code> (or
458
- <code>--library</code>) the harness only sees bundled recipes — so your team's recipe appears not
459
- to exist, and the error is telling the literal truth.
460
- </li>
461
- <li style="margin-bottom:1rem">
462
- <strong>Skipping <code>doctor</code>.</strong> It tells you exactly what is missing and the exact
463
- command that fixes it. Every error in this stack carries a <code>Next:</code> action. Read them —
464
- that is the whole design.
465
- </li>
466
- <li>
467
- <strong>Blending the workflows.</strong> See above. Mixing "run a recipe" with "review a PR"
468
- confuses the agent and produces work you then have to check by hand.
469
- </li>
470
- </ol>
471
-
472
- <hr class="sep">
473
- <h2>Which repo is which</h2>
474
- <p>
475
- The layers above are the design. The <a href="ecosystem.html">Ecosystem map</a> is the concrete
476
- version: the six repositories and packages behind a run, each with its URL, and which way the
477
- dependencies point.
478
- </p>
479
-
480
- <div class="btn-row">
481
- <a class="btn btn-primary" href="ecosystem.html">See the repo map →</a>
482
- <a class="btn btn-ghost" href="how-it-works.html#steps">Do the walkthrough</a>
483
- <a class="btn btn-ghost" href="reviewers.html">Read an evidence bundle</a>
484
- </div>
485
- </section>
486
- </main>
487
-
488
- <footer class="footer">
489
- <div class="wrap">
490
- <p>Internal getting-started guide for proving MetaMask changes with recipes. Not official MetaMask product documentation.</p>
491
- <p>Sample output moves between releases; trust your terminal over this page.</p>
492
- </div>
493
- </footer>
494
-
495
- <script type="module" src="assets/progress.mjs?v=4"></script>
496
- </body>
497
- </html>
@@ -1,25 +0,0 @@
1
- const root = document.querySelector('[data-help-recipes]');
2
-
3
- if (root) {
4
- const response = await fetch(new URL('help-recipes.json', import.meta.url));
5
- if (!response.ok) throw new Error(`Recipe help failed to load: ${response.status}`);
6
- const topic = await response.json();
7
- const code = document.createElement('code');
8
- const lines = [
9
- 'Task: use the installed mm-harness for recipe-backed work. Follow these steps in order.',
10
- topic.summary,
11
- topic.capabilities,
12
- topic.scopeNotice,
13
- ];
14
- for (const [index, section] of topic.sections.entries()) {
15
- lines.push('', `${index + 1}. ${section.title}`, ` ${section.instruction}`);
16
- for (const detail of section.details) lines.push(` - ${detail}`);
17
- for (const command of section.commands) lines.push(` ${command}`);
18
- }
19
- lines.push('', `Safety: ${topic.safety}`);
20
- code.textContent = lines.join('\n');
21
- const pre = document.createElement('pre');
22
- pre.append(code);
23
- root.replaceChildren(pre);
24
- document.dispatchEvent(new CustomEvent('mm-harness-content-rendered'));
25
- }
@@ -1,24 +0,0 @@
1
- <svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M32.7077 32.7522L25.1688 30.5174L19.4833 33.9008L15.5167 33.8991L9.82793 30.5174L2.29225 32.7522L0 25.0489L2.29225 16.4993L0 9.27094L2.29225 0.312256L14.0674 7.31554H20.9326L32.7077 0.312256L35 9.27094L32.7077 16.4993L35 25.0489L32.7077 32.7522Z" fill="#FF5C16"/>
3
- <path d="M2.29395 0.312256L14.0691 7.32047L13.6008 12.1301L2.29395 0.312256Z" fill="#FF5C16"/>
4
- <path d="M9.82959 25.0522L15.0106 28.9811L9.82959 30.5175V25.0522Z" fill="#FF5C16"/>
5
- <path d="M14.5966 18.5565L13.6009 12.1333L7.22692 16.5009L7.22363 16.4993V16.5025L7.24335 20.9983L9.82809 18.5565H9.82974H14.5966Z" fill="#FF5C16"/>
6
- <path d="M32.7077 0.312256L20.9326 7.32047L21.3993 12.1301L32.7077 0.312256Z" fill="#FF5C16"/>
7
- <path d="M25.1722 25.0522L19.9912 28.9811L25.1722 30.5175V25.0522Z" fill="#FF5C16"/>
8
- <path d="M27.7766 16.5025H27.7783H27.7766V16.4993L27.775 16.5009L21.401 12.1333L20.4053 18.5565H25.1722L27.7586 20.9983L27.7766 16.5025Z" fill="#FF5C16"/>
9
- <path d="M9.82793 30.5175L2.29225 32.7522L0 25.0522H9.82793V30.5175Z" fill="#E34807"/>
10
- <path d="M14.5947 18.5549L16.0341 27.8406L14.0393 22.6777L7.23975 20.9984L9.82613 18.5549H14.593H14.5947Z" fill="#E34807"/>
11
- <path d="M25.1721 30.5175L32.7078 32.7522L35.0001 25.0522H25.1721V30.5175Z" fill="#E34807"/>
12
- <path d="M20.4053 18.5549L18.9658 27.8406L20.9607 22.6777L27.7602 20.9984L25.1722 18.5549H20.4053Z" fill="#E34807"/>
13
- <path d="M0 25.0488L2.29225 16.4993H7.22183L7.23991 20.9967L14.0394 22.676L16.0343 27.8389L15.0089 28.976L9.82793 25.0472H0V25.0488Z" fill="#FF8D5D"/>
14
- <path d="M35.0001 25.0488L32.7078 16.4993H27.7783L27.7602 20.9967L20.9607 22.676L18.9658 27.8389L19.9912 28.976L25.1722 25.0472H35.0001V25.0488Z" fill="#FF8D5D"/>
15
- <path d="M20.9325 7.31543H17.4999H14.0673L13.6006 12.1251L16.0342 27.834H18.9656L21.4008 12.1251L20.9325 7.31543Z" fill="#FF8D5D"/>
16
- <path d="M2.29225 0.312256L0 9.27094L2.29225 16.4993H7.22183L13.5991 12.1301L2.29225 0.312256Z" fill="#661800"/>
17
- <path d="M13.17 20.4199H10.9369L9.72095 21.6062L14.0409 22.6727L13.17 20.4182V20.4199Z" fill="#661800"/>
18
- <path d="M32.7077 0.312256L34.9999 9.27094L32.7077 16.4993H27.7781L21.4009 12.1301L32.7077 0.312256Z" fill="#661800"/>
19
- <path d="M21.833 20.4199H24.0694L25.2853 21.6079L20.9604 22.676L21.833 20.4182V20.4199Z" fill="#661800"/>
20
- <path d="M19.4817 30.8362L19.9911 28.9794L18.9658 27.8423H16.0327L15.0073 28.9794L15.5167 30.8362" fill="#661800"/>
21
- <path d="M19.4816 30.8359V33.9021H15.5166V30.8359H19.4816Z" fill="#C0C4CD"/>
22
- <path d="M9.82959 30.5142L15.52 33.9008V30.8346L15.0106 28.9778L9.82959 30.5142Z" fill="#E7EBF6"/>
23
- <path d="M25.1721 30.5142L19.4817 33.9008V30.8346L19.9911 28.9778L25.1721 30.5142Z" fill="#E7EBF6"/>
24
- </svg>