Packages

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

Current section

Files

Jump to

BACKLOG.md

# BACKLOG (v1)
Deferred work and open (amber/unknown) items. Nothing here blocks the v1 kernel
freeze; each is an item the harness or a later spike must close.
## Amber / unknown machines (must stay visible in the ledger)
- **IME composition** — only synthetic `CompositionEvent`s tested. Real cross-engine
CJK IME behavior over live-patched listboxes is unverified. **Non-optional for the
Taiwan / CJK market.** Needs real-device / real-IME testing infrastructure the
automation harness cannot provide. The Channel contract's "no emit during
composition" rule is frozen; its real-device *conformance* is open.
- **Native select popup** — the selected value is green; the open state of the native
option popup is not observable via automation → unknown. Do not over-claim.
## Delegation gaps
- **Popover positioning**~~CSS anchor positioning interop across engines is
untested.~~ **Shipped**: spiked green on all three engines
(reports/POSITIONING_SPIKE_REPORT.md), then productized as the `placement`
attr on popover/menu/tooltip ("bottom"/"top" — the proven variants only), fused
per-component in the reference suites. **Degradation stance (decided)**: engines
without CSS Anchor Positioning get an *unanchored but fully functional* popover
(openness is independent of positioning); there is deliberately **no JS
fallback** — reintroducing a positioning engine would surrender the
architecture's central claim. The floor is documented in the component docs and
the docs page. Left/right presets: add only when a consumer needs them (same
primitives, new conformance rows required).
## Harness / CI
- **Historical & edge version sweep** — extend the LiveView matrix beyond the two
versions currently swept; add more historical releases as needed (Tier-2 fuse is
in v1; the breadth of the version matrix can grow).
- **Documentation audit against official LiveView semantics** — v1 freeze audit
completed on 2026-07-07 against LiveView 1.2.x HexDocs: `phx-update` default
remains documented as `replace`; colocated hooks still require dot names, compile
extraction, and `phoenix-colocated/...` import; `JS.ignore_attributes` remains a
patch-skip utility. Re-check these per release.
## Accessibility
- **Screen-reader testing** — verify `aria-activedescendant` behavior with real screen
readers (NVDA/VoiceOver/Orca) where feasible; the harness checks that ARIA targets
live nodes, not that assistive tech announces correctly.
## Reference components — next in the queue (follow BUILDING_COMPONENTS.md)
- **done:** popover (green, 7/7), menu (green + cursor, 8/8), tooltip (green, pure
delegation, 8/8), select (green — the provisional "amber: value is form state"
dissolved by making selection server-owned; 9/9), combobox (green with the shipped
server-side monotonic guard; 9/9).
## Design work (not v1)
- **Tabs / Accordion / Disclosure — ownership must be decided before building.** Do
not copy React Aria / Radix anatomies: those live in a single-runtime JS world.
These machines sit exactly on the dangerous boundary (server-rendered active state,
client-mutated ARIA, focus loss after patch). Each needs its own ownership decision
(who owns "active"?) and a spike BEFORE a component — the playbook's Step 1 does
not apply until that is settled.
- **`<details>` adapter spike** — attempt an `ignore_attributes("open")`-style adapter
for `<details>` (no `showModal`/modal semantics; different shape). Do not extrapolate
from the dialog adapter (`CONTRACT_DIALOG.md`).
- A polished public `<.dialog>` component as a thin derivation of `CONTRACT_DIALOG.md`.
- Whether a thin popover helper is worth shipping over the raw contract.