diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 8e1b68f3..a475a7eb 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -326,9 +326,9 @@ | 403 | **ЦЕПОЧКА «СВИП → ОСТАНОВКА → НАСТОЯЩИЙ systemd» НЕ ПРОЙДЕНА НИЧЕМ, и это объявлено ЗАРАНЕЕ, а не найдено потом.** Платформенная сессия дважды за смену упиралась в одно: пины говорят о ЮНИТЕ (живой systemd-стенд у зоны есть) либо о СТОРЕ (живой Postgres есть), а утверждения о поведении живут в СВИПЕ — и стенда, который проводит служебный обход через настоящую остановку настоящего юнита, в зоне нет. ⇒ две правки этой смены (`--no-block` в `560ca20` и ответ живым именем юнита в `00d590e`) доказаны каждая на своём уровне и НЕ доказаны сквозной цепочкой; так и записано в обеих секциях «что не удалось». ⚠ Заведено строкой по её же просьбе — чтобы следующий не открывал вопрос заново и не принял «пин зелёный» за «цепочка проверена». ⭐ Отдельно ценно, что предупреждение сделано ДО сдачи, а не после: сессия назвала границу своего доказательства сама | платформа | когда-нибудь | есть стенд, проводящий свип через настоящую остановку настоящего юнита, ИЛИ записано решение, что такой стенд не строится и почему | объявленная граница платформенной сессии, 11.09 | | 404 | ⚠ **СТРОКА ПЕРЕ-ПИСАНА 11.09: её центральное утверждение было МОЕЙ ОШИБКОЙ.** Первая редакция говорила, что мутация с уехавшим якорем «не краснеет, перестаёт сажаться, и в отчёте „не посадилась“ неотличимо от „пережила“», и что механизма против этого НЕТ. **Механизм есть, и он в самом `tmmutate`:** запись с уехавшим якорем получает вердикт `rotted`, печатается отдельной строкой и **засчитывается как неожиданный исход — прогон завершается ненулевым кодом**; довод записан в самом инструменте (`backend/cmd/tmmutate/main.go`, греп `an entry whose anchor moved guards nothing`). Пере-снято мной по возражению движковой сессии, которая в этот класс наступила и была поймана СВОИМ ЖЕ прибором: `make mutations` дал `MAKE-EXIT=2 · RED 151 · SURVIVED 0 · ROTTED 1`, и протухшей оказалась ЧУЖАЯ запись, сломанная её правкой. ⛔ **ЖИВОЙ ОСТАТОК КЛАССА — не мутации, а ДОКИ И КАТАЛОГИ, где такого счётчика нет.** Линтер доков сверяет ПО СОДЕРЖИМОМУ только якоря опт-ин токен-формы; голый `файл:строка` он не видит по построению, и его протухание не даёт ни красноты, ни строки в выводе (замер 10.09: из 19 голых якорей живых секций реестра долга съехали 10, при 9 из 9 целых токен-формных). ⭐ И побочный урок, названный сессией: знаменатель проверки якорей надо брать ИЗ КАТАЛОГА, а не из своих правок — она проверила три свои записи и не проверила чужую, которую сломала | доки | скоро | у голых `файл:строка` в живых доках есть счётчик, дающий ненулевой выход, — либо они переведены в токен-форму | находка движковой сессии 11.09, пере-снята оркестратором | | 405 | **РАЗМЕН ПО СТРОКЕ 375 ИМЕЕТ НАЗВАННУЮ ЦЕНУ: проекция расходится с леджером на оборванной попытке.** Починка «обрыв не стирает уже заработанный вердикт» (заландена `3084766`) оставляет позиции прежний `cost_usd`, поэтому деньги ОБОРВАННОЙ попытки в попозиционную проекцию не добавляются: **леджер полон, проекция нет**. Названо самой движковой сессией при сдаче, а не найдено потом. ⇒ тот, кто будет сверять проекцию с леджером на книге, где были обрывы поверх отгруженных позиций, увидит расхождение и не должен принять его за потерю денег — деньги в леджере. ⚠ Заведено ОТДЕЛЬНОЙ строкой намеренно: это цена размена, который оркестратор утвердил осознанно (потеря отгруженного текста хуже неточности отчёта), и она обязана стоять рядом с ним, а не всплыть через месяц | бэкенд | когда-нибудь | попозиционная проекция и леджер сходятся на книге с обрывами поверх отгруженных позиций, либо расхождение объявлено в самой проекции | сдача движковой сессии 11.09 | -| 406 | ⛔ **КОНСИСТЕНТНОСТЬ КНИГИ НИКТО НЕ СПРАШИВАЕТ — ПРИБОРА ПО ОТГРУЖЕННОМУ ТЕКСТУ НЕТ ВОВСЕ.** Мера «сколько РАЗНЫХ передач дал один термин» ПОСТРОЕНА (`Spread`/`Variants`, `backend/internal/pipeline/mining.go:383-384`=`how many DISTINCT renderings the drafts produced`), но считается по ЧЕРНОВИКУ, на стопе майнинга, ДО редакторской волны, и читает её только человеческая таблица подписи. По ФИНАЛЬНОМУ тексту такой меры не существует ни одной. ⇒ приоритет №1 владельца («консистентные термины на всю книгу») сегодня НЕПРОВЕРЯЕМ в принципе: все четыре A/B, показавшие пользу банка, меряли ПРИСУТСТВИЕ инъектированной формы в чанке, а не отсутствие конкурирующей. **Лечение $0 и переиспользует готовое:** тот же счёт по отгружаемому тексту + строка отчёта сборки «термин X отдан тремя формами в главах 12, 340, 901». Предмет не пуст: полигонный прибор на стенде дал 13–16 % терминов с более чем одной передачей. ⚠ Это ЕДИНСТВЕННАЯ работа, которая делает качество ПРЕДЪЯВИМЫМ; без неё кривую деградации по главам снять не с чего ⛔ **ИСПОЛНЕНО ЧАСТЬЮ 11.09 ПРОГОНОМ A, и первый же результат снял мою же формулировку слепого пятна.** Прибор построен полигоном и дал по отгруженному тексту «0 терминов из 40 отданы более чем одной формой». ⚠ **Ноль держался на том, что прибор НЕ СМОТРЕЛ:** кандидаты искались регуляркой, требующей ЗАГЛАВНОЙ буквы (`[А-ЯЁ][а-яёА-ЯЁ-]+`), и склонённые строчные формы («гу-мастера», «наложницей») отпадали ДО правила сравнения. Я заказал переписать правило сравнения пословно — **заказ бил мимо**: критик применил этот рецепт к прибору на боевых данных, и не вернулся НИ ОДИН из 29 потерянных термов. Починка ГЕНЕРАЦИИ кандидатов на тех же данных даёт **48 найденных вместо 40 и шесть строк со `spread ≥ 2`** там, где печатался ноль. ⚠ И заголовочный «0» неустойчив к порогу складывания: под пословным правилом `沈翠` распадается на «Шэнь»/«Шэнь Цуй» и число становится 1. ⇒ остаток ряда: прибор по ФИНАЛЬНОМУ тексту с (а) генерацией кандидатов без регистрового фильтра, (б) названным порогом складывания, (в) замеренной чувствительностью к нему. ⭐ **ПРАВИЛО ВЫБОРА ПЕРВИЧНОЙ КОЛОНКИ — ратифицируется актом приёмки пака 11.09; записано здесь, чтобы пережило смену, и УЖЕ ИСПРАВЛЕНО ДВАЖДЫ.** У прибора две колонки: СТРОГАЯ (равенство стеммов, как у пост-проверки) и ЯКОРНАЯ (признаёт склонённую передачу). **Первичная — ЯКОРНАЯ, строгая идёт полом точности рядом.** ⛔ **Направления ошибок, иначе довод читается наоборот:** строгая ошибается в сторону ЛОЖНОЙ ТРЕВОГИ (форма доехала склонённой, а она объявляет нарушение); якорная — в сторону СОКРЫТИЯ (засчитывает совпадение, которого по смыслу нет). **Как детекторы нарушения на прогоне A:** строгая дала 18 сообщений, настоящих 7 ⇒ точность **0.39**; якорная дала **9** при 7 настоящих ⇒ **0.78**. ⚠ **Число ИСПР. 11.09 и было 1.00 ДО ужесточения `NearStems` до строгого префикса** — ужесточение вернуло `邪魔` («злой»/«злог» — замена, не усечение) в ложные, и это цена размена, которым закрыты три коллизии многословных передач. Вторая ложная — `话事人`, однословная передача, якорить нечем. ⇒ **каждое пятое сообщение первичной колонки ложное, и читать её надо с этой поправкой.** ⇒ основание НЕ «ложная тревога дешевле сокрытия» (так было написано, и так оно аргументирует ОБРАТНОЕ), а такое: **детектор, врущий в 61 % сообщений, не громче — его перестают читать, а непрочитанный прибор не защищает ничего.** ⛔ **Второе основание, от данных не зависящее:** писатели `decl.forms` в не-тестовом Go только сидовые (`internal/seed/normalize.go:85`=`d := Decl{Invariant: t.Decl.Invariant`, `internal/membank/memseed.go:166`=`b, mErr := json.Marshal(declInfo{`), майнер форм не пишет, а дверь `BankCorrection` контракта поля `decl`/`forms` не несёт вовсе ⇒ на дорожке продукта форм нет НИ У КОГО, и строгая колонка там вырождается в одношаговое равенство. ⚠ Иллюстрация «0 форм из 69 в банках прогона» основанием НЕ является. ⛔ **ДВА ЧИСЛА ТОЧНОСТИ, путать нельзя (замерено зоной 11.09): само ОТНОШЕНИЕ строгого префикса — 17 из 30 равномерной выборки принятых пар, ≈0.57** (`рода~родной`, `гор~горная`, `так~также` — разные леммы); **колонка в своих ограждениях — 11 из 11 на прогоне A.** ⇒ работает не отношение, а ограждения (якорь · многословное окно · границы предложения), и их эффективность замерена на ОДНОЙ книге. Названный отказ: где слово банковской передачи окажется соседом другого слова в той же позиции окна, колонка соврёт в сторону сокрытия. ⛔⛔ **ПРАВИЛО ДЕЙСТВУЕТ ПРИ УСЛОВИИ: пока прибор ФЛАГУЕТ и не отказывает.** Станет он гейтом отгрузки — ложная тревога начнёт стоить удержанного текста или пере-генерации, то есть ДЕНЕГ, асимметрия перевернётся, и порядок колонок надо решать заново. ⇒ **триггеров пере-открытия ДВА:** (1) появился МАШИННЫЙ писатель `decl.forms`; (2) **эта колонка стала гейтом** — носители: `Gates.Glossary.PostcheckGate` построен (`backend/internal/pipeline/quality.go:288`=`gateOn := r.Pipeline.Gates.Glossary.PostcheckGate`, свёрнут в снапшот) и выставлен в НУЛЕ из четырёх живых конфигов, плюс ряд **296** (точечная перегенерация по промаху — направление владельца, работы нет). ⚠ Второй триггер сегодня БЛИЖЕ первого. ⚠ Прежнее моё решение (первичная — строгая) принято и отменено 11.09 в один день; цена разворота — согласие с ручным оракулом 13/16 против 10/16, **и это n=16: направление, а не величина.** Так же и 0.57 — порядок, а не третья цифра.| бэкенд | **скоро** | счёт расхождения форм по отгруженному тексту + строка отчёта сборки | аудит банка 11.09, `research/34` §2.1 | +| 406 | ⛔ **КОНСИСТЕНТНОСТЬ КНИГИ НИКТО НЕ СПРАШИВАЕТ — ПРИБОРА ПО ОТГРУЖЕННОМУ ТЕКСТУ НЕТ ВОВСЕ.** Мера «сколько РАЗНЫХ передач дал один термин» ПОСТРОЕНА (`Spread`/`Variants`, `backend/internal/pipeline/mining.go:383-384`=`how many DISTINCT renderings the drafts produced`), но считается по ЧЕРНОВИКУ, на стопе майнинга, ДО редакторской волны, и читает её только человеческая таблица подписи. По ФИНАЛЬНОМУ тексту такой меры не существует ни одной. ⇒ приоритет №1 владельца («консистентные термины на всю книгу») сегодня НЕПРОВЕРЯЕМ в принципе: все четыре A/B, показавшие пользу банка, меряли ПРИСУТСТВИЕ инъектированной формы в чанке, а не отсутствие конкурирующей. **Лечение $0 и переиспользует готовое:** тот же счёт по отгружаемому тексту + строка отчёта сборки «термин X отдан тремя формами в главах 12, 340, 901». Предмет не пуст: полигонный прибор на стенде дал 13–16 % терминов с более чем одной передачей. ⚠ Это ЕДИНСТВЕННАЯ работа, которая делает качество ПРЕДЪЯВИМЫМ; без неё кривую деградации по главам снять не с чего ⛔ **ИСПОЛНЕНО ЧАСТЬЮ 11.09 ПРОГОНОМ A, и первый же результат снял мою же формулировку слепого пятна.** Прибор построен полигоном и дал по отгруженному тексту «0 терминов из 40 отданы более чем одной формой». ⚠ **Ноль держался на том, что прибор НЕ СМОТРЕЛ:** кандидаты искались регуляркой, требующей ЗАГЛАВНОЙ буквы (`[А-ЯЁ][а-яёА-ЯЁ-]+`), и склонённые строчные формы («гу-мастера», «наложницей») отпадали ДО правила сравнения. Я заказал переписать правило сравнения пословно — **заказ бил мимо**: критик применил этот рецепт к прибору на боевых данных, и не вернулся НИ ОДИН из 29 потерянных термов. Починка ГЕНЕРАЦИИ кандидатов на тех же данных даёт **48 найденных термов вместо 40** — это замер, и он стоит. ⛔ **А «шесть строк со `spread ≥ 2`» ИСПР. 11.09 — я процитировал число КРИТИКА, которое полигон ОТОЗВАЛ в том самом отчёте, что я принял актом.** Её собственный пере-замер той же починки даёт **девять**, и все девять — ШУМ: оконный поиск глотает соседние слова и считает каждое окно отдельной формой («старейшины и», «Фан не», «глава рода он»). Её формулировка дословно: «покрытие 40 → 48 — замер; счёт расхождений у починенного прибора — шум», улика — `checks/spread-candidate-fix-probe.txt`, и окну недостаёт фильтра, отвергающего лишние слова. ⇒ **числа расхождений у починенного прибора НЕТ вовсе**, и заказ следующему — сначала фильтр окна, потом счёт. ⭐ Класс моей ошибки: я взял число из отчёта, не дочитав до раздела, где его автор от него отказался. ⚠ И заголовочный «0» неустойчив к порогу складывания: под пословным правилом `沈翠` распадается на «Шэнь»/«Шэнь Цуй» и число становится 1. ⇒ остаток ряда: прибор по ФИНАЛЬНОМУ тексту с (а) генерацией кандидатов без регистрового фильтра, (б) названным порогом складывания, (в) замеренной чувствительностью к нему. ⭐ **ПРАВИЛО ВЫБОРА ПЕРВИЧНОЙ КОЛОНКИ — ратифицируется актом приёмки пака 11.09; записано здесь, чтобы пережило смену, и УЖЕ ИСПРАВЛЕНО ДВАЖДЫ.** У прибора две колонки: СТРОГАЯ (равенство стеммов, как у пост-проверки) и ЯКОРНАЯ (признаёт склонённую передачу). **Первичная — ЯКОРНАЯ, строгая идёт полом точности рядом.** ⛔ **Направления ошибок, иначе довод читается наоборот:** строгая ошибается в сторону ЛОЖНОЙ ТРЕВОГИ (форма доехала склонённой, а она объявляет нарушение); якорная — в сторону СОКРЫТИЯ (засчитывает совпадение, которого по смыслу нет). **Как детекторы нарушения на прогоне A:** строгая дала 18 сообщений, настоящих 7 ⇒ точность **0.39**; якорная дала **9** при 7 настоящих ⇒ **0.78**. ⚠ **Число ИСПР. 11.09 и было 1.00 ДО ужесточения `NearStems` до строгого префикса** — ужесточение вернуло `邪魔` («злой»/«злог» — замена, не усечение) в ложные, и это цена размена, которым закрыты три коллизии многословных передач. Вторая ложная — `话事人`, однословная передача, якорить нечем. ⇒ **каждое пятое сообщение первичной колонки ложное, и читать её надо с этой поправкой.** ⇒ основание НЕ «ложная тревога дешевле сокрытия» (так было написано, и так оно аргументирует ОБРАТНОЕ), а такое: **детектор, врущий в 61 % сообщений, не громче — его перестают читать, а непрочитанный прибор не защищает ничего.** ⛔ **Второе основание, от данных не зависящее:** писатели `decl.forms` в не-тестовом Go только сидовые (`internal/seed/normalize.go:85`=`d := Decl{Invariant: t.Decl.Invariant`, `internal/membank/memseed.go:166`=`b, mErr := json.Marshal(declInfo{`), майнер форм не пишет, а дверь `BankCorrection` контракта поля `decl`/`forms` не несёт вовсе ⇒ на дорожке продукта форм нет НИ У КОГО, и строгая колонка там вырождается в одношаговое равенство. ⚠ Иллюстрация «0 форм из 69 в банках прогона» основанием НЕ является. ⛔ **ДВА ЧИСЛА ТОЧНОСТИ, путать нельзя (замерено зоной 11.09): само ОТНОШЕНИЕ строгого префикса — 17 из 30 равномерной выборки принятых пар, ≈0.57** (`рода~родной`, `гор~горная`, `так~также` — разные леммы); **колонка в своих ограждениях — 11 из 11 на прогоне A.** ⇒ работает не отношение, а ограждения (якорь · многословное окно · границы предложения), и их эффективность замерена на ОДНОЙ книге. Названный отказ: где слово банковской передачи окажется соседом другого слова в той же позиции окна, колонка соврёт в сторону сокрытия. ⛔⛔ **ПРАВИЛО ДЕЙСТВУЕТ ПРИ УСЛОВИИ: пока прибор ФЛАГУЕТ и не отказывает.** Станет он гейтом отгрузки — ложная тревога начнёт стоить удержанного текста или пере-генерации, то есть ДЕНЕГ, асимметрия перевернётся, и порядок колонок надо решать заново. ⇒ **триггеров пере-открытия ДВА:** (1) появился МАШИННЫЙ писатель `decl.forms`; (2) **эта колонка стала гейтом** — носители: `Gates.Glossary.PostcheckGate` построен (`backend/internal/pipeline/quality.go:288`=`gateOn := r.Pipeline.Gates.Glossary.PostcheckGate`, свёрнут в снапшот) и выставлен в НУЛЕ из четырёх живых конфигов, плюс ряд **296** (точечная перегенерация по промаху — направление владельца, работы нет). ⚠ Второй триггер сегодня БЛИЖЕ первого. ⚠ Прежнее моё решение (первичная — строгая) принято и отменено 11.09 в один день; цена разворота — согласие с ручным оракулом 13/16 против 10/16, **и это n=16: направление, а не величина.** Так же и 0.57 — порядок, а не третья цифра.| бэкенд | **скоро** | счёт расхождения форм по отгруженному тексту + строка отчёта сборки | аудит банка 11.09, `research/34` §2.1 | | 407 | **ПОСТ-ПРОВЕРКА БАНКА СПРАШИВАЕТ НЕ ТО: присутствие формы ГДЕ-НИБУДЬ в чанке вместо формы НА МЕСТЕ срабатывания, и про конкурирующую передачу не спрашивает никогда.** `backend/internal/membank/mempostcheck.go` — вопрос bag-of-words по всему чанку ⇒ дрейф ВНУТРИ составного имени невидим по построению. Замерено исполнением на копии: ряд `方源`→«Фан Юань» с алиасом `古月方源`, выход «Гу Юэ Фан Юань» даёт 0 промахов при подписанном каноне `古月 → Гуюэ`; контроль рядом (форма реально отсутствует) даёт 1 промах, то есть прибор спрошен и отвечает. ⚠ **У экземпляра ДВА корня, и смена вопроса закрывает только один:** ряд `古月` съеден равнотрастовым длиннейшим матчем (`memory.go` `suppressContained`) МОЛЧА. Дешёвая половина — проверять алиас-ключ на СОБСТВЕННУЮ канонную форму (день); дорогая (детектор значения по исходнику) — ряд **286**, загейчен замером. ⚠ Класс объявлен в дереве с 06.09 (`experiments/23-editor-tier.md` §Д50.3) — новизна нулевая, ряд заводится как НОСИТЕЛЬ, которого у него не было ⛔ **ИСПР. 11.09 ПО СЛОВУ ВЛАДЕЛЬЦА — РЯД БЫЛ НАПИСАН ПО НЕСУЩЕСТВУЮЩЕЙ ОСИ.** Слово: «нет такого понятия [подписанный термин], подписан либо ВЕСЬ банк, либо он в неконсистентном состоянии; есть вариант поставить галочку скипать подпись с фронта — тогда автоподписывание». Это ратифицировано `D39.144`: подписывается банк ЦЕЛИКОМ, пер-термная подпись прямо названа НЕ моделью продукта, дефолт движка — авто-продолжение с неподписанным банком, строки едут С ПОМЕТКОЙ. ⇒ **настоящий дефект глубже, чем «прибор не видит дрейфа»: в коде живёт пер-термный автомат `auto|draft|approved` (`backend/internal/store/migrate.go:192`), и пост-проверка считает нарушением ТОЛЬКО `approved` — то есть принимает решение по ЕДИНИЦЕ, КОТОРОЙ В ПРОДУКТОВОЙ МОДЕЛИ НЕТ.** Это и есть причина нуля при 18 найденных (строка **419**): сломана не поверхность, а ОСЬ решения. Закон `D39.104` на проводе один для всех строк; состояние книги — «подписана целиком» либо «авто-продолжение», и мерить надо им. | бэкенд | скоро | вопрос пост-проверки + видимость подавления вложенного ряда | аудит банка 11.09, находка `K3` (единственная пережившая верификацию) | -| 408 | **ДАННЫЕ БАНКА НЕ ДОСЕЯНЫ, И ИМЕННО ИЗ-ЗА ЭТОГО ГЕЙТ КОНСИСТЕНТНОСТИ НЕЛЬЗЯ ВКЛЮЧИТЬ.** Точность глоссарного класса чекера — **0,067: одно верное срабатывание на 14 ложных (n=258)**, и ложные сконцентрированы: `转` ×6, `蛊虫` ×4, `元石` ×2 (`books/gu-zhenren/labels/metrics.json`). Три дыры, все в ДАННЫХ, не в Go: (а) глагольные и многословные термины засеяны с пустыми формами — один `炼化` дал 7 ложных промахов (⚠ **испр. 11.09: это число из ДРУГОГО замера** — `docs/experiments/23-editor-tier.md:7630`=`Все семь «промахов»`, не из `labels/metrics.json`; в размеченном корпусе `炼化` нет вовсе, и обе величины верны порознь, но ссылка была одна на две); (б) односимвольный ханьский ключ структурно вне автомата без `allow_short` (порог 2 знака, `membank/memory.go:72`=`minKeyLenHan = 2`), а это самый частый класс канона в китайском ранобэ (蛊, 道, 气); (в) сид-линт об этом молчит. ⚠ Владелец 05.09 отложил гейт до замера ложных срабатываний («если он ложно положительно будет стрелять — это плохо, очень плохо») — вот их источник, и он лечится досевом, а не кодом ⚠ **11.09: это один из ТРЁХ инстансов общего класса — ряд 423** (майнер эмитит только своё поле; на немайненном корпусе меры вырождаются). | бэкенд+полигон | **скоро** | досев форм · `allow_short` у односимвольных · линт сида, который об этом кричит | аудит банка 11.09, `research/34` §2.3 | +| 408 | **ДАННЫЕ БАНКА НЕ ДОСЕЯНЫ, И ИМЕННО ИЗ-ЗА ЭТОГО ГЕЙТ КОНСИСТЕНТНОСТИ НЕЛЬЗЯ ВКЛЮЧИТЬ.** ⛔ **ЧИСЛО ИСПР. 11.09 — ПРЕЖНЕЕ БЫЛО ДО-СТЕММЕРНОЙ БАЗОЙ, а ряд гейтил им решение владельца.** Пере-снято мною прогоном пинов размеченного корпуса (`TM_CHECKER_LABELS=1 go test ./internal/membank/ -run TestK6 -v`): **база (`metrics.json`, до стеммера и до #10) — tp=1 fp=14 ⇒ 0.0667**, и это то, что здесь стояло; **ОТГРУЗОЧНЫЙ путь СЕГОДНЯ — tp=1 fp=6 tn=251 ⇒ 0.1429**; со стеммизацией `decl`-форм — **fp=0 ⇒ 1.0000**. ⚠ И концентрация названа неверно: класса `转` на отгрузочном пути НЕТ ВОВСЕ (его снял стеммер), остаточные шесть — это `元石` ×2 и `蛊虫` ×4, то есть **ровно склонительный разрыв, лечащийся досевом форм**. ⇒ направление ряда верно, величина отставала на два улучшения, а список ложных описывал уже не тот прибор. ⭐ **И это прямо смыкает ряд с 423:** стеммизация `decl`-форм уводит точность в 1.0000, а `decl`-форм нет ни в одной машинной выгрузке — то есть «досеять данные» и есть лечение, но на дорожке продукта досевать некому. Три дыры, все в ДАННЫХ, не в Go: (а) глагольные и многословные термины засеяны с пустыми формами — один `炼化` дал 7 ложных промахов (⚠ **испр. 11.09: это число из ДРУГОГО замера** — `docs/experiments/23-editor-tier.md:7630`=`Все семь «промахов»`, не из `labels/metrics.json`; в размеченном корпусе `炼化` нет вовсе, и обе величины верны порознь, но ссылка была одна на две); (б) односимвольный ханьский ключ структурно вне автомата без `allow_short` (порог 2 знака, `membank/memory.go:72`=`minKeyLenHan = 2`), а это самый частый класс канона в китайском ранобэ (蛊, 道, 气); (в) сид-линт об этом молчит. ⚠ Владелец 05.09 отложил гейт до замера ложных срабатываний («если он ложно положительно будет стрелять — это плохо, очень плохо») — вот их источник, и он лечится досевом, а не кодом ⚠ **11.09: это один из ТРЁХ инстансов общего класса — ряд 423** (майнер эмитит только своё поле; на немайненном корпусе меры вырождаются). | бэкенд+полигон | **скоро** | досев форм · `allow_short` у односимвольных · линт сида, который об этом кричит | аудит банка 11.09, `research/34` §2.3 | | 409 | **РЕДАКТОР — ИСТОЧНИК РАЗНОБОЯ, А НЕ СТРАХОВКА ПОВЕРХ БАНКА, и это замерено дважды.** Без закон-блока редактор ломает 5–12 из 20 уже ВЕРНЫХ клеток черновика (`experiments/18-editor-wire-probe.md` §A.1); с подключённым банком боевой редактор держит ХУДШЕЕ покрытие канона в панели — 0.882 против 0.909 у черновика, который он правит (`experiments/22` §6.2, 1124 упоминания). Два механических носителя: черновая волна выбирает по БАЗОВОМУ банку с исключением намайненного (`bankmaterialize.go:329`) ⇒ на первом прогоне книги черновик идёт вообще без добытого банка; редакторская волна, единственная с полным банком, теряет липкость МЕЖДУ правочными единицами внутри главы (`waverun.go:717`) при **86 % многоединичных глав (1962 из 2283)**. ⇒ закон-блок обязан стать инвариантом конфига, а не следствием выбора модели редактора. ⚠ Инцидентов дрейфа от потери липкости — НОЛЬ наблюдений, замерена только экспозиция: правка без замера была бы стрельбой вслепую, замер снимается прогоном A | бэкенд | скоро | закон-блок инвариантом конфига + решение по липкости между правочными единицами | аудит банка 11.09, `research/34` §2.4 | | 410 | ⚠ **ПЕРЕПИСАН 11.09 — ПРЕЖНЯЯ ГОЛОВА БЫЛА НЕВЕРНА. Голос НЕ «мёртв в четырёх местах»: он ПОСТРОЕН СКВОЗЬ И ВЫКЛЮЧЕН ДВУМЯ ТУМБЛЕРАМИ.** Пере-снято мною прибором 11.09. **Построено:** схема сида несёт голос (`internal/seed/seed.go:25`=`Voices []Voice`, `Voices []Voice \`yaml:"voices"\``) · загрузчик секции есть (`membank/memvoice.go:79`=`func loadVoiceSections` `loadVoiceSections`, профиль собирается на `:121`) · хранилище есть (`store.VoiceProfilesForBook`, порядок пинован `bankmaterialize.go:214`) · инъекция в банк построена и УСЛОВНА (`membank/memory.go:511`=`if !in.InjectVoice` по `BankInput.InjectVoice`) · флаггер судит ОТГРУЖЕННЫЙ текст (`pipeline/voicerun.go:42`=`runVoiceChecks runs the voice flagger`) и печатает число в отчёт качества (`pipeline/quality.go:126`=`VoiceFlags int` `voice_flags`) · у гейта есть ручка и потребитель в Go (`quality.go:492`, `voicerun.go:46` по `Gates.Voice.Enabled`). **Выключено ровно двумя вещами.** ⛔ **(1) ДАННЫХ НЕТ НИ ОДНОЙ СТРОКИ, и знаменатель прежней записи был не тот.** Пере-снято: секция `voices:` встречается в **22** файлах дерева, и все 22 ПУСТЫ (не «21 из 22») — но все 22 суть МАШИННЫЕ выгрузки (`*.mined-signature.yaml`, `*.auto-bank.yaml`), то есть их пустота лишь пересказывает «майнер профили не эмитит» и самостоятельной уликой не является. Настоящий знаменатель — **22 рукописных сида с `terms:`, и ключа `voices:` нет НИ В ОДНОМ** (контроль: прибор прочёл 47 файлов с `terms:`, из них 25 машинных отброшены по имени). ⇒ за всю историю проекта профиль голоса не написал никто. **(2) `InjectVoice` — константа `false` без ключа конфига**, и комментарий `pipeline/bankmaterialize.go:295`=`InjectVoice is FALSE and has no config knob` называет и причину (`D21` п.2 держит инъекцию до полигонного замера), и ЦЕНУ включения: «Wiring the injection means setting it and accepting a full --resnapshot». Третьим, помельче: `gates.voice` не выставлен ни в одном из четырёх живых конфигов (контроль: соседние ключи `banknote`, `terminology`, `coverage`, `sanitizer`, `regression_guard` выставлены — прибор спрошен у существующего предмета). ⭐ **ВОПРОС ВЛАДЕЛЬЦУ СНЯТ ЕГО ЖЕ СЛОВОМ 11.09: «Входит»** — голос входит в приоритет №1 наравне с терминами; **проектирует и контролирует голос старший коллега (Fable 5), исполняет опус**, и пак обязан велеть сессии обсудить имплементацию с ним. Второй вопрос связки («если не подпись профилей, то кто») тоже снят: `D39.144` — подписывается банк ЦЕЛИКОМ, пер-профильной подписи в модели продукта нет. ⇒ **строка из вопроса стала ЗАДАЧЕЙ, и она мельче, чем читалась: не «построить голос», а написать профиль, открыть ручку и заплатить ре-снапшотом.** ⚠ Числа у механизма по-прежнему нет ни одного — первый замер обязан идти ПЕРЕД включением | бэкенд/владелец | **скоро** | профиль в сид · ключ конфига вместо константы · замер флаггером по отгруженному тексту; форму проектирует Fable 5 | аудит банка 11.09 (`research/34` §2.5, §4 п.2); голова ИСПР. 11.09 пере-замером оркестратора, слово владельца 11.09 | | 411 | ⛔ **КНИГУ, КОТОРУЮ ПАЙПЛАЙН ПЕРЕВОДИТ БЕСПЛАТНО, ПЛАТФОРМА ПРОДАТЬ НЕ МОЖЕТ — и это закрывает деплой на локальном инференсе целиком.** Замерено исполнением на стенде 11.09 (фаза 0 холодного прогона A): на $0-паре `step_max_usd` выходит 0, `ingest.Manifest.priced()` отказывает при `StepMaxUSD <= 0`, старт получает **`409 not_priced`**, в логе ERROR «this book has no price projection, so it cannot be sold». ⇒ **ни одна книга не продаётся, если её перевод ничего не стоит.** Для полигона это обходится номинальной ценой локальной модели отдельным файлом моделей (объявленная девиация), но для ПРОДУКТА это утверждение о рынке: развёртывание на своём железе — а именно им продаётся приватность и дешевизна — сегодня не может принять ни одного заказа. ⚠ Класс ошибки — «ноль цены прочитан как отсутствие цены»: предикат отвечает на свой вопрос («есть ли смета»), а спрошено другое («стоит ли это денег»). Лечение — решение о том, чем платформа меряет продаваемость, а не правка предиката | платформа | скоро | различение «цена ноль» и «сметы нет»; слово о деплое на локальном инференсе | фаза 0 прогона A, 11.09 |