Widen the guard from one journal to every journal a zone writes to, after the same trap caught a third report, and record the risk a wrong reason had hidden

This commit is contained in:
heaven 2026-09-06 01:55:16 +03:00
parent 98d2d4ad18
commit cbbb5dfc01
3 changed files with 10 additions and 3 deletions

View file

@ -26,8 +26,13 @@ Pathspec-форма `git commit -- <пути>` защищает от чужог
зоны `docs/`, в который ПИШУТ чужие зоны (секции «Бэкенд»/«Полигон», решение владельца). Итог: твой зоны `docs/`, в который ПИШУТ чужие зоны (секции «Бэкенд»/«Полигон», решение владельца). Итог: твой
коммит про свою строку бэклога уносит чужой отчёт под твоим сообщением. Содержимое цело, теряется коммит про свою строку бэклога уносит чужой отчёт под твоим сообщением. Содержимое цело, теряется
атрибуция; **историю НЕ переписывать** — сообщить владельцу и зоне. атрибуция; **историю НЕ переписывать** — сообщить владельцу и зоне.
⇒ **Исполнимый шаг, а не «быть внимательным»: ПЕРЕД каждым коммитом `docs/PROGRESS.md` смотри ⇒ **Исполнимый шаг, а не «быть внимательным»: ПЕРЕД каждым коммитом ЛЮБОГО ЗОННОГО ЖУРНАЛА смотри
`git diff -- docs/PROGRESS.md` и опознай, есть ли там ЧУЖИЕ секции.** Есть — либо коммить их отдельным `git diff -- <файл>` и опознай, есть ли там ЧУЖИЕ секции.** ⛔ **Список полный, и он НЕ сводится к
`docs/PROGRESS.md`:** `docs/PROGRESS.md` (секции «Бэкенд»/«Полигон») · `platform/docs/platform-PROGRESS.md` ·
`frontend/docs/frontend-PROGRESS.md` · `platform/docs/DEFECT_REGISTER.md`. ⚠ **Первая редакция этого шага
называла ОДИН файл, и ловушка сработала третий раз — на `platform-PROGRESS.md`**: правило было писано
про ЭКЗЕМПЛЯР, а не про КЛАСС, и потому не сработало там, где класс тот же. Класс: любой файл, куда
пишет зона, а коммитишь ты. Есть — либо коммить их отдельным
коммитом с сообщением о ЧУЖОЙ работе (тогда атрибуция в сообщении, а не в авторстве), либо дождись, коммитом с сообщением о ЧУЖОЙ работе (тогда атрибуция в сообщении, а не в авторстве), либо дождись,
пока зона допишет, и назови её в сообщении. Знание «этот файл общий» было записано ещё утром и не пока зона допишет, и назови её в сообщении. Знание «этот файл общий» было записано ещё утром и не
помогло — потому что не называло ДЕЙСТВИЯ. **Функции:** промты сессий → приёмки → ратификации помогло — потому что не называло ДЕЙСТВИЯ. **Функции:** промты сессий → приёмки → ратификации

View file

