The drop beacon reports which path ICE actually chose

Featurekamo-internal
Shipped
August 26, 2026 at 2:41 AM UTC
Author
kamo
Commit
3c55635

The beacon shipped iceCandidateType as a permanently-null field. That is worse than omitting it: it makes the telemetry look more informative than it is, and this is the one measurement that can redirect the whole line-window project. The web softphone builds its peer connection with one hardcoded public STUN credential payload has never carried it. So a member behind a symmetric NAT, a VPN or carrier CGNAT can fail to establish media with nothing to fall back to, and what they report is "the call dropped". After the fact that is indistinguishable from "I hit refresh", and the two have completely different fixes — one of them two lines of TURN config rather than a new browsing context. `relay` / `srflx` / nothing is the evidence that separates them. The SIP.js path reuses the candidate pair its existing diagnostic dump already computes, so it costs no extra getStats; the RingCentral path samples raw.rtcPeerConnection on answer. A null reading is RECORDED rather than skipped — "ICE selected no pair" is the relay-less failure and the most valuable reading available — and callDurationSeconds separates it from "the call ended before we sampled". Also records in the plan what actually shipped, including the Task 6 guard that differs from the plan as written.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing