From 760daf8f6e96f1c6669e9512287a822e2c9a78c6 Mon Sep 17 00:00:00 2001 From: heaven Date: Tue, 8 Sep 2026 15:30:02 +0300 Subject: [PATCH] Reopen the table-of-contents row narrowed to the half nobody reads, and replace the manifest rule's price with the one the code actually names --- docs/BACKLOG.md | 5 +++-- docs/PROGRESS.md | 2 +- docs/README.md | 2 +- docs/architecture/05-decisions-log.md | 1 + docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md | 3 ++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 90fe2d2b..c0bfaa67 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 08.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **256** строк · зона бэкенд **122** строго / **169** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 1** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **112** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 08.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **257** строк · зона бэкенд **122** строго / **169** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 1** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **113** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -239,7 +239,7 @@ | 302 | **РЕЗКА xhtml ПО ЯКОРЯМ `nav`: текст цел, ГРАНУЛЯРНОСТЬ ТЕРЯЕТСЯ.** Массовая форма EPUB — несколько глав в ОДНОМ документе, разделённых якорями, и `nav` объявляет на них отдельные цели. Структурный пак 1 такие цели СХЛОПЫВАЕТ: одна глава вместо трёх, текст не теряется (формулировка бэкенд-сессии 05.09: «текст цел, гранулярность потеряна»). ⚠ **Ложь при этом уже не едет** — тем же паком ратифицировано: схлопнулась хоть одна цель ⇒ книга НЕ `declared`, а `delimited`, плюс счёт `targets collapsed: N` в WARN. То есть провенанс честен, а разрез груб. ⇒ заказ: резать документ по якорям целей. ⛔ **Почему НЕ сделано паком 1 и почему это дорого:** это единственное место, трогающее `extractXHTML`, у которого **четыре пина байт-паритета** (`ingest_test.go:323, 359, 423, 467` — void-теги, несбалансированный ruby, raw-text-элементы, голый амперсанд), и ошибка там ТИХАЯ. Заходить в него в конце пака, ради гранулярности, при живом гейте разреза — плохой размен. ⚠ Строкой закрывается ГРАНУЛЯРНОСТЬ, а не провенанс: продать такую книгу по главам платформа и так не предложит | бэкенд | когда-нибудь (после пака 2) | книга с тремя якорями в одном документе даёт три главы; четыре пина байт-паритета целы | **D39.207** | | 303 | **НЕ-CJK ПУТЬ ПОСТРОЕН НАПОЛОВИНУ: чанкер безъюнитную грамматику УЖЕ УМЕЕТ, ингест по ней НЕ РЕЖЕТ.** `detectChapterUnit` итерирует `UnitOrdered` и без юнита возвращает 0 ⇒ грамматика вида «Kapitel 12» / «Chapter 12» (маркер + номер, БЕЗ юнита) книгу не режет; при этом `matchHeaderLine` чанкера юнита не требует и на это есть живой тест (`TestStripHeadingGenericLatinMarker`). То есть заголовок такой книги движок умеет СНЯТЬ, но не умеет по нему РАЗРЕЗАТЬ. ⇒ ревью-вопрос проекта «заработает ли пара, которой в репо НЕТ, без правки Go» закрыт для языков С ЮНИТОМ (доказано сквозным тестом `TestANewLanguageCutsFromItsDataFileAlone`: без файла корейская книга — одна глава, с `ko/structure.txt` — три, разница только в данных) и **ОТКРЫТ для языков без юнита**. Это названный ВХОД в пак 2, а не открытие по ходу. ⚠⚠ **ГРАНИЦА ЗАМЕРА, названная самой зоной и записанная здесь в её настоящей силе:** утверждение проверено **ПО КОДУ и ПО ТЕСТУ НА ФИКСТУРЕ**; **живая не-CJK книга через ингест НЕ прогонялась**. «На живой книге» под этой строкой НЕ стоит, и ссылаться на неё как на замер живого поведения нельзя | бэкенд | скоро (вход пака 2) | безъюнитная грамматика режет книгу; замер на живой не-CJK книге | **D39.207** | | 304 | ⚠ **РИСК NULLABLE ДЕНЕЖНЫХ КОЛОНОК — НЕ ТЕОРЕТИЧЕСКИЙ, А ОТЛОЖЕННЫЙ, и это вскрыла ЛОЖНАЯ ПРИЧИНА в отчёте зоны.** Платформенная зона объяснила чистый `sqlc diff` тем, что новые колонки лежат «в таблицах, для которых sqlc не держит запросов» — **догадка, и неверная**: `queries/credits.sql` и `queries/exports.sql` читают `books`, `chapters` и `runs`. Верная причина: ни один из этих запросов не выбирает `*` и не называет новых колонок, поэтому сгенерированный код не двигается (греп по `*.sql.go` — ноль вхождений). ⇒ **`books` ЛЕЖИТ в мире sqlc**, значит риск NULLABLE денежных колонок наступит на ПЕРВОМ же запросе, который их выберет, — не «никогда», а «пока не спросили». ⚠ Нашла это зона САМА, четвёртым заходом по прямому вопросу владельца «нет ли чего, что ты умолчала»; ни один гейт поймать это не мог — сторожат поведение и форму, а не то, что отчёт о себе ГОВОРИТ (`D39.202` п.9) | платформа | скоро | первый запрос, выбирающий денежные колонки, не роняет генерацию | **D39.208** | -| 306 | ⛔ **СЕМЬСОТ ЯКОРЕЙ БЕЗ ТОКЕНА НЕПРОВЕРЯЕМЫ, И 59% ИЗ НИХ УЖЕ НЕ УКАЗЫВАЮТ ТУДА, КУДА УКАЗЫВАЛИ.** Замер Fable 5 06.09 (выборка 80, seed фиксирован, метод — blame-триаж: коммит последней правки СТРОКИ ДОКА → цель на том коммите → сравнение): цела **31** · уехала **25** · переписана либо исчезла **22** · не судится 2. ⇒ **59% (±11 п.п.)**. ⚠ Линт сверяет по токену 202 и честно печатает «без токена — несверяемы: 780», но ЗАГОЛОВОК «0 проблемных якорей» читается как «всё цело» — прибор отвечает на свой вопрос, а читают его как ответ на другой (`D39.202`). ⚠ **Дрейф сосредоточен там, где он ОЖИДАЕМ:** 34 из 47 сдвинувшихся — в ЗАМОРОЖЕННЫХ отчётах, чьи тела улика по `D23.3` и обязаны описывать дерево НА ДАТУ; их чинить НЕЛЬЗЯ, им нужен штамп HEAD в шапке. **Опасны 13 в ЖИВЫХ носителях**, и часть из них — в ШАПКЕ журнала, то есть в первом, что читает сессия. ⇒ заказ, тремя шагами и без велосипедов: **(1)** заголовок линта печатает ПОКРЫТИЕ («сверено N · несверяемы M · из них с изменившейся целью — K»), чтобы гейт перестал врать формой; **(2)** ОДНОРАЗОВАЯ механическая миграция тем же скриптом: «цела» → дописать токен автоматически, «уехала» с единственным попаданием → пере-навести, «исчезла» → список на руки; замороженным отчётам вместо пере-наводки штамп коммита и исключение из линта; **(3)** правило «токен при касании» остаётся удержанием линии; **(4)** ⛔ **грамматика УЛИКИ — `path:line@`**, которую линт сверяет через `git show :path`, а НЕ против HEAD (~20 строк в `counts.py`). Без неё автор, цитирующий мёртвый указатель как ПРЕДМЕТ записи, вынужден снимать форму якоря руками — я так и сделал 06.09 и объявил это в тексте, но это подгонка ЗАПИСИ под модель прибора, а не починка модели: **законно как последнее исключение, незаконно как привычка**. Та же форма закрывает и ЗАМОРОЖЕННЫЕ отчёты, которым сегодня штамп HEAD стоит прозой (`research/31`/`32`). ⚠ Сегодня без (2) правка любого дока превращается в игру «бей крота»: каждое касание вскрывает соседний голый якорь. ⚠⚠ **ПЕРЕ-ЗАМЕР 06.09 ГРАММАТИКОЙ САМОГО ЛИНТЕРА — МАСШТАБ ОКАЗАЛСЯ В РАЗЫ МЕНЬШЕ, И ЭТО МЕНЯЕТ ЗАКАЗ.** По 117 живым докам: **214 якорей с токеном** (это и есть те, про кого «0 проблемных») и **1776 без токена**; за конец файла целят 66, однозначно разрешаются 9, и семь из девяти — ВНЕШНИЕ цитаты (стандартная библиотека Go, чужой фронтовый код). ⇒ **настоящий внутрирепозиторный протухший якорь ОДИН** (испр. 06.09 автором замера): `docs/architecture/05-decisions-log.md:31`=`Эррата 28.08-и` — **в ШАПКЕ журнала, которую сессия читает первой**; цель нашлась `git log -S` по тексту якоря и пере-навёдена с токеном. ⚠ **Второй кандидат (`PROGRESS.md:71` → `README.md:95`) оказался АРТЕФАКТОМ РАЗРЕШЕНИЯ ИМЕНИ, а не дефектом** — и он же служит уликой к правилу (2) строки 299. ⭐ **Дешёвый метод для ведра «исчезла», исполненный, а не описанный:** `git log -S'<текст якоря>' -- <док> | tail -1` даёт коммит, ВВЕДШИЙ якорь; `git show <коммит>:<цель>` — что стояло в ту минуту ДОСЛОВНО; `git grep` — сегодняшний адрес. Угадывания нет ни на одном шаге. ⛔ **ОПИСАНИЕ ЧУЖОГО МЕТОДА В ЭТОЙ СТРОКЕ БЫЛО ЛОЖНЫМ — СНЯТО 06.09.** Абзац писал, что «59 % на выборке 80» получены наивным резолвингом (голое `mining.go:40` из подкаталога ищут от корня, не находят, объявляют мёртвым). **Наивный резолвинг — метод АГЕНТСКИХ чисел** («42 %», «19 из 32 мертвы»), и опровергнуты им именно они; тем же способом автор пере-замера получил «31 мёртвый из 36» и не понёс их, потому что стал сверять расхождение. Замер Fable 5 устроен иначе и так же описан в ГОЛОВЕ этой строки: берутся только ЗОННО-ПРЕФИКСНЫЕ пути, `git blame` даёт коммит последней правки СТРОКИ ДОКА, `git show <тот коммит>:<цель>` — цель на ту минуту, и сравнивается СОДЕРЖИМОЕ с HEAD. ⇒ строка противоречила сама себе: голова описывала blame-триаж, хвост объявлял его наивным резолвингом. **Класс строки 299, только внутри бэклога.** ⚠ **ДВА ЧИСЛА ОТВЕЧАЮТ НА РАЗНЫЕ ВОПРОСЫ, и потому ни одно не опровергает другое.** Пере-замер грамматикой линтера спрашивает «указывает ли якорь в СУЩЕСТВУЮЩУЮ строку HEAD и совпадает ли токен» — ответ: 214 с токеном, 1776 без, за конец файла 66, однозначно разрешаются 9, настоящий внутрирепозиторный протухший ОДИН. Замер blame спрашивает «изменилось ли СОДЕРЖИМОЕ цели с той минуты, когда строка дока была написана» — ответ: ~59 % на выборке 80. Первый вопрос про HEAD, второй про ДРЕЙФ; строка обязана нести оба, а прежняя редакция вычитала одно из другого. ⚠⚠ **И вопрос HEAD слеп ПО ПОСТРОЕНИЮ к тому самому якорю, ради которого строка заведена:** якорь шапки журнала был написан голым — `seeding.go:143-153`, без слэша, — а `docs/scripts/counts.py:595`=`"~" in rel or "/" not in rel` относит такую форму к «неразбираемым» и пропускает МОЛЧА, ДО всякой проверки файла. ⚠ **Испр. 06.09 по ревью Fable 5: файл НЕ переименовывали** — `seeding.go` жив и сегодня (128 строк), а `bankmaterialize.go` ДОБАВЛЕН `6ec9f8a` 29.08, и в него ПЕРЕЕХАЛ код. Прежняя редакция этой строки писала «переименовали», и следствие «ветвь «файла нет» не выстрелила» было лишним: голое имя до той ветви не доходит по построению. Прибор не видел ровно того случая, с которого начался заказ, — и «0 проблемных» был честен про свой вопрос и слеп про этот. ⚠ И одно слово в этой строке названо неточно: пере-замер сделан ГРАММАТИКОЙ линта (его правила разрешения путей и целей), но не самим линтом и не сверкой токенов — у голых якорей токенов нет — этот якорь линт не видит по построению, и два абзаца строки описывают РАЗНЫЕ приборы одним словом. ⚠ И у метода есть ложные срабатывания: две находки этого же прохода я проверил руками — одна («`STACK.md:11` исчезло») оказалась ЛОЖНОЙ, цель жива и точна | оркестратор | скоро | линт печатает покрытие; голых якорей в ЖИВЫХ доках нет | **D39.202** | +| 306 | ⛔ **СЕМЬСОТ ЯКОРЕЙ БЕЗ ТОКЕНА НЕПРОВЕРЯЕМЫ, И 59% ИЗ НИХ УЖЕ НЕ УКАЗЫВАЮТ ТУДА, КУДА УКАЗЫВАЛИ.** Замер Fable 5 06.09 (выборка 80, seed фиксирован, метод — blame-триаж: коммит последней правки СТРОКИ ДОКА → цель на том коммите → сравнение): цела **31** · уехала **25** · переписана либо исчезла **22** · не судится 2. ⇒ **59% (±11 п.п.)**. ⚠ Линт сверяет по токену 202 и честно печатает «без токена — несверяемы: 780», но ЗАГОЛОВОК «0 проблемных якорей» читается как «всё цело» — прибор отвечает на свой вопрос, а читают его как ответ на другой (`D39.202`). ⚠ **Дрейф сосредоточен там, где он ОЖИДАЕМ:** 34 из 47 сдвинувшихся — в ЗАМОРОЖЕННЫХ отчётах, чьи тела улика по `D23.3` и обязаны описывать дерево НА ДАТУ; их чинить НЕЛЬЗЯ, им нужен штамп HEAD в шапке. **Опасны 13 в ЖИВЫХ носителях**, и часть из них — в ШАПКЕ журнала, то есть в первом, что читает сессия. ⇒ заказ, тремя шагами и без велосипедов: **(1)** заголовок линта печатает ПОКРЫТИЕ («сверено N · несверяемы M · из них с изменившейся целью — K»), чтобы гейт перестал врать формой; **(2)** ОДНОРАЗОВАЯ механическая миграция тем же скриптом: «цела» → дописать токен автоматически, «уехала» с единственным попаданием → пере-навести, «исчезла» → список на руки; замороженным отчётам вместо пере-наводки штамп коммита и исключение из линта; **(3)** правило «токен при касании» остаётся удержанием линии; **(4)** ⛔ **грамматика УЛИКИ — `path:line@`**, которую линт сверяет через `git show :path`, а НЕ против HEAD (~20 строк в `counts.py`). Без неё автор, цитирующий мёртвый указатель как ПРЕДМЕТ записи, вынужден снимать форму якоря руками — я так и сделал 06.09 и объявил это в тексте, но это подгонка ЗАПИСИ под модель прибора, а не починка модели: **законно как последнее исключение, незаконно как привычка**. Та же форма закрывает и ЗАМОРОЖЕННЫЕ отчёты, которым сегодня штамп HEAD стоит прозой (`research/31`/`32`). ⚠ Сегодня без (2) правка любого дока превращается в игру «бей крота»: каждое касание вскрывает соседний голый якорь. ⚠⚠ **ПЕРЕ-ЗАМЕР 06.09 ГРАММАТИКОЙ САМОГО ЛИНТЕРА — МАСШТАБ ОКАЗАЛСЯ В РАЗЫ МЕНЬШЕ, И ЭТО МЕНЯЕТ ЗАКАЗ.** По 117 живым докам: **214 якорей с токеном** (это и есть те, про кого «0 проблемных») и **1776 без токена**; за конец файла целят 66, однозначно разрешаются 9, и семь из девяти — ВНЕШНИЕ цитаты (стандартная библиотека Go, чужой фронтовый код). ⇒ **настоящий внутрирепозиторный протухший якорь ОДИН** (испр. 06.09 автором замера): `docs/architecture/05-decisions-log.md:32`=`Эррата 28.08-и` — **в ШАПКЕ журнала, которую сессия читает первой**; цель нашлась `git log -S` по тексту якоря и пере-навёдена с токеном. ⚠ **Второй кандидат (`PROGRESS.md:71` → `README.md:95`) оказался АРТЕФАКТОМ РАЗРЕШЕНИЯ ИМЕНИ, а не дефектом** — и он же служит уликой к правилу (2) строки 299. ⭐ **Дешёвый метод для ведра «исчезла», исполненный, а не описанный:** `git log -S'<текст якоря>' -- <док> | tail -1` даёт коммит, ВВЕДШИЙ якорь; `git show <коммит>:<цель>` — что стояло в ту минуту ДОСЛОВНО; `git grep` — сегодняшний адрес. Угадывания нет ни на одном шаге. ⛔ **ОПИСАНИЕ ЧУЖОГО МЕТОДА В ЭТОЙ СТРОКЕ БЫЛО ЛОЖНЫМ — СНЯТО 06.09.** Абзац писал, что «59 % на выборке 80» получены наивным резолвингом (голое `mining.go:40` из подкаталога ищут от корня, не находят, объявляют мёртвым). **Наивный резолвинг — метод АГЕНТСКИХ чисел** («42 %», «19 из 32 мертвы»), и опровергнуты им именно они; тем же способом автор пере-замера получил «31 мёртвый из 36» и не понёс их, потому что стал сверять расхождение. Замер Fable 5 устроен иначе и так же описан в ГОЛОВЕ этой строки: берутся только ЗОННО-ПРЕФИКСНЫЕ пути, `git blame` даёт коммит последней правки СТРОКИ ДОКА, `git show <тот коммит>:<цель>` — цель на ту минуту, и сравнивается СОДЕРЖИМОЕ с HEAD. ⇒ строка противоречила сама себе: голова описывала blame-триаж, хвост объявлял его наивным резолвингом. **Класс строки 299, только внутри бэклога.** ⚠ **ДВА ЧИСЛА ОТВЕЧАЮТ НА РАЗНЫЕ ВОПРОСЫ, и потому ни одно не опровергает другое.** Пере-замер грамматикой линтера спрашивает «указывает ли якорь в СУЩЕСТВУЮЩУЮ строку HEAD и совпадает ли токен» — ответ: 214 с токеном, 1776 без, за конец файла 66, однозначно разрешаются 9, настоящий внутрирепозиторный протухший ОДИН. Замер blame спрашивает «изменилось ли СОДЕРЖИМОЕ цели с той минуты, когда строка дока была написана» — ответ: ~59 % на выборке 80. Первый вопрос про HEAD, второй про ДРЕЙФ; строка обязана нести оба, а прежняя редакция вычитала одно из другого. ⚠⚠ **И вопрос HEAD слеп ПО ПОСТРОЕНИЮ к тому самому якорю, ради которого строка заведена:** якорь шапки журнала был написан голым — `seeding.go:143-153`, без слэша, — а `docs/scripts/counts.py:595`=`"~" in rel or "/" not in rel` относит такую форму к «неразбираемым» и пропускает МОЛЧА, ДО всякой проверки файла. ⚠ **Испр. 06.09 по ревью Fable 5: файл НЕ переименовывали** — `seeding.go` жив и сегодня (128 строк), а `bankmaterialize.go` ДОБАВЛЕН `6ec9f8a` 29.08, и в него ПЕРЕЕХАЛ код. Прежняя редакция этой строки писала «переименовали», и следствие «ветвь «файла нет» не выстрелила» было лишним: голое имя до той ветви не доходит по построению. Прибор не видел ровно того случая, с которого начался заказ, — и «0 проблемных» был честен про свой вопрос и слеп про этот. ⚠ И одно слово в этой строке названо неточно: пере-замер сделан ГРАММАТИКОЙ линта (его правила разрешения путей и целей), но не самим линтом и не сверкой токенов — у голых якорей токенов нет — этот якорь линт не видит по построению, и два абзаца строки описывают РАЗНЫЕ приборы одним словом. ⚠ И у метода есть ложные срабатывания: две находки этого же прохода я проверил руками — одна («`STACK.md:11` исчезло») оказалась ЛОЖНОЙ, цель жива и точна | оркестратор | скоро | линт печатает покрытие; голых якорей в ЖИВЫХ доках нет | **D39.202** | | 307 | ⛔ **СПАН ПОД ПОДПИСЬЮ «СКОЛЬКО ЗАКАЗАНО» — ЛОЖЬ ЯРЛЫКОМ, И ЧЕСТНАЯ ФОРМА ДРУГАЯ.** Для заказа, выраженного ЗНАКАМИ, `Run.ordered_chapters` несёт не заказанное, а **СПАН** — сколько глав заказ ЗАТРАГИВАЕТ, считая главу затронутой независимо от того, куплена ли она целиком (`pricing.QuoteUnits` ставит `Chapters: max(chapters, 1)`, вызывающий передаёт `chaptersSpanning`, и сам код называет это «coarser of the two figures»). ⚠ **Замер зоны:** заказ на ОДИН юнит из четырёх в первой главе даёт `1` — **сто процентов завышения на самом дешёвом заказе**, то есть на том, которым сервис пробуют впервые. ⇒ число под именем «ordered chapters», превышающее заказанное, — ложь ярлыком, сколь угодно последовательная. ⭐ **Разбор, снявший спор:** нужда, которую зона защищала («видно, докуда дошли деньги»), настоящая, а носитель неверный — «докуда» есть **ПОЗИЦИЯ** («достигает главы N»), а не **КОЛИЧЕСТВО** («2 главы»), и позиция у платформы УЖЕ ЕСТЬ (`Quote.ThroughChapter`, `BookOrder.ThroughUnitID`). ⚠ Спан ≠ позиция для заказа-продолжения: спан считает затронутые от текущей точки, позиция — ординал. ⇒ **честная форма:** `ordered_chapters: null` для символьного заказа (зеркало `delivered_chapters: null` — «заказано не в главах») + аддитивно `ordered_characters` (эхо запроса) + позиция ординалом, если экрану нужно «докуда». Это смена формы (поле становится нуллабельным) ⇒ минор. ⚠ **Цена смены почти пуста и это ЗАМЕРЕНО:** `ordered_chapters` вошёл в канон только `75ae6f0`, до него в файле НОЛЬ вхождений — клиент 0.10.0 поля не видел никогда, а `ceiling_chapters` тот же минор уже отвергает с 400. ⚠ Поведение менять НЕ требуется: политика «заказ выражен в знаках и меряется в них насквозь» верна и остаётся. До лендинга формы канон описывает ДЕФЕКТ с ⛔-пометкой, а не дизайн | бэкенд+платформа | скоро | `ordered_chapters` нуллабелен, размер заказа эхом, позиция отдельно | **D39.208** | | 308 | **ВИД ПРОГОНА ЗАКОДИРОВАН НУЛ�ём, И ЭТО ЕДИНСТВЕННАЯ ЕГО МЕТКА ВО ВСЕЙ ПЛАТФОРМЕ.** Явного признака ре-прохода у `LiveRun` НЕТ: `Resnapshot` не годится — он ставится и ОБЫЧНОМУ продолжению после правки банка, а валидация `OrderedChapters == 0 && !Resnapshot` читается «ноль допустим только под пере-снапшот», то есть ре-проход ⇒ resnapshot, а не наоборот. ⇒ **вид прогона различается ЗНАЧЕНИЕМ денежного поля**, и держится это на двух вызовах `max(n, 1)` (`pricing.QuoteUnits`, `runs.chaptersSpanning`). ⚠ **Опасность растёт после лендинга формы заказа** (строка 307): снаружи символьный заказ станет `null`, и единственное место, где `max(n,1)` что-то значит, уходит ВНУТРЬ — следующий читатель колонки (отчёт, CLI) напечатает спан под старым словом и не узнает об этом. ⇒ заказ: **явный признак вида** (`RePass`) вместо кодирования вида нулём. ⛔ **Рантайм-пояса `== 0 && OrderedUnits == nil` ставить НЕЛЬЗЯ** — символьный заказ не может записать ноль ни при каких данных, а гейт от несуществующего состояния завтра прочтут как свидетельство, что состояние бывает. Честная защита до рефакторинга — **ПИН инварианта** «символьный заказ на один юнит пишет в колонку 1, никогда 0» (замер у зоны уже есть — сто процентов завышения на самом дешёвом заказе; норма `D39.209` требует превратить замер в пин) плюс одно предложение в комментарий колонки. ⚠ Это рефакторинг в ДЕНЕЖНОМ коде без дефекта сегодня — отдельным паком, не минором формы заказа | платформа | когда-нибудь (после строки 307) | вид прогона читается признаком, а не значением денежного поля | **D39.208** | | 309 | ⛔ **ГЕЙТ ВЕРСИИ КОНТРАКТА СВЕРЯЕТ ЧИСЛА, А НЕ ФОРМЫ — И ПОТОМУ НЕ ВИДИТ ГЛАВНОГО РАСХОЖДЕНИЯ.** `TestTheAnnouncedContractVersionIsTheOneTheCanonRatified` сверяет константу сборки с `info.version` канона. Пока эти два числа равны, гейт ЗЕЛЁН — **даже если провод и документ описывают РАЗНЫЕ формы**. Замерено 06.09 трижды за сутки: канон 0.11.0 объявлял полосу «in chapters», а сборка слала юниты; обещал `ordered_chapters: 0` для символьного заказа, а приезжал спан 2; перечислял три значения словаря, а движок слал четыре. **Ни одно из трёх гейт не покраснил**, потому что число совпадало. ⇒ заказ: сверять ПОЛЯ схемы с проводом, а не только версию. ⭐ **Дешёвая форма названа Fable 5 и уже наполовину оплачена нормой:** тест платформы пишет РЕАЛЬНЫЕ ответы в `examples/*.json` (по действующему правилу «фикстуры снимать реальным бинарём»), канон несёт их в `examples:`, линт сравнивает — тогда фраза «both report 0» умерла бы о файл примера, а не о верификатора через сутки. Прозу это не ловит, ЗНАЧЕНИЯ — ловит. ⚠ Вторая половина той же нормы — **авторство**: утверждение канона о ЗНАЧЕНИИ пишет ЗОНА из своих пинов и называет пин в сообщении коммита; оркестратор ратифицирует текст, а не сочиняет его. Три сегодняшние лжи в каноне написаны тем, у кого не было прогона | оркестратор+платформа | скоро | поля схемы сверяются с проводом порождёнными примерами | **D39.208** | @@ -249,6 +249,7 @@ | 311 | **ПОПРОГОННЫЙ ЛОГ БАТАРЕИ КОПИТСЯ: КАЖДЫЙ УПАВШИЙ ПРОГОН ОСТАВЛЯЕТ СВОЙ ФАЙЛ НАВСЕГДА.** Прежнее ФИКСИРОВАННОЕ имя само себя ограничивало — сколько бы прогонов ни падало, оставался ОДИН несвежий файл, и следующий его перезаписывал. Починка `D39.213` сняла коллизию вместе с этим свойством: `.check.log.` не убирает никто. ⚠ **Замер:** к утру 06.09 в корне зоны лежали ЧЕТЫРЕ таких файла нулевого размера от прибитых прогонов и стаб-проб (удалены зоной как её мусор). ⛔ **Опасность НЕ в коммите** — `platform/.gitignore:3`=`.check.log*` их держит, проверено. Опасность в том, что через месяц человек не отличит «мусор от прерванных прогонов» от «лога, который рецепт НАРОЧНО сохранил при падении, чтобы его прочли», — а второе законная и нужная функция, и она тонет в первом. ⇒ заказ: перед прогоном убирать логи, чей PID УЖЕ МЁРТВ (`[ -d /proc/$p ] || rm -f`). ⛔ Голый `rm -f .check.log.*` ставить НЕЛЬЗЯ: он снова снесёт улику параллельного прогона — ровно тот дефект, из которого всё и выросло. ⚠ Привязка к `/proc` линуксовая; зона на Linux, но это оговорка, а не мелочь. ⭐ **Названо ЗОНОЙ про собственную починку уже ПОСЛЕ того, как я её принял** — то есть ценой не приёмки, а совести | платформа | когда-нибудь (следующее касание прибора) | мёртвые логи убираются, живые не трогаются | **D39.213** | +| 312 | ⚠ **ДВИЖКОВАЯ ПОЛОВИНА ЗАКРЫТА 08.09 (`D39.228`): счётчик нечитаемого оглавления уехал из лога в МАНИФЕСТ — `BookManifest.TOCUnreadable *int`, указателем, чтобы «сайдкар старше поля» отличалось от нуля; пин `TestTheManifestSaysADeclaredTableOfContentsCouldNotBeRead`. ОСТАЁТСЯ ПЛАТФОРМЕННАЯ, и она — ровно исходный вопрос Д-3: увидит ли факт ЧЕЛОВЕК.** ⛔ Замер 08.09: `toc_unreadable` даёт **0 хитов в `platform/` при 200 `.go`** — поле пишется и не читается никем; для пользователя не изменилось НИЧЕГО, книга с нечитаемым оглавлением по-прежнему продаётся по знакам без слова о причине. ⚠ **испр. 08.09: акт `D39.228` объявил строку закрытой и УДАЛИЛ её; строка возвращена суженной** — тот же класс, что 253, и в том же акте обработанный противоположно. Класс A для этого поля НЕ объявлялся (п.8 акта объявляет его только для `consolidation`) — объявляется здесь. Единственный, кто видит ключ сегодня, — оператор, руками запустивший `tmctl manifest`. **Ниже — тело исходной находки.** ЗАЯВЛЕННОЕ, НО НЕЧИТАЕМОЕ ОГЛАВЛЕНИЕ ПРОВАЛИВАЛОСЬ МОЛЧА: книга ЗАЯВИЛА оглавление, движок не смог прочесть эти байты — и тихо падал до spine, отдавая продажу ПО ЗНАКАМ, без единого слова о причине. ⛔ `toc_unresolved = 0`, потому что целей НОЛЬ — прибор честно отвечает на свой вопрос, а читается это как «всё разрешилось» (`D39.202`) | платформа | скоро | причина нечитаемого оглавления доезжает до ЧЕЛОВЕКА, а не до файла | находка ревизии 06.09, пере-открыто кросс-модельным ревью ратификаций 08.09 | | 313 | ⚠ **НОСИТЕЛЬ ПОЯВИЛСЯ 07.09 (`D39.225`): цель `make mutations` гоняет подмножество каталога (14 из 225) на копии дерева и печатает свип якорей СО ЗНАМЕНАТЕЛЕМ (`0 of 225 rotten`) при каждом прогоне, зелёном тоже. Вне `battery` намеренно: пере-замер 07.09 дал 123 % её времени и гейт идёт без `-race`. ОСТАЁТСЯ: остальные 211 записей по-прежнему проверяются только на живость цели.** ⛔ **КАТАЛОГ МУТАЦИЙ ДОКАЗЫВАЕТ, ЧТО МУТАЦИЯ СУЩЕСТВУЕТ, А НЕ ЧТО ОНА ЛОВИТСЯ.** Из **211** записей каталога регулярно гоняются единицы (в паке структуры глав — 14, целящие в изменённое поведение); остальные проверяются только на ЖИВОСТЬ ЦЕЛИ грепом. ⇒ зелёный каталог говорит «посадка на месте», а читается как «посадка краснит». **Тот же класс, что `D39.214` п.3: доказано одно, сказано про другое.** ⚠ Носителя у этого НЕ БЫЛО ни строкой, ни рядом — проверено грепом по живому бэклогу 06.09 по прямому вопросу оркестратора; ближайшая строка 252 говорит о ДВУХ конкретных выживших посадках 04.09 и о полном прогоне не говорит ничего. ⭐ **Третий за час случай, когда находка жила только в письме** (первые два — находки платформы без рядов и нечитаемое оглавление строки 312): **находка без носителя не находится.** ⇒ заказ: либо каталог гоняется целиком по расписанию, либо его зелень перестаёт называться доказательством ловли — формулировку выбирает зона, но молча оставлять нельзя. ⚠ Назвал СТРОИТЕЛЬ про собственный пак, единственным из пяти своих сомнений, что закрыл бы ДО продажи ⚠ **Цена полного прогона ЗАМЕРЕНА 06.09, и отсрочка обоснована ею, а не удобством:** 126 записей из 211 гоняют `internal/pipeline` по ~3 минуты ⇒ полный прогон **6+ часов**. При этом 197 непрогнанных — УНАСЛЕДОВАННЫЕ, каждая краснела у заводившей смены. ⇒ это стоячая гигиена, а не крит; зона прямо отказалась изображать закрытие шестичасовым прогоном «вдруг что-то протухло» | бэкенд | когда-нибудь | зелень каталога означает пойманную мутацию, а не существующую запись | **D39.214** | | 314 | ⛔ **РАЗРЕЗ ПРОВЕРЯЕТСЯ ТОЛЬКО НА НЕИЗМЕННОСТЬ — НА ПРАВИЛЬНОСТЬ ЕГО НЕ ПРОВЕРЯЕТ НИЧТО.** Ни один гейт, тест или замер не отвечает на вопрос «верны ли ЭТИ границы»: гейт сравнивает «до» и «после», оракул сверяет два прибора движка МЕЖДУ СОБОЙ. ⚠ **Инвариант сохранения доказывает СОХРАННОСТЬ и молчит о КОРРЕКТНОСТИ** — он считает разбиение (каждый читаемый документ либо исключён намеренно, либо ровно в одной группе) и сходится ОДИНАКОВО при верной и при неверной группировке, если та ничего не теряет. ⇒ «инвариант сошёлся на трёх живых книгах» доказывает сохранность, а читается как корректность разреза. Что 71 глава для Kristoff — ВЕРНО, не показал никто; показано лишь, что так говорит его `nav`. **Тот же класс, что `D39.214` п.3: доказано одно, сказано про другое.** ⭐ Назвал СТРОИТЕЛЬ про собственный пак, найдя это в своих же утверждениях, а не в чужих. ⚠ **Измеримая часть ЗАМЕРЕНА 06.09 и расхождения не дала:** «совпадает ли отданный разрез с тем, что книга ОБЪЯВЛЯЕТ» — по трём книгам 193 цели оглавления, **все на уровне документа, ни одной внутрь документа** (Kristoff 71 · isekai 88 · fifty_shades 34) ⇒ там, где объявленное можно сверить механически, оно сходится. **Остаётся ровно некруговая часть: верно ли то, что объявляет сам `nav`** — она требует человеческого суждения и не закрывается ни тестом, ни прибором. ⇒ **строка стоит не как задача, а как признанная ГРАНИЦА** | бэкенд | когда-нибудь | есть носитель, отвечающий «верны ли границы», а не только «не изменились ли они» | **D39.214** | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 53d07bd0..b34881ae 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -14,7 +14,7 @@ > сработало правило остановки (9 major из 11 в одном механизме), десять пунктов несёт строка **332**; ложный > инвариант бюджета заландён осознанно (окно лжи 8 секунд при дефолте в 16 минутах, ломается идемпотентность). > **(8) ПЛАТФОРМЕННЫЙ ПАК «РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ» — ✅ ПРИНЯТ И ЗАЛЕНДЕН 08.09, акт `D39.229`** (`ddcbf0c`, 26 путей, $0). Синхронный вход разреза под потолком (`x/sync/semaphore`, число из `jobs.DefaultWorkers`); граница хвоста выведена из кода; регистр приведён к правде — открытых 112 → **109**, major 3 → **1**. ⭐ Потолок сам назвал, чего НЕ ограничивает: материализатор и рекoнсайлер порождают процессы мимо него — строка **364**. Адверсариальный проход: 8 находок, 6 — дефекты этого же пака на ЗЕЛЁНОЙ батарее. -> **(7) ДВИЖКОВЫЙ ПАК «ДВИЖОК УЖЕ ЗНАЕТ» — ✅ ПРИНЯТ С ДВУМЯ ДОФИКСАМИ И ЗАЛЕНДЕН 08.09, акт `D39.228`** (`2b6f1f4`, 21 путь). Закрыты строки 253 · 355 · 357 · 358 · 312. Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля. Третья смена поведения заказана приёмкой — лог и экран перестали спорить о полноте банка. Не взятое получило носители: **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте). Батарея 19 ok · 0 FAIL · `EXIT=0`, каталог мутаций 259 → 276, тесты +17 / −0 — все числа пере-сняты оркестратором. +> **(7) ДВИЖКОВЫЙ ПАК «ДВИЖОК УЖЕ ЗНАЕТ» — ✅ ПРИНЯТ С ДВУМЯ ДОФИКСАМИ И ЗАЛЕНДЕН 08.09, акт `D39.228`** (`2b6f1f4`, 21 путь). Закрыты строки 355 · 357 · 358; у **253** и **312** закрыта только ДВИЖКОВАЯ половина — платформенная жива и ждёт читателя (испр. 08.09 по кросс-модельному ревью ратификаций). Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля. Третья смена поведения заказана приёмкой — лог и экран перестали спорить о полноте банка. Не взятое получило носители: **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте). Батарея 19 ok · 0 FAIL · `EXIT=0`, каталог мутаций 259 → 276, тесты +17 / −0 — все числа пере-сняты оркестратором. > **(6) ВЫДАНЫ ДВА ПАКА 08.09, акт `D39.227`, оба $0.** Движковый «ДВИЖОК УЖЕ ЗНАЕТ» (`BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md`: строки 253 · 357 · 358 · 355, попутно 312) и платформенный «РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ» (`PLATFORM_INTAKE_TRUTH_SESSION_PROMPT.md`: строка 332, семь пунктов из десяти). Оба прошли опровергателя и разбор Fable 5. ⛔ **Заведена строка 360 — самый дорогой движковый класс (23–34 % цены редакторской руки), носителя у него не было;** её ДЕНЕЖНАЯ половина ждёт слова владельца (платит ли пользователь за вызов, оборванный нами) и сцеплена со строкой 331. До ответа пак по 360 не пишется. > **(4) ДИЗАЙН-ПАК 161 — ✅ НАПИСАН 07.09** (`docs/CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md`, `7f84c8d`), прошёл оба > рубежа. ⚠ **НЕ ВЫДАН: новый пак идёт НОВОЙ сессии, обе ночные отработали** — запуск за владельцем. diff --git a/docs/README.md b/docs/README.md index d0d2f66e..e2503b94 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,7 +23,7 @@ | Роль | Активный промт | Статус | |---|---|---| | Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE | - | Бэкенд · ДВИЖОК УЖЕ ЗНАЕТ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДВУМЯ ДОФИКСАМИ 08.09** — акт **D39.228** (`2b6f1f4`, 21 путь); промт в `archive/prompts/` с баннером-исходом. Закрыты строки 253 · 355 · 357 · 358 · 312. Живое из не взятого — **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте); **360** ждёт слова владельца по денежной половине | + | Бэкенд · ДВИЖОК УЖЕ ЗНАЕТ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДВУМЯ ДОФИКСАМИ 08.09** — акт **D39.228** (`2b6f1f4`, 21 путь); промт в `archive/prompts/` с баннером-исходом. Закрыты строки 355 · 357 · 358; у **253** и **312** закрыта ДВИЖКОВАЯ половина, платформенная жива (испр. 08.09 по кросс-модельному ревью: акт объявил обе закрытыми целиком). Живое из не взятого — **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте); **360** ждёт слова владельца по денежной половине | | Бэкенд · КОНСИСТЕНТНОСТЬ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.222**; промт в `archive/prompts/` с баннером исхода. Строки 267 и 318 закрыты, у 320 исполнена половина (а). Живой остаток зоны ЗАКРЫТ актом **D39.226** (строки 333–338); живое — 353–359 | | Бэкенд · ПРАВДА ОПЕРАТОРУ И ДЕНЬГИ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 08.09** — акт **D39.226**, живой платный прогон; промт в `archive/prompts/` с баннером-исходом | | Бэкенд · ГЕЙТ ВМЕСТО ПРОЗЫ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.225**; промт в `archive/prompts/` с баннером-исходом | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index be6a6224..7461aca1 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -5,6 +5,7 @@ > ⚠ **Эррата 15.08 (D39.132):** D39.131 п.2(а) перечисляет полосу отказов «10 конфиг · 11 источник · 12 лок · 19 безымянный» — читать через D39.132 п.2(г): полоса ДОПОЛНЕНА **exit 13 = `schema_mismatch`** (~~обе зоны сошлись на числе независимо~~; ратифицирован направлением, ФИНАЛИЗИРОВАН приёмкой D39.134). > ⚠ **Эррата 15.08-б (D39.134 п.2а, вписана по аудиту корпуса):** клейм «зоны сошлись на 13 НЕЗАВИСИМО» (строкой выше и в D39.132 п.2г) СНЯТ — платформа прочитала число из незакоммиченного дерева движка и сама это записала (`platform/internal/ingest/exit.go:63-64`); на силу ратификации не влияет. > ⚠ **Эррата 15.08-в (D39.136 п.5):** форма контракт-ревью «фазный воркфлоу оркестратора» ОТМЕНЕНА словом владельца тем же днём — исполняет ОТДЕЛЬНАЯ СЕССИЯ со своим онбордингом (норма D39.120 п.2; оркестратор — автор части ратификаций 0.2.3, author≠reviewer); запущенная воркфлоу-фаза 1 остановлена, её результаты выброшены; промт — `docs/CONTRACT_REVIEW_SESSION_PROMPT.md`. +> ⚠⚠ **Эррата 08.09-г (`D39.228` п.1 и п.3) — ТРИ ОШИБКИ ОДНОГО АКТА, НАЙДЕНЫ КРОСС-МОДЕЛЬНЫМ РЕВЬЮ РАТИФИКАЦИЙ, которое норма велела провести ДО ратификации, а я провела ПОСЛЕ.** **(а) ⛔ ЦЕНА БАМПА НАЗВАНА ДЕНЬГАМИ, КОТОРЫХ ТАМ НЕТ.** Пункт 3 пишет, что бамп `manifestVersion` «выбрасывает каждый сохранённый сайдкар и ПЕРЕКУПАЕТ каждую книгу». Код говорит другое и говорит это четырежды (`manifest.go:78`, `:99`, `:118`, `:729`): «discard every stored sidecar and **re-cut** / **re-chunk** every book». Ре-чанк — процессор, не деньги: единственный денежный читатель манифеста (`rebill.go`) на нулевом манифесте не объявляет ряд перепокупкой, а делает дорогую сверку контент-хешей и при совпадении продолжает как `$0 resume`. Настоящая цена бампа — пере-нарезка на каждом чтении, одна дорогая проверка в гейте согласия и **релиз платформы В НОГУ** (`KnownManifestVersion`), и последний довод СИЛЬНЕЕ денежного, но в ноте не назван. ⇒ **правило пункта 3 остаётся в силе, довод под ним заменён:** запрет бампа держится на двузонном релизе, а не на перепокупке. ⚠ Следующий, кто станет взвешивать бамп, взвесил бы не ту цену. **(б) ⛔ СТРОКА 312 ЗАКРЫТА НАПОЛОВИНУ И УДАЛЕНА ЦЕЛИКОМ — тот же класс, что 253, в том же акте решённый ПРОТИВОПОЛОЖНО.** Живым остатком 312 был Д-3 — «увидит ли ноту ЧЕЛОВЕК»; после лендинга поле `TOCUnreadable` пишется в манифест и не читается никем: **0 хитов `toc_unreadable` в `platform/` при 200 `.go`**. Факт переехал из лога в файл, которого никто не открывает, и для пользователя не изменилось ничего. Строка ВОЗВРАЩЕНА суженной до платформенной половины; класс A для этого поля объявлен там же (акт объявлял его только для `consolidation`). **(в) ⛔ ЭРРАТА 08.09-в ЗАКРЫЛА 1 НОСИТЕЛЬ ИЗ 6.** «253 закрыта» стояло ещё в `05-decisions-index.md`, `docs/README.md`, CURRENT-STATE `docs/PROGRESS.md` и баннере архивного промта — а следующая сессия онбордится с CURRENT-STATE, а не с шапки журнала. Приведены к правде вместе с 312. ⚠ Это МОЯ ЖЕ норма «класс закрыт только со ЗНАМЕНАТЕЛЕМ N из M», применённая к моей же эррате и не исполненная. **(г) Атрибуция коммита.** `f1404f0` (акт ПЛАТФОРМЫ) унёс закрытие ДВИЖКОВЫХ рядов 312/355/357/358 и сужение 253; движковый акт `e9a0f78` бэклога не трогал вовсе. Историю не переписываю — читателю `git log -- docs/BACKLOG.md` объясняет эта строка. > ⚠ **Эррата 08.09-в (`D39.228` п.1) — АКТ ОБЪЯВИЛ ЗАКРЫТОЙ СТРОКУ, У КОТОРОЙ ЗАКРЫТА ПОЛОВИНА.** Пункт 1 писал «закрыты строки 253 · 355 · 357 · 358». Для 253 это неверно: её собственное тело называет лечением (б) «полнота консолидации в сайдкар **+ поле на `BankPage`**», и второй половины нет — у секции `consolidation` ноль читателей, класс A заведён сознательно. ⇒ строка СУЖЕНА до платформенной половины, не удалена; 355 · 357 · 358 · 312 закрыты и удалены. ⛔ **Класс `D39.167` п.1 в чистом виде, и поймала его та же норма, что его называет:** «каждое утверждение акта о ряде сверяется его СТАТУСОМ в тот же заход» — сверка сделана через час после акта, а не до, и это разрыв в МОЁМ порядке: ратификация и сверка носителей обязаны идти ОДНИМ движением, иначе акт живёт с переоценкой ровно столько, сколько я собираюсь до неё дойти. > ⚠⚠ **Эррата 08.09-б (`D39.221`) — МОЙ РАТИФИКАЦИОННЫЙ КОММИТ ОСТАВИЛ ГЕЙТ ВЕРСИИ КОНТРАКТА КРАСНЫМ НА СУТКИ, И ЭТО ТОЧНАЯ ИНВЕРСИЯ ПОРЯДКА, КОТОРЫЙ САМ ЖЕ ПРОЕКТ РАТИФИЦИРОВАЛ.** `D39.208` п.1: код идёт первым с ЧЕСТНО КРАСНЫМ гейтом версии, канон гасит его вторым — «гейт не подгоняли под мир, а мир привели к гейту». Я сделала наоборот. Замер (`git show <коммит>:<файл>`): на `fda0679`, лендинге зоны, канон `0.12.0` И `httpapi/capabilities.go` `ContractVersion = "0.12.0"` ⇒ гейт ЗЕЛЁНЫЙ, и число акта «батарея 20/8/`EXIT=0`» — честное, под сомнение НЕ ставится. Следующий коммит, мой `3d90943`, увёл канон на `0.13.0` и константу за собой не потянул ⇒ `gates.TestTheAnnouncedContractVersionIsTheOneTheCanonRatified` красен с 07.09: «this build announces contract 0.12.0 and the ratified canon is 0.13.0». Практическое следствие названо самим гейтом: клиент, сгенерённый по объявленному `0.12.0`, откажет на формах, которые деплой реально возвращает. ⛔ **Нашла это платформенная сессия на СВОЁМ входном baseline, через сутки, и только потому, что промт велел снимать его самостоятельно** — то есть между моим ратификационным коммитом и следующей сессией зоны батарею не гоняет никто. Константу поднимает зона (её файл), заказанность объявлена мной явно: это обслуживание от ратифицированной смены (`D39.183`), а не правка ради зелени. ⚠ Урок в свою сторону и он общий: **бампнув канон, я обязана пере-гонять гейт ТОЙ зоны, чей код канон судит** — мой собственный `counts.py --check` этого класса не видит по построению, он сверяет доки с доками. > ⚠ **Эррата 08.09-а (`D39.185`) — УКАЗАТЕЛЬ НА РЕЕСТР НАХОДОК РЕВИЗИИ ВЕДЁТ В НИКУДА.** Тело ноты дважды diff --git a/docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md b/docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md index abf941bb..74fc5c7a 100644 --- a/docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md +++ b/docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md @@ -1,5 +1,6 @@ > ⚠ **ОТРАБОТАН И ПРИНЯТ С ДВУМЯ ДОФИКСАМИ 08.09 — акт `D39.228`, лендинг `2b6f1f4` (21 путь).** -> Инструкции ниже НЕ исполняются: пак закрыт. Исход: закрыты строки 253 · 355 · 357 · 358, взята 312 Д-3; +> Инструкции ниже НЕ исполняются: пак закрыт. Исход: закрыты 355 · 357 · 358, а у 253 и 312 — только ДВИЖКОВАЯ половина (испр. 08.09: акт объявил их закрытыми +> целиком, платформенные половины живы); > приёмкой заказана ТРЕТЬЯ смена поведения (лог и экран перестали спорить о полноте банка); ратифицировано, > что аддитивное поле манифеста ключ не двигает, но обязано быть отличимо от своего нуля. Не взятое получило > носители — строки **362** (ремонт против ремонта) и **363** (текстовый сайдкар молчит о неполноте);