assay-workflow 0.2.1

Durable workflow engine with REST+SSE API on PostgreSQL 18 and SQLite backends. Embeddable library or standalone server (via assay-engine).
Documentation
# Dashboard end-to-end tests

Headless browser tests covering the assay-workflow dashboard's behaviour
against a real running engine + worker. Live in this directory so anyone
touching the dashboard JS / CSS or the state-snapshot HTTP surface can
add coverage in the same PR.

## Run locally

From `crates/assay-workflow/tests-e2e/`:

```sh
npm install                                  # one-time
npx playwright install --with-deps chromium  # one-time

# In a separate shell — start the engine + demo worker fixtures:
../../../scripts/run-e2e-fixtures.sh         # see helper below

npx playwright test                          # run all specs
npx playwright test --headed                 # watch the browser
npx playwright show-report                   # inspect a failed run
```

The fixtures script is what CI uses too — it boots `assay serve` on
SQLite, registers the `demo` namespace, starts the demo worker that
emits the canonical `pipeline_state.steps[]` shape, and starts a
`DemoPipeline` workflow named `demo-2`. Tests then drive the dashboard.

## What's covered

- Pipeline tab is added when `pipeline_state.steps[]` is present and
  default-selected.
- Five circles render with the correct initial states; the Approval
  step exposes `approve` / `reject` action buttons.
- Clicking an action button POSTs the `step_action` signal, the
  workflow advances, and the dashboard's 1 Hz poller diff-applies the
  new circle / connector / log state.
- Clicking a step circle filters the log to that step's entries.

## Adding new tests

Each new spec lives next to `pipeline.spec.ts`. Reuse the helpers if you
need to switch namespaces or open the demo workflow row. Avoid creating
new long-running workflows in tests — the demo worker already exposes
every status (waiting / running / done / cancelled) so a focused
assertion against it is usually enough.