Files
LlamaCasty/TASKS/task-34-scheduled-streams.md
T
gramps 87509bcf99 docs: restructure TASKS.md into a catalog — one file per task in TASKS/
TASKS.md is now the index (status table, open items, research pointer).
33 files: 32 task files + 1 research facts file. The full take-saga
narrative and all design decisions are preserved verbatim; the catalog
makes the queue readable without opening every task body. Schema and
AGENTS.md updated to reflect the new layout.
2026-09-05 16:31:46 -07:00

2.5 KiB

TASK 34 — Scheduled streams, Text-drawer version (queued 2026-09-01; option (b) with the creator's placement)

Catalog: TASKS.md — status and requirements live here.

Scope ruling (2026-09-01): this is the whole scheduling story — announce a LIVE show (countdown watch-page + subscriber notifications), then the creator shows up and pushes. "Going live is our schedule." Scheduled playout of pre-recorded files: discussed and DECLINED by the creator. Premiere/upload scheduling: out of product (see closed list).

Goal: announce "Friday 8pm" from inside the app — YouTube notifies subscribers and runs the channel countdown; come Friday, one click goes live into the scheduled broadcast. Scheduling is a "my channel" concern, so it lives in the always-visible Text drawer, not the go-live modal.

  1. ☐ Drawer gains ☑ Scheduled livestream + date/time (replacing the read-only "Scheduled Start" row). Checking + Save creates the broadcast: insert liveBroadcasts with a future scheduledStartTime, bound to the cached reusable stream — the drawer's Save path grows its first create operation (today it can only update an existing broadcast).
  2. ☐ Invariant: at most one open scheduled broadcast; unchecking before airtime → liveBroadcasts.delete (legal in created/ready).
  3. ☐ Adoption: go-live checks for the open scheduled broadcast and pushes into it instead of inserting a new one. Mid-stream title/desc edits ride the existing Update path (unchanged).
  4. ☐ LiveBroadcastFormViewModel owns IsScheduled + ScheduledStart (nullable), persisted with the other Broadcast.* keys; local time in, RFC3339 offset on the wire — the timezone edge is where the bugs will live: test it (DST boundary, non-UTC creator).
  5. ☐ Research flags (cite before building — spin guard): (a) pushing before the scheduled start with enableAutoStart — live immediately or held? Decides a "starting early — it goes live NOW" confirmation. (b) delete semantics for a ready broadcast bound to a reusable stream.
  6. ☐ Test (the ONE): schedule → persists + inserts (fake service captures a future scheduledStartTime
    • boundStreamId); start → adopts instead of inserting; uncheck → delete called.
  • Test-phase note: dark by design while the visibility lock holds (Private notifies nobody); the creator can still exercise insert/adopt/cancel. Full shine arrives with TASK 36's unlock — pleasing coupling, deliberate.