The ersatztv skill still described archived upstream v26.3.0, in ways that would actively misdirect a session rather than merely being vague:
"ErsatzTV uses MediatR + Blazor (not REST for mutations)" — Blazor was removed in #91 phase (b).
"No REST CRUD for channels/collections/schedules — must use SQLite DB directly" — false since /api/v1, which has full write paths. A session trusting this would stop the container and hand-edit SQLite for something an endpoint does safely.
The ghcr.io/ersatztv/ersatztv image, and /api/health "returns Blazor HTML".
A skill is loaded by name, so nothing surfaces its staleness — it reads as current.
Adds what this session had to work out by hand while driving the API for #536's prod verification:
The api.key file is root-owned 0600 and an unsudo'd read fails silently — empty header → a 401 body that parses as a dict → a naive script reports "0 channels" rather than an auth error. That happened here, and the empty result looked like a real answer.
Settings are at /api/v1/settings/ffmpeg / settings/logging, notffmpeg/settings.
Test is port 8410, plus the service-scoped manual refresh for validating before the 03:00 auto-update — scoping matters, a bare up -d recreates everything else in the compose project.
Two measurement traps recorded alongside: OCI labels are inherited from the linuxserver base image and lie about what is running (compare .Image to the registry Docker-Content-Digest), and container log brackets are local time while docker logs -t is UTC, so --since mis-slices.
Endpoint lists now defer to docs/endpoint-index.md rather than being re-maintained in the skill — a hand-copied list is precisely what drifted.
Not claimed: the unversioned /api/* list further down is left as-is with a "verify against docs/endpoint-index.md" warning. I did not exercise those endpoints this session, so I won't assert they're correct.
Docs-only, single file, no server-state effect — independent review skipped per the process.independent-review-rubric exemption, stated here rather than left silent.
fixes #548
The `ersatztv` skill still described **archived upstream v26.3.0**, in ways that would actively misdirect a session rather than merely being vague:
- *"ErsatzTV uses **MediatR + Blazor** (not REST for mutations)"* — Blazor was removed in #91 phase (b).
- *"**No REST CRUD for channels/collections/schedules** — must use SQLite DB directly"* — false since `/api/v1`, which has full write paths. A session trusting this would stop the container and hand-edit SQLite for something an endpoint does safely.
- The `ghcr.io/ersatztv/ersatztv` image, and `/api/health` "returns Blazor HTML".
A skill is loaded by name, so nothing surfaces its staleness — it reads as current.
Adds what this session had to work out by hand while driving the API for #536's prod verification:
- **The api.key file is root-owned `0600` and an unsudo'd read fails *silently*** — empty header → a 401 body that parses as a dict → a naive script reports **"0 channels"** rather than an auth error. That happened here, and the empty result looked like a real answer.
- Settings are at `/api/v1/settings/ffmpeg` / `settings/logging`, **not** `ffmpeg/settings`.
- Test is port 8410, plus the **service-scoped** manual refresh for validating before the 03:00 auto-update — scoping matters, a bare `up -d` recreates everything else in the compose project.
- Two measurement traps recorded alongside: OCI labels are inherited from the linuxserver base image and lie about what is running (compare `.Image` to the registry `Docker-Content-Digest`), and container log brackets are local time while `docker logs -t` is UTC, so `--since` mis-slices.
Endpoint lists now defer to `docs/endpoint-index.md` rather than being re-maintained in the skill — a hand-copied list is precisely what drifted.
**Not claimed:** the unversioned `/api/*` list further down is left as-is with a "verify against `docs/endpoint-index.md`" warning. I did not exercise those endpoints this session, so I won't assert they're correct.
Docs-only, single file, no server-state effect — independent review skipped per the `process.independent-review-rubric` exemption, stated here rather than left silent.
The skill still described archived upstream v26.3.0: "MediatR + Blazor (not
REST for mutations)", "No REST CRUD for channels/collections/schedules —
must use SQLite DB directly", and the ghcr.io image. All false for this
fork — Blazor was removed in #91b and /api/v1 has full write paths. A
session trusting it would hand-edit SQLite for something the API does.
Also adds what this session had to discover by hand while driving the API:
the key is root-owned so an unsudo'd read fails SILENTLY (empty header ->
401 body that parses as a dict -> a naive script reports "0 channels"
rather than an auth error); settings live at /api/v1/settings/ffmpeg, not
ffmpeg/settings; test is port 8410 and the service-scoped manual refresh
command for validating before the 03:00 auto-update.
Two measurement traps recorded with them: OCI labels are inherited from the
linuxserver base image and lie about what is running (compare .Image to the
registry Docker-Content-Digest), and container log brackets are local time
while `docker logs -t` is UTC, so --since windows mis-slice.
Endpoint lists now defer to docs/endpoint-index.md rather than being
re-maintained here, since a hand-copied list is what drifted in the first
place.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
fixes #548
The
ersatztvskill still described archived upstream v26.3.0, in ways that would actively misdirect a session rather than merely being vague:/api/v1, which has full write paths. A session trusting this would stop the container and hand-edit SQLite for something an endpoint does safely.ghcr.io/ersatztv/ersatztvimage, and/api/health"returns Blazor HTML".A skill is loaded by name, so nothing surfaces its staleness — it reads as current.
Adds what this session had to work out by hand while driving the API for #536's prod verification:
0600and an unsudo'd read fails silently — empty header → a 401 body that parses as a dict → a naive script reports "0 channels" rather than an auth error. That happened here, and the empty result looked like a real answer./api/v1/settings/ffmpeg/settings/logging, notffmpeg/settings.up -drecreates everything else in the compose project..Imageto the registryDocker-Content-Digest), and container log brackets are local time whiledocker logs -tis UTC, so--sincemis-slices.Endpoint lists now defer to
docs/endpoint-index.mdrather than being re-maintained in the skill — a hand-copied list is precisely what drifted.Not claimed: the unversioned
/api/*list further down is left as-is with a "verify againstdocs/endpoint-index.md" warning. I did not exercise those endpoints this session, so I won't assert they're correct.Docs-only, single file, no server-state effect — independent review skipped per the
process.independent-review-rubricexemption, stated here rather than left silent.