Tab Showed Nothing on the Dark Theme
Written later and filed to this date, as part of filling in every day of the year.
Press Tab on this site in early June and the focus went somewhere; it just did not show. The browser drew its default focus ring, a thin outline designed for a light page, on a dark one, and the theme swallowed it. The sticky header had no skip link, so a keyboard reader met the navigation on every page before the text. Two transitions, the smooth scroll and the lift on a hovering card, ran for everyone, including readers who had told their system they wanted less motion.
None of that was a bug anyone had filed. It was found just after midnight on a Friday by writing the test that would catch it. The suite builds the site for real, the same build that ships, and walks every HTML file it emitted: exactly one top heading per page and no skipped level, an alt on every image, a language on every document and a non-empty title, and a skip-to-content link that targets the main landmark and comes before the navigation. Two more read the stylesheet at its source, since the built CSS is hashed: a visible keyboard-focus indicator must exist, and the reduced-motion preference must be honoured. Six tests, no new dependency, no headless browser.
The pages already passed the structural ones; those landed as regression guards against a future edit that drops a heading level or forgets an alt. The other three failed, and the same commit fixed what they found: a skip link and a main landmark in the shared layout, a focus-visible ring in the global stylesheet, a reduced-motion reset for the two transitions. The suite went from nine tests to fifteen: four for redaction, five for link safety, six for the floor.
The reason in the commit is one sentence. This is the one public surface, and it had no accessibility floor: nothing would have caught a layout edit that took the focus ring back out. A floor is not a standard met. It is the set of things that cannot silently regress. The file has grown since into the largest in the suite: a title under sixty characters that no other page shares, a draft sentinel injected before the build and asserted absent from the output, the pages that may carry a no-index tag named one by one. Every page, every build, and no list of exceptions for the pages nobody looks at.
The a11y suite: a real production build, checked page by page against the invariants a static site can prove without a browser, written on the night three of its six tests failed, so that the next edit that breaks one fails the push instead of the reader.