# Changelog

## 1.3.0

### Added

- Deterministic directory suites through `--contracts DIR --out-dir DIR`. Suites
  discover only first-level regular `*.json` files in lexical filename order, run
  every valid contract independently, retain per-contract schema-v1 evidence, and
  print a complete verdict summary.
- Whole-suite static preflight before browser launch, including duplicate contract
  IDs, target policy, output mapping, and stale-result safety. `--validate-only`
  validates the complete suite without creating its output directory.
- Explicit suite exit reduction: error (3), then inconclusive (2), then fail (1),
  otherwise all pass (0). Existing single-contract exit behavior is unchanged.
- More legible deterministic terminal diagnostics with phase status, probe selector,
  and one mismatch per line without changing result schema v1.
- `CUSTOM_APP_CONTRACTS.md`, an application-author guide based on real SeatMap,
  Canvas, ScrollSpy, and Tooltip dogfood patterns.

Contract and result schema versions remain 1. Existing single-contract CLI fields,
result fields, verdicts, and exit codes are unchanged.

## 1.2.0

### Added

- Activation actions `{"type":"hover","selector":"..."}` and
  `{"type":"scroll","selector":"..."}`. They use Playwright hit testing and
  Playwright's deterministic `scrollIntoViewIfNeeded`.
- Patch triggers may use a real click or a restricted
  `{"type":"press","selector":"...","key":"Enter"}` action. Keys are limited
  to `Enter` and `Space`, allowing a patch while the pointer remains over a
  hover-owned interaction without synthetic DOM clicks.
- Attribute expectations with a required selector and attribute, and exact
  `before`/`after` `value` assertions. Values are strings or `null`, where `null`
  asserts attribute absence.
- Optional `selector` on `node_identity`, retaining and comparing that target's
  exact pre-patch DOM object; omission continues to target the subject.
- Optional unique selectors on `popover` and `dialog` probes, while preserving
  subject-local patch proof. Probe selectors are not restricted to descendants.
- Deterministic polling of declared activation and post-patch expected state within
  the existing timeout, plus action-target convergence after navigation, without
  sleeps in the public vocabulary.

Contract and result schema versions remain 1. Existing fields, verdicts, and exit
codes are unchanged.

## 1.1.0

### Added

- `mix live_interaction_contracts.check` for running strict v1 interaction
  contracts against an already-started LiveView application in a real browser.
- Portable `node_identity`, `popover`, `dialog`, and `focus` probes with explicit
  subject-local patch acknowledgment.
- Atomic JSON evidence with distinct `pass`, `fail`, `inconclusive`, and `error`
  verdicts and stable exit codes 0–3.
- Consumer runner integration tests, isolated Hex package smoke coverage, and CI
  dogfood for coherent and intentionally torn interactions.
- A versioned product blueprint for the AI generation-to-evidence workflow.

### Changed

- Updated the stable evidence target to Phoenix LiveView 1.2.7, Phoenix 1.8.9,
  and Plug 1.20.3.
- Bound generated delegation ledgers to the evidence produced by the same harness
  run and added a durable LiveView 1.2.7 three-browser baseline.
- Preserved caller toolchain paths when the conformance task launches its shell,
  allowing mise/asdf-managed Elixir installations to run the fixture.

### Security

- Consumer contract runs reject cross-origin navigation and unexpected pages.
- Output/contract path collisions are rejected, and stale evidence is removed or
  atomically replaced so an old pass cannot hide a new failure.

No existing 1.x Mix task, component API, or dependency requirement is removed.
