Accessibility Conformance Report
This is an Accessibility Conformance Report (ACR) in the shape of VPAT® 2.4, the format most procurement processes ask for. It records, one success criterion at a time, how the System9 console measures against the standards below.
Read Accessible operation first for how the product is built. This page is the procurement artifact: the claims, their evidence, and their limits.
This is a vendor self-assessment. It is not an independent audit, and no third party has attested to it.
It is based primarily on automated testing, plus code inspection of the shared interface primitives. A full manual screen-reader cycle across the console has not been performed, and several criteria below are marked Partially Supports specifically because automated tooling cannot decide them.
An ACR that marked everything "Supports" would be easy to write and worth nothing. Where the evidence does not reach, this one says so.
Product and report information
| Field | Value |
|---|---|
| Product | System9 platform console (web application) |
| Report date | 27 September 2026 |
| Report version | 1.0 (first issue) |
| Evaluation basis | Vendor self-assessment |
| Contact | accessibility@system9.ai |
Scope note: this report covers the platform console. Deployment-gated mission consoles and the Edge Agent's own surfaces are not in scope for this issue.
Standards this report addresses
| Standard | Included |
|---|---|
| WCAG 2.1, Level A and AA | Yes |
| WCAG 2.2, Level A and AA | Yes (the nine added criteria) |
| Revised Section 508 (36 CFR Part 1194) | Yes, by reference to WCAG |
| EN 301 549 v3.2.1 | Yes, by reference to WCAG (Clauses 9 and 11) |
Evaluation methods used
| Method | What it covers | What it cannot tell us |
|---|---|---|
eslint-plugin-jsx-a11y | Static patterns in source | Nothing about rendered output |
| axe-core in component tests (~1,570 files) | Rendered component DOM | Whole-page composition, real AT behaviour |
| Playwright + axe-core route sweep (29 routes) | Assembled pages in a browser | Anything axe cannot detect automatically |
pa11y-ci (axe + HTML CodeSniffer) | Two engines over public pages | Authenticated surfaces |
| Lighthouse CI | Page-level scoring | Same automated limits |
| Contrast matrix computation | Theme colour pairs against AA ratios | Contrast of content the theme does not control |
| Code inspection of shared primitives | Structural behaviour inherited by every screen | Whether every screen uses them correctly |
Automated testing detects a minority of accessibility defects. Industry estimates put it at roughly a third. That is the single most important limit on this report, and it is why so many rows below read Partially Supports.
Conformance terms
| Term | Meaning |
|---|---|
| Supports | The functionality meets the criterion without known defects |
| Partially Supports | Some functionality does not meet the criterion, or verification is incomplete |
| Does Not Support | The majority of functionality does not meet the criterion |
| Not Applicable | The criterion is not relevant to this product |
WCAG 2.1 Level A
| Criterion | Conformance | Remarks |
|---|---|---|
| 1.1.1 Non-text Content | Partially Supports | Decorative graphics are hidden from assistive technology and alt presence is linted. Meaningfulness of every alternative is not machine-checkable and has not been manually reviewed console-wide. |
| 1.2.1 Audio-only and Video-only | Not Applicable | The console presents no pre-recorded audio-only or video-only content. |
| 1.2.2 Captions (Pre-recorded) | Not Applicable | No pre-recorded multimedia. |
| 1.2.3 Audio Description or Media Alternative | Not Applicable | No pre-recorded multimedia. |
| 1.3.1 Info and Relationships | Partially Supports | Landmark regions, programmatically associated form labels, and table caption plus header scope, the last enforced by a gate whose exception list is now empty. 19 components predate the accessibility-test requirement and are unverified. |
| 1.3.2 Meaningful Sequence | Partially Supports | DOM order follows visual order in the shared layout primitives. Not verified screen by screen. |
| 1.3.3 Sensory Characteristics | Partially Supports | Instructions are written not to depend on shape or position alone. No systematic review. |
| 1.4.1 Use of Color | Partially Supports | Status is carried by text and icon as well as colour in the shared primitives. Not verified for every custom visualization. |
| 1.4.2 Audio Control | Not Applicable | No auto-playing audio. |
| 2.1.1 Keyboard | Partially Supports | Interactive primitives are keyboard-operable and the console is designed for keyboard-only use. Without a manual pass, full keyboard operability of every flow is unverified. |
| 2.1.2 No Keyboard Trap | Partially Supports | Dialog primitives manage focus. A mobile-drawer focus trap is outstanding. |
| 2.1.4 Character Key Shortcuts | Supports | The console defines no single-character shortcuts without a modifier. |
| 2.2.1 Timing Adjustable | Partially Supports | Session expiry warns before it acts and can be extended. Other timed behaviour is not catalogued. |
| 2.2.2 Pause, Stop, Hide | Partially Supports | The operating-system reduced-motion preference is honoured. Live-updating regions are not universally pausable. |
| 2.3.1 Three Flashes or Below | Supports | Nothing in the console flashes. |
| 2.4.1 Bypass Blocks | Supports | A skip-to-content link is the first focusable element, and the main content region is a labelled landmark. |
| 2.4.2 Page Titled | Supports | Each route sets a descriptive document title. |
| 2.4.3 Focus Order | Partially Supports | Focus order follows DOM order; dialogs move focus deliberately. Not verified per screen. |
| 2.4.4 Link Purpose (In Context) | Partially Supports | Link text is authored to be meaningful in context. Not systematically reviewed. |
| 2.5.1 Pointer Gestures | Supports | No multi-point or path-based gesture is required. |
| 2.5.2 Pointer Cancellation | Supports | Activation occurs on the up-event through the shared primitives. |
| 2.5.3 Label in Name | Partially Supports | Accessible names are derived from visible labels in the primitives. Not audited for every control. |
| 2.5.4 Motion Actuation | Not Applicable | No device-motion-actuated functionality. |
| 3.1.1 Language of Page | Supports | The document declares its language. |
| 3.2.1 On Focus | Partially Supports | Focus does not trigger navigation in the shared primitives. Not audited console-wide. |
| 3.2.2 On Input | Partially Supports | Changing a control does not auto-submit in the shared form primitives. |
| 3.3.1 Error Identification | Partially Supports | Invalid fields are marked programmatically and described to assistive technology. Coverage across every form is unverified. |
| 3.3.2 Labels or Instructions | Partially Supports | Form primitives require a programmatic label; a gate requires feature code to compose from them. |
| 4.1.2 Name, Role, Value | Partially Supports | Roles and states come from the shared primitives and are checked by axe at the component level. Correct behaviour with real assistive technology is not yet verified. |
WCAG 2.2 removed 4.1.1 Parsing. It is omitted here.
WCAG 2.1 Level AA
| Criterion | Conformance | Remarks |
|---|---|---|
| 1.2.4 Captions (Live) | Not Applicable | No live multimedia. |
| 1.2.5 Audio Description | Not Applicable | No pre-recorded multimedia. |
| 1.3.4 Orientation | Supports | Layout is responsive and locks no orientation. |
| 1.3.5 Identify Input Purpose | Partially Supports | Autocomplete hints are present on common identity and contact fields, not on every applicable input. |
| 1.4.3 Contrast (Minimum) | Partially Supports | The theme is computed against AA ratios. Known failures remain: de-emphasized tokens (timestamps, version pills, separators) and muted helper text on the dark theme fall below AA, and an automated page audit reports contrast errors on the pre-hydration splash. See known issues. |
| 1.4.4 Resize Text | Partially Supports | The interface is usable at 200% zoom. Not verified on every dense screen. |
| 1.4.5 Images of Text | Supports | Text is rendered as text, not as images. |
| 1.4.10 Reflow | Partially Supports | Layouts reflow to narrow viewports. Wide data tables scroll on one axis, which the criterion permits. |
| 1.4.11 Non-text Contrast | Partially Supports | Interactive boundaries and focus indicators are computed against the 3:1 ratio; the same de-emphasized tokens noted above affect some non-text elements. |
| 1.4.12 Text Spacing | Partially Supports | Layouts use relative units and tolerate user text-spacing overrides. Not verified on every screen. |
| 1.4.13 Content on Hover or Focus | Partially Supports | Popover primitives are dismissible and hoverable. Not audited for every instance. |
| 2.4.5 Multiple Ways | Supports | Navigation, search, and direct links each reach console destinations. |
| 2.4.6 Headings and Labels | Partially Supports | Heading structure is authored per page; no systematic review has been done. |
| 2.4.7 Focus Visible | Partially Supports | A visible focus indicator is inherited from the shared primitives. Not verified against every custom control. |
| 3.1.2 Language of Parts | Not Applicable | The console is presented in a single language. |
| 3.2.3 Consistent Navigation | Supports | Navigation appears in a consistent order across the console. |
| 3.2.4 Consistent Identification | Supports | Components with the same function are built from the same primitive and identified consistently. |
| 3.3.3 Error Suggestion | Partially Supports | Validation messages describe the correction where it is known. Coverage varies by form. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Partially Supports | Destructive and consequential actions require confirmation, and many pass a governance gate. Not catalogued criterion by criterion. |
| 4.1.3 Status Messages | Supports | Live regions announce status, route changes, and asynchronous results without moving focus. |
WCAG 2.2 additions
| Criterion | Conformance | Remarks |
|---|---|---|
| 2.4.11 Focus Not Obscured (Minimum) (AA) | Partially Supports | Sticky headers and dialogs are the risk, and have not been systematically evaluated against this criterion. |
| 2.5.7 Dragging Movements (AA) | Partially Supports | Most interactions require no dragging. Where a drag exists, a single-pointer alternative has not been confirmed everywhere. |
| 2.5.8 Target Size (Minimum) (AA) | Partially Supports | Shared primitives target 44×44 CSS pixels, exceeding the 24×24 minimum. Dense table-row controls are not all verified. |
| 3.2.6 Consistent Help (A) | Partially Supports | Help and support entry points are consistently placed in the shell; not audited against the criterion. |
| 3.3.7 Redundant Entry (A) | Partially Supports | Multi-step flows carry prior input forward in most cases. |
| 3.3.8 Accessible Authentication (Minimum) (AA) | Partially Supports | Authentication requires no cognitive-function test, and supports password managers and hardware authenticators. The multi-factor and smartcard flows have not been specifically audited against this criterion, which is the one most likely to matter in a procurement review. |
Section 508 and EN 301 549
| Standard | Position |
|---|---|
| Section 508, E207.2 (Software) | Addressed by the WCAG tables above. Level A and AA criteria are reported individually |
| Section 508, E202.5 (Authentication) | See 3.3.8. Authentication is usable with assistive technology in principle; a dedicated audit of the MFA and smartcard flows is outstanding |
| Section 508, Chapter 7 / E205 (Documentation) | The documentation site holds itself to an explicit contract: every figure ships an equivalent table, and colour is never the only carrier of meaning |
| Section 508, Chapter 6 (Hardware) | Not applicable |
| EN 301 549 Clauses 9 and 11 | Addressed by the WCAG tables above |
| EN 301 549 Clause 10 (Non-web documents) | Not assessed |
| EN 301 549 Clauses 6, 13 (Voice, relay) | Not applicable |
Known issues
These are the defects we know about. They are listed because an ACR without an exceptions list is not credible.
| Issue | Criteria | Status |
|---|---|---|
| De-emphasized text tokens (timestamps, version pills, separators) below AA contrast | 1.4.3 | Open. Restricted to non-essential, non-interactive decoration |
| Muted helper text on the dark theme below AA | 1.4.3 | Open. Used only for de-emphasized supporting copy |
| Contrast errors reported on the pre-hydration splash by an automated page audit | 1.4.3 | Open, and deliberately not tuned away. Likely a sampling artifact before the application hydrates, but it is a real reading and is being treated as one |
| A small number of components fail automated checks on the main branch | 4.1.2, various | Open. Named internally; the reason the accessibility test job does not yet block merges |
| 19 components predate the accessibility-test requirement | various | Open and shrinking. Down from 186 |
| Mobile-drawer focus trap | 2.1.2 | Open |
| No full manual screen-reader cycle | many | Outstanding. The largest single limit on this report |
How this report is maintained
The engineering behind it is described in Accessible operation: a dedicated accessibility CI workflow, roughly 1,570 axe-based component tests, a two-engine page audit, and four ratchets whose exception lists may only shrink.
This report is re-issued when a material claim changes. If you find something in it that is wrong, that is a defect and we want to hear about it: accessibility@system9.ai.
VPAT® is a registered trademark of the Information Technology Industry Council (ITI). This report follows the VPAT 2.4 structure; it is not an ITI-issued or ITI-endorsed document.