docs(616): stop the record title and mcp.md from contradicting their own bodies
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 13s
PR Gates / Docs update reminder (pull_request) Successful in 16s
PR Gates / decisions lifecycle (pull_request) Successful in 29s
review-verdict/h10 Review-verdict: MERGEABLE @ 78ec997
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 19s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 8m59s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 15m10s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 18m9s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 18m41s

Two LOWs from the re-review of af39123e. Both are the same defect I have already
corrected twice on this branch: a universal claim that the corrected body right
below it disproves. These read as normative, so a reader who stops at the title
gets the false version.

- The record was titled "...and every wrapper says so" while its own body admits
  the 12 OpenAPI pageNum parameters carry no description at all (tracked as
  #633). Retitled to state the target and name the exception.
- docs/mcp.md led with "Rows that reference another entity carry that entity's
  id" — but PlayoutListItemResponseModel.ScheduleName ships with no schedule id.
  Restated as a rule about ACTIONABLE references, matching the wording the record
  already uses, with the known exception named.

The two remaining LOWs are accepted deferrals, not fixed here: the >100 rerun
collection truncation needs paging-to-completeness plus a multi-page fixture
(#634), and the catalog test's forward-looking gap (it compares tool names, not
PathTemplate against the paged-endpoint set) would need the MCP test project to
reference the controllers to close properly.

Docs only; catalog regenerated. No behaviour change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-25 23:51:14 +02:00
co-authored by Claude Opus 5
parent af39123e8e
commit 78ec997eae
2 changed files with 7 additions and 4 deletions
@@ -1,6 +1,6 @@
---
key: api.paging-zero-based
title: 2026-07-25 — Paging is 0-based everywhere, and every wrapper says so (#616)
title: 2026-07-25 — Paging is 0-based everywhere; every wrapper must say so (OpenAPI still doesn't) (#616)
status: active
since: '2026-07-25'
supersedes: none
+6 -3
View File
@@ -104,9 +104,12 @@ that way until #616. `ToolCatalogTests` pins the expected set.)
value on `search_all_items` is under its cap and is honored (page 1 = items 5011000). Don't assume
your requested size held — page to completeness against `totalCount`.
Rows that reference another entity carry that entity's id, not just its display fields — take the
channel id for `ersatztv_reset_channel_playout` from a playout row's `channelId`, never from its `id`
(that is the *playout* id, and the two id spaces overlap numerically).
Where a row is meant to be acted on, it carries the *id* of the entity you act on and not only its
display name — take the channel id for `ersatztv_reset_channel_playout` from a playout row's
`channelId`, never from its `id` (that is the *playout* id, and the two id spaces overlap
numerically, so the wrong one silently succeeds against a different channel). This is a rule for
actionable references, not a claim that every row is fully id-annotated: `scheduleName` on a playout
row still ships without a schedule id, because nothing asks you to address a schedule from there.
### Optimistic concurrency (`api-conventions.md` §7a)