docs(511): correct the stale "external logo URL can't drive the bug" claim + document the new limits #522

Closed
timothy wants to merge 1 commits from docs/511-external-logo-limits into main
Owner

refs #511, #502

Follow-up to #518, found while running the close-out sweep for #511 — by grepping the subject ("external logo URL") rather than reading my own diff.

The stale claim

docs/channels.md and the channel editor both still documented pre-#502 behavior as a current limitation:

Limitation: a logo set via External logo URL cannot drive the bug. WatermarkSelector resolves it to the URL and then File.Exists-checks it, which is never true…

#502 fixed exactly that. The user-visible half was worse than the doc: ChannelEditScreen told operators "An external logo URL cannot be used as the on-screen bug — upload an image instead." for something that works today.

Copy-only change — no test pinned that string, and the toggle was never actually disabled for external URLs (only hlsDirect || logoBugTarget == null). The preview is still suppressed for external URLs, which is correct (nothing local to render), so the new text explains why instead of claiming the feature doesn't work.

Also documents #511's limits where an operator would look

10s deadline (headers and body), 10 MiB wire cap, 3 redirects, 50 MP total decode (w × h × frames), 600 frames, 200 MP retained after scaling — plus the practical effects: a full-1080p animated overlay is limited to ~96 frames (~3.2s at 30fps), an 8K still (~33 MP) is fine, and busting a limit disables the bug, never the stream.

Verification

  • npm run typecheck clean; ChannelEditScreen.test.tsx 19/19 pass.
  • No layout or styling change, so the design-sync mirror flow doesn't apply (help-text content, not appearance).

Done-when

  • Stale limitation corrected in docs/channels.md
  • User-facing SPA copy corrected
  • #511's limits documented where an operator would look
  • Typecheck + affected tests pass
  • Adversarial review passed

Docs + one-line copy change with no server-state effect, so per the review skip rubric in the handoff lore I'm treating an independent review pass as skippable here and stating that explicitly rather than silently. Happy to run one if you'd prefer.

refs #511, #502 Follow-up to #518, found while running the close-out sweep for #511 — by grepping the **subject** ("external logo URL") rather than reading my own diff. ## The stale claim `docs/channels.md` and the channel editor both still documented **pre-#502** behavior as a current limitation: > **Limitation:** a logo set via **External logo URL** cannot drive the bug. `WatermarkSelector` resolves it to the URL and then `File.Exists`-checks it, which is never true… #502 fixed exactly that. The user-visible half was worse than the doc: `ChannelEditScreen` told operators *"An external logo URL cannot be used as the on-screen bug — upload an image instead."* for something that works today. Copy-only change — no test pinned that string, and the toggle was never actually `disabled` for external URLs (only `hlsDirect || logoBugTarget == null`). The **preview** is still suppressed for external URLs, which is correct (nothing local to render), so the new text explains *why* instead of claiming the feature doesn't work. ## Also documents #511's limits where an operator would look 10s deadline (headers *and* body), 10 MiB wire cap, 3 redirects, 50 MP total decode (`w × h × frames`), 600 frames, 200 MP retained after scaling — plus the practical effects: a full-1080p animated overlay is limited to ~96 frames (~3.2s at 30fps), an 8K still (~33 MP) is fine, and **busting a limit disables the bug, never the stream**. ## Verification - `npm run typecheck` clean; `ChannelEditScreen.test.tsx` 19/19 pass. - No layout or styling change, so the design-sync mirror flow doesn't apply (help-text content, not appearance). ## Done-when - [x] Stale limitation corrected in `docs/channels.md` - [x] User-facing SPA copy corrected - [x] #511's limits documented where an operator would look - [x] Typecheck + affected tests pass - [ ] Adversarial review passed Docs + one-line copy change with no server-state effect, so per the review skip rubric in the handoff lore I'm treating an independent review pass as **skippable** here and stating that explicitly rather than silently. Happy to run one if you'd prefer.
timothy added 1 commit 2026-07-21 02:01:59 +02:00
docs(511): correct the stale "external logo URL can't drive the bug" claim
Build ErsatzTV Image / CI image pin matches docker/ci (pull_request) Successful in 36s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 37s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 44s
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 42s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 1m23s
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 16m39s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 19m50s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 20m30s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
f014d31531
Found by sweeping the subject (external logo URL) while closing out #511,
not by reading the diff — docs/channels.md and the channel editor both
still documented the PRE-#502 behavior as a current limitation.

#502 fixed exactly this: an external-URL logo now passes through to the
graphics engine instead of being File.Exists-checked into oblivion. The
SPA help text was the user-visible half — it told operators to "upload an
image instead" for something that works today. No test pinned the string,
and the toggle was never actually disabled for external URLs, so this is
copy-only. The preview is still suppressed for external URLs, which
remains correct, so the new text says why.

Also documents #511's limits where an operator would look for them: the
10s deadline, 10 MiB wire cap, 3 redirects, 50 MP / 600 frame decode
budget and 200 MP retention budget, plus the practical effects (a
full-1080p animated overlay is limited to ~96 frames; an 8K still is
fine) and the fact that busting a limit disables the bug, never the
stream.

refs #511 #502
timothy closed this pull request 2026-07-21 02:47:17 +02:00
Author
Owner

Closing unmerged — superseded by #525 (external-logo download-on-save).

This PR corrected a stale claim ("an external URL can't drive the on-screen bug") and documented render-time fetching. But #525 changes that behavior again: an external URL will be downloaded and cached at save time, so it does get a preview and is not fetched at render time — which makes this PR's "fetched at render time, so no preview" wording wrong the moment #525 lands. Merging it would ship copy with a ~day of life.

The correct doc/copy is folded into #525's plan (Tasks 9 + 10). The valid core of this PR — that #502 already fixed the "URLs can't drive the bug" limitation — is carried forward there. Branch docs/511-external-logo-limits can be deleted.

Closing unmerged — **superseded by #525** (external-logo download-on-save). This PR corrected a stale claim ("an external URL can't drive the on-screen bug") and documented render-time fetching. But #525 changes that behavior again: an external URL will be downloaded and cached **at save time**, so it *does* get a preview and is *not* fetched at render time — which makes this PR's "fetched at render time, so no preview" wording wrong the moment #525 lands. Merging it would ship copy with a ~day of life. The correct doc/copy is folded into #525's plan (Tasks 9 + 10). The valid core of this PR — that #502 already fixed the "URLs can't drive the bug" limitation — is carried forward there. Branch `docs/511-external-logo-limits` can be deleted.

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.