diff --git a/CLAUDE.md b/CLAUDE.md index b7176c7..b652632 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -280,10 +280,11 @@ Rules that took blood to find: rearmThresholdBlocks=100`) before re-arming; emit silence in the interim. 2. **Role-aware buffer depth.** Listener gets 4s (lean-back, latency doesn't - matter, ride out wiggle-stalls). Speaker / cohost / host get 0.5s (small - enough for conversation, big enough to smooth ordinary jitter). Mesh - peers always 0.5s. `playoutDelayForRole(role)` and `SPEAKER_PLAYOUT_DELAY_SEC` - in `web/zebra-spaces.html`. + matter, ride out wiggle-stalls). Speaker / cohost / host get **0.7s** + (`SPEAKER_PLAYOUT_DELAY_SEC` in `web/zebra-spaces.html` — bumped from + 0.5s when we removed the mesh→worklet swap; the worklet cushion now + absorbs the 200ms host-wiggle unaided on the SFU receive path). + `playoutDelayForRole(role)` returns the active target. 3. **Worklet retarget on role change**, don't rebuild. Post `{cmd:'retarget', targetSeconds}` to the worklet's port — recomputes @@ -315,3 +316,97 @@ who don't have AudioWorklet support — natural deep buffer on the `