From a49e0f392f60643e0d3be46a4d2ecb399b0dd673 Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 20:47:55 +0300 Subject: [PATCH] Record that the chapter number field promises a null the seam rejects, and that the implemented half is dense one-based numbering --- docs/architecture/14-api-contract/openapi.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/architecture/14-api-contract/openapi.yaml b/docs/architecture/14-api-contract/openapi.yaml index 9b1eb10d..60d9bddd 100644 --- a/docs/architecture/14-api-contract/openapi.yaml +++ b/docs/architecture/14-api-contract/openapi.yaml @@ -1834,6 +1834,21 @@ components: Displayed ordinal, or `null` when the book has no numbering — a legal book. **Not a key:** numbering is dense, so editing the source shifts every later chapter. + + ⚠ **ЭРРАТА 05.09 — КОНТРАКТ ПРОТИВОРЕЧИТ СЕБЕ, И ШОВ РЕАЛИЗУЕТ ДРУГУЮ ПОЛОВИНУ.** + `null` объявлен здесь ЗАКОННЫМ, но платформа его ОТВЕРГАЕТ: `Whole()` в + `platform/internal/ingest/manifest.go` проверяет `c.Number < 1` и возвращает ошибку + «chapter numbering is 1-based», а JSON-овый `null` декодируется в ноль. То есть + книга, которую этот абзац называет законной, через шов не проходит вовсе. + Противоречие — ВНУТРИ поля: «нумерация плотная, номер не ключ» и «`null` законен» + несовместимы, и реализована первая половина. + + ⇒ До структурного пака **считать законной только плотную 1-based нумерацию**; + ненумерованная книга сегодня НЕ поддерживается ни одним концом, и обещание обратного + здесь — единственный её носитель. Пак, который научит движок резать книги без + нумерации, обязан снять это противоречие ЯВНО: либо шов принимает `null`, либо + контракт перестаёт его обещать. Версия контракта здесь НЕ двинута намеренно — + поведение провода не изменилось, изменилась только честность его описания. heading: type: [string, 'null'] maxLength: 200