Every status label below matches the named route's real, current behavior -- never softened, never strengthened.
1 · Schedule a private broadcast
An adviser, co-adviser, or admin can create and manage a scheduled broadcast for their school, gated behind a per-school module toggle -- a school where the module is off looks byte-identical to today. A minor account (a coarse 'student' role) is hard-denied from scheduling or managing a broadcast, fail-closed, because a broadcast can capture student images. A private broadcast's status advances scheduled to live to ended, or to canceled from either open state; an illegal transition is refused. This is the fully-wired path: real data, stored and read end to end, for a private audience.
Built and wired -- module-gated, adviser/admin only, minors hard-denied
Named contract: apps/api/src/routes/livestream-broadcast.ts
2 · Publish a broadcast beyond private
Moving a broadcast to unlisted or public exposes student images and is consent-gated at the platform's canonical publication chokepoint. That chokepoint is not provisioned in this wire-up, so a non-private schedule is refused outright today -- nothing is stored, nothing is published. This is a deliberate, fail-closed hold, not a bug: enablement of public broadcasting waits on that consent chokepoint being wired, not on this page's copy.
Honest-off -- refused, nothing stored, pending the consent chokepoint
Named contract: apps/api/src/routes/livestream-broadcast.ts
3 · The ticket-gate check in front of playback
Before a byte of video would ever be served, a viewer's opaque ticket gate code is decoded and re-validated against the real box-office order snapshot -- a stream ticket is honored only when its bound order is paid. The box office's live payment rail is honest-off everywhere in the family, so every viewer is correctly and honestly denied an unpaid entitlement today. There is no preview or allow-anyway path.
Built and wired -- correctly denies every viewer while the box office is honest-off
Named contract: apps/api/src/routes/stream-entitlement.ts
4 · Public playback itself
No playback rail -- no HLS, no RTMP, no manifest -- is provisioned anywhere in the platform. The playback endpoint returns a plain not-provisioned response, never a fabricated video address, even for a viewer who is fully entitled and fully consent-cleared. This page renders no video element, no player shell, and no watch-now control, because there is genuinely nothing to play.
Honest-off -- no rail provisioned, no address ever returned
Named contract: apps/api/src/routes/stream-entitlement.ts