← Back to Home

VPAT 2.5 — Accessibility Conformance Report

TXCCMRI, LLC is committed to making the CCMRI™ platform usable by everyone, including people with disabilities.

Effective: June 24, 2026  |  Standard adopted: WCAG 2.1 Level AA

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) and ACCESSIBILITY_POLICY.md (adopted standard / ITAC-13).

01 Product / Vendor information

FieldValue
Name of Product / VersionTexas 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 Date2026-06-28 · amended 2026-07-31 (design-system sprint evidence, Architecture Bible §208–§216)
Product DescriptionA 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.
Contactaccessibility@txccmri.com
NotesReact 19 + TypeScript single-page application; TailwindCSS design system; semantic HTML.
Evaluation Methods UsedManual 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 StandardsWCAG 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 primitivessrc/components/ui/AccessibleModal.tsx (centered) and src/components/ui/AccessibleDrawer.tsx (slide-in side panel) both provide role="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-visible ring is defined unlayered in src/index.css so it overrides the framework's default outline-none on bare inputs (§114).
  • Skip link — a "Skip to main content" link + id="main-content" landmark target in src/App.tsx (§114).
  • Current-page indicationaria-current on the active navigation item (§114).
  • Programmatic names for controlsaria-label on 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 -fill tokens ≥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

CriterionConformanceRemarks
1.1.1 Non-text ContentPartially SupportsIcon-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 ApplicableThe platform contains no prerecorded audio/video media.
1.2.2 Captions (Prerecorded)Not ApplicableNo prerecorded multimedia.
1.2.3 Audio Description or Media AlternativeNot ApplicableNo prerecorded multimedia.
1.3.1 Info and RelationshipsPartially SupportsSemantic 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 SequenceSupportsDOM order follows reading/visual order; no CSS-driven reordering that changes meaning.
1.3.3 Sensory CharacteristicsSupportsInstructions do not rely solely on shape/size/location.
1.4.1 Use of ColorPartially SupportsStatus 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 ControlNot ApplicableNo auto-playing audio.
2.1.1 KeyboardPartially SupportsStandard 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 TrapPartially SupportsAccessibleModal implements a correct, escapable focus trap (15 surfaces). Gap: un-migrated bespoke overlays lack a managed trap/Escape.
2.1.4 Character Key ShortcutsNot ApplicableNo single-character key shortcuts are implemented.
2.2.1 Timing AdjustableSupportsNo time limits are imposed on user input (knowledge-check cooldowns are anti-spam, not response timers).
2.2.2 Pause, Stop, HidePartially SupportsDecorative 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 BelowSupportsNo flashing content.
2.4.1 Bypass BlocksSupports"Skip to main content" link + main landmark (§114).
2.4.2 Page TitledSupportsThe SPA sets a document title; views are labeled.
2.4.3 Focus OrderPartially SupportsMigrated dialogs manage focus in/out correctly. Gap: un-migrated overlays do not move/return focus.
2.4.4 Link Purpose (In Context)SupportsLink text is descriptive in context.
2.5.1 Pointer GesturesPartially SupportsMost actions are single-pointer; the draft board's drag interactions need a single-pointer alternative review.
2.5.2 Pointer CancellationSupportsActions fire on up-event; no down-event commits.
2.5.3 Label in NamePartially SupportsVisible-text buttons satisfy this; verifying aria-labels on labeled controls include the visible text is part of the label audit.
2.5.4 Motion ActuationNot ApplicableNo motion-actuated functionality.
3.1.1 Language of PageSupports<html lang> is set.
3.2.1 On FocusSupportsFocus does not trigger unexpected context changes.
3.2.2 On InputSupportsInput does not trigger unexpected context changes; navigation is explicit.
3.3.1 Error IdentificationPartially SupportsValidation 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 InstructionsPartially SupportsMany forms have visible labels; ~230 controls need confirmed label/instruction association.
4.1.1 ParsingSupportsReact renders well-formed DOM; the production build validates the component tree.
4.1.2 Name, Role, ValuePartially SupportsDialogs, 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

CriterionConformanceRemarks
1.2.4 Captions (Live)Not ApplicableNo live multimedia.
1.2.5 Audio Description (Prerecorded)Not ApplicableNo prerecorded multimedia.
1.3.4 OrientationSupportsResponsive layout; content is not locked to a single orientation.
1.3.5 Identify Input PurposePartially SupportsAutocomplete tokens on common personal-data inputs are part of the form-label audit.
1.4.3 Contrast (Minimum)Partially SupportsSubstantially 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 TextSupportsRem/responsive units; content reflows and remains usable at 200% zoom.
1.4.5 Images of TextSupportsText is rendered as text, not images.
1.4.10 ReflowSupportsResponsive design; wide data tables use horizontal-scroll containers (no loss of content) per §104/§108.
1.4.11 Non-text ContrastPartially SupportsThe 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 SpacingSupportsNo fixed line-height/letter-spacing that clips text; Tailwind spacing scales.
1.4.13 Content on Hover or FocusPartially SupportsTooltips are generally dismissible/hoverable; a review of all hover-revealed content for persistence/dismissal is pending.
2.4.5 Multiple WaysSupportsNavigation sidebar + in-app search/CoPilot provide multiple ways to locate content.
2.4.6 Headings and LabelsPartially SupportsHeadings are descriptive; label completeness depends on the form-label audit.
2.4.7 Focus VisibleSupportsApp-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 PartsSupportsSpanish content (i18n) is marked at the part level where mixed.
3.2.3 Consistent NavigationSupportsThe role-based sidebar is consistent across views.
3.2.4 Consistent IdentificationSupportsComponents with the same function are labeled/iconed consistently.
3.3.3 Error SuggestionPartially SupportsUpload/validation flows suggest corrections; full coverage tracked with 3.3.1.
3.3.4 Error Prevention (Legal, Financial, Data)SupportsIrreversible/data actions use explicit confirmation (e.g., demo→live conversion gate, destructive-action warnings).
4.1.3 Status MessagesPartially SupportsMany 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 ChapterConformanceRemarks
302 Functional Performance CriteriaPartially SupportsWithout 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 TechnologyPartially SupportsStandard HTML/ARIA exposes content to AT; broader screen-reader regression testing (NVDA/VoiceOver) is planned.
503 ApplicationsPartially SupportsUser control of focus and labeling improving; status-message announcement (4.1.3) tracked.
504 Authoring ToolsNot ApplicableThe platform is not an authoring tool for end-user web content.
602–603 Support Documentation & ServicesSupports (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 itemCriteria it closesStatus
Migrate bespoke modal/drawer overlays to the accessible primitives2.1.2, 2.4.3, 4.1.2Substantially 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.5In 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 tokens1.4.3, 1.4.11, 1.4.1Substantially 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 results4.1.3Planned.
Keyboard-operability pass over complex widgets (draft board, drag)2.1.1, 2.5.1Planned.
Stand up automated a11y CI (axe-core / Lighthouse)ITAC-12/-16 verificationPlanned.
Third-party expert auditITAC-11Planned (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).