{
  "id": 9597427,
  "title": "A Stream Retry Needs a Fresh Announcement, Not a Rewritten Transcript",
  "url": "https://urgent.news/2026/09/24/a-stream-retry-needs-a-fresh-announcement-not-a-rewritten-transcript",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-24T17:55:41.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/babycat/a-stream-retry-needs-a-fresh-announcement-not-a-rewritten-transcript-3p75"
  },
  "original_language": "en",
  "account": "A streaming chat interface required a new announcement after a failure, rather than simply rewriting the existing transcript. When a chat answer stalled, the author expected a fresh spoken attempt after retrying, but instead the cancelled fragment was combined with the new sentence. The primary \"Stop\" button remained unchanged even though the request had failed, and the accessibility tree still contained the previous text. The issue arose because the transcript and its live region were not updated correctly on retry. The transcript lived in a single paragraph, and when cleared, the same node was reused, leading to listeners perceiving the rewrite as a continuation of the old message. The primary button's accessible name, derived from a closure, did not update until a later paint, causing confusion for keyboard users. The author built a small streaming panel for a browser chat, with keyboard-operable controls and a polite live region. Upon retry, the transcript was cleared and new tokens were added, but the visual reset did not signal a new message to all assistive technologies. The fix was to separate the transcript from the announcer, updating the announcer node on every phase change. This allowed the transcript to update freely while the announcer received one short sentence per transition, ensuring clear communication for all users.",
  "summary": "While I was keyboard-testing this single-file demo, I retried a chat answer that had stalled after one short clause. I pressed Escape to cancel, then activated Retry, and I expected a clean announcement of a new attempt. Instead the reader spoke the cancelled fragment and the new sentence as if they were one paragraph. The primary button still announced Stop, even though the request had already…",
  "key_points": [
    "Streaming chat interface required fresh announcement, not rewritten transcript.",
    "Cancelled fragment combined with new sentence due to incorrect transcript update.",
    "Fix involved separating transcript from announcer for clear communication."
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}