# Changelog

All notable changes to `@farmslot/recipe-harness` are tracked here.

## Unreleased

## 0.15.1 - 2026-08-28

- Classify unresolved relative or absolute bundle imports as source errors instead of missing package dependencies, while retaining missing-package precedence for mixed failures.

## 0.15.0 - 2026-08-14

- Align the packaged Recipe Protocol dependency with 0.21.0 so consumers use one execution-capability and evidence contract runtime.

## 0.14.0 - 2026-08-03

- feat(visual-review): start navigation maps at the top level with independently collapsible branches and expand/collapse-all controls.
- feat(visual-review): label multi-platform captures as variants of one surface and expose an explicit Compare mode.
- feat(visual-review): provide a lightweight project-agnostic review-board builder, recipe-artifact converter, and dynamic-port server with self-contained route/capture feedback plus color-coded, movable point and drag-area annotations.
- feat(visual-review): default multi-platform boards to the platform from the latest build, remember the operator's iOS/Android selection across pages, and keep an explicit All comparison mode.
- feat(recipe): standardize `ui.capture_surface` and implement full-page CDP evidence capture.

## 0.13.0 - 2026-08-02

- **BREAKING:** Add canonical `recipes/<adapter>/<domain>/*.recipe.json`
  discovery and reserve top-level adapter directory names. Stable ids and
  temporary legacy suffixes remain supported; resolution errors are actionable
  and deterministic across `run` and `validate`.

## 0.12.1 - 2026-08-02

- Resolve CDP navigation URLs outside the page realm so LavaMoat-scuttled Extension pages can use shared navigation actions.

## 0.12.0 - 2026-08-02

- **BREAKING:** Replace `ui.gesture` with streamed swipe, pan, drag, and long-press transports; use `hold_ms`; reject unsupported active-adapter parameters after template resolution; and retain coordinate phases through explicit transport-result envelopes.

## 0.11.1 - 2026-08-01

- fix: keep iOS Simulator lifecycle restarts idempotent when `simctl` reports that it found nothing to terminate.

## 0.11.0 - 2026-08-01

- **BREAKING:** Run summaries now include structured totals and all four failure-cause counts required by the matching `@farmslot/protocol`; publish the protocol first and update harness consumers as one coordinated release.
- feat: preserve structured failure ownership in run evidence and finalize frozen suite scopes from completed recipe results or explicit non-execution records.

## 0.10.6 - 2026-07-31

- fix: scroll hardened browser pages through the document root without accessing scuttled window globals.

## 0.10.5 - 2026-07-31

- fix: retry DOM-settlement and compositor probes when navigation invalidates their frame or execution context, report transient or superseded probe races as suspended results or warnings instead of throws or false success, and preserve the public isolated-world evaluator across navigation.

## 0.10.4 - 2026-07-31

- fix: evaluate CDP DOM-settlement probes in a navigation-resilient isolated world so LavaMoat scuttling cannot break post-interaction readiness checks.

## 0.10.3 - 2026-07-30

- fix: publish the protocol workspace dependency as its concrete npm version for external consumers.

## 0.10.2 - 2026-07-30

- fix: avoid scuttled browser globals when matching visible text and producing observation selectors in hardened Extension pages.
- fix: expose npm-semver dependency version checks for host runtime-readiness bootstraps.

## 0.10.1 - 2026-07-30

- fix: capture-helper doctor failures report `capture_helper_exec_failed` (spawn/PATH/env) instead of claiming the tool is missing when only execution failed.
- fix: retry the compositor probe in a CDP isolated world when a hardened page blocks injected `requestAnimationFrame` access.

## 0.10.0 - 2026-07-24

- **BREAKING:** Read action support from the keyed manifest allowlist and derive recipe-library identity from configuration or path, removing redundant per-library metadata.
- Record the canonical action-manifest schema in run summaries.
- Bind passive observers to trust plans and emit the package version in CLI and run metadata.

## 0.9.4 - 2026-07-24

- Bound CDP HTTP discovery and abort stalled responses within the caller deadline.

## 0.9.3 - 2026-07-24

- Bound CDP WebSocket connection setup with an optional timeout that terminates stalled client handshakes.

## 0.9.2 - 2026-07-24

- Detect reachable-but-suspended browser pages with a read-only compositor probe.
- Treat the active Yarn linker marker as dependency-install authority and ignore uncertified legacy baselines.

## 0.9.1 - 2026-07-23

- Preserve the current Mobile route when foregrounding an app instead of reopening its launch URL.
- Accept finite numeric values in `ui.set_input` by converting them to decimal text.

## 0.9.0 - 2026-07-22

- **BREAKING:** Unify direct and nested execution on parameterized recipes, one ordered recipe index, and one recursive executor; remove the separate reusable graph CLI/runtime.
- Emit `recipe-resolution.json` plus exact digest-keyed reachable recipes and expose recipe list/describe discovery.
- Preflight nested parameters, depth, trust, and dependency paths before side effects; resolution failures include stable recovery guidance.
- Validate composed artifact packages from their retained dependency graph without requiring the source library.
- Discover an adjacent `recipe-library/` for task-authored recipes.

## 0.8.0 - 2026-07-19

- Added provenance-aware preflight/execution planning that blocks restricted capabilities from unknown or untrusted sources before side effects; approvals bind to the exact resolved plan digest
- Included automatic HUD execution in the approved plan
- Bound approvals to the project root, artifact destination, and effective run environment
- Fixed source-swap and symlink boundary bypasses across custom implementations, project reads, flow catalogs, and artifact/video writes
- Fixed managed-run approval recovery instructions and caller-selected library trust defaults
- Added an explicit-environment mode so host wrappers can exclude internal control variables from recipe execution and approval identity

