The 2026-07-23 accessibility audit pass fixed the toggle-switch, icon-button, focus-indicator, and lightbox-dialog gaps, plus ~20 unlabeled controls on the highest-traffic pages. What remains is the long tail of standalone <select>/<input>/<textarea> that sit in toolbars and inline rows rather than inside a labeling wrapper (client/src/components/ui/FormField.jsx, or a local Field that wraps children in a <label>).
Sweep the remaining unlabeled controls
The scan that produced this backlog: for every git-tracked client/src/**/*.jsx, parse each <input|select|textarea> opening tag (brace-aware); skip tags carrying aria-label/aria-labelledby/type="hidden", tags whose id is targeted by an htmlFor in the same file, and tags whose preceding ~14 lines contain <FormField/<label/<Field/label=/sr-only. That yields ~400 hits, but the true-positive rate is roughly half — the rest are <img>/<select> mentions inside comments and wrappers the lookback window missed. Verify each candidate by reading its context before labeling it; do not mass-apply.
Highest value first (still confirmed present, e.g. client/src/pages/Instances.jsx has 10 <input|select|textarea> tags against 13 aria-label occurrences — some are already fixed, so re-verify per-tag rather than assuming the raw count is the gap):
client/src/pages/Instances.jsx
client/src/pages/PipelineSeries.jsx
client/src/pages/VideoTimelineEditor.jsx
client/src/pages/CatalogIngredient.jsx
client/src/pages/CharacterSheet.jsx
client/src/pages/GitHub.jsx
client/src/pages/Sharing.jsx
client/src/pages/MoodBoardDetail.jsx
client/src/pages/OpenClaw.jsx
client/src/pages/LoraDatasetDetail.jsx
client/src/pages/Browser.jsx
Prefer wrapping in FormField (visible label + htmlFor/id pairing) over an aria-label when the surface has room for a visible label.
Sequencing note: this sweep should land before enabling Biome's a11y rule group (see the companion issue), since enabling those rules against the current backlog would fail CI immediately.
Migrated from PLAN.md by /do:replan --issues.
The 2026-07-23 accessibility audit pass fixed the toggle-switch, icon-button, focus-indicator, and lightbox-dialog gaps, plus ~20 unlabeled controls on the highest-traffic pages. What remains is the long tail of standalone
<select>/<input>/<textarea>that sit in toolbars and inline rows rather than inside a labeling wrapper (client/src/components/ui/FormField.jsx, or a localFieldthat wraps children in a<label>).Sweep the remaining unlabeled controls
The scan that produced this backlog: for every git-tracked
client/src/**/*.jsx, parse each<input|select|textarea>opening tag (brace-aware); skip tags carryingaria-label/aria-labelledby/type="hidden", tags whoseidis targeted by anhtmlForin the same file, and tags whose preceding ~14 lines contain<FormField/<label/<Field/label=/sr-only. That yields ~400 hits, but the true-positive rate is roughly half — the rest are<img>/<select>mentions inside comments and wrappers the lookback window missed. Verify each candidate by reading its context before labeling it; do not mass-apply.Highest value first (still confirmed present, e.g.
client/src/pages/Instances.jsxhas 10<input|select|textarea>tags against 13aria-labeloccurrences — some are already fixed, so re-verify per-tag rather than assuming the raw count is the gap):client/src/pages/Instances.jsxclient/src/pages/PipelineSeries.jsxclient/src/pages/VideoTimelineEditor.jsxclient/src/pages/CatalogIngredient.jsxclient/src/pages/CharacterSheet.jsxclient/src/pages/GitHub.jsxclient/src/pages/Sharing.jsxclient/src/pages/MoodBoardDetail.jsxclient/src/pages/OpenClaw.jsxclient/src/pages/LoraDatasetDetail.jsxclient/src/pages/Browser.jsxPrefer wrapping in
FormField(visible label +htmlFor/idpairing) over anaria-labelwhen the surface has room for a visible label.Sequencing note: this sweep should land before enabling Biome's
a11yrule group (see the companion issue), since enabling those rules against the current backlog would fail CI immediately.Migrated from PLAN.md by /do:replan --issues.