Correct the premise of the canon row: the signed seed is set in eighteen configs of the tree, and drift was observed with it loaded

This commit is contained in:
heaven 2026-09-11 03:26:37 +03:00
parent debe11c132
commit af024c81e6

View file

@ -227,7 +227,7 @@
| 292 | ⛔ **ЧЕСТНОСТЬ ТРЁХ СТРОК НАБЛЮДАЕМОСТИ — ЖИВАЯ ПОЛОВИНА (б) ЗАКРЫТОЙ СТРОКИ 105, заведена 05.09 отдельным носителем.** Закрытие 105 сняло только половину (а) — предикат `isBankRole`; половину (б) чинить никто не заказывал, а на неё ссылались ДВА носителя как на «до фикса 105». Три дефекта, все воспроизведены: **(1)** строка `VOICE` берёт `rules=` из конфига ВРЕМЕНИ ОТЧЁТА (`backend/internal/pipeline/quality.go`, греп `rules=`), поэтому включение `gates.voice` ПОСЛЕ прогона печатает «измерено, чисто» для книги, которую никто не мерил; **(2)** та же строка печатается при ВЫКЛЮЧЕННОМ гейте, если `SpoilerLeaks>0` — поведение верное, неверна формулировка отчёта; **(3)** знаменатель `BANKNOTE` = `len(states)` вместе с призрачными строками `retrieval_state`, тогда как соседний агрегатор их фильтрует ⇒ после пере-чанковки покрытие ЗАНИЖАЕТСЯ. ⚠ Цена молчания прямая: отчёт говорит «измерено», когда не мерили, — это ложь читателю в том самом месте, куда смотрят, решая, готова ли книга. Печатает `cmd/tmctl/render.go` (греп `rules=`), пин — `render_observability_test.go`. | бэкенд | скоро | правка формулировки + знаменателя + тест на «включил гейт после прогона» | D39.86, D39.200; археология — `architecture/13-tech-debt-anchors.md` §Б-105 п.(б) |
| 293 | ⛔ **ФАЙЛ ПОД ЛЮБЫМ КАТАЛОГОМ `books/` НЕВИДИМ ДЛЯ GIT — `git status` его не показывает, `git add` молча не берёт, и сдающая зона теряет работу, не заметив.** Предъявлено 05.09 платформенной сессией и проверено оркестратором до лендинга: `git check-ignore -v platform/internal/books/counter_test.go``<git-common-dir>/info/exclude:9:books`. **Причина: правило `books` в `.git/info/exclude` НЕЯКОРЕНО**, а gitignore без ведущего `/` ловит каталог с этим именем на ЛЮБОЙ глубине. ⚠ Неякорность ОСМЫСЛЕННА и снимать её нельзя не думая: `books` в связанном рабочем дереве — СИМЛИНК, а трекнутое правило `/books/` матчит только каталоги (комментарий стоит там же). ⚠ **Почему это не поймал никто:** тронутые файлы того же каталога в `git status` ВИДНЫ (игнор действует лишь на неотслеживаемое), поэтому пропажа не читается глазами; а `git commit -- <путь>` untracked роняет и без игнора. Замер: без `git add -f` уехал бы 31 файл из 32. **Лечение — не «поправить exclude»:** файл ОБЩИЙ для всех рабочих деревьев клона, включая полигонное, и менять семантику игнора под живыми сессиями нельзя. Формы, между которыми выбирать: (а) якорить правило под КОНКРЕТНЫЙ симлинк (`/books` в корне дерева) и проверить, что симлинк по-прежнему игнорируется во ВСЕХ деревьях; (б) оставить как есть и завести проверку лендинга — `git status --ignored --short <зона>` перед каждым актом. | оркестратор | скоро (гигиена лендинга, $0) | выбор формы + проверка во всех воркtree | предъявлено платформенной сессией 05.09; проверено исполнением при лендинге `7e2226a` |
| 294 | ⭐ **ФОРМА «СКОЛЬКО ДОБАВИТЬ» — решение владельца 05.09, ратифицировано `D39.203`.** Наружу вместо «сколько не хватило на ЭТОТ вызов» едет **«сколько добавить, чтобы прошёл ЛЮБОЙ следующий»** = `max(shortfall, step_max headroom)`: сегодняшняя недостача закрывает текущий вызов, а следующий может быть крупнее, и человек доплачивает дважды. ⚠ **НЕ однострочник, и объявлять его дешёвым было бы ошибкой** (зона дешевизну не подтвердила): новая величина · **ПЕРЕИМЕНОВАНИЕ поля**`shortfall_micro_usd` станет ложным именем, кандидат `top_up_micro_usd` · минор `StreamVersion` 1.3→1.4 · зеркало словаря у платформы · пере-снятие пина белого списка кадра `ceiling`. ⚠ Построенное поле НЕ ложно, оно у́же: закрывает вызов, а не следующий шаг | бэкенд+платформа | скоро | новая величина + переименование + минор потока | **D39.203**; тензия п.(3) против п.(4) заказа найдена зоной движка |
| 295 | ⛔ **СНАЧАЛА ПОДАТЬ ПОДПИСАННЫЙ КАНОН В ПРОГОН — только потом мерить точность чекера и решать про гейт.** Живая дыра приоритета №1 владельца («100% консистентность») — НЕ порог и НЕ флаг: канон из 53 подписанных терминов **не подключён к стенду**, весь замеренный дрейф — дрейф С ОТКЛЮЧЁННЫМ каноном, а там, где его подключали, консистентность 99.3100%. ⇒ мерить полноту чекера на прогоне без канона значит мерить не то. **Порядок:** (1) канон в прогон · (2) пере-замер точности/полноты (строка **12**, прежний замер порочен — класс одного иероглифа не имел ни одного положительного примера) · (3) решение владельца по `gates.glossary.postcheck_gate`. ⚠ Владелец 05.09: «если он ложно положительно будет стрелять это плохо, очень плохо» ⚠ **ПОЛОВИНЫ НАЗВАНЫ 06.09 по ревью напарника — прежде тут стояло «назвать или отдать», и это переезжало бы следующей смене той же инерцией.** **(а) Полигон/владелец:** подать канон в стенд-книгу — это ДАННЫЕ (сид-YAML либо решения `bank-apply`) ПЛЮС платный прогон под санкцией; у бэкенд-сессии нет ни книги, ни стенда, ни денег, поэтому половина её не является. **(б) Бэкенд — только ВОПРОСОМ, а не задачей:** умеет ли сид-путь нести подписанный статус; если нет — это пинг оркестратору, и тогда появляется бэкендовая работа. ⇒ зона ведущая — полигон. | полигон (бэкенд — по вопросу) | скоро | подача канона + замер | **D39.205**, D39.198 п.3-4, строка 12 |
| 295 | ⛔ **СНАЧАЛА ПОДАТЬ ПОДПИСАННЫЙ КАНОН В ПРОГОН — только потом мерить точность чекера и решать про гейт.** Живая дыра приоритета №1 владельца («100% консистентность») — НЕ порог и НЕ флаг: канон из 53 подписанных терминов **не подключён к стенду**, весь замеренный дрейф — дрейф С ОТКЛЮЧЁННЫМ каноном, а там, где его подключали, консистентность 99.3100%. ⇒ мерить полноту чекера на прогоне без канона значит мерить не то. **Порядок:** (1) канон в прогон · (2) пере-замер точности/полноты (строка **12**, прежний замер порочен — класс одного иероглифа не имел ни одного положительного примера) · (3) решение владельца по `gates.glossary.postcheck_gate`. ⚠ Владелец 05.09: «если он ложно положительно будет стрелять это плохо, очень плохо» ⚠ **ПОЛОВИНЫ НАЗВАНЫ 06.09 по ревью напарника — прежде тут стояло «назвать или отдать», и это переезжало бы следующей смене той же инерцией.** **(а) Полигон/владелец:** подать канон в стенд-книгу — это ДАННЫЕ (сид-YAML либо решения `bank-apply`) ПЛЮС платный прогон под санкцией; у бэкенд-сессии нет ни книги, ни стенда, ни денег, поэтому половина её не является. **(б) Бэкенд — только ВОПРОСОМ, а не задачей:** умеет ли сид-путь нести подписанный статус; если нет — это пинг оркестратору, и тогда появляется бэкендовая работа. ⇒ зона ведущая — полигон.**ИСПР. 11.09 АУДИТОМ БАНКА — ГОЛОВНАЯ ПОСЫЛКА РЯДА ВЕРНА ТОЛЬКО ПРО СТЕНД.** Пере-снято: «канон ни разу не подан в прогон» справедливо для ИССЛЕДОВАТЕЛЬСКОГО стенда (там 0 конфигов из 30 несут ключ сида), но НЕ для дерева: ключ `glossary_seed` задан в **18** конфигах (прибор — `yaml.safe_load` по 150 `.yaml` в `books/gu-zhenren`, контроль: не распарсилось 0; греп подстроки давал 25, и в шести из них ключа НЕТ). Пять прогонов держат 3657 подписанных строк, а весь размеченный корпус (91 единица) снят с прогонов С каноном, и дрейф ПРИ каноне наблюдён живьём (`古月方源` → «Гу Юэ Фан Юань» при подписанном `古月 → Гуюэ`). ⇒ порядок работ меняется: это не «сперва подключить канон», а **«разметить класс, которого в корпусе не было»** — $0 на уже оплаченных артефактах плюс новый прогон. Носитель разбора — `docs/research/34-memory-bank-quality-audit.md`; прямая причина низкой точности названа рядом **408** (данные, не код). | полигон (бэкенд — по вопросу) | скоро | подача канона + замер | **D39.205**, D39.198 п.3-4, строка 12 |
| 296 | **ТОЧЕЧНАЯ ПЕРЕГЕНЕРАЦИЯ ПО ПРОМАХУ ГЛОССАРИЯ — направление владельца 05.09 («или флагать, или перегенерировать проблемный участок»), работы сегодня НЕТ.** Актуаторы ремонта — только `RepairLatinResidue` и `RepairBrokenWord` (`backend/internal/pipeline/repair.go`, греп `defaultRepairClasses`); `glossary_miss` нет ни там, ни в `knownRepairClasses`. Сегодняшние лекарства не точечные и обе дороги: удержать ВЕСЬ фрагмент (гейт) либо править глоссарий с `--resnapshot`, то есть ПЕРЕ-ОПЛАТИТЬ книгу. ⇒ заказ: `glossary_miss` как класс-актуатор — перегенерация участка с подписанной формой. ⚠ Гейтится строкой **295**: без замера точности перегенерация по ложному срабатыванию перепишет верный текст | бэкенд | когда-нибудь (после 295) | новый класс актуатора + пост-инвариант | **D39.205** |
| 297 | ✅ **ПЕРВАЯ ПОЛОВИНА ИСПОЛНЕНА ЛЕНДИНГОМ 06.09 (`2f65d1d`, акт `D39.210`): словарь получил четвёртое значение `delimited`**, и spine-EPUB вместе с `\f` в txt больше не выдаются за слово формата. ⛔ **ВТОРАЯ ПОЛОВИНА ТЕПЕРЬ ОБЯЗАТЕЛЬНА, А НЕ ЖЕЛАТЕЛЬНА:** временное правило платформы «`declared` вести как `none`» после лендинга начинает ОТНИМАТЬ ползунок глав у книг, чья структура объявлена настоящим `nav`/NCX — то есть молча недодавать продукт. ⚠ **Якоря прежней редакции этой строки указывали на текст, который пак УДАЛИЛ, а якорный линт этого НЕ ВИДЕЛ** — они были без токена, файл длинный, адрес «разрешался». Живая рабочая строка протухла молча; класс несёт строка **306**, и это его первый пойманный случай в рабочей строке, а не в архиве. ⚠ **Тело прежней редакции СНЯТО 06.09, а не оставлено под шапкой** — оно цитировало рекламу «how much the chapter cut can be trusted» как живую улику, а пак её УДАЛИЛ (`grep -c` → 0), и три его якоря целили в текст, которого нет: словарь уехал, а `:94-95` попал в структуру, введённую дофиксом. То есть строка утверждала про себя, что она первый пойманный случай «якорь протух молча», и одновременно продолжала им БЫТЬ; поймал это строитель пака грепом, линт был зелён. **Что стало вместо снятого:** словарь живёт на `backend/internal/chunk/ingest.go:125-149`=`WHICH PATH drew the chapter boundaries` — четыре значения, и первая же строка комментария теперь говорит про ПУТЬ, а не про доверие. Прежняя двусмысленность («поле отвечает на провенанс, а рекламирует доверие») **устранена паком, а не описана** | бэкенд+платформа | скоро (структурный пак) | недостающее значение на проводе, и `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** |