You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#39 — PRD: AI Radio — Host-driven Channel experience with chat timeline
What to build
Build the Radio Screen UI and the Chat Timeline Store. In this slice, the Host is not yet wired — use a stub Programme of local Tracks (no Interludes) to keep the screen live during development.
Chat Timeline Store (Radio context, @flow/radio or apps/mobile):
In-memory Zustand store (not persisted)
messages: ChatMessage[] — append-only ordered list
appendMessage(message: ChatMessage) → void
clearTimeline() → void
Write unit tests: given a sequence of appendMessage calls, assert messages contains the right items in the right order
Radio Screen (mobile app) — three vertical zones:
Top — Now Playing bar: Track title, artist name, play/pause button. Waveform visualiser is a placeholder ([~~~]) in this slice — filled in by a later issue (Waveform visualisation in Now Playing bar #49)
Middle — Chat timeline: FlashList (or FlatList) rendering ChatMessage items. now-playing messages are pushed to the timeline each time a new TrackSegment begins playing. Auto-scrolls to the latest message.
Bottom — Input bar: Text input field + microphone icon button (mic button is a stub — no action yet). Submitting text is a stub in this slice — wired in the Intervention issue (Interlude playback + chat timeline sync #47).
The stub Programme is just the first N tracks from queryCandidateSet with no Interludes. The goal is a navigable, scrollable screen with live now-playing cards.
Acceptance criteria
Chat Timeline Store exports messages, appendMessage, clearTimeline; unit tests pass
Radio Screen renders with the three-zone layout
Now Playing bar shows the current Track title and artist
A now-playing ChatMessage is appended and rendered in the timeline each time a new Track begins
Timeline auto-scrolls to the latest message
Text input and mic button are present in the bottom bar (stubs OK for this slice)
Navigating back to Channel Selection stops playback
Parent
#39 — PRD: AI Radio — Host-driven Channel experience with chat timeline
What to build
Build the Radio Screen UI and the Chat Timeline Store. In this slice, the Host is not yet wired — use a stub Programme of local Tracks (no Interludes) to keep the screen live during development.
Chat Timeline Store (Radio context,
@flow/radioorapps/mobile):messages: ChatMessage[]— append-only ordered listappendMessage(message: ChatMessage) → voidclearTimeline() → voidappendMessagecalls, assertmessagescontains the right items in the right orderRadio Screen (mobile app) — three vertical zones:
[~~~]) in this slice — filled in by a later issue (Waveform visualisation in Now Playing bar #49)FlashList(orFlatList) renderingChatMessageitems.now-playingmessages are pushed to the timeline each time a new TrackSegment begins playing. Auto-scrolls to the latest message.The stub Programme is just the first N tracks from
queryCandidateSetwith no Interludes. The goal is a navigable, scrollable screen with live now-playing cards.Acceptance criteria
messages,appendMessage,clearTimeline; unit tests passnow-playingChatMessage is appended and rendered in the timeline each time a new Track beginsBlocked by