Packages

A real-browser external-app verifier for patch-safe Phoenix LiveView interactions, with secondary unstyled reference components.

Current section

Files

Jump to
Raw

RED_FIXTURES.md

# 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`.*