Accessibility of this Platform
This Platform aims to meet WCAG 2.2 Level AA for keyboard operability, focus visibility, contrast and programmatic labelling on every interactive view.
It does not claim to have met that aim. Automated rules find a minority of accessibility failures, so the statement below separates what has been established by automated rules, what has been established by driving the interface and watching what happened, what has been measured from a rendered page in a browser, what still awaits such a measurement because no rule answers it, and what needs a person using a screen reader. The last two groups are open work, not formalities — the contrast of the focus indicator is in the first of them, and focus visibility is one of the four things this Platform is required to get right.
The scope is the application shell and the views that exist today. Classification, the submission journey and the document library are still being built; each inherits this shell and is audited by the same run over the route manifest as it lands.
Checked by automated rules
Two kinds of rule, both of which run on every change. An accessibility rule engine runs over every view in the route manifest and reports zero violations. Alongside it, checks over the source and the stylesheet assert the absences that undo the rest — a removed focus indicator, a hand-maintained focus order, a viewport that forbids zoom, an interaction that can only be driven by dragging. Automated rules detect a minority of WCAG failures, so this is evidence about these criteria and silence about the others.
1.3.1Info and Relationships- Landmarks, heading levels, list structure and the association between each term and its description are machine-checkable. Whether the structure matches what the view looks like is not, and appears below.
2.1.2No Keyboard Trap- Established as an absence rather than by a traversal: the shell registers no keyboard handler of any kind, so there is nothing that can intercept a Tab press, and it carries no positive tabindex, so there is no second focus order to escape from. Both are checked over the source. A traversal would be the stronger evidence and needs a browser that implements Tab.
2.4.2Page Titled- Every route in the manifest declares a title, and the manifest refuses an entry without one.
2.4.7Focus Visible- The default indicator is replaced, never removed. There is no rule anywhere in this application that sets outline to none, a check over every stylesheet asserts that, and a second check asserts the replacement is declared — an absent suppression would otherwise also be satisfied by a stylesheet that says nothing about focus and inherits a 1px browser ring. Whether the rendered indicator stands out against every surface the shell paints is the measurement under 1.4.11 below, which has not been taken.
2.5.7Dragging Movements- New in WCAG 2.2, and established here the same way 2.1.2 is: as an absence. No element in the shell carries a draggable attribute or the deprecated drag ARIA, and nothing anywhere handles a drag event, a pointer move, a mouse move or a touch move — so there is no dragging movement to provide an alternative to. No rule in the stylesheet sets touch-action to none either, which is the declaration a hand-built gesture needs in order to take panning away from the browser, and therefore the fingerprint of one. Each of those absences is checked over the source. The criterion stops being free at the first reorderable list, slider or drag-to-arrange stage view, and that is what the check is for: the day one lands, this entry has to be rewritten around a single-pointer alternative rather than around an absence.
3.1.1Language of Page- The lang and dir attributes are set on the document element by the server from the route's locale, for every route and before the first paint.
4.1.2Name, Role, Value- Every control has a role and an accessible name computed from the rendered page. Whether the name is the right one is a judgement and appears below.
Checked by a scripted interaction test
A test drives the interface and asserts what happened: focus moved into the main region when the skip link was followed, focus moved again when the view changed, the live region was in the document before the message arrived. This covers behaviour a static scan cannot see, because a correct implementation and a broken one have the same markup.
2.1.1Keyboard- Every interactive element in the shell is reached by Tab alone and activated by Enter. No control depends on a pointer.
2.4.1Bypass Blocks- The skip link is the first element Tab reaches, and activating it moves focus into the main region — not merely the scroll position, which is what a skip link without a focusable target does.
2.4.3Focus Order- Tab order follows the document, the document follows the route manifest, and focus moves into the main region after a client-side navigation rather than staying on the link that caused it.
4.1.3Status Messages- The shell’s live region is present and empty from the first paint and is populated in place, which is the ordering a screen reader needs in order to announce it at all.
Measured from a rendered page in a browser
A browser run drives a real rendering engine over every view in the route manifest, at a desktop width and at the 320 CSS pixel reflow width, and runs the accessibility rule engine against the laid-out page. The two rules the layout-less suite cannot answer — the contrast of rendered text against what is painted behind it, and the size of each rendered target — are required to be answered, not left undecided. It reports zero violations, and the report it writes carries a digest of the source it measured, so a change to the shell without a fresh run fails the build. This is a measurement of these two criteria; it is not a conformance claim.
1.4.3Contrast (Minimum)- Measured in a browser: the contrast of every piece of rendered text against what is painted behind it, after the cascade and inheritance, on every view at 1280 and 320 CSS pixels wide, with nothing below 4.5:1 (3:1 for large text) and nothing the engine could not decide. The declared palette is also recomputed from the WCAG relative-luminance formula on every change: body text is #1A1A2E on #F8F9FA at 16.2:1, secondary text is 8.0:1, and every posture notice keeps its light ink past 16:1 on its dark surface with each coloured rule past 4.5:1. Forced-colours mode is not in the run.
2.5.8Target Size (Minimum)- Measured in a browser: the rendered box of every interactive target on every view, at 1280 and at 320 CSS pixels wide, is at least 24 by 24 CSS pixels or has the spacing the criterion allows instead, as the engine computes it from the laid-out page. The stylesheet declares the 24px minimum and the spacing; the run is what shows the rendered box honours them. The layout-integrity run adds English and Arabic at 360 and 1280 CSS pixels; the five languages that still render through the English fallback are not yet measured in their own words.
Not yet measured: needs a scripted browser measurement
These are measured from a rendered page, and the browser run that exists carries no rule for them: it computes the contrast of text and the box of each target, not the contrast of a focus indicator or a border against the surface behind it, and not whether a focused control is covered by something painted after it. The stylesheet declares values intended to pass each of them, and that intent is not a measurement. A scripted measurement in the same browser run is what settles them, and until it reports, these criteria are unverified rather than met.
1.4.11Non-text Contrast- The focus indicator is a 3px outline at 2px offset, and the borders that carry meaning are #5C6B7A at 5.19:1 against the page — both chosen past the 3:1 this criterion asks of a non-text element, and both checked against the formula rather than estimated. The browser run measures the contrast of text only; no rule in it compares an indicator or a border against whatever is painted behind it, and that measurement has not been taken.
2.4.11Focus Not Obscured (Minimum)- Nothing in the shell is sticky, floating or positioned over the content, so there is nothing that can cover a focused control. That is an argument from the stylesheet, not a measurement: the criterion compares the box of a focused element against the boxes of everything painted after it, no rule in the browser run makes that comparison, and the first view to introduce a sticky header makes the argument stop holding.
Needs review with assistive technology
These depend on judgement rather than structure: whether a label is meaningful, whether a heading describes what follows, whether a screen reader reads the view in an order that makes sense. No automated check settles them. They are open.
1.1.1Non-text Content- The shell ships one decorative arrow glyph, hidden from assistive technology, and no informative image, so there is nothing for a rule to check and nothing to claim. Whether a future alternative text is useful is a human judgement in every case.
1.4.10Reflow- Partly covered by the layout-integrity property, which asserts no truncation and no overlap from 360 CSS pixels upward in English and Arabic. Whether the reflowed view is usable is still a human reading of it.
2.4.4Link Purpose (In Context)- That a link has an accessible name is checked mechanically. That the name tells a user where the link goes is not.
2.4.6Headings and Labels- Heading levels and label associations are checked mechanically. Whether a heading describes its section is the criterion, and no tool reads for sense.
2.5.3Label in Name- Checkable where a control has both visible text and an accessible name to compare. The shell avoids the failure by not overriding visible text with aria-label anywhere, which is a convention a reviewer has to confirm rather than a mechanism.
3.2.3Consistent Navigation- The primary navigation is rendered once by the shell from one manifest, so it is identical on every view by construction. Confirming that is what a reviewer does.
3.2.6Consistent Help- This statement is reachable from every view through the primary navigation. Whether it constitutes help, and whether its placement stays consistent as views are added, is open.
Not yet applicable to this build
These criteria govern interface elements this build does not have yet — forms, authentication, data tables, media. They are listed so that the view that introduces one inherits the obligation rather than discovering it.
1.3.5Identify Input Purpose- The forms in this build are the language selector and the signing ceremony, both sets of buttons that collect no personal information. The Product_Profile view is the first one with input fields.
3.3.1Error Identification- The signing ceremony is the first view that reports an outcome to the user: a refusal names the recorded reason, a failure names what did not happen, and each says that nothing was signed. No text input is validated yet; the four posture notices report a dependency failure rather than a user mistake.
3.3.2Labels or Instructions- The language selector is labelled by its fieldset legend; the signing ceremony’s controls are buttons named by their visible text, and the manifest they act on is a description list read before them. No text input exists yet.
3.3.7Redundant Entry- No multi-step process yet. The guided submission traversal is where this starts to apply.
3.3.8Accessible Authentication (Minimum)- The signing ceremony’s gesture is a WebAuthn authenticator: nothing is transcribed, remembered or solved in this interface, and the device’s own unlock happens outside the page, which is not a cognitive function test. Session sign-in is not part of this build, so the criterion is stated for the ceremony only.
Reporting a barrier
If something here cannot be operated with a keyboard or a screen reader, that is a defect in this Platform. Report it to the MEDCO quality function through the internal issue process; it is handled as a product defect rather than as a suggestion.