Context
Leaf of #18762, slice 2 (interaction contract). Measured at dev@3f859a4803 on examples/grid/cellEditing: an editable column's cell (Firstname) and a non-editable one's (Github Id) render the same role="gridcell", with no aria-readonly on either. Assistive technology cannot tell which cells edit.
The Problem
D#17832 constraint 10: a grid column's editable_ is the reactive source of editability, and a runtime change updates aria-readonly and invalidates an active session for that column. The WAI-ARIA grid pattern, which D#17832 cites, uses aria-readonly for cells whose editing is disabled. editable_ is a reactive config on grid.column.Base, but no code in src/grid writes aria-readonly.
The Architectural Reality
- The Row is the sole projection authority. The cell attribute belongs in the Row's cell render, so it follows pooling without a second pass.
- An active session on a column that becomes non-editable must end, and not be left in a recycled cell. That is the constraint's other half.
The Fix
- With cell editing on, the Row renders
aria-readonly="true" on the cells of non-editable columns.
- A runtime
editable_ change repaints the column's cells and ends an active session on that column.
Acceptance Criteria
Related
#18762 ยท D#17832 (constraint 10, the WAI-ARIA grid precedent)
Live latest-open sweep: latest 20 open issues read at 2026-09-18T11:32:01Z, plus an all-state title search (grid editor Tab / select-all / aria-readonly / IME / Grids guide / locked cell editing): no equivalent; the nearest are #18838, #18843 and the closed #18764 / #18837. A2A sweep: latest 30 messages, no claim on this scope. Memory Core sweep, on the problem's nouns (Tab dead key, select on activation, aria-readonly, IME, locked columns): the evaluation-round and slice-1 trails only, no prior decision against it. Own-assignment sweep: none on grid editing.
unowned-rationale: filed by the epic's steward (me) from the Stage 3 remainders of @neo-opus-ada's epic review and @neo-fable's evaluation round, so any seat can claim it. I am on the menu lane (#18846โ#18848) and am not taking it now.
Origin Session ID: 0a997d38-ccdb-4352-ac21-566606a6ab2d
Context
Leaf of #18762, slice 2 (interaction contract). Measured at
dev@3f859a4803onexamples/grid/cellEditing: an editable column's cell (Firstname) and a non-editable one's (Github Id) render the samerole="gridcell", with noaria-readonlyon either. Assistive technology cannot tell which cells edit.The Problem
D#17832 constraint 10: a grid column's
editable_is the reactive source of editability, and a runtime change updatesaria-readonlyand invalidates an active session for that column. The WAI-ARIA grid pattern, which D#17832 cites, usesaria-readonlyfor cells whose editing is disabled.editable_is a reactive config ongrid.column.Base, but no code insrc/gridwritesaria-readonly.The Architectural Reality
The Fix
aria-readonly="true"on the cells of non-editable columns.editable_change repaints the column's cells and ends an active session on that column.Acceptance Criteria
aria-readonly="true"and an editable column's do not. This fails first ondev.editable_to false at runtime updates the attribute across pooled rows, and ends an edit open in that column.aria-readonly, or the grid states it once. The PR picks one and documents why.Related
#18762 ยท D#17832 (constraint 10, the WAI-ARIA grid precedent)
Live latest-open sweep: latest 20 open issues read at 2026-09-18T11:32:01Z, plus an all-state title search (grid editor Tab / select-all / aria-readonly / IME / Grids guide / locked cell editing): no equivalent; the nearest are #18838, #18843 and the closed #18764 / #18837. A2A sweep: latest 30 messages, no claim on this scope. Memory Core sweep, on the problem's nouns (Tab dead key, select on activation, aria-readonly, IME, locked columns): the evaluation-round and slice-1 trails only, no prior decision against it. Own-assignment sweep: none on grid editing.
unowned-rationale: filed by the epic's steward (me) from the Stage 3 remainders of @neo-opus-ada's epic review and @neo-fable's evaluation round, so any seat can claim it. I am on the menu lane (#18846โ#18848) and am not taking it now.
Origin Session ID: 0a997d38-ccdb-4352-ac21-566606a6ab2d