Close the catalogue hole with a run that stands on its own, and record that the bearing-test count arrives truncated in the stream but whole in the logs

This commit is contained in:
heaven 2026-09-05 23:21:29 +03:00
parent bab0a31b92
commit 5c7a8ca4b3
2 changed files with 2 additions and 1 deletions

View file

@ -349,7 +349,7 @@
| 296 | **ТОЧЕЧНАЯ ПЕРЕГЕНЕРАЦИЯ ПО ПРОМАХУ ГЛОССАРИЯ — направление владельца 05.09 («или флагать, или перегенерировать проблемный участок»), работы сегодня НЕТ.** Актуаторы ремонта — только `RepairLatinResidue` и `RepairBrokenWord` (`backend/internal/pipeline/repair.go`, греп `defaultRepairClasses`); `glossary_miss` нет ни там, ни в `knownRepairClasses`. Сегодняшние лекарства не точечные и обе дороги: удержать ВЕСЬ фрагмент (гейт) либо править глоссарий с `--resnapshot`, то есть ПЕРЕ-ОПЛАТИТЬ книгу. ⇒ заказ: `glossary_miss` как класс-актуатор — перегенерация участка с подписанной формой. ⚠ Гейтится строкой **295**: без замера точности перегенерация по ложному срабатыванию перепишет верный текст | бэкенд | когда-нибудь (после 295) | новый класс актуатора + пост-инвариант | **D39.205** |
| 297 | ⛔ **СЛОВАРЬ ПРОВЕНАНСА СТРУКТУРЫ КОРОЧЕ НА ОДНО ЗНАЧЕНИЕ, И ПЛАТФОРМА ЖИВЁТ НА ВРЕМЕННОМ ПРАВИЛЕ.** Для EPUB-spine ложны ВСЕ ТРИ значения `Document.Structure` (`backend/internal/chunk/ingest.go:70-113`): `declared` = «ФОРМАТ назвал границу», а spine называет ПОРЯДОК ЧТЕНИЯ, и «документ = глава» — догадка движка, не слово формата; `detected` определено МЕХАНИЗМОМ «header-shaped lines in the prose» (`splitTextChapters`), которого здесь не было; `none` = «одна глава». ⚠ Само поле спроектировано ВЕРНО — оно отвечает на «КАКОЙ ПУТЬ провёл границы» (`:94-95`); неверна его же первая строка (`:70`), рекламирующая «how much the chapter cut can be trusted». Прибор отвечает на свой вопрос, а читают его как ответ на другой, и здесь неверное чтение НАПЕЧАТАНО ВНУТРИ прибора, двумя строками выше верного. Пока значения нет, платформа исполняет потребительское решение, прописанное в самом комментарии (`:93-94`, «decline to offer an order in chapters»): `declared` ведётся как `none` для целей ползунка заказа. **Правило ВРЕМЕННОЕ, и снятие его — уборка, а НЕ сцепленный деплой.** Добавить значение можно АДДИТИВНО: `manifestVersion` версионирует ФОРМУ ДОКУМЕНТА (`backend/internal/pipeline/manifest.go:40-46`), а новое значение строкового поля формы не меняет — так же приехали сами `Structure` и `Price`. Стоп-мир возник бы только из CHECK-ограничения схемы платформы (`platform/internal/pgstore/migrations/00033_order_and_price.sql:28`), которое противоречит её же обещанию «unknown → not recognised» и снимается ДО лендинга. ⇒ как только движок пошлёт новое значение для spine, платформа прочтёт неизвестное как `none` своим `StructureTrusted`, и для SPINE-книг ползунок станет верным САМ. ⚠ **Испр. 05.09: «без правки на её стороне» — НЕВЕРНО и снято.** Правка нужна, и снятие правила ОБЯЗАТЕЛЬНО: после пака `declared` станет означать ТОЛЬКО настоящую структуру глав из `nav`/NCX, и временное правило начнёт ОТНИМАТЬ у таких книг заслуженный ползунок глав. Отказ безопасен по направлению (продаём по знакам там, где могли по главам — консервативно, не опасно), но он МОЛЧА недодаёт продукт, и потому это не уборка, а обязательный шаг. Носитель довода зона положила в комментарий `ingest.ChapterOrdersOffered`, чтобы снимающий нашёл его по коду. ⚠ По тому же правилу под недостающее значение попадает и `\f` в txt — form feed есть разрыв СТРАНИЦЫ, а не утверждение о главе, и сегодня он тоже `declared`; решает структурный пак | бэкенд+платформа | скоро (структурный пак) | недостающее значение на проводе, и `declared` означает ТОЛЬКО объявленную форматом структуру глав | **D39.202**, D39.205 |
| 298 | ⛔ **`unit_resolutions` КЛЮЧЕВАНЫ ПОЗИЦИЕЙ, И ЛЮБОЙ ПЕРЕКРОЙ ИХ СНОСИТ ЦЕЛИКОМ.** Ключ `(book_id, chapter, unit, wave)` позиционен по построению, и миграция это прямо объявляет: «keyed by the ENGINE's own ordinals» (`platform/internal/pgstore/migrations/00015_seam_ceiling_and_units.sql:50-56`); событие `unit_done` несёт номер главы и ординал юнита, синк пишет их как есть (`platform/internal/pgstore/sink.go:249`). Потому при перекрое платформа ОБЯЗАНА удалять решения — иначе они перевесятся на чужую главу. Сегодня цена нулевая: решения есть только у стенд-книги, и это окно закрывается с каждой новой платной книгой. ⇒ разрешать `(chapter, unit)` в идентификатор ПРИ ПРИЁМЕ события, пока дерево у платформы на руках, и хранить идентификатор. Платформенная половина структурного пака: миграция плюс синк. ⚠ Этой строкой НЕ закрывается одноразовая перечеканка всех id при смене смысла `cutTag` — это другой предмет и другая цена | бэкенд+платформа | скоро (структурный пак) | решения переживают перекрой, не переклеиваясь на чужую главу | **D39.202** |
| 299 | ⛔ **ИМЯ В GO-КОММЕНТАРИИ, КОТОРОЕ НИ ВО ЧТО НЕ РАЗРЕШАЕТСЯ, — И НИЧТО ЭТОГО НЕ ЛОВИТ.** Два живых носителя, найдены верификацией 05.09 (`D39.207` п.3): **(а)** `backend/internal/runevents/runevents.go:187` цитирует `docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md:78`, а файл УДАЛЁН — промт уведён в архив тем же коммитом, что писал акт, и цитируемая фраза лежит в архивной копии на другой строке; **(б)** `backend/internal/config/internal_call.go:11` и `backend/internal/pipeline/live_reprobe_test.go:14` называют сторожами тесты `TestSyntheticStageSeamIsSingle` и `TestProviderEgressSeamIsSingle`, которых в дереве НЕТ — инварианты при этом реально сторожатся вет-анализаторами `StageSeam`/`EgressSeam` (`backend/internal/archguard/archguard.go:80,377`), то есть гарантия цела, а назначенный ей сторож ВЫДУМАН. Замер верификатора: из 2026 упомянутых в Go имён `Test…` определены 2012; из восьми неразрешающихся четыре — не дефекты (надгробия и иллюстрация), два — мелочь, два — эти. ⇒ **дешёвая половина открытого вопроса `D39.202` п.9: не «доказал ли каталог, что названный тест умеет падать» (дорого, требует интеграции с `tmmutate`), а «РАЗРЕШАЕТСЯ ли названное имя вообще» — это греп, и сегодня он находит два дефекта.**`counts.py --lint` этого класса не видит по построению: он читает доки, а не код. ⚠⚠ **ДВА ПРАВИЛА, БЕЗ КОТОРЫХ ГЕЙТ ВЫКЛЮЧАТ НА ВТОРОЙ ДЕНЬ** (принесены верификатором вместе с находкой): **(1)** разрешением считается и ПРЕФИКС — доки и комментарии цитируют имя усечённым, как греп-цель; **(2)** НАДГРОБИЯ не дефект — комментарий, прямым текстом говорящий «удалён/заменён», законен, как и иллюстративное имя в примере. Замер, обосновывающий оба: из восьми неразрешающихся имён СЕГОДНЯ четыре — надгробия и иллюстрация, два — усечение в шапке над функцией, и лишь два — настоящие выдуманные сторожа. Гейт без этих правил краснеет 8 из 8, то есть врёт вчетверо, и его погасят — а гейт умирает не отключением, а вытеснением из привычки (`D39.202` п.3-бис) | бэкенд | скоро | грепом: имя `Test…` и `<док>.md:<строка>` в Go разрешаются, иначе красно | **D39.207**, D39.202 |
| 299 | ⛔ **ИМЯ В GO-КОММЕНТАРИИ, КОТОРОЕ НИ ВО ЧТО НЕ РАЗРЕШАЕТСЯ, — И НИЧТО ЭТОГО НЕ ЛОВИТ.****ЗАМЕР 05.09, полностью меняющий форму ДОРОГОЙ половины (той, что сверяет имя с каталогом мутаций): она обязана писать ФАЙЛ, а не читать `stdout`.** Полный прогон каталога дал: несущих верхнеуровневых тестов **194** из 1213 тест-функций движка (**16,0 %** батареи), и **139 записей из 197 пинятся РОВНО ОДНИМ тестом** — то есть краснота атрибутируется однозначно, и долговременная запись «какие тесты несущие» реально получается. ⛔ **Но тул обрезает список имён на четырёх и печатает `+N more` — так усечены 9 записей из 197, и механизм, читающий `stdout`, насчитал бы 178 вместо 194 И НЕ УЗНАЛ БЫ ОБ ЭТОМ.** Это тот же класс «прибор ответил на свой вопрос»: величина ВЫЧИСЛЯЕТСЯ сегодня, но в поток приезжает УСЕЧЁННОЙ. ⇒ вход механизма — `-logs`, не вывод. Точный список имён воспроизводится пере-прогоном каталога с `-logs`; сохранять его отдельным артефактом не нужно. Два живых носителя, найдены верификацией 05.09 (`D39.207` п.3): **(а)** `backend/internal/runevents/runevents.go:187` цитирует `docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md:78`, а файл УДАЛЁН — промт уведён в архив тем же коммитом, что писал акт, и цитируемая фраза лежит в архивной копии на другой строке; **(б)** `backend/internal/config/internal_call.go:11` и `backend/internal/pipeline/live_reprobe_test.go:14` называют сторожами тесты `TestSyntheticStageSeamIsSingle` и `TestProviderEgressSeamIsSingle`, которых в дереве НЕТ — инварианты при этом реально сторожатся вет-анализаторами `StageSeam`/`EgressSeam` (`backend/internal/archguard/archguard.go:80,377`), то есть гарантия цела, а назначенный ей сторож ВЫДУМАН. Замер верификатора: из 2026 упомянутых в Go имён `Test…` определены 2012; из восьми неразрешающихся четыре — не дефекты (надгробия и иллюстрация), два — мелочь, два — эти. ⇒ **дешёвая половина открытого вопроса `D39.202` п.9: не «доказал ли каталог, что названный тест умеет падать» (дорого, требует интеграции с `tmmutate`), а «РАЗРЕШАЕТСЯ ли названное имя вообще» — это греп, и сегодня он находит два дефекта.**`counts.py --lint` этого класса не видит по построению: он читает доки, а не код. ⚠⚠ **ДВА ПРАВИЛА, БЕЗ КОТОРЫХ ГЕЙТ ВЫКЛЮЧАТ НА ВТОРОЙ ДЕНЬ** (принесены верификатором вместе с находкой): **(1)** разрешением считается и ПРЕФИКС — доки и комментарии цитируют имя усечённым, как греп-цель; **(2)** НАДГРОБИЯ не дефект — комментарий, прямым текстом говорящий «удалён/заменён», законен, как и иллюстративное имя в примере. Замер, обосновывающий оба: из восьми неразрешающихся имён СЕГОДНЯ четыре — надгробия и иллюстрация, два — усечение в шапке над функцией, и лишь два — настоящие выдуманные сторожа. Гейт без этих правил краснеет 8 из 8, то есть врёт вчетверо, и его погасят — а гейт умирает не отключением, а вытеснением из привычки (`D39.202` п.3-бис) | бэкенд | скоро | грепом: имя `Test…` и `<док>.md:<строка>` в Go разрешаются, иначе красно | **D39.207**, D39.202 |
| 300 | ⛔ **РЕПО-ШИРОКИЙ СТОРОЖ НЕ ДОТЯГИВАЕТСЯ ДО СОСЕДНЕГО ВОРКРИ НА ДРУГОЙ ВЕТКЕ — и стенд от этого УЖЕ СГНИЛ.** ⚠ Замер 05.09, вторая половина: снять пин манифеста стенд-конфигами удалось для **ОДНОГО исходника из восьми**; семь падают, и ни одно падение не про структурный пак. Причины — ретированные в `main` вещи, живые в дереве `polygon`: плейсхолдер `{{genre}}` (ретирован `D39.138` п.2в) — в моём дереве `grep -rln '{{genre}}' backend/prompts/` ПУСТ, в соседнем живёт в ШЕСТИ файлах промтов, и падают на нём 6 конфигов из 8; поля `stm_depth`/`overlap_tokens`, которых больше нет в `config.ContextAssembly` — 1 из 8; ключи `mined_delta:`/`mined_rejects:` (ретированы `D39.156` п.3) — **17 конфигов из 31**. ⭐ **Тест `genre_retired_test.go:46` предсказал этот случай дословно** («should be caught by the repository that retired it, not by a paid run») — и поймали его действительно бесплатно, но **сторож не дотянулся до соседней ветки**, где ретированное живо. ⇒ общая форма дефекта: ретирование, проведённое репо-широким гейтом, НЕ распространяется на воркри другой ветки, и стенд тихо остаётся в прошлом. **ЧАСТНЫЙ СЛУЧАЙ ТОГО ЖЕ КОРНЯ — ДАННЫЕ ПАР-ПАКА В ДВУХ ВЕТКАХ.** Замер бэкенд-сессии 05.09 по 31 конфигу `book.yaml` стенда 蛊真人: у **20** `langpack_root` указывает в СОСЕДНЕЕ РАБОЧЕЕ ДЕРЕВО `/home/ubuntu/projects/textmachine`а оно на ветке **`polygon`**; у 9 — в `main`; 2 не объявляют его вовсе. Пока каждая ветка собирается из своего дерева, расхождения не видно. ⚠ **Структурный пак (`CHAPTER_STRUCTURE_SESSION_PROMPT.md`) выносит `marker`/`units` из `zh-ru/heading.txt` в данные ИСТОЧНИКА и учит `parseHeading` ОТВЕРГАТЬ эти ключи с переходным сообщением** ⇒ старый файл, оставшийся на `polygon`, станет невалидным, и двадцать конфигов не загрузятся вовсе (загрузка пар-пака FAIL-LOUD). **Выстрелит НЕ при лендинге в `main`, а в момент, когда полигон вольёт `main` в свою ветку** — то есть цена назначена чужой зоне и в чужой момент. ⇒ заказ: перед мержем полигон либо снимает `marker`/`units` из своего `heading.txt`, либо переводит `langpack_root` своих конфигов на `main`. ⚠ Второе дешевле и, возможно, правильнее по существу: **каталоги `configs/langpacks` в обоих деревьях сегодня БАЙТ-В-БАЙТ идентичны** (`diff -rq` пуст, sha256 `heading.txt` совпадают), а комментарии в конфигах, утверждающие «`ru/` есть только здесь», ПРОТУХЛИ — класс строки 299. То есть двадцать конфигов смотрят в чужую ветку по причине, которой больше нет | полигон | скоро (до мержа main в polygon) | конфиги грузятся после мержа, либо `langpack_root` переведён | **D39.207** |
| 301 | ⛔ **`--max-units` НЕ УМЕЕТ СКАЗАТЬ «ДОРАБОТАЙ ПЕРЕНЕСЁННОЕ И НЕ НАЧИНАЙ НОВОГО», И ЧЕЛОВЕК ЗА СВОИ ДЕНЬГИ ПОЛУЧАЕТ НЕ ТУ РАБОТУ.** Флаг бюджетирует N НОВЫХ стартов, а carried-юниты (задрафченные прошлым прогоном и не отгруженные) движок допускает СВЕРХ гранта, до N штук: `granted()` их не считает (`backend/internal/pipeline/volume.go:396-407`), и собственный тест движка это фиксирует — под `--max-units 1` при одном carried выходит `Delivered=2, Carried=1` (`volume_test.go:721`). ⇒ прогон, оборвавшийся МЕЖДУ волнами (стоп на подпись банка, деплой, краш), при респауне получает `--max-units = заказ доставлено`, и движок оплачивает ЧЕРНОВИКИ глав, которых человек НЕ ЗАКАЗЫВАЛ, раньше редактуры заказанных. ⚠ **Это НЕ перерасход**`--ceiling-usd` держит сумму; ломается ровно обещание «вы купили N»: за те же деньги приходит другая работа. Выразить нужное платформа не может по построению: вычесть carried значит обнулить грант, а ноль для движка = «без границы» (`planVolume` при `MaxUnits <= 0` возвращает `nil`, `volume.go:321`). ⇒ заказ: словарь скоупа обязан различать «сколько НОВЫХ начинать» и «сколько всего допускать». Живая половина **эрраты 03.09-а** (перенос юнита вне гранта, семантика НЕ ратифицирована, слово владельца «подумаем»), но со следствием более острым, чем записано в ноте: там был перерасход единиц, здесь — подмена предмета покупки | бэкенд+платформа | скоро | флагом выражается «ничего нового не начинать»; пин на респауне между волнами | **D39.207** |

