# RED_FIXTURES — dialog & details (v1)

`<dialog>` (modal) and `<details>`/`<summary>` are **red**: their delegation fails
under ordinary LiveView patching. They are kept as **executable conformance
fixtures**, not helpers, and are **excluded from the v1 public API**.

## Why they are red

Both reflect their open state into a **server-reconciled `open` attribute**. The
server template does not render `open` (the server does not own openness), so
reconciliation **strips it on every non-destructive patch**, closing the element. The
DOM node survives (verified by JS expando) — this is **not** node replacement; it is
attribute reconciliation. A `phx-update="ignore"` twin stays open, isolating the cause.

Dialog additionally closes **unobservably**: the strip fires no `close` event, so a
server observing dialog lifecycle never learns it closed (see
`../archive/observation-spike/OBSERVATION_SPIKE_REPORT.md`). And the stripped dialog is left inconsistent
(`open === false` while `:modal` still matches).

Details is the **second independent instance** of the same failure — evidence that the
failure is not dialog-specific but general to any machine with attribute-reflected
state. It is why the cross-cutting invariant (`SPEC.md`) is stated generally.

## Status

- **Raw `<dialog>` and `<details>` stay red conformance fixtures.** CI asserts they
  **stay red** (an expected failure); a red fixture turning green is itself a recorded
  behavior change.
- **`<dialog>` now has an amber adapter path.** `JS.ignore_attributes(["open"])` +
  `showModal` + close relay repairs the failure and passes a 7/7 conformance suite —
  see `CONTRACT_DIALOG.md`. Raw `<dialog>` remains red; the *adapter* is amber (patch-
  safe by an explicit rule, not by nature). No polished public component API ships yet.
- **`<details>` remains red with no adapter yet.** It has no `showModal`/`close`/modal
  semantics, so the dialog adapter does **not** extrapolate to it — a separate spike is
  required (`BACKLOG.md`).

## Graduation criteria

A red fixture graduates only when the harness shows, across supported versions, that
its open state survives ordinary patches — either because LiveView stops stripping
reflected attributes, or a documented protection mechanism is applied and tested. Until
then it stays red.

*Evidence: `reports/CONFORMANCE_REPORT.md` (dialog/details rows + ignore probe),
`../archive/observation-spike/OBSERVATION_SPIKE_REPORT.md`.*
