@deeeed/metamask-harness 0.79.0 → 0.80.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.
Files changed (210) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +1 -1
  3. package/adapters/extension/ensure-browser.sh +2 -2
  4. package/adapters/extension/inject.mjs +0 -1
  5. package/adapters/extension/launch-browser.cjs +39 -613
  6. package/adapters/extension/readiness.mjs +2 -5
  7. package/adapters/extension/reattach.sh +2 -2
  8. package/adapters/extension/stamp-runtime-title.cjs +1 -1
  9. package/adapters/manifest.json +2 -34
  10. package/adapters/mobile/bridge-runtime/cdp-bridge.cjs +57 -1358
  11. package/adapters/mobile/bridge-runtime/teaching.cjs +20 -0
  12. package/adapters/mobile/inject.sh +16 -0
  13. package/adapters/mobile/launch-console-forwarder.cjs +1 -2
  14. package/adapters/mobile/open-device.sh +2 -2
  15. package/adapters/mobile/reload-app.mjs +4 -4
  16. package/adapters/mobile/reset-app-data.sh +1 -1
  17. package/adapters/mobile/start-console-forwarder.sh +3 -2
  18. package/adapters/mobile/start-metro.sh +17 -12
  19. package/adapters/mobile/wait-for-bridge.cjs +2 -2
  20. package/adapters/shared/harness-source-fingerprint.mjs +13 -8
  21. package/adapters/shared/open-debug.mjs +2 -2
  22. package/adapters/shared/sync-wallet-fixture.sh +8 -5
  23. package/adapters/terminal/cleanup.mjs +2 -1
  24. package/adapters/terminal/inject.mjs +2 -1
  25. package/bin/mm-harness +9 -28
  26. package/dist/adapters/checkout-files.js +16 -0
  27. package/dist/adapters/console-capture.js +14 -1
  28. package/dist/adapters/core/actions.js +4 -3
  29. package/dist/adapters/core/overlay.js +1 -1
  30. package/dist/adapters/core/readiness.js +28 -1
  31. package/dist/adapters/core/run.js +2 -2
  32. package/dist/adapters/core/surface.js +16 -1
  33. package/dist/adapters/extension/browser-pid.js +56 -0
  34. package/dist/adapters/extension/console-capture.js +1 -1
  35. package/dist/adapters/extension/doctor-checks.js +1 -1
  36. package/dist/adapters/extension/ensure-ready.js +5 -4
  37. package/dist/adapters/extension/extension-id.js +1 -1
  38. package/dist/adapters/extension/feature-flags.js +1 -1
  39. package/dist/adapters/extension/fixtures.js +1 -2
  40. package/dist/adapters/extension/launch.js +4 -5
  41. package/dist/adapters/extension/launched-browser.js +1 -2
  42. package/dist/adapters/extension/network-observer.js +1 -1
  43. package/dist/adapters/extension/overlay.js +1 -1
  44. package/dist/adapters/extension/product-config.js +1 -1
  45. package/dist/adapters/extension/readiness.js +1 -1
  46. package/dist/adapters/extension/reload.js +1 -1
  47. package/dist/adapters/extension/run.js +24 -10
  48. package/dist/adapters/extension/runtime-decision.js +2 -1
  49. package/dist/adapters/extension/runtime.js +9 -5
  50. package/dist/adapters/extension/surface.js +15 -2
  51. package/dist/adapters/extension/verify.js +2 -2
  52. package/dist/adapters/harness-freshness.js +2 -1
  53. package/dist/adapters/mobile/android-gfxinfo-performance.js +1 -3
  54. package/dist/adapters/mobile/app-identity.js +10 -0
  55. package/dist/adapters/mobile/doctor-checks.js +1 -1
  56. package/dist/adapters/mobile/fixtures.js +1 -1
  57. package/dist/adapters/mobile/launch.js +27 -28
  58. package/dist/adapters/mobile/lifecycle.js +1 -1
  59. package/dist/adapters/mobile/metro-env.js +9 -59
  60. package/dist/adapters/mobile/performance-observer.js +1 -1
  61. package/dist/adapters/mobile/prepare-target.js +1 -1
  62. package/dist/adapters/mobile/prepare.js +3 -4
  63. package/dist/adapters/mobile/provision.js +1 -1
  64. package/dist/adapters/mobile/readiness.js +1 -1
  65. package/dist/adapters/mobile/recording-target.js +15 -0
  66. package/dist/adapters/mobile/release-artifact-state.js +1 -1
  67. package/dist/adapters/mobile/reload.js +1 -1
  68. package/dist/adapters/mobile/run.js +8 -7
  69. package/dist/adapters/mobile/runtime-decision.js +2 -4
  70. package/dist/adapters/mobile/source-freshness.js +22 -126
  71. package/dist/adapters/mobile/surface.js +26 -3
  72. package/dist/adapters/mobile/ui.js +16 -5
  73. package/dist/adapters/mobile/verify.js +2 -3
  74. package/dist/adapters/performance/cdp-trace.js +1 -1
  75. package/dist/adapters/performance/device-platform.js +1 -1
  76. package/dist/adapters/slot-ports.js +1 -1
  77. package/dist/adapters/surface.js +1 -0
  78. package/dist/adapters/terminal/console-capture.js +1 -1
  79. package/dist/adapters/terminal/launch.js +1 -1
  80. package/dist/adapters/terminal/run.js +25 -2
  81. package/dist/adapters/terminal/surface.js +7 -1
  82. package/dist/adapters.js +8 -4
  83. package/dist/advisor-policy.js +1 -1
  84. package/dist/checkout-view.js +1 -2
  85. package/dist/cli.js +28 -15
  86. package/dist/command-contract.js +1 -26
  87. package/dist/commands/call.js +10 -24
  88. package/dist/commands/check.js +3 -4
  89. package/dist/commands/checklist.js +1 -1
  90. package/dist/commands/completion-candidates.js +2 -10
  91. package/dist/commands/config.js +2 -2
  92. package/dist/commands/core-readiness.js +12 -7
  93. package/dist/commands/debug.js +3 -3
  94. package/dist/commands/device-target.js +5 -5
  95. package/dist/commands/doctor.js +2 -14
  96. package/dist/commands/domain.js +2 -2
  97. package/dist/commands/ensure-ready.js +1 -7
  98. package/dist/commands/fixtures.js +5 -6
  99. package/dist/commands/help.js +3 -4
  100. package/dist/commands/launch/device.js +10 -17
  101. package/dist/commands/launch/extension.js +2 -8
  102. package/dist/commands/launch/mobile.js +1 -1
  103. package/dist/commands/list-executables.js +1 -3
  104. package/dist/commands/logs.js +3 -3
  105. package/dist/commands/manifest.js +1 -12
  106. package/dist/commands/mobile-device-view.js +4 -2
  107. package/dist/commands/overlay.js +110 -0
  108. package/dist/commands/pin.js +1 -1
  109. package/dist/commands/pr-body.js +2 -2
  110. package/dist/commands/prepare.js +4 -9
  111. package/dist/commands/provision.js +3 -12
  112. package/dist/commands/recipe-advice.js +1 -2
  113. package/dist/commands/recipe-quality.js +2 -3
  114. package/dist/commands/resolve-extension.js +1 -7
  115. package/dist/commands/review.js +4 -4
  116. package/dist/commands/run-engine.js +12 -51
  117. package/dist/commands/run.js +4 -25
  118. package/dist/commands/runtime-decision.js +1 -6
  119. package/dist/commands/runtime-health.js +1 -7
  120. package/dist/commands/runtime-launch.js +1 -13
  121. package/dist/commands/self-test.js +2 -6
  122. package/dist/commands/status-watch.js +1 -2
  123. package/dist/commands/status.js +2 -5
  124. package/dist/commands/task-init.js +2 -3
  125. package/dist/commands/tutorial.js +2 -2
  126. package/dist/commands/update.js +1 -1
  127. package/dist/completions-cache.js +1 -1
  128. package/dist/console-classifier.js +19 -0
  129. package/dist/doctor.js +2 -3
  130. package/dist/funding-execution-context.js +15 -1
  131. package/dist/host.js +32 -0
  132. package/dist/index.js +1 -6
  133. package/dist/live-tsx.js +49 -0
  134. package/dist/mm-harness-cli.js +2 -4
  135. package/dist/network-observation.js +4 -4
  136. package/dist/paths.js +34 -64
  137. package/dist/performance-observation.js +2 -2
  138. package/dist/progress.js +1 -1
  139. package/dist/recipe-assistance-context.js +1 -3
  140. package/dist/recipe-security.js +2 -59
  141. package/dist/review/knowledge.js +2 -2
  142. package/dist/runner.js +5 -3
  143. package/dist/runtime-context.js +1 -1
  144. package/dist/task-view.js +2 -3
  145. package/docs/CONTRIBUTING.md +1 -1
  146. package/docs/cli-contract.md +2 -2
  147. package/docs/feature-guard.md +90 -0
  148. package/library/README.md +3 -1
  149. package/library/actions/core/perps/_controller.mjs +153 -130
  150. package/library/actions/core/perps/quote_fees.mjs +58 -0
  151. package/library/actions/core/wallet/_fixture-accounts.mjs +69 -0
  152. package/library/actions/core/wallet/list_accounts.mjs +14 -57
  153. package/library/actions/extension/feature_flags/state.mjs +1 -1
  154. package/library/actions/extension/platform/cdp.mjs +2 -8
  155. package/library/actions/harness-exports.mjs +1 -6
  156. package/library/actions/mobile/app/network-control.mjs +6 -8
  157. package/library/actions/mobile/perps/prepare_local_snapshot_endpoint.mjs +1 -1
  158. package/library/actions/mobile/platform/bridge.mjs +8 -8
  159. package/library/actions/mobile/platform/native-session-name.mjs +21 -1
  160. package/library/actions/mobile/platform/native-session.mjs +3 -4
  161. package/library/actions/mobile/platform/observe-ui.mjs +12 -6
  162. package/library/actions/mobile/ui/native-navigation.mjs +4 -3
  163. package/library/actions/mobile/wallet/native-ui.mjs +3 -2
  164. package/library/actions/shared/analytics/_adapter.mjs +1 -1
  165. package/library/actions/shared/console-findings.mjs +1 -1
  166. package/library/actions/terminal/platform/runtime.mjs +2 -1
  167. package/library/manifests/core.action-manifest.json +83 -13
  168. package/package.json +8 -9
  169. package/adapters/extension/lib/slot-title.cjs +0 -292
  170. package/adapters/mobile/bridge-runtime/console-forwarder.cjs +0 -472
  171. package/adapters/mobile/bridge-runtime/lib/bridge-errors.cjs +0 -125
  172. package/adapters/mobile/bridge-runtime/lib/cdp-broker.cjs +0 -1055
  173. package/adapters/mobile/bridge-runtime/lib/cdp-eval.cjs +0 -110
  174. package/adapters/mobile/bridge-runtime/lib/config.cjs +0 -61
  175. package/adapters/mobile/bridge-runtime/lib/console-format.cjs +0 -53
  176. package/adapters/mobile/bridge-runtime/lib/devtools-proxy.cjs +0 -177
  177. package/adapters/mobile/bridge-runtime/lib/issue-capture.cjs +0 -446
  178. package/adapters/mobile/bridge-runtime/lib/match-bridge-target.cjs +0 -84
  179. package/adapters/mobile/bridge-runtime/lib/target-discovery.cjs +0 -403
  180. package/adapters/mobile/bridge-runtime/lib/ws-client.cjs +0 -116
  181. package/adapters/mobile/coalesce-metro-log.cjs +0 -24
  182. package/adapters/mobile/launch-metro.cjs +0 -77
  183. package/adapters/mobile/metro-config.cjs +0 -98
  184. package/adapters/mobile/metro-log-generation.cjs +0 -106
  185. package/dist/adapters/mobile/frame-metrics.js +0 -118
  186. package/dist/adapters/mobile/video-recorder.js +0 -289
  187. package/dist/artifact-files.js +0 -92
  188. package/dist/checkout-lock.js +0 -149
  189. package/dist/cli-color.js +0 -98
  190. package/dist/command-journal.js +0 -308
  191. package/dist/commands/last.js +0 -60
  192. package/dist/commands/launch/index.js +0 -109
  193. package/dist/commands/parse-args.js +0 -279
  194. package/dist/commands/reload.js +0 -41
  195. package/dist/commands/run-report.js +0 -241
  196. package/dist/commands/shared.js +0 -323
  197. package/dist/commands/stop.js +0 -60
  198. package/dist/devices.js +0 -100
  199. package/dist/execution-provenance.js +0 -332
  200. package/dist/harness.js +0 -451
  201. package/dist/heal-bounds.js +0 -137
  202. package/dist/json-stream.js +0 -60
  203. package/dist/leaf-invoke.js +0 -19
  204. package/dist/library-provenance.js +0 -33
  205. package/dist/live-adapter-contract.js +0 -380
  206. package/dist/recording-target.js +0 -120
  207. package/dist/run-diagnostics.js +0 -364
  208. package/dist/run-recording.js +0 -481
  209. package/dist/runtime-proof.js +0 -90
  210. package/library/actions/mobile/platform/tool-paths.mjs +0 -123
