Skip to content

Add html-proofer link-check gate (+ complementary check_a11y) (#110)#113

Merged
jonfroehlich merged 5 commits into
mainfrom
feat/htmlproofer-gate
Jun 23, 2026
Merged

Add html-proofer link-check gate (+ complementary check_a11y) (#110)#113
jonfroehlich merged 5 commits into
mainfrom
feat/htmlproofer-gate

Conversation

@jonfroehlich

@jonfroehlich jonfroehlich commented Jun 23, 2026

Copy link
Copy Markdown
Member

What

Stands up an off-the-shelf content-QA gate (html-proofer) alongside a slimmed check_a11y, and fixes the pre-existing issues they surfaced. Implements the tooling direction from #110 (use industry-standard tools, not bespoke scripts).

Two complementary Content lint jobs

Job Tool Scope Catches
media-a11y scripts/check_a11y.py markdown source YouTube <iframe> w/o title=, <video> w/o aria-label, empty image alt
link-check html-proofer built _site/ broken internal links, broken #anchors, missing-alt, malformed HTML

They don't overlap: html-proofer permits empty alt="" and has no notion of iframe/video labels, so check_a11y stays as the policy check for those (the a11y analogue of check_seo_frontmatter). html-proofer adds broken-link/anchor checking we never had. External link checking is disabled (slow/flaky) — a candidate for a separate non-blocking job later.

Baseline triage (what html-proofer found + fixes)

0 broken links within most pages, but it surfaced real pre-existing bugs, all now fixed:

  • Broken media: fixed arduino/potentiometers.md video path; converted+added the oled.md STEMMA .mov→.mp4.
  • Site-wide: _config.yml aux link //makeabilitylab… → explicit https:// (was flagged on all 121 pages).
  • 13 broken internal links/anchors fixed across esp32/arduino/advancedio/cpx/sensors (wrong relative paths, .md that didn't resolve, stale/mis-cased #anchors, a malformed ((url))). Anchors verified against the built site.

Tracked debt (ignored in the gate, each tied to an issue)

--ignore-files entries in content-lint.yml, each annotated:

Docs

website-dev.md gains an "Accessibility and content QA" section (both gates, authoring rules, and running html-proofer locally incl. the Windows libcurl caveat / WSL2). scripts/README.md re-frames check_a11y as the kept complementary gate.

Part of #110. Closes #110's gate deliverable.

… gate (#110)

Content lint now has three jobs:
- seo-frontmatter (existing): per-page description: policy
- media-a11y: check_a11y.py --ci — source conventions html-proofer can't cover
  (iframe title=, <video> aria-label, lazy empty alt)
- link-check: build the site + html-proofer (broken internal links/anchors,
  missing image alt, HTML validity; external links disabled for stability)

html-proofer turned out NOT to overlap check_a11y (it permits empty alt and
ignores iframe/video), so the two are complementary rather than one replacing
the other. Re-framed check_a11y from "deprecated" to a kept policy gate, the
a11y analogue of check_seo_frontmatter.

Part of #110.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jonfroehlich jonfroehlich added infrastructure Build, deploy, CI, performance, tooling v2.0 Targeted for the Version 2.0 release accessibility Accessibility (a11y): alt text, ARIA, contrast, keyboard/screen-reader support labels Jun 23, 2026
jonfroehlich and others added 4 commits June 23, 2026 10:08
…nerated pages

html-proofer found 0 broken links/anchors and 17 image issues. Resolve them:
- Fix arduino/potentiometers.md video path (../electronics/assets/videos ->
  assets/movies, where AnalogVsDigital.mp4 actually lives).
- Add advancedio/assets/.../AdafruitSTEMMAQT...mp4 (converted from the committed
  .mov; oled.md already referenced the .mp4).
- Ignore (each tracked by an issue, not silent): stale generated nbconvert
  notebooks signals/*/index.html and arduino/accel.html (draft) -> #115;
  WIP esp32/capacitive-touch.html (missing diagrams) -> #114.

Also un-deprecate scripts/README's check_a11y entry (kept as the complementary
media-a11y gate). Part of #110.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…site-dev

CLI array-of-regex options need each pattern wrapped in /slashes/ to be treated
as a regex (a bare string is an exact-path match, so the prior patterns never
matched and the WIP/generated pages weren't actually ignored). Wrap each and
escape internal slashes.

Also add an "Accessibility and content QA" section to website-dev.md (the two
gates and what each enforces, authoring rules, and how to run html-proofer
locally incl. the Windows libcurl caveat / WSL2).

Part of #110.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The prior regex matched only single-level signals/<dir>/index.html and missed
the standalone signals/IntroTo*.html notebooks (and 2-level gesturerec ones).
Match any-depth index.html plus IntroTo*.html so the full generated-notebook
set is excluded (tracked in #115). Part of #110.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Site-wide: change aux_link //makeabilitylab.cs.washington.edu to explicit https
(protocol-relative URL flagged on every page).

Broken links (wrong path / .md not resolving):
- esp32 index+tone: capacitive-touch-sensing -> capacitive-touch (page name)
- cpx/analog-input: series-parallel.md -> ../electronics/series-parallel.md
- arduino/led-on: {{baseurl}}/pages/electronics/leds.md -> ../electronics/leds.md
- advancedio/vibromotor: ../smoothing-input.md -> smoothing-input.md (same dir)
- arduino/buttons: ../electronics/serial-print -> serial-print.md (same dir)
- arduino/fast-analog-read: fix malformed [..]((url)) double-paren link
- website-dev: link .github/workflows/jekyll.yml to its GitHub URL

Stale/incorrect anchors:
- arduino/led-blink3: #blink-without-using-delays -> #blink-without-using-delay
- sensors/hall-effect: lowercase #an-improved-auto-on-nightlight-circuit
- arduino/force-sensitive-resistors: #step-1-build-the-potentiometer-based-led-dimmer
- advancedio/smoothing-input: drop trailing period in #arduino-filtering-libraries
- esp32/iot: #which-pins-can-i-use -> #adc-pins-chip-vs-board (nearest real section)
- advancedio/servo: drop nonexistent #activity-4-led-level-meter (link page instead)

Anchors verified against the built _site. Part of #110.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jonfroehlich jonfroehlich merged commit ac71d4a into main Jun 23, 2026
3 checks passed
@jonfroehlich jonfroehlich deleted the feat/htmlproofer-gate branch June 23, 2026 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accessibility Accessibility (a11y): alt text, ARIA, contrast, keyboard/screen-reader support infrastructure Build, deploy, CI, performance, tooling v2.0 Targeted for the Version 2.0 release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Accessibility / content QA: media sweep + html-proofer gate (V2.0)

1 participant