Parent: #991
Summary
Major list actions are attached to tap gestures instead of semantic controls, model-exposure toggles have an empty hidden label, model fetch status is cleared by the reload it triggers, and custom provider deletion executes immediately.
Evidence
macapp/Sources/GoCodeUI/SessionsView.swift:41-49 — session selection is an onTapGesture on a row.
macapp/Sources/GoCodeUI/SettingsView.swift:136-159 — model selection is an onTapGesture on a row.
macapp/Sources/GoCodeUI/ModelSettingsView.swift:353-365 — exposure Toggle uses an empty label then hides it.
ModelSettingsView.swift:53-66 — fetch sets success/failure status, then load() clears it on success.
ModelSettingsView.swift:110-119,291-295 — custom provider removal is immediate and has no confirmation.
Impact
Keyboard and VoiceOver users cannot reliably discover or activate the primary row actions, cannot identify exposure toggles, and may receive no feedback for model-fetch success/failure. Provider configuration can be removed by one click.
Scope
- Replace row tap gestures with semantic Buttons or selection-enabled Lists that support keyboard activation and expose selected state.
- Give every exposure toggle a meaningful model-specific accessibility label/value.
- Preserve action result status across refresh; announce it politely and make dismissal explicit.
- Confirm custom provider removal, naming the provider and impact on exposed models.
- Ensure focus remains stable after selection, refresh, dismissal, and deletion.
Tests first
- Source/interaction tests proving no primary list action depends solely on
onTapGesture.
- Accessibility-label/state tests for session rows, model rows, and exposure toggles.
- Model-settings model tests proving fetch success/failure survives the follow-up load.
- Regression: provider DELETE is not sent before confirmation; Cancel leaves selection intact.
- Manual keyboard + VoiceOver smoke on Sessions and Settings.
Acceptance criteria
Parent: #991
Summary
Major list actions are attached to tap gestures instead of semantic controls, model-exposure toggles have an empty hidden label, model fetch status is cleared by the reload it triggers, and custom provider deletion executes immediately.
Evidence
macapp/Sources/GoCodeUI/SessionsView.swift:41-49— session selection is anonTapGestureon a row.macapp/Sources/GoCodeUI/SettingsView.swift:136-159— model selection is anonTapGestureon a row.macapp/Sources/GoCodeUI/ModelSettingsView.swift:353-365— exposure Toggle uses an empty label then hides it.ModelSettingsView.swift:53-66— fetch sets success/failure status, thenload()clears it on success.ModelSettingsView.swift:110-119,291-295— custom provider removal is immediate and has no confirmation.Impact
Keyboard and VoiceOver users cannot reliably discover or activate the primary row actions, cannot identify exposure toggles, and may receive no feedback for model-fetch success/failure. Provider configuration can be removed by one click.
Scope
Tests first
onTapGesture.Acceptance criteria
swift test, Swift build, formatting, strict format lint, and accessibility smoke pass.