# Recipe library

- An **action** performs one typed operation.
- A **recipe** is a parameterized, composable graph that may call actions and
  other recipes.

- `actions/<adapter>/<group>/<name>.mjs` — executable action modules.
  **Importing an action module RUNS it**: each ends with `runAdapter(main)` at top
  level, which reads the live-adapter input path from the environment and executes.
  That is the engine contract (the recipe engine spawns/imports them with the
  input env set) — a bare `import` outside the engine throws
  "Missing live adapter input path", which is expected, not a bug.
- Actions load harness helpers ONLY through `actions/harness-exports.mjs` (the
  dist-preferring bridge) — never deep-import `src/` (published installs have no
  src/, and the entrypoint would close an import cycle through adapters.ts).
- `recipes/` — runnable recipes (`mm-harness run <name-or-file>`).
- Recipe resolution is explicit library order, then bundled MetaMask; selected
  variants and shadows are recorded in run evidence.
