A tester told us the save confirmation was getting cut off mid-sentence. Not every time. Only when she moved through the form quickly with the keyboard.
The text was right. The timing was not.
This lives in liveregion, our open-source library for screen-reader announcements. The driver keeps a queue, a paint callback, and exactly one timer. You call announce, it paints the message into the polite or assertive slot, then arms a timeout that clears the region after a set hold, so the same text can be announced again later.
What the form was doing: clearing a stale validation state by announcing an empty string, then announcing the real confirmation a moment later.
The empty announce read as nothing. It armed the timer anyway. So when the real message landed, it got painted into a region whose drain was already counting down, and it held for whatever was left of someone else's clock instead of its own full hold.
Invisible in review. Invisible in the unit tests too, because they asserted what was painted, not how long it survived.
The fix was ordering two checks before arming anything.
First: if nothing is currently showing, return. A drain has nothing to clear, so there is no reason for a clock to exist. The queue already ignores empty and whitespace-only messages, so a blank announce now queues nothing and arms nothing.
Second: if a timer is already armed, return and leave it alone. Otherwise a burst of announces keeps pushing back the hold on whatever the user is still listening to.
Only past both of those does the driver arm the timeout, which nulls itself, advances the queue, repaints, and pumps again, stopping at that same first check once the queue has drained.
The rule we took out of it: a timer that exists to clear something must be armed by the presence of that something, not by the event that happened to come before it. Probably the same shape as every stale-lease bug we have hit in backend work, where the clock outlived the thing it was supposed to be about.
If you ship accessible UI, it is worth knowing whether your tests assert what the live region said, or also how long it stayed there.