# Журнал прогресса > **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-04, голова D39.193 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №22** (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ:** (0а) **ревизия документации на ПРОТУХШЕЕ** — по всем зонам, не только тронутым; (0б) **планы доработок в БЭКЕНД и ПЛАТФОРМУ** по остатку бэклога и регистра; (0в) **вынос неактуального в АРХИВ** (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 95 (major 3) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔⛔ **НО КНИГУ ЧЕРЕЗ API НЕЛЬЗЯ ДОВЕСТИ ДО КОНЦА — найдено тем же прогоном 04.09 и воспроизведено дважды.** Прирост потолка на прогон = `chaptersLeft × $0.03` (ставка `DefaultPerChapter`, занижена ×4.47 — D39.179 п.1), и после первой готовой главы это $0.27, тогда как движок при `waves.workers: 4` резервирует под редакторский шаг ~$0.28 ⇒ **отказ резервации, прогон встаёт, книга не двигается**. Два прогона подряд дали одно и то же: `committed` не сдвинулся, холд вернулся. ⇒ **занижение ставки — не «шкала короче», а СТОП ПРОДУКТА: с какого-то момента каждая следующая покупка не покупает ничего.** Лечить придётся согласованно двумя сторонами (ставка платформы + резерв движка под шаг с параллельными воркерами), носитель — ряд регистра зоны, вес `major` **за недостижимость продукта, а не за деньги**: сам стоп НЕ ЖЖЁТ ничего — замер платформы 04.09 показал отмену ДО ухода запроса (латентность 20–31 мс, `model_actual` пуст, токенов ноль), и вся книга сходится до микро-доллара по трём источникам (`request_log` 0.278319 · `spend.committed_usd` 0.278318752 · платформенный `committed` 278319 микро). > ⛔ **ЗАТО HALT НА ПРОГОНЕ, КОТОРЫЙ ПРОДВИНУЛСЯ, ЖЖЁТ — отдельная находка того же прогона и свежая датированная точка строки 78 («леджер = НИЖНЯЯ граница»).** Четыре редакторских вызова ушли параллельно; один дошёл ($0.063404) и своим коммитом сорвал потолок, три других отменены в тот же миг, **отработав 120756, 156469 и 156470 мс** — и легли в леджер нулём. Незаписанное ≈ **$0.05–0.19 на ОДИН halt** против $0.278 за всю книгу, то есть механизм, защищающий от перерасхода, сам создаёт неучтённый расход. ⚠ Списание провайдером НЕ доказано (биллинга у нас нет) — утверждается ровно наблюдаемое: вызовы шли 2–2.6 минуты, их цены в леджере нет. > ⇒ **Дыра НЕ в принципе, а в покрытии, и это делает её заказом, а не наблюдением** (разбор оркестратора 04.09 по коду): консервативная оценка уже построена и ратифицирована — `backend/internal/pipeline/stagerun.go`, греп `settling the reservation estimate to keep the ceiling honest` (pack-13 point-9), — но её условие требует ОТВЕТА провайдера (`resp.Usage`), а отменённый в полёте вызов ответа не получает и уходит другим путём. Направление лечения: сеттлить оценку при отмене вызова, который успел уйти; различитель — факт ухода (латентность кандидат, порог обязан быть обоснован замером, а не назначен). Половина ДВИЖКОВАЯ. ⚠ Прежняя формулировка пункта — ниже, она о состоянии ДО 04.09. Движок пишет файл с 30.08 (`tmctl build` — EPUB 3 + чистый txt, D39.175), и холодный прогон 31.08 предъявил это живьём: собранный EPUB настоящего перевода прошёл `epubcheck` 0/0/0/0 и передан владельцу. Открыто ровно одно: канон обещает `createExport`/`getExport`, а платформа их НЕ монтирует (смонтировано 15 операций из 20; нет также `getRun`, `updateBook`, `deleteBook`). Долг числится с P8 (`platform/BACKLOG.md` П-17), и НИ ОДИН пак платформы после P7 его не взял (проверка вместо ручного счёта, чтобы не гнило при каждом лендинге: `grep -rn 'createExport\|getExport' platform/internal/ --include=*.go` — пусто). **Слово «отдаёт результат» ложно по букве ТОЛЬКО платформенной половиной** (п.4) · **(2) ~~холодный прогон движка~~ ОТРАБОТАЛ 31.08, закрыт РЕШЕНИЕМ ВЛАДЕЛЬЦА «не доводить»** (отчёт — `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, числа относятся к `065d8ac`). Потрачено **$0.436110** из санкции $0.80. ПРЕДЪЯВЛЕНО живьём: объёмный потолок · D39.158 ОБЕИМИ половинами (стоп и не-стоп) · exit 16 · строки 154/198/239/240. ⚠ ~~**Причина большой доли редактора НЕ УСТАНОВЛЕНА**~~ — **УСТАНОВЛЕНА пробой полигона 02.09 по четырём осям: РЕДАКТОР ДУМАЕТ, А НЕ ПИШЕТ.** Размышление — **77.9%** цены редактора без ручки и 45.7% с `low`; у `glm-5` с выключенным thinking — 0.0%. Замер куплен и закончен ($6.17 из $9.50). ⚠ `research/30` §2.4 того же полигона повторяет «причина не установлена» — это про ДРУГОЙ вопрос (доля роли в прогоне против доли размышления в цене роли), и различение обязано попасть в ревью-шапку 30. Доля редактора идёт с ДВУМЯ знаменателями: **49.3%** от всего прогона ($0.214865 из $0.436110) и **81.3%** внутри порции П1 (⚠ ходившее «73%» — фантом, в отчёте его нет ни разу). Следующий шаг — контролируемая проба по ЧЕТЫРЁМ осям (роли осей и три требования, купленные ошибками этого прогона, — §14 отчёта; ось `stale` НЕДОСТИЖИМА — §10 там же). ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** ⚠ **КЛЮЧИ: гейт снят словом владельца 30.08, разбор двух путей — D39.176 п.6.** Живое отсюда: конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса (заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`), поэтому прогон движка обязан передавать `--keys-file` абсолютным путём и только на `translate`; для п.3 нужен ДРУГОЙ файл — `TM_PLATFORM_ENGINE_KEYS_PATH`, тоже АБСОЛЮТНЫМ путём (`platform/internal/config/config.go`, греп `must be an absolute path`). Лечение операционное и $0 — направить переменную на уже заполненный файл; проверять ПРОГОНОМ, не чтением (гардрейл `.env`) · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО. ⚠ Уточнено 01.09: гейт СНЯТ холодным прогоном, и настоящие артефакты движка теперь ЕСТЬ (каталог `books/gu-zhenren/coldrun-v16/`), но сверка вышла ТОНКОЙ: на шов реально вышло **одно значение `flag_reason` из пятнадцати** (`sanitizer_stripped`), остальные четырнадцать по-прежнему только чтением кода, а манифест против `platform/internal/ingest/manifest.go` не сверялся вовсе · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на СЕМЬ миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.9.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 20; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ — строка бэклога 237** (`go.work` · вендор-сверка эффорта `deepseek-v4-pro`; реестр `13-tech-debt-anchors.md` §Б-108). ⚠ **Состояние git — снимать КОМАНДАМИ, не чтением** (ветка `polygon` ушла вперёд, коммит здесь не цитирую): работа полигона лежит на ней и в `main` НЕ влита, а `git status -- eval/` в main-дереве пуст ПО ПОСТРОЕНИЮ и уводит в ложный вывод «работы нет»; ⚠ **«развязка git с origin» — арбитр ПЕРЕ-СНЯТ 04.09 и прежний вердикт БОЛЬШЕ НЕ ВЕРЕН:** `git merge-base --is-ancestor origin/main main` → **rc 1**, `git log main..origin/main` → `afa7700 temp` (коммит владельца 04.09, которым он передавал работу зон). Локальная линия ушла вперёд на семнадцать коммитов и содержит ВСЁ содержимое `afa7700` — оно снято `reset --soft` и заленджено раздельными зонными коммитами, — но формально ветки разошлись. Лечение — force-push рукой владельца; **не пуллить** (его же правило). ⚠ Пункт «развязка git с origin» в листе владельца ниже держится ТОЛЬКО как вопрос про force-push его рукой; утверждением о расхождении дерева он не является — арбитр этой пары именно здесь. > - ⚠ **Норма приёмки, купленная аудитом D39.167 п.1:** акт лендинга, объявивший закрытие строки регистра или бэклога, обязан быть СВЕРЕН СТАТУСОМ в тот же заход — иначе следующий пак собирается ПО РЕГИСТРУ и едет чинить построенное. Машинная половина — строка бэклога **225**. > - ⚠ **ЛЕНТА КОНТРАКТНЫХ МИНОРОВ** (что принёс каждый — телом ноты): **0.5.0** — D39.161 · **0.6.0** — D39.162/D39.163 · **0.7.0** — D39.166 · **0.8.0** — D39.169 · **0.9.0** — D39.180. Прожитые дампы приёмок P9/P10 — `archive/PROGRESS-2026-08-backend.md` и тела нот. > - **ЖИВОЕ:** полигон — **фаза Д ИДЁТ** (заказ 10.08; деньги санкционированы 15.08 напрямую полигону — ⚠ числа потолка в носителях расходятся, фактическую цепь сверить при лендинге петель; ja-книга `enkan_no_hate_ja`; при ратификации фазы Д в D-ноту: декой-правило + обязательный кросс-семейный опровергатель приёмки — одобрены 10.08; свежие фриз-коммиты полигона в дереве — НЕ трогать) · платформа и контракт — статус в строке выше, здесь НЕ дублируется (один носитель на факт) · **фронт ЗАМОРОЖЕН** (D39.136 п.2 + **D39.147: морозится ДАЛЬШЕ лендинга P7 — слово владельца 17.08; P7 зону НЕ размораживает, S5-промт не выдаётся, разморозка отдельным словом по достижении сквозного пути**; перечень первого касания зоны — синк зеркала на ТЕКУЩИЙ канон (отставание и его цена — п.6 очереди выше и строка бэклога 183(б)) + перегенерация типов + моки + гейт утечки конвейера + ФС-1..12 + Ф-63/Ф-28 + фразы В-11 по словарю кодов — не отменён, ждёт разморозки) · закрытые стройки эры — реестром нот `architecture/05-decisions-index.md` (D39.130–137, одна строка на ноту). > - **Открыто на владельце:** **после пака «писатель книги» (D39.175):** лестница D25.1 — какая ступень даёт читателю копию БЕЗ пометки и что печатать на титуле/в имени файла · лейбл главы без заголовка (сейчас цифры; словесный шаблон = одна строка `reader.txt` после ратификации К-3) (⚠ три вопроса пака ЗАКРЫТЫ словом владельца 30.08: экспорт юзеру — всегда строить, см. п.4 очереди · модель пометок подтверждена как построена — надпись о пропуске в файле, отдельный варнинг-слой в интерфейсе НЕ строим, машинный отчёт сборки остаётся внутренним носителем (дрейф) · RTL — снят до появления право-налевой целевой пары) · ⚠ **ПЛАТФОРМЕННЫЙ ЛИСТ ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 30.08 — четыре ответа и их следствия ЦЕЛИКОМ телом D39.176** (квот нет · продажа не в бете · продолжение после пополнения — руками · фразы пользователя делегированы проекту с требованием интернациональности). ⚠ **Лист ПУСТ:** последний его пункт (`PD-421`, «держит ли открытый поток сессию живой») СНЯТ замером 30.08 — окно бездействия сессии **14 суток**, абсолютный срок **30** (`platform/internal/config/config.go:293`=`SessionIdleTTL`), скольжение окна идёт на любом аутентифицированном запросе, а поток теряется лишь после того, как подметён протухший ряд, то есть после ДВУХ НЕДЕЛЬ без единого действия пользователя. ⚠ Часовой интервал в этой теме — периодичность УБОРКИ, а не срок сессии (эррата 30.08-а к D39.176 п.5) · ⚠ Гейт словаря фраз — строка **204** (D39.176 п.4). ⚠ Прежний указатель «строка 148» мёртв — строку удалил `a023e39` решением владельца, восстанавливать Приложение А по ней НЕ надо · **развязка git с origin** (локальная линия ИСТИННА, force-push его рукой; не пуллить) · В-4/Ф-30 (глава без заголовка — движковая половина строка 160) · мини-проба флора 44 (одобрена, промт не выдан; число — после ре-пробы 188) · ~~подпись денежного шага 46~~ (ратифицирована D39.190 п.4: пере-снапшот батча — единым актом, цена сегодня $0) · **схема time-based DeepSeek** — рекомендация и её доводы строкой **172**(а) · **вход ратификации фазы Д:** посылка «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже, D39.137 п.4) · **возражение Sol по проходу `tier` эксп-23** (довод дословно — слайс `archive/PROGRESS-2026-08-10-15.md`: Sol судил СВОЁ семейство, что запрещено D13.3; подтвердить или снять — при лендинге петель фазы Д) · фронт-вопросы зонного журнала: В-7 (плотность; держит Ф-54) · В-8 (слово состояния в дереве) · В-9 (языки интерфейса — механизм готов, ПТ-36) · Ф-38 (вкладка «Замечания»). Закрытые пункты листа — в нотах D39.136–145, здесь не держатся. > - **Сделано (сводно)** — снимок ленты закрытых эр в [archive/PROGRESS-2026-08-04-09.md](archive/PROGRESS-2026-08-04-09.md); детали — D-лог и слайсы. > - **Курс:** этапы ОБЩНОСТЬ · КАЧЕСТВО БАНКА · ПАКЕТ-ЧЕКЕРОВ · ФРОНТ-ЭРА · шов/платформа/движковые блокеры — ПРОЙДЕНЫ (D39.59–123). Хвосты курса живут строками: 16 (полная цена холодного старта; edit-волна на малых прогонах отработала и оплачена — 58 вызовов волновым драйвером 23–25.07 плюс 648 до драйвера, счёт по леджерам `~/books/gu-zhenren/**/*.db`) · 46 (дизайн заморожен D39.92/93, промт ждёт выдачи) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код `553f1a3`). > - **Горизонт (D39.62/67, освежён D39.95):** **ДОБОР ИДЕАЛА** (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона эксп-22 — строка 149 · веса K1–K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 62–68, 85) → Ф3 ридер-IDE (69–71). **Стоячие:** 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; закон-блок ОБЯЗАТЕЛЕН — строка 134; 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 держать как июльское. ⚠ **Вендор-факты 13–15.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137):** таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.2–4.4 в пике / ×2.1–2.2 в долине — замер по трём прогонам); ⚠ про эффорт pro носители ПРОТИВОРЕЧАТ, до вендор-сверки в силе канон — разбор строкой **237**(б); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) в shipping-c1 НЕ включён** — жив ран-локальным конфигом книги (строка 140; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за `budget_usd: 0` (STACK.md §примечания). > - **ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже** (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). **СЧЁТ ОЧЕРЕДИ на 30.08 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **192** строки · зона бэкенд **88** строго / **126** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **60** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `-10-13` (D39.6-гигиена) · `-13-25` (стройка паков 11–16, rerun2) · **`-25-31` (паки 17–20 · мини-прогон · полигон-пакеты 5–8 · ToS · холодный прогон; D39.26–58)** · **`-08-01-02` (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.59–90, срез D39.105)** · **`-08-02-04` (сессии №11–№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91–105 + снимок шапки эры №15)** · `-08-04-09` (пинги закрытых паков эры №15) · **`-08-14-15` (закрытые бэкенд-записи №16–17: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139)**. Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139). ## 📌 СОСТОЯНИЕ ПАКОВ **Залендены и ратифицированы, приёмочные дампы — телами нот:** платформенный **P11** — D39.169 · движковый пак **«деньги»** — D39.170 · платформенный **P12** — D39.180 (вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же) · бэкенд-пак **«деньги и честность выдачи»** — D39.182 (тестов 1045→1083, удалённых ноль) · **закон раскрытия** движка — D39.181, ратифицирован владельцем и применён к одиннадцати экземплярам. **ВЫДАНЫ 04.09 и РАБОТАЮТ ПАРАЛЛЕЛЬНО** (зоны независимы по коду; сцеплений ДВА, и второе найдено 04.09 уже после выдачи промтов — оба про то, чтобы не сорвать платный прогон платформы: > **(1) форма манифеста ЗАМОРОЖЕНА на окно** (`D39.190` п.5): гейт интейка — строгое равенство одной константе, бамп отправил бы каждую книгу в `parser_unavailable`. > **(2) ⚠ ДАННЫЕ ЯЗЫКОВОГО ПАКЕТА — ТОЖЕ.** Правка `backend/internal/lang/data/*.txt` двигает `EmbeddedVersion` → `cutTag` (докстринг `backend/internal/pipeline/manifest.go`: «the embedded data feeds the CJK numerals and sentence terminators that place boundaries») → ключ валидности манифеста → на платформе `recut := storedKey != in.ManifestKey` (`platform/internal/pgstore/readmodel.go`) → `delete from unit_resolutions where book_id`. То есть у книги, за которую заплачено, исчезают замечания читателя и счётчики глав — это строка бэклога **198**. ⇒ **Лендинг правки данных не кладётся, пока книга платного прогона живая**; порядок лендинга — обязанность оркестратора, зоны об этом предупреждены пингами 04.09. Рычаг у бэкенда есть и он объявлен предпочтительным: снять рендер в Go, данные не трогать): бэкенд — вайр-батч `docs/BACKEND_WIREBATCH_SESSION_PROMPT.md`; платформа — «закрыть цикл» `docs/PLATFORM_EXPORT_SESSION_PROMPT.md`. ⚠ Строка **160** взята, но идёт СВОИМ паком ПОСЛЕ двери: она бампает `manifestVersion`, у которого безопасного порядка деплоя нет (`D39.190` п.2). Строка **142** — после шагов 0–1 полигона (`D39.190` п.3). > **Предыдущие паки ОТРАБОТАНЫ 03.09, ПРИНЯТЫ С ДОФИКСОМ и заленджены** (`D39.187` движок, `D39.188` платформа; промты в `archive/prompts/` с баннерами исхода; план паков отработал и ушёл в `archive/reports/NEXT_PACKS_PLAN_2026-09-03.md`; решения — D39.190, промты ВЫДАНЫ 04.09): платформенный **P13** «шов возврата оплаченного прогона» (`docs/PLATFORM_P13_SESSION_PROMPT.md`: `PD-168` бюджет из холда · `PD-89` ключ на пути ошибки · `PD-426`/`PD-214` чужая строка не карантинит проекцию · `PD-374` гейт батареи · гейт против класса серьёзности · строка рантбука деплоя) и бэкендовый **«число согласия на пути второй покупки»** (`docs/BACKEND_CONSENT_SESSION_PROMPT.md`: ФЧ-5 ось модели · строка 232 остаток слота · ФЧ-4 обе половины · ФЧ-1 три гарантии). ⚠ **Сцепление по деплою названо в обоих: у формы манифеста БЕЗОПАСНОГО ПОРЯДКА НЕТ** — гейт интейка `platform/internal/ingest/manifest.go:112`=`if m.Version != KnownManifestVersion` сравнивает со строгим равенством одной константе, окна двух версий нет; рантбук `platform/deploy/README.md:232`=`сначала платформа, потом движок` советует обратное и отдан на починку паку P13 пунктом 6. ⛔ **Проводка `--max-units` в платформу остаётся ГЕЙЧЕНОЙ. Живое основание одно и оно механическое:** единственный писатель `bank_moved_at` — дверь правок банка (`platform/internal/runs/bank.go:182`), а рост АВТО-банка от майнинга этого флага не ставит, поэтому майнящая книга на второй покупке идёт без `--resnapshot` и умирает на снапшот-гарде движка — холд взят, попытка сожжена (`PD-422`). Это чинится проводкой признака движения банка от майнинга, а не решением владельца. **ОТКРЫТО НА ОРКЕСТРАТОРЕ №22:** ~~**Ресёрч-сессия `textmachine-36`** — лендинг `research/29`~~ **ЗАКРЫТО 04.09.** Оба отчёта топологии заленджены полигоном на СВОЕЙ ветке по прямому указанию владельца (`a7951a7`) и приехали в `main` мержем ветки — то есть маршрутом, который и был назван правильным. Файлы на месте: `docs/research/29-harness-topology-survey.md` и `…-codex.md`. > ⚠ **ЖИВОЙ ОСТАТОК — РЕВЬЮ-ШАПКИ.** Условие лендинга, согласованное с сессией, требовало шапки «что доказано / что СНЯТО / что не проверено»; её нет ни у 29, ни у 30, а шапка самого 29 до сих пор говорит «НЕ закоммичено — лендинг за оркестратором». То есть доки приехали против собственных условий. Ставит шапки оркестратор; до них читать оба отчёта как ФАКТУРУ, а не как ратифицированное. ⛔ **МАРШРУТ ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 02.09: «не трогай соседнюю git tree ветку вообще».** №22 внёс этот файл в `main` копированием из соседнего worktree и был поправлен дважды: файл принадлежит ветке `polygon`, в `main` ему делать нечего. Лендинг ОТКАЧЕН (`git revert`, файл в чужом дереве восстановлен байт-в-байт). ⚠ **Следующей смене: не повторять — ни `cp`, ни чтением, ни `git -C` по соседнему дереву.** Открытый вопрос владельцу: файл лежит на ветке зоны, значит и коммитит его та зона своей рукой, а в `main` он приезжает мержем ветки; подтверждения этого маршрута нет, поэтому обязательство висит. Состояние на 01.09: файл лежит в СОСЕДНЕМ worktree `/home/ubuntu/projects/textmachine/docs/research/` (незакоммиченное между worktree НЕ ВИДНО — `git status` в main-дереве пуст по построению), вырос до ~302 КБ, сессия idle и «готово» не прислала. ⚠ Условия лендинга, согласованные с ней: ратифицировать НЕЧЕГО (ресёрч-фактура, не решение) · нужна ревью-шапка (что доказано / что СНЯТО / что не проверено) · её §4 и §5 остаются obstacle-секциями · её собственный адверсариальный проход дал 86 находок и 20 записей класса блокер, из которых 15 РАЗЛИЧНЫХ и все исправлены (5 были дублями разных рецензентов) · незакрытый долг назван ею самой: 49 находок класса ВАЖНОЕ и 17 мелочей. ⚠ Формулировка для шапки, точнее оркестраторской: судья как СТАДИЯ ДВИЖКА не построен и не вызывался (0 вызовов), но судьи в ПОЛИГОНЕ были и есть — без этого различения следующая сессия выбросит замеры топологии. **НОРМЫ, ЗАРАБОТАННЫЕ ЭТИМИ ПРИЁМКАМИ:** - **Зелёная батарея — это ПОЛНЫЙ список пакетов ПЛЮС отсутствие FAIL**, а не отсутствие FAIL: обёртка подавала `exit 0` при падении в хвосте (поймала сама движковая сессия). - **Линтер якорей гоняется ПОСЛЕДНИМ шагом, после того как код замер.** Он судит доки трёх зон, но зоны его не зовут; в этот заход нашёл 21 указатель на исчезнувший код, и правки сдвигали цели дважды подряд — включая мои собственные, уже после починки. - **Якорь разрешается тем, ЧТО он утверждает, а не номером строки, на которой лежал** (движковая сессия записала переезд по совпавшему номеру и промахнулась предметом). - **Колонка «подтверждено» отчёта, пойманного на ложных подтверждениях, снимается с доверия ЦЕЛИКОМ** — критерий, отличавший ошибочные строки от верных, назвать нельзя. - **`pkill` по имени процесса на машине с параллельными сессиями бьёт по чужим.** - **Число или «доказано» уходит владельцу только после СВОЕГО прогона.** ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. **ID строки стабилен навсегда** (не перенумеровывается и не переиспользуется — на «строку N» ссылаются доки и промты, D39.80). Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 1–2 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам; «диспозиция сверху, археология вниз», ячейка >800 байт — кандидат на выселение в `architecture/13-tech-debt-anchors.md` (D39.125 п.3/D39.126). ⚠ **Счёт очереди — НИЖНЯЯ граница долга, а не потолок:** трекер содержит только замеченное, и 02.08 дважды за $0 свежие глаза вытащили из кода дефекты, которых в нём не было (релей фронта → строки 99/100/102; приёмочное ревью → третий шов в 104 и честность в 105); ленту ✅ шапки читать как «долга нет» неверно (D39.89). **Зонные бэклоги (решение владельца 02.08, D39.84):** фронт и платформа ведут СВОИ бэклоги (`frontend/docs/BACKLOG.md` · `platform/BACKLOG.md`) — их строки сюда НЕ заходят; здесь движок/полигон/доки, включая движковые стыки фронта (зона «бэкенд», как 99–102); строки 96/97 переехали в платформенный (П-1/П-2), надгробия-указатели сохранены. | ID | Хвост (одной фразой) | Зона | Вес | Чем закрывается | Источник | |---|---|---|---|---|---| | **— ВИСИТ НА ВЛАДЕЛЬЦЕ —** | | | | | | | 2 | Четыре вопроса границы «алгоритмического идеала» (Annotator · семантический судья · ja→ru §B5 · ru-target до/после) | владелец | скоро (гейт «добора идеала» перед МАСШТАБОМ) | отдельное решение | D39.33, D39.38 | | 4 | **Ре-чек ToS по триггерам** — первый ИСПОЛНЕН 31.07, дельт вердиктов нет (D39.57); предмет Google-мониторинга перевешен на цепочку договора (PUP · Additional ToS · Google APIs ToS); следующие: квартал 25.10.2026 · первая лейблованная книга · любая правка `accepts_labels` | владелец/полигон | скоро (следующий триггер 25.10.2026) | отдельное решение (правило) | D39.32, D39.57 | | 5 | **Арбитраж банка: замер ИСПОЛНЕН и ПРИНЯТ (research/24, D39.102).** Закрыто классом: равноправный совет · кросс-модельные веса уверенности · self-consistency · селекция из вариантов · отказ-сигнал ⟦TM-NO-DST⟧; Q2 отвечен — семейства не окупаются (C3−SC=+3 и все три добычи = один кластер; glm-соло 25/45 > совет 23/45). **ОСТАТОК СТРОКИ:** рецензент-другого-семейства ТОЛЬКО на спорных КЛАСТЕРАХ (слот при ре-пробе 74), роутинг целыми family/series-юнитами (G4), эмиссия рецензента — та же draft/⟨проверить⟩. История захода — D39.89/90/101/102 | полигон/ресёрч | **ОСТАТОК ГЕЙЧЕН ре-пробой 74** (D39.102 п.2) | замер (остаток) → решение | D39.89, **D39.102** | | 6 | **Строка Gemini в `accepts_labels`** — ждёт слова владельца о подписи интерпретации сужения как разрешения; ре-чек 31.07 понизил приоритет: подпись даёт ПРАВО, но не судью 18+ (фильтр неконфигурируем D22.6 + обход запрещён договором) — возвращаться при вопросе, требующем именно права | владелец | когда-нибудь | отдельное решение | D39.32, D39.57 | | 7 | Q2 «редактор под `sexually-explicit`» (grok-4.3 интерим · glm-5 после сверки ToS Z.AI · mistral вон) | владелец | когда-нибудь (перед первой explicit-книгой) | отдельное решение | D39.27 п.7 | | 8 | D22.7 пер-чанковый L3-скрин — несня­тое предусловие первой erotica-книги в проде, отдельный гейт | владелец | когда-нибудь | отдельное решение | D22.7, CURRENT-STATE (оркестратор) | | 9 | Промпт-слой под лейблом: лейбл не доезжает до промпта — должны ли переводчик/редактор знать о свойстве контента | владелец | когда-нибудь | отдельное решение | CURRENT-STATE (владелец, из пака-17) | | 10 | Дата создания аккаунта OpenAI (низкий приоритет, OpenAI вне цепочки) + применимость OpenAI Sharing & publication policy 2022 (quirks:128) | владелец | когда-нибудь | отдельное решение | D39.32 | | 11 | Флип coverage-гейта (`enabled:false`, D12-Q4) — за подписью владельца ; при флипе решить судьбу v1.1 quote-absorption (D12-Q1, Python-first лок-степ) | владелец | когда-нибудь | отдельное решение | D39.34(2) | | 12 | **`postcheck_gate` в hard-gate** — требует пере-замера recall (recall чекеров измерен и низок); ⚠ «fn=0» демоции #10 класс-вакуумен на labels (ноль одно-Han-позитивов, D39.78) — пере-замер обязан добрать одно-Han-позитивы, на «fn=0» не опираться; одно-Han-класс при gate-on вне гейта (Unverified+Demoted); тем же решением строится HARD-value-детектор 成/万 (Q3 §6 — честный hard-gate требует value-чека; либо раньше при ненулевом потоке value-дефектов добора, D39.79; **$0-прототип получен эксп-21: `battery.check_numbers`, симметричный разбор, синтетика 16/16 — D39.117**) · recall существующих гейтов печатал арм C эксп-21 на контаминированном срезе (D39.108/D39.117) | владелец | когда-нибудь (после фазы 2) | отдельное решение | D39.34(2), D24.4+D28.1, D39.39, D39.78, D39.79 | | 13 | **Включение платной петли ремонта + per-class исходы ремонта** (схемное решение принимается вместе) — вернуться при расширении классов детекторов и ненулевом остатке; ⚠ при включении: репэйр-гард №5 после #10 слеп на одно-Han-дифференциал (демоция в обоих прогонах ⇒ 0>0 — репэйр, стёрший верно отрендеренный одно-Han-термин, не ветируется; D39.78-ревью) | владелец | когда-нибудь | отдельное решение | D39.38, D39.39(а), D39.78, CURRENT-STATE | | 13а | Веса рубрики K1–K12 не выбраны (Q1: «по данным фазы B»; фаза B прошла на BWS без весов — выбор нужен к агрегатной приёмке качества книги) | владелец | когда-нибудь (к пилоту) | Ф2.5 / отдельное решение | D39.44 Q1, D39.46 | | 13б | **`speech-cue.txt` zh НЕ шипить до замера голос-флаггера; замера НЕТ (D39.86) — оси не считались НИ РАЗУ.** ⚠ **Причина ПЕРЕ-НАЗВАНА: прежний довод «редакторская волна не гонялась» ПРОТУХ 31.08** (холодный прогон `coldrun-v16` её гонял и оплатил — строка 16); живой блокер — ПУСТОЙ РЕЕСТР профилей, см. ниже. Гейт: первый прогон добора идеала С редакторской волной И подписанными профилями (строка 24) → решение владельца о шипе. ⚠ Сам гейт в схеме ЕСТЬ (`internal/config/pipeline.go` `VoiceGate`, пак-19/D39.55). ⚠ `rules=` в отчёте = «гейт СКОНФИГУРИРОВАН», не «отработал» — до фикса 105 читать по знаменателям `replies=`. Археология дословно — `architecture/13-tech-debt-anchors.md` §Б-13б. ⚠ **ПОПРАВКА 23.08 (№19):** заполнить `voices:`/`addresses:` может только подпись владельца (`internal/seed/seed.go:23`=`Voices and Addresses are the two D21 record types` — «no miner emits them»), а при пустом реестре `RunVoiceChecks` выходит на `!reg.HasData()` ДО ВСЕХ осей, поэтому нулями отдаются и оси, и знаменатели — «ноль флагов» неотличим от «оси не считались». ⚠ Отдельно: `gates.voice` отсутствует в `backend/configs/`, НО в конфигах реальных прогонов (вне git) он ВКЛЮЧЁН — `~/books/gu-zhenren/coldrun-a/pipeline.yaml:68` и `coldrun-b:71`, `enabled: true`; дыра не «оператор забыл включить», а «шаблоны репозитория гейт не несут» | владелец | отложено-до-замера | первый прогон добора идеала С РЕДАКТОРСКОЙ ВОЛНОЙ (оси голоса, строка 24) → отдельное решение | D39.56, PACK19_BUILD §7.2, чат 31.07, D39.86 | | 14 | **Четыре data-инженерных флага фазы-2 общности, каждый с рекомендованным дизайном** (§5 отчёта): ё-фолд → target-данные (`char_fold`; смена сигнатуры core-примитива через вердикт-несущий банк, сдвиг `memory_version`) · segmentation-фолбэк громким (ломает контракт corridor-фолбэка `pipeline.go:839-848` + голден-фикстура на нём; лечение — объявить блок в голден-yaml) · `Fertility` per-script map (калибровка ждёт боевого токенизатора) · `source-encoding.txt` + Go-реестр декодеров | владелец | когда-нибудь (следующий пак общности) | отдельное решение | D39.64, GENERALITY_PHASE2 §5.1–5.4 | | 86 | **Мелкие открытые решения одним списком** (свип D39.66): echo-семантика дропнутого c-lite-члена (D39.18 — оставить pre-c-lite?) · magnitude-кап тяжёлой CJK-утечки (D38.3 п.4в; сейчас strip+flag) | владелец | когда-нибудь | отдельные решения | D39.66, D39.69(feed_cap закрыт §1) | | **— ХВОСТЫ ХОЛОДНОГО ПРОГОНА (исполнен достаточно, D39.58; Р7 владельца) —** | | | | | | | 16 | **Полная цена холодного старта — ЖИВОЙ ОСТАТОК ОДИН: цена ДОВЕДЁННОЙ ДО КОНЦА книги не измерена.** Холодный прогон `coldrun-v16` 31.08 отдал 3 юнита из 14 и остановлен снапшот-гардом. ⚠ **Довод «редакторская волна не гонялась» ПРОТУХ 31.08** (испр. 02.09): она гонялась и оплачена — 4 чекпойнта `edit/editor/deepseek-v4-pro` на $0.214865; не мерена именно ПОЛНАЯ цепь одним заходом до конца книги. **Числа ДО редактуры — база прогона `~/books/gu-zhenren/coldrun-b/reprobe/bank-low/guzhenren-bank-low.db`** (10 глав, `low` на черновике И на бэнк-ролях; арифметика снята 23.08 №19): вся ДРАФТ-стадия $0.031639 (flash $0.021289 + pro $0.010350) · терминолог $0.005750 · классификатор $0.007706 · **весь заход $0.045095**, слагаемые дают именно его. ⚠ Числа в ИЮЛЬСКИХ деньгах — множитель пере-пина DeepSeek 4.47 (D39.179 п.1), сегодня тот же заход $0.2017. ⚠ Фаза C `coldrun-b` закрыта владельцем как неуспешная (02.08, D39.90), её деньги не тронуты ($0). Строка держит и оси голоса (13б/24) | бэкенд | когда-нибудь (гейт: первый ЗАВЕРШЁННЫЙ прогон) | добор идеала | D39.58, **D39.90** | | 18 | **Эмиссия головы 蛊**: сид-половина = чек-лист (определяющий терм книги сидится `allow_short`, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы | полигон → бэкенд | скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) | полигон-замер → решение | D39.58, D39.60, D39.69 | | 24 | **Остаток: авто-режим флага** (проект Б не гонялся) · оси голоса A–D (профили не подписаны; черновик готов — `coldrun-a/SIGN-PACKAGE.md` §3) ; + слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в) | бэкенд | когда-нибудь (первый прогон добора идеала) | добор идеала | D39.40, D39.58 | | **— ТЕКУЩАЯ ОЧЕРЕДЬ (D39.59) —** | | | | | | | 78 | **Леджер денег = НИЖНЯЯ граница**: «2xx body decode failed (call IS billed)» — провайдер списал, исходная попытка в `request_log` НЕ попадает (≤$0.009/сессия); дизайн фикса ГОТОВ (GENERALITY_PHASE2 §5.6: `BilledDecodeFails` + per-billed-attempt settle с `Estimated=true`), но это money/ledger-путь — не $0-хастл. **Живое число (D39.86):** на ре-пробе 74 — 3 таких вызова на 14, неизвестность **$0.015111** при леджере $0.114378 (13% захода); движок засеттлил оценку и честно напечатал `estimated-cost rows: 3` ⇒ канал ВИДЕН, но `decode_error` при этом ещё и терминален (не retryable, не escalatable) — 3 из 7 терминальных флагов пробы A | бэкенд | когда-нибудь (money-паком) | отдельное решение (дизайн §5.6) | D39.61, D39.64, D39.86 | | 79 | **Граница ПЛОТНОСТИ письма для серий**: `enabled` через Go-константу `cjkScriptNames` — новый плотный скрипт требует правки Go (head-finality уже в данных script-series.txt; пре-существующая граница, D39.75). Первые два компонента строки (isCyrLetter→`isTargetWordLetter` · magnitude `SourceScripts`-гейт) исполнены пакетом-чекеров, D39.78 | бэкенд | когда-нибудь | следующий пак общности / касание чекеров | D39.64, D39.78 | | 90 | **Ф2-кандидаты 02-mvp-плана без носителя** (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе; + H16 самоулучшение (V3-п.2, ПТ-26): дизайн петли по данным судьи — тем же препом | полигон/бэкенд | когда-нибудь (Ф2.5) | пилот-преп-промт (с 85) | 02-mvp-plan, D39.66, D39.73, D39.80 | | **— НАХОДКИ СВИПА ПОЛНОТЫ (D39.66: 951 обязательство проверено, потери возвращены в трекер) —** | | | | | | | 80 | **Резюме-слой памяти** — проза-суммарайзер ЗАКРЫТ (D39.69); строка = ГЕЙТ ПИЛОТА Ф2.5: первый деливерабл пилота — «допускает ли автономная нарратив-состояние-строка ДЕТЕРМИНИРОВАННЫЙ верификатор (source-anchored) — или это D1-компаундинг со схемой»; не-покрытые классы (source-anchored reveal · арк-колбэки без ключа) реальны, но не измерены как дефект | Ф2.5 (Q3 подтверждён D39.70) | когда-нибудь (пилот) | Ф2.5 пре-рег | D25 п.8–9, D39.66, D39.69 | | 81 | **ja-преп B6-ja (сужено пост-сверкой D39.66)**: Поливанов-валидатор (`translit_policy` = «Phase 2»-заглушка, `backend/internal/store/migrate.go:187`=`translit_policy TEXT` и `backend/internal/store/migrate.go:195`=`ruby_reading`) + kana-омограф POS/known-word гейтинг / B6-токенизатор (`backend/internal/membank/memory.go:1077`=`KANA and HAN are deliberately NOT boundary-checked`); чек-лист kana-алиасов сида УЖЕ построен (backend/README §ja + `AttachRubyAliasesToManual`) — остаток в нём только дизамбигуация двойных чтений (тот же B6) | бэкенд | когда-нибудь (перед ja→ru) | ja→ru-пак (рядом 35) | D16.4, D17.1, D18, D39.66 | | 82 | **Морфо-гейт РОДА** (C3: русский глагол прош. вр. при gender=hidden = механический спойлер-канал; «жалоба №1 читателей MTL»; python-сайдкар/pymorphy, связка с морфопроходом Decl из 73). **$0-прототип получен эксп-21** (`battery.check_gender`: карточки из подписанного сида, фильтр по именительному падежу, 86–112 сверок/арм — D39.117); движковый гейт не построен | бэкенд | когда-нибудь (Ф2-гейты) | отдельный пак (с 52) | 06-реестр C3, research/12, D39.66, **D39.117** | | 85 | **Пилот-преп добор** (к переупаковке PACKAGE4): Bertalign GOLD-пары + zh→ru spot-check (D29.2в; GPL-тулинг отдельно) · fidelity-каскад R2 shadow с корпус-подготовкой (D25.2) · exp08 v3 пере-съём COGS до фиксации budget_usd (D21.8) | полигон | когда-нибудь (Ф2.5) | пилот-преп-промт | D25, D29, D21.8, D39.66 | | **— ПАК-21 «чекеры»: РАСТВОРЁН (D39.62); шестёрка исполнена 2/6 фазой 2 (D39.64: #11 · строка 26), остаток — ниже —** | | | | | | | 93 | **Остатки строки 93 после пачки (D39.82):** строгий OffLanguage (36а, deferred D39.78) · 分之-разметка прежде стройки DC2 word↔word (полигон) · F4-хвост: `redrive --dry-run` обходит pre-flight, а `store.Open` мутирует SPOF-файл (миграции + recoverReservations; коммент «mutates nothing» неверен) — pre-flight и на dry-run при существующей БД либо read-only план; заодно stat-скип точной формой `fs.ErrNotExist`; **обострение приёмкой D39.134:** на устаревшей БД `--dry-run` выполняет ПОЛНУЮ миграцию схемы БЕЗ restore point (write-open без шва migrate) — воспроизведено исполнением. ⚠ **Остаток НЕ однороден по гейту (сверка 02.08):** F4-хвост и строгий OffLanguage свободны, а `分之`-часть ГЕЙЧЕНА полигон-разметкой среза («строить вслепую против мандата» — якорь техдолга) ⇒ не подавать строку как «малое касание без гейта» | бэкенд/полигон | когда-нибудь | малое касание / полигон-слот | D39.78, D39.82 | | 98 | **DC7 грейд-консистентность — пере-гейчен по сид-покрытию (D39.82):** замер пачки реален (25 юнитов/93 «разряд» ≠ канон «класс» на labels-финалах), НО финалы — прогоны до/вне сид-v2-канона, а грейды 甲/乙/丙/丁等 теперь approved-записи сида с decl-формами: mempostcheck флагнёт «разряд» промахом dst; строить DC7 только если ОСТАТОК девиаций переживёт сид-покрытие — замер на первом СИДОВОМ прогоне добора идеала; дом канона при стройке = book.yaml (как register_blocklist; ратифицировано D39.82 — НЕ dc-checkers.txt, посылка D39.79 исправлена) | бэкенд | когда-нибудь (гейт: первый сидовый прогон добора идеала) | замер остатка → решение | D39.79, D39.82, SMALLPACK §5-E1 | | 28 | Банк-линт латиницы в dst или строгая форма языкового предиката (7 строк утечки алфавита проходят экран); сюда же хвост закрытой 128 (D39.102: NoDst-почти-сентинел, латиница-target — дословно не переехал при закрытии, восстановлен аудитом D39.140) | бэкенд | когда-нибудь (добор идеала — носитель «свежий мини-прогон» растворён D39.67, актуализация D39.79) | касание чекеров при данных добора (помнить оговорку 36а: «甲等 → класс Цзя» строгой формой не ловится) | D39.52, D39.62, D39.64, D39.79 | | 28а | **Prompt-injection-проба входного текста** ($0): сепаратор ⟦TM-BANK-v1⟧ и якорь-подобные маркеры В ТЕКСТЕ КНИГИ — поведение среза/парсера/инъекции (книга = недоверенные данные; инструментов у моделей нет, но канал банкноты читает вывод по маркеру) | бэкенд/полигон | когда-нибудь | малая проба | сводка-ревью 26.07 | | **— СВИП ГИПОТЕЗ —** | | | | | | | 30а | **Перерисовка puml-диаграмм под пост-пак-20 пайплайн** (терминолог, банкнота отдельным файлом); дом диаграмм теперь `backend/docs/` — правятся одним коммитом с кодом (D39.80); PUML НЕ рендерить (гардрейл); ловушки activity-синтаксиса, стоившие реального бага 25.07, — `12-go-style-notes` §1 (дом на онбординг-пути бэкенда; строка держит указатель, а не сам факт — носитель с запланированной смертью для долговечного факта не годится) | бэкенд | когда-нибудь | ближайший пак, касающийся pipeline | аудит доков 26.07, D39.80 | | **— ОТДЕЛЬНЫЕ ПАКИ/РЕШЕНИЯ (бэкенд, добор идеала) —** | | | | | | | 31 | Слой-2: извлечение дискурс-норм/few-shot из ТЕЛ промтов (форсинг = ja→ru) | бэкенд | когда-нибудь | отдельный пак (идеал D39.33) | CURRENT-STATE, D39.33 | | 33 | **native-Gemini судья** (Ф2-механизм) ; до прод-заводки: $0.01-проба thinking⊆max_tokens на боевом слаге (D22.3) + включить sanitizer в pipeline-c2 при оживлении (D33.4б) | бэкенд | когда-нибудь | отдельный пак (идеал) | CURRENT-STATE, D39.33 | | 34 | **Генеральность нарезки** — ОСТАТОК после фазы 2: сами per-script коэффициенты (`est_out` ja завышен ~1.7× МОЛЧА · `EstimateTokens` недосчитывает кириллицу); консолидация класса письма СДЕЛАНА (один дом `DenseScript`, D39.64) — лечение = `Fertility`-map (строка 14) + офлайн-калибровка при боевом токенизаторе | бэкенд | когда-нибудь | строка 14 + отдельный пак (с ja→ru) | D39.37(5), D39.64 | | 34а | **Экран кодировки не видит `` без XML-объявления** (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) | бэкенд | когда-нибудь | отдельное решение | D39.54, SMALLPACK §8 | | 35 | **Не-CJK майнер/банк**: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип `mine_nonhan.py`) + G1–G10 требования generic-майнера (вкл. квадратичность G9 ≈4.6 ч) | бэкенд | когда-нибудь | отдельный пак generic-майнера (с ja→ru) | D39.37(8), D39.43, D39.50 п.8, POLYGON_PREMEASURE §6 | | 36 | Кластеризация майнера глотает родовые титулы (族长/学堂家老 в кластере 葛家) — закрыто на границе сборки входа, сама кластеризация не чинилась | бэкенд | когда-нибудь | отдельное решение | D39.43, D39.45 | | 36б | **Второе мнение по банку**: рецензент ДРУГОЙ моделью, несогласия — отдельной колонкой подписной таблицы (судья-с-декоем в роли рецензента; решает владелец, D39.46-ограничение не бьёт). ⚠ **Бэкенд-стройки НЕТ** (D39.69 закрыл по нужности); замер ИСПОЛНЕН (research/24, D39.102) — остаток = строка 5: рецензент спорных КЛАСТЕРОВ при ре-пробе 74, роутинг family/series-юнитами; переживёт замер → тонкая колонка наблюдаемости, не гейт | полигон (замер) → бэкенд (только если переживёт) | когда-нибудь (слот при ре-пробе 74, остаток строки 5) | замер остатка → решение | D39.69, D39.90, **D39.102** | | 36г | **Проводной формат каналов пересказан прозой в каждом пар-промпте, парсер в Go, связи нет** — формат в шаблон движка (`{{banknote_format}}`); линты держат класс, дублирование остаётся | бэкенд | когда-нибудь (со следующей правкой промптов) | отдельное решение (Р5) | D39.58 | | 37 | **Квадратичности: `AttachKWIC`** (16.8 с / 2000 кандидатов; фикс — многошаблонный поиск; ⚠ опция фикс-пака 128 НЕ взята — «чисто не ложится»: автомат в `membank` неэкспортирован, вынос в общий пакет = рефакторинг слоя, `terminology` PURE не может импортировать банк-стор — отчёт пака §4 п.5, D39.118) + src-правило банкноты при промахе чанк-пути (строка × длина книги; на 10 главах не видна) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.1, D39.58, D39.118 | | 38 | Смета не видит пере-покупку прохода терминолога на каждой итерации подписи (роль не пишет `chunk_status`, не видна `projectRebill`) · хвост приёмки №13: адрес чекпойнта батча = ординал при частотной сортировке ⇒ реюз чекпойнтов прохода ~0 на инкрементальной книге — **механика ПОДТВЕРЖДЕНА КОДОМ фикс-паком (§2 отчёта, D39.118):** G1 двигает состав юнитов и те же ординалы, на первом прогоне после пака перекупаются все бэнк-батчи (центы) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.2, D39.102, D39.118 | | 39 | S12 частичен: `malformedSeparatorAt` не ловит подмену слова разделителя и обрыв токена (комментарий обещает) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.3 | | 40 | `bankTokenBudget`: worst-case зашит zh→ru (признанная утечка §0; CJK-цель недобирает вдвое) | бэкенд | когда-нибудь | отдельное решение | D39.45, PACK20_BANK_BUILD §8.5.4 | | 41 | golden: вторая фикстура С langpack (сейчас пинится только фолбэк-путь) ; + golden-счётчики голоса (хвост D39.58) | бэкенд | когда-нибудь | отдельное решение | D39.37(6) | | 42 | `prompt_override` — легальный обход гарантии слоя-2, сформулировать честно | бэкенд | когда-нибудь | отдельное решение | D39.37(7) | | 43 | `request_log` без скоупа/ретеншена + `first_flag_reason` = третье представление истории попыток (корень — неразведённые скоупы) | бэкенд | когда-нибудь | отдельное решение | D39.37(9) | | 44 | **Флор — выбор числа ПОСЛЕ ре-пробы 74; модель «thinking в completion» ПОЛУЧЕНА замером (D39.86): рычаг против неограниченного думания = `reasoning_effort`, флор не рычаг.** Мини-проба флора одобрена владельцем, промт не выдан; у dspro эффорт не настраивается (quirks 3а). Расхождение трекера с 74 снято D39.90. Археология дословно — `architecture/13-tech-debt-anchors.md` §Б-44. ⚠ **Вводная сменилась 13.08 (вахта §Б-108 СРАБОТАЛА):** вендор дал pro/flash настраиваемые уровни low/high/max — квирк 3а («у dspro эффорт не настраивается») устарел, пере-проба маппинга ПОВЕДЕНИЕМ + абсорбция в quirks — полигоном | бэкенд | когда-нибудь (триггер «приёмка 104» НАСТУПИЛ — D39.91, ручка заленжена; «сколько ставить» остаётся НЕзамеренным — нужен вариационный замер флора при `low`) | отдельное решение | D39.37(10), D39.86, **D39.90**, вендор 13.08 | | 45 | `max_tokens`-упоры (две единицы) — вернутся на en-книге ; halve-chunk-on-retry (research/22 §2 №7) ОТКЛОНЁН D39.74 — вернуться сюда же при живых упорах | бэкенд | когда-нибудь | отдельное решение (с en) | D39.37(11) | | 46 | **Экран целевого языка: «полный связный перевод на английский» проходит classify как ok — живой носитель класса (D39.86); дизайн пака ЗАМОРОЖЕН (D39.92 п.1 closed-set + D39.93: изолированный модуль, именованные причины), промт ждёт выдачи.** Гейт-связка: мини-проба флора (44). Археология дословно (двусторонняя дыра оси цели · константы · мины реализации) — `architecture/13-tech-debt-anchors.md` §Б-46 | владелец → бэкенд | **скоро (порядок §5.4: сначала 113, шаг 6 — под подпись)** | правка Go по плану §5.4 | D39.39(д), D39.86, **D39.90** | | 47 | M2-кэш / доктрина Д2 — кандидат на отдельную ратификацию | оркестратор/бэкенд | когда-нибудь | отдельное решение | D39.42 | | 48 | Направленная банкнота — вернуться по замеру покрытия терминолога | бэкенд | когда-нибудь | отдельное решение | D39.42 | | 48а | **Серийный шаринг банка** — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет | бэкенд | когда-нибудь (перед второй книгой серии) | отдельное решение | D39.42 задел (а), PACK20_BANK_BUILD З-а | | 48б | **Импорт «оригинал + чужой перевод» как режим данных терминолога** (target-агностичный вход есть контрактом; сам режим + провенанс источника + юр-сторона в юр-пакете) | бэкенд/владелец | когда-нибудь | отдельное решение + Ф2.5 (юр) | D39.42 задел (б), PACK20_BANK_BUILD З-б | | 130 | **emitRankCap × writeAutoBank — ОСТАТОК после фикс-пака (D39.118):** $0-минимум ИСПОЛНЕН (дифф старого/нового авто-файла + WARN с именами выпавших; само-исключение сырого seed закрыто `unsignedEngineSurfaces` дофиксом приёмки); остаток = накопительный мердж авто-банка / освобождение слотов seed-rejects — СТОП-решение владельца (двигает банк → memory_version); материал для решения даст WARN со ВТОРОГО прогона (§6 п.8 отчёта пака) | владелец → бэкенд | когда-нибудь (гейт: WARN второго прогона) | СТОП-решение | D39.102 п.3, **D39.118** | | 131 | **Кап инъекции не считает маркер и гендер-ноты**: `glossaryLineTokens` бюджетирует только «src → dst» (`memory.go:518-521` против рендера `:698-708`) — авто-книга (все строки Ambiguous с ⟨проверить⟩) превышает `glossary_token_budget` ~на 40–60% при budget 800; биллинг/потолки компенсированы (резервация по фактическому рендеру, `stagerun.go:469-477`), сам кап не исполняется. Фикс двигает состав инъекций → RequestHash → перекупка волн ⇒ СТОП-решение с названной ценой. ⚠ После строки 134 (единый блок, маркер снят с провода — D39.104) превышение пере-замерить: состав рендера сменится | бэкенд | когда-нибудь | СТОП-решение | D39.102 п.3 | | 132 | **Стойкий (пост-ретрайный) аутедж ТОЛЬКО банк-провайдера валит весь ран** вопреки коммент-контракту «optional step never aborts» (`terminologist.go:630-634` — деградация только на ceiling; транспортные ретраи гасят transient, `httpllm.go:126-160`; потерь нет — чекпойнты реплеятся за $0): решить — деградировать в «термы неконсолидированы»+WARN либо честно переписать коммент | бэкенд | когда-нибудь | малое касание через СТОП-решение | D39.102 п.3 | | 134 | **Дата-правка инжект-заголовков под доктрину D39.105** (единый закон-блок редактора вместо двухсекционки · оговорка ОБЛАСТИ употребления · снятие маркера ⟨проверить⟩ с провода; статусы строк и подписная таблица НЕ меняются): кандидат-тексты — §B промта пробы 18; **ГЕЙТ ПАЛ (D39.108):** текст = ОТПРАВЛЕННАЯ строка пробы 18 БЕЗ оговорки области (девиация №1; оговорка опровергнута §A.4 — НЕ вносить); двигает рендер → RequestHash → перекупка, цену назвать при внесении | бэкенд | скоро | малое касание | D39.104 п.2, **D39.108** | | **— ШОВ ДВИЖОК↔ПЛАТФОРМА: деньги и механизмы (D39.106/107 п.2) —** | | | | | | | 136 | **Write-ahead intent + состояние `uncertain`-эскроу + `closing`**: холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка | платформа/бэкенд | скоро (промты по команде владельца) | стройка по research/25 | D39.106 | | 137 | **Ночная сверка расходов с данными провайдера** (в движок цены входят float64 по ручной таблице `ledger/pricing.go` — систематика процентная; сверка приоритетнее споров об округлении) | платформа | когда-нибудь (до первого платного пользователя) | стройка по research/25 | D39.106 | | **— НАХОДКИ ПРИЁМКИ ЭКСПОВ 18–20 (D39.108) —** | | | | | | | 140 | **Банковый контур в shipping-c1 НЕ включён — и это ШИРЕ прежней постановки про одну банкноту (сверка STACK.md, D39.126 п.2а): терминолог и классификатор тоже живут только ран-локальным конфигом книги** (ратифицированный путь D39.42 п.4; coldrun 56/128; `gates.terminology`/`gates.banknote` в c1 = 0 вхождений); решить: включить в c1 (двигает промпт драфта → RequestHash — цену назвать) либо поправить декларацию; родня 36г | владелец → бэкенд | скоро | СТОП-решение | D39.108, exp20 §6, **D39.126** | | 141 | **ОСТАТОК — работа В ДЕТЕКТОРЕ, и она НЕ про потерю текста.** ⚠ **Дыра, которой строка была заведена, ЗАКРЫТА лендингом D39.164:** сноска с ханьцзы («`[1] 蛊真人 — название романа.`») мимо детектора примечаний проходит по-прежнему, но поднимает класс `CJKLeak`, он `CosmeticOnly` (`backend/internal/checks/sanitizer.go:161-163`), юнит уходит `sanitizer_stripped` — и маркер дыры выдачи, заведённый паком «тихая порча», для НЕГО правдив. То есть читатель дыру ВИДИТ. Осталось: сноска БЕЗ ханьцзы («`[1] Название романа.`») не поднимает ни одного класса (замер сессии: `total=0`) и едет как есть — но текста при этом НЕ теряет, это лишняя добавка, а не дыра, и маркер на ней ДЕЗИНФОРМИРОВАЛ бы. Ловля таких сносок — правка самого детектора, отдельный предмет | бэкенд | когда-нибудь | правка детектора + тест | D39.108 (приёмка 20); половина закрыта D39.164 | | 142 | **Механизм «гейты флагают → точечная починка по флагу» как прод-путь**: exp20 §3.3 — $0.0002/дефект, 12/12 (при ИДЕАЛЬНОЙ детекции); механизм конкурентов (research/22:179), у нас петля пака-16 за `enabled:false` (строка 13); детекторы «выдуманное слово»/«инверсия» прототипированы эксп-21. **ДИСПОЗИЦИЯ D39.117:** ОТКЛОНЁН как замена редактора (`C2/A_law` −3.75 Holm 0.0006; «$0.0002 чинит всё» мерилось при идеальных флагах и при реальной детекции пало), ПРИНЯТ формой «механический ПРЕ-ГЕЙТ перед редактором» — брак 5 клеток против 10/23 при половинной цене ($0.00298/$0.00602); ремонт ТОЛЬКО с банком (без банка ломает канон 0.917→0.895) | владелец → бэкенд | скоро (форма решена D39.117; стройка — бэкенд-промтом по команде владельца) | бэкенд-промт | D39.108, **D39.117** | | 143 | **Абсорбция норматива судейства в `09-pilot-protocol.md`**: разброс инструмента ДО замера · объявленный порог различимости · MQM-lite/error-span первичен, pairwise только для стиля · декой обязателен · запрет судьи семейства жильца арма | полигон/оркестратор | скоро ($0) | правка дока | D39.108, exp20 §7 | | 144 | **Вахта: grok `reasoning_tokens` ВНЕ `completion_tokens`** — формула цены харнессов может недосчитывать (до $0.0325 на exp20); вендор-сверка биллинга xAI при следующем прогоне с grok | полигон | когда-нибудь (следующий xAI-прогон) | вендор-чек | D39.108 (приёмка) | | 146 | **Два техдолга движка без строки трекера** (свип 08.08): `prices_checked` (120 д) гейтит read-only `report` и $0-resume — свежесть цен проверять только на ПЛАТНОМ пути (`03-implementation-notes:244`) · `cache_ttl` ↔ `cache_write_per_m`: цена записи в кэш задана под ОДИН TTL (5 м), при другом TTL расчёт врёт (`:246`). Оба жили только в справочнике якорей, то есть вне единственного трекера · **приёмка D39.134:** ценовой гейт держит и ДЕТЕКТОР самолечения деплоя — на стенде с протухшими ценами `status` даёт 10, а не 13, и цикл «поймал 13 → migrate → повтор» не наступает | бэкенд | когда-нибудь | малое касание | свип доков 08.08, D39.134 | | 147 | **Транспортные частичные из research/21 без носителя** (свип 08.08): п.16 HTTP/1.1-escape на последней попытке как ДИАГНОСТИКА тихого усечения 2–8k [PARTIAL, GATED] · п.17 assistant-prefill continuation на `finish=length` вместо ре-рана всего вызова [PARTIAL, DEFER]. Оба помечены в ресёрче как отложенные и ни в одной строке трекера не появились | бэкенд/полигон | когда-нибудь | замер → решение | свип доков 08.08, research/21 §16–17 | | 149 | **Эксп-22 «панель жильцов»** — состав панели и её заказ ИСПОЛНЕНЫ; выводы заморожены до фазы Д, строка закрывается при её ратификации | полигон | **ИСПОЛНЕН и заленден 10.08** (приёмка №16; заказ дословно — промт `archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md`, выводы — телом **D39.117**) | ратификация фазы Д | **D39.117**, приёмка №16 | | 150 | **Sol-арбитраж — внешний контур вместо слепого чтения владельца**: пере-суд расходящихся контрастов эксп-21 (`A/F`: luna +0.84 против gemini +3.03 — расхождение 14 sd шума судьи-замены) и слепых пар эксп-22 руками владельца через подписку (третье семейство, high reasoning); пакеты готовит эксп-22 Ф0.4 (слепые метки · оба порядка · декой), транскрипты персистятся как голоса внешнего судьи; luna-клетки Sol не судит (своё семейство) | владелец + полигон | скоро (пакет арбитража — из существующего сырья) | эксп-22 Ф0.4 + руки владельца | **D39.117** | | 151 | **Отказной режим связки**: эхо-мина черновика воспроизводима на материале (глава 11 — 3/3 попыток; частота 31% на zh), связка покрыла 9/10 подряд идущих глав против 10/10 у однопроходки — единственный довод ПРОТИВ связки во всём эксп-21; движку нужен fallback при невозможности годного черновика (вариация ре-гена · эскалация модели черновика · деградация в однопроходку) | владелец → бэкенд | когда-нибудь (до МАСШТАБА) | СТОП-решение | **D39.117**, exp21 §14 | | 152 | **Слипание абзацев — слепое пятно детерминированного контура**: батарея на тех же текстах даёт ДРУГОЙ порядок армов (`D` — худший по судье — лучший по правилам), расхождение локализовано в слипании, которого не проверяет ни одно правило; правило в батарею полигона + кандидат в гейты движка | бэкенд/полигон | когда-нибудь | малое касание + тест | **D39.117**, exp21 §13 | | 153 | **Чистый контраст мандата перевёрстки**: `D/D_` загрязнён (объём промта ×1.92 + вёрсточная строка + правило чэнъюй); уравненные промты и пере-гон ≈$0.35; по грязному контрасту мандат ВРЕДИТ по оси ФОРМА (−1.09 из −3.31 `D/A`) | полигон | когда-нибудь (опция эксп-22 Ф3 — реши сессия) | замер | **D39.117**, exp21 §16.3 | | **— ХВОСТЫ ФИКС-ПАКА БАНКА (D39.118) —** | | | | | | | 154 | **Одноруновая голова семьи** (`蛊`/`转`/`窍` едет в отдельном вызове от 12 своих поверхностей — якорь семьи обязан быть ≥2 рун) — включается ОДНОЙ строкой данных `family_containment_runes han 1`, Go не трогается; не включена: цена в размере юнитов не замерена | бэкенд | когда-нибудь — ⚠ **ГЕЙТ ПАЛ И ОКАЗАЛСЯ НЕДОСТИЖИМ** (испр. 02.09, переведена из БЛИЖНЕГО веса): первый холодный прогон отработал 31.08, и он же показал, что назначенный замер этим путём НЕ БЕРЁТСЯ — манифест не публикует размеров юнитов В ЗНАКАХ вовсе (юнит несёт `id`/`first_*`, не длину). ⚠ Настоящее предусловие — новое поле контракта манифеста, то есть решение УРОВНЯ НОТЫ (`manifest_version`), а не строки бэклога: до него строка не гейчена ничем достижимым | строка данных по замеру | **D39.118**, отчёт §5 | | 155 | **Скрипт-слепой резолв семей/серий**: han-правила режут кану и хангыль (синтетика: 24 катаканных имени с общим アリ → батч 8036 рун при бюджете 6000); живого вреда нет — пары в репо нет; та же слепота у серий уже в HEAD | бэкенд | когда-нибудь (преп ja→ru, с 81/120) | ja-пак | **D39.118**, отчёт §5 | | 156 | **`banknote_truncated` — ПОЛ, а не счёт**: обрыв, срезавший сам разделитель, флага не даёт; буквальный фикс зажёг бы колонку на каждом обрыве в прогонах без канала — нужен гейт по `Gates.Banknote.Enabled` | бэкенд | когда-нибудь | малое касание | **D39.118**, отчёт §5 | | 157 | **Пере-подтвердить `family_max_members=24` и `families_held`** на длинной книге (24 калиброван на дистилляции в 150 поверхностей; кап эмиссии 200 + реверс-секция дают другой список); если `families_held` велик — ослабить гард до «родство по любому члену юнита» вместо «по корню серии» | бэкенд | когда-нибудь — ⚠ **ГЕЙТ ПАЛ 31.08, ответ ОТРИЦАТЕЛЬНЫЙ** (испр. 02.09, переведена из БЛИЖНЕГО веса): прогон дал `families_held=0`, значит ослаблять гард не нужно. ⚠ Но замерено на ДЕСЯТИГЛАВНОЙ книге, а строка требует пере-подтверждения на ДЛИННОЙ — вывод действителен «на 10 главах» и протухнет на первой длинной книге. Указатель «§6 отчёта» заменён на греп-форму: `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, греп `families_held` | замер → решение | **D39.118**, отчёт §7 п.7 | | 158 | **Уверенность не гейтится данными пары**: канал снимает третью колонку у любой пары, чей промпт её попросит; у пары с ДВУХпольным промптом узкий риск «Пик␣␣99» (число ≤100 за двойным пробелом уедет в conf); при нужде — дата-декларация пары | бэкенд | когда-нибудь | дата-декларация | **D39.118**, отчёт §4 п.6/§7 п.8 | | 159 | **Durable-имена эвиктнутых** (`retrieval_state.evicted_detail` = миграция; сегодня лог, и приёмка ратифицировала «этого достаточно») — заводить только при доказанной потребности, одним касанием с идемпотентностью миграций 49а | бэкенд | когда-нибудь (гейт: доказанная потребность) | миграция с 49а | **D39.118**, отчёт §7 п.2 | | 160 | **Структура глав, Этап 0** ($0, wire-нейтрально): `titleRaw` в манифест (subtitle добывается `matchHeaderLine` и ПОНИЖАЕТСЯ в тело прозы (испр. D39.125), а не выбрасывается) + provenance у heading + тип chapter/fragment + вердикт структуры (бамп manifestVersion) · **дыра Р6**: projectRebill слеп к контент/позиционной оси (rebill.go:32-35) — ревизия структуры перекупила бы хвост МОЛЧА, закрыть read-path-расширением · слой пользовательских правок отдельным сайдкаром · **зонная половинка темы:** Ф-30 фронта / В-4 владельца (глава без заголовка на экране — метка из ДАННЫХ, К-3) ждут ровно эту строку; `heading` манифеста до неё = ВРЕМЕННЫЙ рендер движка (D39.122 п.2д) | бэкенд | скоро (ГЕЙТ ПАЛ словом владельца 15.08, D39.136 п.3: ставится ближайшим бэкенд-паком с мандатом максимального качества; ⚠ 30.08: впереди неё стоит блокер 236 — писатель книги, очередь №20 п.1, «ближайшим» читать как «следующим после него»; тесты структуры глав — узлом будущего холодного прогона) | пак | research/27 §6 Этап 0, D39.122 п.4, D39.136 | | 161 | **Структура глав, Этап 1 «большой перекрой»** (единственное дешёвое resnapshot-окно — пока платная книга одна, ДО интейка): IR + формато-адаптеры (epub nav/NCX, fb2) + индуктор с валидаторами и вердиктами + третий версионный план паттернов (не в снапшот волн) + развязка чанкера от глав + банк-окна на chapter-ID + контент-адресуемый resume (долг D15.2) + формула Chapter.ID «окно» + роль title (мини-сессия названий: редакторский слот · инъекция банка · двухфазно вокруг подписи) + аддитивное расширение контракта 14; жизненный цикл дерева — research/27 §3а (решение владельца 09.08) | бэкенд (+фронт/платформа аддитивно) | скоро (постановка санкционирована D39.136 п.3: СНАЧАЛА дизайн-пак с мандатом максимального качества, стройка после ратификации дизайна; ⚠ дешёвое окно закрывается первой книгой внешнего пользователя) | дизайн-пак → ратификация → пак(и) | research/27 §3/§5/§6, D39.136 | | 162 | **Структура глав, Этап 2**: in-band метки глав в потоке перевода (третий эшелон детекта + коррекция структуры по ходу черновой волны, §3а п.3) + канон-гейт названий ($0) + миграционные карты якорей (same/moved/split/merged/gone/new) + калибровочный корпус детекта в CI ⚠ Форма владельца 30.08: черновая модель отвечает МЕТАДАТОЙ в конец ответа, если посчитала строку фрагмента авторской разметкой главы — разметка едет попутно с черновиком без отдельного платного прохода; доверие — через фиксацию в манифесте и подтверждение спорных. | бэкенд + полигон | когда-нибудь (после Этапа 1) | пак + корпус | research/27 §5/§6 Этап 2 | | 163 | **Версии модулей x/text|x/net двигают нарезку МИМО всех ключей** (NFC в NormalizeSource — таблицы модуля, не тулчейна; epub-токенайзер): бамп `go get -u` тихо меняет нарезку при свежих на вид манифесте/чекпойнтах/снапшоте — класс всей чекпойнт-плоскости, унаследован манифестом; вплести версии модулей (debug.ReadBuildInfo) в NormVersion/chunkerVersion либо явный запрет бампа без `--resnapshot` | бэкенд | когда-нибудь (до второго прогона книги) | малое касание | **D39.122**, приёмка (охотник №1) | | 164 | **Rebill-проекция `status` с nil baseMemory завышает RebillUSD**: read-путь не материализует base-банк → renderedContentHashes даёт пустую инъекцию → repin недоопознан, строка считается re-pay (консервативная сторона, но противоречит комменту «status can never quote a different number than translate»); материализовать base-банк на read-пути либо смягчить клейм | бэкенд | когда-нибудь | малое касание | **D39.122**, приёмка (охотник №1); preexisting | | 166 | **Движковая поверхность оценки $/глава** (ставка-константа платформы $0.03 из exp08 v2 — временная мера беты, П-10 зоны платформы; честная оценка по книге/паре — движковая) | бэкенд | когда-нибудь | отдельный пак | D39.123 | | 167 | **Докс-пак по аудиту D39.125 — ЯДРО ИСПОЛНЕНО, состав — телом D39.126.** **Остаток строки:** статус-баннеры экспов + шапка эндпоинтов quirks (передано полигону промтом фазы Д, §Д8 п.12) (пункт «DEFECT_REGISTER секциями» СНЯТ 22.08 — исполнено зоной ещё в P5) | доки/полигон/платформа | скоро (остаток — фаза Д полигона) | пинги зонам | D39.125, **D39.126** | | 168 | **Состав волн пайплайна = пар-конфиг (данные), не общий хардкод**: вопрос владельца 10.08 «нормально ли под китайский строить весь бэкенд и конфиги?» — жильцы ролей и промпты уже конфиг/langpacks, но ТОПОЛОГИЯ волн (перепис · точечный edit-контур · без второго прохода) одна на всех пар; если фаза Д покажет разных победителей по парам (H-3/H-4: en-черновик+edit против zh-связки), состав волн уезжает в пар-конфиг данными; ревью-вопрос общности §0 `12-go-style-notes.md` | бэкенд | когда-нибудь (после данных фазы Д) | замер (фаза Д) → решение владельца → малое касание | слово владельца 10.08, промт фазы Д | | 169 | **Экспорт банка для чтения фронтом — ДВИЖКОВАЯ половина ПОСТРОЕНА:** сайдкар `.bank.json` — весь банк тремя статусами, стабильные id, атомарная запись (`internal/pipeline/bankexport.go`, с D39.122). ⚠ **`bank-stop.json` НЕ существует** — снесён вместе с писателем и четырьмя тестами при постройке входной двери шва (D39.158); в Go-коде движка ни одного вхождения, холодный прогон 31.08 подтвердил на диске. ⚠ Не путать с ЖИВЫМ текстовым сайдкаром таблицы стопа `.bank-stop.txt` (`backend/internal/pipeline/mining.go`, греп `bankStopTablePath`) — он на месте и машинной проекцией банка не является. **ПЛАТФОРМЕННАЯ половина: ЧТЕНИЕ ПОСТРОЕНО P7** — проекция банка `listBankTerms` с агрегатами; **ЗАПИСЬ СНЯТА 22.08** — `submitBankDecisions` удалён вместе со всей пер-термной моделью подписи (`PD-370`, ратификация D39.144; D39.153, затем D39.154). **ЖИВОЙ ОСТАТОК стал ШИРЕ, а не уже:** нет ни доставки решений до движка, ни самой ручки, куда их вводить — без неё витрина банка фронта стоит на моке, а подписной экран S5 строить не на чем; носители — строка **199(а) [ЗАКРЫТА D39.166]** плюс контрактная **206** | платформа | скоро (остаток = доставка, строка 199а) | строка 199(а) [ЗАКРЫТА D39.166] | Ф-43 фронта, D39.122, **D39.127**, испр. 14.08 | | 170 | **`tmctl init` — движок сам заводит книгу** (форма В развилки интейка): платформа зовёт $0-команду, движок пишет СВОЙ `book.yaml` — требования к полям живут там же, где проверяются (`config/book.go`); до неё бета живёт формой Б (рендер из деплой-шаблона платформой при создании книги, ратификация D39.130) | бэкенд | когда-нибудь (после беты формы Б) | малый пак | приёмка P5, **D39.130** | | 172 | **Остаток после пере-пина DeepSeek (пин ИСПОЛНЕН и ПРИНЯТ — D39.137, `76049bb`):** (а) **схемное решение владельца по time-based** — доклад §5 отчёта вендор-сессии (рекомендация: пик оставить; scheduler-вариант строки 60 не начинать до ответа вендора «по какой отметке времени тарифицируется вызов» — вендором НЕ задокументировано — и замера доли пика; дешёвый рычаг: операционное правило «прогоны не стартуют в 01–04/06–10 UTC» — почти всё ×2 без строчки Go; гибрид «резерв пиком, сеттл по окну факта» назван) · (б) пере-калибровка ставки $0.03/глава (166/П-10; множитель счёта замерен) · (в) exp08 v3 (85) обязателен до budget_usd · (г) **вахта весов V4-Pro-0813** (класс D39.61): риг готов, порог ратифицированной ВЫБОРОЧНОЙ формы («≥4/5 прогонов N=5 достигают 6/6», D39.136 п.6б) **в риге ИСПОЛНЕН** паком честности — арифметика вынесена в `live_reprobe_threshold_test.go`, сам риг применяет её же. ⚠ **ИМЯ СТРОКИ ВВОДИТ В ЗАБЛУЖДЕНИЕ (испр. №18 17.08, сверено кодом):** названный риг меряет роль КЛАССИФИКАТОРА, а она ходит на **flash** (стендовый `pipeline.yaml:64` + артефакт прошлого прогона `model = deepseek-v4-flash`), тогда как сменившиеся веса — у **pro**, а pro у нас = РЕДАКТОР (`configs/pipeline-c1.yaml:62,76`). Владелец 17.08 санкционировал ТОЛЬКО вариант (а) — пере-съём классификаторного гейта, потолок $0.20, исполняется п.5 пака честности. **По этому прогону строку НЕ закрывать:** вопрос «сменились ли веса редактора» остаётся открытым, дешёвый вход к нему — данные фазы Д, где pro гоняется именно редактором (спросить полигон прежде, чем покупать новый замер) | владелец → бэкенд/полигон | скоро (схема — на владельце; вахта — после 16.08) | СТОП-решение (схема) + замер (вахта) | вендор 13.08, **D39.137**, строка 60, D30.4 | | 180 | **`prices_checked` — одно поле на ВСЮ таблицу цен** (находка вендор-сессии, D39.137): бамп по факт-чеку одного вендора сдвинул 120-дневный гейт свежести остальным семи моделям (дедлайн уехал ~07.11→~13.12); лечение — пер-модельная дата проверки (правка схемы) ЛИБО ре-чек остальных вендоров отдельным заходом до исходного дедлайна | бэкенд | когда-нибудь (ре-чек вендоров — до ~07.11) | малое касание / вендор-заход | D39.137, отчёт §7.1 | | 182 | **Wire-батч перед добором идеала — КОПИТЬ и вносить ОДНИМ касанием** (каждая правка двигает RequestHash / `memory_version` / снапшот = перекупка волн; дриблить по одной = платить пере-снапшот несколько раз): 46 экран цели (+предпосылка 113 фикстура) · 134 инжект-заголовки (гейт пал D39.108) · 131 кап инъекции · 140 банковый контур в shipping (СТОП-решение) · 105(а) вердикт-половина классификатора · 130-остаток (мердж авто-банка, гейт WARN второго прогона) · 14 ё-фолд (носитель «следующий пак общности») · **119+124(+115 пер-парный хеш EmbeddedVersion) — ОДНИМ дизайн-паком** (строка 124 требует принимать целиком; сверено кодом: `cutTag` фолдит `chunkerVersion`/`EmbeddedVersion`/`NormVersion` — `manifest.go:160-169`); вне батча свободен только 118 (tools/go.mod). Состав — аудит корпуса 15.08 (archive/reports/CORPUS_AUDIT_2026-08-15.md §В.г) | оркестратор → бэкенд | скоро (собрать к ратификации фазы Д; вносить перед первым платным прогоном добора идеала) ⚠ **СОСТАВ ОКНА 04.09 (D39.190 п.4 ратифицировал пере-снапшот единым актом):** в выданный вайр-батч вошли **210 · 113→46 · 134 · 140 · 184(а)**; СНАРУЖИ остались и это сказано вслух, а не умолчано — **131** (кап инъекции: своя цена и своё СТОП-решение, и сама строка велит «пере-замерить ПОСЛЕ 134», то есть её очередь следующая), **105(а)** и **14** (ждут следующего окна), **119+124+115** (только одним дизайн-паком), **160** (бампает `manifestVersion`, отложена ПОРЯДКОМ — D39.190 п.2), **142** (после шагов 0–1 полигона — D39.190 п.3). | координационная строка → промт(ы) батча | аудит 15.08, D39.134/136/137 | | 171 | **Число символов книги — от движка** (PD-177 платформы: `character_count` интейка точен только для UTF-8; GB18030/UTF-16 движок декодирует сам — цифра платформы на них неверна, для UTF-16 занижена ~вдвое): счёт символов в манифест (рядом `source_bytes`/`encoding`) либо перерасчёт платформой после разбора | бэкенд | когда-нибудь | малое касание (манифест) | П-13 платформы, PD-177, приёмка P5 | | 173 | **`backupStamp` секундной точности**: два `translate` в одну секунду дают коллизию имени бэкапа и exit 1, маскируя класс «проект занят» (12) — метка до наносекунд/uniquify либо распознавать коллизию явно; преexisting, вскрыт ревью эмиттер-пака | бэкенд | когда-нибудь | малое касание | приёмка D39.131 | | 175 | **Деплой движка «в полёте» — ДАЛЬНИЙ ОСТАТОК** (ближняя половина ИСПОЛНЕНА паком migrate — D39.134; правило свипа и settle запиненным бинарём — аддендум P6, D39.132). Остаток: (а) при СЛЕДУЮЩЕМ бампе схемы проставить в файл книги `application_id` + `min_reader_version` — данные-задел под окно совместимости, ~0 логики; (б) GC бинарей: удалять не пиненные ни одной незакрытой попыткой, последние 2–3 релиза держать для отката; (в) окно совместимости читателей / пин уровня книги — строить ТОЛЬКО по триггерам: много тенантов · бампы схемы еженедельно+ · потребители `status` кроме платформы. Археология захода — ресёрч 14.08 (вывод: exact-match читателей на деньгах = осознанный fail-closed, корень не выдёргивать, приделать дверь) | платформа/бэкенд | когда-нибудь (по названным триггерам; (а) — попутно первым бампом схемы) | данные-задел + малые касания | владелец 14.08, ресёрч 14.08, строка 139, D39.134 | | 177 | **Гигиена restore point `tmctl migrate`** (находки приёмки ВНЕ карты отчёта; фикс-лист ФМ — запись приёмки 15.08, слайс [archive/PROGRESS-2026-08-14-15.md](archive/PROGRESS-2026-08-14-15.md)): ретрай в ту же секунду после сорванного шага = exit 1 «backup already exists» вне полосы — ровно на цикле самолечения платформы · kill -9 посреди шва оставляет РВАНУЮ копию под легитимным именем (ручной откат по ней = потеря данных; лечение — temp+rename) · копии restore point не подчищаются (повтор после срыва копит их) · SIGINT/SIGTERM в migrate не прерывают (ctx не доезжает) · комментарий migrate.go «no money touched» на no-op неверен (recovery зануляет leftover reserved) | бэкенд | когда-нибудь (следующее касание migrate/бэкапа) | малое касание + тесты | D39.134, приёмка №17 | | 178 | **Калибровка `sense` банка** — слово владельца 15.08 (D39.136 п.4б): смысл должен быть «ёмкий и достаточный на всю книгу, но не слишком подробный» (образец: «спутница главного героя»); сейчас возможно КОРОТКОВАТ; замер длины/достаточности на подписанном банке → правка промптов банкноты/терминолога (двигает провод — цену назвать при внесении) | бэкенд/полигон | когда-нибудь (касание банка) | замер → правка промптов | D39.136 п.4б | | 183 | **Батч 0.3.0 — ОТРАБОТАН ЦЕЛИКОМ** (батч D39.142 + дофикс D39.143, `86720cf`; промт в архиве). ⚠ Номер канона в этой строке НЕ держим — канон ушёл на **0.9.0** (D39.180), лента миноров — в шапке. **ЖИВОЙ ОСТАТОК ОДИН — (б):** зеркало `frontend/docs/api-contract/` + типы + моки + гейт утечки, первое касание фронта при разморозке; расхождение канона и зеркала ВРЕМЕННО ратифицировано D39.142 п.5. Пункты (а) и (в) СНЯТЫ (D39.153; D39.144 п.4)| оркестратор | скоро (остаток = только (б) зеркало фронта при разморозке) | P7 → фронт при разморозке | D39.138, D39.142, **D39.143** | | 184 | **Жанр книги — ВЫКИНУТЬ (слово владельца 16.08). ⚠ ДВЕ ПОЛОВИНЫ ИЗ ЧЕТЫРЁХ УЖЕ ИСПОЛНЕНЫ** (сверено кодом при аудите доков 22.08): поле ушло из контракта и из формы интейка батчем 0.3.0, и платформа жанра больше НЕ ЗНАЕТ — `platform/internal/books/render.go` несёт `genre` шаблона нечитаемым насквозь и говорит об этом прямо. **ЖИВЫМИ остаются две:** (а) движковая — снять `{{genre}}` из промптов пары (⚠ испр. 30.08: он в ШЕСТИ промптах пары, а не в трёх; состав здесь НЕ держим — снимать командой `grep -rln "{{genre}}" backend/prompts/`) + поле из канона брифа: двигает `BriefHash` ⇒ ТОЛЬКО в общее resnapshot-окно, координировать со 161/182, дешёвое окно пока платная книга одна; (б) фронтовая — форма при разморозке; влияние жанр-строки на качество не измерено и уже не будет | бэкенд (+платформа/контракт/фронт) | скоро (движковая половина — resnapshot-окном) | касание в окне 161/182 + батч 183 | research/28 Б-23/§8 п.6, D39.138 п.2в | | 185 | **Дописывание глав в ТЕКУЩУЮ книгу («костылей не будет»):** форма `POST /books/{id}/parts` + ответ «сколько глав добавится, что сдвинется и почём» ДО подтверждения; экономика уже позволяет В КОНЕЦ за ~$0.02 (ключ вызова позиционный, исходник вне снапшота), вставка в середину = МОЛЧАЛИВАЯ перекупка хвоста ~$9–11/500 глав — движковый гейт против молчания ОБЯЗАТЕЛЕН (родня дыры Р6 строки 160); платформа второй файл принять не может (re-parse нет); ja-мина: новый ruby-алиас двигает `memory_version` → снапшот (громкий `--resnapshot`, уточнение приёмки); полный $0-резюм хвоста — предусловие D15.2 (строка 49) | бэкенд+платформа+контракт | когда-нибудь (вместе со строками 160–162 — дизайн в паке 161) | дизайн-пак 161 → стройка | research/28 Б-19а/§8 п.7, D39.138 п.2г | | 186 | **Сеть: перечитывания ничем не удешевлены** (замер 16.08: дерево 2283 глав = 250 КБ на каждый кадр `status`, фокус-рефетч 12 вкладок = 562 КБ — самый частый трафик порождает переключение вкладок, не пайплайн; гипотетический кадр банка на главу = 372 МБ/прогон; сжатия/ETag/304 нет НИГДЕ): план по эффекту — (1) gzip на текстовых ответах, НЕ на SSE (2) `ETag`/`If-None-Match`→304 на списочных GET (3) скоуп в кадре (id+версия, БЕЗ текста) (4) дельта-чтение банка/замечаний `?after_version=` (5) `staleTime` у клиента; шаги 1–2 — платформа (её же `platform/docs/PLATFORM_DIRECTION.md`, греп `Условные запросы`), семантика — в спеку батчем 183; транспорт НЕ менять (решение владельца по §5б) ⚠ **ШАГИ 1–2 ПОСТРОЕНЫ И ЗАЛЕНДЕНЫ P7 (D39.153)** — gzip на JSON и НЕ на SSE + `ETag`/`If-None-Match`→`304` на коллекциях, карточке книги и `/capabilities` — **и ПЕРЕ-ПРОВЕРЕНЫ ЗАМЕРОМ 28.08** (воркфлоу-ревью P9 на стенде, приёмка D39.162): банк 437 Б холодным → повтор с `If-None-Match` даёт **304 / 0 Б**; юниты главы 3008 Б → **740 Б gzip (×4.1)**; ниже порога 1024 Б gzip честно НЕ применяется; SSE корректно не сжимается. Остаток — шаги 3–5 | платформа (+контракт/фронт) | скоро (остаток: шаги 3–5) | мидлварь/edge платформы + батч 183 + разморозка фронта | research/28 §5б/Б-11а, D39.138 п.2д | | 188 | **Носитель события «ре-проба 74»** (аудит D39.140: событие ждали строки 5 · 36б · 44 и шапка CURRENT-STATE, а владельца у него не было — строка 74 закрыта D39.91): дешёвая ре-проба flash при ПЕРВОМ платном прогоне добора идеала (D39.63 п.4) + слоты, подвешенные на неё: рецензент спорных кластеров банка (остаток 5) · замер второго мнения (36б) · выбор числа флора (44, после одобренной мини-пробы) · итерация №2 редакторов (D39.22/63) · выборочный порог 116 в риге (дописка 172-г) · решение о включении ре-гена перед эскалацией (экс-77, D39.64: «включение — решением при ре-пробе 74»; ручка построена, мертва во всех конфигах, ре-ген ≈7.6× дешевле эскалации) | полигон/бэкенд | скоро (гейт добора идеала — первый платный прогон) | проб-пакет при первом платном прогоне → решения по слотам | D39.63 п.4, D39.91, аудит D39.140 | | 189 | **Мультиязычность фраз ЛОГОВ и АРТЕФАКТОВ движка — вторая половина слова владельца 15.08** (D39.136 п.4а «фразы ВСЕХ зон»; первая половина — юзерский провод — решена ревью 28 Б-1/батчем 183): фразы в `bank-stop`/статусных артефактах и логи движка вне контракта, носителя не было (research/28 §6, строка Ф-61: «носителя назвать отдельно» — аудит D39.140 подтвердил: не назван); разобрать, что из этого читает ПОЛЬЗОВАТЕЛЬ (артефакты банка — да, через проекцию платформы) и что оператор (логи — легитимно английские) | бэкенд | когда-нибудь (до второй локали интерфейса) | разбор → точечная правка | research/28 §6, D39.136 п.4а, аудит D39.140 | | 190 | **Кросс-СЕМЕЙНЫЙ проход контракт-ревью** (не-Claude опровергатели; буква заказа владельца D39.136 п.5 «кросс-модели», исполненная в ревью только кросс-тирами Claude — ограничение честно заявлено research/28 §7/§10): проверка вердиктов доклада моделью другого семейства полигонным контуром; жила только колонкой «ЖИВОЕ» реестра нот — аудит D39.140 дал строку | полигон | когда-нибудь (после фазы Д; перед лендингом батча 183 — если владелец захочет второй рубеж) | полигон-слот с внешним провайдером | research/28 §10, аудит D39.140 | | 191 | **Подпись банка = ОДИН ОК всему банку (модель владельца 16.08, D39.144)** — пер-термный полный набор решений НЕ гейт нигде: (а) контракт поправлен (409-полноты снят с resume, `pending_decisions` информационный — исполнено D39.144); (б) **движок**: verify_bank-пауза снимается командой resume с решениями «как есть», нерешённое едет авто-строками с пометкой; (в) **платформа**: канал решений строится накопительным БЕЗ гейта полноты + проводка «resume = снятие стопа» до движка; (г) пост-ридинговый цикл правок — выселен строкой **192** (носитель думания). ⚠ **(в) и (б) ИСПОЛНЕНЫ:** проводку сделала платформа лендингом P7 (D39.153, флаг `--verify-bank` на resume не передаётся, пин есть), а движковую половину **УСТРАНИЛ, а не обошёл, пак входной двери (D39.158 п.1/п.7)** — стоп срабатывает только на кластере, которого ни один прежний стоп не предъявлял (память `bank_stop_presented`, схема v16), возобновление БЕЗ решений продолжает прогон. ⚠ Остатка-РАТИФИКАЦИИ нет — снято 22.08 сквозной трассировкой, разбор строкой **203(з)**. **ЖИВОЙ ОСТАТОК ОДИН:** снять обход в платформе (её пак).| бэкенд+платформа | скоро (остаток — платформенный, разбор 203з) | пак платформы | слово владельца 16.08, D39.144, D39.42 п.3 | | 192 | **Пост-ридинговый цикл правок банка — «наше подумать» владельца 16.08 (записано, чтобы не потерялось; точную механику «не продумал ещё никто и нигде» — его слово).** UX-модель целиком: юзер нажал перевод → черновая волна + майнинг вместе → на фронте появляются ЧЕРНОВОЙ перевод и ЧЕРНОВОЙ банк · подписывается ВЕСЬ банк одним ОК (D39.144) → перевод уходит в доработку · дальше юзер ЧИТАЕТ, и его опции: поправить термин в банке ЛИБО добавить свой → кнопка «поправить» → пере-генерация, которая по ВХОЖДЕНИЯМ правит запрошенное. Открытые вопросы дизайна: что именно перегенерируется (вхождения ключа · затронутые юниты · со сметой и согласием?) · нужен ли движковый ТОЧЕЧНЫЙ РЕДАКТОР (полигон над этим работает — фаза Д) · форма в контракте (ручки нет) и на экране. Уже лежит под ногами: движковый re-edit по ключу банка со сметой и $0-пере-пином ПОСТРОЕН (строка 49: `repin.go`/`rebill.go`, D39.42 п.5/D39.45) · пометка неподписанных строк · дельта-чтение банка (0.3.0). НЕ проектировать до полигонных итогов; затем дизайн-пак на их результатах → слово владельца → стройка | владелец+полигон → бэкенд/контракт/фронт | когда-нибудь (триггер: итоги фазы Д по точечному редактору) | дизайн-пак после полигона → слово владельца → стройка | слово владельца 16.08, D39.144 п.1 | | 195 | **ОСЬ «идентичность оплаченной работы» — переселена в дизайн-пак 124 (решение владельца 17.08, вариант А; D39.151).** Как САМОСТОЯТЕЛЬНАЯ стройка ЗАКРЫТА: маркер `snapshot_id`/`run_id` на `checkpoints` отдельной колонкой НЕ строится. Причина — внешний разбор опроверг посылку «колонка = тождество»: $0-пере-пин законно переносит строку на новый снапшот со СТАРОЙ ценой (`stagerun.go:96-105`, сверено оркестратором), у старых чекпоинтов бэкфилла нет вовсе (`jobs.snapshot_id` перезаписывается каждым ре-снапшотом) ⇒ вывод-обход остаётся в коде навсегда как legacy-ветка, а колонка лишь добавляет рядом второй путь. **Настоящий корень глубже:** в сторе нет первоклассной связи «строка диспозиции ↔ вызовы, которые её оплатили»; снапшот на чекпоинте — прокси, а не примитив. ⚠ Границы семьи сужены тем же разбором: 49 и 195 — про РАЗНОЕ (49 = когда переиспользование законно, 195 = как честно посчитать будущую покупку), общий у них субстрат, не задача; из 124 родня только ось (в). **Срочности нет:** под контрактом D39.150 («направление ошибки, не точность») ни один исход не занижает молча — недостача несётся историческими деньгами С РАСКРЫТИЕМ, пойманный откат называется вслух. Остаточные нарушения контракта чинятся БЕЗ схемы: 197 и 194 | бэкенд | когда-нибудь (гейт — триггеры пака 124: дописывание глав 185 · МАСШТАБ · первый внешний потребитель числа) | ось дизайн-пака 124 | **D39.151**, внешний разбор 17.08 | | 196 | **Остаточный класс строки 176: неперехватываемые `fatal error` Go** (конкурентная запись в map, OOM, стек-оверфлоу) по-прежнему дают exit 2, то есть читаются платформой как «завершено с флагами» — `recover` их не ловит по устройству языка (подтверждено линзой шва исполнением). Строка 176 закрыта для ПАНИК, не для fatal. Лечение — вне exit-контракта: сторож процесса у платформы либо маркер живости в артефакте прогона | бэкенд/платформа | когда-нибудь | отдельное решение | приёмка №18, линза шва | | 197 | **Фикс-лист приёмки пака честности ФЧ-1…ФЧ-8** — восемь пунктов класса «заявленное не прибито» и «текст обещает больше числа», ни один не блокировал лендинг. **Тело списка дословно, с весами и с секцией «что НЕ проверено», — [archive/PROGRESS-2026-08-17.md](archive/PROGRESS-2026-08-17.md), запись приёмки №18** (D39.149). Здесь держим только ратифицированное: **ФЧ-5 РЕШЁН владельцем 17.08 (D39.150): прайсить по модели, которую стадия резолвит СЕЙЧАС, + округление вверх и оговорка в тексте согласия.** Носителя-сессии НЕТ — по слову владельца 17.08 пока только записано | бэкенд | скоро (следующее касание денежного пути; ФЧ-5 обязателен до первого пере-прогона со сменой модели) ⚠ **СОСТАВ ПЕРЕ-СКОУПЛЕН 04.09:** ФЧ-1/ФЧ-4/ФЧ-5 закрыты паком «число согласия» (D39.187); **ФЧ-6 по коду выглядит ЗАКРЫТЫМ** — отказ проекции репортится базисом, отчёт не валится (`backend/internal/pipeline/status.go`, греп `RebillBasisFailed`); **ФЧ-7 отдан проверкой** в вайр-батч (воспроизвести панику поверх пойманного потолка, чинить только если воспроизводится); **ФЧ-2/ФЧ-3/ФЧ-8 НЕ ПРОВЕРЕНЫ никем** и остаются живым остатком строки. | дофикс-промт ЛИБО попутно ближайшим паком | **D39.149**, **D39.150** | | 198 | **Апгрейд движка стирает замечания и счётчики книги БЕЗВОЗВРАТНО — композиция двух половин, каждая известна по отдельности** (приёмка P7, линза «вне карты», обе половины пере-прочитаны оркестратором). Платформа при смене `manifest_key` сносит ВСЕ `unit_resolutions` книги (`platform/internal/pgstore/readmodel.go:164-165`), рассчитывая, что поток их пере-наполнит; движок анонсирует юнит РОВНО ОДИН РАЗ за жизнь книги — ключ `unit::::` БЕЗ метки нарезки (`backend/internal/pipeline/events.go:399-400`), а леджер анонсов переживает прогоны (`backend/internal/store/outbox.go:96` «already announced… by one that ran before it») ⇒ совпавшие координаты не переанонсируются НИКОГДА. Обостряется порядком: долг на материализацию ставится только на ГРАНИЦАХ работы, поэтому первая зачистка после апгрейда случается в КОНЦЕ первого пост-апгрейдного прогона и сносит замечания ТОГО ЖЕ прогона, за который заплачено. Следствия на проводе: «0 из N» на переведённой книге навсегда · шкала снова предлагает купить переведённое · замечания читателя исчезают. **Лечится с обеих сторон:** движковая половина — метка нарезки в ключе анонса (решение зоны движка), платформенная — не сносить вслепую либо восстанавливать из экспорта. ⚠ Гейт холодного прогона: смысл упражнения — гонять книгу против МЕНЯЮЩЕГОСЯ движка, то есть первый же апгрейд обнулит библиотеку | бэкенд + платформа | **скоро (до первого реального пользователя И до холодного прогона с апгрейдами)** | связка: решение по ключу анонса в движке → правка платформы | приёмка P7 (D39.153) | | 201 | **Движковое «Глава N» доезжает читателю ВНУТРИ текста, обходя дисциплину `heading: null`** (линза шва P7, пере-прочитано оркестратором): `backend/internal/pipeline/export.go:58`=`ApplyHeading` (испр. оркестратором №20 30.08: якорь уезжал с `:230` и с `:266` — код растёт) приклеивает детерминированный порядковый к экспортному тексту первой юнит-главы (`ce.FinalText = chunk.ApplyHeading(...)`), колонка `Source` при этом остаётся heading-stripped. Платформа переносит обе как есть и честно отдаёт `heading: null` — то есть клиент нарисует СВОЙ порядковый на языке своего интерфейса над абзацем, который уже начинается с русского «Глава N», а исходная колонка соответствующего маркера не несёт: пара визуально рассинхронизирована на каждой первой главе. Конкретное следствие открытого К-2 контракта; родня движковой строки **160** (глава без заголовка) | бэкенд | когда-нибудь (с 160) | отдельное решение | приёмка P7 (D39.153) | | 202 | **Живой перевод книги НАСКВОЗЬ через API платформы не гонялся НИ РАЗУ** (obstacle сессии P7, подтверждён приёмкой): всё после «прогон стартовал и остановился» — подпись банка, halt на потолке, резюм после пополнения — покрыто батареей против живого Postgres, но с движком-заглушкой; настоящий манифест, сайдкар банка и причины флагов будут ПЕРВЫМИ данными, форму которых платформа не сочинила сама. Форма проверки (решена): только через API, как ходил бы клиент — интейк → старт → живой движок с ключами провайдера → поток событий → подпись и продолжение → чтение глав/юнитов/замечаний/банка и сверка с тем, что движок реально произвёл; качество перевода НЕ предмет (полигон). ⚠ **Цена ≈$0.05 СНЯТА как протухшая** (D39.179 п.1: пере-пин DeepSeek, множитель ×4.47; испр. 02.09). Замер 31.08 на ровно такой десятиглавой книге: **куплено $0.436110** при собственной проекции движка **`projected_book_usd = 1.1377277707`** и полном оттоке кассы **≈$1.44** (§4 отчёта). ⚠ Это цена НЕПОЛНОГО захода — доставлено 3 юнита из 14; как смету для покупателя брать нельзя. ⚠ Путь ключей платформы — переменная `TM_PLATFORM_ENGINE_KEYS_PATH`, требует АБСОЛЮТНОГО пути (греп по `platform/internal/config/`). **Решение владельца 20.08: ПОСЛЕ холодного прогона движка** — гонять одну неготовую систему против другой смысла нет | платформа | скоро (⚠ прежний гейт «холодный прогон движка» ПАЛ 31.08; живой блокер теперь один — файл ключей платформы `TM_PLATFORM_ENGINE_KEYS_PATH`, лечение операционное и $0) | короткая сессия по промту оркестратора | слово владельца 20.08, D39.153 | | 203 | **Хвосты контракта после синка 0.4.0 — ОТКРЫТ ОДИН ПУНКТ, остальное исполнено** (тела релеев — `platform/docs/archive/P7_ACCEPTANCE_HANDOFF_2026-08-17.md` §7; сюда переписан НЕ текст, а статус — один носитель на факт). **ИСПОЛНЕНЫ и сверены грепом при лендинге:** (а) минором 0.5.0 (D39.161) · (б) · (д) · (и) поле `stop_requested` (D39.152) · (л)(м)(н)(о) контрактной сессией — остаток по фразам Приложения А несёт строка **204** и лист владельца. **(г) наполовину** — `unspecified` ратифицирован в каноне (`docs/architecture/14-api-contract/openapi.yaml:1903`=`is reserved and is the server`), открыта только ГРАНИЦА ступеней замечаний (две ступени при девяти рангах движка); ⚠ её прежний носитель — строка 148 — СНЯТ 21.08 по слову владельца. **(з) СНЯТ как ратификация 22.08 сквозной трассировкой (разбор, на который ссылается строка 191):** конфликта моделей НЕТ — гейт движка проверяет полноту не ПОДПИСЕЙ, а ФАЙЛА решений, и ОДИН файл со всем банком его снимает (`loadMinedDelta` штампует только `Source`, `mining.go:855-867` → опущенный статус дефолтится в `approved`, `membank/memseed.go:96`=`status = "approved"` → `unsignedEngineSurfaces` выбрасывает лишь `Source=="mined" && Status!="approved"`, `mining.go:710-719`). Пере-диспозиция 27.08 (D39.158 п.7): движковый гейт полноты УСТРАНЁН, не обойдён; остаётся снять обход в платформе — одна боевая строка (`platform/internal/runs/spawn.go`, `--verify-bank` не передаётся на resume) плюс семь строк ставшего ложным обоснования, работа платформенного пака. **ОТКРЫТО РЕАЛЬНО — (к):** ключ `project_db` в `book.yaml`, договорить, кто им владеет: шаблон оператора его не содержит, движок делает необязательным. ⚠ Следствие «на штатном деплое банк не читается» ОПРОВЕРГНУТО живым кодом: путь публикует ДВИЖОК конвертом артефактов, пустой путь — ГРОМКИЙ отказ (`platform/internal/runner/artifacts.go:39`=`the engine published no bank read-out path`); остаток (к) чисто договорной| контракт/доки | скоро (следующее касание контракта) | контрактная сессия | приёмка P7 (D39.153) | | 204 | **Движок не публикует причины флагов ДАННЫМИ — карта причин у платформы рукописная и расходится молча** (релей §7(в) хендоффа P7; зона платформы в чужой бэклог не пишет и просила строку сюда — `platform/docs/archive/platform-PROGRESS-P7.md:206`). Сегодня `platform/internal/ingest/notes.go` держит рукописную копию закрытого словаря ЧУЖОЙ зоны: 15 причин движка → коды замечаний контракта, сверено побайтно на 20.08 и верно СЕЙЧАС. Импортировать движок платформе нельзя (D39.85 — разные модули), поэтому расхождение появится молча в тот день, когда движок добавит причину: платформа отдаст `unspecified` и напишет ERROR в лог, то есть деградация честная, но карта протухнет незаметно. ⚠ **Правила заполнения контрактных фраз по этим причинам УЖЕ НАПИСАНЫ** и выводить их заново не надо — компаньон `14-api-contract/README.md`, греп `по ДОККОММЕНТУ` (фраза пишется по доккомменту `disposition.go`, а не по имени константы; класс 2 схлопывается в ОДИН код). Лечение: движок публикует свой словарь причин артефактом-данными (тем же классом, что манифест и сайдкары банка), платформа читает его вместо копии. ⚠ Класс: носителем был ТОЛЬКО регистр платформы (PD-246) — обязательство к ЧУЖОЙ зоне жило внутри зоны автора | бэкенд | когда-нибудь (со следующим касанием эмиссии флагов) | отдельное решение | приёмка P7 (D39.153), релей §7(в) | | 205 | **Гейт якорей ИСПОЛНЕН 21.08** — `docs/scripts/counts.py --lint`, область `docs/` + `platform/docs` + `frontend/docs`, сверка по СОДЕРЖИМОМУ, двусторонняя дельта. ⚠ Быстрый выход по «коммит не трогает docs/» из хука убран НАМЕРЕННО: цели якорей — в основном КОД, и главный двигатель протухания приезжал ровно тем коммитом, на котором хук молчал. Форма якоря: ОПТ-ИН токен ожидания `` `путь:12-14`=`подстрока` ``, сверка ПРОБЕЛЬНО-нормализованная. ⚠ **Слепота печатается САМИМ гейтом каждый прогон — читать оттуда, копии здесь нет.** Одна её грань в вывод не попала: в ручном прогоне «дельта» = всё незакоммиченное кем угодно, поэтому ТРЕБОВАНИЕ токена живёт только под `--from-index` (ПРОВЕРКА уже написанных токенов дельтой не ограничивается вовсе — токен был истинным при записи, значит упавший есть гниль по построению). **ОСТАТОК:** миграция корпуса на токен-форму органическая — токен требуется на ЗАТРОНУТЫХ строках, счёт растёт сам с каждым касанием. ⚠ Числа здесь НЕ держим (прежняя редакция держала «4 из ~580» и протухла за сутки): текущий счёт токенов, якорей и доков гейт печатает КАЖДЫЙ прогон| оркестратор/доки | сделано 21.08, миграция органическая | исполнено; остаток гасится касаниями | аудит работы №18 + разбор с внешним ревьюером, 21.08 | | 207 | **Пол самосогласованности манифеста стоит только у материализатора, интейк тот же документ ПРИНИМАЕТ — и по такой книге можно ОПЛАТИТЬ прогон** (`PD-367`, вторая волна ревью P8-FIX). Манифест `{ChaptersTotal: 120, UnitsTotal: 400}` с пустым списком глав `Whole()` отвергает, а `books.Parse` заводит книгу `not_started` с `chapter_count=120` и пустым деревом; потолок считается ОТ `chapter_count`. **Очевидное лекарство опровергнуто исполнением самой зоной:** применить `Whole()` на интейке нельзя — вся батарея интейка ездит на манифестах без списка глав, контракт интейка это только счётчики. Значит решение не зонное: либо контракт интейка меняется, либо пол ставится в другом месте цепи | оркестратор → платформа | скоро | нужно решение (лекарство ломает запиненный контракт интейка) | D39.154 п.10, `PD-367` | | 209 | **Риг живых проб не может залогировать тела запросов ни при каких env** (находка бэкенд-пака честности 17.08, оставшаяся без носителя до аудита доков 22.08): `LOG_LLM_BODIES=1`+`LOG_LEVEL=debug` объявлены носителем тел, но ключ читается из `obs.ReqInfo` контекста, а `live_reprobe_test.go` строит ctx БЕЗ `WithReqInfo` — гейт `obs/logging.go` не пропускает. Обход, которым пользовались: ручной дамп сообщений в файл. Цена — каждая живая проба, которой нужно прочитать провод глазами, платит за обход заново | бэкенд | когда-нибудь (следующее касание рига живых проб) | малое касание (`WithReqInfo` в риге) + пин | пак честности 17.08, вынесено аудитом доков 22.08 | | 210 | **Род НЕ ПРОИЗВОДИТСЯ авто-путём вовсе — механизм доставки построен, а данных для него нет** (найдено трассировкой цепи банка 22.08, сверено кодом оркестратором; полигон вскрыл то же независимо: «в банке НЕТ ПОЛЕЙ ПОЛА»). Доставка рода на провод ПОСТРОЕНА и работает: `membank/memory.go` кладёт `genderConstraintNote` в черновую инъекцию — но ТОЛЬКО для строк со статусом `Confirmed`, по прямой директиве владельца D39.21 «род должен доезжать». Данных ей никто не даёт: промпт терминолога возвращает РОВНО ТРИ поля (`backend/prompts/zh-ru/terminologist.md`: термин · перевод · уверенность 0–100) — поля рода в ответе НЕТ; майнер берёт `gender` исключительно из СИДА (`internal/miner/miner_emit.go` `seedMeta`, `meta.gender = e.Gender`), эмитируемые кандидаты его не несут. ⇒ **на любой книге без ручного сида ось рода мертва по построению**, и «плывущий род» — это не дефект рендера, а отсутствие входных данных. Прямо бьёт по цели №1: реестр памяти C3 называет русский глагол прош. вр. при скрытом роде «механическим спойлер-каналом» и «жалобой №1 читателей MTL» (строка 82). **Развилка, которую надо назвать до стройки:** добавлять ли поле рода в ответ терминолога (двигает провод ⇒ ТОЛЬКО в вайр-батч 182) ЛИБО выводить род отдельным дешёвым проходом, ЛИБО признать род сид-только свойством и гейтить им качество явно. Родня 82 (морфо-гейт рода) и 178 (калибровка `sense`). ⚠ Замка ДВА и они независимы — род рендерится только при `Disp == Confirmed` (`membank/memory.go:705-713,823-827`=`Mirrors the editor block's confirmed-only gender`), а `mining.go:676` запрещает авто-банку статус `approved`. Род НЕ единственное осиротевшее поле: `Sense`/`Speech`/`Decl` тоже приходят только из сида, авто-продюсер есть лишь у `Dst` (терминолог) и `Type` (классификатор). ⚠ Поле `Gender` в схеме сида УЖЕ ЕСТЬ (`internal/seed/seed.go:71`=`Gender string`) — ось мертва в ПИСАТЕЛЯХ, не в формате. ⚠ **И тесты слепы ПО ПОСТРОЕНИЮ** (пере-проверено 23.08): все gender-кейсы конструируют род РУКАМИ, то есть зелёная батарея не отличает «производитель работает» от «производителя нет»; гейта на дрейф рода в движке нет | бэкенд (+полигон на замер) | **скоро (цель №1; правка провода — вайр-батчем 182)** ⚠ **ЗАМОК №0, найденный бэкенд-сессией 04.09 и НЕ снимаемый: произведённый род не доезжает до ТРАНСЛЯТОРНОГО провода вообще — там нет самой строки.** Черновая волна выбирает по `baseMemory`, из которого строки `Source:"mined"` вычеркнуты по построению (`backend/internal/pipeline/bankmaterialize.go`, греп `Source:mined excluded`), а авто-банк и подписанная дельта пишутся именно как `mined` (`mining.go`, греп `base-excluded`). ⛔ Это не дефект, а денежный контракт `D39.42` п.3: инъекция черновой волны обязана быть байт-стабильной поперёк обогащения банка, иначе пере-снапшот платит ДВЕ волны вместо одной. ⇒ **честная граница построенного: род производится и доезжает до РЕДАКТОРСКОГО провода, на черновой не едет и не поедет, пока цена двух волн не решена отдельно.** Замер этого состояния прибит тестом `backend/internal/pipeline/gender_wire_test.go` — он покраснеет, если следующий пак откроет любую дверь, и заставит автора назвать какую. | развилка → решение → правка промпта/прохода + замер на прогоне с редактурой | трассировка цепи банка 22.08, D39.21, C3 реестра памяти | | 213 | **ОСТАТОК — одна строка в ДЕВ-пути: супервизор зашивает `"book.yaml"` мимо константы `ConfigFile`** (`platform/internal/ingest/supervisor.go:142`=`"status", "--config"`). ⚠ **ГЛАВНАЯ половина ЗАКРЫТА лендингом P9 (D39.162):** путь банк-экспорта берётся из конверта артефактов движка (`platform/internal/runner/artifacts.go:28-35`; пустой путь — ГРОМКИЙ отказ), нестрогий парс `book.yaml` и собственный `projectDB()` снесены. Осталась ровно та тривиальность, которую строка называла рядом с дефектом. ⚠ Пере-именование банк-экспорта в фикс-имя рядом с `events.jsonl` — ЛОМАЮЩЕЕ, его место в окне строки **161**, НЕ здесь | платформа | когда-нибудь (одна строка, следующим касанием зоны) | правка дев-супервизора | консилиум шва 22.08; главная половина — D39.162 | | 214 | **Подпись банка не оставляет на банке НИ ОДНОГО следа.** Единственная долговечная запись акта подписи — булев `bank_released` на прогоне (`platform/internal/pgstore/runs.go`, греп `bank_released` (номер строки двигает живая сессия зоны)): кто и когда подписал, что именно вошло в подписанный набор — не хранится нигде. Следствие: пост-фактум ответить «почему в книге этот перевод термина» нельзя, а при пере-нарезке или пере-прогоне восстановить намерение человека не из чего. ⚠ **ЧАСТИЧНЫЙ ответ появился с дверью правок (D39.162):** её документы решений — долговечная запись того, ЧТО владелец решил, и они переживают прогон. Не отвечено по-прежнему: КТО и КОГДА подписал, и что именно вошло в подписанный набор. Всплыло трассировкой цепи банка 22.08, подтверждено пере-проверкой | платформа + бэкенд | когда-нибудь (с трубой доставки правок, D39.156) | отдельное решение о провенансе подписи | трассировка цепи банка 22.08, пере-проверено №19 | | 216 | **Подпись банка, halt на потолке и резюм после пополнения не проверялись против ЖИВОГО движка ни разу.** Проверки этих путей в батарее платформы стоят на фейках; единственный живой прогон движка в батарее — не по этим маршрутам. То есть три несущих сценария продукта держатся на договорённости о поведении чужой стороны, а не на замере. ⚠ Гейтится тем же, чем и живой прогон книги (строка 202): холодный прогон движка | платформа | когда-нибудь (с 202) | живой прогон по трём маршрутам | трассировка цепи банка 22.08, пере-проверено №19 | | 227 | **`signature` в квитанции двери правок считается от карты, которую переписывает ЛЮБАЯ граница майнинга** (находка воркфлоу-ревью P9, 28.08): запись карты стоит ВЫШЕ решения о стопе (`backend/internal/pipeline/mining.go:191`=`writeFileAtomic(r.signatureMapPath()`), поэтому `signature != null` НЕ означает состоявшегося стопа подписи; `surfaces`/`undecided` дрейфуют между двумя вызовами владельца, а `undecided: 0` достижим при НЕпредъявленных решениях (кап top-200 вытесняет). ⚠ Починка аддитивна и носитель для неё уже есть: карта несёт СВОЙ идентификатор (`backend/internal/membank/decisions.go:955`=`id, err := seed.SignatureMapID(content)`), а шов его не читает — отдать идентификатор в квитанцию и судить по нему. Цена сегодня мала (поле информационное, гейтом не служит) и растёт вместе с экраном подписи: именно он будет решать «что я подписываю» по этому числу | бэкенд | когда-нибудь (гейт: заказ экрана подписи) | аддитивная правка квитанции | воркфлоу-ревью P9, D39.162 | | 228 | **Отклонённая поверхность возвращается АЛИАСОМ уцелевшей строки — движок не держит того, что канон уже обещает** (находка воркфлоу-ревью P9 в форме Д1, УЗКО пере-сформулирована бэкенд-сессией 28.08 и принята приёмкой): канон говорит дословно «declining a surface removes EVERY window of that surface» (`docs/architecture/14-api-contract/openapi.yaml:2079`=`declining a surface removes EVERY window`; адрес пере-нацелен 02.09 — минор 0.9.0 сдвинул прежний 2051), а эмиссия майнера энтити-широка (`backend/internal/pipeline/miner_emit.go`, `clusterTouches`), тогда как фильтр авто-банка ключуется только по собственному `src` строки (`backend/internal/pipeline/mining.go:662`). ⚠ **Правильная форма — снять АЛИАС со строки, а не снести строку:** расширение `decline` до энтити противоречило бы ратифицированному контракту, и именно поэтому бэкенд-сессия применила право §9 и НЕ чинила это попутно. Предмет — банковая онтология (`18-bank-ontology.md`), не тихая порча | бэкенд | скоро (гейт: заказ по читающей стороне банка) | отдельный заказ узкой формы | воркфлоу-ревью P9; форма — бэкенд-сессия 28.08, D39.164 | | 229 | **Снапшот не фолдит модель ВНУТРЕННИХ гейтов — флип провода под неизменным `request_hash`** (самонаходка бэкенд-сессии 28.08, подтверждена приёмкой): снапшот фолдит `Capability` СТАДИЙНЫХ моделей и их эскалации (`backend/internal/pipeline/snapshot.go:316-340`), но модель `gates.terminology.model` / `gates.repair.model` (`backend/internal/config/internal_call.go:72`) не фолдится сознательно — а терминолог шлёт ДВА системных сообщения, так что смена оси `capabilities.system_messages` у провайдера, которым пользуется только гейт, меняет байты запроса при неизменном хеше: тихий false-hit класса D5.2. ⚠ **Сегодня ЛАТЕНТНА и денег не стоит — проверено приёмкой: гейта `terminology` нет НИ В ОДНОМ конфиге репозитория** (`grep -c terminology configs/pipeline-c1.yaml` = 0). Триггер починки — день, когда гейт включат с провайдером, объявляющим НЕдефолтную возможность. ⚠ Цена лечения — денежная: фолд гейт-моделей сдвигает хеши и обесценивает чекпойнты; дешёвая форма — фолдить ТОЛЬКО недефолтное (приём `omitempty`, прецедент `MinMaxTokens`), тогда сегодняшние снапшоты остаются байт-равными | бэкенд | когда-нибудь (гейт: включение внутреннего гейта либо следующее касание снапшот-контракта) | правка снапшот-контракта | самонаходка бэкенд-сессии, D39.164 | | 230 | **Инертный `decline` подписанного сид-терма отвечает `already_applied` вместо единственной работающей инструкции** (названный размен пака «тихая порча», D39.164): сузив отказ по поверхности ради СХОДИМОСТИ повтора, движок потерял поучение в одном углу — когда отказ и записан, и по-прежнему инертен против `glossary_seed`, пользователь получает «уже применено» вместо «убери терм из сида». Сходимость сочтена более тяжёлой обязанностью (на ней стоит вся раскладка класса 15 и синхронная дверь платформы), но размен РЕАЛЕН. **Форма закрытия — поле отчёта со стоячим фактом**, то есть аддитивная правка формы шва: платформенный `BankReport` — аллоулист, лишнее поле на провод не уедет само | бэкенд + контракт | скоро (с ближайшим касанием отчёта двери) | аддитивное поле отчёта | размен пака «тихая порча», D39.164 | | 232 | **Ось «свежий/пере-делка» выведена из ПОЛНОТЫ СТРОК, а не из факта отгрузки** (D39.170, находки охотника 3 и 4). Следствия ДЕНЕЖНЫЕ на слух покупателя: добавление стадии в пайплайн превращает ДОЧИТАННУЮ книгу в «3 unit(s) NEVER delivered» и приглашает купить её снова; юнит, прерванный между волнами (signature stop, денежный потолок, Ctrl-C), второй раз считается свежим и тратит слот гранта повторно — замерено 4 купленных юнита → 2 главы. Носитель у движка УЖЕ есть: реестр анонсов `events_outbox.once_key` (`backend/internal/pipeline/events.go:396`=`unitOnceKey is the identity of one announcement`), ключ `unit:<книга>:<волна>:<глава>:<юнит>`, монотонный на всю жизнь книги и переживающий и добавление стадии, и обрыв между волнами. ⚠ **ПЕРВАЯ ПОЛОВИНА ИСПОЛНЕНА 31.08** (`bb541a8`, экземпляр A11; испр. 02.09): читающий метод `store.AnnouncedOnceKeys()` построен, его докстринг называет эту строку по номеру, предикат — `delivered[key] && unitShipped(rows)`. **ЖИВОЙ ОСТАТОК — ВТОРАЯ ПОЛОВИНА:** юнит, прерванный МЕЖДУ ВОЛНАМИ, повторно тратит слот гранта (разбор — `backend/docs/MONEY_HONESTY_REPORT.md` §4.5). ⚠ РАЗВИЛКА, которую надо назвать в промте: ключ несёт ВОЛНУ, значит «юнит отгружен» — факт per-wave. **Ответ есть и он не новый механизм:** отгрузкой считается волна, владеющая ОТГРУЖАЮЩЕЙ (последней) стадией — `backend/internal/pipeline/snapshot.go:243`=`finalStageWave is the wave that owns the SHIPPING (last) stage`; на редакторском конвейере это edit, на черновом-только — draft. Проверять надо ИМ, иначе черновой-только конвейер получит ось, которая никогда ничего не считает отгруженным (предложено движковой сессией при сдаче, сверено мной по коду) | бэкенд | скоро | Читающий метод стора + перевод оси на факт отгрузки; отдельный пак | приёмка D39.170 | | 233 | **Трата терминолога вне объёмного потолка масштабируется КНИГОЙ, а не грантом** (D39.170). Замер: три последовательные покупки по одному юниту на четырёхглавной книге дали три полнокнижных консолидации по $0.005460 каждая — покупка одного юнита обходится в ~1.5× стоимости самого юнита. Книга на 500 юнитов, проданная по одному, оплатит 500 полнокнижных проходов. Место траты — в ЦЕНЕ, а не в потолке (решение подтверждено), но при мелкой нарезке продажи она перестаёт быть накладной и становится основной статьёй: это ВХОД В КАЛИБРОВКУ ЦЕНЫ, а не сноска | бэкенд | скоро | Учесть в модели цены при следующей калибровке; либо чекпойнт консолидации, переживающий покупку | приёмка D39.170 | | 234 | **Основание платформы «не брать `rebill_*` через шов» СНЯТО лендингом D39.170 — комментарий чужой зоны несёт мёртвый довод.** Довод объяснял отказ ТАЙМИНГОМ («status проецирует СОХРАНЁННУЮ память, сразу после `bank-apply` честно читает ноль»); движковый пак это починил — `foldMemoryForRead` стал ПЕРВЫМ ответом читающего пути, `projectStoredMemory` понижена до фолбэка (`backend/internal/pipeline/status.go:901`=`IT IS NO LONGER THE READ PATH'S FIRST ANSWER`). ⚠ Первый носитель (`platform/internal/ingest/resync.go`) уже пере-написан 30.08 и сам объявляет посылку снятой — строка регистра `PD-427`. **ЖИВОЙ ОСТАТОК:** та же снятая посылка стоит ВТОРЫМ носителем в `platform/internal/runs/bank.go` (греп `STORED memory`) — пинг зоне, не своя правка. ⚠ Проводка полей при этом НЕ разблокирована: она гейчена вместе с `--max-units`. | платформа | скоро | Пинг зоне платформы + строка её регистра; проводка — после снятия гейта `--max-units` | приёмка D39.170 | | 237 | **Два загейченных триггера НАЖАТЫ и не отработаны** (реестр `13-tech-debt-anchors.md` §Б-108, сверено 30.08). **(а) `go.work`:** условие «появление Go-кода платформы» выполнено давно — `platform/go.mod` есть, `ls go.work` в корне даёт «No such file or directory». Ратифицировано D39.85 §8 п.4 (`docs/research/23-engine-platform-seam.md:66` = `go.work — коммитить, когда у платформы появится Go-код`); цена — один файл, по тому же §6 он решает только dev-удобство и не меняет ни видимости, ни версий. **(б) вендор-сверка маппинга эффорта `deepseek-v4-pro`:** вахта D39.92 сработала 13.08 changelog'ом вендора, а носители до сих пор ПРОТИВОРЕЧАТ (квирк-канон и `STACK.md` говорят «ручки у pro НЕТ»), и по гардрейлу владельца это закрывается ТОЛЬКО вендор-докой, а не выбором стороны. Держит жильца Д5 и калибровку цены редакторского арма. ⚠ **Класс важнее двух пунктов: спроектированный механизм без носителя события тихо становится долгом, и никто не проверяет, не нажат ли спусковой крючок.** | оркестратор | скоро | (а) один файл в корень; (б) заказ полигону на вендор-сверку | аудит очереди 30.08 | | 241 | **Канон противоречит сам себе на ДОЧИТАННОЙ книге, и принятая правка банка умирает молча** (названо телом D39.165 §3 28.08, носителя не получило; заведено оркестратором №20 30.08 по находке сессии P12). Две фразы: правка банка «takes effect on the NEXT run» (`docs/architecture/14-api-contract/openapi.yaml:504`=`takes effect on the NEXT run`) против «finished work is not bought twice» + подъём потолка только у ПРИОСТАНОВЛЕННОЙ книги (`:590`=`finished work is not bought twice`). У дочитанной книги следующего прогона купить нечем: пользователь правит банк, получает квитанцию об успехе — и правка не доезжает ни до одной строки никогда. ⚠ Смежное лечение уже существует и не связано с этой дырой: пере-проход ПОКУПАЕТСЯ членом `RunRequest.re_pass` (канон 0.7.0, D39.166) — то есть механизм есть, а фраза канона его не признаёт для дочитанной книги. Решать формой: либо канон признаёт пере-проход входом для дочитанной книги, либо дверь правок отказывает такой книге ЧЕСТНО вместо ложной квитанции | контракт (+платформа) | скоро (следующее касание контракта) | контрактный минор + пин на дочитанной книге | D39.165 §3, эррата 30.08-б, находка сессии P12 | | 242 | **Реестр D-нот: колонки «статус» и «тело» разъехались на 74 строках из 224** (замер аудита доков 30.08). У свежих нот в «статусе» стоит заметка «ЖИВОЕ: …», а слово `жив` уехало в «тело»; шапка таблицы описывает другой порядок. Гейт `counts.py --check` этот класс НЕ ловит по устройству (сверяет полноту номеров, не форму ячеек). Лечение — не ручная перекладка (дороже пользы и легко внести новую ложь), а машинное: правило формы в `counts.py` + разовый прогон приведения. Пока не сделано — в легенде реестра стоит правило чтения (испр. 30.08) | оркестратор | когда-нибудь | правило в `counts.py` + разовое приведение | аудит доков 30.08 | | 243 | **Остаток аудита доков 30–31.08: 19 удержанных находок НЕ применены** (аудит — 5 линз + верификатор на каждую, 57 находок, 55 удержаны, 36 применены сменой №20). Перечень: ~~**arch-3**~~ **ЗАКРЫТ 31.08 — разбор телом D39.179 п.5** (был вдвое больше заявленного: 51 указатель вместо 13, и дороже адресов оказались ЛОЖНЫЕ КЛЕЙМЫ) · **arch-5** (правило языка знает две корзины, `reader.txt` — третья) · **arch-7** (§2 закона шва: дисциплина флока не описывает новый глагол-писатель) · **arch-9** (реестр загейченных триггеров не знает нажатых 30.08) · ~~**arch-10**~~ и ~~**arch-11**~~ **ЗАКРЫТЫ 02.09** (числа словаря событий сняты в пользу кода; отвергнутый ключ назван отвергнутым) · **arch-12** (шапка `09-target` сама зовёт себя неполной — строку под таблицей слоёв надо внести; ⚠ ЖИВ на 02.09: греп `D39.181` по `docs/architecture/09-target-architecture.md` — 0 хитов, греп `D39.182` — 0 хитов, то есть лендинги 31.08 в док слоёв не внесены) · **contract-8** (эррата 15.08-в в шапке D-лога указывает на промт, уехавший в архив) · **contract-10** (`Export.failure_code` «becomes an enum with the first built format» — формат построен, условие наступило) · **progress-6/7/8/10/11/12/13/14/15** (мелочь CURRENT-STATE и строк бэклога: протухшие «запушена»/«строка 200»/якорь `miner_emit.go`/дубль 238 внутри 160 и пр.). ⚠ Отчёт аудита жил в песочнице сессии №20 и умирает с ней — здесь ЕДИНСТВЕННЫЙ носитель списка; воспроизведение = повторный аудит (5 агентов, ~2 часа) | оркестратор | скоро | пройти списком | аудит доков 30–31.08, сдача смены №20 | | 244 | **Гейт якорей на пре-коммите ломается всякий раз, когда зона правит КОД и СВОЙ реестр одним незакоммиченным деревом** — и врёт в обе стороны. Механика: хук судит ЗАКОММИЧЕННЫЙ док против РАБОЧЕГО кода, поэтому пере-нацеленные, но не залёнджённые якоря читаются как битые. Замерено на приёмке P12 31.08: у оркестратора хук напечатал 13 битых якорей `platform/docs/DEFECT_REGISTER.md`, у зоны `counts.py --lint` на том же дереве дал **0**; права зона — в HEAD `internal/runs/runs.go:323`, в рабочем `:347`, и токен по новому адресу на месте. ⚠ Обратная сторона опаснее и не замерена: якорь, ставший битым ПО-НАСТОЯЩЕМУ, тем же механизмом может оказаться зелёным. Свойство общее, не про этот пак | оркестратор | когда-нибудь | либо судить обе стороны из одного состояния (`--from-index` уже есть — проверить, покрывает ли он случай), либо печатать, что сравниваются РАЗНЫЕ состояния | приёмка P12 оркестратором №21, 31.08, разрешено командой | | 245 | **Pathspec-форма коммита молча роняет UNTRACKED-файлы, и сломанный коммит выглядит нормальным до первого чужого прогона.** `git commit -- <пути>` обходит ИНДЕКС и берёт рабочее дерево только для ОТСЛЕЖИВАЕМЫХ путей: предварительный `git add` нового файла она игнорирует. Поймано на лендинге P12 31.08 — коммит `e1cb692` унёс `migrations.sha256`, уже ссылавшийся на три миграции, а сами миграции 00029/00030/00031 и три теста остались снаружи; починено амендом секундного неопубликованного коммита при пустом индексе (`0a680a3`). ⚠ Канон git-координации в `CLAUDE.md` объясняет про pathspec ТОЛЬКО то, что она не трогает чужой индекс — то есть учит половине правды и ровно этим создаёт ловушку. Норма, которую предлагаю вписать: новые файлы стейджить явно и проверять состав `git show --name-only`, а не доверять форме. ⚠ **ПОЛОВИНА ПОСТРОЕНА 31.08** (`94381bb`, испр. 02.09): в `docs/scripts/githooks/pre-commit` стоит warn-блок, который перед каждым коммитом печатает неотслеживаемые файлы в каталогах коммита. Живой остаток — блок ПРЕДУПРЕЖДАЕТ, но не блокирует, и на свежем клоне хук вообще не установлен (строка 220) | оркестратор | скоро (решение владельца — его канон) | одна строка в `CLAUDE.md` §«Git-координация мультисессий»; вписывает владелец или оркестратор по его слову | лендинг P12 оркестратором №21, 31.08 | | 246 | ⚠ **ДВЕ КОПИИ ПОЛОСЫ ОТКАЗОВ 10–19 ОБЕЩАЮТ РАЗНОЕ — потребитель держит гарантию, которую производитель ОТОЗВАЛ.** Движок (`backend/cmd/tmctl/main.go:53`=`Nothing was written` is NOT the band's promise any more): «„Nothing was written“ is NOT the band's promise any more … **exit 15 legitimately answers with files on disk**». Платформа (`platform/internal/ingest/exit.go:38`=`nothing this process would have written was written`): «… and nothing this process would have written was written». ⚠ Опасность не теоретическая: по `PD-196` интейк действует по полосе РАЗРУШИТЕЛЬНО (отклоняет книгу и удаляет загрузку), а `exit 15` теперь легитимно оставляет файлы на диске. Хвост: движковый `exitBookIncomplete = 16` у платформы константы НЕ имеет вовсе (её словарь 10·11·12·13·14·15·19). ⚠ **Денежная половина ЦЕЛА в обеих копиях** (`nothing was spent` — по одному хиту в каждой), поэтому запрет отказывать классом полосы там, где деньги уже потрачены, в силе. Предсказано п.6 закона шва 17 ⚠ **ЗАКРЫТА 04.09 райдером платформенного пака «закрыть цикл».** Копия потребителя приведена к производителю: фраза «nothing this process would have written was written» СНЯТА, на её месте абзац, который отзыв называет прямо и цитирует движковую формулировку; `ExitBookIncomplete = 16` внесён в полосу, число подтверждено ЖИВЫМ движком. Денежная половина («nothing was spent») цела в обеих копиях — об этом в новом абзаце сказано отдельно. ⚠ **Якорь этой строки на `exit.go:38` МЁРТВ ОТ ЛЕЧЕНИЯ, а не от порчи:** фразы больше нет ни на одной строке, и пере-указывать его значило бы воскрешать дефект в доке. Якорь уходит вместе со строкой (разбор платформенной сессии 04.09, принят оркестратором). ⚠ Вес «СРОЧНО» был ПЕРЕОЦЕНЕН и это записано отдельно: интейк удаляет загрузку только на классе 11, а exit 15 производит один глагол — `bank-apply` | платформа (правка) + оркестратор (маршрут) | СРОЧНО ⚠ **ВЕС ПЕРЕ-СНЯТ 04.09 (сверка контролёра, пере-проверено): «разрушительно по полосе» ПЕРЕОЦЕНЕНО.** Интейк удаляет загрузку ТОЛЬКО на классе 11 (`platform/internal/books/parse.go`, греп `only source_unreadable removes it`), а exit 15 производит один глагол — `bank-apply`. Живой остаток — комментарий `platform/internal/ingest/exit.go` плюс константа `ExitBookIncomplete = 16`, которую дверь выдачи и так добавит; идёт РАЙДЕРОМ платформенного пака, а не срочным пунктом. ⚠ **ЛЕЧЕНИЕ В ДЕРЕВЕ 04.09, строка закрывается АКТОМ ЛЕНДИНГА платформенного пака** — до него держится как открытая, чтобы закрытие имело коммит. | зона платформы приводит свою копию к движковой ЛИБО обе стороны идут в ратификацию, если расхождение намеренное | пак «деньги и честность», находка A15 вне заказа, 31.08; пере-проверено оркестратором дословно обеими копиями; ЛЕЧЕНИЕ — райдер пака «закрыть цикл» 04.09 | | 247 | **§2.2 закона раскрытия опровергает себя следующей же строкой — эррата зонного дока.** Формальная фраза требует «держит ОБА операнда сравнения и обязано их НАПЕЧАТАТЬ», а её собственный пример тут же говорит обратное: честная форма — НАЗВАТЬ ОСЬ («снапшот разошёлся» честно, «конфиг/промпты изменились» ложно). ⚠ **Ратифицированный текст D39.181 п.1 требования «напечатать» НЕ СОДЕРЖИТ ВОВСЕ** — оно живёт только в `backend/docs/DISCLOSURE_LAW_DESIGN.md`, значит противоречия с ратификацией нет и решает ЗОНА, не владелец. ⚠ Довод «граница прячет имена моделей и хеши» ОПРОВЕРГНУТ исполнением: эти значения уже едут по тому же stderr штатным INFO-логом, включая `memory_version=<12 hex>` — значение того самого поля. Цена бездействия на живых данных = НОЛЬ (единственная сдвинувшаяся ось — хешевая, печать дала бы две несравнимые строки SHA) | бэкенд | когда-нибудь | эррата к §2.2: операнды называются осью, а не значением | приёмка D39.182 + разведка оркестратора 31.08 | | 248 | **Полнота самообъявления о правках чужих тестов ничем не проверяется — и трижды оказалась неполной.** P11 назвала файл, которого не трогала; P12 не назвала тест, у которого переписаны ОБА утверждения; сессия пака «деньги и честность» в первой редакции комментария утверждала неверное о силе собственной правки. ⚠ **Мой метод проверки был слабее, чем я его подал:** греп `^[-+].*t\.(Error|Fatal)` ловит строку СООБЩЕНИЯ, а утверждение — это строка СРАВНЕНИЯ, и она другая (замер: греп локализует утверждение в 1 случае из 475). Предложение разведки: warn-only гейт-детектор при лендинге — список пред-существующих тестов с изменёнными строками утвержденческой формы ВНУТРИ пред-существующих тел; прототип ~25 строк sh прогнан на двух лендингах и указал ровно на `bankfixpack_test.go`. Площадка есть — `docs/scripts/githooks/pre-commit` уже warn-only. ⚠ Ложняки измерены: целиком новый `t.Run` внутри старого `func` даёт срабатывание (1 из 6 на P12) | оркестратор | скоро | гейт-детектор warn-only + пункт чек-листа приёмки | разведка оркестратора 31.08 по вопросу владельца | | 249 | **Девять рядов бэклога потеряли слово веса, и гейт на них НЕ краснеет.** ⚠ **Лечение ПОСТРОЕНО (сверено кодом 02.09): вес судится ПРЕФИКСОМ ячейки** — `docs/scripts/counts.py`, греп `BACKLOG_WEIGHTS` (три слова: «блокер-очереди» · «скоро» · «когда-нибудь»), и «скоро» считается тем же префиксом. Этим убита ВТОРАЯ половина класса: подстрока ловила слово в ПРОЗЕ, и фраза «переведена из «скоро»» ре-добавляла ряд в счёт — число скакнуло **53 → 56** при одной новой строке (замер 02.09, пере-счёт скриптом). ⚠ Гейт рождён ЗЕЛЁНЫМ, а не красным: девять известных рядов внесены «дедовщиной» — греп `WEIGHT_GRANDFATHERED` там же, ряды **5 · 13б · 94 · 96 · 97 · 149 · 205 · 221 · 246**. **ЖИВОЙ ОСТАТОК — сами ячейки:** у 96/97 прочерк ЗАКОНЕН (надгробия строк, уехавших в зонный бэклог, D39.84), остальные семь потеряли вес молча и чинятся оркестратором — каждая починенная выходит из списка дедовщины. ⚠ Два ряда шире класса: **149** («исполнен и заленден 10.08») и **205** («сделано 21.08») объявляют себя ИСПОЛНЕННЫМИ прямо в колонке веса, хотя по правилу таблицы закрытые строки в ней не живут — это либо живой остаток без веса, либо непойманный класс C; **246** несёт самодельное «СРОЧНО», которого в словаре нет. | оркестратор | скоро ($0, гигиена трекера) | правка семи ячеек → выход из `WEIGHT_GRANDFATHERED` | ревизия доков 02.09, приёмка контролёра | | 217 | **Скрипты полигона захардкодили АБСОЛЮТНЫЕ пути двух корней и не работают на этой машине вовсе.** ДВА РАЗНЫХ слома. **Корень репо** — смена пользователя: литерал в 121 файле, из них 104 дословно `REPO = Path("/home/ubuntu/projects/textmachine")`, портабельных форм всего 5. **Корень книг** — оба события порознь: литерал `/home/ubuntu/books` 86 файлов (пользователь), портабельный `Path.home()/"books"` 89 файлов (переезд каталога; на прежних машинах работал). Объединение 173 файла. Пользователь теперь `ubuntu-26`, книги переехали в `<репозиторий>/books` ⇒ ломается и то и другое, включая ЖИВОЙ гейт фазы Д `eval/conformance.py:49`=`REPO = Path("/home/ubuntu/projects/textmachine")`. Живых носителей 26 по корню книг (среди них портабельная форма преобладает 20:6) плюс корневые гейты и сборщики корпусов; остальное — скрипты закрытых эксп-12–16, их владелец велел ВЫБРОСИТЬ, а не чинить (D39.157 п.4а). Форма правки — за зоной; приор оркестратора: один модуль путей, корень резолвится МАРКЕРОМ вверх по дереву (движок так и делает — `backend/internal/miner/miner_parity_test.go:29`=`derived from the repository MARKER`), книги от него, обе ручки перекрываются env | полигон | скоро (блокирует любой прогон зоны) | пак путей полигона | переезд машины 24.08, №19 | | 219 | **Line-якоря в тела D-лога обречены съезжать, и механизм именно в дисциплине эррат.** Эрраты вписываются в КАРТУ ШАПКИ (append-only, D23.3), то есть в начало файла, — значит каждая эррата сдвигает номера строк ВСЕХ тел ниже, и любой якорь вида `05-decisions-log.md:NNN` умирает молча. ⚠ Замерено на себе 27.08: три эрраты за сессию убили якоря в `docs/architecture/17-seam-inbound-law.md` (греп `Эррата, которую ратифицирующая нота обязана поставить`) и `docs/research/25-seam-cold-review.md:5`=`адресуем НОМЕРОМ, а не строкой` (оба целили в `:232`, тело уехало на `:239`; ⚠ 02.09 обе площадки уже переведены на форму номера ноты — прежний голый указатель `17-seam-inbound-law.md:120` показывает пустую строку). Лечение — не пере-нацеливание (оно повторится через эррату), а СМЕНА ФОРМЫ якоря: в тела D-лога целиться номером ноты (`^## D39.106`), который стабилен навсегда, а не строкой. ⚠ **Первая половина лекарства ПОСТРОЕНА:** `counts.py --lint` сверяет якоря в тела D-лога СТРУКТУРНО и без токена — владелец целевой строки (ближайший `^## D<номер>`) обязан совпасть с номером, названным рядом; остаётся перевести живые якоря на форму номера | оркестратор | скоро (растёт с каждой эрратой) | `--lint` учит форму `файл:^## D<номер>`, живые якоря в D-лог переводятся на неё | ревью доков 24.08, механизм и отсутствие носителя — 27.08, D39.160 | | 220 | **Репо-широкий гейт доков бутстрапится пакетным менеджером ОДНОЙ зоны, и та заморожена.** Диспетчер `.git/hooks/pre-commit` зоно-нейтрален по построению (`for hook in */scripts/githooks/pre-commit`, `#!/bin/sh`, node не нужен) и судит `CLAUDE.md` + `docs/**` + `platform/docs/**` + `frontend/docs/**` (`docs/scripts/counts.py:536`=`ROOT / "CLAUDE.md"`), но единственный его УСТАНОВЩИК — `frontend/scripts/githooks/install.mjs`, вызываемый ключом `prepare` из `frontend/package.json`. Охват и бутстрап не совпадают ⇒ инструмент решает свою задачу не в полной мере. Проверено исполнением 24.08: на этой машине `.git/hooks/` содержал только `*.sample`, гейт МОЛЧАЛ, ничего не проверив, и поймал первые четыре дефекта только после ручной установки; сессия бэкенда или доков `npm install` не делает никогда. Приор: зоно-нейтральный установщик в `docs/scripts/githooks/` как ЕДИНСТВЕННЫЙ писатель диспетчера, `prepare` фронта зовёт его — фронтовая половина выписана пингом №19 в зонный журнал фронта. ⚠ Ручная установка — временная мера, пока строка открыта; записывать её как порядок работы ЗАПРЕЩЕНО (это ровно тот обход, цену которого называет шапка `CLAUDE.md`) | доки + фронт | скоро | зоно-нейтральный бутстрап + правка `prepare` при разморозке | аудит переезда 24.08, №19 | | 49 | **Этапы Б+В спеки D15.2** (content-addressed resume / `guard_hash` — D39.31 сознательно не строил) ; этап В = tmctl export-контракт D29.1 (annot-v1 · цвет-мап+rollup · политика красных fail-closed) + операторский протокол-документ релиза гендер-твиста (D5.1): сам механизм УЖЕ построен — until_ch-правка → точечный re-edit со сметой и $0-пере-пином (`repin.go`/`rebill.go`, D39.42 п.5/D39.45) | бэкенд | скоро (ПОДТЯНУТА D39.81: annot-v1 = источник замечаний для фронта — критический путь подключения) | отдельное решение (annot-половина — по контракту 14, D39.99) | D39.34(4), D33 п.5, D39.81 | | 49а | **ALTER-шаги миграций v8–v14 не идемпотентны вопреки шапке `migrate.go:9-11`** (полу-применённая БД не сходится; счётчик версий скрывает) — находка критика полноты пака-19 | бэкенд | когда-нибудь | отдельное решение | D39.56, PACK19_BUILD §6.9 | | 50 | F3-остаток идемпотентности | бэкенд | когда-нибудь | отдельное решение | D39.34(4) | | 51 | `human_override` LOCK (D29 п.1г, в коде 0 вхождений) | бэкенд | когда-нибудь | отдельное решение | D39.34(4) | | 52 | **Ф2-гейты вне идеала**: морфо-гейты канцелярита + L1-лемматизация (python-сайдкар) · полный OpenCC · опциональный пре-перевод гейт ; состав явно: канцелярит + РОД (строка 82) + класс Ф2-гейтов карты 04-unhappy (обсцен-гейт/феминитивы/время сцены — состав решить паком) ; + класс идиоматики (свип-хвост, D39.73): сехоуюй-словарь · вэньянь-классификатор (zh) · васэй-эйго ложные друзья (к ja-паку 81) — данные пары или закрытие «банк книги покрывает» тем же паком | бэкенд | когда-нибудь | отдельное решение | D39.34(4) | | 54 | Масштаб целой книги: волны/каденс/потолки/ETA на сотнях глав (гоняли максимум 10; книга 7,78 млн симв., ~2284 раздела). ⚠ **Дописка инвентаря №18 (D39.147 п.2г):** жёстких потолков размера в коде НЕТ, но исходник читается в память целиком (`chunk/ingest.go:98`), чтения стора беспагинационны под `opTimeout = 10s` (`store/store.go:39`) и бюджеты нарезки калиброваны на 25 главах (`config/pipeline.go:126-138`) — ни одно из трёх на 2283 главах не проверено ничем | бэкенд | когда-нибудь (последним по курсу) | МАСШТАБ | D39.33, CURRENT-STATE | | **— ПОЛИГОН (кандидаты пакетов) —** | | | | | | | 55 | **`dialogue_dash` мерить только на невиданном тексте** (подогнан под 蛊真人; цифры мини-прогона аргументом не считаются) ; расширено до вне-претрейн чекпоинта целиком: r-коэффициенты exp01/08 · precision чекеров · частота эха · чистовик exp15-выводов ; + arity-полоса паспорта (D29.2г): решить — dialogue_dash покрывает диалоговую половину или мерить (D39.73). **Частично закрыта эксп-21 (D39.117):** направление главного вывода воспроизведено на чистом en-материале (узнавание 1/5), $0-довесок исполнен частично; **срез эксп-21 НЕ купил** (главный zh-замер на книге 4/5, без пинга) — остаток = неконтаминированный zh-срез | полигон | скоро (эксп-22 Ф0 — повторный ЖЁСТКИЙ заказ, стоп при неисполнимости) | эксп-22 | D39.37(4), D39.40, D39.46, D39.108, **D39.117** | | 56 | Ёфикатор/санитайзер-классы не размечены (§6.5 отчёта пакета-6) | полигон | когда-нибудь | полигон-пакет | D39.46, CURRENT-STATE | | 57 | Пере-замер «контексты — главный рычаг» на трудной выборке пакета-7 с боевой сборкой (до него kwic-веса/семантику не трогать; перф-хвост AttachKWIC — строка 37: фикс-пак 128 закрыт D39.118, опция в нём не взята, семантика не менялась) — напряжение с D39.46 названо, не отменено | полигон | когда-нибудь | полигон-пакет | D39.50, D39.118 | | 58 | **Не покрыто пакетом-8**: вторая книга/пара/модель · строка `drafts:` · ось `batch_runes` · разметчики-модели (не люди) · precision роли на «расширенном, но осмысленном» материале ; + контрастивный регрессионный сьют по каталогам режимов отказа (12-*) · чистовик exp15-выводов | полигон | когда-нибудь | полигон-пакет | POLYGON_PREMEASURE §1.8/§2.5/§3.5/§7.6 | | 59 | **Вендор-чек префикс-кэша ZAI/GLM** (на нём стоит вся кэш-экономика W1/Q2c) ; + GLM context-overflow гард (finish=model_context_window_exceeded — NOT-do пака-12 без решения) ; + Mistral-strip гейт message-builder (research/21 §1.1: extra_forbidden на reasoning-поля; ЛАТЕНТЕН при нашем single-shot wire — гейт перед прод-путём mistral в канале B / любым multi-turn; D39.74) | полигон | когда-нибудь (до МАСШТАБА) | полигон-пакет | D39.34(6) | | 60 | Scheduler-aware волны под peak-valley DeepSeek (прямой COGS-рычаг) | полигон/бэкенд | когда-нибудь (до МАСШТАБА) | отдельное решение | D39.34(6) | | 61 | **Прайс/wire-гигиена**: продление `prices_checked` без правки чисел · гейтнутые платные армы (edit-единица >3200 и др.) · wire-probe temperature в thinking-канале DeepSeek | полигон | когда-нибудь | полигон-пакет | D39.34(6) | | **— Ф2.5 / ПИЛОТ / ПРОД —** | | | | | | | 62 | Билингв-якорь (D25 п.9 Q1) | владелец | когда-нибудь | Ф2.5 | D25 п.9, CURRENT-STATE | | 63 | Контаминация корпуса (D27 п.4) | владелец/полигон | когда-нибудь | Ф2.5 | D27 п.4, CURRENT-STATE | | 64 | Судья-дублёр (D22.6) | бэкенд | когда-нибудь | Ф2.5 | D22.6, CURRENT-STATE | | 66 | Пилотные D25-гейты: publishable/waiver (п.1) · FN-bound L3 (п.4) | владелец | когда-нибудь | Ф2.5 | D25, CURRENT-STATE | | 67 | **Прод-гигиена: юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом** (D27) ; + юрисдикционные annex-ре-чеки при новых рынках (D39.29) + поле «версия исходника» book.yaml на интейке (04-unhappy §5) | владелец | когда-нибудь | Ф2.5 | D27, CURRENT-STATE | | 68 | Residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов (ОТЛОЖЕН до первого длинного прогона — D39.103) · precision@30 (`books/gu-zhenren/exp16/`) | полигон | когда-нибудь | Ф2.5 / полигон-пакет | CURRENT-STATE | | **— Ф3 / ПРОДУКТ —** | | | | | | | 69 | Gemini API «под-18» обязательство на конечный продукт (независимо от лейблов) | владелец | когда-нибудь | Ф3 / отдельное решение | D39.32, D39.34(7) | | 70 | Action-security gate перед выдачей tools/webfetch (D25 п.5) | бэкенд | когда-нибудь | Ф3 | D39.34(7) | | 71 | **Планы research/22**: epub-tag-rewrite · Q7-леджер ; + F3-brief из D29 п.3 (chat-edit · Not-useful-петля · cost-of-fix) + Ф3-скоуп 02-mvp-plan (TMX/TBX · Bertalign · дистилляция 7–14B); + V5: фронт ВЕБ-ПЕРВЫЙ, SEO/ранжирование (куки · страницы-сироты · актуальные алгоритмы Google) — определяет выбор фреймворка (SSR vs SPA), в Ф3-дизайн ДО выбора стека (ПТ-23) | бэкенд | когда-нибудь | Ф3 | D39.34(7), START_PROMT V5, D39.80 | | 94 | **Продукт-механика входа и прогона** (V2, ПТ-16..18): абьюз/misuse-прескрин дёшево и точно ДО трат токенов (H8) + UI-контракт отказа (проект-решение D39.80) · лимит размера входа настройкой (H7) · продукт-кнопки «стоп/продолжить» поверх построенных graceful stop и redrive, абьюзивный прогон НЕ продолжать (H10); API-форма — по контракту 0.3.0 (отказ прескрина РЕШЁН: `rejected` + грубый `content_refused`, К-9 закрыт D39.138 п.2б) | бэкенд | к подключению фронта (ПОДТЯНУТА D39.81; лимит можно раньше, к пилоту) | отдельный пак при Ф3-препе (контракт 14 ратифицирован) | START_PROMT V2, H7/H8/H10, D39.80, D39.81 | | 96 | **→ переехала в `platform/BACKLOG.md` П-1** (зонные бэклоги, D39.84: HTTP/SSE-слой, обвязка, аутентификация, порядок деплоя); здесь остаётся ратифицированным сам ИНВАРИАНТ D39.81 — движок = процесс-на-прогон (EXCLUSIVE flock `store.go:43`), сервер в backend НЕ пишется | платформа | — | зонный бэклог | D39.81, D39.84 | | 97 | **→ переехала в `platform/BACKLOG.md` П-2** (глобальный брокер рейт-лимитов; гейт «до второго параллельного пользователя» зафиксирован там же) | платформа | — | зонный бэклог | D39.81, D39.84 | | 127 | **Устаревший DDL-коммент `glossary.source`** (`migrate.go:194`: «seed|ruby|auto», фактические пути записи — seed/ruby/mined, `auto` не пишет никто; фантом уже утёк во фронт-доки дважды) — поправить коммент | бэкенд | когда-нибудь (попутно любым паком store) | однострочная правка | ревью контракта 04.08, D39.99 | | 105 | **Роль `classifier` мис-вердиктится как эхо (`verdict=cjk_artifact` при `bad_lines=0`); ЛАТЕНТНО — `classify_types` выключен во всех шиппинг-конфигах.** Цена фикса, знать заранее: бамп `classifierVersion` → перекупка чекпойнтов классификатора (центы). Поля `rules=`/`VOICE` читать по знаменателям (13б). Разбор дословно — `architecture/13-tech-debt-anchors.md` §Б-105 | бэкенд | когда-нибудь (ближайшее касание банка/наблюдаемости; (б) — дешёвая часть, вердиктов не двигает) | малое касание + вердикт-двигающая половина (а) через СТОП-решение | D39.86 | | 106 | **Слой 3: целевой контракт «узкие мандаты + ДИФФЫ» против текущего full-regen — гейт «перепроверить до стройки» в силе, приоритет ПОНИЖЕН (D39.117: full-regen выигрывает у ремонта; оговорка полигона — чинил дешёвый фиксер по предложению, не сильный редактор узким мандатом).** Реактивация — только через эту строку. Археология дословно (эмпирика D39.108 · история дыры учёта) — `architecture/13-tech-debt-anchors.md` §Б-106 | владелец → бэкенд | когда-нибудь (пере-проверка «сильный редактор × узкий мандат» — перед стройкой слоя 3) | замер → решение владельца | 09 §Слой 3, D39.90, D39.108, **D39.117** | | 113 | **Запас боевого гейта не зафиксирован тестом, а харнесс, давший число, УДАЛЁН (Д-хвост D39.90).** Числа «18 из 20 · 0 ложных на 1055 · запас 13× (0.0117 против 0.15)» и «санитайзер поймал бы английский черновик» получены ВРЕМЕННЫМ тестом в пакете pipeline (`splitBanknote`+`StripThink`+`sourceScriptShare`), который сессия удалила после снятия. Число ушло в контракт (строка 46), воспроизвести его нечем. **Делать:** корпус-фикстура в репо (~20 off-target + ~40 здоровых, с движковой предобработкой; снапшот НЕ двигает) + регресс-тест на реальный запас — это база, которую обязано побить любое предложение по 46. СТОП, если фикстура не воспроизводит 18/20 при 0 FP, или если запас меньше 3× | бэкенд | скоро (перед любой правкой по строке 46) | $0 фикстура + регресс-тест | D39.90, EFFORT_HANDLE §5.4 шаги 1–2, §7 | | 114 | **Конфиго-слой ручки эффорта: два дешёвых хвоста приёмки (вне снапшота, $0 прогонов).** (а) **Д4 отчёта:** `gates.terminology.target_script` НЕ сверяется с `book.target_lang` — `target_lang: ru` + `target_script: Latin` грузится чисто и **ИНВЕРТИРУЕТ** банковский экран (ловит целевой, пропускает чужой); сверка при загрузке против `lang.LangScripts(TargetLang)` — тот же дата-план, что у экрана строки 46, громкий отказ на несовпадении. (б) **Находка-2 приёмки:** стейл-доккоммент `capability.go:78` — у константы `ReasoningExtraBodyDisable` до сих пор «effort "" leaves the provider default», противореча проводу (`applyToBody` мержит disable на `""`, комментарий в теле arm это прямо объясняет) и починенному `ThinksOnWire`; однострочник тем же касанием | бэкенд | скоро (мелкий пак или попутно со строкой 46) | правка Go, снапшот не двигает | D39.91, EFFORT_HANDLE Д4 | | 115 | **`//go:embed` целевых данных — ЯВНЫЙ список файлов: новая ЦЕЛЬ требует правки Go (Д6 отчёта).** `internal/lang/embedded.go:22` перечисляет файлы поимённо, `CompileCheckers` паникует при неполном файле цели ⇒ на канон-вопрос «заработает ли пара, которой в репо НЕТ, без правки Go» ответ сегодня **НЕТ** — дыра в ратифицированной «ФАЗЕ 2 ОБЩНОСТИ ✅» (D39.64), и она не про язык, а про строку эмбеда. Решить форму: `embed data/*` (и как манифест фолдится в `EmbeddedVersion`, чтобы НЕ перекупать чужие пары) против явного списка как осознанного гейта полноты данных цели | оркестратор → бэкенд | когда-нибудь (триггер: первая новая целевая пара; учтён в реестре 108) | отдельное решение | D39.91, EFFORT_HANDLE Д6, D39.64 | | 108 | **Реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ (триггер → что вернётся → источник) — ВЫСЕЛЕН ДОСЛОВНО в `architecture/13-tech-debt-anchors.md` §Б-108; сверять на каждом переходе горизонта (норма D39.66 «каждое отложено получает носитель» в силе).** ⚠ Живое оттуда: go.work-триггер УЖЕ наступил (`platform/go.mod` заведён) · вахта маппинга эффорта dspro «early August 2026» · движение тулчейна к go1.27 ⇒ строка 119 ПЕРВОЙ | оркестратор | скоро ($0, гигиена трекера) | завести реестр + сверку в норму лендинга | D39.66, D39.90 | | 109 | **Продуктовые требования без строки-носителя: ПТ-6 (структура абзацев) · ПТ-7 (слабый оригинал — вопрос владельца) · ПТ-22 (продуктовый интейк настроек) · ПТ-10 (механизм веб-фетча).** Носители заводить при первом касании тем; реестр `product-requirements.md` первичен. Разбор дословно — `architecture/13-tech-debt-anchors.md` §Б-109 | оркестратор/владелец | скоро ($0 — расписать носители) | завести строки/вопросы → диспозиции | D39.90, product-requirements | | 110 | **Детектор повторов лемм / защита авторских рефренов** (`04-unhappy-paths.md:97,130 п.5`): $0-минимум исполнен промптом (editor.md, пакет-чекеров 02.08), механизм явно не строился — «нет размеченного класса; связка с alignment/Bertalign». Строки-носителя не было; предмет живой, потому что отличить дефектный повтор от авторского рефрена без выравнивания нельзя | бэкенд/полигон | когда-нибудь (с корпусом пилота, строка 85) | размеченный класс → решение | 04-unhappy §5, D39.90 | | 111 | **Дубль ключа пар-файла: фикс накрыл половину.** D39.82 закрыл строку 53 через `putUniqueDC` в `parseDCCheckers`, но генерик-парсер категорий `parseCategoryRows` (`internal/lang/langpack.go:806-826`, строка `cats[f[0]][f[1]] = val`) по-прежнему МОЛЧА last-wins — а якорь техдолга указывал именно на него. Пар-данные с опечаткой-дублем тихо теряют первую строку | бэкенд | когда-нибудь (малое касание, с любой правкой langpack) | fail-loud + тест | 13-tech-debt-anchors, D39.82, D39.90 | | 118 | **tools/go.mod — РЕШЕНИЕ ПРИНЯТО (D39.97 п.4): строить отдельным малым паком.** `cmd/tmvet`+`internal/archguard` → отдельный модуль (`backend/tools/`); `make battery` гоняет оба модуля; `tool`-директива Go 1.24 НЕ решает (MVS общий). Выигрыш: бамп инструментов физически не двигает x/net/x/text. Sqlite 1.55 остаётся (D39.97 п.4) | бэкенд | скоро (до следующего бампа зависимостей) | малый пак по D39.97 п.4 | D39.96 п.6, D39.97 | | 119 | **x/text-детерминизм: вердикт-несущие вызовы НЕ свёрнуты в версии (находки-5/6 приёмки).** `SanitizerVersion` не сворачивает ничего x/text-ного, а `detectCJKLeak` зависит от `width.Fold` (`sanitizer.go:211,687`) — смена x/text перевернула бы вердикт БЕЗ смены снапшота; `ExportNormalize` меняет экспортные байты вне хешей (`sanitizer.go:709`); `xTextVersion` пинит строку go.mod, НЕ скомпилированные таблицы — тулчейн go1.27 переключит x/text на Unicode 17.0.0 МОЛЧА (`tables17.0.0.go //go:build go1.27`; жилец реестра 108). Делать: явные версии-свёртки + механическую сверку «таблицы↔константа» вместо совпадения | бэкенд | скоро | правка версий-свёрток + тест | D39.96 п.6, отчёт §5 находки-5/6 | | 120 | **`buildCheckers` жёстко берёт `lang.Load(root,"zh","ru")`, бейзлайны ключуются по классу, не по паре (§7-8) — приезд ja-ru требует правки Go, против мандата общности §0.1.** Родня строки 115 (явный embed-список целей) — брать одним касанием | бэкенд | скоро | правка Go + тест на паре-которой-нет | D39.96 п.6, отчёт §7-8 | | 121 | **archguard v2 — остаток (б)/(в)/(г)/(д); (0а)/(0б)/(а) ЗАКРЫТЫ дофиксом D39.97.** Полный фикс-лист посадок приёмки D39.96 с file:line — дословно в `architecture/13-tech-debt-anchors.md` §Б-121 | бэкенд | скоро (остаток: (б) тип вместо свитча · (в) build-теги · (г) 4-й анализатор · (д) семь пропусков) | правка анализатора + посадки | D39.96 п.2/п.6, отчёт §7-9/12/13 | | 122 | **Гигиена пака стандартов — 11 микро-пунктов, не-блокеры приёмки (D39.96/97).** Полный список дословно — `architecture/13-tech-debt-anchors.md` §Б-122 | бэкенд | когда-нибудь | мелкие правки | D39.96 п.6, отчёт §7-6/7, §9 хвост | | 123 | **Полигон: `jieba==0.42.1` — build-time зависимость артефакта контраста `eval/exp16/data/jieba_dict_general_zh.txt`** (пере-собран бэкенд-сессией 03.08, полный sha256 сошёлся с пином `16-bank-mining.md`); дописать в манифест окружения полигона с пометкой «build-time, не runtime» | полигон | когда-нибудь | строка манифеста | D39.96 п.6, отчёт §7-4/§6 | | 124 | **Калибровка снапшота (вопрос владельца 04.08, разбор D39.97 п.5): нацеленность, не агрессивность.** ⚠ **Осей теперь ЧЕТЫРЕ — дописка D39.151:** (г) **идентичность оплаченной работы** («строка диспозиции ↔ вызовы, которые её оплатили») — переселена сюда из строки 195 решением владельца 17.08; родня оси (в), потому что массовое кросс-снапшотное переиспользование подрывает наивную атрибуцию по равенству снапшота; смежный носитель — §7 спеки D15.2. Прежние три оси одним дизайн-паком: (а) недо-чувствительность — вердикт-несущие вызовы x/text не свёрнуты (вход: строка 119); (б) пере-охват — `EmbeddedVersion` фолдит все пары разом → пер-парный хеш (родня 115/120); (в) дешёвая перекупка: `tmctl resnapshot --dry-run` — байт-сверка тел по чекпойнтам (`msgsContentHash`), идентичные юниты пере-привязываются без пере-вызова, платятся только изменившиеся. «Поведенческий отпечаток вместо строки версии» отложен (пол ≠ доказательство) | бэкенд | когда-нибудь (перед МАСШТАБОМ — когда перекупки станут реальными деньгами) | дизайн-пак по D39.97 п.5 | D39.97 | | 221 | **Джойн «предложено × решено × нерешено» живёт ТОЛЬКО в движке.** Читаемый банк несёт итоги без предложений, карта подписи — предложения без решений; семантика «решено ли» (`ownerHandled`) существует в двух файлах движка и больше нигде (греп по трём зонам). Экран подписи при разморозке фронта заставит платформу пере-реализовать движковый закон у себя — дубль, запрещённый п.6 закона шва. **Фикс:** движок публикует нерешённость (секцией банк-экспорта или отдельной проекцией) — но ТОЛЬКО когда экран закажут: рефакторить под несуществующий экран не надо. Сейчас — ноль кода ⚠ **КОНСИЛИУМ 27.08 (оркестратор №19 + автор движковой двери), итог записан, чтобы его не выводили заново.** **(1) Это ОДИН дефект, а не три:** 221 и 224 — ось СОДЕРЖАНИЯ (проекция не несёт предложенное и не несёт джойн), остаток компаньона — ось СВЕЖЕСТИ (дверь пишет источники мгновенно, проекция ждёт границы прогона, которой при стоящем прогоне не наступает). Классический разрыв CQRS. Чинить порознь = три полу-лечения. **(2) Поле `BankTerm.decision` МЕРТВО СТРУКТУРНО** — довод сильнее прежнего «запрет владельца»: decline выражает себя ИСЧЕЗНОВЕНИЕМ строки, а не значением поля (`writeAutoBank` делает `continue` на `ownerHandled`, `mining.go:709+`), и негде показаться ни в одном из трёх окон; для approve поле избыточно — `status: approved` публикуется. Проверено двумя независимыми трассами. ⚠ Вопрос был СНЯТ ещё D39.144 вместе с ложной посылкой «марш к нулю, 17 из 300»; сегодняшняя потребность иная и уже — перезагруженный экран показывает СДЕЛАННЫЕ ПРАВКИ. **(3) Форма-кандидат Д′:** ДВЕ проекции, у каждой РОВНО ОДИН писатель — «решено на границе» пишет прогон рядом с картой, «решено после границы» пишет дверь при записи; экран склеивает по паре (поверхность, `map_id`), счёт приезжает ПОСЧИТАННЫМ. Правило единственного писателя остаётся буквально, поправка онтологии НЕ нужна. Конверт карты из дофикса-2 получает здесь первого потребителя. ⚠ Колонка `undecided` обязана ехать с тем же НЕ-гейтовым контрактом, что `SignatureState`, иначе пер-термная модель вернётся через новую проекцию. **(4) Подпункт «история»:** `glossary_revisions` построен наполовину — читатель вызывается только из тестов, графа `reason` заполняется литералом `seed-replace`, а ревизия пишется лишь для ОСТАВШИХСЯ строк, то есть журнал слеп к отклонениям; владельческий `note` доезжает до вида (`glossary.go:41,161`) и не публикуется ни одной проекцией. ⚠ Journal append-only: не заказать ревизии без исчезновений задним числом уже не выйдет. **Пак не заказан — ждёт слова владельца** | бэкенд | гейчена разморозкой фронта | аддитивное поле проекции | приёмка двери 27.08, D39.158 | | 222 | **ВНУТРИкнижный остаток оси арбитра: второй конфиг ТОЙ ЖЕ книги с другим `project_db` пишет ту же пару файлов решений под ДРУГИМ локом**, мимо флока живого прогона. Достижимо по построению: пути решений считаются от каталога `book.yaml` и `book_id`, лок — от `project_db`. Рукотворная конфигурация оператора (две базы одной книге), лечение трогает ратифицированный п.2 закона (второй арбитр на идентичности файлов решений либо отказ при загрузке). ⚠ Межкнижная версия ЗАКРЫТА снятием объявляемых ключей (D39.158 п.5) | бэкенд | когда-нибудь (непропорционально: правка ратифицированного закона ради операторского футгана) | второй арбитр ЛИБО отказ при загрузке | приёмка двери 27.08, D39.158 | | 223 | **Майнерский хвост за потолком структурно недостижим.** Потолок эмиссии (200) применяется ДО фильтров пригодности, сида и отказов, а детектор кандидатов сида и отказов не видит вовсе — репозиторий пишет это про себя дословно. Замер: 2110 ранжированных → 442 годных во всём алфавите → 117 внутри окна потолка → **325 невидимы постоянно**; отклонение всех 117 не подняло ни одного. ⚠ Решения владельца слотов НЕ освобождают, и это верно СЕГОДНЯ, а не следствие флажка; цитата «пере-предлагается once these are signed or declined» относится только к ОБРАТНОЙ секции. Двигать потолок — трогать фрозен-паритет, отдельное решение. Якорь-пин: `internal/miner/emissioncap_test.go` | бэкенд | когда-нибудь | решение о потолке, не правка | приёмка двери 27.08, D39.158 | | 224 | **Банк-экспорт на стопе ПУСТ** — проекция, наиболее пустая ровно в момент, когда её читает экран подписи. Замерено: стоп с двумя предложенными термами даёт `total=0`, авто-банк на стопе отсутствует, потому что он пишется только в ветке авто-продолжения; при этом комментарий рядом называет стоп «границей, которую читает экран подписи», а платформа читает именно `.bank.json`. Член класса «проекция без контракта потребителя» (`architecture/18-bank-ontology.md`) | бэкенд + платформа | скоро (держит экран подписи вместе с 221) | публиковать предложенное на стопе | приёмка двери 27.08, D39.158 | | 225 | **Гейт «строка `open`, а лекарство уже в дереве».** При лендинге пересекать ПОЛНЫЕ пути застейдженных файлов с якорями открытых строк регистра и бэклога; совпадение — вопрос лендеру, а не находка следующего пака. Замерено прежде решения: по именам файлов 22 совпадения, почти все ложные; по полным путям 2, оба настоящие, и один из них (`PD-157`) убил мой же лендинг `d1eb8a9`. Норма-половина уже стоит в `platform/docs/ENGINEERING_STANDARDS.md` §3 п.8; здесь — машинная половина, режимом `counts.py` | оркестратор | скоро (окупился до постройки) | режим `counts.py`, берущий список путей и печатающий открытые строки, чьи якоря в них целят | приёмка пака P8-REVIEW 27.08, D39.159 п.7 | | 226 | **История ПРЕДЪЯВЛЕННОГО не ведётся — «почему меня не остановило на этом термине» ответить нечем.** Карта и человеческая таблица стопа перезаписываются каждым прогоном, память флажка — плоское множество поверхностей без `map_id` и без времени. Это прямая расплата за то, что стоп срабатывает ОДИН раз (кластерная память, названный остаток дофикса-2), и единственная возможная диагностика спора. Кандидат в пак решённости, не заказ. ⚠ Шестое, названное консилиумом и оставленное владельцу: авторство и время решения — сегодня цена нуля (владелец один), станет нужным при мультипользовательской платформе, и тогда его захотят ЗАДНИМ ЧИСЛОМ | бэкенд | скоро (диагностики нет вовсе) | движок метит предъявленное `map_id` и временем; оверлей отвечает «что предъявлялось на прошлом стопе» | консилиум по читающей стороне банка 27.08 | | 250 | **Заголовок глоссария на проводе ОПИСЫВАЕТ маркер, которого после пака больше нет — живая строка с висячей ссылкой.** Строка данных `ru glossary_header` (`backend/internal/lang/data/injection.txt`) дословно объясняет модели: «строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты», а пункт 3 вайр-батча снимает маркер с провода по `D39.104` п.2 ⇒ на проводе не останется НИ ОДНОЙ помеченной строки, а заголовок продолжит объяснять пометку. ⚠ Это НЕ мёртвая строка данных (те — `editor_unverified_header` и `unverified_marker`, они просто перестают читаться), это ЖИВАЯ строка, которую читает модель. По `D39.104` п.1 клаузула становится ВАКУУМНОЙ, а не ложной, вред не измерен — поэтому не блокер. ⛔ **Чинится ТОЛЬКО правкой `injection.txt`, а она двигает `EmbeddedVersion` → `cutTag` → ключ манифеста → снос `unit_resolutions` книги (строка 198).** Носитель — ближайшее ОКНО правки эмбед-данных: строка **160** идёт своим паком и всё равно бампает форму манифеста. Найдено бэкенд-сессией вайр-батча 04.09 — она правильно НЕ тронула и принесла предмет | бэкенд | скоро (в окне строки 160) | правка `injection.txt` в окне 160 | пинг бэкенд-сессии 04.09 | | 251 | **Банковый контур в `pipeline-c1.yaml` требует АРТЕФАКТА, которого в git нет и быть не должно — первая же выкатка после лендинга откажется стартовать, если его не положили.** Оба банк-роля живут ВНУТРИ стопа майнинга, а `runBankMiningStop` (`backend/internal/pipeline/mining.go:58`) возвращается РАНЬШЕ построения кандидатов при пустом `mining.contrast_path` ⇒ без корпуса контраста терминолог и классификатор не исполняются ВООБЩЕ, чем бы ни были заполнены их гейты. Артефакт — общечастотный словарь jieba (`.gitignore:38`: «jieba 0.42.1 dict.txt, 5MB — SHA pinned in the report, **reproducible**»), рецепт и sha256 `7197c321…` — `docs/experiments/16-bank-mining.md` (греп `jieba_dict_general_zh`). ⚠ **Риск ограничен и это ГЛАВНОЕ:** артефакт не утерян, а ВОСПРОИЗВОДИМ по запиненному рецепту; дыра в том, что требование не доехало до РАНТБУКА развёртывания (`platform/deploy/README.md` о нём не знает), и оператор узнаёт о нём только от гарда. Гарды поставлены паком и они правильные: загрузка ОТКАЗЫВАЕТ при включённом гейте с пустым ключом, наличие файла проверяется на ПИШУЩЕМ пути рядом с `CheckKeys` — то есть до оплаченной черновой волны, а не после неё. ⛔ **Что делать:** требование в рантбук платформы (её зона, пинг) + слово владельца/оператора, что файл лежит на боевой машине, ДО первой выкатки после лендинга. ⚠ **Вторая половина, вскрытая тем же включением:** корпус контраста — факт ИСХОДНОГО ЯЗЫКА, а `mining.contrast_path` живёт в конфиге пайплайна, который по построению пар-агностичен (цель проекта №2). Перекос не заведён паком, а вскрыт им; пара, которой в репо нет, потребует своего корпуса и своего ключа | бэкенд+платформа | скоро (до первой выкатки после лендинга вайр-батча) | пинг рантбуку + слово оператора; пар-перекос — отдельным решением | бэкенд-сессия вайр-батча 04.09 | | 252 | **Две гарантии не прибиты — мутации сессии ПЕРЕЖИЛИ всю батарею** (собственные посадки бэкенд-сессии вне шести пунктов заказа, 04.09; из восьми посадок шесть красные, две выжили и НЕ чинились как вне-заказные). **(а) `StickyDepth = 2 → 1` не ловит НИКТО** — глубина окна липкости меняется молча. **(б) `priorityRank`, отбрасывающий приоритет доверия** (подтверждённые строки раньше неоднозначных в бюджете инъекции), **не ловит НИКТО** — то есть порядок, решающий, ЧТО попадёт в инъекцию при нехватке бюджета, можно перевернуть безнаказанно. ⚠ Класс тот же, что дал паку «число согласия» три неприбитых свойства: заявленное поведение без пинящего теста. Сессия правильно НЕ чинила вне заказа и принесла предмет | бэкенд | скоро (ближайшим касанием инъекции) | по тесту на гарантию + запись в `cmd/tmmutate/mutations.json` | собственные посадки бэкенд-сессии 04.09 | | 253 | **НА ЭКРАНЕ ПОДПИСИ БАНКА ПОДПИСЫВАТЬ НЕЧЕГО, а сам подписываемый банк НЕПОЛОН — две половины одного шва, найдены ПЕРВЫМ живым прогоном 04.09.** **(а)** Прогон встал `awaiting_bank`, `GET /bank` отдал `total 0, signed 0` — при том что рядом лежали `mined-signature.yaml` 49 КБ и `bank-stop.txt` 60 КБ, а движок держал 82 неразобранные поверхности; термины появились в read-модели только на СЛЕДУЮЩЕМ прогоне (`bank export refreshed … terms=83`). Платформа читает сайдкар честно: 0 значит 0 ⇒ либо сайдкар пишется не в тот момент, либо стоп наступает РАНЬШЕ публикации банка. Корень скорее движковый. **(б)** Банк, который пользователь подписывает, ЧАСТИЧНО КОНСОЛИДИРОВАН, и платформа об этом не знает вовсе: терминология урезала план под бюджет ДО первого вызова (`batches_dropped=5`, `consolidated=38 declined=0 unanswered=47` из 85), а поверхности нет ни одной — `grep -rn 'consolidat\|unanswered\|batches_dropped' platform/internal/ --include=*.go` → **0**, аллоулист сайдкара несёт только термины. ⇒ **пользователь подписывает как ПОЛНЫЙ банк то, что движок сам называет неполным.** Лечение (б) — КАНАЛ: полнота консолидации в сайдкар + поле на `BankPage`; лечение (а) — разбор порядка «стоп против публикации». ⚠ Обе половины на шве, чинятся согласованно | бэкенд+платформа | скоро (до первого внешнего пользователя) | разбор порядка публикации + канал полноты | наблюдение платформы за живым потоком 04.09, H10/H11 | | 254 | **Шесть движковых ловушек, увиденных ПЕРВЫМ живым прогоном (04.09) и НЕ тронутых платформой — чужая зона.** ⛔ **Самая дорогая: `manifest` на пустом файле даёт exit 11, а интейк на 11 УДАЛЯЕТ ЗАГРУЗКУ** ⇒ пользователь, приславший пустой файл, теряет его. Возможно, так и задумано, но решить это надо СОЗНАТЕЛЬНО, а не по совпадению номеров. · `tmctl build` не читает контекст: всегда SIGKILL, staging-файл `.tmp-*` остаётся · потолок бросает летящие вызовы, они списываются нулём (`PD-441`, замер: отмены на 120756/156469/156470 мс) · терминология МОЛЧА режет план под бюджет (вход строки 253б) · сайдкар банка пуст в момент стопа (вход 253а) · **`build --format X` без `--out` удаляет соседние форматы** — ловушка для оператора с руками. ⚠ Ни один из шести не найден чтением кода за месяцы — все шесть увидены за один прогон | бэкенд | скоро (ближайшим касанием соответствующего пути) | по пунктам; часть — райдерами других паков | наблюдение платформы за живым потоком 04.09, H21 | | 255 | **Первый живой прогон НЕ КОСНУЛСЯ поверхностей, ради которых часть кода построена — и это надо знать прежде, чем говорить «поток проверен».** **SSE-поток не открывался НИ РАЗУ** (весь прогресс читался поллингом ⇒ `platform/internal/httpapi/stream.go` живым прогоном не проверен вовсе) · читающая поверхность глав и пар не читалась · пользовательский `stop` не звался — из ТРЁХ способов кончить прогон проверены два · апгрейд движка, `books --migratable`, `run unquarantine` не трогались · всё измерено на книге **57 КБ**, на корпусной 23 МБ переносить нельзя. ⚠ Это не дефект, а ГРАНИЦА утверждения: «цикл замкнут живьём» верно ровно про ту цепь, которую прошли. Следующий платный прогон обязан закрывать этот список, а не повторять пройденное | платформа | скоро (следующий платный прогон) | список к покрытию | наблюдение платформы за живым потоком 04.09, H22 | *(Указатели на архив-слайсы хроники — бюллетенем «Архивы хроники» в CURRENT-STATE; здесь копий нет.)* ## Бэкенд > **Состояние зоны на 31.08:** активного промта НЕТ, дерево `backend/` чисто. Ратифицированные лендинги > зоны: входная дверь шва — **D39.158** (`d1eb8a9`) · «тихая порча» — **D39.164** (`7d0c6f2`) · «деньги» — > **D39.170** · гейт схемы — **D39.173** · «писатель книги» — **D39.175** (`8adcb86`) · «деньги и честность > выдачи» — **D39.182** (`bb541a8`) · ЗАКОН РАСКРЫТИЯ, ратифицирован владельцем — **D39.181** · четыре > строки бэклога закрыты тем же лендингом — **D39.185**. Диспозиция по D25.1 ратифицирована D39.175 п.2 > (drift — не дыра файла; лестница — владельцу между паком и дверью). > > **Свободная работа зоны — строками бэклога:** **246** (СРОЧНО, две копии полосы отказов обещают РАЗНОЕ) · > **247** · **232** · **233** · **197** (ресурс ушёл в фазу 1, строка не взята) · **228** · **229** · **230** · > **141**-остаток · **131**. ⚠ Строк 231 и 236 в таблице БОЛЬШЕ НЕТ — 231 съел пак «деньги», 236 сужена D39.175. > > ⚠ **Прожитая проза зоны за 24–31.08 СНЯТА отсюда** — история живёт слайсом > [archive/PROGRESS-2026-08-backend.md](archive/PROGRESS-2026-08-backend.md) и телами нот выше; читать её > не надо. Доказательная база пака «деньги и честность» и ВСЕ его пинги — файлами зоны: > `backend/docs/MONEY_HONESTY_REPORT.md` (§7 — пинги оркестратору, §9 — экземпляры закона по одному, > §0.1 — батарея ИСПОЛНЕНИЕМ, **§5.1 — разложение покупок П1/П2/П3**: ось пере-покупки терминолога = > БАЙТЫ БАТЧА, а не сдвиг снапшота — это и есть «пинг №2», которым D39.185 п.1 адресует сюда; §6.2 — > адверсариальный проход), `backend/docs/DISCLOSURE_LAW_DESIGN.md`, `backend/docs/MONEY_HONESTY_PLAN-NOTE.md`; > промт — `archive/prompts/BACKEND_MONEY_HONESTY_SESSION_PROMPT.md`. ### 04.09 — ОТЧЁТ вайр-батча «род · экран цели · заголовки инъекций» (сессия `textmachine-main-7e`, промт `BACKEND_WIREBATCH_SESSION_PROMPT.md`) > **ПЕРВОЙ СТРОКОЙ, потому что промт этого требует: `internal/lang/data/` НЕ ТРОНУТ НИ БАЙТОМ.** Пункт 3 сделан снятием РЕНДЕРА в Go. Предъявление, а не утверждение: `diff -r <(git archive HEAD backend/internal/lang | tar -xO) …` идентично, и `tmctl manifest --json` из HEAD и из дерева на `example/book.yaml` дают ТОТ ЖЕ `manifest_key` `e996b9d4f129006e9faa6237fb1635a82e32c06c056b195072fae15f582021f6` и ТОТ ЖЕ `unit.id` `f8ad8c8f114997c5:3d2213f2:0` (средний сегмент — `cutTag`). ⇒ пере-чеканки `unit.id` нет, `recut` у платформы не сработает, `unit_resolutions` книги параллельного платного прогона целы. > > **Состояние: пять пунктов из шести закрыты, шестой (140) упёрся в факт развёртывания и вынесен решением оркестратору — см. §4.** Дерево НЕ закоммичено, лендинг за оркестратором. **Батарея (предусловие, не отчёт).** `cd backend && make battery` → `MAKE_EXIT=0`, `golangci-lint` `0 issues`, `ok` в 19 пакетах, SKIP три и те же: `TestMinerFullBookParity`, `TestHelperEventsRun`, `TestHelperKillLoop`. **Тесты.** `grep -rn '^func Test' backend --include=*_test.go | wc -l` → **1105 → 1143**, добавлено 39 (из них 10 — дофиксом приёмки). **Удалённых имён ОДНО, и оно названо:** `TestEditorSectionFollowsProvenance` — это ПЕРЕИМЕНОВАНИЕ, а не потеря. Его предмет (маршрутизация двух секций редактора по провенансу) упразднён пунктом 3 вместе с самими секциями; уцелевшая половина утверждения живёт под `TestTheGenderDirectiveAsksTheMatchAndTheWireAsksNothingElse` и стала СИЛЬНЕЕ — держит оба блока, а не один. Команда диффа: `comm -23 <(git show HEAD:… ) …` по пофамильным снимкам. **Каталог мутаций.** `python3 -c "import json;print(len(json.load(open('backend/cmd/tmmutate/mutations.json'))))"` → **92 → 105**. --- ## Пункт 1 — строка 210: род ПРОИЗВОДИТСЯ. ЗАКРЫТ, с честной границей доставки **Развилка выбрана ЧЕТВЁРТАЯ, которой в промте не было: род производит существующий фокус-проход КЛАССИФИКАТОРА** (`runClassifier`), третьим полем ответа. Довод: ноль новых вызовов (проход уже гоняется по тем же кандидатам с теми же контекстами) при цели №5 «низкий COGS»; род — свойство сущности, выводимое из контекстов, то есть акт классификатора, а не выбор рендеринга; парсер классификатора позиционный и закрыто-словарный, тогда как третье поле терминолога — уверенность, вокруг которой написана деликатная развязка мис-сплита по живому дефекту «наставник 95%». Цена: двигается `RequestHash` ТОЛЬКО классификаторных вызовов; терминологические чекпоинты книг живы. Ратифицировано оркестратором. **Построено.** Промпт пары `prompts/zh-ru/classifier.md` v2 — третье поле, закрытый словарь `male|female|neuter|none`. ⚠ `hidden` в словарь НЕ входит НАМЕРЕННО: «пол скрыт до раскрытия» — решение о сюжете и спойлерной политике книги, а не наблюдение по KWIC-строкам; ошибочная догадка де-гендерила бы обычного персонажа на всю книгу. Остаётся ручным, в сиде. `none` — полноценный ОТВЕТ, а не пропуск колонки: без слова для «рода нет» единственный способ это сказать — не писать колонку, что неотличимо от «модель перестала отвечать». Go: `terminology.Genders` + `ParseTypes` возвращает `types, genders, stats`; `ReplyStats.BadGender`/`NoGender` — два счётчика, потому что это два разных отказа; `pipeline.attachClassifiedGender`; `miner.Term.Gender` → `DeltaFile` → сид-YAML → сайдкары → банк. **Гарантия, которую держит тест:** колонка рода НИКОГДА не стоит классу — значение вне словаря отбрасывается и считается, класс сохраняется (`TestTheGenderColumnNeverCostsTheClass`). **⛔ ГЛАВНАЯ НАХОДКА ПАКА: ЗАМКОВ ТРИ, И НАЗВАННЫЙ В ПРОМТЕ — НЕ СВЯЗЫВАЮЩИЙ.** `bankmaterialize.go` держит ДВА банка: черновая волна выбирает по `baseMemory`, из которого строки `Source:"mined"` вычеркнуты ПО ПОСТРОЕНИЮ, редактор видит обогащённый. Авто-банк пишется как `mined` (`mining.go:671`), подписанная дельта — тоже (`mining.go:896`, дословно «override the seed loader's Source:seed → mined (base-excluded)»). ⇒ **на ЧЕРНОВОЙ провод произведённый род не едет и не поедет: там нет самой СТРОКИ.** Это не дефект — это денежный контракт `D39.42` п.3: инъекция черновой волны байт-стабильна поперёк обогащения банка, иначе пере-снапшот платит две волны вместо одной. Не трогал и не предлагаю. **Формулируй границу так и не короче:** род производится авто-путём и доезжает до РЕДАКТОРСКОГО провода в том же прогоне, что его произвёл; на ЧЕРНОВОЙ не едет, пока цена двух волн не решена отдельно. Не «род построен». **Второй замок СНЯТ по ратификации оркестратора, и снят РАСЩЕПЛЕНИЕМ, а не целиком.** `Disp` сворачивал два вопроса — СТАТУС строки и надёжность МАТЧА. `D39.104` п.1 упраздняет разнобой по статусу («банк на проводе = закон независимо от статуса строки»), но про матч там нет ни слова и быть не может: род, приписанный не той сущности, — ошибка, а не неподписанность. Заведено поле `PickedEntry.KeyTrusted` + тип `InjectionTrust{Disp, KeyTrusted}`, который несёт ОБА факта через липкое окно (у липкого переноса нет своего ключа, и матч-половину, как и диспозицию, восстановить нечем). Род теперь гейтится `KeyTrusted` на ОБОИХ блоках; статус не решает ничего. **Сквозное доказательство — три двери порознь, а не «работает»** (`internal/pipeline/gender_wire_test.go`): (1) неподписанная строка на доверенном ключе НЕСЁТ род редактору в том же прогоне; (2) collision-prone матч не несёт НИКУДА, при ЛЮБОМ статусе (юнит-проверка: на zh ветка не срабатывает физически, ханьские ключи якорятся на 2, поэтому сквозной zh-фикстурой её достать нельзя); (3) на черновой провод род не попадает НИКОГДА — и утверждение перевёрнуто нарочно: откроет кто-то дверь 3 — тест покраснеет и заставит автора назвать, какую именно. **Отрицательный контроль есть:** `TestASignedGenderBeatsTheProducedOne` — сид владельца побеждает, и не порядком присваивания, а тем, что `loadAutoBank` роняет предложение движка на занятый подписью ключ. Команда: `go test ./internal/pipeline/ -run 'Gender' -v`. ⚠ **Пункт 4 — ПРЕДПОСЫЛКА пункта 1 в бою.** Род производится только когда включён `classify_types`. Без банкового контура в боевом конфиге род не производится ни при каком варианте развилки. ## Пункт 2 — строки 113 → 46: база записана, экран построен. ЗАКРЫТ **113 — СТОП СНЯТ, все три порога пройдены.** Корпус взят исполнением: все чекпоинты всех 162 БД стенда, через СОБСТВЕННУЮ предобработку движка (`splitBanknote` → `checks.StripThink` — тот текст, который видит гейт), дедуп по хешу, только отгрузочные роли (банк-роли исключены: их ответы законно состоят из исходных термов, и включив их, мерили бы исключение, а не гейт). Обход дал **1162 ответа: 30 off-target, 1132 здоровых** — но ⚠ **в РЕПОЗИТОРИЙ уехала ВЫБОРКА, и все числа ниже воспроизводимы над ней, а не над обходом**: 74 строки, все 30 off-target плюс 44 ЗДОРОВЫХ, отобранных нарочно трудными (20 с высшей долей исходного письма, 15 с низшей долей целевого, 3 под полом улики, остальное — спред). Тексты в git не поехали, довод — в шапке `offtarget_corpus_test.go`. **Разметка НЕ гейтом, иначе она была бы пересказом вердикта:** off-target = доля КИРИЛЛИЧЕСКИХ букв < 0.5 — свойство ЦЕЛЕВОЙ стороны, независимое от проверяемого исходно-письменного гейта. Корпус разделяется полностью: здоровые все выше 0.9, off-target все ровно 0.0000, полоса между ними ПУСТА. **Числа воспроизведены и совпали с опубликованными до знака:** худший здоровый source-share **0.011655** (контракт называл 0.0117), запас **12.87×** против порога 0.15 (контракт называл 13×), **ноль ложных на 44 трудных здоровых** (не на 1132 — над репозиторием проверяемо именно это), поймано **28 из 30** (контракт называл 18 из 20 на более узком срезе того же стенда — та же доля, те же два промаха). Промахи — два беглых АНГЛИЙСКИХ черновика на **4690** и **4811** букв, ровно те, что названы в `EFFORT_HANDLE §3.1`. Худшая здоровая доля ЦЕЛЕВОГО письма **0.9767**, максимум у off-target **0.0000**, самый короткий off-target **346** букв — все три числа контракта воспроизведены. Команда: `go test ./internal/pipeline/ -run 'OffTargetCorpus|LiveEchoGate|LatinOffTarget' -v`. ⚠ **ЧЕГО ФИКСТУРА НЕ НЕСЁТ, и это мой выбор с ценой.** `testdata/offtarget-corpus.json` несёт РУНОСЧЁТ каждого образца (всего рун, рун исходного письма, букв, букв целевого письма), происхождение, метку и шестидесятирунную голову для человека — но не тексты. Тексты — копирайтная вебновелла и её машинные переводы, которые репозиторий держит вне git намеренно (стенд версионируется отдельным репо, `example/` возит собственный фрагмент по той же причине). Руносчёта достаточно ПО ПОСТРОЕНИЮ: обе проверяемые функции — отношения классов рун и ничего больше не читают, и тесты кормят НАСТОЯЩИЕ функции скрипт-верным суррогатом, собранным из счётчиков, а не считают арифметику вместо них. **Названная потеря:** детектор, который будет читать слова, n-граммы или орфографию, на этой фикстуре не измеряется — ему нужен повторный обход стенда. **46 — экран построен формой (а) плана §5.4 и заморозкой `D39.92`/`D39.93`.** Отдельный пакет чистых функций `internal/langscreen` (вход: текст + скрипты цели; выход: ИМЕНОВАННЫЙ вердикт `on_target|off_target|abstain` + счёт и объём улики). Порог `OnTargetFloor = 0.50` — КОНСТАНТА в пустом интервале, не тюнинг (гарантия Неймана–Пирсона на этом корпусе не покупается — `D39.92` п.1а); пол улики `MinLetters = 200` калиброван, а не выбран: самый короткий off-target 346 букв, ниже пола падают три здоровых. Носитель данных — `lang.LangScripts`, НОВОГО эмбед-файла не заведено. **Флаг СВОЙ — `FlagOffTargetLang`, `FlagCJKArtifact` НЕ переиспользован** (`D39.93` п.2), явный вход в `escalatable()`, не `retryable`. `classifierVersion` v2 → v3, и версия правила `langscreen.Version` вплетена в литерал, так что правка ВНУТРИ модуля двигает снапшот сама, а не по дисциплине. **Приёмочный критерий §5.4 шага 5 исполнен:** офлайн-прогон по корпусу — экран новооткрывает РОВНО два ответа, оба английские, здоровых не двигает ни одного (в тесте это `Fatal`, а не `Error`: план требует СТОП). Вдвоём два правила ловят **30/30 при нуле ложных**. Команды: `go test ./internal/langscreen/ -v` · `go test ./internal/pipeline/ -run 'TargetScreen|TwoScreens|BankRoleReply' -v`. **Вторая половина дыры закрыта тем же диффом:** `detectLatinInsertion` теперь под `c.TargetScriptNonLatin()` (`internal/checks/sanitizer.go`). Правило существовало в прозе доккоммента и стояло только на пути репэйра; первая же латинописьменная цель уронила бы КАЖДЫЙ чанк чистой целевой прозы как «Latin insertion». Для ru вердикты не двигаются ни на байт (предикат истинен) ⇒ бампа версии санитайзера не требуется. ⚠ **НАХОДКА, приехавшая ВМЕСТЕ с паком, а не до него.** Экран и эхо-гейт обязаны молчать на ответах банк-ролей: их буквы — движковые идентификаторы и исходные термы, поэтому эхо-гейт флагал бы их (и флагал: `verdict=cjk_artifact` при `bad_lines=0` на чистой пробе 6/6), а экран флагал бы ВТОРЫМ способом. Исключение было записано как `role == roleTerminologist` и КЛАССИФИКАТОРА не покрывало (`13-tech-debt-anchors §Б-105`) — латентно, пока ни один боевой конфиг классификатор не включал. Пункт 4 его включает. Поле переименовано в `NonProseReply` (оно про ФОРМУ ответа), предикат один — `isBankRole`, рядом со строкой, которую новая банк-роль и так обязана добавить в `bankRoleSettings`. ## Пункт 3 — строка 134: рендер снят, данные не тронуты. ЗАКРЫТ **Выбор объявлен: снят РЕНДЕР в Go.** Механизм, по которому выбор сделан: `cutTag` сворачивает `lang.EmbeddedVersion()`, `injection.txt` лежит в `internal/lang/data/` ⇒ правка данных пере-чеканила бы `unit.id` всей книги → `manifest_key` → снос `unit_resolutions` у платформы (строка 198). `RenderFormatVersion` в `cutTag` НЕ входит — он фолдится только в снапшот. Предъявление — первой строкой этого отчёта. **Текст заголовка не менялся вовсе,** и это проверено, а не принято на веру: действующий `editor_header` БАЙТ-ИДЕНТИЧЕН арму `AM-noclause` пробы 18 (`experiments/18-editor-wire-probe.md` §0.3 дословно: «Закон БЕЗ оговорки = действующий `editor_header` без единой правки»). Оговорка области НЕ внесена (опровергнута §A.4). **Что изменилось:** маркер ⟨проверить⟩ не рендерится НИ В ОДНОМ блоке; секция `editor_unverified_header` не рендерится, две секции редактора схлопнуты в один закон-блок; неподписанные строки стоят в нём под тем же заголовком и ничем не помечены. Статусы строк и подписная таблица не тронуты (`D39.104` п.1). `RenderFormatVersion` v3 → v4. **Ревью-ось «маркер снят, а пост-чек жив» проверена:** `membank.Postcheck` ключуется на `p.Disp`, маркера не читает — обработка `Ambiguous` цела, счётчики `Shown`/`Followed` живы. ⚠ Но их СМЫСЛ сузился, и это записано в код: они родились на проводе, который помечал строку и приглашал модель её отвергнуть; теперь неподписанная строка показана законом, отклонение — просто отклонение, а не «модель пользуется дарованным правом». Та же поправка внесена в доккоммент миграции v12, которая эти колонки завела. **Операторские тексты, которые стали бы ложью, переписаны** (не комментарии — то, что печатается человеку): две строки `tmctl` про «уедет к редактору с пометкой ⟨проверить⟩», строка `Unsigned bank terms` в `report`, WARN стопа майнинга, WARN конфликта с подписанным банком. ⚠ **НАХОДКА, которую я НЕ ЧИНИЛ и которая теперь висит на строке 250** (носитель заведён оркестратором): строка данных `ru glossary_header` САМА ОПИСЫВАЕТ снятый маркер («строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты»). После пака помеченных строк на проводе нет, а заголовок продолжает объяснять модели пометку. Это не мёртвая строка данных (`editor_unverified_header` и `unverified_marker` — те просто перестают читаться, и обе оставлены ОБЪЯВЛЕННЫМИ полями, потому что их СТРОКИ остаются в эмбеде, а `parseInjection` отвергает незнакомый ключ), а ЖИВАЯ строка с висячей ссылкой. Чинится только правкой `injection.txt`, то есть ценой `cutTag`. По `D39.104` п.1 клаузула становится ВАКУУМНОЙ, а не ложной; вред не измерен. ## Пункт 4 — строка 140: контур внесён в c1. ЗАКРЫТ с НАЗВАННЫМ предусловием развёртывания **Внесено в `configs/pipeline-c1.yaml`:** `gates.banknote.enabled: true` + `prompt_override: ../prompts/zh-ru/translator-banknote.md` на стадии draft со своим лейблом (`D39.10`: включение банкноты — ДВА согласованных изменения; сам гейт только СРЕЗАЕТ блок, инструкцию писать его несёт промпт) · `gates.terminology` (модель `deepseek-v4-flash`, `reasoning: low` — у рендер-фазы это вынужденно, на вендорском дефолте она сжигает бюджет размышлением и возвращает пустое тело) · `classify_types: true` · `mining.contrast_path`. **Суб-бюджеты — числа и их довод.** Множитель ×4.47 чинит пере-пин цен DeepSeek и ТОЛЬКО его; прежние 0.05/0.02 размерены под десятиглавую пробу, а этот файл обслуживает книги целиком. Замер (строка 16, десять глав, июльские деньги ×4.47): терминолог **$0.0257**, классификатор **$0.0344**. Бюджеты КНИГО-ШИРОКИЕ и копятся по всем прогонам книги (`store.RoleSpentUSD` суммирует чекпоинты роли по всем её джобам), а кандидатное пространство терминолога зависит от того, какие чанки уже отчерновлены, — значит между покупками оно меняется, `request_hash` другой, и книга, проданная десятью покупками, платит десять книжных консолидаций. Пол ⇒ **0.257 / 0.344**. Взято **1.00 / 1.00**, запас **3.9× / 2.9×**. ⚠ **Первая редакция дала классификатору 0.50, то есть запас 1.45×, а комментарий рядом обещал «≈3×» — число одной величины под именем другой. Поймано МОИМ ЖЕ адверсариальным проходом, исправлено: по замеру классификатор ДОРОЖЕ рендера, и «половина» пришла из старых чисел, а не из измерения.** Бюджеты остаются раздельными при равных значениях: разделение про то, чтобы перерасход одной фазы не голодал другую. Пин: `TestTheBankRoleBudgetsClearTheirMeasuredCost` — это ПОЛ, а не значение; поднимать можно свободно, опускать ниже замеренного нельзя. **⛔ ПРЕДУСЛОВИЕ РАЗВЁРТЫВАНИЯ, названное вслух: `mining.contrast_path` — единственный вход контура, которого нет в git.** ОБА банк-роля живут ВНУТРИ стопа майнинга, и `runBankMiningStop` возвращается РАНЬШЕ построения хоть одного кандидата без корпуса контраста. Артефакт (jieba-словарь общей частотности, 5 МБ) под `.gitignore` намеренно, но ВОСПРОИЗВОДИМ — рецепт и sha256 запинены в `docs/experiments/16-bank-mining.md`. Носитель требования к рантбуку и слово оператора — строка **251** (заведена оркестратором). **Два гарда, которые делают «настроено и мертво» невозможным** — и оба нашлись не по заказу, а по разбору: 1. Загрузка отказывает, если гейт включён, а `mining.contrast_path` ПУСТ (`internal/config/pipeline.go`) — тот же класс «гейт, который не может выстрелить», который лоадер ловит везде. 2. Наличие ФАЙЛА проверяется на ПИШУЩЕМ пути, рядом с `CheckKeys` (`Pipeline.CheckMiningContrast`, вызов в `openRunner` внутри `forWrite`). Место выбрано не случайно: `os.Open` внутри прогона стоит ПОСЛЕ оплаченной черновой волны, то есть развёртывание, забывшее артефакт, платило бы за волну, чтобы это узнать. $0-поверхности не трогаются (`D20.4`). 3. ⚠ **ТРЕТИЙ гард добавлен по находке адверсариального прохода, и он закрывает дыру в моих же первых двух.** У раннего возврата ДВА условия, и я гейтил только одно: `r.pack == nil` — а нил-пак книга получает, если не объявила `langpack_root` вовсе или объявила корень без каталога своей пары («nil-and-run»). Такая книга могла нести полностью настроенный и забюджетированный контур и не исполнить из него ни строки. Конфиг-лоадер этого структурно не видит: гейт знает пайплайн, пак знает книга, и вместе они есть только в раннере. Отказ добавлен там, тоже только на пишущем пути. ## Пункт 5 — строка 184(а): жанр выкинут. ЗАКРЫТ `grep -rl '{{genre}}' backend/prompts/ | wc -l` → **6 → 0**. Поле снято из канона брифа (`BriefHash`), `{{genre}}` снят из плейсхолдеров `pipeline.Render` — значит промпт-пакет пары, написанный позже с этим маркером, падает ГРОМКО на первом рендере, а не подставляет пустоту. Репо-гейт на ту же вещь: `TestNoShippingPromptAsksForTheGenre`. **`BriefHash` двинулся у ВСЕХ книг** (`c2021b1b…` → `4624529b…` на голден-фикстуре) — это заказано `D39.138` п.2в и внесено в общее окно пере-снапшота именно потому, что платится один раз со всем батчем. ⚠ **Ключ `genre:` ОСТАВЛЕН ПРИНИМАЕМЫМ, и это не мягкость.** Платформа пишет книге `book.yaml` ОДИН раз из шаблона оператора и никогда не перезаписывает, протаскивая незнакомые ключи насквозь — `genre` там назван явно (`platform/deploy/README.md`). Декодер движка строгий (`KnownFields`), поэтому удаление поля отказало бы в загрузке книгам, которые уже лежат на диске, посреди живого прогона соседней сессии. Идиома — та же, что у ретированного `adult: false`. Значение не читается ничем: `TestARetiredGenreKeyStillLoadsAndReachesNothing` держит и загрузку, и равенство `BriefHash` у двух книг, отличающихся только жанром. ⚠ Лейблы промптов бампнуты и леджер пере-записан (`v1-reflow` → `v2-reflow-nogenre`, `v3-discourse-reflow` → `v4-discourse-reflow-nogenre`): байты промптов уехали, а лейбл обязан следовать за ними — иначе два прогона под одним лейблом несравнимы, что этот гейт и ловит. **Тем же касанием в свип леджера добавлен КЛАССИФИКАТОР:** он был вне его, пока ни один боевой конфиг его не включал, а его промпт решает КЛАСС термина, то есть маршрутизирует имя в транскрипцию, а реалию в перевод. ⚠ `genre: ранобэ` НАМЕРЕННО оставлен в `testdata/golden/book.yaml` с комментарием «не прибирать»: это место, где терпимость к ретированному ключу упражняется на каждом захвате. ## Пункт 6 — дофикс чужого пака + ФЧ-7. ЗАКРЫТ ⚠ **Это остаток ЧУЖОГО наряда (`D39.187` п.4), а не мой заказ** — сессия, делавшая тот пак, не пережила рестарт окружения. **(а) Развилка операторской строки прибита со ВТОРОЙ стороны.** Воспроизвёл сам: ДВЕ посадки в новый код `VolumeStop.String()` переживали всё дерево (проверено с `GOFLAGS=-buildvcs=false`, иначе `cmd/tmctl` падает на VCS-штампе копии и маскирует результат) — (1) развилка заголовка всегда истинна, (2) развилка заголовка спрошена про ПЕРЕНОС вместо ОСТАТКА. Обе печатают в смешанном состоянии «reached the END of the book … Still in the book: 1 unit(s) NEVER delivered». Прибито `TestTheStopLineSaysTheGrantHeldWorkBackWhenItDid` — таблицей из ДВУХ строк, потому что две потери теряются на разных состояниях: всегда-истинная падает на любой, а спрошенная-про-перенос только там, где перенос и остаток оба ненулевые. Записи каталога `WB1`, `WB2`. **(б) Граница `bound()` прибита.** `Carried > 0` → `Carried > 1` переживало: существующий тест переносит ДВА юнита. Прогон с ОДНИМ перенесённым на конце книги не отдавал отчёт вовсе — тихий лимит, анти-паттерн `D39.165` §1б. `TestOneCarriedUnitIsStillWorkOutsideTheGrant`, запись `WB3`. **(в) Три числа отчёта — ПРОВЕРЕНЫ И СХОДЯТСЯ на HEAD.** `D39.187` п.4(в) говорит «протухли снова»; пере-снял все три их собственными командами до своей работы: батарея `EXIT=0` с теми же тремя скипами · `^func Test` **1105** · каталог **92**. Отчёт 03.09 называет 1105 и 92. ⇒ пункт (в) закрыт лендингом `f8d3e9a`, и остатка по нему нет. **ФЧ-7 — ВОСПРОИЗВЕДЁН и ПОЧИНЕН. Починка СВЕРХ заказа, объявляю.** Промт заказывал проверку исполнением и починку только при воспроизведении. Первая попытка воспроизведения ПРОВАЛИЛАСЬ и это важно: после потолка фидер `runWave` перестаёт раздавать элементы, поэтому второй воркер паниковать не успевает. Нужна синхронизация, чтобы обе позиции были в полёте, — и тогда воспроизводится ровно как описано: `runWave` отдавал ТОЛЬКО панику, `errors.As(err, &CeilingHalt)` → false, `errors.Is(err, errReserveCeiling)` → false, `terminal()` падал в `failed` и события `ceiling` НЕ писал. Почему это дефект, а не размен: `platform/internal/runs/reconcile.go` читает событие потолка ПЕРВЫМ и дословно говорит «that survives ANY exit: the process may have been killed on its way out, and the fact does not become less true». `PD-113` закрыт ДВУМЯ независимо отказывающими каналами; одна паника забирала оба. Починка узкая: `runWave` присоединяет к панике ТОЛЬКО `*CeilingHalt` — не `context.Canceled` (проверено посадкой: присоединение отмены роняет `TestWaveWorkerPanicSurfacesAsAFailingError`, и правильно, крах не должен читаться как вызванный им же graceful stop); `terminal()` проверяет панику ПЕРЕД потолком, пишет событие `ceiling` и исход `failed`. Код выхода 1 и зеркало «исход = код выхода» не двинуты. Пины: `TestACrashOverACaughtCeilingKeepsBothFacts`, `TestACrashOverACaughtCeilingStillAnnouncesTheCeiling`, `TestACrashJoinedWithACeilingStillExitsAsACrash`. **ПЕРЕ-СКОУП строки 197 — как заказано.** ФЧ-1/4/5 закрыты паком «число согласия» (`D39.187`). **ФЧ-6 сверен кодом и выглядит закрытым**: отказ проекции репортится базисом, отчёт не валится (`internal/pipeline/status.go`, греп `RebillBasisFailed`). **ФЧ-7 закрыт этим паком.** **ФЧ-2, ФЧ-3 и ФЧ-8 НЕ ПРОВЕРЕНЫ НИКЕМ и остаются живым остатком строки** — см. секцию «Что НЕ проверено». --- ## Свобода и её разметка — отчёт ПО КАЖДОЙ строке таблицы промта **«Делай РОВНО так» — исполнено всё, отступлений нет:** порядок 113 → 46 соблюдён (база записана ДО стройки экрана) · СТОП по фикстуре не сработал, все три порога пройдены с запасом · текст заголовка не менялся · статусы строк и подписная таблица не тронуты · нота бита спеку у `FlagCJKArtifact` — флаг СВОЙ · суб-бюджеты ×4.47 как ПОЛ, взято выше с объявленным доводом · жанр снят и из промптов, и из канона брифа · обе посадки дофикса краснеют · ФЧ-7 проверен исполнением (и починен сверх заказа — объявлено) · все запреты «Границ» соблюдены. **«Решаешь сам и аргументируешь» — по каждому пункту решение и довод выше:** развилка производства рода (§1) · второй замок — ВЫНЕСЕН пингом и ратифицирован оркестратором расщеплением, сам не снимал (§1) · данные в 134 — НЕ тронуты, объявлено первой строкой (§3) · числа суб-бюджетов (§4) · форма фикстуры 113 (§2, с названной ценой) · форма тестов и записей каталога · порядок работ (6 → 5 → 3 → 1 → 4 → 2, голден один раз в конце). **Границы:** `manifestVersion`, `StreamVersion`, схема хранилища и версия контракта НЕ двинуты (предъявлено `tmctl manifest`) · новый эмбед-файл не заведён · `FlagCJKArtifact` не переиспользован · семантика переноса слота не тронута · строки 131 · 105(а) · 14 · 119 · 124 · 115 · 160 · 161 · 142 не брались · чужие зоны, `.env` и соседний worktree не трогались. ## Самопроверка исполнением **1. Дифф `^func Test` ПОФАМИЛЬНО.** `grep -rn '^func Test' backend --include=*_test.go | wc -l` → **1105 → 1143**, добавлено 39. **Удалённых имён ОДНО:** `TestEditorSectionFollowsProvenance` — переименование, разбор в шапке. **2. Голден пере-захвачен ОДИН раз, маскированный дифф разобран построчно.** 22 строки провода + 252 версионных. **Диспозиций, флагов и `chunk_status` не двинулось ни одного** (`diff` по этим строкам пуст; 252 строки до и после). ⚠ **Поправка к моей же формулировке, найденная адверсариальным проходом:** сказать «финальные тексты не изменились» было БЫ неверно. `final_text` изменился на всех 8 chunk-строках и `stage_text` на 22 — но ровно на ТОКЕН ХЕША, который фейк-провайдер эхом вкладывает в свой ответ, то есть следствием сдвига запроса, а не сменой вердикта. Точная формулировка: **вердикты не двинулись; каждый финальный текст отличается только эхом хеша запроса.** ⚠ **Вторая поправка того же прохода:** в ГОЛДЕНЕ двинулись `brief_hash`, `classifier_version`, `render_format_version` и `prompt_sha256` ЧЕРНОВОЙ стадии — а `memory_version` и `prompt_version` НЕ двинулись (у фикстуры свой лейбл `v-golden`, а токен фолда неподписанных строк заморожен намеренно). Мой первоначальный перечень осей был шире фактического. `memory_version` двигается на книге с гендерными строками, а не в этой фикстуре. **3. Собственные посадки ВНЕ шести пунктов — 8, механизмом `cmd/tmmutate` на копии дерева.** 6 красных, **2 ПЕРЕЖИЛИ** и НЕ чинены (вне заказа, носитель — строка **252**): `StickyDepth = 2 → 1` не ловит никто · `priorityRank`, отбрасывающий приоритет доверия в бюджете инъекции, не ловит никто. Третья пережившая — `cutTag` без `lang.EmbeddedVersion()` — ПОЧИНЕНА по своей инициативе, потому что на этом компоненте стоит весь довод пункта 3 (`TestTheCutTagActuallyCarriesTheEngineData`, `TestEveryCutInputMovesTheTag`, запись `WB4`; `cutTag` разложен на `cutInputs`/`tag()` — рефактор байт-нейтрален, предъявлено сборками из HEAD и из дерева). ⚠ Методическая заметка, стоившая ложного результата: `tmmutate` на копии дерева НЕ МОЖЕТ судить тесты `cmd/tmctl`, которые собирают бинарь, — копия не git-репозиторий и сборка падает на VCS-штампе, маскируя всё остальное. Гонять копию с `GOFLAGS=-buildvcs=false`. **4. Отдельный проход по СВОЕЙ ГОТОВОЙ работе свежим контекстом — ДВА агента, модель `fable`, оба read-only,** с заданием ФАЛЬСИФИЦИРОВАТЬ шесть заявлений каждый (деньги и провод · вердикты и данные). Ноль не декларирую: они принесли шесть находок, и четыре я починил. **Находки собственного адверсариального прохода — что нашли и что с этим стало:** 1. ⛔ **`bank-apply` СТИРАЛ произведённый род — то есть ровно тот акт, ради которого стоп существует.** `termFromBank` копировал только `Type` и `Aliases`; строка дельты уходила с `gender: ""`, а `loadAutoBank` потом ронял авто-строку как занятый ключ. ПОЧИНЕНО: род переносится вперёд, как переносятся алиасы (это находка движка ОБ СУЩНОСТИ, а решение о РЕНДЕРИНГЕ не просили её выбрасывать); дверь по-прежнему род не ПРИНИМАЕТ. Пин `TestApprovingATermKeepsTheGenderTheEngineProduced`, проверен красным на копии без правки. 2. ⛔ **Мой первый гард пункта 4 закрывал только одно из ДВУХ условий раннего возврата.** Второе — `r.pack == nil`, а нил-пак книга получает без `langpack_root` или с корнем без каталога своей пары. Такая книга несла бы настроенный и забюджетированный контур и не исполнила бы ни строки. ПОЧИНЕНО третьим гардом в раннере (пишущий путь), где гейт и пак есть вместе — конфиг-лоадер этого структурно не видит. 3. ⛔ **`repairReGate` звал `classify` БЕЗ `TargetScripts`** — экран цели на пути ремонта воздерживался, судя везде: починка, вернувшаяся на другом языке, прошла бы ре-гейт, вся работа которого в том, чтобы спросить «это всё ещё пригодный ответ». ПОЧИНЕНО: ре-гейт зовёт тот же классификатор с теми же входами. 4. ⛔ **`classify_budget_usd: 0.50` давал запас 1.45×, а комментарий рядом обещал «≈3×».** ПОЧИНЕНО: 1.00, запас 2.9×, и названо, что по замеру классификатор ДОРОЖЕ рендера. 5. ⛔ **Тест `TestTheLiveEchoGateKeepsItsMeasuredMargin` проходил на фикстуре с ПУСТЫМ off-target классом:** `0/0` = NaN, а любое сравнение с NaN ложно. ПОЧИНЕНО знаменателем-предусловием. Тем же касанием: суррогат целевой стороны привязан к записанному счёту (как уже был исходный), добавлены проверка `target_script_letters ≤ letters` и `TestTheScreenConstantsStillSitWhereTheCorpusPutThem` — константы `langscreen` сверяются с ДАННЫМИ, а не с константами (порог обязан лежать в пустом интервале корпуса, пол улики — не выше самого короткого off-target). 6. ⚠ **`allowshort_wire_test.go` утверждал ОТСУТСТВИЕ маркера — после пункта 3 это утверждение не может упасть.** Заменено на то, что фикстура ещё способна держать: `allow_short` доставляет строку ЦЕЛИКОМ, вместе с её родовой директивой. Плюс поправлены четыре комментария, ставшие ложью: `decisions.go` («род — сид-онли без автопроизводителя»), доккоммент `langscreen` про →en, `BriefHash` про исторический хеш, и три стейл-упоминания маркера в тестах зоны. ## Что НЕ удалось и что НЕ проверено ⚠ Исходов ТРИ, и «не проверено» ≠ «опровергнуто» ≠ «сделано». **НЕ ПРОВЕРЕНО (никем, включая меня):** - **ФЧ-2, ФЧ-3, ФЧ-8 строки 197.** Их я не открывал вовсе. ФЧ-2 — два докстринга `reprice.go` описывают не то, что делает код (детекция перебора односторонняя; «остаток несётся по счёту» неверно). ФЧ-3 — снятый закон approved-only продолжает утверждаться в докстринге теста и в `backend/docs/D15.2-*.md:317`. ФЧ-8 — докстринг `TranslateBook` про «каждый выход через `terminal()`» неверен для паники вне волны · комментарий `dispatchCommands` · шапка рига. Живой остаток строки 197. - **Ничего в этом паке не проверено ПЛАТНЫМ вызовом.** Ни одна модель не вызывалась: санкции на деньги у меня не было и я её не просил. Всё измерено на персистированных чекпоинтах стенда и на фейк-провайдерах. - **Качество рода не измерено.** Что классификатор реально отвечает в третьей колонке на живой книге — не мерено ни разу. Промпт написан консервативно (`none` объявлен самым частым и правильным ответом при нехватке контекстов), но верно ли он определяет пол — вопрос замера, а не стройки. ⚠ Это ПЕРВЫЙ кандидат в следующий полигон-пак: ось рода теперь производит данные, и ложный `male` поедет консистентно через всю книгу — то самое свойство, ради которого консистентность и строилась. - **Экран цели не проверен на живом провале.** Он ловит два образца, которые уже лежат в стенде; поведёт ли он себя так же на СВЕЖЕМ off-target событии — не мерено. Порог 0.50 стоит в пустом интервале и не калиброван (и это по `D39.92` п.1а и не может быть иначе на этом корпусе). - **Цена банкового контура в c1 на реальной книге не мерена.** Числа суб-бюджетов — проекция от десятиглавого замера, не наблюдение. Первый же боевой прогон с контуром даст настоящие числа, и их надо сверить с полом. - **Наличие корпуса контраста на БОЕВОЙ машине.** Я его не видел и видеть не мог. Строка 251. **НЕ СДЕЛАНО СОЗНАТЕЛЬНО (с доводом):** - **Замок №0 не трогал** — базовый банк исключает `Source:"mined"` по денежному контракту `D39.42` п.3. Следствие названо в §1: род не едет на ЧЕРНОВОЙ провод и не поедет, пока цена двух волн не решена отдельно. Не моё решение. - **`ru glossary_header` не тронут** — висячая ссылка на снятый маркер, чинится только правкой `injection.txt`, то есть ценой `cutTag`. Носитель — строка 250. - **Две пережившие мутации не чинены** — вне заказа, носитель 252. - **Строка 204 / `PD-246`: карту причин платформы не правил** — чужая зона. Пинг отправлен напрямую (`textmachine-main-34`), она пере-сняла счёт своей командой и завела у себя; состав контрактного минора несёт оркестратору, потому что изобретать код замечания платформенная сессия не вправе. **НАЙДЕНО И НЕ ЧИНЕНО — ЧУЖИЕ ЗОНЫ (передаю фактом, не правкой):** - ⚠ **Следствие починки ФЧ-7 на стороне платформы, которого я не предвидел.** `pgstore/sink.go` кладёт событие `ceiling` в `paused_reason`, а `runs/reconcile.go:1008` возвращает `paused` с `exit_code = nil`. ⇒ прогон, который УПАЛ поверх потолка, теперь приезжает `paused` и КОД ВЫХОДА теряется — крах становится невидим на строке прогона. Это лучше прежнего для пользователя (ему говорят «добавь денег», и это правда и действие), но хуже для операций. Взвесить и решить — не мне; несу как факт. - ⚠ **Стейл-упоминания снятого маркера вне моей зоны:** `platform/internal/runs/spawn.go:164` (прод-комментарий), `platform/internal/runs/reconcile_test.go:723`, `platform/docs/DEFECT_REGISTER.md:412` (PD-277), `eval/pilot/memory_eval.py:440-452` (заявляет «byte-synced with Go glossaryBlockHeader» и по-прежнему дописывает маркер построчно — зеркало провода в полигоне разъехалось). - ⚠ **`platform/deploy/` ничего не знает о корпусе контраста** (`grep -rn 'contrast_path\|mining:' platform/deploy/` → пусто). Половина строки 251. - ⚠ **Дыра покрытия, найденная платной сессией и переданная мне** (`PD-441`, её ряд): вызов, отменённый В ПОЛЁТЕ по книжному потолку, уходит веткой «No 2xx ever arrived: nothing was billed» → `releaseReservation` и нулевая цена в `request_log`, хотя замер 04.09 показывает отмены на 120756/156469/156470 мс — то есть запрос был выпущен и, скорее всего, оплачен. Латентность разводит два случая (20–31 мс против 156 с). **Я это НЕ чинил: `stagerun.go` в моей зоне, но это ДЕНЕЖНЫЙ путь и отдельный предмет, а не пункт вайр-батча.** Заказ на него — отдельным паком. **ЧЕГО Я НЕ ДЕЛАЛ ПО ГРАНИЦАМ:** не коммитил, индекс и историю не трогал; `platform/` и `eval/` только читал; соседний worktree не открывал; `.env` не читал. ## ДОФИКС ПО ПРИЁМКЕ (04.09) — четыре пункта наряда, все закрыты ⚠ **Класс, который приёмка вскрыла и которого моя самопроверка не нашла: СЕМЬ ЗАЯВЛЕННЫХ ГАРАНТИЙ СУЩЕСТВОВАЛИ ТОЛЬКО КАК КОД.** Двенадцать её посадок пережили полную батарею. Это ровно образец `D39.187` — тот же дефект, что этот пак чинил у чужого пака, повторённый мной. И нашёлся он там, где я сам сказал «ставь гуще», то есть карта слепых зон работает; чего у меня не было — это привычки сажать мутации на СВОЙ новый код, а не только на соседний. **Д1 — пять неприбитых гарантий прибиты, каждая тестом И записью каталога (`WB5`–`WB13`, каталог 96 → 105, все красные одним прогоном).** · **F2, тяжелейшая: живая доставка строки 46 не была прибита вовсе** — `grep -rn 'FlagOffTargetLang' --include=*_test.go` давал ПУСТО. Модуль экрана был прибит офлайн (по руносчёту фикстуры) и по своему пакету, а вердикт, ради которого он построен, на живом пути не проверялся ни разу: переживали и «экран всегда воздерживается» (`Screen(out, nil)`), и «`chunkrun` не передаёт `TargetScripts`», и **снятие флага из `escalatable()` — прямое требование `D39.93` п.2, без которого пойманный чанк молча ТЕРЯЕТСЯ вместо пере-атаки**. Прибито: `TestAnOffTargetCompletionIsFlaggedAndEscalated` (вердикт + деталь + `escalatable` + `!retryable` + эхо остаётся эхом), `TestTheScreenIsInertWithoutTargetData`, `TestTheRunnerHandsTheScreenItsData` (через `classifyOutput` — ЕДИНСТВЕННЫЙ живой call-site, плюс исключение обеих банк-ролей). · **F10: порог экрана не был ИСПОЛЬЗОВАН ни в одном тесте** — случая с долей между границами не было, то есть константа могла быть любой. `TestTheOffTargetThresholdIsUsed`: 0.60 → ok, 0.40 → флаг. · **F1: три гарда контура** — `TestABankContourThatCanNeverFireIsRefused` (лоадер судит КЛЮЧ и не судит ФАЙЛ) и `TestTheContourRefusesAWriteRunItCannotExecute` (обе половины раннего возврата: отсутствующий артефакт и нил-пак; с ПРЕДПОСЫЛКОЙ, что до порчи фикстура открывается, и с обязательной проверкой, что `$0`-чтение той же книги ПО-ПРЕЖНЕМУ работает — `D20.4`). · **F5: гард `TargetScriptNonLatin` в санитайзере** — `TestTheLatinResidueClassIsGatedOnTheTargetsOwnScript`, обе стороны. ⚠ Названная узость: `target-en.txt` в репо нет, поэтому «латинописьменная цель» достижима только через ПУСТОЕ объявление (та же ветка `wordScript == nil`); строку с настоящим `word_script latin` тест получит в день, когда такая цель появится. · **F6: исключение банк-ролей** прибито было только юнитом на `isBankRole`; регресс до «терминолог-only» оставлял батарею зелёной. Теперь ловится через `classifyOutput` (`WB7`). **Д2 — $0-валидация плейсхолдеров ДО первого вызова. ДЕНЬГИ.** Приёмка подтвердила исполнением то, что я принёс и не починил, сочтя вопрос про громкость: отказ на `{{genre}}` приходил ПОСЛЕ купленной черновой волны (`stage=draft cost_usd=0.001820`, `edit wave started`, затем отказ; `drafts=1 edits=0`). **Вопрос был про МОМЕНТ, и я его не расслышал.** Построено: `CheckPlaceholders` сканирует шаблон по тому же ЗАКРЫТОМУ набору, что подставляет `Render` — набор вынесен в одно определение (`renderVals`), потому что два списка это и есть способ, которым валидатор благословляет имя, которое рендер отвергнет. Вызов стоит в `LoadPromptTemplate` — единственной воронке, через которую проходят ВСЕ шаблоны: стадии, классы репэйра и обе банк-роли. Живой источник таких пакетов настоящий: `grep -rl '{{genre}}' eval/ | wc -l` → **27**. ⚠ **Заказанная смена поведения, объявляю (D39.183):** `TestRenderRejectsUnknownPlaceholder` описывал отказ ОТ `Render`; отказ переехал на загрузку. Тест не ослаблен — он теперь держит ОБА рубежа (гейт на загрузке И собственный отказ `Render`), плюс что закрытый набор проходит целиком, плюс что отказ НАЗЫВАЕТ и маркер, и то, что движок принимает. **Д3 — закон-блок даёт ОДИН приказ на исходный термин. Ратификация исполнена ровно так.** Дедуп переведён с `(src,dst)` на `src`. Довод, который я принимаю целиком и не смягчаю: пока у блока было два заголовка, две передачи одного термина были двумя РАЗНЫМИ высказываниями — «это канон» и «это неподтверждённый рабочий вариант»; **мой же пункт 3 схлопнул их в два ПРИКАЗА об одном термине**, а с разными родовыми директивами — в два противоречивых приказа об одном персонаже. Побеждает первая строка, и «первая» тут не случайность: `Select` отдаёт в приоритетном порядке, `priorityRank` ставит `Confirmed` раньше `Ambiguous` — то есть подписанная. Конфликт не спрятан, а РАЗВЕДЁН: движок уже пишет о нём WARN оператору (`seeding.go`), и это правильное деление — **модель получает один закон, оператор получает разногласие**. Отбрасывание строки на загрузке не бралось: это онтология банка, а нужна была узкая правка провода. Пин `TestTheLawBlockGivesOneOrderPerSourceTerm` кормит неподписанную строку ПЕРВОЙ (дедуп, хранящий первую строку ВХОДА вместо первой строки приоритета, прошёл бы фикстуру в естественном порядке) и отдельно держит, что ГОМОНИМИЧНЫЙ dst — два разных исходных термина — остаётся двумя строками. **Д4 — числа отчёта поправлены.** F7: «ноль ложных на 1132» заменено на воспроизводимое над репозиторием — **ноль ложных на 44 ТРУДНЫХ здоровых**, с явным разделением «обход дал 1162/1132» и «в git уехала выборка 74 строк», и с описанием, как выборка отобрана. Это ровно класс «число одной величины под именем другой», который я чинил в пункте 4 и повторил в своём же отчёте. F8: расхождение шапки и секции самопроверки (1133/29 против 1135/31) снято — обе теперь **1143**, добавлено 39. ⚠ **F11 — РИСК ДИЗАЙНА, не чинен, называю (вход в калибровку).** На латино-тяжёлом ЗДОРОВОМ русском экран цели даёт ложные `off_target`: русский с пиньинь-глоссами → 0.461, инструкции с shell-командами → 0.077. Ложный флаг ЭСКАЛИРУЕТСЯ, то есть стоит платного вызова. Корпус, на котором порог поставлен, — ОДНА сянься-новелла; жанр с системными окнами, кодом или плотной латинской терминологией не мерен вовсе. **Перед первым платным прогоном книги другого жанра порог обязан быть пере-калиброван на её корпусе.** Это не опровержение экрана (на измеренном жанре ноль ложных на трудных), это граница его калибровки. **Батарея после дофикса:** `MAKE_EXIT=0`, `0 issues`, 19 пакетов `ok`, скипы те же три. **Голден пере-захвачен — 0 изменений** (дофикс не двинул ни одного байта провода в фикстуре). Тесты **1105 → 1143**, удалённых имён по-прежнему одно и то же переименование. Каталог **92 → 105**, записи `WB1`–`WB13` красные. ## КРУГ 2 ПЕТЛИ (`D39.191`) — НЕ ЗАМКНУЛСЯ: веер нашёл 21 пережившую посадку, все закрыты. Круг 3 обязателен ⚠ **Условие замыкания жёсткое, и оно не выполнено:** круг замыкается, только когда проход с НЕПУСТЫМ веером не нашёл ни одной пережившей посадки. Этот нашёл двадцать одну. Ниже — веер, все находки с диспозициями, что я перепроверила сама, и чего круг не покрыл. ### Веер **Три источника, разные ракурсы.** (1) Агент `fable`, read-only — ДОФИКС, которого свежий контекст не видел: `CheckPlaceholders`, дедуп по `src`, новые тесты гардов и экрана на ВАКУУМНОСТЬ. (2) Агент `fable`, read-only — НЕПОКРЫТОЕ, ровно по моему же списку слепых зон: `volume.go` (пункт 6, чужой дофикс), закон-блок на книге с НЕПОДПИСАННЫМИ строками, бласт-радиус `InjectionTrust`, свип леджера, мелкие поверхности. (3) **МОИ собственные посадки — В ДАННЫЕ**, чего в круге 1 не было вовсе: фикстура корпуса, `prompt-labels.json`, `pipeline-c1.yaml`, промпт классификатора, `injection.txt`. **Посадок всего: 12 моих + ~26 агента A + ~60 агента B.** Мои: 11 красных, 1 пережила. ### Что нашлось — двадцать одна пережившая, по классам **А. ЖИВОЙ ДЕФЕКТ, внесённый моим же дофиксом (1).** · **Дедуп закон-блока по голому `src` ронял ВТОРУЮ ПОДПИСАННУЮ строку.** Ключ уникальности банка — `(src, sense, since, until)`, то есть одна поверхность законно несёт несколько подписанных канонов: 青山-фамилия и 青山-направление. Мой дедуп выбрасывал один из них МОЛЧА, при том что трансляторный блок продолжал рендерить оба — два провода разъезжались. Правило исправлено на то, чем оно должно было быть с самого начала: **уступает НЕПОДПИСАННАЯ строка, и только подписанной; подпись не роняется никогда.** Пин красный на возврате к старому ключу. **Б. ДЕНЬГИ (2).** · **`ReachableModels` не знал банк-ролей.** `buildClients` пре-строит именно этот список, `CheckKeys` требует именно эти ключи — оба на ОТКРЫТИИ. Модель терминолога или классификатора, не заведённая в `models.yaml` или без ключа в окружении, проходила ВЕСЬ преflight и убивала прогон на стопе майнинга — после купленной черновой волны. Латентно, пока контур не жил в боевом конфиге; пункт 4 делает это живым. · **Банкнотный канал покупает вывод, который на этой конфигурации никто не прочитает** — единственный читатель за ранним возвратом. Не отказ (прогон корректен, срез делает свою работу), а предупреждение с ценой. **В. УТВЕРЖДЕНИЯ О СТРУКТУРЕ, ВЫДАННЫЕ ЗА ГАРАНТИИ (4) — класс, которого я в круге 1 не назвала.** · «валидатор и рендер читают одну таблицу» — прибито только ПРИМЕРАМИ; валидатор-надмножество проходил всё; · «проверка стоит в единственной воронке и покрывает все пути» — **все четыре пути загрузки промптов обводятся вокруг гейта, батарея зелёная.** Моя же формулировка из отчёта по Д2; · «порог лежит в пустом интервале» — порог 0.50 → 0.45 переживает всё И НЕ ДВИГАЕТ ВЕРСИЮ: резюмнутый чанк пере-судился бы по порогу, за который никто не платил. ⇒ `langscreen.Version` теперь ВЫВОДИТСЯ из констант, `classifierVersion` стал var, правка порога роняет голден по построению; · «свип леджера покрывает обе банк-роли» — свип ходил по НАЙДЕННОМУ и никогда по ЗАПИСАННОМУ, поэтому удаление роли из свипа оставляло её запись сиротой, а промпт — неприбитым. ⇒ проверка сирот. **Г. ДАННЫЕ (1) — и это то, ради чего норма про посадки в данные написана.** · **Фикстура корпуса, размягчённая до красивого числа, проходила всё.** Тест утверждает пол «не меньше 3×», а пол не измерение: обнуление исходных рун у ЕДИНСТВЕННОГО худшего здорового образца оставляло батарею зелёной и рапортовало запас ЛУЧШЕ, чем корпус когда-либо давал. ⇒ леджер записанных чисел (30/44 строк · 0.011655 · 0.976706 · 346 букв), по образцу леджера лейблов: пере-взять корпус законно, но это стоит правки здесь и фразы в отчёте, а не ничего. **Д. РАСЩЕПЛЕНИЕ `Disp`, прибитое только там, где две половины СОВПАДАЮТ (3).** · липкий перенос, ПЕРЕ-ВЫЧИСЛЯЮЩИЙ матч-доверие, переживал всё: единственный пин использует строку, чей `src` И ЕСТЬ сработавший ключ, поэтому пере-вычисление совпадает с наследованием. Разводит их строка с ханьским `src` и коротким фонетическим АЛИАСОМ — там перенос re-trusted, и род едет к сущности, которой на странице может не быть; · липкий перенос, ВЫВОДЯЩИЙ доверие из диспозиции, тоже переживал: неподписанная строка на чистом ключе теряет род в момент переноса — дверь строки 210 в липкой форме; · диспозиционная ось `priorityRank` не отличима от статусной ни одной фикстурой. Это одна из ДВУХ, переживших круг 1, и теперь на ней стоит мой дедуп. ⇒ прибита состоянием, которое оси разводит: две ПОДПИСАННЫЕ строки, одна на collision-prone ключе, под связывающим бюджетом. **Е. ЧУЖОЙ ПАК (пункт 6), которого свежими глазами не видел никто (6).** Из двадцати посадок в `volume.go` шесть пережили, и все шесть — в ОПЕРАТОРСКОМ ПРЕДЛОЖЕНИИ и в двух неотфикстуренных ветках `reconcile`: счёт «%d paying output unit(s)» без флагнутых (недо-счёт того, за что заплачено) · клауза про $0-попутчиков · развилка головы, спрошенная про `LeftFresh` вместо `Left()` · свободный юнит, флагнувшийся на резюме, посчитанный оплаченным · пере-деланный юнит, флагнувшийся и оставшийся В ОБОИХ счётчиках · и **порядок `bound()` ДО `reconcile`, от которого корректность отчёта зависит СЛУЧАЙНО**. Прибиты пятью тестами; последний — документирован в `waverun.go` с прямым указанием, какой «естественный рефактор» его сломает. **Ж. Прочее (4):** липкие записи, исчезающие из закон-блока · глубина липкого окна · сироты леджера · `injection.txt` без родовой строки (последнее — уже красное, поймано `TestDC3GenderInjection`). ### Что я перепроверила сама, а что взяла со слов **Перепроверила посадкой ДО починки (все, кроме одной):** дедуп по `src` · порог экрана · валидатор-надмножество · обход воронки на пути классификатора · диспозиционная ось · липкий перенос (обе формы) · сирота леджера (обе формы) · липкая запись в закон-блоке · банкнотный канал · размягчённая фикстура. **Взяла со слов:** `H2` (два ряда с одним id — недостижимо через стор), `H7` (битый артефакт контраста молча даёт пустой контраст), и стейл-текст `glossary_header` — про него я уже знала. ⚠ **И одна собственная ошибка, которую поймал каталог, а не я:** первая редакция теста про `ReachableModels` читала `pipeline-c1.yaml`, где модель банк-роли СОВПАДАЕТ с моделью черновика, — то есть тест не мог упасть. Посадка сказала `SURVIVED`, я переписала тест на конфиг, где банк-модель своя. **Механизм проаудировал мой пин; чтение бы не проаудировало.** ### Чего круг НЕ покрыл - **Пункт 5 (жанр) и цепь рода end-to-end** — ни один агент их не атаковал: я дала им дофикс и непокрытое, считая эти два закрытыми кругом 1. Остаются проверенными одним проходом. - **`$0`-проекции на дефектной книге** — `status`/`report`/`export`, реально отрендеренные: и мой тест, и посадки доказывают только, что КОНСТРУКТОР открывается. - **Липкий перенос до РЕДАКТОРСКОГО провода сквозным прогоном** — ни одна фикстура не гонит прономинальный чанк с переносом в edit-юнит; всё прибито на уровне `membank`. - **Настоящая латинописьменная цель** — `target-en.txt` в репо нет; ветка достигается пустым объявлением, и тест это говорит. - **`eval/`-харнессы** — вне модуля бэкенда, не гонялись. - **Сверка двух агентов между собой** — снова не делалась. ### Числа круга Батарея `MAKE_EXIT=0`, `0 issues`, 19 пакетов, скипы те же три. **Голден БАЙТ-ИДЕНТИЧЕН** тому, что был до починок круга (единственное движение голдена за круг — `classifier_version` от вывода версии экрана из констант; вердикты не двинулись). Тесты **1105 → 1156**. Каталог **92 → 120**, записи `WB1`–`WB29` красные одним прогоном. Удалённых имён по-прежнему одно — переименование `TestEditorSectionFollowsProvenance`. ## Файлы **Изменены:** `internal/pipeline/{disposition,chunkrun,waverun,events,manifest,mining,terminologist,repair,render,runner}.go` · `internal/membank/{memory,mempostcheck,decisions}.go` · `internal/terminology/{terminology,classify}.go` · `internal/miner/miner_emit.go` · `internal/checks/sanitizer.go` · `internal/config/{book,pipeline}.go` · `internal/lang/embedded.go` · `internal/store/migrate.go` · `cmd/tmctl/render.go` · `cmd/tmmutate/mutations.json` (92 → 96) · `configs/pipeline-{c1,c2,arm-*}.yaml` · `prompts/zh-ru/*.md` (шесть — жанр; `classifier.md` — третье поле) · `example/book.yaml` · тесты и голден. **Новые:** `internal/langscreen/{langscreen,langscreen_test}.go` · `internal/pipeline/{cuttag_test,gender_wire_test,offtarget_corpus_test,volumepanic_test,offtargetflag_test,contourpreflight_test}.go` · `internal/pipeline/testdata/offtarget-corpus.json` · `internal/config/{bank_contour_test,genre_retired_test}.go` · `internal/checks/latinguard_test.go`. ## Команды приёмки ``` cd backend && make battery # MAKE_EXIT=0, 0 issues, 19 пакетов ok, 3 скипа go test ./internal/pipeline/ -run 'Gender' -v # производитель рода, три двери доставки go test ./internal/pipeline/ -run 'OffTargetCorpus|LiveEchoGate|LatinOffTarget|TargetScreen|TwoScreens|ScreenConstants' -v go test ./internal/langscreen/ -v # изолированный модуль экрана go test ./internal/config/ -run 'BankContour|BankRoleBudgets|Genre' -v go test ./internal/membank/ -run 'ApprovingATermKeeps|LawBlockGivesOneOrder' -v # род переживает подпись; один приказ на термин go test ./internal/pipeline/ -run 'OffTargetCompletionIsFlagged|RunnerHandsTheScreen|ThresholdIsUsed|ContourRefusesAWriteRun|RenderRejectsUnknownPlaceholder' -v go test ./internal/checks/ -run 'LatinResidueClassIsGated' -v # вторая половина дыры 46, обе стороны go test ./internal/pipeline/ -run 'ACrashOverACaughtCeiling|StopLineSaysTheGrant|OneCarriedUnit' -v cp -a backend /tmp/mut/backend && cd /tmp/mut/backend && GOFLAGS=-buildvcs=false \ go run ./cmd/tmmutate -root . -id WB1-head-always-end-of-book,WB2-head-keyed-on-the-carry,WB3-bound-border-drops-a-single-carry,WB4-cut-tag-drops-the-embedded-data,WB5-target-screen-never-sees-the-target,WB6-off-target-flag-not-escalatable,WB7-bank-role-exemption-narrows-to-one-role,WB8-latin-residue-runs-on-a-latin-target,WB9-contour-configured-and-inert,WB10-missing-contrast-costs-a-wave,WB11-nil-pack-contour-never-runs,WB12-two-orders-for-one-term,WB13-placeholder-refusal-arrives-after-a-paid-wave grep -rl '{{genre}}' backend/prompts/ | wc -l # 0 grep -rn '^func Test' backend --include=*_test.go | wc -l # 1143 python3 -c "import json;print(len(json.load(open('backend/cmd/tmmutate/mutations.json'))))" # 105 ``` ### 04.09 — записка-план вайр-батча «род · экран цели · заголовки инъекций» (промт `BACKEND_WIREBATCH_SESSION_PROMPT.md`, сессия `textmachine-main-7e`) > **Скоуп — шесть пунктов промта.** (1) 210: род производится авто-путём, доказательство сквозным прогоном «произведено → отрендерилось». (2) 113 → 46 в этом порядке: корпус-фикстура и регресс на реальный запас боевого гейта, потом экран цели именованным флагом + вторая половина дыры `detectLatinInsertion`. (3) 134: единый закон-блок редактора, маркер ⟨проверить⟩ с провода, то же у транслятора. (4) 140: банковый контур в `pipeline-c1.yaml`, суб-бюджеты ×4.47. (5) 184(а): `{{genre}}` из шести промптов пары и поле из канона брифа. (6) ДОФИКС чужого пака D39.187 п.4 (две посадки + граница `bound()` + три числа) и ФЧ-7 строки 197 — ПРОВЕРКОЙ, не стройкой. > **Инварианты.** Не коммичу — дерево на лендинг оркестратору. НЕ двигаю: схему хранилища · `manifestVersion` · `StreamVersion` · версию контракта. Новый эмбед-файл не завожу. `FlagCJKArtifact` не переиспользую (снято D39.93 п.2). Статусы строк и подписная таблица в 134 не трогаются (D39.104 п.1). Семантику переноса слота не трогаю. Текст заголовка редактора не меняю — он байт-идентичен арму `AM-noclause` пробы 18 (`experiments/18-editor-wire-probe.md` §0.3). > **Развилки, объявленные ДО кода.** (1) род — производится КЛАССИФИКАТОРОМ (третье поле его ответа), а не терминологом и не третьим проходом: ноль новых вызовов, парсер классификатора позиционный и закрыто-словарный. (2) Второй замок (`Confirmed`-фильтр рендера рода) — вынесен пингом оркестратору на ратификацию, сам не снимаю. (3) 134 — снимаю РЕНДЕР в Go, `internal/lang/data/injection.txt` НЕ трогаю: правка данных двигает `EmbeddedVersion` → `cutTag` → `manifest_key` → снос `unit_resolutions` книги ПАРАЛЛЕЛЬНОГО платного прогона платформы. > **Что НЕ делаю.** Чужие зоны `platform/` `frontend/` `eval/` и соседний worktree. Строки 131 · 105(а) · 14 · 119 · 124 · 115 · 160 · 161 · 142. > **Самопроверка исполнением.** Дифф `^func Test` пофамильно до/после (удалённых имён 0) · маскированный дифф голдена (только названные версионные оси + ровно две строки диспозиций) · собственные посадки `tmmutate` ВНЕ шести пунктов на копии дерева · отдельный адверсариальный проход свежим контекстом (модель назову) · отчёт о движении `cutTag`: `tmctl manifest` до и после. ### 02.09 — эхо-записка пака «число согласия на пути второй покупки» (промт `BACKEND_CONSENT_SESSION_PROMPT.md`, сессия `textmachine-77`) > **Канала к оркестратору нет:** адрес в `/tmp/textmachine-channel` (`textmachine-33`) в `ListAgents` отсутствует, промт писан на другой машине — вопросы едут секцией отчёта ниже. Дерево на входе чисто, HEAD `494c4ef`; все `file:line`-якоря промта сверены грепом на этой машине и сходятся. > **Скоуп — четыре пункта в порядке промта:** (1) ФЧ-5, ось МОДЕЛИ: строка прайсится по модели, которую её стадия резолвит СЕЙЧАС (`Stage.ResolvedModel`); округление вверх при незнании = максимум из цен по ответившей модели, по текущей и — для эскалационных вызовов — по текущему хопу; оговорка «оценка, ошибается вверх, вот чем» в ОБОИХ текстах согласия; обещание точности снимается в `status.go` (комментарий у `RebillUSD`) и в шапке `reprice.go`. (2) Строка 232, остаток «слот»: юнит, который прежний прогон НАЧАЛ (есть строки текущих позиций) и не отгрузил по оси `finalStageWave`, слота гранта повторно не тратит — дописывается вне гранта, считается отдельно. (3) ФЧ-4 обе половины: `rebill_historical_rows` в `status --json` под тем же `rebill_basis` + basis в тексте отказа `--accept-rebill=`; одна формулировка basis для CLI-статуса и текста отказа. (4) ФЧ-1: ровно три названные гарантии — сперва воспроизвести мутацию на копии и увидеть зелень, потом посадка тестом + запись в `cmd/tmmutate/mutations.json`. > **Инварианты:** направление ошибки — никогда не занизить молча (D39.150) · `status` и `translate` — ОДИН вывод · фигура едет с базисом (D39.181 п.1) · ось отгрузки = `finalStageWave`, не draft и не «любая» · схема хранилища, форма манифеста, версия контракта НЕ трогаются · тесты не подгоняются, заказанная смена поведения объявляется (D39.183). > **Не делать:** строки 160 · 221 · 224 · 226 · 228 · 230 · 246 · 247 · 233 · 229 · 141-остаток · 131 · платный замер · новое поле в кадре `finished` шва (класс «поле в опубликованном документе» — ратификация оркестратора; счётчик «дописан вне гранта» живёт в отчёте прогона и логе, вопрос — в отчёт) · коммиты. > **Самопроверка исполнением:** дифф `^func Test` (база 1083, снимок имён снят) · собственные посадки `tmmutate` на копии в scratchpad · свежий адверсариальный проход субагентами Fable 5 (число назову) · `make battery` на копии до и на дереве после. ### 03.09 — ОТЧЁТ пака «число согласия на пути второй покупки» (сессия `textmachine-77`, промт `BACKEND_CONSENT_SESSION_PROMPT.md`) > **Итог:** четыре пункта состава исполнены, дерево `backend/` готово к лендингу, **НЕ КОММИЧУ** (`git diff --cached --name-only` → пусто). HEAD на входе `494c4ef`; после согласованного с платформой (`textmachine-37`) `git pull --ff-only` — **`2a63c37`**. Входящее (72 файла) не пересекалось ни с одним моим файлом, кроме `docs/PROGRESS.md`: свою записку сняла редактором, дала git пройти fast-forward, вернула. Индекс не трогала, stash не применяла. > **Канала к оркестратору нет:** `textmachine-33` в `ListAgents` отсутствует, промт писан на другой машине — вопросы секцией ниже. Все `file:line`-якоря промта сверены грепом здесь и сошлись. > **Батарея на финальном дереве:** `cd backend && make battery` → `MAKE_EXIT=0`, `golangci-lint` `0 issues`, `ok` в 18 пакетах, SKIP: `TestMinerFullBookParity`, `TestHelperEventsRun`, `TestHelperKillLoop`. ⚠ Скипов ТРИ, а не шесть как в базовом прогоне, и это не ослабление: `TestCheckerLabelsBaseline`/`TestCheckerLabelsCandidates`/`TestK6LabelsBaseline` в реальном дереве корпус находят и ИДУТ — `go test ./internal/checks/ -run TestCheckerLabelsBaseline -count=1 -v` → `--- PASS`, `go test ./... -run TestK6LabelsBaseline -count=1 -v` → `--- PASS`. Базовый прогон гнался на копии в `/tmp`, где маркер корня репозитория не находится. > **Тесты `^func Test`:** `grep -rn '^func Test' backend --include=*_test.go | wc -l` → **1083 → 1105**; пофамильный дифф двух снимков (`comm -23`) — **удалённых 0**, добавленных 19. **Комплектность против заказа — по четырём пунктам и по таблице разметки.** **1. ФЧ-5 — ось МОДЕЛИ. Все ЧЕТЫРЕ обязательства D39.150 п.1.** - **(1) прайс по модели, которую стадия резолвит СЕЙЧАС.** `internal/pipeline/reprice.go`, `currentModelFor(stage, escalation)`: для эскалационного вызова — текущий `ResolvedHop`, иначе `ResolvedModel`. **Именно РЕЗОЛВЕННЫЙ слот, а не конфигурационный `model:`** — на книге с лейблами это разные модели, и прайсить надо по той, которую прогон вызовет (пин `TestTheModelAxisReadsTheRESOLVEDSlotNotTheConfiguredOne`, каталожная запись `FC5-model-axis-configured-slot`). Признак эскалации взят из колонки `checkpoints.escalation` полем `store.CheckpointUsage.Escalation`; **схема НЕ тронута** (`git diff --stat -- backend/internal/store/migrate.go` → пусто), колонка живёт с v3. - **(2) округление ВВЕРХ при незнании — формула моя.** `now = max( cost(токены @ модель, которая ОТВЕТИЛА), cost(токены @ модель, которую стадия резолвит сейчас) )`. Довод: количество токенов принадлежит ответившей модели, цена — той, которая ответит; ни одна не смеет опустить число ниже другой. Оба направления проверены исполнением: стадия ушла на модель ×10 — число ×10 (замер приёмки `$0.003640` против `$0.036400` воспроизведён тестом); стадия ушла на модель ÷10 — число НЕ падает. База порога `projectBookUSD` считается тем же `usd()`, поэтому обе половины гейта в одной валюте. - **(3) оговорка в тексте согласия.** `projectionBasis` (`rebill.go`): «…an ESTIMATE that errs upward, never below what the answering model would charge for the same tokens **where their usage is on file**; K of the N unit(s) were **bought from** a model their stage no longer resolves to…». Едет в ЧЕТЫРЁХ операторских местах: пороговый отказ, его scoped-клауза, отказ по названному потолку, и `tmctl status` через `StatusReport.RebillFigureBasis()`. - **(4) обещание точности СНЯТО в ОБОИХ живых местах, названных промтом.** `git grep -n 'can never quote a different number' -- backend/` → пусто; на входном коммите `git grep -n 'can never quote a different number' 2a63c37 -- backend/ | wc -l` → **1** ⚠ (в первой редакции отчёта стояло «3» — число было снято широким грепом на три разных шаблона и приписано этому, узкому; исправлено дофиксом); `grep -rn 'NOT projected (like the content axis' backend/internal` → пусто. Заменено: шапка `reprice.go` — «ROUTING IS PROJECTED, AND IT ROUNDS UP»; комментарий `RebillUSD` в `status.go` — «what neither of them promises is ACCURACY… an estimate that errs UPWARD **where the tokens are known**». Третья копия обещания (исторический комментарий у `projectStoredMemory`) снята попутно. - **Решила сама, сверх буквы заказа:** счётчик `RebillProjection.ModelMovedRows` и поле `rebill_model_moved_rows` в `status --json`. Довод: фигура, часть которой — верхняя оценка через смену модели, без этого числа неотличима от точного пере-прайса, а D39.181 §2.3 требует базиса у опубликованной фигуры. Это ВТОРОЕ новое поле сверх названного промтом одного — вопрос 3. **2. Строка 232, вторая половина — ЗАКРЫТА ТОЛЬКО ПО ОСТАТКУ «СЛОТ».** - **Ось отгрузки — `finalStageWave`**, как велено; не draft и не «любая». Проверена исполнением и на редакторском, и на ЧЕРНОВОМ-ТОЛЬКО конвейере (`TestDeliveryIsReadFromTheSHIPPINGWaveOnADraftOnlyPipeline`, `TestACarriedUnitOnADraftOnlyPipeline`). - **Механизм.** Класс `unitCarried` в `volume.go`: юнит, у которого есть строка ХОТЯ БЫ ОДНОЙ позиции, исполняемой этим конвейером, но не всех, и который не отгружен по оси. Он допускается ВНЕ гранта, но платит; в отчёте — внутри `Delivered` и отдельно в `Carried`. Сравнение с потолком — `granted() = Delivered − Carried + Reworked`, заменило `Paid()` в ОБОИХ местах (`planVolume`, `rescopeEditWave`). - ⚠ **И сам перенос ОГРАНИЧЕН ГРАНТОМ — не больше `MaxUnits` перенесённых за прогон, в порядке книги.** Без этой границы потолок переставал быть потолком: прогон без `--max-units`, начерновивший всю книгу и умерший до редакторской волны, отдавал следующей покупке ВСЕ свои юниты. Замерено на фикстуре: **грант 1 оплачивал 5 юнитов и 5 вызовов провайдера**, а поскольку в остатке не оставалось ничего, прогон не отчитывался вовсе. Найдено адверсариальным проходом по МОЕЙ ЖЕ работе. Принцип границы, а не число: покупка на N может дописать столько же прерванных юнитов, сколько начинает новых, — работа прогона остаётся пропорциональна гранту. Не влезшее держится как `LeftFresh` («никогда не доставлено»), потому что это ровно оно. - ⚠ **`bound()` теперь истинен и когда `Carried > 0`,** а не только когда что-то удержано: прогон, дописавший юниты вне гранта, обязан это СКАЗАТЬ, иначе молчание приходится ровно на случай с наибольшим расхождением. - **Решила сама (промт отдал):** *где вычитается потраченный слот* — нигде: он НЕ БЕРЁТСЯ. *Как переживает рестарт* — носитель «юнит начат» — его же строки `chunk_status` по текущим позициям (`unitStarted`/`unitPositionsOnFile`, одно перечисление с `unitFullyRecorded`, чтобы они не разошлись в понимании «позиции»); схемы не нужно. *Частично двинутый юнит* — carried, дописываются только недостающие позиции. - **Замер строки исправлен:** было «4 купленных юнита → 2 главы», стало 4 → 4 (`TestAUnitInterruptedBetweenWavesTakesNoSecondSlot`: `Delivered=4 Carried=2 LeftFresh=1`, ровно 6 вызовов во второй покупке). - **Семантика `--max-units` изменена и объявлена во всех трёх операторских местах** (`cmd/tmctl/invocation.go`, `Runner.MaxUnits`, `backend/README.md`): грант считает юниты, которые прогон БЕРЁТ СЛОТОМ — новые и пере-делываемые; перенесённые названы в строке стопа и в логе (`finished_from_an_earlier_grant`). ⚠ Тексты НЕ утверждают, что «слот за юнит был взят прежним прогоном»: движок этого не знает (прежний прогон мог идти без потолка), и первая редакция текстов это утверждала — снято. - ⚠ **ОСТАТКИ, которые пак НЕ закрывает — названы в докстринге `deliveredUnits` и здесь:** 1. **«первая редакторская стадия»** (остаток, который промт велел назвать): конвейер, получающий ПЕРВУЮ редакторскую стадию, двигает отгружающую волну с draft на edit, и уже прочитанные юниты репортятся свежими. Закрытие требует записи о том, ЧЕМ БЫЛА отгружающая волна. 2. **Прерванная ПЕРЕ-ДЕЛКА — новый остаток, найденный этим паком.** Отгруженный юнит, чья пере-делка оборвана между волнами, имеет строку в КАЖДОЙ позиции, снова классифицируется `unitRework` и снова берёт слот. Отличить его от обычного банк-онли сдвига (черновик free, редактор пере-оплачивается — определение rework) можно только записью «какой прогон купил какую строку». **Строку 232 закрываю только по остатку «слот», как и велено.** **3. ФЧ-4 — ОБЕ половины, фигура едет с базисом (D39.181 п.1).** - **(а)** `HistoricalRows` больше не теряется на границе `status.go`: `rebillOutcome` возвращает проекцию ЦЕЛИКОМ (под `none`/`failed` — нулевую структуру, так что новое поле не может пережить «неизвестный» ответ, забытое в одной ветке), в `StatusReport` — `rebill_historical_rows` и `rebill_model_moved_rows` под тем же `rebill_basis`. - **(б)** отказ по названному потолку `--accept-rebill=` несёт `projectionBasis(proj)` — базис ТОЙ ЖЕ run-scoped проекции, чьё число печатает. - **Сверх заказа, по тому же правилу «каждая цифра предложения — из его проекции»:** scoped-клауза ПОРОГОВОГО отказа печатала число этого прогона рядом с книжным базисом; теперь несёт свой (`TestTheScopedClauseOfTheRefusalCarriesItsOwnBasis`). Дефект был и до пака. - **Один вывод на два канала:** `StatusReport.RebillFigureBasis()` → строка RE-PAYMENT в `tmctl status`; `TestABilledDecodeRowIsDisclosedAsOldMoneyEndToEnd` сверяет, что проекция, `--json`, CLI и ОБА текста отказа называют одну строку раскрытия. - **Решила сама (промт отдал: имя поля · форма basis · что печатать при `HistoricalRows=0`).** *Имя* — `rebill_historical_rows`, в форме соседей по префиксу `rebill_*`. *Форма basis* — НЕ второе поле-строка рядом с числом, а одна формулировка `projectionBasis`, которую метод `RebillFigureBasis()` переиспользует для CLI: существующий `rebill_basis` остаётся КАЧЕСТВЕННОЙ осью (`pending`/`stored`/`none`/`failed`), а новые счётчики — количественной, и словами их описывает один текст, чтобы гейт и статус не разошлись формулировкой. *При нуле* — печатается ноль, а не пропуск поля: `omitempty` здесь тот же дефект, ради которого его сняли с `rebill_units`/`rebill_usd` — отсутствие поля неотличимо от «свободно». Ноль под `pending` значит «всё пере-оценено», под `failed` — «не считалось»; различает их `rebill_basis`. В операторском тексте при нуле клауза просто не печатается: предложение не должно нести оговорку, у которой нет предмета. **4. ФЧ-1 — ровно три названные гарантии, по каждой все ТРИ шага.** - **Шаг 1 — воспроизвести на копии ДО пака.** `cp -a backend /tmp/.../mut0/backend`, `go run ./cmd/tmmutate -root . -catalog prepack_mutations.json` → **все пять посадок SURVIVED**: фильтр по книге в ОБОИХ пакетах, ключ ячейки без `chunk_idx` в ОБЕИХ формах, снятие пометки «не пере-оценена». ⇒ гарантии (2) и (3), принятые приёмкой СО СЛОВ линзы, подтверждены исполнением; ни одна не оказалась уже прибитой. - **Шаг 2 — посадки тестом.** (1) `TestCheckpointUsageForBookIsScopedToTheBook` (две книги в одной БД, ОДНА позиция) + `TestAnotherBooksMoneyNeverEntersTheConsentNumber`. (2) `TestEveryChunkOfAChapterIsRePricedFromItsOwnCalls` — глава из нескольких чанков РАЗНОЙ стоимости: единственная форма, в которой пул ячейки виден (во всех прежних фикстурах глава = один чанк, потому мутация и переживала). (3) `TestABilledDecodeRowIsDisclosedAsOldMoneyEndToEnd` — продовый путь до `--json`, CLI и обоих отказов. - **Шаг 3 — каталог.** `cmd/tmmutate/mutations.json`: **73 → 92**. Четыре записи `FC1-*` на три гарантии (фильтр по книге пинится в двух пакетах) плюс две `FC5-*` на несущие свойства, которые пак СОЗДАЛ (граница переноса и резолвенный слот) — их я завела по той же логике, по которой каталог существует. Денежный путь в каталоге: греп промта считает СТРОКИ — `git show 2a63c37:backend/cmd/tmmutate/mutations.json | grep -c 'reprice.go\|rebill.go\|volume.go\|ledger.go'` → **0**, тот же греп по дереву → **17**; различных ФАЙЛОВ денежного пути — **0 → 4** (`reprice.go`, `rebill.go`, `volume.go`, `store/ledger.go`). ⚠ В первой редакции стояло «стало 5 файлов» — такого числа не даёт ни одно прочтение; исправлено дофиксом. Прогон всех шести на свежей копии: **6 RED, «0 unexpected outcome(s)», exit 0**. - Четвёртого одноразового харнесса не писала; `tmmutate` гоняла только на копиях в scratchpad. - **Решила сама (промт отдал: форма посадок · уровень теста · текст `why`).** *Форма* — ломать ровно то утверждение, которое гарантия держит, минимальной правкой, и обязательно КОМПИЛИРУЮЩЕЙСЯ: рецепт, оставляющий переменную неиспользованной, даёт `tmmutate` вердикт «ничего не выполнялось», а не «красное», — на этом я поймала два своих же докстринга и переписала их. *Уровень* — по тому, где живёт защита, а не где живёт правка: фильтр по книге пинится и в `store`, и в `pipeline` (мутация пережила обе батареи по отдельности, значит одной мало); ключ ячейки — только `pipeline`, дефект в `newRepricer`; пометка «строка не пере-оценена» — `pipeline`, и именно ПРОДОВЫМ путём, потому что промт называл её не ловящейся на нём. *Текст `why`* — называет СВОЙСТВО и причину, по которой его не видно («во всех прежних фикстурах глава = один чанк»), а не описание правки: `why` читают в тот момент, когда мутация выжила и надо понять, что именно перестало охраняться. **Правки СУЩЕСТВУЮЩИХ тестов — объявляются (D39.183).** - `TestAFlaggedMemberWithNoEditRowIsNotFree` (volume_test.go): описывал «юнит без edit-строки ОБЯЗАН потратить грант» — поведение, которое заказывает пункт 2. Гарантия «не FREE, платит и отчитывается как платящий» СОХРАНЕНА; гарантия «берёт слот» уехала в противоположную. Фикстура расширена до 4 глав; после введения границы переноса ожидание — `Delivered=2 Carried=1 LeftFresh=2`. - `TestAnAnnouncedButFLAGGEDUnitIsStillNewBook`, `TestAUnitWhoseEDITFlaggedIsStillNewBook` (volumedelivery_test.go): флагнутый юнит после добавления стадии теперь carried. Гарантии «анонс ≠ текст» и «судить по ОТГРУЖАЮЩЕЙ строке» сохранены; фикстуры расширены до 3 глав, сигнатуры названных мутаций пере-выведены. ⚠ Рецепты мутаций в их докстрингах были НЕИСПОЛНИМЫ (правка на месте вызова оставляла `shipStages` неиспользованным, пакет переставал собираться, и `tmmutate` дал бы NOTHING вместо RED) — переписаны на правку тела `unitShipped`. - Смена сигнатур (`repriceCheckpoint`/`usd` — третий возврат `moved`; `rebillOutcome` — проекция целиком): `TestRepriceCheckpointFallsBackToTheBilledAmount` (таблица расширена до 11 случаев), `TestRepricerCountsOnlyTheCurrentGenerationOfCheckpoints` (+4 строки), `TestAFailedBasisNeverCarriesAFigure` (сравнивает всю структуру с нулевой — стал строже), `TestRebillConsentCapBelowProjectionRefuses` (+утверждение про базис), **`TestCheckpointsOfOneGenerationSumToTheRowsCost`** (адаптирован под третий возврат `usd()`; ослабления нет, правка механическая — ⚠ в первой редакции отчёта имя пропущено, дописано дофиксом), `reprice_model_test.go` и `render_test.go` (формулировка оговорки: «were answered by» → «were bought from», см. ниже). - `TestStatusPricesTheDriftWithTheGatesOwnNumber` — тронут ТОЛЬКО комментарий, цитировавший снятое обещание. Тест не менялся. - **Удалённых имён — 0.** **Мандат самопроверки — три артефакта.** 1. **Дифф `^func Test` исполнением:** 1083 → 1102, удалённых 0, добавленных 19. 2. **Собственные адверсариальные посадки ВНЕ трёх гарантий:** каталоги `own_mutations.json` (26), `round2_mut.json` (5), `round3_mut.json` (2), `draftonly_mut.json` (2) — **35 посадок**, `tmmutate` на копиях. Итог: **все RED**. ⚠ В первом круге ДВЕ пережили, и это находки: **X21** (`rescopeEditWave` сравнивал грант через `Paid()`, то есть считал перенесённый юнит за слот и отказал бы в свободном) и **X22** (строка стадии, которой конвейер больше не исполняет, засчитывалась как «юнит начат»). Обе прибиты (`TestTheRePlanCountsSlotsNotCarriedUnits`, `TestRowsOfARetiredStageAreNotAStart`) и во втором круге RED. 3. **Проход по СВОЕЙ готовой работе свежим контекстом.** Воркфлоу из семи линз (направление ошибки · раскрытие на новой границе · слот и черновой конвейер · вывод членства `usd()` · правда текста · качество тестов · скоуп и заказ), каждая находка судится тремя независимыми опровергателями (корректность · воспроизведение · сверка с промтом), большинство решает. Модели: линза качества тестов — Fable 5, остальные — Opus 5 (ограничение владельца на число Fable-агентов соблюдено: один). **Числа прохода: 7 линз, 27 находок (2 HIGH · 12 MED · 13 LOW), 42 вердикта верификаторов, 46 агентов.** ⚠ Верификаторов «подтверждено» — НОЛЬ, и читать это надо точно: фаза верификации шла по дереву, где все 27 находок были уже исправлены, то есть опровергатели подтверждали ПРАВКИ, а не отсутствие дефектов. Каждая находка ниже воспроизведена или прочитана мной по коду до правки. **Находки и диспозиции (все ИСПРАВЛЕНЫ, каждая с посадкой):** - **[HIGH] перенос без границы обнулял потолок** — грант 1 оплачивал 5 юнитов, и прогон об этом молчал. Введена граница `Carried ≤ MaxUnits` + `bound()` по `Carried`; посадки `FC5-carry-unbounded` и `FC7-volume-stop-silent-outside-grant` (в первой редакции вторая называлась разведочным именем `Y2-silent-when-nothing-left`, которого в каталоге нет — переименовано дофиксом, Б7). - **[MED] `reconcile` мог вывести `Delivered` ниже `Carried`** — `granted()` уходил в минус, строка стопа говорила «0 NEW unit(s) delivered (1 of the new ones had been started…)», предложение, которое не может быть истинным. Все ветви теперь держат вложенность; посадки `FC7-reconcile-free-branch` и `FC6-reconcile-fresh-branch` (в первой редакции стояло разведочное `Y3`, которого в каталоге нет — переименовано дофиксом, Б7). - **[MED] операторские тексты утверждали «слот за юнит был взят прежним прогоном»** — движок этого не знает. Снято во всех трёх местах. - **[MED] ось модели не была прибита на РЕЗОЛВЕННОМ слоте** — чтение `st.Model` вместо `st.ResolvedModel` переживало весь пакет. Пин + каталожная запись `FC5-model-axis-configured-slot`. - **[MED] $0-строка без usage под сдвинутой стадией** публиковалась как $0 без оговорки. Теперь помечается «не удалось пере-оценить»; посадка `FC7-zero-usage-row-silent-after-a-move` (в первой редакции — разведочное `Z2`). - **[MED] scoped-клауза порогового отказа шла без своего базиса** (дефект был и до пака) — исправлено, посадка `FC7-scoped-clause-without-basis` (в первой редакции — разведочное `X29`). - **[LOW] ветка отката (`overshoot`) причисляла строку к «пере-прайсенным по сдвинутой модели»**, хотя цитирует БИЛЛЕННУЮ сумму, не прайсенную ни по одной сегодняшней таблице. `moved` там снят; посадка `FC7-overshoot-claims-a-model-move` (в первой редакции — разведочное `Y4`). - **[LOW] `moved` считается против `ModelRequested`, а пять текстов говорили «модель, которая ОТВЕТИЛА»** — на провайдере, канонизирующем слаг (`gpt-5-mini` → дата), это разные вещи. Код верен (пере-прогон запросит модель стадии), тексты приведены к нему. - **[LOW] комментарий про `zeroRow` утверждал, что хвост $0-вызовов — ОДНО поколение.** Это неверно: $0-стадия оставляет `cost_usd == 0` после каждого прогона, поколения неразличимы, и число может быть кратным. Направление при этом ратифицированное (вверх), и оговорка «errs upward» его покрывает; ложное утверждение из комментария снято, ограничение названо вслух. - **[LOW] комментарий про redrive** утверждал, что пере-атакованный юнит «начинается заново». Неверно: `ResetChunkStages` удаляет только FLAGGED и SKIPPED стадии, черновая `ok`-строка остаётся, и юнит остаётся carried. Комментарий приведён к коду. - **[LOW] доки кадра `finished`** (`runevents.VolumeLedger`) отправляли читателя к полю `Free` за объяснением «почему юнитов больше, чем грант», хотя теперь причина может быть и в `Delivered`. Тексты исправлены; **поля на провод НЕ добавлено** — вопрос 1. В `runevents/` изменены ТОЛЬКО комментарии (проверено: дифф без строк кода), `StreamVersion` не тронут. - **[LOW] докстринг `CheckpointUsageForBook` ссылался на несуществующий id каталога** `FC1-book-filter` (в каталоге две записи, `-store` и `-pipeline`); `tmmutate -id` матчит точно, и следующая сессия получила бы «ничего не выбрано». Исправлено. - **[LOW] комментарий у `RebillHistoricalRows` называл платформу потребителем поля** — её аллоулист не берёт ни одного `rebill_*`. Формулировка приведена к факту: потребитель — операторская оснастка, читающая документ; платформа поле игнорирует. - **[LOW] несколько комментариев рассказывали ИСТОРИЮ починки** («used to», «went stale once already», «is how four bought units became two chapters») вместо описания кода — закон владельца. Переписаны; провенанс оставлен только в докстрингах ТЕСТОВ, где он в зоне принят. - **[LOW] «первая половина» текста согласия обещала «never below…» без оговорки** про строки, которые пере-оценить не удалось: они как раз могут стоять НИЖЕ сегодняшней таблицы. Добавлено «where their usage is on file» и «may sit below today's table». **Три оси ревью, названные промтом уязвимыми именно в этом паке — по каждой предъявляю.** 1. **Направление ошибки.** Двойной счёт искала специально: порог сравнивает базу и сумму, посчитанные ОДНИМ `usd()` (тест сверяет `projected_book_usd`, а не только сумму), максимум из двух цен берётся РОВНО один раз на вызов, добавка денег банк-ролей входит в опубликованную проекцию и НЕ входит в базу порога — как ратифицировано. Перелёт порога проверен с обеих сторон: число выросло там, где занижало, и не упало там, где стадия ушла на дешёвую модель. Одну форму двойного счёта ревью всё же нашло — кратность оценки $0-строки; направление у неё безопасное (завышение), ограничение названо вслух и в коде, и в секции «не проверено». 2. **`HistoricalRows` на новой границе.** Не теряется и не удваивается: единственный инкремент на строку, `rebillOutcome` отдаёт проекцию целиком, под «неизвестно» — нулевую структуру. Текст отказа и `--json` называют ОДНО число с ОДНИМ базисом — это утверждает тест, сравнивающий подстроку `RebillFigureBasis()` внутри текста отказа, а не два независимых ожидания. 3. **Слот гранта на черновом-только конвейере.** Проверено исполнением, а не рассуждением: `TestACarriedUnitOnADraftOnlyPipeline` — ось не выродилась в «никогда ничего не отгружено» (юнит, начатый и не отгруженный, опознаётся и дописывается), и не выродилась в обратную сторону (уже отгруженные не пере-продаются — `TestDeliveryIsReadFromTheSHIPPINGWaveOnADraftOnlyPipeline`). **Что НЕ удалось и что НЕ проверено.** - **Остаток «первая редакторская стадия»** — вне скоупа, требует носителя прошлой отгружающей волны (схема). - **Остаток «прерванная пере-делка»** — найден этим паком, требует записи «какой прогон купил какую строку» (схема). - **Кратность оценки $0-строки:** книга, у которой $0-стадия пере-куплена N раз, а потом уведена на платную модель, получает оценку, кратную N. Направление безопасное (завышение) и объявлено в тексте согласия, но точным его не сделать без маркера поколения на `checkpoints` — та же схемная развилка, что в докстринге `usd()`. - **Юнит, начатый НЕОГРАНИЧЕННЫМ прогоном,** слота в следующем ограниченном не берёт (но перенос ограничен грантом). Замерено тестом, на живой книге не проверялось. - **Взаимодействие переноса с ДЕНЕЖНЫМ потолком** на длинном хвосте начатых юнитов не замерено: по построению объёмный потолок их не считает, держит денежный. - **Живой прогон с платными вызовами не делался** — промт его не заказывал. Вендор-сверок нет: пак не трогает слаги моделей. **⚠ Якоря в ЧУЖИХ доках, уехавшие ИЗ-ЗА пака — править не могу, зона не моя; вот готовый список с новыми номерами** (`python3 docs/scripts/counts.py --lint`; все шесть были ЦЕЛЫ на HEAD `2a63c37`, проверено `git show HEAD:<файл> | sed -n 'p'`): | док:строка | якорь был | цель сейчас | |---|---|---| | `docs/architecture/15-money-path.md:18` | `store/ledger.go:381` «SpentUSD reports (committed, reserved)» | `:392` | | `docs/architecture/15-money-path.md:24` | `pipeline/status.go:290` «book_ceiling_usd,omitempty» | `:311` | | `docs/architecture/15-money-path.md:24` | `pipeline/status.go:788` «100 * (committed + reserved)» | `:811` | | `docs/PROGRESS.md:179` (тело строки 232) | `pipeline/status.go:866` «IT IS NO LONGER THE READ PATH'S FIRST ANSWER» | `:901` | | `docs/BACKEND_CONSENT_SESSION_PROMPT.md:52` | `pipeline/status.go:217` «can never quote a different number» | **снят по заказу (ФЧ-5 п.4)** | | `docs/BACKEND_CONSENT_SESSION_PROMPT.md:54` | `pipeline/reprice.go:24` «NOT projected (like the content axis» | **снят по заказу (ФЧ-5 п.4)** | Первые четыре — сдвиг номеров от моих вставок; последние два промт заякорил на тексте, который сам же велел снять, поэтому их «поломка» и есть признак исполнения. ⚠ **Про остальные 12 я сперва написала здесь «все в `docs/experiments/**`, пришли с полигонным мержем» — это было неверно, и поправлено разбором с платформенной сессией.** Перечисляю по владению; ⚠ **общее число гейта — величина ПОДВИЖНАЯ**, обе смены правят дерево параллельно: на момент того разбора `python3 docs/scripts/counts.py --lint` печатал 18, на момент сдачи дофикса — **20** (в отчёте пака стояло «все 18 строк», и это было верно только для того часа). Разбивка по владению взята с той, 18-строчной выдачи: - **4 — платформенной сессии** (`textmachine-37`): `docs/PROGRESS.md:19`, `docs/PLATFORM_P13_SESSION_PROMPT.md:286` и `docs/BACKEND_CONSENT_SESSION_PROMPT.md:227` целятся в одну снятую ею строку рантбука `platform/deploy/README.md:213` «сначала платформа, потом движок»; плюс `docs/PLATFORM_P13_SESSION_PROMPT.md:166` на уехавший `Quarantine`. ⚠ Третий из них живёт В МОЁМ промте (это его ⛔-оговорка о том, что совет рантбука опасен), но сломан не мной — целью владеет платформа. - **8 — полигонных**, пришли с мержем `2a63c37`: семь в `docs/experiments/**` и один в теле бэклога — `docs/PROGRESS.md:190` на `eval/conformance.py:48`. - ⚠ Якорь в `docs/experiments/23-editor-tier.md:6196` целится в строку 679 этого журнала, которой в нём нет: он был мёртв и до пака (тогда в файле было 472 строки), а мои вставки лишь меняют общее число, которым гейт объясняет смерть. ⚠ Записан здесь СЛОВАМИ, без токена «путь:номер» в обратных кавычках: гейт читает такой токен как якорь, и первая редакция этой строки сама добавила себе двадцатую поломку. **Урок, который стоит записи:** первую версию этого абзаца я построила на подсчёте, не перечислив предмет, — тот же класс, что и мои прошлые ошибки «вывести отсутствие из счёта». Счёт по подстроке пути (`grep -c 'platform/'`) тоже не есть счёт по владению: у платформы один из четырёх якорей целится ОТНОСИТЕЛЬНЫМ путём и в такой счёт не попадал. **Вопросы, вынесенные владельцу, и его слово (03.09) — записываю, чтобы решения не пере-открывались.** 1. **Поле `carried` в кадре `finished` шва** (`runevents.VolumeLedger`). Спрошено: добавлять ли число «сколько глав дописано сверх гранта», ведь `delivered` теперь может превышать `max_units`. Цена вопроса названа: это класс «новое поле в опубликованном документе» — ратификация оркестратора плюс минорный бамп `StreamVersion`, а промт запретил двигать контракт; платформа кадр `Volume` сегодня не декодирует вовсе (`platform/internal/ingest/events.go`: `Finished{Outcome}`), потребителя у факта нет. **РЕШЕНИЕ ВЛАДЕЛЬЦА: оставить как есть, поле не добавлять.** Исполнено: поля нет, объяснение живёт словами в докстрингах `Delivered` и `Free` того же кадра. 2. **Семантика «юнит, начатый прогоном БЕЗ объёмного потолка, слота в следующей покупке не берёт; перенос ограничен размером гранта».** Альтернативы названы: тратить на такие юниты купленное (тогда покупатель платит за главу дважды — ровно вред строки 232) либо завести схемный носитель «какая покупка оплатила какую строку». **СЛОВО ВЛАДЕЛЬЦА: вынести оркестратору, решение отложено — «подумаем на этот счёт».** ⇒ пункт остаётся ОТКРЫТЫМ вопросом к приёмке; в коде сейчас первый вариант, ограниченный грантом. 3. **`rebill_model_moved_rows`** — второе новое поле `status --json` сверх названного промтом одного; говорит, какая часть суммы завышена из-за смены модели стадии. Аддитивно, платформой игнорируется (её аллоулист не берёт ни одного `rebill_*`); без него человекочитаемая строка и текст отказа перестают говорить дословно одно и то же. **РЕШЕНИЕ ВЛАДЕЛЬЦА: оставить.** 4. **Ошибок в промте не нашла.** ### 03.09 — ДОФИКС по приёмке №22 (наряд `docs/archive/prompts/BACKEND_DOFIX_2026-09-03.md`, сессия `textmachine-77`) > **Состояние git на входе в дофикс — важнее прочего, потому что наряд писан по другому.** Наряд говорит «в индексе лежит незакоммиченная работа двух смен». К моменту исполнения владелец уже закоммитил её в ЛОКАЛЬНЫЙ `e85295d` «temp», а `origin/main` был обновлён ПРИНУДИТЕЛЬНО на `ea54355`, в историю которого `temp` не входит (`git merge-base --is-ancestor e85295d origin/main` → нет). По слову владельца я откатил temp и подтянул наряды двумя командами: `git reset --mixed 2a63c37`, затем `git merge --ff-only origin/main` (перемотка — `ea54355` растёт из того же `2a63c37`). Перед этим поставил метку **`temp-backup-e85295d`**, чтобы коммит с работой обеих смен нельзя было потерять; снимать её до лендинга не надо. Целостность проверена, а не предположена: изменённые файлы совпали с temp **бит-в-бит** (сравнение хешей двух диффов), пять добавленных файлов снова стали неотслеживаемыми и лежат на диске побайтно как в коммите (`git hash-object` против `git rev-parse e85295d:<файл>`). В дереве НА МОМЕНТ ОТКАТА было 44 файла: 22 мои, 21 платформы, один общий журнал; дальше число растёт у обеих смен по мере работы. **Индекс пуст, не коммичу.** > > **Батарея после дофикса:** `cd backend && make battery` → `MAKE_EXIT=0`, `golangci-lint` ``0 issues``, `ok` в 18 пакетах, SKIP: `TestMinerFullBookParity`, `TestHelperEventsRun`, `TestHelperKillLoop`. > **Тесты `^func Test`:** `grep -rn '^func Test' backend --include=*_test.go | wc -l` → **1083 → 1105** (пак довёл до 1102, дофикс и правки по проверяющему добавили остальное), удалённых **0** (`comm -23` по снимкам имён). > **Каталог `cmd/tmmutate/mutations.json`:** **73 → 92** (`python3 -c "import json;print(len(json.load(open('backend/cmd/tmmutate/mutations.json'))))"`), прирост **19** записей: паком **6** (`FC1`×4 — три названные гарантии, `FC5`×2 — свойства, которые пак создал), дофиксом и разбором его проверки **13** (`FC6`×4, `FC7`×5, `FC8`×3). ⚠ В первой редакции этой строки стояло «18 заведено дофиксом и проверкой», а перечень в скобке давал 14 и не называл `FC1` — число одной величины под именем другой, тот же класс, что чинит Б8. Команда: `python3 -c "import json;from collections import Counter;d=json.load(open('backend/cmd/tmmutate/mutations.json'));print(Counter(m['id'].split('-')[0] for m in d if m['id'][:3] in ('FC1','FC5','FC6','FC7','FC8')))"`. **По каждому пункту Б1–Б9.** **Б1 — стоп-строка и лог лгали в случае, который пак создал. ЗАКРЫТО.** Воспроизвёл сам, до правки: `VolumeStop{MaxUnits:2, Delivered:2, Carried:2}` → `Left()=0 granted()=0 Paid()=2`, и предложение печатало разом «not on money and **not at the end of the book**» и «Still in the book: **0** unit(s) NEVER delivered». Правка: у `String()` теперь ДВА открытия по `Left()`. Грант придержал работу → прежний текст. Книга кончилась → «reached the END of the book under a VOLUME ceiling (--max-units N), which held nothing back», и хвост «Nothing is left in the book» вместо перечисления нулей. Смешанный случай отдельного текста не требует: это первая ветка с уже существующей клаузой про перенесённые. Тот же развилкой пошёл лог `waverun.go` (сообщение выбирается тем же предикатом), а протухший комментарий у `scope.bound()` пере-написан на то, что код делает: «set when the grant held work back OR when the run did work outside it». Пин: `TestARunThatWorkedOutsideItsGrantSaysSo` дополнен — требует и «reached the END of the book», и «Nothing is left in the book», и ЗАПРЕЩАЕТ «not at the end of the book». **Б2 — ратифицированный контракт кадра `finished.volume` стал ложным. ЗАКРЫТО, поля НЕ добавлял.** Утверждение «present only when a volume grant actually held work back» снято во всех ЧЕТЫРЁХ местах: `runevents.go` (объявление поля и абзац «its PRESENCE is the boolean»), `events.go` (`volumeLedger`), `bookrun.go` (`BookResult.Volume`). Проверка: `grep -rn 'only when the grant actually held something back\|present only when a volume grant actually held\|nil when no grant held anything back\|rather than because the book ended' backend/internal` → пусто. Новая формулировка говорит, что присутствие значит «грант был в силе и прогону есть что о нём сказать», и что различают два случая `left_fresh`/`left_rework` — оба ноля значат «книга кончилась». Там же прямо сказано, что счётчика перенесённых на проводе НЕТ и почему: владелец 03.09 сказал «оставить как есть». Ратификационная ссылка сохранена с оговоркой, что правило присутствия расширилось вместе со строкой 232. **Б3 — три свойства не были прибиты. ЗАКРЫТО, каждое воспроизведено и посажено.** Сначала воспроизвёл все три на копии — **все три SURVIVED**, как и писала приёмка. После правки те же три посадки на свежей копии → **все три RED**. - **(а)** ветка `unitFresh` в `reconcile`: новый `TestReconcileKeepsContainmentOnTheFreshBranch`. ⚠ Состояние в нём СКОНСТРУИРОВАНО, а не наблюдено, и это сказано в докстринге: `Delivered == Carried` с исходом класса `unitFresh` не даёт сегодня ни одна фикстура. Утверждаю инвариант всё равно, потому что код заявляет его для КАЖДОЙ ветки. - **(б)** отказ по названному потолку: `TestTheScopedClauseOfTheRefusalCarriesItsOwnBasis` дополнен половиной про `--accept-rebill=` — требует «1 of the 1» и запрещает «2 of the 2». - **(в)** оговорка про смену модели при нуле: `TestProjectionBasisNamesWhatTheAmountIsMadeOf` получил отрицательный пин, симметричный тому, что был у близнеца про старые деньги. Записи каталога: `FC6-reconcile-fresh-branch`, `FC6-capped-refusal-borrows-book-basis`, `FC6-model-caveat-printed-at-zero`. **Б4 — докстринг `classifyUnits` не пере-считан. ЗАКРЫТО.** «three things this run can do to it» → «four»; проверено, что членов `unitClass` действительно четыре (`sed -n '/^const (/,/^)/p' … | grep -c '^\tunit'` → 4). **Б5 — пример в `README.md:73` противоречил новой семантике. ЗАКРЫТО.** «оплатить не больше 10 выходных юнитов» → «не больше 10 выходных юнитов возьмут слот», в согласии с телом README:11. **Б6 — шов `store → репрайсер` прибит с одной стороны. ВЗЯЛ, хотя пункт «по желанию».** Довод: мой же аргумент по фильтру книги («мутация пережила обе батареи по отдельности, значит одной мало») применим и здесь, и отказ от него был бы непоследовательностью, а не решением. Новый `TestCheckpointUsageCarriesTheEscalationFlag` в `internal/store` + запись `FC6-escalation-flag-store`; подмена `c.escalation` на `0` теперь краснеет и в store-пакете. **Б7 — отчёт ссылался на ПЯТЬ несуществующих посадок как на живые гейты. ЗАКРЫТО заведением, а не снятием ссылок.** Проверил каждую из пяти на копии: **все пять ловятся существующими тестами** — то есть свойства охраняются, но каталог их не помнил, а отчёт называл гейтами. Развязка честная только одна: сделать их настоящими записями. Заведены `FC7-volume-stop-silent-outside-grant`, `FC7-reconcile-free-branch`, `FC7-zero-usage-row-silent-after-a-move`, `FC7-scoped-clause-without-basis`, `FC7-overshoot-claims-a-model-move`; все пять пере-посажены → RED. **Б8 — четыре числа не печатались командами, которые отчёт для них называл. ЗАКРЫТО, каждое пере-считано.** - «денежного пути стало 5 файлов» — такого числа не даёт ни одно прочтение. Правда: греп промта считает СТРОКИ, `0 → 17`; различных ФАЙЛОВ денежного пути `0 → 4`. Обе команды вписаны рядом с числами. - «на входе 3 попадания» у грепа про снятое обещание — правда **1**: `git grep -n 'can never quote a different number' 2a63c37 -- backend/ | wc -l` → 1. Тройка была снята широким грепом на ТРИ разных шаблона и приписана этому, узкому. Тот же класс, что и мои прошлые ошибки со счётом: число из одной команды под именем другой. - «все 18 строк» линта — на момент сдачи дофикса гейт печатает **20** (`python3 docs/scripts/counts.py --lint`). Число ПОДВИЖНОЕ: параллельная платформенная смена правит свои файлы, и её якоря уходят и возвращаются. В отчёт пака вписана оговорка об этом. - «в файле 485 строк» — сейчас **572** (`wc -l < docs/PROGRESS.md`); число снималось до того, как отчёт дорос, и с каждой вставкой меняется. Формулировка в отчёте пака переписана так, чтобы не зависеть от него. - ⚠ **Отчёт пака сам добавлял себе поломку гейта:** строка таблицы называла чужой мёртвый якорь ТОКЕНОМ «путь-двоеточие-номер» в обратных кавычках, и гейт читал её как якорь ЭТОГО журнала. Переписана словами. ⚠ И первая редакция этого самого пункта наступила на то же место второй раз — объясняя поломку, она снова процитировала токен и снова его создала. Теперь ни одна строка обеих моих записей токена не содержит; проверка — грепом по выдаче гейта на строки этого журнала в моих секциях, пусто. **Б9 — неполнота самообъявления по D39.183. ЗАКРЫТО.** `TestCheckpointsOfOneGenerationSumToTheRowsCost` дописан в блок самообъявления: адаптирован под третий возврат `usd()`, ослабления нет, правка механическая. **Б10 — к сведению, не заказ; называю, чтобы не умерло молча.** - **Подсказка в докстринге `Delivered` ключуется на `delivered > max_units`,** а в форме «весь остаток перенесён» `delivered == max_units` — подсказка не срабатывает, и разложить кадр читателю нечем. Связано с отложенным вопросом владельца о семантике переноса; чинится вместе с ним. - **В перенос попадает и юнит, который ФЛАГНУЛСЯ и текста не отдал:** он «начат и не отгружен», значит следующая покупка снова платит за его пере-атаку вне гранта. Цикл из трёх последовательных покупок не гонял никто — ни приёмка, ни я. Вход в решение владельца, не дефект. **Проверка дофикса свежим контекстом — один агент Fable 5, ограничение владельца соблюдено.** Он прочитал исходный промт, наряд, оба моих отчёта и весь дифф, посадил 26 своих мутаций и пере-гнал батарею на копиях. Из его семи находок **три взяты в работу и исправлены**, четыре названы ниже как известные пробелы: - **[HIGH] `$0`-вызов ВНУТРИ платного поколения выпадал из обхода** — и уносил с собой сегодняшнюю цену. Форма: черновая стадия на локальной `$0`-модели с ПЛАТНЫМ `escalate_to`; стоимость строки объясняет один хоп, поэтому обход останавливался и бесплатный primary терялся, а после сдвига стадии на платную модель число согласия выходило вдвое ниже реальной пере-покупки, БЕЗ оговорки. Воспроизвёл сам на юнит-уровне до правки: `usd=0.010000 fromHistory=false moved=false` при пере-покупке `0.03`. Правило переписано: **вызов, стоивший ноль, никогда не останавливает обход и никогда не переполняет счёт** — он берётся всегда, а обход стоит на первом ПЛАТНОМ вызове после того, как деньги строки объяснены. Цена решения названа в коде вслух: бесплатный вызов на хвосте СТАРОГО поколения тоже будет взят, то есть оценка завышается — ратифицированное направление. Посадка `FC8-free-call-dropped-from-a-paid-generation`. - **[LOW→взято] `$0`-строка, чей новейший вызов чужой,** котировалась `$0` без оговорки: переполнения на нуле не бывает, поэтому детектор отката её не видел. Теперь такая строка помечается «не удалось пере-оценить»; `skipped`-строка остаётся честно бесплатной. Посадка `FC8-unestablished-zero-row-published-as-free`. ⚠ Существующий случай таблицы, чей комментарий говорил «skipped-строка», диспозицию не ставил — привёл тест к его собственному замыслу и добавил случай без скипа (объявляю по D39.183: поведение сменилось по находке, тест стал строже). - **[LOW→взято] развилка ЛОГА из Б1 не была прибита** — мутация «удалить ветку конца книги» переживала весь пакет. Новый `TestTheRunLogSaysWhichKindOfVolumeStopItWas` (обе ветки, живым прогоном), посадка `FC8-log-fork-at-the-end-of-the-book`. - **[MED→исправлено] отчёт пака называл пять посадок разведочными именами** (`Y2…`, `Y3`, `Z2`, `X29`, `Y4`), которых в каталоге нет: Б7 завёл их под именами `FC7-*`, но ссылки остались старыми. Переименованы; `grep` по каталогу на старые имена → 0, ни одно из них больше не стоит в отчёте как имя гейта. **Второй проход того же проверяющего — по трём осям, вердикт его словами.** Дерево ему было пере-сдано после правок; он адресно пере-атаковал свои находки 1, 3 и 6 (все три ДЕРЖАТ, каталожные посадки красные), отдельно проверил новое правило обхода `usd()` таблицей краевых форм (откат, остаток, эскалационный хоп, `skipped`, нулевая стоимость) и занижений не нашёл. **A — исходный промт: исполнено с остатком** (остатки — два схемных остатка строки 232 и отложенный вопрос владельца, все названы и заказаны такими). **B — наряд Б1–Б9: все девять закрыты** (Б8 был закрыт с остатком, см. N1 ниже — закрыт). **C — код и отчёты: ГОДНО К ПРИЁМКЕ, блокеров нет.** Три его новые находки, все LOW, закрыты здесь же: - **N1** — строка отчёта говорила «18 заведено дофиксом и проверкой», а раскладка в скобке давала 14 и не называла `FC1`. Правда: прирост 18 = паком 6 (`FC1`×4, `FC5`×2) + дофиксом и разбором проверки 12 (`FC6`×4, `FC7`×5, `FC8`×3). Тот же класс, что чинит Б8, — число одной величины под именем другой; пере-считано командой, она стоит рядом. - **N2** — условие `len(calls) > 0` в метке «поколение не установлено» не было прибито: мутация переживала пакет. Добавлен случай «`$0`-строка без единого вызова на файле свободна, а не нераскрыта» + запись `FC8-empty-cell-disclosed-as-unestablished` (красная). - **N3** — комментарий у той же ветки описывал `skipped`-строку так, будто guard несущий, тогда как продовые вызывающие skipped-строки сюда не доводят (`projectRebill` их отфильтровывает, `projectBookUSD` роняет флаг). Комментарий говорит теперь ровно это: guard защитный, а не несущий, и почему он остаётся. Его диспозицию по находкам 4 и 5 («согласен, входы в отложенный вопрос владельца») принимаю; он же заметил, что находку 4 можно закрыть и без смены семантики — снимком plan-time `Carried`. Это ВЫБОР, не необходимость, и он входит в тот же вопрос владельца. **Что НЕ удалось и что НЕ проверено (дофикс).** - **Цикл из трёх покупок на флагнутом юните** не замерен — см. Б10. Знаю, что не проверено; не чинил, потому что наряд прямо запретил трогать семантику переноса. - **Состояние `Delivered == Carried` с исходом класса `unitFresh`** (Б3а) ни одной фикстурой не достигается; инвариант утверждён на сконструированном состоянии, и это сказано в самом тесте. - **Живого прогона с платными вызовами не было** ни в паке, ни в дофиксе. - **Оба остатка строки 232** (первая редакторская стадия; прерванная пере-делка) по-прежнему открыты и требуют схемного носителя. - **Четыре находки проверяющего названы, но НЕ чинятся — все четыре суть входы в отложенный владельцем вопрос о семантике переноса, и наряд прямо запретил её трогать:** 1. Клауза «finished OUTSIDE this grant» ключуется на `Carried` ПОСЛЕ `reconcile`, поэтому исчезает, когда все перенесённые юниты флагнулись: оператор видит «2 PAID FOR BUT FLAGGED», но не то, что обе оплаты шли вне гранта. Воспроизведено: `VolumeStop{MaxUnits:2, Delivered:2, Carried:2}` + два флага класса `unitCarried`. 2. Перенесённый юнит с ПРОТУХШИМИ черновыми строками пере-покупает всю цепочку вне гранта, тогда как хелп флага обещает «дописать недостающее». Воспроизведено проверяющим: `granted()=0`, два вызова провайдера на один юнит. 3. Подсказка в докстринге `Delivered` ключуется на `delivered > max_units` и молчит в форме «весь остаток перенесён», где `delivered == max_units` (это же Б10 наряда). 4. Цикл из ТРЁХ последовательных покупок на флагнутом юните не гонял никто — ни приёмка, ни проверяющий, ни я. - **Выживание трёх гарантий ФЧ-1 на дереве ДО пака** проверяющий сам не воспроизводил (принял по моим красным посадкам); я это делал в паке отдельно, лог в scratch-каталоге сессии. ## Полигон **📌 02.09 · ПИНГ ОРКЕСТРАТОРУ (два входа в бэкенд) + ИТОГ СЛЕПОГО ЧТЕНИЯ. Решения владельца от 02.09 внутри.** Носители: пре-реги и результаты — `eval/dovodka/blind-read/` (`PREREG-BLIND-READ.md` + `RESULT-BLIND-READ.md` с семью эрратами, `PREREG-2-BLIND-READ.md` + `RESULT-2-BLIND-READ.md`), прибор дрейфа — `eval/dovodka/dreif.py`. * **РЕШЕНИЯ ВЛАДЕЛЬЦА 02.09 (ратификация за оркестратором).** (1) **Дефолт редактора — `low`**, бремя доказательства на том, кто включает дорогой режим. (2) Вопрос «`off` против `low` по качеству» **закрыт как неизмеримый этим прибором** — судейских реплик не покупать. (3) Питон-прибор дрейфа пишет полигон (сделано), **настоящий прибор — в движок, это пинг ниже**. (4) Покупка 50 глав на длину **отложена до прогона в бэкенде** (слово владельца). * **⚠ ВХОД 1 — офлайн-пересчёт по уже оплаченному тексту (`tmctl recheck` или равное).** Проверки движка исполняются ТОЛЬКО в момент генерации; готовый текст в базе перепроверить нечем, и потому частота ложных тревог пост-чека не измерима без покупки. Полигон закрыл дыру питон-двойником (`dreif.py`), но **это не тот же прибор**: у движка стеммер целевого языка и сохранённые формы, у двойника — сопоставление по началу слова. Два «детерминированных» прибора с разными ответами — тихий дрейф нормы; строку в бэклог просит полигон, решение за оркестратором. * **⚠ ПОПРАВКА К ЭТОМУ ПИНГУ (02.09, позже в тот же день): входов НЕ ДВА, А ЧЕТЫРЕ, и «включить гейт» из них самый мелкий.** Разбор начат вопросом владельца («в бэкенде нет майнинга term — „мастер гу“ не замайнится»). Проверено исполнением: **майнинг term РАБОТАЕТ** (68 записей класса `term`, `蛊师 → гу-мастер` в банке есть), но владелец прав по сути — цепочка «намайнил → классифицировал → подписал → инжектнул как закон → проверил» рвётся в ЧЕТЫРЁХ местах, и замеренный дрейф (30 ключей из 102 несут >1 передачу, максимум 7 форм) — их следствие. * **(1) `term` — класс-умолчание, а не решение.** `backend/internal/pipeline/banknote.go:79` дословно: «bankTypeOK is the accepted type set; **anything else falls back to "term" (a benign default)**». Две трети банка пробы (68 из 102) сидят в этом умолчании. * **(2) Классификатор умеет различать `term`, но в пробе НЕ ДОБЕЖАЛ.** Определение в `backend/prompts/zh-ru/classifier.md:20-23` точное («реалия, понятие, предмет, материал, вещество, класс существ — всё, что переводится ПО СМЫСЛУ», пример `元石 term`). Однако лог пробы: `batches_planned=8 · batches_running=6 · classify_batches_dropped=4` при `budget_usd=0.05` против `estimate_usd=0.0978`; итог `unanswered=7`, `reclassified=5`. Движок сам предупредил: «this bank is PARTIALLY consolidated — a budget cut a pass, so some terms were never offered to the role at all». ⇒ типы выставила банкнота или умолчание кода, а не тот механизм, который умеет. * **(3) Промпт банкноты недоспецифицирует класс `term`.** `backend/prompts/zh-ru/translator-banknote.md`: просит «новых имён собственных и терминов», список типов даёт, но **определения `term` нет, а единственный пример — `师父 наставник title`**, то есть образец уводит в титулы; лимит «не более 20 строк» на фрагмент вытесняет понятия в пользу имён (имена заметнее). Правка промта — не Go и пары не касается. * **(4) Инжект фильтрует по ПОДПИСИ, а не по классу.** `backend/internal/membank/memory.go:663`: `status == "approved"` → `Confirmed`, иначе `Ambiguous`; `priorityRank` (там же, ниже) вытесняет неподписанное первым при token-бюджете (`glossary_token_budget: 800` на 102 записи). При `approved=0` весь банк едет «неуверенным кандидатом» — форма не объявлена законом, и удерживать её нечему. Это и есть механизм дрейфа `蛊师` («гу-мастер» / «мастер гу») и `元石` (семь форм). * **⚠ (5) НАБЛЮДАЕМОСТИ НЕТ на редакторской стадии.** `retrieval_state` в базах пробы держит **35 строк, все под DRAFT-снапшотом** (`8d5721f65596`), под edit-снапшотом (`b76ab168d95b`) — **НОЛЬ строк**. Доехал ли банк до редактора и сколько записей вытеснено бюджетом, из артефактов узнать НЕЧЕМ. Все счётчики на черновой стадии нулевые закономерно: банк рождается ИЗ черновика, на нём его ещё нет. * **Порядок, который из этого следует** (предлагается, решение за оркестратором): наблюдаемость инжекта на edit-стадии → бюджет классификатора (пять центов режут половину работы) → определение и пример `term` в промте банкноты → подпись банка и заполнение форм → и только потом жёсткий режим гейтов. * **⚠ ТРИ ПОПРАВКИ К МОИМ ЖЕ УТВЕРЖДЕНИЯМ ВЫШЕ, найдены консилиумом 02.09 и пере-проверены мной исполнением.** · **(5) сформулирован неверно в ПРИЧИНЕ.** «Ноль строк под edit-снапшотом» — не разрыв, а схема: `PRIMARY KEY (book_id, chapter, chunk_idx)` **без snapshot_id** (`store/migrate.go`), редактор мержит в ту же строку, и `snapshot_id` в ней — просто последнее записанное. Вывод «наблюдаемости нет» ОСТАЁТСЯ верным, но дыра в другом: счётчики инжекта редакторской волны не пишутся никуда (`pipeline/chunkrun.go:202`). · **«ни один $0-гейт не поймал латиницу» — неточно.** Детектор латиницы ЕСТЬ и вызывается всегда (`checks/cheapgates.go:192`, `lintLatinResidue`), но по построению он **наблюдатель, а не вердикт**: дословно `cheapgates.go:22-27` — «They are OBSERVABILITY, never hard gates… never changes a chunk disposition». Гейт видел и молчал, потому что так устроен. · **Источник «cultivation» — НЕ glm-5.** Пере-проверено по стадиям: слово рождается в ЧЕРНОВИКЕ (`deepseek-v4-flash`, 7 клеток) во ВСЕХ руках, потому что черновик общий; редакторы DeepSeek его вычищают (**0** в финальных текстах `p9-low`/`p7-off`), а `glm-5` — нет (3 клетки на edit, **2 доживают до финала**). Значит это дефект не породителя, а фильтра, и прежняя формулировка «glm-5 опознаётся по латинице» верна по факту, но неверна по причине. * **Улика к строке 46, а НЕ находка: полный провал языка цели.** `books/dovodka/dv-i-z8-fb9ed5709e.json` — глава пары zh→**ru** переведена целиком **на английский**: пере-считано мной, **7104 латинских знака, 0 кириллицы**, `finish=stop`. ⚠ **Прежняя формулировка «главного, чего в пинге не было» СНЯТА 03.09: это уже заказанная работа.** Строка бэклога **46** называет ровно этот случай дословно — «Экран целевого языка: „полный связный перевод на английский" проходит»; дизайн пака **заморожен владельцем** (D39.92 п.1 closed-set + D39.93 изолированный модуль), предгейт — строка **113** (фикстура ~20 off-target). ⇒ ценность вычитки здесь — не гейт придумать, а **дать строке 46 живую улику с боевого прогона**. * **📌 03.09 · ВЫЧИТКА 17 ГЛАВ БОЕВОГО ПЕРЕВОДА ($0, 17 агентов Opus, по агенту на главу с исходником).** Материал — `p9-low` (дефолт редактора по решению владельца 02.09), экспорт `tmctl export --pairs`. Инструкция вычитчику разделяла ДВА уровня: «читатель споткнётся» (против них меряется планка владельца ≤2 на главу, D39.20) и «мелочь корректора». * **Планка НЕ взята: 59 блокирующих претензий на 17 глав = 3.5 на главу.** В планку уложилась 1 глава из 17. При этом все 17 вычитчиков независимо ответили «читается как книга» = ДА. * **Классы (всего / из них ловится детерминированно):** смысл-искажён 12/0 · имя-термин-непоследователен 10/10 · translationese-грубый 9/2 · род-гу 7/6 · логика-действия 6/1 · иное 5/3 · язык-не-тот 4/4 · пропуск 3/3 · меры 3/3. ⇒ **механизируемо 32 из 59 (54%) ПО ОЦЕНКЕ ВЫЧИТЧИКОВ**; ⚠ оценка завышена: прогон существующих `RunCheapGates` по 11 цитатам дал 1 срабатывание из 11 (сегодняшний код берёт заметно меньше). * **Остаток, который не берёт ни один детерминизм: 12 искажений смысла + 6 сломанных мизансцен = 1.1 на главу** — то есть НИЖЕ планки владельца. Образец (гл.1): «перекрыл им путь, **сделав шаг в сторону**» — по-русски «посторонился», фраза противоречит себе; в оригинале 横跨一步 = шагнул НАПЕРЕРЕЗ. * **⛔ Найдено проверкой самих вычитчиков (системнее, чем они доложили): заголовки глав теряются.** Исходник даёт `第二十六节:一切组织的本质` — номер И название; движок кладёт в заголовок только номер (`chunk/chunker.go` `stripHeading`/`ApplyHeading`), название сваливается в тело как обычная строка. Дальше как повезёт: **название уцелело у 11 глав из 17, потеряно у 6** ⇒ на 2283 главах это ~800 глав без названия вперемешку с озаглавленными. Ловится тривиально: заголовок состоит только из номера. Улика к строкам бэклога **160/161/162** и **201**. * Сырьё вычитки: `/tmp`-экспорт не сохранён (волатилен), воспроизводится командой `tmctl export --config arms/p9-low.book.yaml --pairs`; вердикты 17 агентов — в задаче воркфлоу `wfofkln2i`. * **📌 03.09 · КАНОН СУЩЕСТВУЕТ, ПОДПИСАН И НЕ ПОДАН В СТЕНД (проверено исполнением).** `~/books/gu-zhenren/guzhenren-seed-v2.yaml` — **58 записей, из них 53 `status: approved`**, 16 с полем `gender`. В нём ровно те термины, на которых спотыкались вычитчики: `资质 → талант` (канон владельца D39.21), `元石 → первобытный камень` (а в пробе намайнилось 7 форм), `甲等/乙等/丙等 → класс А/Б/В` (а в переводе «категория **C**» ЛАТИНИЦЕЙ), `蛊师 → гу-мастер`. **В `~/books/gu-zhenren/probe-4axes/book.yaml` ключа `glossary_seed` НЕТ — 0 вхождений**, и шапка стенда объявляет это сознательно: «Сид НЕ подключается — банк рождается майнером + банкнотой, как в холодном прогоне». ⇒ **Прежняя формулировка «банк не подписан» (запись 02.09) НЕТОЧНА и настоящим уточняется:** не подписан МАЙНЕНЫЙ банк, а подписанный канон просто НЕ ПОДКЛЮЧЁН. Весь измеренный дрейф (30 ключей из 102 с >1 передачей) — дрейф конвейера с отключённым каноном. Контр-факт на той же книге: с подписанным банком эффективная консистентность **99.3–100%** (Д50.2, 375–548 пар). ⚠ Записи `蛊` в сиде НЕ ХВАТАЕТ поля `gender` (средний род прописан прозой в `note`) и стоит `allow_short: false` при `minKeyLenHan=2` ⇒ односимвольный ключ структурно вне автомата. Это две строки ДАННЫХ, не код. * **📌 03.09 · СВЕРКА С ПЛАНОМ ПОСЛЕ ЗАМЕЧАНИЯ ВЛАДЕЛЬЦА — 10 «предложений» из 11 оказались уже заказанной работой.** Владелец: «вы рассуждаете без оглядки на ту архитектуру и код, что уже построена или ЗАПЛАНИРОВАНА». Замечание верное: консилиуму давали код и данные вычитки, но НЕ давали целевую архитектуру, ЕДИНЫЙ БЭКЛОГ и журнал решений. Тот же консилиум, подняв прежний контекст, прочитал план и снял свои же предложения. Сверено мной по носителям. * **Уже в плане:** вынести вердикт-поля из хеша = строка **49** (спека `backend/docs/D15.2-content-addressed-resume-spec.md`) · экран языка цели = строка **46** · заголовки глав = строки **160/161/162** и **201** (гейт пал словом владельца 15.08, D39.136 п.3) · петля ремонта = **построена** за `enabled:false`, включение — строка **13** (владелец) · морфо-гейт рода = строка **82** · числа и меры = строка **12** через триггер D39.79 п.4 · критик = строка **2** (владелец). * **Уже ПОСТРОЕНО:** род `neuter` end-to-end — **D39.69 §3** (`13-tech-debt-anchors.md`: «носитель ПОСТРОЕН»). Остаток по роду «гу» — **две строки ДАННЫХ** в сиде стенда (`guzhenren-seed-v2.yaml:291-300`: `allow_short: false`, поля `gender` нет) плюс ключ `glossary_seed`. * **⛔ Противоречит ратифицированному:** патч-протокол редактора ↔ **D39.108 п.1** «диффы откладываются» · критик как стадия движка ↔ **D38.4 п.2** «семантический span-судья — ОТКАЗ» · подпись ~30 ключей поимённо ↔ **D39.144** «подписывается ВЕСЬ банк ОДНИМ ОК; пер-термная масс-подпись = инерция» · канал идиом врезкой dst ↔ **D38.4 п.1** «глоссарий-сидинг чэнъюй НЕ делаем» · таблица мер ↔ **D39.79 п.4** «HARD-value-детектор НЕ строить». * **Что вычитка дала по-настоящему:** улики к уже открытым строкам — **46** (глава на английском), **82** (7 дефектов рода), **142/13** (классы для точечной починки), **160** (6 глав из 17 без названия ⇒ ~800 на книгу), **12** (триггер реопена по числам НАЖАТ: #46/#13/#11). Это подтверждение заказанного, а не новый список. * **Метод-урок, дороже находок:** сутки ушли на переоткрытие бэклога, потому что план не был подан консилиуму. **Любой панели, обсуждающей ЧТО СТРОИТЬ, план подаётся вместе с кодом** — иначе она уверенно переизобретает заказанное. ⚠ Для полигона отсюда следует и граница: строки 46/49/82/142/160/12 — **зона бэкенда**, полигон в них не лезет; его законная часть — улики и замер (см. ниже). * **⚠ ВХОД 2 — пост-чек банка не имел ВХОДА, а не только был выключен.** В пробе `gates.coverage.enabled: false` и блока `gates.glossary` нет — это известно; но сверх того: из 102 записей банка **ни одна не доведена до `approved`, и `decl` пуст у ВСЕХ**. Пост-чек проверяет подписанные термины (`membank/mempostcheck.go`), значит молчал он по двум причинам сразу. Условие включения жёсткого режима записано в самом коде — «после того, как владелец подтвердит точность», а точность мерить не на чем, пока банк не подписан. Порядок для бэкенда: подписать банк → заполнить формы → замер ложных тревог → решение владельца. * **ИТОГ СЛЕПОГО ЧТЕНИЯ (две редакции, 219 судей Opus, $0.66 на реплику `low₂`).** Редакция 1 дала 18:6 «дешёвая рука лучше» — **вывод СНЯТ**: судьям показывали усечённый черновик (стадия `edit` склеивает несколько draft-чанков; в 10 юнитах из 15 опора покрывала 55–79%). Редакция 2 на склеенном по манифесту черновике (покрытие 99–100%) плюс **активные нули** (`low₁` против `low₂`): **судьи назвали победителя в 29 голосах из 30 на чистом шуме**, перекос на шуме (80%) БОЛЬШЕ боевого (70%). Первичные исходы: точность 12:10:8 (p=0.842), художественность 19:8:3 (p=0.070, Холм **0.141**) ⇒ **различие НЕ ПРЕДЪЯВЛЕНО**. Механика вскрыта: в **73 голосах из 74** побеждал вариант с меньшим числом претензий, а счётчик упирался в потолок в половине голосов. Текстовый шум одной руки (0.799) больше межрежимного (0.820). * **ПРИБОР ДРЕЙФА, первые числа ($0, на уже купленном).** Терминов с более чем одной передачей в тексте — 13–16% от измеренных; сменивших форму между главами — 6–8%. Независимым путём (поле `spread`, считает сам движок): **30 записей из 102 несут >1 передачу, максимум 7 форм у одного ключа** (`元石`: «юаньши · камень юань · изначальный камень · первородный камень…»). ⚠ Разброс МЕЖДУ режимами (0.3–1.9%) **не превышает шум-пола** (2.4%, снят по паре реплик одной руки) ⇒ дрейф на этом отрезке — свойство черновика и банка, **не редактора**; экономия на редакторе к нему отношения не имеет. * **⚠ Мои ошибки этого пака, названные вслух:** первая редакция пре-рега имела невалидный первичный тест (ничьи в знаменателе против H₀=50% дают ошибку I рода 17.8%) и правило решения с непокрытым пространством исходов; гейт слепоты искал `[A-Za-z]{2,}` и пропускал одиночные латинские буквы (23–25 на руку, слепота при этом не пробита — асимметрия 8%); первый гейт покрытия мерил долю совпавших слов и срезал 14 юнитов из 15, потому что смешивал «нет опоры» с «сильно правил»; первый парсер банка искал `src:` вместо формата «ключ⇥передача» и печатал «дрейф 0%» на пустых вариантах — отказ пойман гейтом парсера, который теперь в приборе. Сверка с нормами оркестратора post-hoc: риг нарушил «оба порядка» (обе редакции), «полно-evidence окна» (редакция 1), «шум-полы измерены» (редакция 1), «детерминированный скорер > судьи» и D39.61 «вывод на агрегате до вскрытия единиц». **📌 02.09 · ПРОБА РЕДАКТОРА ПО ЧЕТЫРЁМ ОСЯМ КУПЛЕНА И ЗАКОНЧЕНА. Ответ на вопрос владельца «почему редактор дорог» получен: ОН ДУМАЕТ, А НЕ ПИШЕТ.** Отчёт — `docs/experiments/23-editor-tier.md` **Д54**. Пре-рег стенда — `eval/dovodka/prereg-4axes/PREREG.md` (фризы `c08b547` и `590256a`), журнал исполнения со всеми находками — `eval/dovodka/prereg-4axes/ISPOLNENIE.md`. Стенд — `~/books/gu-zhenren/probe-4axes/`. **Израсходовано $5.524817 из санкции $9.50; остаток $3.98 НЕ добирался.** * **E0 — ответ на вопрос.** Размышление = **77.9%** цены редактора без ручки (`p7-off`) и **76.6%** (`p9-off`); с `low` — 45.7% и 46.7%; у `glm-5` с выключенным thinking — **0.0%**. Ретраи: 39.3% и 26.3% цены руки против 1.8% и 6.0% у `low`. * **E1 (главный) — эффект ЕСТЬ.** Вилкоксон-Пратт, n=17, **p=7.6e-05**, Ходжес-Леман **×0.283**, ДИ **[0.175; 0.431]**. 19 пар из 40 цензурированы ⇒ величина — **нижняя граница**: `low` режет размышление **минимум втрое**. * **E2 — цена доставленного знака падает в 2.5 раза** (боевая ×0.407 [0.326; 0.605]). Все ЧЕТЫРЕ заранее объявленных варианта, включая строгое `delivered` и кэш-независимую цену, согласны по знаку и величине. * **E3 (ось промпта) — НИЖЕ РАЗРЕШЕНИЯ** (p=0.487). **E4 (взаимодействие) — ниже разрешения** (p=0.854), описательный по построению. * **E5 — опасение плана ОПРОВЕРГНУТО: `low` БЕЗОПАСНЕЕ.** Эхо-клеток у `∅` 2, у `low` **0**; обрывов по длине 10 и 9 против **1 и 1**. Критерий риска не предъявлен. ⚠ Эхо считается по СЫРОМУ ответу: санитайзер его вырезает, и по отгружаемому тексту эхо не видно вовсе. * ⛔ **ИЗ ЭТОГО НЕ СЛЕДУЕТ РЕКОМЕНДАЦИЯ СТАВИТЬ `low` В БОЙ.** Качество не судилось — прямо вне скоупа. Проба даёт цену рычага и снимает подозрение по эху; следующий шаг — судейство качества `low` против `∅`, и теперь его стоит купить. **⛔ ГЛАВНАЯ НАХОДКА О ДВИЖКЕ, КОТОРОЙ ПЛАН НЕ ЗНАЛ: АВТО-БАНК РАСТЁТ МЕЖДУ ПОКУПКАМИ.** Терминолог перезапускается в каждой руке и, пока у него есть бюджет, доращивает банк — а банк есть ВХОД РЕДАКТОРА. В базе `consolidated=51`, в первой же руке 81, `memory_version` уехал, edit-снапшот сдвинулся, движок потребовал `--resnapshot`. Без гарда это проявилось бы на втором юните уже с оплаченными клетками, а хуже — банк мог вырасти ПО-РАЗНОМУ в разных руках, дав редактору разный вход при внешне исправном кресте. Лечение: гонять базу конфигом БЕЗ стадии `edit` до неподвижной точки, где терминальное условие — **ноль свежих платных строк И ни одного отказа по деньгам** (одного «`memory_version` не изменился» НЕДОСТАТОЧНО). Стоило $0.0352. **⭐ И ещё три находки, полезные любому следующему замеру.** (1) **Проводная улика СУЩЕСТВУЕТ** вопреки §3 плана: `LOG_LLM_BODIES=1` + `LOG_LEVEL=debug` пишет сырое тело запроса (`obs/logging.go:72` ← `llm/httpllm.go:415`), только тела, без URL и заголовков — снято, что у `low`-рук в теле стоит `reasoning_effort:"low"`, у `∅`-рук ключа НЕТ, у `glm-5` — `thinking:{type:disabled}`. (2) **Ось креста можно доказать ЗА $0**: потолок «база + малая сумма» отказывает первой edit-резервации, но снапшот и джоб к этому моменту уже вычислены; ⚠ потолок обязан лежать НИЖЕ редакторской резервации, но ВЫШЕ батча терминолога, иначе ложная точка выглядит тишиной. (3) **`tmctl manifest` бесплатен и даёт `units_total` ДО покупки** — `n` пинится числом, а не «сколько получится» (здесь 17 глав → 20 юнитов, а не ожидавшиеся 24). **Самопроверка исполнением (мандат промта §7):** агент-контролёр на `fable` вёл всю сессию по распоряжению владельца и поймал у меня **шесть ошибок**, из них четыре — одного класса «показания собственного инструмента приняты за факт о мире»: слепой к эху E5, ковариата по первому чанку вместо суммы (15 юнитов из 20), ложная неподвижная точка банка, дефект регулярки, выданный за находку о проводе. **Все пойманы ДО того, как повлияли на результат**; реестр с классами — Д54.5. Я, в свою очередь, опровергла исполнением одну его находку и одну свою. **⚠ ЧТО ПРЕДЪЯВЛЕНО, А НЕ СПРЯТАНО:** гард «зелень на пустоте» прошёл ВПРИТЫК — у `p7-off` пустых ровно 4/20 = 20% при правиле «>20% ⇒ отказ», а по строгому определению доставки было бы 25% и прибор отказал бы; четыре оплаченных `decode_error` в `p7-off` на $0.689 (34.5% цены руки), все на ретраях после обрыва, при нуле в трёх других руках; три юнита выброшены из E1 по `R̂ ≤ 0`, и два из них — `low`-клетки с почти нулевым размышлением, то есть выброс делает вывод КОНСЕРВАТИВНЕЕ. Полный список — Д54.4. **📌 29.08 · ФАЗА Д — НА ОБА ГЛАВНЫХ ВОПРОСА ВЛАДЕЛЬЦА ОТВЕЧЕНО, ВОПРОС 0 ОСТАЁТСЯ ОТКРЫТЫМ. Сессия $0, ни одного платного вызова.** ⚠ **«Отвечено», а не «закрыто», и разница существенная:** на Вопрос 2 ответ дан в форме СЛАБЕЕ, чем звучит сам вопрос — минимакс не проверен (худший ВОЗМОЖНЫЙ жилец не искался), вендоро-независимость архитектуры НЕ проверена (буфер двухвендорен: черновик делает DeepSeek). Первая редакция этой шапки писала «ЗАКРЫТЫ», хотя буллеты под ней несли оговорки — поправлено адверсариальной приёмкой. Отчёт — `docs/experiments/23-editor-tier.md`, секции **Д35–Д38**. Агент-сессий 154 → **186 из 200**. Деньги не тронуты: резерв пака $1.2634 из $18.30 как был. * **Шаг 4 плана 22.08 ЗАКРЫТ** (Д36) — последнее незакрытое условие §7, которое можно было закрыть бесплатно. Дуэль «ролевой промт против его отсутствия» на 16 уже купленных карантинных клетках, панель из 5 армов с ГРУБЫМ ДЕКОЕМ (`ZD`), 16 читателей `fable-5`. **Промт различим: +1.50 места при пороге 1.13, знаковый p=0.0213, 13 глав из 16 в одну сторону** — ровно порог, объявленный пре-регом ДО чисел. ⇒ у прибора ЕСТЬ разрешение на промт-инженерном материале, и **всё, что фаза назвала неразличимым, меньше, чем ВЕСЬ ролевой промт**. * ⭐⭐ **И промт покупает ПРОЗУ, а не БРАК:** детерминированный счётчик дефект-классов разницы между «с промтом» и «без промта» НЕ находит (p=0.6875) при том, что грубый декой на той же панели ловит (p=0.0156). Класс Б: текст без промта читатель называет машинным в **9 главах из 16**, с промтом — **ни разу** (p=0.0039). ⇒ минимакс владельца получает третий член: по браку несут гейты, **по прозе — ростер И ПРОМТ**, и вес промта того же порядка, что вес целой дорогой стадии. * ⭐ **Закрыт долг Д34.5, который фаза назвала сама:** третий круг панели-0 тем же `fable-5` дал первую в фазе оценку СОБСТВЕННОГО шума прибора. **Доля чисто читательского шума в пороге = 0.34**; смена семейства стоит столько же (0.32–0.43) ⇒ подмена судьи по средним оправдана. ⛔ Но хвост разошёлся и **воспроизвёлся**: полный переворот порядка не случается внутри семейства ни на одной из 16 глав и случается между семействами на той единственной, где сталкиваются брак и проза — обеими межсемейными парами. Вердикт о буфере при этом устоял ТРЕТИЙ раз (p=0.0042 · 0.0213 · 0.0042). * **📌 ПИНГ ОРКЕСТРАТОРУ №19 — твой вопрос по Gemini (D39.164) ЗАКРЫТ, и без новых покупок.** Выживает **ПОСЛЕДНЕЕ** системное сообщение, выбрасывается ПЕРВОЕ: разность `RE.prompt_tokens − RQ.prompt_tokens` = **2436 РОВНО на всех 16 главах, sd=0**, а постоянного размера из двух системных только первое. Улика исполняемая — `eval/dovodka/sysmsg.py`, EXIT=0. Твои три поправки (переоценка «физически не может», повторяемость `Content.parts[]`, форум как не-источник) внесены в `00-provider-quirks.md` моей рукой, как ты и просил. ⛔ **И следствие для движка правится в ХУДШУЮ сторону, хотя дефект уже закрыт твоим же лендингом `7d0c6f2`:** до 28.08 хоп в Gemini терял **не глоссарий, а ВЕСЬ ПРОМТ СТАДИИ** — `render.go` кладёт промт первым, инъекцию второй. Любой исторический результат на Gemini-хопе до 28.08 читать как «стадия работала без своего промта». * ⛔ **СВЕРКА `--final` СДАНА КРАСНОЙ: ТРИ ПРОВАЛА, И НИ ОДИН НЕ ПРО РАБОТУ** (диагноз на каждый — Д39.2; гейты я НЕ чинил под зелень). ⚠ Первая редакция этого пинга называла ДВА и недосчитывала R37 — поймано адверсариальной приёмкой исполнением. (1) Переезд обнулил mtime всего сырья — 335 клеток Ф2 имеют ОДИН mtime, поэтому `eval/tenant_panel/verify22.py` считает границу двойной оплаты как `$0.000000` и роняет **R71**. Клетки времени покупки в себе не хранят ⇒ улика утрачена безвозвратно, результат — нет. (2) Улика **R77** («пинг в PROGRESS») ищет заголовок хроники за 15 августа со словами «ФАЗА Д», который вынесение хроники увезло в `docs/archive/PROGRESS-2026-08-10-15.md:73`=`сырьё снято, выводы ПОНИЖЕНЫ`. ⚠ Точную строку здесь НЕ цитирую намеренно: первая редакция этого пинга процитировала её — и гейт позеленел от того, что я НАПИСАЛ ПРО ГЕЙТ, а не от того, что исполнил обязательство. Это ровно та подмена, против которой реестр и заведён; поймано собственной сверкой `--final` ⇒ протух ГЕЙТ, а не обязательство. **Норма впредь: время покупки и время ответа писать ПОЛЕМ В АРТЕФАКТ, а не полагаться на файловую систему.** (3) **R37 — ложный КРАСНЫЙ от нотации, а не от переезда:** улика записана как `material_ja.py \| grep -q "СТОП\|OK "`, разборщик реестра восстанавливает `\|` в `|` ОБЕИМ чертам — и трубе оболочки, и альтернации внутри grep, — а без `-E` черта в grep литеральна. Сам замер зелёный: `[OK ] срабатываний нет: 0 из 48 чанков`, EXIT=0. ⚠ У этой же строки в прошлом был ложный ЗЕЛЁНЫЙ по той же причине — нотация ломает улику в обе стороны. **Реестр я не правил: чинить улики в момент сдачи — это и есть «дописать таблицу под результат».** ⚠ **И отдельная находка приёмки, НЕ моя:** в журнале агент-сессий есть доисторические дубли токенов внутри прогона `d4` (15 токенов заявлены дважды) — они стояли в HEAD до этой сессии, а `runs.py --selftest` такой класс не ловит. * ⚠ **Зона не запускалась на этой машине вовсе:** книги переехали в `<репозиторий>/books`, а риги ходят по `Path.home()/"books"` — **65 вхождений в 31 файле** (бэклог, строка 217). Поднято симлинком + пере-собран `eval/.venv` (CPython **3.14.7** против пина 3.14.4 — расхождение названо, риги `dovodka/` чистый stdlib). Оба шага записаны в `eval/README.md`; там же теперь карта зоны `dovodka/` — она описывалась ОДНИМ файлом при сорока скриптах. * ⭐⭐ **ДЕНЬГИ — свод на ОДНОМ прайсе и в главах Гу, которого у фазы не было (Д41).** Боевая связка «черновик `flash` → редактор `pro`» = **$127 за книгу в 1500 глав Гу, и 90% этих денег — РЕДАКТОР** ($114 из $127). **Редактор заменяем: тот же черновик с редактором `glm-5` = $20, в 6.3 раза дешевле, качество НЕРАЗЛИЧИМО** (3 круга чтения, 2 семейства, второй прибор). Однопроходка на той же дорогой модели — $62 (вдвое дешевле связки), на `gpt-5.6-luna` — **$7.6**, но в прод не идёт: цензур-ось не мерена, китайских клеток нет. ⚠ Сведено расхождение, лежавшее не разобранным: `research/04` давал книгу за **$7–15**, фаза — за $41–68. Оба верны — (а) «книга 1500 глав» в Д29.1 это 1500 НАШИХ единиц ≈ 735 глав Гу, (б) ресёрч считал ВИДИМЫЙ вывод, а у `deepseek-v4-pro` **46% токенов — размышление, и это ЧЕРНОВИК, а не проверка** (96% предложений финала дословно есть в трейсе): модель пишет перевод дважды и обе копии тарифицируются по выходу. **Правило для сметы: цену роли считать по `total_tokens`, а не по длине перевода.** * **ЧТО ОСТАЛОСЬ И СКОЛЬКО СТОИТ** (Д38.6, ранжировано): **Шаг 7 — 15 глав Гу ПОДРЯД боевым профилем с ЗАСЕЯННЫМИ характер-листами, ~$2 + движковый прогон.** Это единственный замер, дающий прибор под **Вопрос 0** («консистентность на всю книгу»), и он же готовая in-loop телеметрия прода. ⛔ Без засева характер-листов результат ложно-отрицателен ПО ПОСТРОЕНИЮ: полей пола в банке нет вовсе, механизма не существовало ни в одном прогоне. Дальше — цензур-ось дешёвой линии $0.2–0.6 · китайские клетки ~$0.3 · З-2 $0.35 (перед ним $0-долг К-3) · пере-покупка `ZP` ~$0.4. **В резерв $1.26 пункт 1 НЕ влезает — нужна новая фаза и слово владельца ДО начала. Потолки сессией не поднимались.** * **📌 ОРКЕСТРАТОРУ, мелочь чужой зоны:** строка бэклога **217** цитирует якорь `eval/conformance.py:48` с ожиданием `REPO = Path(...)`; я добавил в этот файл один импорт, и цель уехала на строку 49. Хук поймал, но правка — в таблице бэклога, то есть в твоей зоне: по правилу самого хука сообщаю, а не чиню. Сама строка 217 в силе и подтверждена этой сессией: **65 вхождений `Path.home()/"books"` в 31 файле**, лечение — одна разрешающая функция корня книг, а не симлинк. * ⛔⛔ **30.08, ПО ЗАМЕЧАНИЮ ВЛАДЕЛЬЦА ПРОЧИТАН ВЕСЬ КОРПУС ФАЗЫ — И ОН ПОПРАВИЛ МОЙ ЖЕ ОТВЕТ В ЧЕТЫРЁХ МЕСТАХ (Д42, Д43).** (1) **«$11 за книгу» — реальная таблица эксп-22, но по ИЮЛЬСКОМУ прайсу.** Пере-счёт тех же клеток по текущему: связка $40–43 вместо $13–14. (2) **Развилка владельца ПОТЕРЯНА всеми планами:** `PLAN-17-08.md:105-119`=`РЕШЕНИЕ ВЛАДЕЛЬЦА, КОТОРОЕ ЖДЁТ ЕГО САМОГО` — «черновая роль по НАШЕМУ ЖЕ правилу должна уйти с DeepSeek», luna $0.00357 против flash $0.00544. Ни в 21.08, ни в консилиуме, ни в 22.08, ни в моих Д38/Д41 этого пункта нет. ⚠ Приз развилки — **6%**, а не разы: редактор съедает 85% связки, и строка плана «$40 против $23» смешивала смену ЧЕРНОВИКА со сменой РЕДАКТОРА. (3) **«Однопроходка дешевле связки» снято прибором, который читает ОДНУ главу** — а по находке владельца (журнал §11) без черновика терминологу не из чего собирать банк, и «на одной главе банк не нужен, на книге в 1500 глав имена разъедутся». Кандидат `K7` (однопроходка → майнинг банка из её выхода → фиксер) не мерен ни разу. (4) **Конфликт приборов по замене редактора напечатан:** Д41 даёт `glm-5` неразличимым от `dspro` по слепому чтению, а счёт ошибок эксп-22 даёт `R2` против `R0` **−2.12, Холм 0.0188 — значимо хуже** на zh. Кто прав — вопрос приёмке. * ⛔⛔ **30.08, ЖИВАЯ ВАХТА D39.92 ПЕРЕ-СНЯТА — ВЕНДОР-СТРАНИЦА DeepSeek ИЗМЕНИЛАСЬ, И ЭТО БЬЁТ ПО ВСЕЙ АРИФМЕТИКЕ РАЗМЫШЛЕНИЯ (Д44).** `curl` HTTP 200, `guides/thinking_mode`, 108 336 байт, sha256 `f28c4324…`. Было (наша запись 10.08): две колонки, у `deepseek-v4-pro` **`low` маппится в `high`**, «рычаг бюджета размышления существует ТОЛЬКО у flash». Стало дословно: *«identical for `deepseek-v4-flash` and `deepseek-v4-pro`»*, таблица одна, **`low → low`**; тумблер `{"thinking":{"type":"disabled"}}` подан как общий. ⇒ **у якоря письма ПОЯВИЛСЯ рабочий рычаг размышления, которого не было при всех покупках фазы.** ⚠ Это ДОКА, не поведенческая проба — по норме «слаг ≠ модель» перед деньгами нужна живая проба (единицы центов); сессия её НЕ делает без слова владельца. ⚠ Побочно с той же страницы, чего у нас не записано нигде: *«Thinking mode does not support the `temperature`… will have no effect»* ⇒ **наш `temperature: 0.3` на `deepseek-v4-pro` молча игнорируется.** ⚠ И: `effort:"low"` у DeepSeek **пере-вооружает эхо-мину** — рычаг есть, бесплатным не будет. * ⭐⭐ **ЧИСЛА ПО ЛУНЕ ПЕРЕ-СНЯТЫ ПОКЛЕТОЧНО ПО ЗАПРОСУ ВЛАДЕЛЬЦА (Д44.6), И ОНИ БОЛЬШЕ, ЧЕМ Я ПЕЧАТАЛ.** Однопроходка, те же 16 английских глав, тот же промт, `finish=stop` 16/16 у обоих: `RN` (`deepseek-v4-pro`) медиана **$0.02011**/клетка, сумма $0.4938 · `RL` (`gpt-5.6-luna`) медиана **$0.00248**, сумма $0.0392 ⇒ **8.1× по медиане, 12.6× по сумме**, при качестве, которого прибор не разрешил. Вся разница — размышление: у якоря оно БИМОДАЛЬНО (466 … 19 559 токенов на главу), у луны прибито к ~1 000 явным `low`. ⛔ **НО ЭТО СРАВНЕНИЕ КОНФИГУРАЦИЙ, А НЕ МОДЕЛЕЙ, и ни одна прежняя строка этого не говорила:** якорю ручку не слали вовсе (= `high`), испытуемому слали `low`. По собственной норме фазы (Д28) это РАЗНЫЕ армы. ⇒ **Замер, который это разводит, стал возможен ровно сегодня** (см. пункт выше): те же 16 глав, тот же промт, `deepseek-v4-pro` с `reasoning_effort:"low"`, смета **$0.05–0.10**. Либо снимает с луны восьмикратное преимущество, либо подтверждает его при уравненных ступенях. **Самая дешёвая и самая информативная покупка, какую фаза может назвать; ждёт слова владельца.** * ⛔⛔ **ТРЕТЬЯ ТИХАЯ ПОЛОМКА ОТ ПЕРЕЕЗДА МАШИНЫ, найдена исполнением 30.08: в `eval/.env` у ВСЕХ СЕМИ ключей пропали подчёркивания** — `DEEPSEEKAPIKEY` вместо `DEEPSEEK_API_KEY` (и так же GEMINI/OPENAI/XAI/ZAI/KIMI/MISTRAL). Код читает `os.environ["DEEPSEEK_API_KEY"]` (`eval/tenant_panel/roster.py:41`=`DEEPSEEK_API_KEY`), `load_dotenv` отрабатывает, имени нет ⇒ **любая покупка полигона падает `KeyError`**. ⚠ Значения ключей не читались — снят только список ИМЁН и признак непустоты. **Файл владельца не тронут, обёртка-переименовалка не написана** (это запрещённый молчаливый обход). Чинится одной правкой на стороне владельца. ⇒ **Класс назван: переезд ломает окружение МОЛЧА, и каждая поломка вскрывается только исполнением** — до этого были пути `~/books` (65 вхождений в 31 файле) и обнулённые mtime (Д35.2). **Санкционированная владельцем покупка (Д45) стоит готовой и ждёт ровно этого: пре-рег заморожен, арм заведён, провод прочитан, промт сверен побайтно, смета $0.16 при свободных $0.285.** * ⛔ **РЕЕСТР ПОТЕРЯННОГО (Д43) — прямой ответ на «не хотелось бы расти по энтропии».** При каждой смене носителя курса часть намерений не переезжала, и никто этого не печатал. Собрано ~25 позиций: семь развилок на владельце · десять объявленных $0-замеров, которые не сделаны · **три долга ЧУЖИМ зонам, где полигон обещал пинг и не пингнул** · шесть выпавших из очереди покупок. **📌 Первое, что прошу оркестратора взять:** ⛔ **экстрактор epub сносит границы абзацев** (`HANDOFF-21-08.md:152`, консилиум поднял до ⭐ «починка ДО любого нового en-замера»): пинг обещан 21.08 и **так и не сделан**, а весь английский материал фазы снят с испорченной подачей. Плюс: английский пар-пакет не заленджен в `backend/prompts/`. **Норма, которую предлагаю завести: новый носитель курса обязан явно перечислить, что из старого НЕ переехало и почему.** * ⚠ **Незакрываемое панелями, названо прямо:** абсолютная база класса Б (Шаг 5.1). Читателя просят назвать худших ВНУТРИ панели — метка сравнительная, норма абсолютная. До отдельной абсолютной рубрики или человека норму «≤1 машинная глава на 25 глав Гу» печатать нельзя. * ⭐⛔ **30.08, ПОСЛЕ КОМПАКТА: КЛЮЧИ ПОЧИНЕНЫ ВЛАДЕЛЬЦЕМ, ПРОБНАЯ КЛЕТКА КУПЛЕНА ($0.038276) — И ГЛАВНОЕ ОНА ОТДАЛА БЕСПЛАТНО (Д45.5, Д46).** Несущая улика — не размер размышления, а **входные токены**: при побайтно одинаковых `messages` (sha256 сверен исполнением) вызов без параметра дал `prompt_tokens` **3270**, вызов с `reasoning_effort:"low"` — **3191**, то есть **−79**. **Два контроля детерминизма:** замер 05.08 (дефолт и `low` вернули ОДИНАКОВЫЕ 2124) и пред-полётные пробы самого рига (`84 · 84 · 84 · 84` на одном тривиальном запросе, четвёртая куплена 30.08 — то есть **дефолтный счёт входа не сдвинулся через смену вендорского сервинга**). ⇒ **параметр `low` на `deepseek-v4-pro` ТЕПЕРЬ ДОХОДИТ ДО МОДЕЛИ**, статус квирк-бюллетеня «НЕ УСТАНОВЛЕНО» закрыт в части «доходит ли» (новая запись **3г**). ⛔ **ВЕЛИЧИНА среза — НЕТ, и это находка против моего же пре-рега:** `RN` куплен 21.08, `RNL` — 30.08, а между блоками лежит **документированная смена вендорского сервинга** (её же зафиксировала вахта Д44) — сравнение приписывает ручке всё, что вендор поменял за девять дней; дрейф из §3б — второй конфаунд и слабее (у него есть знак, и он работает против нуля). Раздел Д45.3 «чего замер не закроет» не назвал НИ ОДНОГО — **дефект найден пере-чтением ПОСЛЕ фриза `87dd124`, печатаю против себя**. ⇒ ⭐ **Лечение одно: оба арма в ОДНОМ блоке вперемежку — и такой замер КУПИТЬ МОЖНО, вчетверо дешевле замороженного:** дизайн Д (интерливинг `RN2` против `RNL` на восьми дешёвых главах) стоит **$0.078–0.133** при свободных $0.2472, n=8 пар, минимальный двусторонний p = 0.0078; гард кассы его пропускает (проверено по коду, гард не тронут). **Пре-регистрация — Д47, заморожена коммитом, ⛔ НЕ КУПЛЕНО: санкция владельца была на ДРУГОЙ дизайн, переносить её я не вправе.** Рекомендация: пятнадцать клеток по фризу Д45 (дизайн А) **не покупать ни при каком ответе**; Д47 — по его слову. ⚠ **Первая редакция Д46 утверждала обратное — «ни один неконфаундированный дизайн не влезает» — и это было НЕВЕРНО** (пропущена дешёвая восьмёрка, при том что бимодальность нашла та же секция); сломал адверсариальный проход, разбор и цена ошибки — **Д46.6**, там же единственная находка прохода, которую я ОТКЛОНИЛ (корреляция по порядку вызовов: у всех 16 клеток `RN` один mtime, порядка не существует). Боевая ступень редактора **не тронута** (`eval/tenant_panel/roster.py` — правлен только комментарий, который до сегодня объяснял выбор снятой посылкой; гейт пака пере-снят, расхождение то же единственное mtime-шное). * ⭐⭐ **30.08, Д47 ЗАПУЩЕН ПО САНКЦИИ ВЛАДЕЛЬЦА И ОСТАНОВЛЕН ГАРДОМ ПОСЛЕ ПЕРВОЙ ПАРЫ — А КУПЛЕННОЕ ОКАЗАЛОСЬ ЦЕННЕЕ ЭНДПОЙНТА (Д47.6).** Списано **$0.134804**, ФД-N 3.187585 из 3.30, потолок НЕ поднимался. **Побайтно один промт, одна глава `b065a92dc0`, `reasoning_effort` не слался НИ РАЗУ: 21.08 модель думала 466 токенов, 30.08 — 17 757. ×38.** ⚠⚠ **ПОПРАВЛЕНО В ТОТ ЖЕ ДЕНЬ ПО ВОПРОСУ ВЛАДЕЛЬЦА (Д47.7): подавать ×38 как ЗАМЕРЕННЫЙ СДВИГ ВО ВРЕМЕНИ было нельзя** — это разность двух ОДИНОЧНЫХ розыгрышей у модели с большим разбросом. По лучшей имеющейся оценке (sd логарифма 0.82 ⇒ одно sd = ×2.3, шесть групп «тот же тег, разные розыгрыши», 18 вызовов, судейская роль) ×38 — это ≈3.1 sd: **редко, но возможно ⇒ причина НЕ УСТАНОВЛЕНА**, обе гипотезы живы, а чистых повторов одного промта на роли `onepass` в корпусе НЕТ ни одного. ⛔ **И первый заход к этой оценке был бы десятой ошибкой дня:** я сгруппировал вызовы по «модель·глава·роль», получил 100 групп и «разброс ×11» — а группы смешивают армы `RN`/`RC`/`RB` с РАЗНЫМИ промтами (на `27cb3a7e69`: 7 061 · 498 · 18 043), то есть мерили разницу инструкций, а не розыгрыша. ⇒ **Устояло то, что важнее причины: сравнивать одиночные розыгрыши нельзя ни при какой гипотезе — это осуждает и дизайн А, и МОЙ дизайн Д.** ⭐ Побочно Клейм 1 подтверждён на БОЕВОМ промте: `prompt_tokens` = **3256 и 21.08, и 30.08** (через девять дней и смену сервинга), а `low` двигает их ровно на **−79**; гейт провенанса пройден (Δpt=79, кириллица 1.000, латиница 0). **Эндпойнт по правилу: внутри блока ручка дала ×1.40** (меньше ×2.52, полученных через девять дней — конфаунд эффект РАЗДУВАЛ), годных пар 1 из 8, знаковый тест p=1.0 ⇒ ⛔ **«НЕ УСТАНОВЛЕНО»**, добор глав после чисел запрещён. Носитель — `eval/dovodka/stupen.py`, написан ДО прихода клеток, селфтест стережёт, что порог достижим только единогласием. ⛔ **Смета ошиблась на порядок, и это моя восьмая ошибка того же класса:** $0.078–0.133 объявлялись ценой ВОСЬМИ пар, одна пара стоила $0.1348 — **я оценил опыт по той самой базе, нестабильность которой опыт и должен был показать**. ⭐ **Цена ответов теперь СЧИТАЕТСЯ, а не угадывается (Д47.8):** при sd логарифма 0.82 парный дизайн ловит эффект ×2.5 за 13 пар (≈$1.1), ×2.0 за 22 (≈$1.8), ×1.4 за 93 (≈$7.6); отдельный дешёвый вопрос «модель сдвинулась или это кости» — четыре повтора без ручки на той же главе, **≈$0.31**. ⛔ **Но приоритет не здесь:** ручка даёт ×1.4–2.5, а рядом стоит рычаг ×7–11 — смена модели на `gpt-5.6-luna` (поглавно медиана ×7.1, по сумме ×11.4) — и он упирается НЕ в деньги, а в кап агент-сессий (нужно 16, свободно 14). Тратить доллары на ручку прежде, чем порядковый рычаг прочитан по КАЧЕСТВУ, — плохая экономика. ⚠ Операционное для чужих циклов: отказ гарда возвращает код 1, но в ФОНОВОМ shell `set -e` цикл не остановил — семь итераций вхолостую, $0. * ⭐⭐ **30.08, ПАНЕЛЬ `luna1` ПРОЧИТАНА ВСЛЕПУЮ ПО САНКЦИИ ВЛАДЕЛЬЦА («Да, давай подниму кап»), $0 (Д48).** Кап 200 → 215, израсходовано 201. Читались ЧЕТЫРЕ арма на 15 главах (16-я выпала: клетка `RN` не прошла гейт годности, пропуск напечатан): однопроходка на `deepseek-v4-pro` · **та же однопроходка на `gpt-5.6-luna`** · боевая связка · **её вторая генерация как собственный шум прибора**. ⛔ **Сначала поправка к моему же предложению:** развилка владельца от 17.08 — про ЧЕРНОВУЮ роль, а её приз пере-считан в Д42.1 как **6%, а не разы** (редактор съедает 85% связки) ⇒ читать «луну как черновик» значило бы потратить кап на шестипроцентный рычаг; читался порядковый (×7–11). **Результат: средние места `Z0` 2.33 · `ZF` 2.33 · `RN` 2.53 · `RL` 2.80; близнецы расходятся на +0.00 при пороге 1.06 (прибор без смещения), якорь↔`RN` +0.20 при пороге 1.30 (p=0.79), якорь↔`RL` +0.47 при пороге 1.26 (p=0.58), очно `RL` против `Z0` — 6:9.** ⇒ ⭐ **дешёвая луна НЕ ОТЛИЧИМА по качеству ни от дорогого дипсика, ни от связки.** ⚠ Но: разрешение прибора грубое — два прогона ОДНОГО конвейера расходятся на **1.33 места из 4**, то есть разрыв луны это треть собственного шума; направление, хоть и незначимое, **против** луны; панель не трогает банк/консистентность на всю книгу, цензур-ось жанра и перенос на zh. ⛔ **Это ПЕРВЫЙ круг, вердикта ещё нет — правило конъюнкции требует повтора.** Дисциплина: ключ закоммичен ДО ответов, обёртка — замороженный `15cfac60`, модель читателей сверена ИСПОЛНЕНИЕМ (во всех 15 транскриптах `claude-fable-5`). ⛔ **Второй круг упирался в ОДНУ сессию — моя арифметическая ошибка при подъёме капа** (осталось 14, нужно 15); резать панель до 14 глав решением сессии запрещено. ⭐⭐ **ВТОРОЙ КРУГ ПРОЙДЕН (кап 215 → 220 по слову владельца, Д48.5): вывод ПОВТОРИЛСЯ, конъюнкция закрыта.** Средние места круг 1 → круг 2: `Z0` 2.33 → 2.20 · `ZF` 2.33 → 2.53 · `RN` 2.53 → 2.60 · `RL` **2.80 → 2.67**; якорь↔`RL` +0.47 (порог 1.26, p=0.58) → **+0.30** (порог 1.11, p=0.77), то есть отставание луны во втором круге даже СОКРАТИЛОСЬ. Круги разведены по норме рига (ответы первого унесены в `krug1/`, второй писал по ТЕМ ЖЕ пакетам; свод первого из подкаталога воспроизвёл прежние числа до сотой); модель всех 30 читателей сверена по транскриптам. ⚠ Регистратор отработал как сторож: пере-заявить те же главы отказался, пока сессии первого круга не закрыты (`ГОНКА СЕССИЙ`). ⇒ **однопроходка на `gpt-5.6-luna` неотличима по качеству от однопроходки на `deepseek-v4-pro` и от боевой связки на 30 слепых чтениях**, при цене ниже — ⚠ **но число «7.1× по медиане» я подавал НЕВЕРНО, поправка в Д48.6 по вопросу владельца.** (1) В знаменатель попала ПУСТАЯ клетка дипсика (`100b088f71`, ноль знаков, та самая, что не прошла гейт годности): на 15 годных пар медиана **10.5×**, по сумме **12.0×**; побочно — непригодную клетку выдал дипсик, 1 из 16, у луны 0 из 16. (2) Тяжелее: **медиану тут вообще нельзя приводить — распределение ДВУГОРБОЕ** (восемь глав ≈2×, восемь ≈20×, посередине пусто), и она скачет 7.1 → 10.5 от выброса одной клетки. Честно: **от 1.3× до 34×, и величина следует за тем, сколько дипсик надумал**. (3) **Разложение:** 87% цены дипсика — размышление (разброс по главам ×42: 466–19 559), у луны 49% и ×3 (511–1 535); **контрфакт «дипсик думает как луна» даёт всего ×2.9** — это чистый прайс и накладные, остальное объём размышления. (4) ⚠ Конфаунд в силе: дипсик ехал без ручки (дефолт `high`), луна на явном `low`; ручка стоит ×1.40 (Д47.6) — сузит, но не закроет. (5) ⚠ Воспроизводимость самой луны **не мерена ни разу** (0 групп повторов на 749 вызовов), а её `reasoning_tokens` подозрительно кратны 512 — возможен блочный учёт, проверить до смет. ⛔ Переключение — решение владельца, и перед ним стоит незакрытый гейт, названный им самим 16.08: у однопроходки нет черновика, из которого терминолог добывает свидетельства для банка (Д42.3). * ⛔ **30.08, ЖИВАЯ СВЕРКА ПРАЙСА GEMINI ПО ВОПРОСУ ВЛАДЕЛЬЦА — ОДИН ПИН ВДВОЕ ЗАВЫШЕН** (квирк-бюллетень, раздел прайса; источник `ai.google.dev/gemini-api/docs/pricing`). `gemini-3.1-flash-lite` — пин верен ($0.25/$0.025/$1.50). ⛔ **`gemini-3.6-flash`: у нас $1.50/$0.15/$7.50, у вендора дословно «$0.75 through December 31, 2026», то есть выход сегодня $3.75 — наш пин это ПОСЛЕ-промо цена, сметы на этой модели завышены ×2.** ⚠ **Пин я НЕ правил сознательно:** `roster.cost()` считает клетки ИЗ ПИНА, и правка переписала бы стоимость **8 уже купленных клеток** (Д32.11 — леджер есть оценка) ⇒ решение за владельцем. `gemini-3.1-pro-preview` верен для ≤200k, но у вендора есть не записанный у нас тир >200k ($4/$0.40/$18). ⭐ **И на странице есть `gemini-2.5-flash-lite` — $0.10/$0.01/$0.40 выход, втрое дешевле самой дешёвой нашей модели**; в смету брать НЕЛЬЗЯ: 2.5-серия имеет shutdown 16.10.2026 и интермиттентный 404 при живом слаге, качество и эхо не мерены. **Урок для всех пинов: промо-цена с датой окончания попадает в ростер как постоянная и тихо врёт — у пина обязана быть дата и оговорка о промо.** **📌 ПИНГ ПОЛИГОНУ от оркестратора №19 (28.08, D39.164) — вендор-вердикт по Gemini для `docs/experiments/00-provider-quirks.md`.** Материал добыт бэкенд-сессией (curl по вендор-доке, не пересказ), но файл — ВАША зона, вписываете вы. ⚠ Вендор-основание ДОСЛОВНО, со ссылкой и датами снятия, уже лежит в `backend/configs/models.yaml` у провайдера `gemini` (греп `ВЕНДОР-ОСНОВАНИЕ`) — сюда не переписываю. **Строка 157 квирков несёт ТРИ утверждения сильнее источника:** (1) «слой ФИЗИЧЕСКИ не может пронести больше одного системного» — вендор говорит про НАТИВНЫЙ `systemInstruction`, а что делает с двумя системными OpenAI-совместимый ШИМ, не документирует нигде; (2) «уход на нативный API проблемы не решает» — верно по сути, не по причине: `Content.parts[]` ПОВТОРЯЕМОЕ, и нативный API МОЖЕТ нести N системных текстов как N частей ОДНОГО `Content`; (3) «форум Google» — НЕ вендорский источник: тред `discuss.ai.google.dev/t/86097` — два поста, оба от НЕ-сотрудников (staff=false), 30.05.2025, ответа Google нет, а читается наравне с нашим замером. **Открыто честно:** «выживает ровно одно» против «не выживает ни одного» не разрешено — маркер пробы приписан к `msgs[0]`, и его отсутствие совместимо с обоими чтениями, а зеро-системного контроля в скрипте нет. Твёрдо: НЕ склеиваются (`prompt_tokens` 2994 → 535) и first-wins ложно. **Дешёвое решающее доизмерение:** тот же скрипт, маркер на ПОСЛЕДНЕЕ системное плюс user-only базовая клетка. ⚠ Граница: проба гонялась на `gemini-3.1-flash-lite`, а в цепочке эскалации стоит `gemini-3.1-pro-preview` — слой тот же, слаг другой. Для движка безразлично: склейка на нашей стороне заленджена (D39.164). **ИТОГ ПОЛИГОН-СЕССИИ 23.08 — ШАГ 1 ПЛАНА 22.08 ЗАКРЫТ (панель-0, $0).** Отчёт целиком — секция **Д32** `docs/experiments/23-editor-tier.md`; фризы `bedc39a`, `9e33a1b`; денег не потрачено (панель собрана на уже купленных клетках). **Вердикт (интеракция «архитектура × жилец на ИСПЫТАННЫХ жильцах», не минимакс):** слабый жилец `glm-5` РЕДАКТОРОМ над боевым черновиком неотличим от боевого `deepseek-v4-pro` в той же роли (разрыв средних мест **+0.00**, p=0.80), а ОДНОПРОХОДКОЙ различимо хуже (**+1.12** места при пороге 0.99, знаковый **p=0.0042**, +13 фаталов p=0.0312) ⇒ **буфер архитектуры существует и замерен** — ⚠ на 16 главах. **⛔ ДЛЯ БЭКЕНДА:** в **2 окнах из 8** с первым лицом пол рассказчика по главе НЕ УСТАНАВЛИВАЕТСЯ вовсе (эталон снят вслепую тремя независимыми чтениями на главу), а полей пола в банке НЕТ (`~/books/role-topology/bank-en.json`, 25 терминов) ⇒ закрыть эти ~25% может ТОЛЬКО книжная память; смыкается со строкой бэклога **210**. **⚠ ОТКРЫТО НА ВЛАДЕЛЬЦЕ:** сверить **$17.04** с реальным счётом DeepSeek может только он. Долг В21 (сверка кассы двумя путями) ИСПОЛНЕН, результат отрицательный: сверка на диске НЕВОЗМОЖНА в принципе — `cost_usd` вычисляется нашим же `roster.cost` (`buy.py:93-95`), а не приходит от вендора; на 213 клетках у четырёх вендоров из шести арифметика сходится до последнего знака, а «офф-пик = ½» в ЗАПИСАННЫХ ценах НЕ наблюдается. **⚠ Пинг оркестратора №18 — 20.08 (протухшие цены в квирках, чинить вашей рукой).** `docs/experiments/00-provider-quirks.md` до сих пор утверждает, что цены после катовера НЕ изменились («flash $0.14/$0.28»). Это опровергнуто пере-пином 13–15.08 (D39.137): таблица запинена ПИКОМ — flash 0.44/1.32 при кэш-хите **0.014**, pro 1.32/3.96 при кэш-хите **0.044** за 1M (сверено с `backend/configs/models.yaml:182,198`=`cached_per_m` и телом D39.137 §2а), и счёт шиппинга = 100% DeepSeek ⇒ ×4.2–4.4 в пике. Квирки — ваша зона, рукой не трогаю; поправьте при ближайшем касании, потому что по ним считают деньги проб. ⚠ **И ВТОРОЙ факт тем же касанием, он сейчас БЕЗДОМНЫЙ:** у DeepSeek цена ходит окнами — пики UTC 01–04 и 06–10 вдвое дороже долин, платное планировать в долины. Факт куплен замером и жил в справочнике ролевого промта; я оттуда его убирал как вендор-специфику, а в квирках его НЕТ (греп по `peak|долин|пики UTC` = 0), то есть указатель вёл в дом, который факта не несёт. До вашего переноса держу копию в ролевом промте с явной пометкой. ⚠ Третий пункт того же аудита (`eval/README.md` держит мёртвый СТОП на платные прогоны) сведён ниже, в пинг №20 — один носитель на факт. ⚠ **Тем же касанием — вторая протухшая клетка справочника (аудит доков 22.08, живо и на 02.09):** квирки и `docs/STACK.md` утверждают, что ручки эффорта у `deepseek-v4-pro` НЕТ (`low`→`high`) и веса вендором не тронуты, — а вахта §Б-108 сработала 13.08 changelog'ом вендора (pro/flash получили low/high/max). Это боевой РЕДАКТОР и апекс эскалации; замера ПОВЕДЕНИЕМ после 13.08 нет ни у одной стороны, из репозитория вендорская сторона НЕ выводится. **Закрывается вендор-сверкой, а не выбором стороны** (гардрейл владельца) — и вы это только что делали по Gemini, то есть заход дешёвый. Носитель в трекере — строка **237**(б). **⛔ ПИНГ ОРКЕСТРАТОРА №20 ЗОНЕ — ТРИ ПРОТУХШИХ МЕСТА, все три ЖИВЫ на 02.09 (правки зонные, рукой не трогаю).** 1. **`eval/README.md` первой врезкой держит СТОП на платные прогоны** — «Платные прогоны/докупки СТОП до ре-пробы (бэклог-строка 74)». Строка 74 закрыта (D39.95), ограничение пало лендингом 112 (D39.97), `pipeline-c1.yaml` несёт `reasoning: "low"` с объяснением, а зона всё это время платно гоняет фазу Д: врезка объявляет запрещённым то, что делается ежедневно, и этим обесценивает все прочие ⚠ в файле. Живым из неё остаётся только ⚠0731 (смена весов под слагом) и стохастичность эха. 2. **`eval/README.md` описывает каталог `dovodka/` ОДНИМ файлом `runs.py`**, тогда как там сорок скриптов и главный инструмент фазы; `docs/experiments/README.md` объявляет себя сведённой «до эксп-22», а строк для 22 и 23 в ней нет. 3. **`naklon.py` (гейт позиционного наклона) лежит коммитами ветки `polygon`, в `main` НЕ влит.** «Вне git» ЛОЖНО: файл несут и локальная `polygon`, и запушенная `origin/polygon`. Живой остаток — НЕ ВЛИТО в `main`: в `eval/dovodka/` у `main` 42 отслеженных файла против 80 у `polygon` (снимать командой `git ls-tree -r <ветка> -- eval/dovodka/`, а не чтением). **ФАЗА Д «ДОВОДКА ЭКСП-22/23» — ИДЁТ.** ⚠ **Живое состояние фазы живёт В ЗОНЕ, не здесь** (`eval/dovodka/` — планы, консилиум, ревью; свежий носитель курса зона называет сама), приёмка фазы — у ПАРАЛЛЕЛЬНОГО оркестратора, деньги и цепь потолков — `eval/dovodka/money_d.py` (`PACK_CEILING`/`CEILINGS`), а не литералом здесь: три поколения записей в одном месте и были причиной, по которой состояние фазы стало нечитаемым. *(Хроника фазы Д — записи 10.08 (сессия №1) и 15.08 (сессия №2, сквозной аудит дуги 19→23 и пере-судейство `tier`) — вынесена в [archive/PROGRESS-2026-08-10-15.md](archive/PROGRESS-2026-08-10-15.md) с тремя поправками в шапке: потолок, закрытые пункты листа владельца, протухшие «долги». Открытым на владельце из неё остаётся ОДИН пункт — возражение Sol по проходу `tier`.)* **Диспозиция оркестратора №17 (15.08), живая до приёмки фазы Д:** просьба хендоффа «эррата zh-канона: пере-сборка = правка закрытой оси, ратифицирует оркестратор» (`docs/POLYGON_PHASE_D_HANDOFF.md`, греп `Пере-сборка = правка закрытой оси` — файл дирти, номер строки не ставим по норме D39.179 п.4; завышение +0.0039, вердикты не двигает) — **к ПАРАЛЛЕЛЬНОМУ оркестратору при приёмке, не к движковому** (приёмка фазы Д — его зона, №17 полигон не трогает **по слову владельца**). Прожитое из записи (вторая передача и мелочи аудита корпуса) — `archive/reports/CORPUS_AUDIT_2026-08-15.md`; санкции владельца по деньгам фазы и замене ja-книги — D39.136 п.1. *(Память · Голос и состояние · Ридер-IDE — ЗАКРЫТЫЕ секции (D39.125): темы исполнены/переехали в зонные журналы; хроника — в архив-слайсах. Фронт пишет ТОЛЬКО в frontend-PROGRESS.md.)*