Essay 35: Automating Accessibility - Curriculum-as-Code & Continuous Integration
When public higher education institutions faced the Department of Justice’s mandate for ADA Title II (WCAG 2.1/2.2 Level AA) compliance, traditional instructional design hit an operational wall. Manually auditing hundreds of Canvas pages, inspecting heading tags in rich text editors, and manually verifying image alt-text lengths across multi-section course fleets is unsustainable.
Sustainable accessibility requires a fundamental paradigm shift: Curriculum-as-Code.
The Shift-Left Accessibility Architecture
In software engineering, “Shift-Left” means catching defects early in the development lifecycle rather than in production. Applying this to course design transforms instructional assets into plain, version-controlled Markdown files audited by automated CI/CD pipelines before deployment.
+------------------+ +-------------------------------+ +-----------------------+
| Plain Markdown | --> | GitHub Actions CI Pipeline | --> | Production Canvas LMS |
| Course Shells | | (Heading & Alt-Text Linters) | | Deployment |
+------------------+ +-------------------------------+ +-----------------------+
Core Audit Guardrails
Our custom Curriculum-as-Code Accessibility Linter enforces deterministic rules across the entire course fleet:
Deterministic Heading Hierarchy (WCAG 1.3.1):
- Canvas LMS reserves
<h1>for page titles. All document content must begin at<h2>. - Strict sequential progression prevents skipping heading levels (e.g., jumping directly from
<h2>to<h4>). - Mixed HTML (
<h1-h6>) and Markdown (#{1,6}) headers are parsed seamlessly.
- Canvas LMS reserves
Concise Image Alt-Text (WCAG 1.1.1):
- All visual elements must include non-empty, descriptive alt text.
- Restricts alt-text length to 120 characters or fewer to maintain efficient screen reader output without cognitive overload.
Structural Delimiter Immunity:
- Structural prompt fences (
###,### STRUCTURAL_DELIMITER) used in clinical AI prompt engineering are safely isolated, preventing false-positive heading skips.
- Structural prompt fences (
Continuous Integration via GitHub Actions
By embedding the linter into .github/workflows/accessibility-audit.yml, every git push or pull request automatically validates 100% of course Markdown assets:
name: Curriculum-as-Code Accessibility Audit
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
accessibility-audit:
name: WCAG 2.2 AA & ADA Title II Compliance Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Run Accessibility Linter
run: python3 scripts/curriculum_accessibility_linter.py .
Summary: Immutable Accessibility Baselines
Treating curriculum as code converts accessibility compliance from an administrative chore into a permanent, automated build baseline. When federal regulations or institutional standards update, automated scripts audit and refactor entire course fleets in seconds—guaranteeing universal access for every resident student.