@ -19,7 +19,7 @@
> - **Курс:** этапы ОБЩНОСТЬ · КАЧЕСТВО БАНКА · ПАКЕТ-ЧЕКЕРОВ · ФРОНТ-ЭРА · шов/платформа/движковые блокеры — ПРОЙДЕНЫ (D39.59123). Хвосты курса живут строками: 16 (полная цена холодного старта; edit-волна на малых прогонах отработала и оплачена — 58 вызовов волновым драйвером 2325.07 плюс 648 до драйвера, счёт по леджерам `~/books/gu-zhenren/**/*.db`) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`). > - **Курс:** этапы ОБЩНОСТЬ · КАЧЕСТВО БАНКА · ПАКЕТ-ЧЕКЕРОВ · ФРОНТ-ЭРА · шов/платформа/движковые блокеры — ПРОЙДЕНЫ (D39.59123). Хвосты курса живут строками: 16 (полная цена холодного старта; edit-волна на малых прогонах отработала и оплачена — 58 вызовов волновым драйвером 2325.07 плюс 648 до драйвера, счёт по леджерам `~/books/gu-zhenren/**/*.db`) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`).
> - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; остаток арбитража банка = рецензент спорных кластеров при ре-пробе — D39.102). ⚠ **Испр. 05.09 (D39.198 п.5):** прежняя редакция держала здесь ТРИ предусловия, снятых владельцем, — жильцы ролей (149: разморозка ничего не разблокирует, пока идут доработки) · веса K1K12 (13а: веса не нужны, мерить по узлам) · вне-претрейн чекпоинт (55: прогоняем на тех же текстах, оговорка — ограничение ВЫВОДА, а не требование новой книги) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 6268, 85) → Ф3 ридер-IDE (6971). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены). > - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; остаток арбитража банка = рецензент спорных кластеров при ре-пробе — D39.102). ⚠ **Испр. 05.09 (D39.198 п.5):** прежняя редакция держала здесь ТРИ предусловия, снятых владельцем, — жильцы ролей (149: разморозка ничего не разблокирует, пока идут доработки) · веса K1K12 (13а: веса не нужны, мерить по узлам) · вне-претрейн чекпоинт (55: прогоняем на тех же текстах, оговорка — ограничение ВЫВОДА, а не требование новой книги) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 6268, 85) → Ф3 ридер-IDE (6971). **Стоячие:** ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены).
> - **Стек (полная карта роль→модель→конфиг→квирки — [STACK.md](STACK.md), D39.126):** draft deepseek-v4-flash thinking-ON `low` **⚠0731** → терминолог (та же модель) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (топология ПОДТВЕРЖДЕНА при неразличимости жильцов — D39.117; закон-блок ОБЯЗАТЕЛЕН и ВНЕСЁН — D39.104 п.2, вайр-батч принят D39.199; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — ⚠ **ТРИГГЕР ПЕРЕ-КАЛИБРОВКИ СРАБОТАЛ 31.08** (испр. 02.09): платный прогон отработал и дал собственную оценку движка `projected_book_usd = 1.1377277707` на десяти главах при куплённых $0.436110; число D30.4 держать как июльское. ⚠ **Вендор-факты 1315.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137):** таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.24.4 в пике / ×2.12.2 в долине — замер по трём прогонам); ⚠ **испр. 05.09: носители про эффорт `pro` БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ** — и квирки (§3г), и `STACK.md` говорят одно: ручка ДОХОДИТ до модели с вендор-апдейта 13.08. Живой остаток один — вендор-сверка маппинга и ВЕЛИЧИНА эффекта, строка **237**(б); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) ВКЛЮЧЁН в shipping-c1 с `b8154cd`**`enabled: true` у обоих гейтов и `classify_types: true`, бюджеты по $1.00 (прежде жил только ран-локальным конфигом книги; строка 140 — ⛔ его единственный вход `mining.contrast_path` в git ОТСУТСТВУЕТ, развёртывание обязано положить артефакт, иначе контур не исполняется вовсе, носитель — строка 251; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания). > - **Стек (полная карта роль→модель→конфиг→квирки — [STACK.md](STACK.md), D39.126):** draft deepseek-v4-flash thinking-ON `low` **⚠0731** → терминолог (та же модель) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (топология ПОДТВЕРЖДЕНА при неразличимости жильцов — D39.117; закон-блок ОБЯЗАТЕЛЕН и ВНЕСЁН — D39.104 п.2, вайр-батч принят D39.199; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — ⚠ **ТРИГГЕР ПЕРЕ-КАЛИБРОВКИ СРАБОТАЛ 31.08** (испр. 02.09): платный прогон отработал и дал собственную оценку движка `projected_book_usd = 1.1377277707` на десяти главах при куплённых $0.436110; число D30.4 держать как июльское. ⚠ **Вендор-факты 1315.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137):** таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.24.4 в пике / ×2.12.2 в долине — замер по трём прогонам); ⚠ **испр. 05.09: носители про эффорт `pro` БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ** — и квирки (§3г), и `STACK.md` говорят одно: ручка ДОХОДИТ до модели с вендор-апдейта 13.08. Живой остаток один — вендор-сверка маппинга и ВЕЛИЧИНА эффекта, строка **237**(б); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) ВКЛЮЧЁН в shipping-c1 с `b8154cd`**`enabled: true` у обоих гейтов и `classify_types: true`, бюджеты по $1.00 (прежде жил только ран-локальным конфигом книги; строка 140 — ⛔ его единственный вход `mining.contrast_path` в git ОТСУТСТВУЕТ, развёртывание обязано положить артефакт, иначе контур не исполняется вовсе, носитель — строка 251; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания).
> - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **215** строк · зона бэкенд **106** строго / **148** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **87** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **216** строк · зона бэкенд **106** строго / **148** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **88** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
> - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 1116, rerun2) · **`-25-31` (паки 1720 · мини-прогон · полигон-пакеты 58 · ToS · холодный прогон; D39.2658)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.5990, срез D39.105)** · **`-08-02-04` (сессии №11№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91105 + снимок шапки эры №15)** · `-08-04-09` (пинги закрытых паков эры №15) · **`-08-14-15` (закрытые бэкенд-записи №1617: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139)**. Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139). > - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 1116, rerun2) · **`-25-31` (паки 1720 · мини-прогон · полигон-пакеты 58 · ToS · холодный прогон; D39.2658)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.5990, срез D39.105)** · **`-08-02-04` (сессии №11№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91105 + снимок шапки эры №15)** · `-08-04-09` (пинги закрытых паков эры №15) · **`-08-14-15` (закрытые бэкенд-записи №1617: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139)**. Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139).
## 📌 СОСТОЯНИЕ ПАКОВ ## 📌 СОСТОЯНИЕ ПАКОВ
@ -354,6 +354,7 @@
| 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** | | 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** |
| 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** | | 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** | | 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** |
*(Указатели на архив-слайсы хроники — бюллетенем «Архивы хроники» в CURRENT-STATE; здесь копий нет.)* *(Указатели на архив-слайсы хроники — бюллетенем «Архивы хроники» в CURRENT-STATE; здесь копий нет.)*

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). > ⚠ **Эррата 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).
> ⚠ **Эррата 06.09-б (эррата 05.09-к) — ГАРД, НАПИСАННЫЙ ПРОТИВ ЛОВУШКИ, БЫЛ СУЖЕН ДО ЭКЗЕМПЛЯРА И ЛОВУШКА СРАБОТАЛА ТРЕТИЙ РАЗ.** Эррата 05.09-к назвала верный корень (pathspec берёт файл ЦЕЛИКОМ и от чужого ВНУТРИ файла не защищает) и внесла исполнимый шаг — но шаг назвал **один файл**, `docs/PROGRESS.md`. 06.09 тот же класс сработал на **`platform/docs/platform-PROGRESS.md`**: мой коммит правки одного якоря унёс ЧЕТВЁРТЫЙ ЗАХОД платформенной зоны — её проверку собственных утверждений, сделанную по прямому вопросу владельца. Содержимое цело, потеряна атрибуция; историю не переписывал. ⇒ **Шаг расширен на КЛАСС** (любой зонный журнал: `docs/PROGRESS.md` · `platform-PROGRESS.md` · `frontend-PROGRESS.md` · `DEFECT_REGISTER.md`). ⚠ Урок на уровень выше прежнего: **правило, написанное про ЭКЗЕМПЛЯР, не защищает от КЛАССА** — и это ровно то, в чём смена уличала зоны весь день, только теперь в норме, которую писал я сам.
> ⚠ **Эррата 06.09-а (D39.208 п.7) — НОТА УТВЕРЖДАЛА ТО, ЧЕГО ФАЙЛ НЕ ДЕРЖАЛ.** Пункт 7 писал, что «`getRunOptions` приобрёл 409, **внесён в состав минора**». В каноне у операции стояли только `200/401/404`: я бампнул `info.version` до 0.11.0 и правку ответа НЕ внёс, то есть версия объявляла поведение, которого канон не описывал. **Класс строки 299 ВНУТРИ D-ноты** — нашёл коллега-Fable сверкой ноты с файлом. Исправлено 06.09: `'409'` с описанием причины `not_priced` и прямой оговоркой, что операция ВПЕРВЫЕ научилась отказывать, а клиент по 0.10.0 встретит код, которого нет в его заглушках. Тем же заходом сняты зеркала эры шкалы в `15-money-path.md` (`CeilingBounds` ретирован, шкалы в главах больше нет — абзацы оставлены историей под баннером). ⚠ Урок в свою сторону: **акт приёмки — тоже носитель, и он врёт ровно так же, как код**; «внесено в состав минора» я написал о собственном намерении, а не о состоянии файла. > ⚠ **Эррата 06.09-а (D39.208 п.7) — НОТА УТВЕРЖДАЛА ТО, ЧЕГО ФАЙЛ НЕ ДЕРЖАЛ.** Пункт 7 писал, что «`getRunOptions` приобрёл 409, **внесён в состав минора**». В каноне у операции стояли только `200/401/404`: я бампнул `info.version` до 0.11.0 и правку ответа НЕ внёс, то есть версия объявляла поведение, которого канон не описывал. **Класс строки 299 ВНУТРИ D-ноты** — нашёл коллега-Fable сверкой ноты с файлом. Исправлено 06.09: `'409'` с описанием причины `not_priced` и прямой оговоркой, что операция ВПЕРВЫЕ научилась отказывать, а клиент по 0.10.0 встретит код, которого нет в его заглушках. Тем же заходом сняты зеркала эры шкалы в `15-money-path.md` (`CeilingBounds` ретирован, шкалы в главах больше нет — абзацы оставлены историей под баннером). ⚠ Урок в свою сторону: **акт приёмки — тоже носитель, и он врёт ровно так же, как код**; «внесено в состав минора» я написал о собственном намерении, а не о состоянии файла.
> ⚠ **Эррата 05.09-к (D39.200, разбор «`git add docs/` унёс чужой отчёт») — ТА ЖЕ ЛОВУШКА СРАБОТАЛА ВТОРОЙ РАЗ ЗА СМЕНУ, И ПЕРВАЯ ЗАПИСЬ ЕЁ НЕ ПРЕДОТВРАТИЛА.** Утром корень был записан верно («`docs/PROGRESS.md` — единственный файл зоны `docs/`, в который пишут чужие зоны») и вывод сделан правильный (коммитить pathspec-формой). Вечером коммит `e8ec901` — строка бэклога 302, pathspec-форма, индекс чист — **всё равно унёс секцию отчёта бэкенд-зоны** (пак структуры глав), потому что **pathspec берёт рабочее состояние ФАЙЛА ЦЕЛИКОМ и от чужого ВНУТРИ файла не защищает вовсе**. Содержимое цело, потеряна атрибуция; историю не переписывал, зона уведомлена, нашла это сама. ⇒ **Первая запись назвала ФАКТ и не назвала ДЕЙСТВИЯ, и потому не сработала.** Исполнимый шаг внесён в ролевой промт оркестратора: перед каждым коммитом `docs/PROGRESS.md` смотреть `git diff -- docs/PROGRESS.md` и опознавать чужие секции. ⚠ Урок шире случая: **знание, записанное как факт, а не как шаг, не мешает повторению** — и это тот же класс, что `D39.202` п.3-бис (гейт умирает не отключением, а вытеснением из привычки). > ⚠ **Эррата 05.09-к (D39.200, разбор «`git add docs/` унёс чужой отчёт») — ТА ЖЕ ЛОВУШКА СРАБОТАЛА ВТОРОЙ РАЗ ЗА СМЕНУ, И ПЕРВАЯ ЗАПИСЬ ЕЁ НЕ ПРЕДОТВРАТИЛА.** Утром корень был записан верно («`docs/PROGRESS.md` — единственный файл зоны `docs/`, в который пишут чужие зоны») и вывод сделан правильный (коммитить pathspec-формой). Вечером коммит `e8ec901` — строка бэклога 302, pathspec-форма, индекс чист — **всё равно унёс секцию отчёта бэкенд-зоны** (пак структуры глав), потому что **pathspec берёт рабочее состояние ФАЙЛА ЦЕЛИКОМ и от чужого ВНУТРИ файла не защищает вовсе**. Содержимое цело, потеряна атрибуция; историю не переписывал, зона уведомлена, нашла это сама. ⇒ **Первая запись назвала ФАКТ и не назвала ДЕЙСТВИЯ, и потому не сработала.** Исполнимый шаг внесён в ролевой промт оркестратора: перед каждым коммитом `docs/PROGRESS.md` смотреть `git diff -- docs/PROGRESS.md` и опознавать чужие секции. ⚠ Урок шире случая: **знание, записанное как факт, а не как шаг, не мешает повторению** — и это тот же класс, что `D39.202` п.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.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**. Нехватка памяти не превратила ни одной зелени в ложную красноту.