package/CHANGELOG.md CHANGED
@@ -2,6 +2,53 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.80.0 - 2026-10-06
6
+
7
+ ### Added
8
+
9
+ - Core `metamask.perps.quote_fees`: quotes an order's fees through the controller's `calculateFees` (read-only, testnet by default). `rewards_discount_bips` makes the headless `RewardsController:getPerpsDiscountForAccount` answer with that discount (with the Ethereum mainnet network context the controller builds the account id from), so a rewards discount can be proven live; without it the controller has no rewards source, as before.
10
+ - Feature-loss guard for the platform migration (repo tooling; the package's behaviour is unchanged): `scripts/feature-inventory.mjs` checks the build against the frozen 0.76.0 capability inventory (`tests/feature-inventory/`), `scripts/differential.mjs` runs the same commands on the frozen 0.76.0 install and the packed checkout on real slots and reports every difference, and `scripts/release-smoke.mjs` runs the fixed recorded release smoke set (`tests/release-smoke/`). See `docs/feature-guard.md`.
11
+
12
+ ### Changed
13
+
14
+ - `tsx` is a runtime dependency: Core live adapter scripts run under the target's own tsx when it has one and under the harness's otherwise, no longer a nearby Farmslot checkout's (`TSX_BIN` still wins). The CLI itself still runs from `dist/`.
15
+ - The generic React Native runtime moves to `@farmslot/adapter-rn` 0.17.0 and the shared CDP broker to `@farmslot/recipe-runner/cdp-broker`:
16
+ - the Hermes bridge libraries and the console forwarder;
17
+ - the Metro config wrapper, launcher and log helpers;
18
+ - adb/idb tool discovery, connected-device listing, the device video recorders, frame metrics, and the Metro-env and source fingerprints.
19
+
20
+ mm-harness keeps the MetaMask parts: `cdp-bridge.cjs` and its recovery hints, the platform action bridge, the fingerprint input lists, `start-metro.sh` and `wait-for-bridge`. The Mobile overlay vendors the bridge libraries next to `cdp-bridge.cjs`, so `temp/recipe/harness/mobile/bridge-runtime/` stays the same.
21
+ - `adapters/mobile/bridge-runtime/cdp-bridge.cjs` is now the MetaMask preset over `@farmslot/adapter-rn/bridge-runtime/bridge-core.cjs` (adapter-rn 0.17.0). It keeps the wallet commands (`status`, `list-accounts`, `get-selected-account`, `switch-account`, `unlock`), the navigator route table, the recovery hints, the Perps and Homepage perf markers and the wallet-ready check; every other command, target selection, the debugger-slot lock and the typed errors come from the package. Same path, commands, output and exit codes.
22
+ - The Mobile library's native UI actions no longer default to MetaMask: they read the app under test from `ANDROID_PACKAGE_ID` / `IOS_BUNDLE_ID`, and native UI observation reads the app's display name from `METAMASK_RECIPE_MOBILE_APP_LABEL`; each fails with a `Next:` hint when missing. The Mobile adapter sets all three (`io.metamask`, `io.metamask.MetaMask`, `MetaMask` unless already set) in the `run` and `call` env and for the in-process UI bridge commands, so observation output is unchanged.
23
+ - **Renamed env (no aliases):**
24
+ - `MM_HARNESS_ADB_PATH` / `MM_HARNESS_IDB_PATH` → `RECIPE_RN_ADB_PATH` / `RECIPE_RN_IDB_PATH`;
25
+ - `MM_HARNESS_EXPLICIT_PLATFORM` → `RECIPE_RN_EXPLICIT_PLATFORM`;
26
+ - `MM_HARNESS_METRO_{PROJECT_ROOT,BASE_CONFIG,ENV_FINGERPRINT,LOG_ARCHIVE_COUNT,LOG_ARCHIVE_BYTES}` → `RECIPE_RN_METRO_*`.
27
+
28
+ The first Mobile launch after upgrading restarts a Metro that an older version started, because its recorded environment names changed. Source and Metro-env fingerprints are unchanged, so recorded baselines stay valid.
29
+ - Depend on `@farmslot/recipe-cli` 0.4.1, `@farmslot/adapter-sdk` 0.3.1, `@farmslot/recipe-runner` 0.24.0 and `@farmslot/agent-runtime` 0.17.0, and drop the `es-module-lexer` dependency (live adapter bundling now lives in `@farmslot/recipe-cli`).
30
+ - `@farmslot/expo-recipe` 0.14.0 is replaced by `@farmslot/adapter-rn` 0.17.0, the same package under its new name, so the install holds one `@farmslot/recipe-runner`. The Mobile native UI provider (`createAgentDeviceUiTransport`, `NATIVE_UI_ACTIONS`) and the `mobile/wallet/native-ui`, `mobile/platform/native-session` and `mobile/ui/native-navigation` library actions import `@farmslot/adapter-rn`; a library action that imported `@farmslot/expo-recipe` through the harness install imports `@farmslot/adapter-rn` instead.
31
+ - The generic harness support moves to `@farmslot/recipe-cli/harness` and mm-harness imports it directly: the resumability journal, the checkout lock, `JsonStreamWriter`, colour helpers, contained artifact writes, Git library provenance, shell-leaf invocation and the runtime path helpers (`recipeRuntimeDir`, `recipeRuntimePath`, `recipeHarnessRoot`, `recipeHarnessPath`, `harnessExecutable`). `src/host.ts` configures it as `mm-harness`, so env names (`MM_HARNESS_OPERATION_ID`, `MM_HARNESS_CHECKOUT_LOCK_TOKEN`, `MM_HARNESS_EXECUTABLE`), messages, journaled commands and the runtime layout are unchanged.
32
+ - `launch`, `reload`, `stop`, `last` and `install`/`verify`/`cleanup` run from the generic harness in `@farmslot/recipe-cli`. The built-in platforms declare what the commands used to hardcode: checkout detection, the Mobile `ios`/`android` targets, their launch and command flags, the failure patterns bounded healing classifies, and Mobile's `METRO_PORT` dev-server port name. mm-harness keeps its help text, the Runway install variant and the analytics collector stop as command options. Flags, messages, envelopes and exit codes are unchanged.
33
+ - Run evidence moves to `@farmslot/recipe-cli/harness` and mm-harness imports it directly: execution provenance, the framed recorder and its snapshots, the run report and product provenance, run diagnostics, live adapter scripts, run options, the behavioral proof checks, recipe trust input and failure envelopes, and the `Did you mean` suggestion. `src/host.ts` sets `recipeEnvPrefix: 'METAMASK_RECIPE'`, so the live adapter env names (`METAMASK_RECIPE_ADAPTER_INPUT`, `_OUTPUT`, `_LIVE_ADAPTER_DIR`, `_ACTION_SOURCE_MAP`), the `mm-harness-live-adapter-` and `.mm-harness-recording-` temp prefixes, messages, and `diagnostics.json`, `execution-provenance.json`, `product-provenance.json` and `report.md` are unchanged.
34
+ - The platform `run` member is the SDK's `AdapterRun`. The Extension declares `--launch-existing-dist` through `run.platformOptions`, sets `METAMASK_RECIPE_EXTENSION_AUTOLAUNCH` in its `run.activateEnv` (so only Extension runs set it now), reports the browser it drove through `run.browserProvenance`, and names `METAMASK_RECIPE_EXTENSION_ACTIVE_RECORDING_PID` as `recording.framed.activePidEnv`. Terminal reads its wallet request findings through `diagnostics.requestLog`; the console collector ownership check moves into the Extension and Terminal `verifyControl`. Mobile declares `--metro-port` as `devServer.portFlags`.
35
+ - Run diagnostics classify console lines through `src/console-classifier.ts`, which wraps `library/actions/shared/console-findings.mjs` (unchanged, still loadable by path).
36
+ - The Extension browser launch and slot titles moved to `@farmslot/adapter-web` 0.2.0 (`launch-browser`, `slot-title`). `adapters/extension/launch-browser.cjs` keeps its flags and now only passes MetaMask's part to the package: the build-handoff lock, `home.html` and its `MetaMask` title, the harness runtime paths that prove a browser is ours, and the `mm-harness launch` rerun hint. `adapters/extension/lib/slot-title.cjs` is gone; readiness, reattach, reopen, `ensure-ready` and `stamp-runtime-title` use the package, and the overlay no longer installs `scripts/lib/slot-title.cjs`. Behaviour is unchanged.
37
+
38
+ ### Removed
39
+
40
+ - **BREAKING:** the package entry no longer exports `recipeHarnessPath`; import it from `@farmslot/recipe-cli/harness`. `library/actions/harness-exports.mjs` no longer bridges `recipeHarnessPath` or `recipeRuntimeDir` either; library actions import both from `@farmslot/recipe-cli/harness`.
41
+ - **BREAKING:** the package entry no longer exports `validateRuntimeProof`; import it from `@farmslot/recipe-cli/harness`. A script that resolves it through a locked harness install can use `createRequire(require.resolve('@deeeed/metamask-harness')).resolve('@farmslot/recipe-cli/harness')`.
42
+ - **BREAKING:** the package entry no longer exports `captureActiveRecipeRecordingSnapshot`; import it from `@farmslot/recipe-cli/harness`. `library/actions/harness-exports.mjs` no longer bridges it either.
43
+
44
+ ### Fixed
45
+
46
+ - Core `metamask.perps.*` actions run again on current MetaMask/core, which no longer ships tsx (#10564): they failed with `CORE_DEPS_INCOMPLETE` even with `TSX_BIN` set. The `run`/`call` gate, `doctor` and execution resolve tsx the same way, and once dependencies are installed `doctor` (and `verify`) fail with the gate's reason when controller actions cannot run, instead of reporting ready; a checkout with no dependencies is reported not ready, as before. A source checkout's `bin/mm-harness` no longer overwrites the caller's `TSX_BIN`.
47
+ - Core Perps actions select any wallet fixture account: `dev2`–`dev7` (derived from the `dev1` mnemonic, as `list_accounts` shows them) by name, or a fixture account by its address, for reads and writes. An unknown name is refused, and a `0x` address is no longer replaced by `dev1` when a fixture is present: one outside the fixture is read as given and refused for signing.
48
+ - Local co-development links only the Farmslot packages the checkout has (`packages/<name>/package.json`). A package it lacks, such as one Farmslot has since renamed, keeps its installed, pinned copy, so `runner-deps-ready` passes again on a current Farmslot checkout.
49
+ - Extension `run --slot` works again next to a Farmslot checkout of any version (since 0.78.0 it exited 1, "Extension slot lookup requires a local host checkout", when the checkout predated `packages/recipe-runner`). The slot lookup finds the farm's pool by its pool files alone (`pool/*.json` with `slots`), with the same search as before: the configured root, else the nearest Farmslot checkout above the runner, then above the working directory. `@farmslot/*` code always comes from the harness's installed dependencies; a local Farmslot checkout supplies it only when `METAMASK_RUNNER_PROTOCOL_ROOT`, `.farmslot-root` (or, for `bin/mm-harness`'s tsx fallback, `FARMSLOT_ROOT`) names it, never because it sits nearby.
50
+ - Wallet fixture sync no longer replaces an explicit `FARMSLOT_ROOT` with `~/dev/farmslot`.
51
+
5
52
  ## 0.79.0 - 2026-10-05
6
53
 
7
54
  ### Changed
package/README.md CHANGED
@@ -459,4 +459,4 @@ TASK.md holds the request; CHECKLIST.md is the sole step list. The frozen termin
459
459
 
460
460
  ### Portable runtime proof
461
461
 
462
- `validateRuntimeProof(bundle, smokeTarget)` validates a retained Recipe v1 artifact package, requiring executed behavioral assertions for its declared targets. A passing command or end node alone is insufficient. QA skills use this exported function through their locked harness installation; no gateway, farm profile or run ID is required.
462
+ `validateRuntimeProof(bundle, smokeTarget)` from `@farmslot/recipe-cli/harness` validates a retained Recipe v1 artifact package, requiring executed behavioral assertions for its declared targets. A passing command or end node alone is insufficient. QA skills import it from the `@farmslot/recipe-cli` their locked harness installation depends on; no gateway, farm profile or run ID is required.
@@ -517,9 +517,9 @@ const releaseFocusHold = () => {
517
517
  await page.goto(homeUrl, { waitUntil: 'load', timeout: 15000 });
518
518
 
519
519
  // Set window title to slot ID (persists across SPA navigations)
520
- const { applyPersistentSlotTitle } = require(path.join('${SCRIPT_DIR}', 'lib/slot-title.cjs'));
520
+ const { applyPersistentSlotTitle } = adapterWeb('slot-title');
521
521
  const { evaluatePageViaCdp } = adapterWeb('playwright-cdp');
522
- await evaluatePageViaCdp(page, applyPersistentSlotTitle, SLOT_ID);
522
+ await evaluatePageViaCdp(page, applyPersistentSlotTitle, { slotId: SLOT_ID, defaultTitle: 'MetaMask' });
523
523
 
524
524
  // Wait for runtime state to settle, then unlock if needed.
525
525
  const unlockSelector = '[data-testid=\"unlock-password\"]';
@@ -128,7 +128,6 @@ copyFile(path.join(runnerDir, 'adapters/shared/tmux-session.sh'), path.join(harn
128
128
  copyFile(path.join(runnerDir, 'adapters/shared/tmux-viewer.sh'), path.join(harnessDir, 'scripts/lib/tmux-viewer.sh'));
129
129
  copyFile(path.join(runnerDir, 'adapters/shared/log-tui.mjs'), path.join(harnessDir, 'scripts/lib/log-tui.mjs'));
130
130
  copyAdapterWeb(path.join(harnessDir, 'scripts/node_modules/@farmslot/adapter-web'));
131
- copyFile(path.join(runnerDir, 'adapters/extension/lib/slot-title.cjs'), path.join(harnessDir, 'scripts/lib/slot-title.cjs'));
132
131
  copyFile(path.join(runnerDir, 'adapters/extension/lib/product-config.cjs'), path.join(harnessDir, 'scripts/lib/product-config.cjs'));
133
132
  makeExecutableTree(path.join(harnessDir, 'scripts'));
134
133
  fs.writeFileSync(path.join(harnessDir, 'installed-scripts.sha256'), `${dirContentHash(path.join(harnessDir, 'scripts'))}\n`);