Skip to content

A11y safeguard: CI role check, remaining fixes, and coding rules#92

Merged
mapgie merged 1 commit into
mainfrom
claude/goflow-a11y-safeguard
Jun 2, 2026
Merged

A11y safeguard: CI role check, remaining fixes, and coding rules#92
mapgie merged 1 commit into
mainfrom
claude/goflow-a11y-safeguard

Conversation

@mapgie
Copy link
Copy Markdown
Owner

@mapgie mapgie commented Jun 2, 2026

Summary

Follow-up to the a11y audit (PR #91). Adds safeguards so accessibility regressions are caught automatically on every PR, and fixes the remaining violations not caught in the first pass.

  • a11y_check.py: Python CI script that scans every Compose source file for .clickable / .combinedClickable modifier chains missing a .semantics { role = Role.* } declaration. Fast-fails (no JDK required) so violations are surfaced before a full Gradle build.
  • CI step in build.yml: Runs python3 a11y_check.py --fails-only as the first job step on every PR targeting main.
  • Additional role fixes (missed in the initial audit):
    • ManageCategoriesScreen.kt archive dialog: "Don't show this again" Row now has Role.Checkbox and inner Checkbox(onClick = null).
    • SettingsScreen.kt reminder settings: alarm-permission ListItem now has Role.Button.
    • SettingsScreen.kt export sub-screen: export-scope rows have Role.RadioButton + RadioButton(onClick = null); export-format rows the same.
    • SettingsScreen.kt theme picker: mode selector Boxes have Role.RadioButton; PaletteOption Column has Role.RadioButton; IconChoiceCell Column has Role.RadioButton.
    • CalendarGrid.kt: role = Role.Button added inside clearAndSetSemantics so day cells are reachable by keyboard and switch access.
    • HomeScreen.kt: speed-dial scrim dismiss overlay now has Role.Button and contentDescription = "Close menu".

Test plan

  • Run python3 a11y_check.py locally — should print "All clean" with exit 0.
  • Open Settings, theme picker: TalkBack should announce each mode option (Light/Dark/System) as a radio button.
  • Open Settings, palette picker: each colour circle should be announced as a radio button with the palette name.
  • Open Settings, app-icon picker: each icon tile should be announced as a radio button.
  • Open any export dialog in Settings: scope rows (Data only / Full backup) and format rows (JSON/CSV) should each be a single focusable radio button.
  • On the home calendar, tap a day with TalkBack active: cell should be announced as a button with its date and status description.
  • Open the speed dial on the home screen with TalkBack, then explore-by-touch the scrim: should announce "Close menu, button".
  • Open a category, long-press the archive action, check "Don't show this again" with TalkBack: should announce as a checkbox.

https://claude.ai/code/session_01AeVcEqKNsCwEG6iSF4MYt4


Generated by Claude Code

- a11y_check.py: scans all Compose sources for .clickable/.combinedClickable
  without a companion .semantics { role = Role.* }; exits 1 on any violation
- build.yml: run a11y_check.py as an early fast-fail step on every PR
- Fix remaining missed violations: archive dialog checkbox row, alarm-permission
  list item, export-scope and export-format radio rows, theme-mode selector,
  palette picker, app-icon picker, calendar day cells, and scrim dismiss overlay

https://claude.ai/code/session_01AeVcEqKNsCwEG6iSF4MYt4
@mapgie mapgie marked this pull request as ready for review June 2, 2026 14:59
@mapgie mapgie merged commit 5cd37c3 into main Jun 2, 2026
4 checks passed
@mapgie mapgie deleted the claude/goflow-a11y-safeguard branch June 2, 2026 14:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants