WebRTC softphone mediaState flipping to inactive with missing webRtcSessionId in JWT payload

Problem
Softphone media state flips to inactive right after active in the notification stream, and the Express listener keeps choking on a missing webRtcSessionId. GC sits at 2025-06.150.0. Node 20.11.0 runs the webhook router behind an ALB. The WebSocket Notification API catches the interactions.update event, but the JWT payload drops the media context entirely. Doing jack all on the validation step.

app.post('/webhooks/gc/interactions', (req, res) => {
 const decoded = jwt.verify(req.headers.authorization.split(' ')[1], publicCert);
 if (!decoded.mediaState || !decoded.webRtcSessionId) {
 console.error('Missing media context', decoded);
 return res.status(400).send('Bad payload');
 }
});

Console spits out Missing media context { eventType: 'interactions.update', id: 'f8e2a1b9', timestamp: '2024-05-12T14:22:01.000Z' }. The softphone connects fine in the GC web client, mic stays hot, but the backend never gets the stream handshake. Checked the Architect flow routing settings, everything points to the standard WebRTC media handler. Latency to the Chicago edge sits around 12ms, so network jitter isn’t the culprit.

Notification subscription scope is set to interaction:read and user:read. Don’t need to bump the JWT cache TTL, already tried that, no dice. The streamId field shows up in the raw HTTP request body but vanishes after jwt.decode. It’s probably a signing key rotation issue on the platform side, or the notification service is stripping media attributes before encryption.

Raw trace output:

[2024-05-12T14:22:01.043Z] WARN: token payload lacks mediaState
[2024-05-12T14:22:01.044Z] INFO: forwarding to dead-letter queue