docs(ersatztv skill): record the #510 no-logo-no-bug policy and deco seeding recipe #659

Merged
timothy merged 1 commits from docs/510-skill-logo-bug-policy into main 2026-07-26 22:41:56 +02:00
Owner

Follow-up to #510 / PR #655. refs #510 — the issue is already closed, so this PR intentionally does not carry fixes.

Why

The skill's Logo System section documented the #502#525 chain but stopped before #510, so it described behavior that no longer holds and omitted the fact someone consulting it is most likely to need: a channel with a watermark configured but no usable logo now renders no on-screen bug, from every attachment point.

What's added

All of it discovered while working #510, none of it derivable from the section as it stood:

  • The unified policy, plus the log strings to grep (has no logo artwork, no longer exists) before suspecting the ffmpeg pipeline — which is where that debugging session would otherwise go.
  • That the deco path alone used to render the generated-initials nameplate, and that it genuinely worked. Without this, a future reader finds the nameplate in the code history and reasonably concludes it was always dead — the exact wrong inference the #502-era comment caused this time round. #652 is named as the revival path.
  • The #653 carve-out. The song-progress overlay bypasses the resolver and is still unchecked, so "no usable logo ⇒ no bug" is a property of the selector, not the application. Stating the scope in the skill matters more than in the record, because the skill is the thing read under time pressure.
  • /iptv/logos/gen is unauthenticated while the rest of /iptv is not — ConditionalIptvAuthorizeFilter is a class-level attribute on IptvController, and that route lives on ArtworkController.
  • The fully API-driven deco-watermark seeding recipe (watermarksdecos/groupsdecosPUT decos/{id}PUT playouts/{id}/deco, with watermarkMode: "Override" to isolate), which cost real discovery time — plus the reminder that branding is not testable through the troubleshooting-playback API.

Verification

  • Docs-only leaf change to one skill file. No code, no server-state effect.
  • Independent review deliberately skipped, per process.independent-review-rubric — it permits a skip for a pure-docs leaf with no server-state effect, provided the skip and its reason are stated. This is that case, and this is the statement.
  • Confirmed the YAML frontmatter still parses with both keys intact (name, description), since an unquoted ": " there silently disables a skill — that has bitten this repo before (#617).
  • 225/225 scripts/tests pass locally.

Note this PR touches .claude/, so it is not auto-passed by review-verdict.yml and needs a real review-verdict/h10 status. Because the linked issue is closed and carries no open ## Done-when, the merge-consent hook will ask rather than auto-grant — so this one wants your explicit go-ahead rather than derived consent.

🤖 Generated with Claude Code

Follow-up to #510 / PR #655. `refs #510` — the issue is already closed, so this PR intentionally does **not** carry `fixes`. ## Why The skill's **Logo System** section documented the #502 → #525 chain but stopped before #510, so it described behavior that no longer holds and omitted the fact someone consulting it is most likely to need: a channel with a watermark configured but **no usable logo now renders no on-screen bug**, from every attachment point. ## What's added All of it discovered while working #510, none of it derivable from the section as it stood: - **The unified policy**, plus the log strings to grep (`has no logo artwork`, `no longer exists`) *before* suspecting the ffmpeg pipeline — which is where that debugging session would otherwise go. - **That the deco path alone used to render the generated-initials nameplate, and that it genuinely worked.** Without this, a future reader finds the nameplate in the code history and reasonably concludes it was always dead — the exact wrong inference the #502-era comment caused this time round. #652 is named as the revival path. - **The #653 carve-out.** The song-progress overlay bypasses the resolver and is still unchecked, so "no usable logo ⇒ no bug" is a property of the *selector*, not the application. Stating the scope in the skill matters more than in the record, because the skill is the thing read under time pressure. - **`/iptv/logos/gen` is unauthenticated** while the rest of `/iptv` is not — `ConditionalIptvAuthorizeFilter` is a class-level attribute on `IptvController`, and that route lives on `ArtworkController`. - **The fully API-driven deco-watermark seeding recipe** (`watermarks` → `decos/groups` → `decos` → `PUT decos/{id}` → `PUT playouts/{id}/deco`, with `watermarkMode: "Override"` to isolate), which cost real discovery time — plus the reminder that branding is **not** testable through the troubleshooting-playback API. ## Verification - Docs-only leaf change to one skill file. No code, no server-state effect. - **Independent review deliberately skipped**, per `process.independent-review-rubric` — it permits a skip for a pure-docs leaf with no server-state effect, provided the skip and its reason are stated. This is that case, and this is the statement. - Confirmed the YAML frontmatter still parses with both keys intact (`name`, `description`), since an unquoted `": "` there silently disables a skill — that has bitten this repo before (#617). - `225/225 scripts/tests` pass locally. Note this PR touches `.claude/`, so it is **not** auto-passed by `review-verdict.yml` and needs a real `review-verdict/h10` status. Because the linked issue is closed and carries no open `## Done-when`, the merge-consent hook will **ask** rather than auto-grant — so this one wants your explicit go-ahead rather than derived consent. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
timothy added 1 commit 2026-07-26 22:24:19 +02:00
docs(ersatztv skill): record the #510 no-logo-no-bug policy and deco seeding recipe
review-verdict/h10 Review-verdict: MERGEABLE @ b99ba68
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 20s
PR Gates / Docs update reminder (pull_request) Successful in 20s
PR Gates / decisions lifecycle (pull_request) Successful in 20s
Review verdict / Set review-verdict status (pull_request) Successful in 1s
PR Gates / Script tests (pytest) (pull_request) Successful in 30s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 9s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 9s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 9s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 9s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 8s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
b99ba68b4b
The skill's Logo System section documented the #502/#525 chain but stopped
before #510, so it described a behavior that no longer holds and omitted the
one fact someone consulting it would most likely need: a channel with a
watermark configured but no usable logo now renders NO on-screen bug, from
every attachment point, and says so in the log.

Adds, all discovered while working #510:

- The unified policy plus the log strings to grep ("has no logo artwork",
  "no longer exists") before suspecting the ffmpeg pipeline.
- That the deco path alone used to render the generated-initials nameplate and
  that it genuinely worked, with #652 as the revival path -- otherwise a future
  reader finds the nameplate in the code history and assumes it was dead.
- The #653 carve-out: the song-progress overlay bypasses the resolver and is
  still unchecked, so "no usable logo means no bug" is a property of the
  selector, not of the whole app.
- That /iptv/logos/gen is unauthenticated while the rest of /iptv is not,
  because ConditionalIptvAuthorizeFilter is a class attribute on IptvController
  and that route lives on ArtworkController.
- The fully API-driven deco-watermark seeding recipe (watermarks -> decos/groups
  -> decos -> PUT decos/{id} -> PUT playouts/{id}/deco), which cost real
  discovery time this session, plus the reminder that branding is not testable
  through the troubleshooting-playback API.

Docs-only leaf change to one skill file; no code, no server-state effect.
Verified the YAML frontmatter still parses (name + description intact) since an
unquoted ": " there silently disables a skill.

refs #510 #652 #653
Author
Owner

Review-verdict: MERGEABLE @ b99ba68

Docs-only leaf change to one skill file, no code and no server-state effect. Independent review skipped per process.independent-review-rubric with the reason stated in the PR body. Verified the skill YAML frontmatter still parses with both keys intact. 225/225 script tests pass.

Review-verdict: MERGEABLE @ b99ba68 Docs-only leaf change to one skill file, no code and no server-state effect. Independent review skipped per process.independent-review-rubric with the reason stated in the PR body. Verified the skill YAML frontmatter still parses with both keys intact. 225/225 script tests pass.
timothy merged commit 256cb0221b into main 2026-07-26 22:41:56 +02:00
Sign in to join this conversation.