00 About this report
This is CCMRI's Voluntary Product Accessibility Template (VPAT®) 2.5 Accessibility Conformance Report, published in full. It is self-assessed — conducted by CCMRI against the product code and the rendered interface, not by an outside firm. An independent third-party audit is sequenced and has not been commissioned.
We publish it as written rather than as a summary, including the criteria marked Partially Supports and Does Not Support and the tracked gaps behind them. A conformance report with no gaps in it is available almost everywhere and is almost never true.
Questions, or to request this report in another format: phil@txccmri.com · 512-784-4331.
Voluntary Product Accessibility Template (VPAT®) 2.5 — Accessibility Conformance Report (ACR)
This is the HECVAT/K12CVAT ITAC-06 deliverable (an ACR completed within the last 12 months). It is grounded in the verified state of the codebase as of 2026-06-28, not aspiration. Where a criterion is not yet fully met, it is honestly marked Partially Supports / Does Not Support with a remediation plan — never a fabricated "Supports." Companion docs:docs/business/ACCESSIBILITY_VPAT_READINESS.md(roadmap / ITAC-14) andACCESSIBILITY_POLICY.md(adopted standard / ITAC-13).
01 Product / Vendor information
| Field | Value |
|---|---|
| Name of Product / Version | Texas CCMRI™ Platform (web application) — build 2026-06-28; contrast/theming evidence amended from the 2026-07 design-system sprint (branch ui/design-system-2026-07, releasing with the next production cascade) |
| Report Date | 2026-06-28 · amended 2026-07-31 (design-system sprint evidence, Architecture Bible §208–§216) |
| Product Description | A multi-tenant web platform for Texas school districts to track College, Career & Military Readiness (CCMR) outcomes, manage CTE/IBC/WBL programs, and run role-based dashboards for administrators, teachers, counselors, students, and parents. |
| Contact | accessibility@txccmri.com |
| Notes | React 19 + TypeScript single-page application; TailwindCSS design system; semantic HTML. |
| Evaluation Methods Used | Manual code review of the component tree; manual keyboard-operability review of primary flows; automated typecheck/build gates. 2026-07 addition: in-browser, canvas-pixel contrast measurement of the rendered UI in BOTH themes (light + dark "Midnight"), at base AND hover states, with each measurement independently reproduced by a fresh-context second-model adjudication (design-system sprint, §208–§216). Automated axe-core / Lighthouse CI and a third-party expert audit are planned (see ITAC-11/-12). |
| Applicable Standards | WCAG 2.1 Level A and Level AA; Section 508 (Revised 2017, incorporating WCAG 2.1 AA). |
Conformance levels used in this report
- Supports — the functionality meets the criterion without known defects.
- Partially Supports — some functionality meets the criterion; known gaps remain (listed).
- Does Not Support — the majority of functionality does not meet the criterion.
- Not Applicable — the criterion is not relevant to the product.
02 Evidence summary (what is actually implemented today)
These are verifiable in the repository and inform the tables below:
- Accessible dialog primitives —
src/components/ui/AccessibleModal.tsx(centered) andsrc/components/ui/AccessibleDrawer.tsx(slide-in side panel) both providerole="dialog"+aria-modal="true"+aria-labelledby, focus-move-in, focus-return-on-close, a Tab/Shift+Tab focus trap, and Escape/backdrop close. 31 dialog surfaces (30 modals across 21 component files + the ApplicationReview drawer) have been migrated to them (admin spot-check, impersonation, access-audit inquiry, quarantine remap; AI student/group plans; schedule-draft; onboarding wizard; WBL employers/hours/placements/documents; ASVAB & TSIA knowledge checks; resource quiz). ~16 bespoke overlays remain to migrate (primarily CTE/voucher admin surfaces) — these are the basis for the "Partially Supports" marks on 2.1.2 / 2.4.3 / 4.1.2. - Visible focus indicator — an app-wide, theme-aware
:focus-visiblering is defined unlayered insrc/index.cssso it overrides the framework's defaultoutline-noneon bare inputs (§114). - Skip link — a "Skip to main content" link +
id="main-content"landmark target insrc/App.tsx(§114). - Current-page indication —
aria-currenton the active navigation item (§114). - Programmatic names for controls —
aria-labelon 70+ icon-only buttons across 40+ components (§116), extended in this sprint. - Authentication audit (security, not WCAG) — server-authoritative source-IP login records (
recordLoginEvent), supporting account-security review. - No accessibility overlay / "accessibility mode" — none is used (the correct posture; ITAC-18).
- Contrast & theming remediation (2026-07 design-system sprint, §208–§214) — semantic status tokens (
danger/success/info/warn) replaced never-themed raw color families; the dark-theme ("Midnight") 600/700/800 text ramp was completed (26 text steps that failed WCAG AA on the navy background before → 53 of 54 sampled steps now pass); ~200 per-site contrast lifts landed across nine migration waves (‑600/‑900-on-tint text → ‑700/‑800; low-contrast micro-copy → slate-600; every solid fill behind white text moved to measured-filltokens ≥4.5:1 including hover); graphics lifts for 1.4.11 (e.g., a medal-rank ladder from 1.55:1 to ≥4.5:1); a local focus-ring suppression removed on the demo-experience gateway. Every claim was measured in-browser (canvas-pixel) in BOTH themes and independently adjudicated.
Known, tracked gaps (drive the non-"Supports" marks): dialog semantics — the accessible primitives are adopted on 31+ surfaces, but browser-native alert()/confirm() dialogs remain in admin flows (measured 2026-07-31: 83 call sites across 22 files — 63 alert(), 20 confirm()) (native browser dialogs are keyboard/AT-operable by default; migration to the styled AccessibleModal is the tracked structural item), plus residual bespoke overlays; form-control label association is incomplete (~230 inputs to audit/associate — the §136 sweep covered ~48 high-value controls and remains partial); a short enumerated list of accepted/remaining contrast items (see the 1.4.3 / 1.4.11 remarks — the former "full audit not yet complete" gap was substantially executed in 2026-07); automated axe/Lighthouse CI and a third-party audit are not yet in place.
03 Table 1 — WCAG 2.1 Level A
| Criterion | Conformance | Remarks |
|---|---|---|
| 1.1.1 Non-text Content | Partially Supports | Icon-only buttons carry aria-label (70+ instances). Remaining: audit all informational images/icons for text alternatives; confirm decorative images are aria-hidden. |
| 1.2.1 Audio-only / Video-only (Prerecorded) | Not Applicable | The platform contains no prerecorded audio/video media. |
| 1.2.2 Captions (Prerecorded) | Not Applicable | No prerecorded multimedia. |
| 1.2.3 Audio Description or Media Alternative | Not Applicable | No prerecorded multimedia. |
| 1.3.1 Info and Relationships | Partially Supports | Semantic HTML + headings + the new dialog semantics convey most structure. Gap: ~230 form controls need explicit label association; some data tables need header association review. |
| 1.3.2 Meaningful Sequence | Supports | DOM order follows reading/visual order; no CSS-driven reordering that changes meaning. |
| 1.3.3 Sensory Characteristics | Supports | Instructions do not rely solely on shape/size/location. |
| 1.4.1 Use of Color | Partially Supports | Status is generally paired with text/icons, and as of the 2026-07 design-system sprint (§208–§214) status color is driven by semantic tokens (danger/success/info/warn) applied consistently across both themes — status badges/chips carry text or glyphs alongside the hue. Remaining: a final pass confirming color is never the sole signal in chart legends and a few data visualizations. |
| 1.4.2 Audio Control | Not Applicable | No auto-playing audio. |
| 2.1.1 Keyboard | Partially Supports | Standard controls are keyboard-operable; migrated dialogs add full keyboard support. Gap: keyboard pass over the native alert()/confirm() dialogs (83 call sites across 22 files — see summary) and complex widgets (draft board, drag interactions). |
| 2.1.2 No Keyboard Trap | Partially Supports | AccessibleModal implements a correct, escapable focus trap (15 surfaces). Gap: un-migrated bespoke overlays lack a managed trap/Escape. |
| 2.1.4 Character Key Shortcuts | Not Applicable | No single-character key shortcuts are implemented. |
| 2.2.1 Timing Adjustable | Supports | No time limits are imposed on user input (knowledge-check cooldowns are anti-spam, not response timers). |
| 2.2.2 Pause, Stop, Hide | Partially Supports | Decorative animation (e.g., celebration overlay) is brief/dismissible; a review to ensure any moving content >5s is pausable is pending. |
| 2.3.1 Three Flashes or Below | Supports | No flashing content. |
| 2.4.1 Bypass Blocks | Supports | "Skip to main content" link + main landmark (§114). |
| 2.4.2 Page Titled | Supports | The SPA sets a document title; views are labeled. |
| 2.4.3 Focus Order | Partially Supports | Migrated dialogs manage focus in/out correctly. Gap: un-migrated overlays do not move/return focus. |
| 2.4.4 Link Purpose (In Context) | Supports | Link text is descriptive in context. |
| 2.5.1 Pointer Gestures | Partially Supports | Most actions are single-pointer; the draft board's drag interactions need a single-pointer alternative review. |
| 2.5.2 Pointer Cancellation | Supports | Actions fire on up-event; no down-event commits. |
| 2.5.3 Label in Name | Partially Supports | Visible-text buttons satisfy this; verifying aria-labels on labeled controls include the visible text is part of the label audit. |
| 2.5.4 Motion Actuation | Not Applicable | No motion-actuated functionality. |
| 3.1.1 Language of Page | Supports | <html lang> is set. |
| 3.2.1 On Focus | Supports | Focus does not trigger unexpected context changes. |
| 3.2.2 On Input | Supports | Input does not trigger unexpected context changes; navigation is explicit. |
| 3.3.1 Error Identification | Partially Supports | Validation messages are shown (e.g., upload preview); a pass to ensure errors are programmatically associated with fields is pending the label audit. |
| 3.3.2 Labels or Instructions | Partially Supports | Many forms have visible labels; ~230 controls need confirmed label/instruction association. |
| 4.1.1 Parsing | Supports | React renders well-formed DOM; the production build validates the component tree. |
| 4.1.2 Name, Role, Value | Partially Supports | Dialogs, nav, and icon buttons expose name/role/value (§114/§116 + this sprint). Gap: un-migrated overlays and some custom widgets need name/role/value review. |
04 Table 2 — WCAG 2.1 Level AA
| Criterion | Conformance | Remarks |
|---|---|---|
| 1.2.4 Captions (Live) | Not Applicable | No live multimedia. |
| 1.2.5 Audio Description (Prerecorded) | Not Applicable | No prerecorded multimedia. |
| 1.3.4 Orientation | Supports | Responsive layout; content is not locked to a single orientation. |
| 1.3.5 Identify Input Purpose | Partially Supports | Autocomplete tokens on common personal-data inputs are part of the form-label audit. |
| 1.4.3 Contrast (Minimum) | Partially Supports | Substantially remediated in the 2026-07 design-system sprint (§208–§214) — measured in-browser (canvas-pixel), both themes, base and hover, independently adjudicated: the dark-theme 600/700/800 text ramp was completed (26 text steps previously failing AA on the navy background → 53 of 54 sampled steps now pass); semantic status tokens replaced never-themed raw families; ~200 per-site lifts across Waves 2–9 (‑600/‑900-on-tint → ‑700/‑800, low-contrast micro-copy → slate-600, all white-text fills → measured -fill tokens ≥4.5:1 incl. hover). Supporting evidence: the ~500-site indigo/emerald-300/400 family was measured PASSING at 6.17–13.31:1 on the dark background and deliberately left unchanged. Known remaining items (tracked, not flipped): knowledge-check answered-state dimming (opacity-40 — deliberate answer-elimination styling); one 9px micro-copy instance in the resource-lookup view; a small enumerated set of measured-and-accepted accents (the 4.07:1 hero KPI was subsequently lifted to 6.12:1). 2026-07-31 (§216) — further remediation with a NEW mechanical guard: an always-dark-island contrast class was found and closed (raw text-slate-200/300 labels inside dark islands measured 1.06–2.00:1 in the dark theme; ~30 sites pinned), category medal/tier gradients were found failing in the LIGHT theme too (white on gold/silver measured 1.72–2.31:1) and rebuilt on measured fill tokens, three page-level headings and a whole detail-value column were found invisible in the light theme (1.11–1.19:1) and fixed, and the form-placeholder family in the work-based-learning module (17 controls at 1.46:1) was lifted. A new build-blocking lint rule (theme-parity R3) now prevents the island class from recurring. Remaining, measured and tracked (NOT flipped): 90 low-contrast slate-200/300 occurrences across 36 files, characterised as ~45% decorative empty-state glyphs, ~22% null/em-dash markers, and the balance per-site judgment; plus the knowledge-check answered-state dimming and one 9px micro-copy instance already listed above. |
| 1.4.4 Resize Text | Supports | Rem/responsive units; content reflows and remains usable at 200% zoom. |
| 1.4.5 Images of Text | Supports | Text is rendered as text, not images. |
| 1.4.10 Reflow | Supports | Responsive design; wide data tables use horizontal-scroll containers (no loss of content) per §104/§108. |
| 1.4.11 Non-text Contrast | Partially Supports | The focus ring meets non-text contrast. 2026-07 design-system sprint (§208–§214), measured in-browser both themes: graphic/icon lifts landed — e.g., the incentive-ledger medal-rank ladder lifted from 1.55:1 to ≥4.5:1; status/fill chips moved to measured -fill tokens; a score-ring SVG moved from hard-coded hexes to theme tokens (it now themes correctly); kept-as-is graphics were verified against the 3:1 floor (e.g., a 28px warning icon at 3.2:1). Remaining: an exhaustive pass over every UI-component boundary/state has not been claimed and stays open. |
| 1.4.12 Text Spacing | Supports | No fixed line-height/letter-spacing that clips text; Tailwind spacing scales. |
| 1.4.13 Content on Hover or Focus | Partially Supports | Tooltips are generally dismissible/hoverable; a review of all hover-revealed content for persistence/dismissal is pending. |
| 2.4.5 Multiple Ways | Supports | Navigation sidebar + in-app search/CoPilot provide multiple ways to locate content. |
| 2.4.6 Headings and Labels | Partially Supports | Headings are descriptive; label completeness depends on the form-label audit. |
| 2.4.7 Focus Visible | Supports | App-wide theme-aware :focus-visible indicator overriding framework defaults (§114). 2026-07 design-system sprint: one local suppression found and removed — the demo-experience gateway (ExperienceSelector) carried outline: none, which defeated the ring there; removed in Wave 8 (§214), so the indicator is no longer suppressed on that surface. |
| 3.1.2 Language of Parts | Supports | Spanish content (i18n) is marked at the part level where mixed. |
| 3.2.3 Consistent Navigation | Supports | The role-based sidebar is consistent across views. |
| 3.2.4 Consistent Identification | Supports | Components with the same function are labeled/iconed consistently. |
| 3.3.3 Error Suggestion | Partially Supports | Upload/validation flows suggest corrections; full coverage tracked with 3.3.1. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Supports | Irreversible/data actions use explicit confirmation (e.g., demo→live conversion gate, destructive-action warnings). |
| 4.1.3 Status Messages | Partially Supports | Many status updates use toasts; converting them to aria-live/role="status" regions for screen-reader announcement is a tracked item. |
05 Section 508 (Revised 2017) — chapter mapping
The Revised Section 508 standards incorporate WCAG 2.1 Level A & AA by reference; Chapter 5 (Software) and the web criteria are addressed by Tables 1–2 above.
| 508 Chapter | Conformance | Remarks |
|---|---|---|
| 302 Functional Performance Criteria | Partially Supports | Without vision / with limited vision: improving via the dialog + focus + label work and the pending contrast audit. Without hearing / speech: Not Applicable (no audio-dependent functionality). |
| 502 Interoperability with Assistive Technology | Partially Supports | Standard HTML/ARIA exposes content to AT; broader screen-reader regression testing (NVDA/VoiceOver) is planned. |
| 503 Applications | Partially Supports | User control of focus and labeling improving; status-message announcement (4.1.3) tracked. |
| 504 Authoring Tools | Not Applicable | The platform is not an authoring tool for end-user web content. |
| 602–603 Support Documentation & Services | Supports (planned-published) | The public Accessibility Statement + this ACR + the accessibility@txccmri.com issue channel constitute documentation and a support path. |
06 Remediation plan (the path from "Partially" to "Supports")
| Work item | Criteria it closes | Status |
|---|---|---|
| Migrate bespoke modal/drawer overlays to the accessible primitives | 2.1.2, 2.4.3, 4.1.2 | Substantially complete (31 surfaces done, 2026-06-28k) — incl. the ApplicationReview drawer via the new AccessibleDrawer. Only the DraftBoard Waiver Wire modal remains (Framer + draft-state entangled — deferred for careful treatment). CelebrationOverlay / DemoScaleBadge are decorative non-dialogs (out of scope). |
| Form-control label association sweep (~230 inputs) | 1.3.1, 3.3.1, 3.3.2, 2.4.6, 1.3.5 | In progress — the highest-value forms are done (~48 controls + icon-buttons labeled across admin config (IntegrationSettings, ConnectionConfigPanel, DemoCodeManager, SchemaAssistant), the application + onboarding wizards (ApplicationWizard, IntelligentGatekeeper, ApplicantAuth, OnboardingWizard), and data-upload + public surfaces (ColumnMapper, DataUploader, ROICalculator, PublicDistrictTeaser). Remaining lower-traffic forms tracked for the next pass. |
| Color-contrast audit (automated + manual) against design tokens | 1.4.3, 1.4.11, 1.4.1 | Substantially executed (2026-07 design-system sprint, §208–§214) — manual in-browser canvas-pixel measurement in both themes across nine migration waves, each wave independently adjudicated by a fresh-context reviewer; token ramp + ~200 per-site lifts shipped. Remaining: the enumerated accepted items in the 1.4.3/1.4.11 remarks, the chart-legend color-alone review (1.4.1), and the standing automated axe/Lighthouse CI item below. |
aria-live/role="status" for toasts & async results | 4.1.3 | Planned. |
| Keyboard-operability pass over complex widgets (draft board, drag) | 2.1.1, 2.5.1 | Planned. |
| Stand up automated a11y CI (axe-core / Lighthouse) | ITAC-12/-16 verification | Planned. |
| Third-party expert audit | ITAC-11 | Planned (contingent on scale / first contracts). |
🔴 Honesty note for the analyst: This ACR reflects an in-progress conformance program with a working accessible-dialog foundation, visible-focus, skip-link, and broad control-labeling already shipped. The remaining gaps are concrete, enumerated, and in active remediation. CCMRI builds accessibility in (no overlay/bolt-on) and contractually commits to WCAG 2.1 AA (ITAC-07).