Skip to content

feat(web): harden keyboard and focus accessibility - #1

Open
mattheliu wants to merge 88 commits into
masterfrom
feat/a11y-core-0.1.2-alpha.1
Open

feat(web): harden keyboard and focus accessibility#1
mattheliu wants to merge 88 commits into
masterfrom
feat/a11y-core-0.1.2-alpha.1

Conversation

@mattheliu

Copy link
Copy Markdown

Summary

  • Make the shared Modal primitive own initial focus, focus containment, nested dismissal, background inertness, and connected-opener focus restoration.
  • Implement the shared Menu as a complete menu-button interaction, including arrow navigation, Home/End, typeahead, submenus, Tab exit, and focus return; preserve the contract when Tooltip wraps the trigger.
  • Add a named application main landmark and level-one heading, named complementary sidebars, inert/hidden closed Details content, and focusable keyboard-resizable separators.
  • Represent Context Meter as a disclosure controlling a named region instead of announcing a non-modal dialog.
  • Refresh reviewed accessibility-tree goldens and record the decision in a paired English/Chinese Agent Note.

Evidence

  • Focused component coverage: 70 tests passed.
  • Complete GUI lane: 288 files and 3,830 tests passed; 1 test skipped by its existing condition.
  • Production build: passed.
  • Assembled Web replay: 92 files passed and 1 conditionally skipped; 311 tests passed and 15 skipped.
  • Contract typecheck, contract lint, and Node 22 documentation gates: passed; docs reported 15/15 gates.
  • Pre-commit and pre-push repository hooks: passed.

The macOS host does not resolve remote.localhost through Node DNS, so the remote-welcome replay used a process-local mapping to the test contract's intended 127.0.0.1; no repository or system DNS setting was changed.

Scope and limitations

This PR establishes core interaction ownership and automated browser accessibility-tree evidence. It does not claim complete accessibility or assistive-technology certification. Task-level VoiceOver, NVDA, JAWS, Narrator, and Orca runs; disabled-user evidence; forced-colors, zoom/reflow, reduced-motion, and the remaining product workflows continue in the versioned accessibility program.

Related to omdsh-dev/dsh-accessibility#7.

@mattheliu

Copy link
Copy Markdown
Author

Validation update (2026-08-29)

  • CI run 33260242653 completed successfully at head c897d4a.
  • Linux and Windows exhaustive coverage passed, along with snapshot/artifact gates, Node 22.19 and Node 26 compatibility, Python SDK/runtime packaging, all four release-shaped runtimes, Windows build/native/observational gates, and required Wine gates.
  • The workspace-management Playwright file passed five consecutive local Node 22 replay runs (12/12 tests each) after the hover-action retry was changed to repeat the complete real hover-and-click action without force or DOM-event bypasses.
  • The first Windows native attempt ended with a Vitest worker process exiting unexpectedly after the reported suites had passed. A failed-job rerun completed successfully with no code change, and the aggregate required check is green.

Merge and publication remain intentionally gated on real assistive-technology and disabled-user evidence. Community validation instructions remain available at omdsh-dev/dsh-accessibility#7 (comment).

@mattheliu

Copy link
Copy Markdown
Author

Structured-navigation checkpoint — automated gate complete (2026-08-30)

Exact candidate: c45dd9d
CI: https://github.com/omdsh-dev/deepseek-harness/actions/runs/33296286172 (green without rerun)

Implemented and automated:

  • inspector JSON trees: one roving treeitem entry, Arrow/Home/End plus parent/child navigation, collapse/removal focus repair;
  • subagent lineage: one roving enabled row, authored hierarchy and parent/child navigation, disabled-row exclusion and repair;
  • plugin inventory: status summary, complete row names, exact Loader-ID search precedence, and decorative icons excluded from the accessibility tree.

Evidence:

  • Chromium 8/8; Firefox 7 pass + 1 forced-colors capability skip; WebKit 7 pass + 1 capability skip;
  • assembled Web snapshots: 91/91 files, 307 pass + 13 conditional skips / 320;
  • Linux coverage: 990 pass + 7 skip / 997 files, 16,023 pass + 41 skip / 16,064 tests, 100% statements/branches/functions/lines;
  • Windows coverage: 957 pass + 3 skip / 960 files, 15,351 pass + 25 skip / 15,376 tests, 100% statements/branches/functions/lines;
  • Windows native: 5/5 files, 69 pass + 1 platform skip / 70.

The complete failed-checkpoint history and final job links are retained in the bilingual ledger update: omdsh-dev/dsh-accessibility#21

Evidence boundary: this closes only the deterministic structured-navigation row. Exact VoiceOver/NVDA speech, braille/virtual-cursor operation, dynamic-state announcements, and disabled-developer task effectiveness remain pending. The alpha.1 PR remains a partial candidate: do not merge, tag, expand companion peers, or publish npm from this checkpoint.

@mattheliu