## 0.7.0 - 2026-07-19

- Added `flows describe <ref>` with resolved provenance, parameter schema/defaults, the complete flow definition, and an authored call node or clearly labeled template in human and stable JSON output.

## 0.6.0 - 2026-07-13

- fix: require Yarn's `node_modules/.yarn-state.yml` install surface when `nodeLinker: node-modules`, so a leftover `.yarn/install-state.gz` cannot report removed dependencies as current

## 0.5.0 - 2026-07-12

- feat: record passive UI observations for default and node-level observe policies in recipe traces, including replayable controls inside open shadow roots without exposing input values as labels.
- fix: dependency readiness trusts install markers newer than dependency inputs even when an older recorded baseline exists, preventing unnecessary reinstall prompts in managed slots.
- fix: use workspace-linked `@farmslot/protocol` during local development so package builds cannot resolve a stale published sibling package.

## 0.4.3 - 2026-07-09

- fix: dependency readiness no longer treats an old recorded baseline as stale when install markers are newer than `package.json`/`yarn.lock`, avoiding repeated unnecessary reinstall prompts in managed slots

## 0.4.2 - 2026-07-09

- feat: a run that composes flows now emits `resolved-recipe.json` — the authored recipe with every reachable flow (inline, `uses`, or library, transitively) inlined under `flows`. This artifact is self-contained and validates as a complete recipe without the library
- feat: export `composeRecipe` / `buildResolvedRecipe` — the shared composition step used by the runner (executed path) and the CLI static resolve-check to derive the same `resolved-recipe.json`

## 0.4.1 - 2026-07-08

- `watch_logs` now defaults to run-scoped matching using file offsets captured at recipe start across the main workflow and called flows, so markers written before the run cannot satisfy log assertions. Use `scope: "file"` to explicitly scan the whole file

## 0.4.0 - 2026-07-07

- Add a standard outer `app.lifecycle` adapter for Android and iOS simulator launch/foreground/terminate/restart lifecycle control, with Android background support for performance recipes. Exported as `@farmslot/recipe-harness/adapters/app-lifecycle`.

## 0.3.3 - 2026-07-03

- `resolved-flows.json` is emitted whenever a run had any library resolution activity (used, overridden, or shadowed flows) — previously a run that overrode every library flow with recipe-local declarations produced no artifact even though `summary.json` recorded the overrides
- `flows promote` fails loudly, naming every offending catalog file, when the target library already declares the ref in more than one catalog (pre-existing corruption); `--force` no longer overwrites just one of the duplicates and leaves the library unloadable
- Multi-source recipe library resolution: `call` refs can resolve from ordered, named library sources (`--library name=path`, `RECIPE_LIBRARY_PATH`, or the personal library at `<farmslot home>/recipe-library`). First source wins; recipe-local flows always win. Nothing resolves silently for any consumer: cross-source shadowing and recipe-local overrides are recorded in `summary.json` `flowResolution` (`shadowed`, `overrides`) and in the `resolved-flows.json` artifact alongside the used definitions, in addition to logging
- `farmslot-recipe flows list` — list library flows with source, description, required params, and last-verified date across configured sources; exits non-zero when no source is configured
- `farmslot-recipe validate --library` — validate accepts library-resolved `call` refs with the same source resolution as run
- `farmslot-recipe flows promote` — promote an inline flow from a per-change recipe into a recipe library (default: the personal library, created on first promote). Enforces the catalog contract (description required, postcondition required for `ensure_*`), stamps `provenance.promotedFrom`/`promotedAt`, and stamps `lastVerified` only from a passing run's artifacts (`--run <dir>`)

## 0.3.2 - 2026-06-30

- Document `orchestrateRuntimeUp` `build` decision as terminal — hosts must call again after native build finishes.
- Use the installed `capture-helper` package for capture runs.

## 0.3.1 - 2026-06-26

- Add `runtime/orchestrate-up` — generic install → relaunch decision loop (`orchestrateRuntimeUp`) for product runners to wrap with shell/platform actions.

## 0.3.0 - 2026-06-26

- Add shared runtime-readiness helpers under `@farmslot/recipe-harness/runtime/*`:
  - `deps-readiness` — install fingerprint, baseline recording, product-marker partial checks, decision state persistence
  - `log-analysis` — Metro/RN bundle log boundaries, unresolved-module scoping, persistent bundle-error detection
  - `metro-probe` — packager `/status` reachability probe
  - `decision-types` — portable `RuntimeDecisionReport` / `RuntimeDecisionAction` shapes
- Product runners (e.g. MetaMask) should import these modules instead of copying readiness logic locally.

## 0.2.2 - 2026-06-10

- Publish with npm-resolvable `@farmslot/protocol` dependency metadata instead of workspace-only protocol references.

## 0.2.1 - 2026-06-10

- Drive CDP text inputs with trusted keyboard insertion instead of direct DOM value assignment so React-controlled inputs receive real input/change handling.
- Drive CDP clicks with real mouse events and expose `ui.key_press` through the standard UI adapter.

## 0.2.0 - 2026-06-02

- Define the v0 public harness package surface with explicit core, adapter, node, CLI, and runtime entry points.
- Publish recipe runner runtime helpers under explicit `runtime/*` subpaths for browser extension, CDP, and React Native bridge clients.
- Keep CLI and writer implementation details behind explicit subpath exports instead of wildcard package exports.

## 0.1.0 - 2026-05-31

- Initial public active-development release.
