docs: Go Live IS private (verified), and v1 is where that guarantee ends

The creator's standing doubt: "I wasn't sure that the go live video would be
private." Answered by tracing every path that can touch privacy, not by
reassuring:

  CreateBroadcast          -> privacyStatus = "private"   hardcoded
  GoLiveViewModel          -> Visibility => "Private"     hardcoded
  BeginTestStream          -> StreamVisibility = "Private" hardcoded
  UpdateBroadcast          -> the only code that can change it — NO CALLER

UpdateBroadcast's sole caller in the repo is BroadcastPullOutTests.cs:120. It
is dead code. So there is no path today by which a broadcast this app creates
becomes non-private, and the "do not populate my channel with videos showing
the app at its worst" concern is fully met. Verified, not assumed.

Which makes the safety accidental rather than structural, and that is the part
worth writing down. LiveBroadcastFormViewModel still offers
VisibilityOptions {private, unlisted, public}, and UpdateBroadcast would honour
it. So the v1 visibility option is precisely the change that first wires that
method up — v1 is the moment private stops being guaranteed and becomes a
user-selectable default. Intended at v1, ruinous before, and "it's dead code,
let me call it" is not a valid reason to do it early.

Also recorded, having been absent from the map entirely: the TEST button is
hidden at v1. Its real job is being the guaranteed-private path (hence the
hardcoded Private at BeginTestStream:105), which the existing "dry-run"
comment on ShowTestButton does not capture — that framing is now known to be
incomplete, and must not be used to re-derive why the button persists.

Corrects a fact I got wrong one commit ago: the method is UpdateBroadcast, not
"UpdateBroadcastMetadataAsync", and I described it as an available retrofit
path when it is in fact unreachable in production.

Open, deliberately, for v1 rather than now: whether a dry run is still wanted
on its own merits once Test is hidden.
This commit is contained in:
2026-10-04 14:58:55 -07:00
parent 74da99c988
commit 0fb2f9c6c3
2 changed files with 61 additions and 5 deletions
+17 -2
View File
@@ -307,11 +307,26 @@ second encoder path needing a "redirect". Record+simulcast is one ffmpeg with tw
restated 2026-10-04).** `privacyStatus = "private"` hardcoded in
`YouTubeStreamService.CreateBroadcast` is deliberate and correct for the whole pre-v1 test
phase — it is the reason test VODs of a still-breaking product stay off the channel. At v1 it
becomes a user-selectable visibility option in the Go-Live dialog, wired to the same
`UpdateBroadcastMetadataAsync` path. **Before v1, do not touch it and do not raise it as a
becomes a user-selectable visibility option in the Go-Live dialog. **Before v1, do not touch it and do not raise it as a
question, observation or suggestion — it has been asked and answered repeatedly.** Full rationale
and the retired "can we delete the test VODs?" question: `ai.md` → YouTube Live API design
constraints.
- **Verified 2026-10-04: a Go Live video IS private.** Three independent hardcodes
(`CreateBroadcast` → `"private"`, `GoLiveViewModel.Visibility => "Private"`,
`BeginTestStream` → `StreamVisibility = "Private"`) and the one method that could change it,
`YouTubeStreamService.UpdateBroadcast`, has **no production caller** — only
`BroadcastPullOutTests.cs:120`. No path exists today by which an app-created broadcast becomes
non-private.
- **Two coupled v1 items — both are the deliberate end of that guarantee:**
1. **Hide the TEST button.** It exists as the guaranteed-private path; once visibility is
selectable, a separate safe button is redundant. One-line change —
`ShowTestButton => ShowStreamActions && IsConnected` is a computed predicate, not a setting.
2. **This is the unit that first wires `UpdateBroadcast` into production.** It is the only code
that can change a broadcast's privacy, and it is currently dead. Wiring it is exactly when
private stops being guaranteed and becomes a user-selectable default. Correct at v1,
ruinous before — and "it's dead code, let me call it" is not a reason to do it early.
- A **dry run** may still be worth having at v1 on its own merits; that is a separate question
from the privacy mechanism and is **not** decided by the above.
- **Kill the dev multi-instance affordance.** `Helpers/InstanceProfile.cs` is already entirely
`#if DEBUG`, so a Release build ships as `DataRoot => DefaultRoot` / `WebViewDataFolder => null`.