Copy link
Copy Markdown
Author

Accessibility checkpoint: image lightbox and deterministic coverage capability

Final candidate: 203cc45
Final CI: https://github.com/omdsh-dev/deepseek-harness/actions/runs/33300662514

  • ImageLightbox now uses the shared Modal owner for dialog naming, application inertness, initial focus, Tab containment, Escape and mask dismissal, nested dismissal, and connected-opener restoration.
  • The final run passed all 19 jobs. The accessibility browser matrix passed Chromium 8/8, Firefox 7/8 with one capability-bound forced-colors skip, and WebKit 7/8 with the same skip. The 91-file Web snapshot gate passed 307 tests with 13 conditional skips.
  • Linux coverage passed 991/998 files and 16,028/16,069 tests; Windows coverage passed 958/961 files and 15,356/15,381 tests. Both reported 100% statements, branches, functions, and lines.
  • Superseded failures remain in runs 33297847205, 33299180192, and 33300378323. No failed job was rerun and no assertion or threshold was waived.

Evidence boundary: this closes automated image-lightbox coverage only. Onboarding, workspace and directory dialogs, and other Modal consumers still need re-audit. VoiceOver and NVDA speech, virtual cursor, braille, physical target systems, and disabled-developer task completion/effectiveness/safety remain pending. This checkpoint does not authorize a tag, merge, or npm release and is not a complete-accessibility claim.

Versioned ledger update: omdsh-dev/dsh-accessibility#21

@mattheliu

Copy link
Copy Markdown
Author

Accessibility checkpoint: onboarding focus ownership

Commit 36e991a moves onboarding initial focus and application inertness under the shared Modal contract. OnboardingModal no longer installs duplicate inert/focus effects. The welcome heading is an explicit contained initial target; Tab and Shift+Tab from it reach the sole action, and an outside initial-focus reference cannot escape the dialog.

Original CI run 33302223540 passed all 19 jobs without a rerun:

  • accessibility browser matrix: Chromium 8/8; Firefox 7/8 plus one forced-colors capability skip; WebKit 7/8 plus the same skip;
  • snapshots/artifacts: 91/91 files, 307 passed and 13 skipped out of 320 tests;
  • Linux coverage: 991 passed and 7 skipped out of 998 files; 16,029 passed and 41 skipped out of 16,070 tests; 100% statements/branches/functions/lines;
  • Windows coverage: 958 passed and 3 skipped out of 961 files; 15,357 passed and 25 skipped out of 15,382 tests; 100% statements/branches/functions/lines;
  • Windows native: 5/5 files, 69 passed and 1 skipped out of 70 tests;
  • aggregate: all needed jobs succeeded.

Versioned ledger update: omdsh-dev/dsh-accessibility#21 (comment)

Boundary: this verifies deterministic code, keyboard, DOM, browser accessibility-tree, focus, and cross-platform behavior for the implemented slice. It does not verify exact screen-reader speech, virtual-cursor/braille operation, credential-safety comprehension, disabled-developer task completion/effectiveness/safety, or the remaining workspace/directory/other modal consumers. This is not a whole-product accessibility claim and does not authorize merge, tag, or npm publication.

@mattheliu

Copy link
Copy Markdown
Author

阶段性无障碍证据更新(不是整机完成声明)

候选 9dfe8b961bf65bb2502b90c66e331e7b81fe1791 已完成本轮共享弹窗与目录浏览器切片:被上层弹窗覆盖的 dialog 现在会进入 inert;只有最上层 dialog 响应 Escape/遮罩关闭;关闭子弹窗后恢复下一层 dialog 与已连接触发器。目录浏览器的嵌套“新建文件夹”路径也验证了父弹窗 inert、父操作禁用、子弹窗拥有焦点及关闭后的焦点返回。

确定性证据:本地 2 个聚焦文件共 119 个测试通过,ModalDirectoryBrowser 的 statements/branches/functions/lines 均为 100%。最终 Actions run 33304086558 无 job 重跑通过全部 19 个 job:三引擎无障碍矩阵、91 文件快照、Linux/Windows 全覆盖率(四项 100%)、Node 22/24/26、Windows 原生/构建/Wine/观察性和 Python 发布形态矩阵均通过。

失败历史没有被隐藏:产品提交的 run 33303729776 保留了一次 Windows Vitest fork worker 意外退出;没有无障碍断言失败,也没有重跑失败 job。后续提交把 worker 生命周期文件确定性隔离为单文件、单 worker 调用,再单独运行其余 4 个原生文件;最终分别通过 54/54 和 15 通过、1 跳过。

版本化边界已同步到 dsh-accessibility PR #21,其 macOS/Ubuntu/Windows × Node 22/24 六通道和汇总门禁均通过。

