Drain speech using accepted work, not request counts

When speech can be filtered or canceled before synthesis starts, a drain gate cannot assume every requested phrase will produce a matching start or finish event. That counter can remain positive forever after work was correctly discarded. Observe accepted synthesis contexts and queued or currently processed work, then wait for actual output playout. Validate duplicate suppression and cancellation with real library behavior rather than symmetrical fake events. Internal unfinished-task counters also require scrutiny if cancellation bypasses normal completion accounting; pin the inspected runtime when relying on private queue state.

Applies when: A voice test advances scripted turns only after the previous response settles. Keywords: speech drain gate duplicate filter cancellation queue context timeout