A 2.2 second split between the direct and relay paths
2026-08-11
A soak meant to validate the relay found the direct path was the broken one, then the instrument built to test a fix turned out not to measure the thing at all.
The plan was to pay off a field-verification debt on the relay path with a real muted AVPlayer. The measurement found that the direct path was the broken one. Two two-minute soaks ran against a live room, 24 samples each, through scripts/soak-playback.swift, which computes wall clock minus the PROGRAM-DATE-TIME under the playhead, so the number is end-to-end delay and not distance from a playlist edge. The relay path sat at 3.33 seconds and passed. The direct path sat at 1.17 seconds and failed, against a declared target of 3.000 seconds. Both logs are committed under docs/receipts because the contract asks for the log, not a claim about where a player sat, and .log was in .gitignore until then.
The direct path serves the exact manifest form the contract records as correct: EXT-X-START:TIME-OFFSET=-3.000,PRECISE=YES on the multivariant playlist, 500 ms segments, 150 ms parts, a 0.9 second PART-HOLD-BACK floor. 1.17 seconds is roughly hold-back plus the packaging floor, which is where a player lands when the attachment pin does nothing at all. It reproduced under forced relay and again in clean auto/direct, so it was not the mode override. The relay's 3.33 seconds is near the target by accident: nothing authors an attachment point on that side, since contribute.cycle reads the multivariant only to learn the variant name and RewritePlaylist adds the pin only to a playlist carrying EXT-X-STREAM-INF. Relay is direct plus the relay hop. A room holding both kinds of guest is about 2.2 seconds out of sync with itself, which is the single thing internal/schedule exists to prevent.
The instrument meant to validate a candidate fix turned out not to measure the thing. Three more soaks through scripts/bench-playlist-proxy.py on the same live room returned 3.16s with no pin at all, 3.12s with production's master-only pin, and 3.20s with the pin on both playlists. All three passed, while the same harness on the real guest path returned 1.17s and failed. It was not manifest staleness: newest PDT was 0.88s old through the proxy and 0.87s direct. A player falls behind a synchronous Python proxy that cannot keep up with LL-HLS part fetching and lands about 3s back regardless of input. The proxy also carried no MediaMTX session cookie, so every media playlist came back 401 and its media-tier rewrite had never executed once. That casts doubt backward: the earlier record of the D=3 form being re-proven at 3.11s sits squarely inside the band this proxy returns for any manifest, including one with no pin.
The decision was to measure and document, deliberately not to fix. Any change to hold-back, EXT-X-START, room delay or segment shape is gated on a soak that passes before a build moves plus a supervised go-live test, and the three seconds is not a sync target: it was bought as buffer after a set at Shack 15 produced constant random cutoffs. Lowering the declared target to the number direct sits at today would bring the dropouts back. That makes 1.17s worse news than it first looked, since the missing cushion is on the path nearly every guest uses.