仍待完成:Workspace 重命名/删除、目录错误弹窗和其他 Modal 使用方;真实 VoiceOver/NVDA/JAWS/Orca 朗读、虚拟光标/盲文、错误恢复与安全理解;残障开发者独立完成核心任务的证据。因此此 PR 仍是 partial automated candidate,不授权合并、tag、npm 发布或“整个 DSH 已完全无障碍”的表述。欢迎社区按上述待验证项提交精确 AT/OS/浏览器版本、语言、脱敏任务、实际朗读、焦点和错误结果。

@mattheliu

Copy link
Copy Markdown
Author

Final candidate checkpoint for cb804349a3a825c9ddb848429ee04895398d1490:

  • Run 33307746119 completed all 19 jobs successfully with no job rerun. The accessibility matrix passed Chromium 8/8, Firefox 7/8 and WebKit 7/8; the latter two capability-bound skips are the forced-colors case. Linux coverage passed 16,030/16,071 tests and Windows coverage passed 15,358/15,383, both at 100% statements/branches/functions/lines.
  • Windows native evidence now runs the four named worker-lifecycle suites in four fresh single-file/single-worker processes (22 + 21 + 7 + 4 = all 54 unique tests), then the remaining four native files in a fifth process (15 pass, one platform-bound skip).
  • The added product slice covers DirectoryBrowser inline error recovery and nested-create failure focus, plus Workspace/Session rename and Workspace delete initial/restored focus. Focused tests passed 160/160 with 100% coverage for the relevant sources.
  • Failure history remains visible: Windows coverage 99241622900 exposed mailbox acknowledgement timing and was fixed by exact delivered-event synchronization; Windows native 99244605514 later lost a fork after 35/54 lifecycle tests and led to suite-level process boundaries. Neither job was rerun.

This is still a partial a11y-automated-reviewed candidate, not a whole-product accessibility claim. Other modal consumers, theme contrast/non-color cues, real VoiceOver/NVDA/braille evidence, and disabled-developer task effectiveness and safety remain open. No merge, tag, or npm publication is authorized by this checkpoint. The mirrored ledger update is in omdsh-dev/dsh-accessibility#21.

@mattheliu

mattheliu commented Aug 30, 2026

Copy link
Copy Markdown
Author

Automated alpha.1 accessibility checkpoint

This is automated evidence only. It does not include current VoiceOver, NVDA, JAWS, TalkBack, braille, switch, speech-input, magnifier, or disabled-developer task evidence, and it does not justify a whole-product or complete-accessibility claim. No merge, tag, release, peer-range expansion, or npm publication is authorized by this checkpoint.

Community validation is requested using the reproducible protocol here: omdsh-dev/dsh-accessibility#7 (comment). Reports should include OS and version, DSH commit, browser or host, assistive technology and version, task, observed speech or braille, result, severity, and any sensitive-data redaction.

@mattheliu

Copy link
Copy Markdown
Author

Accessibility alpha.1 checkpoint — 2026-08-31

Exact candidate: d809463d916b05acc3d6fc5821e83832e1d5e0c8.

CI run 33321079481 passed 19/19 jobs on attempt 1 with no job rerun.

  • The hosted accessibility gate passed Chromium 8/8, Firefox 7/8 with the capability-bound forced-colors skip, and WebKit 7/8 with the same skip.
  • The snapshot job passed 11/11 gates. Its serial owners passed HMR 1, Cordis 5, workflow-run 3, and workspace-management 13; the bounded pool passed its remaining 89 files with 292 tests passed and 13 conditional skips.
  • The WorkspacePicker owner exercises a real Host refusal by removing the selected directory before Open. The adoption error remains a described alert, Cancel owns initial focus, Choose again uses the durable Cancel anchor before unmount, cancellation restores Add workspace, and the registered Workspace identities remain unchanged.
  • Linux coverage passed 998 files with 7 conditional skips and 16,011 tests with 391 conditional skips. Windows passed 965 files with 3 conditional skips and 15,339 tests with 375 conditional skips. Both report 100% statements, branches, functions, and lines.
  • Both coverage platforms ran the workflow-worker owners in fresh 22/7/4/5/5/7/4 processes, covering all 54 unique tests exactly once.

The failed history remains part of the evidence. Run 33317394451 retained the Windows fork exit after 10/21 lifecycle tests; run 33319805616 then proved the deterministic owner split and Windows 100% coverage but retained the independent typed-lint failure on the intentional non-Error rejection fixture. Neither failed job was rerun. The final commit adds only the reasoned one-line lint exemption.

The bilingual ledger is updated at omdsh-dev/dsh-accessibility#21. Official @deepseek-ai/dsh@0.1.2-alpha.2 is now on npm's alpha tag and changes 1,604 paths from alpha.1, overlapping 128 candidate paths. This PR remains alpha.1 evidence only; alpha.2 re-audit is tracked in Issue #22.

This is still automated-review evidence, not a complete-accessibility claim or real VoiceOver/NVDA/disabled-developer validation. No merge, tag, or npm release is authorized by this checkpoint.

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.

1 participant