packages/collect/src/probes/speech.ts is one of the 19 probes. In Chrome, speechSynthesis.getVoices() often returns [] on the first call. The list only fills in after the voiceschanged event, and how long that takes depends on the OS voice backend, sometimes a few hundred ms.
So does the probe wait for voiceschanged (with a timeout), or does it read the list once and move on? If it reads once, a normal desktop Chrome could randomly report zero voices, and whichever check uses the speech data would flag a real browser as a liar on some runs but not others. That's the kind of flaky result that makes a --min-score gate unusable.
The headless side of this is related but separate. On a Linux CI box with no speech-dispatcher, zero voices is the true answer. Is "no voices" treated as unknown/skipped, or does it count as a mismatch against a Windows/macOS UA? If it's the second, a Linux runner pretending to be nothing loses points for a missing system package, not for lying.
It'd help to know which check(s) actually use the speech data, and what counts as an empty result.
packages/collect/src/probes/speech.tsis one of the 19 probes. In Chrome,speechSynthesis.getVoices()often returns[]on the first call. The list only fills in after thevoiceschangedevent, and how long that takes depends on the OS voice backend, sometimes a few hundred ms.So does the probe wait for
voiceschanged(with a timeout), or does it read the list once and move on? If it reads once, a normal desktop Chrome could randomly report zero voices, and whichever check uses the speech data would flag a real browser as a liar on some runs but not others. That's the kind of flaky result that makes a--min-scoregate unusable.The headless side of this is related but separate. On a Linux CI box with no speech-dispatcher, zero voices is the true answer. Is "no voices" treated as unknown/skipped, or does it count as a mismatch against a Windows/macOS UA? If it's the second, a Linux runner pretending to be nothing loses points for a missing system package, not for lying.
It'd help to know which check(s) actually use the speech data, and what counts as an empty result.