Skip to content

iOS chat streaming is effectively silent to VoiceOver #317

Closed

Description

@yxlyx

Summary

The iOS streaming state has no meaningful VoiceOver output. While waiting for the assistant, the UI presents three animated Circle shapes and a blank assistant message, without an accessibility label or announcement. Reasoning/text mutations are also not exposed as a live-region update.

A VoiceOver user can send a message and receive no indication that work started, is still in progress, completed, or failed until manually navigating the transcript.

Root cause

TypingIndicator (apps/ios/Graff/Sources/ChatView.swift:251-268) is purely visual and has no combined accessibility element, label, value, or live-region behavior. MessageBubble renders it whenever assistant text is empty. Streaming state changes and appended content do not trigger an explicit accessible status announcement.

Expected behavior

  • Expose one stable accessibility element such as “Assistant is responding.”
  • Avoid exposing the individual decorative dots.
  • Announce terminal completion/error without repeatedly speaking every token.
  • Make the composer’s disabled/streaming state and stop action understandable.
  • Add an accessibility regression test/snapshot for idle, streaming, completed, and failed states.

Related

#59 tracks adding a real stop/interrupt action. This issue covers the missing assistive-technology status semantics.

Activity

  1. justrach commented on Jul 31, 2026

    @justrach
    Owner

    Fixed in v0.0.226 (PR #328).

    VoiceOver support added. apps/ios previously had zero accessibility modifiers anywhere - streaming state is now announced and message bubbles and the typing indicator are labelled.

    Tests went 449 -> 575 on this release; every Zig fix carries a pinning test that was falsified independently (revert the production change, confirm the test goes red naming itself, restore).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions