docs: the ersatztv skill described archived upstream, not this fork #548

Closed
opened 2026-07-21 20:49:54 +02:00 by timothy · 0 comments
Owner

Ad-hoc, found during #536's prod verification while driving the API by hand.

What was wrong

.claude/skills/ersatztv/SKILL.md still described archived upstream v26.3.0, and not in a vague way — in ways that would actively misdirect a session:

  • "ErsatzTV uses MediatR + Blazor (not REST for mutations)" — the Blazor UI was removed in #91 phase (b).
  • "No REST CRUD for channels/collections/schedules — must use SQLite DB directly" — false since the fork's /api/v1, which has full write paths. A session trusting this would hand-edit SQLite, with the container stopped, for something an endpoint does safely.
  • Image: ghcr.io/ersatztv/ersatztv:latest — we run 192.168.1.95:3000/timothy/ersatztv.
  • /api/health described as returning "Blazor HTML".

The skill is loaded by name, so nothing in the session flags it as stale — it reads as current.

What was added

Things this session had to discover by hand:

  • The api.key file is root-owned 0600, and an unsudo'd read fails silently. cat returns nothing → empty X-Api-Key header → a 401 body that parses as a dict → a naive script reports "0 channels" instead of an auth error. That is exactly what happened here; the empty result looked like a real answer.
  • Settings live at /api/v1/settings/ffmpeg and /api/v1/settings/logging — not ffmpeg/settings, which is what I guessed first.
  • Test is port 8410, and the service-scoped manual refresh (pull + up -d --no-deps ersatztv-test) for validating a build before the 03:00 Komodo auto-update. Scoping matters: a bare up -d recreates everything else in the project.
  • A container's OCI labels lie — inherited from the linuxserver base image, they claimed 2026-06-27 on an image built minutes earlier. Compare .Image to the registry's Docker-Content-Digest.
  • Container log brackets are local time while docker logs -t is UTC, so --since windows silently mis-slice; capture by line offset for before/after measurements.

Endpoint lists now defer to docs/endpoint-index.md (generated) instead of being re-maintained in the skill — a hand-copied list is what drifted in the first place.

Files changed: .claude/skills/ersatztv/SKILL.md (PR #549).
Deferred: the unversioned /api/* list further down is left in place but now carries a "verify against docs/endpoint-index.md" warning — I did not exercise those endpoints this session and won't claim they're accurate.
Docs updated: the skill only; docs/decisions/workflow-process.md and the vault already cover the rest.

Ad-hoc, found during #536's prod verification while driving the API by hand. ## What was wrong `.claude/skills/ersatztv/SKILL.md` still described **archived upstream v26.3.0**, and not in a vague way — in ways that would actively misdirect a session: - *"ErsatzTV uses **MediatR + Blazor** (not REST for mutations)"* — the Blazor UI was removed in #91 phase (b). - *"**No REST CRUD for channels/collections/schedules** — must use SQLite DB directly"* — false since the fork's `/api/v1`, which has full write paths. A session trusting this would hand-edit SQLite, with the container stopped, for something an endpoint does safely. - `Image: ghcr.io/ersatztv/ersatztv:latest` — we run `192.168.1.95:3000/timothy/ersatztv`. - `/api/health` described as returning "Blazor HTML". The skill is loaded by name, so nothing in the session flags it as stale — it reads as current. ## What was added Things this session had to discover by hand: - **The api.key file is root-owned `0600`, and an unsudo'd read fails *silently*.** `cat` returns nothing → empty `X-Api-Key` header → a 401 body that parses as a dict → a naive script reports **"0 channels"** instead of an auth error. That is exactly what happened here; the empty result looked like a real answer. - Settings live at `/api/v1/settings/ffmpeg` and `/api/v1/settings/logging` — **not** `ffmpeg/settings`, which is what I guessed first. - Test is port **8410**, and the service-scoped manual refresh (`pull` + `up -d --no-deps ersatztv-test`) for validating a build before the 03:00 Komodo auto-update. Scoping matters: a bare `up -d` recreates everything else in the project. - **A container's OCI labels lie** — inherited from the linuxserver base image, they claimed `2026-06-27` on an image built minutes earlier. Compare `.Image` to the registry's `Docker-Content-Digest`. - **Container log brackets are local time while `docker logs -t` is UTC**, so `--since` windows silently mis-slice; capture by line offset for before/after measurements. Endpoint lists now defer to `docs/endpoint-index.md` (generated) instead of being re-maintained in the skill — a hand-copied list is what drifted in the first place. **Files changed:** `.claude/skills/ersatztv/SKILL.md` (PR #549). **Deferred:** the unversioned `/api/*` list further down is left in place but now carries a "verify against `docs/endpoint-index.md`" warning — I did not exercise those endpoints this session and won't claim they're accurate. **Docs updated:** the skill only; `docs/decisions/workflow-process.md` and the vault already cover the rest.
timothy added the priority: mediumad-hoc labels 2026-07-21 20:49:54 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: timothy/ersatztv#548