Accessibility
This document states the accessibility standard that the online materials in this repository are subject to, the conformance status of those materials, and the automated measures that keep that status from silently regressing.
It is written to be accurate rather than reassuring. Where this material does not yet conform, that is said plainly, with the specific criterion and the remediation path.
Last reviewed: 2 September 2026 · Contact: Kevin Sullivan, sullivan@virginia.edu
1. Scope
Everything published from this repository to
https://kevinsullivan.github.io/Lean4CS1, which is the course book, the course page and
schedule, and the standalone pages built from src/. It does not cover third-party sites
linked from those pages, nor the PDFs of assigned readings, which are the publishers’
material and are not redistributed here.
2. Applicable standard
The University of Virginia is a public entity under Title II of the Americans with Disabilities Act, so course material published on the open web is governed by the Department of Justice rule on web and mobile accessibility, published 24 April 2024:
28 CFR § 35.200 — Requirements for web and mobile accessibility. “A public entity shall ensure that the following are readily accessible to and usable by individuals with disabilities: (1) Web content that a public entity provides or makes available, directly or through contractual, licensing, or other arrangements …”
The technical standard the rule adopts is WCAG 2.1, Level A and Level AA.
The compliance date that applies here is 26 April 2027. A state university takes the population of its state, not its enrolment, so UVA falls in the “50,000 or more” tier. That date is one year later than originally set: DOJ extended it by interim final rule in April 2026. Entities under 50,000 and special district governments have until 26 April 2028.
Two related obligations point at the same technical target and are satisfied by meeting it:
- Section 508 of the Rehabilitation Act, whose Revised Standards (36 CFR Part 1194, App. A, § 702.10.1, effective 18 January 2018) incorporate WCAG 2.0 Level A and AA by reference. WCAG 2.1 is a superset, so conforming to 2.1 AA conforms to 2.0 AA.
- Section 504 of the same Act, as a condition of federal financial assistance.
The rule excepts compliance that would cause a fundamental alteration of the service or an undue financial and administrative burden. No such exception is claimed for this material.
3. Conformance status
Partially conformant with WCAG 2.1 Level AA, with the exceptions in §5.
Claiming full conformance today would be false. The pages authored in this repository conform and are verified on every deploy. Pages generated by mdBook, the static site generator that builds the book, carry defects originating in its own theme, listed in §5 with their upstream tracking issues.
| Status | |
|---|---|
lean4-fall-2026.html | Conformant, gated on every deploy |
lean4-fall-2026-sources.html | Conformant, gated on every deploy |
Book chapters, cover, course page, 404, print | Partially conformant — see §5 |
4. Automated measures
The assurance is a build gate, not a periodic audit, so a regression cannot reach the published site between reviews.
What runs. scripts/a11y_check.py serves the built book,
drives it in headless Chromium, and runs axe-core
against the rule tags wcag2a, wcag2aa, wcag21a, wcag21aa and section508.
Where it runs.
- Locally, as
make a11y. The target depends onbuild, so it can never audit a stalebook/. - In continuous integration, as the Check accessibility step of
.github/workflows/mdbook.yml, positioned between the build and the upload. A violation on a gated page fails the job, and nothing is published. The site cannot regress into non-conformance without the deploy stopping.
What it gates versus reports. A violation on a page authored here fails the build. Violations on mdBook’s generated pages are printed but do not fail it, because they originate upstream and cannot be corrected from this repository; gating on them would stop every deploy for a defect we cannot fix. They remain visible in each build log and are tracked in §5.
Verified in both directions. The gate is exercised for false negatives as well as
false positives: removing the lang attribute from a page causes the build to fail, and
restoring it causes it to pass. A check that cannot fail provides no assurance.
Checks performed by hand, because automated tools cannot evaluate them, and repeated when layout or type changes:
- 1.4.10 Reflow — no horizontal scrolling at 320 CSS pixels.
- 1.4.12 Text Spacing — no clipping or overlap when line height, letter spacing, word spacing and paragraph spacing are overridden to the criterion’s values.
- 1.4.4 Resize Text — no loss of content at 200%.
- 2.4.1 / 2.4.7 — the skip link is the first tab stop and becomes visible on focus; focus indicators are visible throughout.
- 1.4.3 Contrast — computed ratios for every foreground/background token pair in both light and dark themes, against the 4.5:1 threshold for body text.
The limits of this. Automated testing detects a minority of accessibility barriers — commonly estimated at a third to a half. A clean axe run is evidence of the absence of machine-detectable defects, not of usability for disabled readers. Testing with actual assistive technology, and by disabled users, is not currently part of this process and would strengthen it materially.
5. Known non-conformances
All three arise in mdBook’s generated output rather than in content authored here. Each is reported upstream; none is fixable from this repository without overriding mdBook’s templates.
| Defect | Criterion | Where | Upstream |
|---|---|---|---|
Sidebar toggle is a <label> carrying ARIA attributes not permitted on that element | 4.1.2 Name, Role, Value (A) | every generated page | #2615, fix proposed in PR #3078 |
| No bypass block to skip the repeated sidebar and header | 2.4.1 Bypass Blocks (A) | every generated page | #2107, fix proposed in PR #2144 |
| Scrollable code and table regions are not keyboard focusable | 2.1.1 Keyboard (A) | chapters with wide code or tables | #1789 |
Remediated, not merely absent. mdBook renders Markdown task lists (- [ ]) as
<input disabled type="checkbox"> with no accessible name, failing 4.1.2 Name, Role,
Value (A). The setup checklist used that syntax and carried eight instances. It is now
written as a plain bulleted list, which reads the same and removes the defect from this
site entirely. The underlying mdBook bug is reported upstream as
#3212 and would return if task-list
syntax were reintroduced, so it is recorded here rather than forgotten. The build now
rejects that syntax, so the claim in this paragraph cannot quietly become false.
PR #3078 is mergeable and awaiting review; PR #2144 currently conflicts. Neither has
merged, so remediation here does not depend on upstream: mdBook supports replacing
theme/index.hbs, which would let the first two be fixed locally ahead of the April 2027
date. That carries its own maintenance cost, since an overridden template pins this
repository to a snapshot of mdBook’s markup and can regress on upgrade.
6. Reporting a problem
If any part of this material is inaccessible to you, email sullivan@virginia.edu with the page address and what went wrong. Reports are acted on, and a barrier that blocks access to course content is treated as urgent regardless of whether it appears above.
7. Review
This statement is reviewed whenever the accessibility gate changes, when mdBook is upgraded, and at the start of each semester. The upstream issues in §5 are re-checked at each review.