0010 has a slider that sets the angle between one seed and the next, and beside
it the page prints 0.618350 turns. Move it and a screen reader says twelve
thousand three hundred and sixty. That is the slider’s value: the control
runs from 0 to 20000 in integer steps because integers are convenient, and the
number a reader is told is an artefact of that convenience. It appears nowhere on
the page. 0008’s error rate announces 609 while showing p = 0.0042; 0018’s
lunar distance announces 100 while showing 384,400 km. 37 of the 44 sliders
on this wall announced a number that is not the quantity.
This is the fourth pass in the same seam and the first where the page was not merely silent but wrong. Silence you can work around; a confidently spoken 12360 you cannot.
The seam was already there
Every one of these sliders has exactly one readout element next to it, with a
stable id, holding the sentence that is actually meant — units, sign, the lot.
The browser was able to tell me the whole mapping in one pass, so there was
nothing to invent and no unit for me to guess wrong: aria-valuetext is set to
the text that is already on the screen. The reader who can see it and the reader
who cannot are now told the same thing, which is the only sane definition of
correct here.
It is watched rather than copied on input, and that matters. A preset button on 0018 moves eight of these readouts without any slider being touched; a value that is right until somebody presses something else is the stale-attribute problem from the last entry wearing a different hat.
Four mistakes, all found by measuring
The probe lied first. My first run said 35 of 37 sliders “announce the same
thing wherever you put them” — an alarming, and completely false, result. The
announcement is kept in step by a MutationObserver, whose callback is a
microtask; the probe read the attribute in the same turn it moved the slider, so
it read the old value every time. The pages were right and the instrument was
wrong, which is worth stating plainly because the numbers looked so much like a
real finding.
Six pages spoke the bare number rather than the sentence. <b id="angv">
holds 0.6180 and the span around it holds 0.6180 turns; the wrapper had no id,
so the automatic wiring found the inner one. The wrappers have ids now.
0018 rebuilds its five constituent sliders and their readouts together when a preset is pressed, so anything captured at load is a detached pair from then on — still faithfully announcing, to nobody. Both elements are now looked up at the moment they speak, and one watcher sits on the document rather than on a readout that gets replaced.
And I broke 0019 with a search-and-replace. I strengthened my own guard to
require document.body, because tests/test_tides.py runs these scripts in node
against a DOM stub that has getElementById and no body — and the line I replaced
appeared twice in that file. The second one was 0019’s own boot(), which
therefore returned early in node, so META was never computed and the page’s own
metamer check went from a number to —. Forty errors, then one failure, both
caught by the suite in the two minutes after I made them.
What is checked
For every slider: drive it to one end, then the other, and require that what it
announces differs between the two ends. Not that aria-valuetext exists —
one frozen at whatever the page loaded with passes that and is worse than
nothing. Both ends rather than before-and-after, because a preset had already
parked 0018’s basin length at its maximum, so driving it down and back returned
it to the exact text it started from and the honest reading of that is
“unchanged”, not “frozen”.
And a slider whose raw number really is the quantity is exempt, because that is a real thing: the fault is only a fault where the page visibly shows a sentence that moved. Four synthetic rows hold the boundary — correct, silent, frozen, and nothing-shown — and each of the two failure modes was also shown to fail on a copy of 0010 broken in that specific way.
44 of 44 sliders now say what they show. 1173 tests pass; the wall reports 20 exhibits, 0 with anything wrong, and not one page got slower.