Repository navigation
feat(agents): add macOS accessibility knowledge topics - #3158
Open
Jason Morse (JasonVMo) wants to merge 2 commits into
Open
Jason Morse (JasonVMo) wants to merge 2 commits into
Jason Morse (JasonVMo) wants to merge 2 commits into
Conversation
Vladimir Morozov (vmoroz)
approved these changes
Oct 29, 2026
Jason Morse (JasonVMo)
force-pushed
the
user/jasonvmo/a11y-knowledge
branch
from
October 29, 2026 17:10
fd13876 to
1cf8630
Compare
Add verified a11y topics (appkit, roles, state, text-input, keyboard) and a testing.ax-probes procedure with an out-of-process AX probe. Route accessibility work from AGENTS.md. Fix the RNTester Metro command, since `yarn start` fails under the pnpm linker. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Jason Morse (JasonVMo)
force-pushed
the
user/jasonvmo/a11y-knowledge
branch
from
October 29, 2026 19:49
1cf8630 to
c64c608
Compare
Saad Najmi (Saadnajmi)
left a comment
Collaborator
There was a problem hiding this comment.
My first look feels like this is quite specific to the PR we submitted, which makes me worry how fast this might grow if we do a similar thing for every PR. Ex: It seems very focused on TextInput, because that PR was probably fixing some TextInput bugs
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary:
macOS accessibility in this fork depends on AppKit behavior that isn't obvious from headers. For example, a getter can return
AXUnknownwhile AX clients see a different role. Paper and Fabric also resolve roles differently. Agents and contributors keep rediscovering these details, or they copy iOS patterns that don't hold on macOS. This PR records the verified behavior as knowledge topics. It also adds a repeatable way to check what VoiceOver and other AX clients actually see.New topics, loaded from a new
AGENTS.mdrow for accessibility, focus, or Tab-order work:a11y.appkit: AppKit AX behavior observed out of process. Rules:a11y.roles: Role resolution in Paper and in Fabric, side by side. Rules:role, thenaccessibilityRole, then the element's default role.RCTConvertinto Fabric.a11y.state: HowaccessibilityStatemaps to AX attributes and value words. Rules:AXPressonly when the element handles it.a11y.text-input:editable={false}semantics on every platform, plus the single-line (RCTUITextField) and multiline (RCTWrappedTextView) backings.a11y.keyboard:focusable, first responder, and the key view loop, including why a Fabric TextInput takes two Tab stops onmain.testing.ax-probes: A procedure with a small Swift AX probe. It dumps elements bytestID, reports focus, and clicks Fabric views, all driven withosascriptkeys.The topics state facts and the open questions in #3136 without recommending how to resolve them. They watch #3136, so they'll be updated when it lands.
This PR also corrects
testing.rntester-macos.yarn startfails under the repository'snodeLinker: pnpm, because Yarn resolves thereact-native-macosbinary under.yarn/__virtual__, which the pnpm linker never creates. Runningcli.jsdirectly withoutNODE_PATHstarts Metro without its/statusroute, so the app reports "No script URL provided". The topic now gives a command that works.Knowledge files only, with no product code changes, so there's no corresponding facebook/react-native PR.
Test Plan:
Environment: macOS 27.2 (26B123), Xcode 26.4.1, Node 24.18.0. Run at
fd13876983.Knowledge checks (the steps CI runs):
node .agents/knowledge/tools/knowledge.mts check --ci26 files checked: 0 errors, 0 warnings.node --test .agents/knowledge/tools/knowledge.test.mtsyarn markdownlint-cli2 --no-globs AGENTS.md ".agents/knowledge/**/*.md" ".claude/skills/rnmacos-*/**/*.md" .github/copilot-instructions.mdSummary: 0 error(s)yarn format-checkFact verification:
main. Theassertsfront matter keeps key lines tied to source, and I confirmed it's enforced: a deliberately broken assert produced a warning.NSView,NSTextField, andNSTextView, before and after setting roles and state.Procedure verification in RNTester-macOS on
main:RCT_NEW_ARCH_ENABLED=1 pod install(Homebrew CocoaPods 1.17.0; local Ruby couldn'tbundle install), then.ado/scripts/xcodebuild.sh packages/rn-tester/RNTesterPods.xcworkspace macosx Debug RNTester-macOS buildBuild SucceededNODE_PATH="$PWD/node_modules" node ../react-native/cli.js startfrompackages/rn-tester, thencurl localhost:8081/statuspackager-status:running(withoutNODE_PATH:Cannot GET /status)testing.ax-probesprocedure, run verbatim from a fresh launchexample_search role=AXTextField enabled=1ax dumpof the TextInput modulesecureTextEntryinputs reportrole=AXUnknown enabled=1, which matches theRCTCopyBackedTextInputfactexample_searchin the TextInput module, withautorecalculatesKeyViewLoop = YESadded to RNTester'sAppDelegatelocally (not committed)AXScrollArea,AXTextField,AXScrollArea,AXTextField…; Shift-Tab returns toAXScrollArea. This matchesa11y.keyboardexample_search, which matches thea11y.keyboard.test-recalculated-looprule