Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when building or changing any interactive mobile UI - VoiceOver/TalkBack labels, grouping, headings, focus order, Dynamic Type/font scale, reduce motion, contrast, and the automated check for each stack.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
VoiceOver and TalkBack are not an edge case — they're how a meaningful share of your users, and every store review, go through the screen. Every control that is interactive needs a label a screen reader can speak; every screen needs a sane reading and focus order; text needs to scale.
Core principle: build it accessible the first time — retrofitting labels after the fact means re-testing the whole screen.
| Concern | Flutter | Compose | SwiftUI |
|---|---|---|---|
| Label | Semantics(label:) / tooltip / semanticLabel on Image/Icon | contentDescription (null = decorative) | accessibilityLabel / Button("…", systemImage:) |
| Grouping | MergeSemantics | Modifier.semantics(mergeDescendants = true) | .accessibilityElement(children: .combine) |
| Heading | Semantics(header: true) | semantics { heading() } | .accessibilityAddTraits(.isHeader) |
| Hidden/decorative | ExcludeSemantics | Modifier.clearAndSetSemantics {} | Image(decorative:) |
| Custom action | CustomSemanticsAction | Modifier.semantics { customActions = … } | .accessibilityAction(named:) |
| Live region | Semantics(liveRegion: true) | Modifier.semantics { liveRegion = … } | .accessibilityAddTraits(.updatesFrequently) |
Rules that apply everywhere:
@ScaledMetric (SwiftUI) / theme text styles (Flutter, Compose) everywhere text appears — never a hardcoded point/sp size that ignores the system font-scale setting.MediaQuery.disableAnimationsOf(context) (Flutter), LocalAccessibilityManager/animation duration checks (Compose), @Environment(\.accessibilityReduceMotion) (SwiftUI) — skip or shorten a decorative animation, never a functional state change.meetsGuideline — androidTapTargetGuideline (48×48), iOSTapTargetGuideline (44×44), labeledTapTargetGuideline, textContrastGuideline. Run all four against any new interactive widget's test (see mobile-visual-self-review's worked example).rule.enableAccessibilityChecks() (ui-test-junit4-accessibility) runs the Accessibility Test Framework before every UI-mutating test action. It requires an API 34+ device/emulator — on Robolectric it only warns, so a Robolectric-only pass is inconclusive and must be said so in the closing message. tryPerformAccessibilityChecks() for a manual, one-off gate inside a test.try app.performAccessibilityAudit() (Xcode 15+) inside a UI test — fails the test on a real finding (e.g. insufficient contrast, missing label).When you have a device but not a screen reader to drive, mobile_read_ui {filter: "clickable=\"true\""} is your proxy for "what would TalkBack/VoiceOver say here": every line needs a non-empty text or content-desc, and the bounds must meet the tap-target floor. This is not a substitute for the automated checks above — it catches missing labels, not contrast or reading order.
❌ IconButton(icon: Icon(Icons.delete), onPressed: delete) // no label at all
✅ IconButton(
icon: const Icon(Icons.delete),
tooltip: 'Delete task', // spoken by TalkBack/VoiceOver
onPressed: delete,
)
// ❌ Button(action: delete) { Image(systemName: "trash") } // icon-only, silent
// ✅
Button("Delete task", systemImage: "trash", action: delete)
.labelStyle(.iconOnly) // visually icon-only, still spoken
tooltip/contentDescription/accessibilityLabel.enableAccessibilityChecks() pass as a verified result.Icon/Image used as the entire content of a tappable control with no label anywhere in the diff.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.