From Ryan's physical field test, 2026-08-30 (part of #485).
We are getting a lot of beeps on crossing … This must be a symptom of beep on every crossing, we should put a cooldown on beeping though I think, that way if we get a crossing tone, we should probably not take another tone with some number of ms.
What
#397's tone-on-every-crossing is working as designed — and the design needs one amendment: when one physical pass produces a burst of crossings (reflections milliseconds apart), the RD must hear one tone, not a serialised pip storm. RaceAudioPlayer today only staggers pips ≥80 ms apart and drops beyond a 600 ms lookahead (raceAudio.ts:76, :84) — that is queue hygiene, not a debounce; a 6-crossing burst still plays ~6 pips.
How
Suppress same-competitor crossings within a cooldown of the last sounded tone for that competitor. Best site: the sweep in useCrossingTones (lapCallouts.svelte.ts:235-239) — it already holds crossing.at, crossing.competitor and crossing.disposition in hand (disposition is on the wire: LiveCrossing.ts). #397's intent (distinct tones per case, rejected crossings audible) stands; only bursts collapse. Cooldown on the order of the enter/exit settle — start ~1 s, well under any real lap.
Note: with the min-lap floor fixed (sibling field-finding issue) the bursts become RejectedTooShort rather than counted laps, but they still each pip today — both fixes are needed.
From Ryan's physical field test, 2026-08-30 (part of #485).
What
#397's tone-on-every-crossing is working as designed — and the design needs one amendment: when one physical pass produces a burst of crossings (reflections milliseconds apart), the RD must hear one tone, not a serialised pip storm.
RaceAudioPlayertoday only staggers pips ≥80 ms apart and drops beyond a 600 ms lookahead (raceAudio.ts:76,:84) — that is queue hygiene, not a debounce; a 6-crossing burst still plays ~6 pips.How
Suppress same-competitor crossings within a cooldown of the last sounded tone for that competitor. Best site: the sweep in
useCrossingTones(lapCallouts.svelte.ts:235-239) — it already holdscrossing.at,crossing.competitorandcrossing.dispositionin hand (disposition is on the wire:LiveCrossing.ts). #397's intent (distinct tones per case, rejected crossings audible) stands; only bursts collapse. Cooldown on the order of the enter/exit settle — start ~1 s, well under any real lap.Note: with the min-lap floor fixed (sibling field-finding issue) the bursts become RejectedTooShort rather than counted laps, but they still each pip today — both fixes are needed.