NVDA 2023.3 throws stale announcements on the Web Widget v2.4.1. [screenshot attached] Architect flow runs a Set Value node to swap custom_attributes.prompt_text. The widget UI flips the text immediately, but the screen reader locks onto the old prompt. Keyboard nav works fine, focus trap holds, which is solid for our WCAG compliance checks. aria-live region isn’t firing on the Architect state push. Console is empty.
Has anyone else hit this with the agent desktop A11Y setup? I’m trying to track down if this is a known WCAG compliance gap in GC or if there’s a workaround to force the live region to re-evaluate. Quick clarifying question: are you all seeing this on the latest widget build, or is it tied to how the Set Value node handles dynamic text swaps?
The usual trap here is assuming the Architect state push automatically triggers a DOM repaint for assistive tech. NVDA caches the previous text node until a mutation observer fires, and the widget’s internal websocket handler delays the aria-live assertion by roughly 400ms. That window is enough for the screen reader to lock onto stale content. I see this on BYOC trunk setups often, but my capture is incomplete: [syslog] state_sync: pending...
Treat the state push like an RFC 3261 NOTIFY. The client needs a hard reset on the live region before the new payload arrives. Add a small timeout wrapper in the custom widget script, or force a aria-live="assertive" toggle right after the Set Value node executes.
{
"node_type": "Set Value",
"attribute": "custom_attributes.prompt_text",
"value": "{{new_prompt}}",
"post_action": {
"script": "setTimeout(() => { document.getElementById('widget-live-region').setAttribute('aria-live', 'off'); requestAnimationFrame(() => document.getElementById('widget-live-region').setAttribute('aria-live', 'assertive')); }, 50);"
}
}
The SDP negotiation on the websocket layer doesn’t care about accessibility tags, but the browser’s accessibility tree does. ICE candidate gathering for the media stream sometimes blocks the main thread during initial handshake, which delays the attribute swap. Check the network tab for the application/json payload timing against the aria-live update. How do I configure the Ribbon SBC to prioritize this traffic over SRTP?
SIP trace from a similar state-sync delay shows the 200 OK returning before the client actually parses the custom attributes:
INVITE sip:widget@edge.genesis.com SIP/2.0
Contact: <sip:agent@192.168.1.50>
Content-Type: application/sdp
v=0
o=- 12345 12345 IN IP4 10.0.0.5
s=-
c=IN IP4 10.0.0.5
t=0 0
SIP/2.0 200 OK
Contact: <sip:widget@edge.genesis.com>
Content-Type: application/json
{"custom_attributes":{"prompt_text":"New prompt loaded"}}
The browser accessibility bridge waits for the JSON parse to complete, then NVDA reads the old cache. Forcing the attribute toggle breaks that cycle. Set the timeout to 10ms if the delay is too noticeable. Adjust the SBC routing profile if the websocket drops packets during high concurrency. Check the edge logs for dropped NOTIFY frames when the queue spikes. My E911 location payload also gets stuck here, is this normal for WebRTC sessions? The log cuts off: edge_proxy: queue_full...