Parent
#39 — PRD: AI Radio — Host-driven Channel experience with chat timeline
What to build
Wire the text input bar on the Radio Screen to the Intervention flow. When the user submits text, it is classified, appended to the chat timeline, and handed to the Programme Manager to regenerate the Programme.
Intervention classification: the Host Service already accepts an Intervention with a kind field. Classification can be done client-side with a lightweight heuristic, or by asking Claude as part of generateProgramme. For v1, pass the raw text as kind: 'free-instruction' — the Host interprets it. Track Requests and Mood Changes are handled by the Host's prompt logic without needing a separate client-side classifier.
Flow:
- User types and submits text in the input bar
{ type: 'user-turn', text, timestamp } appended to Chat Timeline immediately — input clears
- A loading indicator appears in the chat (e.g. "Host is preparing the next set...")
programmeManager.handleIntervention({ kind: 'free-instruction', text }) is called
- When the Host responds,
{ type: 'host-turn', text: acknowledgement, timestamp } is appended (the acknowledgement text comes from the Host's Claude response)
- Current Track finishes, new Programme begins
The mic button remains a stub in this slice (wired in #50).
Acceptance criteria
Blocked by
Parent
#39 — PRD: AI Radio — Host-driven Channel experience with chat timeline
What to build
Wire the text input bar on the Radio Screen to the Intervention flow. When the user submits text, it is classified, appended to the chat timeline, and handed to the Programme Manager to regenerate the Programme.
Intervention classification: the Host Service already accepts an
Interventionwith akindfield. Classification can be done client-side with a lightweight heuristic, or by asking Claude as part ofgenerateProgramme. For v1, pass the raw text askind: 'free-instruction'— the Host interprets it. Track Requests and Mood Changes are handled by the Host's prompt logic without needing a separate client-side classifier.Flow:
{ type: 'user-turn', text, timestamp }appended to Chat Timeline immediately — input clearsprogrammeManager.handleIntervention({ kind: 'free-instruction', text })is called{ type: 'host-turn', text: acknowledgement, timestamp }is appended (the acknowledgement text comes from the Host's Claude response)The mic button remains a stub in this slice (wired in #50).
Acceptance criteria
user-turnmessage to the timeline immediatelyhost-turnacknowledgement message appears after the Host respondsBlocked by
handleIntervention)