Add layered accessibility conformance harness for Docusaurus site#2009
Conversation
…cusaurus site - add pa11y + Playwright axe e2e suite and CI gate for the docs site - fix hub-card SVG icons to use decorative-icon semantics - add accessibility BRD, PRD, and ADR 0003 planning docs - support ADR frontmatter validation for new planning artifacts ♿ - Generated by Copilot
…-accessibility # Conflicts: # scripts/linting/Validate-MarkdownFrontmatter.ps1
- add docs:test:e2e, docs:a11y, and lint:docs-site scripts to root package.json - wire a11y serve-and-test script and start-server-and-test dep in docusaurus - refresh accessibility CI gate ADR table and conformance BRD ♿ - Generated by Copilot
…-accessibility # Conflicts: # docs/docusaurus/package-lock.json # docs/docusaurus/package.json
Add networkidle, activedescendant, and cursored to the cspell word allowlist for the Docusaurus e2e specs, and ignore the coverage output directory. ✅ - Generated by Copilot
…-accessibility # Conflicts: # docs/planning/adrs/.adr-config.yml
Dependency ReviewThe following issues were found:
|
…ecov OIDC - resolve PR Validation startup_failure from reusable workflow permission mismatch 🔧 - Generated by Copilot
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #2009 +/- ##
==========================================
- Coverage 80.82% 80.74% -0.08%
==========================================
Files 117 127 +10
Lines 19095 19176 +81
Branches 0 12 +12
==========================================
+ Hits 15433 15484 +51
- Misses 3662 3689 +27
- Partials 0 3 +3
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
- add pkg:npm/uri-js to dependency-review allow-dependencies-licenses (compound BSD SPDX) - pin js-yaml override in docusaurus package.json - exempt file:/link: protocol refs from npm pinning analyzer - add analyzer tests for local-path protocol references 🔒 - Generated by Copilot
…-accessibility # Conflicts: # .github/workflows/dependency-review.yml
- regenerate package-lock.json so npm ci resolves js-yaml@>=4.2.0 🔒 - Generated by Copilot
…ockfile - remove forced js-yaml 4.2.0 override that broke gray-matter/@istanbuljs (js-yaml 3.x API) - reconcile lockfile back to js-yaml 3.14.2 via npm install - accept availability-only DoS risk (CWE-407); build parses only first-party YAML 🔒 - Generated by Copilot
…com/microsoft/hve-core into fix/hub-card-icon-alt-accessibility
…ht caching - add steps to resolve and cache puppeteer and Playwright versions - include new test fixtures for version consistency checks 🔧 - Generated by Copilot
- ensure that incomplete Chrome builds are removed to prevent installation failures 🔧 - Generated by Copilot
…ests - verify Chrome executable presence before running tests - clear puppeteer cache if Chrome is missing 🔧 - Generated by Copilot
- change cache key format for puppeteer - improve error handling during Chrome installation - ensure Chrome executable verification is robust 🔧 - Generated by Copilot
…ests - handle intermittent failures during Chrome installation - retry installation up to three times if executable is missing - clear puppeteer cache on installation failure 🔧 - Generated by Copilot
…essibility tests - ensure single-source provisioning of Chrome - clear corrupted cache before reinstallation - update cache keys for puppeteer and Playwright 🔧 - Generated by Copilot
… tests - reclaim disk space before browser installs - ensure complete re-download of Chrome on installation failures - enhance error reporting during Chrome installation attempts 🔧 - Generated by Copilot
- add disk usage and cache state logging on install failure - ensure clean extraction of Playwright browser builds 🔧 - Generated by Copilot
- remove unnecessary disk cleanup steps - ensure Chrome is provisioned from the system instead of downloading - update Playwright configuration to use the system Chrome 🔧 - Generated by Copilot
katriendg
left a comment
There was a problem hiding this comment.
Accessibility harness review (comments only — not approving or requesting changes)
Strong, well-architected feature. Test logic verified locally on this branch: lint:a11y clean, Jest 104/104, pa11y 5/5, Playwright e2e 24/24 (non-CI). The inline comments below cover one blocking CI defect plus completeness gaps. Three items that don't map to a diff line are listed here:
docs/docusaurus/README.md(not modified) — Documentation, Major: README has no mention of the new harness. Please add contributor docs for the four layers, the Google Chrome prerequisite, and local commands (docs:test:coverage,docs:a11y,docs:test:e2e,docs:test:e2e:setup,lint:docs-site).BoxCard.tsxL23 (outside diff) — Code Quality, Minor (pre-existing):const iconUrl = icon ? useBaseUrl(icon) : undefined;calls a hook conditionally (rules-of-hooks). Not introduced here and not flagged becauseeslint-plugin-react-hooksisn't configured, but worth fixing while the component is touched:const resolvedIcon = useBaseUrl(icon ?? ''); const iconUrl = icon ? resolvedIcon : undefined;.- PR scope/branch hygiene — Maintainability, Minor: the branch began as a one-line icon fix and now bundles four general-purpose PowerShell linter changes and a dependency-review allowlist edit. Each is reasonable and ships with tests, but they widen the review surface beyond accessibility — consider splitting or explicitly calling them out.
Manual AT validation (NVDA/JAWS/VoiceOver) is out of scope per the PRD — a candidate follow-up.
bindsi
left a comment
There was a problem hiding this comment.
Approved: the layered accessibility conformance harness, tests, and documentation are consistent with the Docusaurus validation surface. I did not find actionable accessibility or CI issues.
…tests - update reuseExistingServer to true for CI environments - prevent port conflicts and redundant rebuilds 🔧 - Generated by Copilot
- add typecheck step to CI workflow - update accessibility scan command for clarity - refine README to detail accessibility conformance layers - adjust jest coverage thresholds for better reporting - fix icon resolution logic in BoxCard component 🔧 - Generated by Copilot
|
Thanks @katriendg for the thorough review — really appreciate the detail. Following up on the three points from your review summary that weren't tied to a specific diff line:
All six inline comments have been addressed with replies on each thread. |
… README Replace em-dashes and bolded-prefix list items in accessibility harness section with plain colon-delimited list. Refresh ms.date to current to clear the 90-day freshness gate.
Pull Request
Description
This PR began as a fix for the missing accessible treatment of decorative hub-card icons and expanded into a complete layered accessibility conformance harness for the Docusaurus documentation site.
Component and CSS conformance fixes (WCAG):
aria-hidden="true"so assistive technology ignores it (SC 1.1.1) inBoxCard.tsx.focus-visibleoutline (SC 2.4.7, SC 1.4.11), a dark-mode link-color override, and local-search muted-text contrast overrides for light and dark modes (SC 1.4.3) incustom.css.SearchBarswizzle that mirrorsaria-ownstoaria-controlsand tags the "See all results" footer anchor withrole="option"to complete the WAI-ARIA APG combobox/listbox pattern.Layered accessibility CI gate:
A four-layer accessibility architecture wired into the
docusaurus-testsworkflow as a blocking guardrail targeting WCAG 2.2 AA at a zero-violation threshold:eslint-plugin-jsx-a11y(flateslint.config.mjs).jest-axe) with coverage reporting.pa11y-ci(.pa11yci,WCAG2AA, threshold 0) across representative URLs.Workflow and dependency wiring:
.github/workflows/docusaurus-tests.ymlwith the accessibility lint, coverage test, pa11y scan, and Playwright e2e steps, plus Codecov coverage upload using OIDC (id-token: write).docs:test:coverage,docs:test:e2e,docs:a11y,docs:lint,lint:docs-site, and their site-level counterparts) and the accessibility/test devDependencies with corresponding lockfile updates.Planning artifacts:
last_decision_id.Linter accommodations:
AdrBodyParser.psm1to recognize dotfile path segments (e.g.,.adr-config.yml).Validate-MarkdownFrontmatter.ps1so nullable schema fields validate correctly.Related Issue(s)
None
Type of Change
Select all that apply:
Code & Documentation:
Infrastructure & Configuration:
AI Artifacts:
prompt-builderagent and addressed all feedback.github/instructions/*.instructions.md).github/prompts/*.prompt.md).github/agents/*.agent.md).github/skills/*/SKILL.md)Other:
.ps1,.sh,.py)Testing
BoxCard.test.tsxasserting the decorative image is hidden from assistive technology and a jest-axe no-violations check with the icon present.docs/docusaurus/e2e/validating keyboard navigation, focus management and trap-escape, roving tabindex, skip link, reflow, mobile menu, color-mode toggle, and search combobox behavior, each running region-scoped axe scans.pa11y-cifull-site scan (WCAG2AA, zero-violation threshold) across five representative URLs.lcovandtext-summaryreporters and Codecov upload.docusaurus-testsGitHub Actions workflow as merge gates.Checklist
Required Checks
AI Artifact Contributions
/prompt-analyzeto review contributionprompt-builderreviewRequired Automated Checks
The following validation commands must pass before merging:
npm run lint:mdnpm run spell-checknpm run lint:frontmatternpm run validate:skillsnpm run lint:md-links(deferred to CI)npm run lint:psnpm run plugin:generatenpm run docs:testSecurity Considerations
Additional Notes