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