View file

@ -39,6 +39,7 @@
> далёк в обоих случаях, вывод приёмки не меняется, но в каноне стоит число из гейта, а не из грепа.
> ⚠ **Эррата 02.09-а (D39.182, «три блокера приёмки закрыты») — у ТРЕТЬЕГО блокера не осталось носителя.** Заголовок и §1 ноты держат счёт «3 блокера», но отчёт пака называет сегодня только два: ревизия доков 02.09 сняла из `backend/docs/MONEY_HONESTY_REPORT.md` разделы «Сверка с заказом по пунктам» и «ПРИЁМКА: три блокера и пять дофиксов» (проверка: греп `^## 9.11` и `^## 1\.` по файлу — пусто, при живом `^## 6.2`). **Третий блокер — вердикт «предъявлено» поверх неработающего пути:** в снятом §1 отчёта вердикты **A0** и **A6** стояли «предъявлено» на НЕПОЛНОЙ проверке и были сняты вместе с блокером 2, а пере-предъявлены посадками `TestAHealthyGlossaryPassIsNotReportedAsALoss` и `TestTheCONSENTGateSeesAnInPlaceSourceEdit` (грепаются по `backend/`). Дословный текст снятых разделов — `git show bd2077b:backend/docs/MONEY_HONESTY_REPORT.md`. Тело ноты не переписывается (D23.3).
> ⚠ **Эррата 05.09-и (D39.207 п.6, «каталог мутаций целиком не перегонял») — ДЫРА ЗАКРЫТА ПРОГОНОМ.** Пункт честно записывал, что верификатор проверил СОСТАВ каталога статически и тем повторил дыру приёмки, а не закрыл её. Прогон состоялся: **201/201 записей получили вердикт, каждая РОВНО ОДИН раз** (сверено программно по id) — **197 RED · 4 `survives` · 0 SURVIVED · 0 `RED!` · 0 NOTHING · 0 ROTTED · 0 неожиданных исходов**, baseline зелен во всех десяти пакетах в каждом вызове. ⭐ **Множество фактически выживших ТОЧНО РАВНО множеству записанных `expect: survives`** — сверено как МНОЖЕСТВА: `G-byte-gate`, `WB62-innocent-const-must-not-be-accused`, `MS-reserve-under-the-gate`, `MS-reservation-released-on-marshal-failure`. ⇒ «197 RED» из `D39.206` §2 больше не держится на счёте записей в JSON. ⚠ **ФОРМА: это СКЛЕЙКА ВОСЬМИ вызовов (2 ч 29 мин против калиброванных ~50), шесть убиты нехваткой памяти; ОДНИМ ПРОГОНОМ НЕ ЯВЛЯЕТСЯ.** Законность предъявлена механически: покрытие 201/201 без пересечений, дерево между вызовами — `diff -r --brief`, побайтно идентично, 334 файла, проверено ПЯТЬ раз. ⚠ В двух убитых вызовах тул НЕ напечатал `restored on terminated`, и чистота там держится на побайтном сравнении, а не на самоотчёте инструмента. ⚠ Флагов было ТРИ варианта (`-p` снижался дважды), а не два, как я полагал, — объявил верификатор сам; `-parallel`/`GOMAXPROCS` не трогались, семантика тестов одна. ⚠ И моя оговорка «неожиданный исход перегнать под флагами первого вызова» **исполнена ВХОЛОСТУЮ**: неожиданных исходов не было ни одного, то есть правило осталось НЕИСПОЛЬЗОВАННЫМ, а не соблюдённым — формулировка верификатора, и она точнее моей. ⚠ Форма улики пере-проверена по объединённому корпусу логов: строк `RED`, не называющих ни одного упавшего теста, — **0** из 197; маркеров `INCONCLUSIVE`/`signal: killed`/`out of memory`**0**. Нехватка памяти не превратила ни одной зелени в ложную красноту.
> ⚠ **Эррата 05.09-ж (D39.201 §2в) — ПРИЧИНА НЕПРОВЕРКИ ПРИПИСАНА НЕВЕРНО.** Пункт объясняет непроверку тем, что стенд зоны неисполним («Failed to connect to bus») и «проверит только боевой хост». Замерено верификатором на ЭТОЙ машине: пользовательский systemd ДОСТУПЕН — `make conditions` в `platform/` печатает `systemctl --user reachable`, пробник `systemd-run --user --collect --unit=… /bin/true` вернул 0. ⇒ блокер был свойством ОКРУЖЕНИЯ той сессии, а не свойством непроизводственного хоста, и сценарий здесь ИСПОЛНИМ. Сама находка не портится — неверна приписанная ей причина; разбор и норма, из неё выросшая, — `D39.207` п.5.
> ⚠ **Эррата 05.09-з (D39.206 §1) — ПЕРЕЧЕНЬ ЛЕНДИНГОВ ПАКА НЕПОЛОН.** Названы `81a89e9`, `616a8e4` и `ba4fd34`; НЕ назван **`e7d6b3f`**, правящий доки того же пака — и именно он пере-навёл шесть якорей, оставив без внимания соседний указатель в Go-комментарии (`D39.207` п.3, F2). Полный состав пака — четыре коммита.
> ⚠ **Эррата 05.09-е (D39.190 п.2) — «ПОТЕРЯННЫЙ ЗАГОЛОВОК У ШЕСТИ ГЛАВ ИЗ СЕМНАДЦАТИ» НЕ ИМЕЕТ НОСИТЕЛЯ.** Пункт 2 обосновывает вес структурной строки «свежей уликой полигона» — вычиткой семнадцати глав боевого перевода, нашедшей потерянный заголовок у шести глав из семнадцати (≈800 на книге). **Число подано без единой ссылки на файл**, и поиск первоисточника не дал его ни мне, ни независимо коллеге-Fable 05.09: в `eval/dovodka/` находится план на семнадцать глав, но не счёт потерянных заголовков. ⇒ Число НЕ отзывается — оно может быть верным, — но **опирать на него скоуп ЗАПРЕЩЕНО**: механизм потери не установлен (роняет модель? теряется на экспорте? не показывает читалка?), а лечение зависит от механизма. Титульная работа структурного пака стоит на СОБСТВЕННОМ основании — заголовок, не едущий по проводу, невозможно отрендерить, — а не на этой улике. Кто найдёт первоисточник, впишет адрес сюда.