textmachine/docs/PROGRESS.md

616 KiB
Raw Blame History

Журнал прогресса

⟶ ТЕКУЩЕЕ СОСТОЯНИЕ (на 2026-09-05, голова D39.207 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). ОЧЕРЕДЬ №22 (единственный носитель — здесь; роль передана 01.09, №21 закрыт нотой передачи D39.184). ⚠ ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ПЕРВЫМ: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам, не только тронутым; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ по остатку бэклога и регистра; (0в) вынос неактуального в АРХИВ (docs/archive/, platform/docs/archive/) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): 90 живых дока в 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; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 107 (major 5), всего рядов 453 (пере-счёт python3 docs/scripts/counts.py; с 04.09 оба числа под гардом --check, прежние 95/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 и лечение новым прогоном). ПОЧИНЕНО 05.09 ЛЕНДИНГОМ 616a8e4 (пак «денежный стоп», акт приёмки D39.206; ⚠ испр.: раньше здесь стояла D39.203 — это нота ВЛАДЕЛЬЦА про «сколько добавить», а не акт) — ниже до-паковая археология, читать как историю. Отказ резервации больше не роняет волну: он ЗАЩЁЛКИВАЕТ её (новое не стартует, допущенное дорабатывается), а обязательный вызов ЖДЁТ settle, когда settle может помочь. ⇒ порог «книга короче десяти глав не переводится» СНЯТ; остаточный пол — одна резервация (~$0.07 ≈ 3 главы), и он ВЫВЕДЕН, а не замерен (замер — $0.15-прогон пятиглавой книги, передан полигону). ⚠ Разбор эрратой — architecture/15-money-path.md, греп ЭРРАТА 05.09. ⚠ Эта строка сутки стояла непоправленной ПОСЛЕ лендинга и по ней оркестратор предупредил владельца о снятой стене как о действующей — канон, не обновлённый лендингом, врёт громче отсутствующего. НО КНИГУ ЧЕРЕЗ API НЕЛЬЗЯ БЫЛО ДОВЕСТИ ДО КОНЦА — найдено прогоном 04.09 и воспроизведено дважды. Прирост потолка на прогон = chaptersLeft × $0.03 (ставка DefaultPerChapter, занижена ×4.47 — D39.179 п.1), и после первой готовой главы это $0.27, тогда как движок при waves.workers: 4 резервирует под редакторский шаг ~$0.28 ⇒ отказ резервации, прогон встаёт, книга не двигается. Два прогона подряд дали одно и то же: committed не сдвинулся, холд вернулся. ⇒ занижение ставки — не «шкала короче», а СТОП ПРОДУКТА: с какого-то момента каждая следующая покупка не покупает ничего. Лечить придётся согласованно двумя сторонами (ставка платформы + резерв движка под шаг с параллельными воркерами), носитель — ряд регистра зоны, вес major за недостижимость продукта, а не за деньги: сам стоп НЕ ЖЖЁТ ничего — замер платформы 04.09 показал отмену ДО ухода запроса (латентность 2031 мс, model_actual пуст, токенов ноль), и вся книга сходится до микро-доллара по трём источникам (request_log 0.278319 · spend.committed_usd 0.278318752 · платформенный committed 278319 микро). ЗАТО HALT НА ПРОГОНЕ, КОТОРЫЙ ПРОДВИНУЛСЯ, ЖЖЁТ — отдельная находка того же прогона и свежая датированная точка строки 78 («леджер = НИЖНЯЯ граница»). Четыре редакторских вызова ушли параллельно; один дошёл ($0.063404) и своим коммитом сорвал потолок, три других отменены в тот же миг, отработав 120756, 156469 и 156470 мс — и легли в леджер нулём. Незаписанное ≈ $0.050.19 на ОДИН halt против $0.278 за всю книгу, то есть механизм, защищающий от перерасхода, сам создаёт неучтённый расход. ⚠ Списание провайдером НЕ доказано (биллинга у нас нет) — утверждается ровно наблюдаемое: вызовы шли 22.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 и передан владельцу. ⚠ ЭТОТ АБЗАЦ ЗАКРЫТ 04.09 и оставлен как история: дверь выдачи ПОСТРОЕНА и заленджена (adf5e53, D39.194), смонтировано 18 операций из 21 (три адреса двери: createExport/getExport/downloadExport), долг П-17 зона пере-сняла. Прежняя проверка «grep -rn 'createExport\|getExport' platform/internal/ — пусто» БОЛЬШЕ НЕ ПУСТА и как гейт не работает. Не смонтированы по-прежнему getRun, updateBook, deleteBookupdateBook несёт продуктовое следствие, строка бэклога 274 (имя книги в выданном файле не чинится ничем). Слово «отдаёт результат» ложно по букве ТОЛЬКО платформенной половиной (п.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.yaml0.2.3 против канона 0.10.0, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 21; зеркало последний раз двигали 15.08 — ⚠ ходившее «30.08» было взято из текста коммита, а не из git log (испр. 05.09), то есть расхождение старше на две недели; отставание ратифицировано 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 mainrc 1, git log main..origin/mainafa7700 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 · 0.10.0 — D39.194 (дверь выдачи: downloadExport, failure_code словарём, Export.url относительный; ⚠ читать с эрратой 04.09-в — минор был ратифицирован без своей кодовой половины и сутки жил ложным на проводе). Прожитые дампы приёмок 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.130137, одна строка на ноту).
  • Открыто на владельце: Развилка строки 291 ЗАКРЫТА владельцем 05.09 — D39.204: отказ резервации на ретрае деградирует во ФЛАГ («пусть флагает просто как-то»); вариант «минимальная покупка ≥ step_max_usd» снят. ⚠ Это оказалось НЕ сменой канона: D2 уже кончается флагом, денежная ветка до него не доходит. · Лестница D25.1 ЗАКРЫТА владельцем 05.09 — D39.205: копия БЕЗ пометки = книга БЕЗ ЕДИНОГО ПРОПУСКА; любой пропуск ⇒ пометка в файле, гранулярность — ЮНИТ (пропущенный кусок главы критичен). Имя файла решено паком 7e2226a (вычисляется при скачивании). ⚠ Прежняя редакция держала это открытым на владельце — по ней он и получил вопрос, который сам уже закрыл · лейбл главы без заголовка (сейчас цифры; словесный шаблон = одна строка reader.txt после ратификации К-3) (⚠ три вопроса пака ЗАКРЫТЫ словом владельца 30.08: экспорт юзеру — всегда строить, см. п.4 очереди · модель пометок подтверждена как построена — надпись о пропуске в файле, отдельный варнинг-слой в интерфейсе НЕ строим, машинный отчёт сборки остаётся внутренним носителем (дрейф) · RTL — снят до появления право-налевой целевой пары) · ⚠ ПЛАТФОРМЕННЫЙ ЛИСТ ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 30.08 — четыре ответа и их следствия ЦЕЛИКОМ телом D39.176 (квот нет · продажа не в бете · продолжение после пополнения — руками · фразы пользователя делегированы проекту с требованием интернациональности). ⚠ Лист ПУСТ: последний его пункт (PD-421, «держит ли открытый поток сессию живой») СНЯТ замером 30.08 — окно бездействия сессии 14 суток, абсолютный срок 30 (platform/internal/config/config.go:428=defaultSessionIdle), скольжение окна идёт на любом аутентифицированном запросе, а поток теряется лишь после того, как подметён протухший ряд, то есть после ДВУХ НЕДЕЛЬ без единого действия пользователя. ⚠ Часовой интервал в этой теме — периодичность УБОРКИ, а не срок сессии (эррата 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.136145, здесь не держатся.
  • Сделано (сводно) — снимок ленты закрытых эр в archive/PROGRESS-2026-08-04-09.md; детали — D-лог и слайсы.
  • КУРС НА 04.09 — ПОРЯДОК РАБОТ, СОБРАННЫЙ ВЕЕРОМ ПО ВСЕМУ БЭКЛОГУ (31 агент, 46 кандидатов, шесть срезов + опровергатели + критик полноты). ⚠ Главный результат метода, а не списка: из 46 кандидатов бэклога опровержение пережили ДВА — остальное трекерная инерция; а то, чего в трекере не было ВОВСЕ, оказалось тяжелее всего, что в нём есть (строки 269275, заведены этим же заходом). Порядок: (1) ЭКСПЛУАТАЦИЯ — ЗАКРЫТА ЛЕНДИНГОМ 05.09 (7e2226a + 3e84716, акт D39.201): бэкапы с ПРЕДЪЯВЛЕННЫМ восстановлением, дверь для не-браузерного клиента, имя книги. Строки 269 · 270 · 274 закрыты и сняты из таблицы; ниже — история заказа. Строка 269 бэкапов нет ни у оплаченной работы, ни у денежного реестра — ЕДИНСТВЕННАЯ находка дня без частичного исхода: одна потеря диска необратима и недоказуема · строка 270 у продукта НОЛЬ дверей: bearerToken объявлен и не выдаётся, живой цикл 04.09 прошёл через dev-вход, который прод отказывается запускать, фронт заморожен · строка 274 имя книги в выданном файле исходноязычное и не чинится ничем (дёшево, а ломается первое, что видит человек). (2) ДЕНЬГИ И ЕДИНИЦА ЗАКАЗА — РЕШЕНО 04.09 во ВТОРОЙ редакции, строки 276283: заказ это ОБЪЁМ, объём меряется ЗНАКАМИ ИСХОДНИКА ПО ЮНИТУ (движок публикует в манифесте), «страница» — их отображение и её размер это ДАННЫЕ ЛОКАЛИ; вердикт ДО клика, сумму человек не выбирает. ⚠ Первая редакция мерила ГЛАВАМИ и пала: глава надёжна в одном случае из трёх, дыру нашёл владелец. ⚠ Тем же вопросом вскрыта ВТОРАЯ ненадёжная единица — character_count считает байты файла (для EPUB — zip) и подписан у пользователя «Знаков», строка 282. ⚠ ФОРМА ЗАКРЫТА РЕШЕНИЕМ ВЛАДЕЛЬЦА 05.09 (D39.196): баланс — ДЕНЬГАМИ и виден, ползунок потолка — деньгами, второй ползунок объёмом (главы если распозналось, знаки если нет), старт = холд. Запрет «денег в UI» ОТОЗВАН владельцем; ждать от него больше нечего. Разбор трёх независимых чтений в architecture/15-money-path.md §«ОТКРЫТАЯ РАЗВИЛКА 04.09»; PD-440/PD-441. Смена единицы — амендмент D39.84, объявленный требующим отдельного слова ещё при вписании глав (D39.110 п.2а, «добор оркестратора»); сам владелец 28.08 назвал нынешнюю ручку «денежной ручкой с подписью главы» (D39.165 §1). ⚠ Смена единицы БЕЗ «сказать, когда кончилось» ухудшает продукт: стена перестаёт быть свойством книги и становится свойством ввода, то есть встречается ПЕРВЫМ действием, а не в конце. (3) ДЫРА ЧЕРЕЗ ПОЛЬЗОВАТЕЛЬСКУЮ ДВЕРЬ — ЗАКРЫТА ЛЕНДИНГОМ 05.09 (81a89e9, акт D39.206): граница internal/membank/wirefence.go, три точки исполнения, инвариант снова выполняется КОНСТРУКЦИЕЙ. Строка 271 закрыта и снята; ниже — история заказа. Строка 271: правки банка едут в system-сообщение дословно, а ратифицированный инвариант «untrusted DATA, никогда инструкции… выполняется КОНСТРУКЦИЕЙ» конструкцией больше не выполняется. Дёшево, и обязано быть закрыто ДО первого внешнего пользователя. (4) КАЧЕСТВО — ЦЕЛЬ №1. ⚠ ФОРМУЛИРОВКА «НЕ МОЖЕТ СТАРТОВАТЬ» БЫЛА НЕВЕРНА И СНЯТА ВЛАДЕЛЬЦЕМ (D39.198 п.5, испр. 05.09): из четырёх названных гейтов (24 · 13а · 55 · 149) ТРИ сняты его словом, четвёртый гейтом не был. Живое здесь другое и оно в строке 275: приоритет назван — (1) 100% консистентность · (2) отсутствие выдумок · (3) художественность, и он говорит не о весах рубрики, а о том, ЧЕЙ ОТКАЗ ОСТАНАВЛИВАЕТ ВЫПУСК. Классы дефектов привязываются к УЗЛАМ (банк · редактор · черновик), а не сливаются в одно взвешенное число: оно не диагностирует. ⚠ Дорогое расхождение здесь остаётся, но НЕ то: приоритет №1 сегодня кодом НЕ исполняется — доки держат порог 98%, glossary_miss отгружается флагом ранга 5, а приоритет №2 носителя не имеет вовсе (строка 286). (5) ВТОРАЯ ПАРА ЛОМАЕТСЯ МОЛЧА — после (1)(4), пока пара одна, цена ошибки нулевая. Строка 272 шаблон книги один на все пары и раздаёт КАЖДОЙ книге transcription: palladius · строка 273 пар-шов асимметричен: нет промптов — падает громко, нет целевых ДАННЫХ — выключается молча ВМЕСТЕ С БАНКОМ, то есть книга переводится целиком за полные деньги без механизма консистентности · строки 258/259 через раннер нет ни одной фикстуры с не-ru целью, латинописьменной цели в репо нет вовсе. ⚠ Что веер НЕ менял: горизонт (ДОБОР ИДЕАЛА → вторая пара → МАСШТАБ → пилот → ридер-IDE) остаётся тем же; переставлен ПОРЯДОК ВХОДА в него, и вход теперь эксплуатационный, а не качественный — потому что пускать пользователя некуда и нечем страховать.
  • Курс: этапы ОБЩНОСТЬ · КАЧЕСТВО БАНКА · ПАКЕТ-ЧЕКЕРОВ · ФРОНТ-ЭРА · шов/платформа/движковые блокеры — ПРОЙДЕНЫ (D39.59123). Хвосты курса живут строками: 16 (полная цена холодного старта; edit-волна на малых прогонах отработала и оплачена — 58 вызовов волновым драйвером 2325.07 плюс 648 до драйвера, счёт по леджерам ~/books/gu-zhenren/**/*.db) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код 553f1a3).
  • Горизонт (D39.62/67, освежён D39.95): ДОБОР ИДЕАЛА (первым прогоном: оси голоса 24 · авто-режим · цена 16; остаток арбитража банка = рецензент спорных кластеров при ре-пробе — D39.102). ⚠ Испр. 05.09 (D39.198 п.5): прежняя редакция держала здесь ТРИ предусловия, снятых владельцем, — жильцы ролей (149: разморозка ничего не разблокирует, пока идут доработки) · веса K1K12 (13а: веса не нужны, мерить по узлам) · вне-претрейн чекпоинт (55: прогоняем на тех же текстах, оговорка — ограничение ВЫВОДА, а не требование новой книги) → ВТОРАЯ ПАРА живьём (ja→ru; преп 81) → МАСШТАБ → пилот Ф2.5 (гейт резюме-строки 80; строки 6268, 85) → Ф3 ридер-IDE (6971). Стоячие: ToS-триггер 25.10 · Ш-2 до go1.27 (⚠ + x/text Unicode 17 тем же тулчейном — строка 119, реестр §Б-108 справочника якорей) · платные прогоны разблокированы (проба провода — D39.97, конфиги 112 залендены).
  • Стек (полная карта роль→модель→конфиг→квирки — STACK.md, D39.126): draft deepseek-v4-flash thinking-ON low ⚠0731 → терминолог (та же модель) → editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (топология ПОДТВЕРЖДЕНА при неразличимости жильцов — D39.117; закон-блок ОБЯЗАТЕЛЕН и ВНЕСЁН — D39.104 п.2, вайр-батч принят D39.199; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (D30.4) — ⚠ ТРИГГЕР ПЕРЕ-КАЛИБРОВКИ СРАБОТАЛ 31.08 (испр. 02.09): платный прогон отработал и дал собственную оценку движка projected_book_usd = 1.1377277707 на десяти главах при куплённых $0.436110; число D30.4 держать как июльское. ⚠ Вендор-факты 1315.08 (пере-пин ИСПОЛНЕН и ПРИНЯТ, D39.137): таблица цен запинена ПИКОМ (flash 0.44/1.32 · pro 1.32/3.96/кэш-хит 0.044 за 1M; счёт шиппинг-c1 = 100% DeepSeek ⇒ ×4.24.4 в пике / ×2.12.2 в долине — замер по трём прогонам); ⚠ испр. 05.09: носители про эффорт pro БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ — и квирки (§3г), и STACK.md говорят одно: ручка ДОХОДИТ до модели с вендор-апдейта 13.08. Живой остаток один — вендор-сверка маппинга и ВЕЛИЧИНА эффекта, строка 237(б); ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ ВЕСЬ банковый контур (банкнота+терминолог+классификатор) ВКЛЮЧЁН в shipping-c1 с b8154cdenabled: true у обоих гейтов и classify_types: true, бюджеты по $1.00 (прежде жил только ран-локальным конфигом книги; строка 140 — его единственный вход mining.contrast_path в git ОТСУТСТВУЕТ, развёртывание обязано положить артефакт, иначе контур не исполняется вовсе, носитель — строка 251; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за budget_usd: 0 (STACK.md §примечания).
  • ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). СЧЁТ ОЧЕРЕДИ на 05.09 (скриптом по таблице — python3 docs/scripts/counts.py; обновлять при каждом лендинге): всего 214 строк · зона бэкенд 105 строго / 147 широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · блокеров очереди 0 (236 закрыта D39.175), платные прогоны разблокированы · «скоро» 86 (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
  • Архивы хроники: archive/PROGRESS-2026-07-04-10.md (D31) · -10-13 (D39.6-гигиена) · -13-25 (стройка паков 1116, rerun2) · -25-31 (паки 1720 · мини-прогон · полигон-пакеты 58 · ToS · холодный прогон; D39.2658) · -08-01-02 (сессии №9/№10: общность · качество банка · coldrun-b · открытие фронта/платформы; D39.5990, срез D39.105) · -08-02-04 (сессии №11№13: ручки эффорта · стандарты · контракт API · платформа P0 · банк-арбитраж; D39.91105 + снимок шапки эры №15) · -08-04-09 (пинги закрытых паков эры №15) · -08-14-15 (закрытые бэкенд-записи №1617: эмиттер шва · migrate · пере-пин DeepSeek; вынесено D39.139). Записи ниже — живой хвост (№16+, эра D39.124+; подрезка D39.139).

📌 СОСТОЯНИЕ ПАКОВ

Залендены и ратифицированы, приёмочные дампы — телами нот: платформенный P11 — D39.169 · движковый пак «деньги» — D39.170 · платформенный P12 — D39.180 (вместе с контрактным минором 0.9.0; PD-425 закрыт им же) · бэкенд-пак «деньги и честность выдачи» — D39.182 (тестов 1045→1083, удалённых ноль) · закон раскрытия движка — D39.181, ратифицирован владельцем и применён к одиннадцати экземплярам.

ПАКИ 05.09 ОТРАБОТАНЫ И ПРИНЯТЫ ОБА С ДОФИКСОМ, промты в archive/prompts/ с баннерами исхода, зоны свободны: движковый «денежный стоп» — 81a89e9 + 616a8e4, акт D39.206 (18 находок приёмки, 6 снято, 12 устояло, 4 major — все четыре оказались УТВЕРЖДЕНИЯМИ, а не поведением); платформенный «пустить внутрь можно» — 7e2226a + 3e84716, акт D39.201 (20 находок, 5 снято, 15 устояло, 5 major — ТРИ в самом механизме бэкапа). Ниже — история паков 04.09. ПАКИ 04.09 ОТРАБОТАНЫ И ПРИНЯТЫ ОБА (испр. 05.09). Платформенный «закрыть цикл» — adf5e53, D39.194, контрактный минор 0.10.0 тем же актом (⚠ эррата 04.09-в: минор ратифицирован БЕЗ своей кодовой половины и сутки жил ложным на проводе; починено 7e204db). Движковый вайр-батч — приёмочный коммит 74ffe4f, D39.199, принят С ДОФИКСОМ; строки заказа 210·113·46·134·140·184·232 ЗАКРЫТЫ и сняты из таблицы, найденное вне карты отчёта заведено строками 287290. ⚠ Эррата 04.09-д («пак НЕ принят») ИСЧЕРПАНА этим актом. ПАКИ 05.09 ВЫДАНЫ И ИДУТ: движковый «денежный стоп перестаёт быть аварией» (archive/prompts/BACKEND_MONEYSTOP_SESSION_PROMPT_2026-09-05.md — строки 271 · 277 · 278 · защёлка отказа) и платформенный «пустить внутрь можно» (archive/prompts/PLATFORM_OPERATIONS_SESSION_PROMPT_2026-09-05.md — строки 269 бэкапы с предъявленным восстановлением · 270 дверь для не-браузерного клиента · 274 updateBook · рантбук деплоя). ПАКИ 04.09 РАБОТАЛИ ПАРАЛЛЕЛЬНО (зоны независимы по коду; сцеплений ДВА, и второе найдено 04.09 уже после выдачи промтов — оба про то, чтобы не сорвать платный прогон платформы:

(1) форма манифеста ЗАМОРОЖЕНА на окно (D39.190 п.5): гейт интейка — строгое равенство одной константе, бамп отправил бы каждую книгу в parser_unavailable. (2) ⚠ ДАННЫЕ ЯЗЫКОВОГО ПАКЕТА — ТОЖЕ. Правка backend/internal/lang/data/*.txt двигает EmbeddedVersioncutTag (докстринг 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 — после шагов 01 полигона (D39.190 п.3). Предыдущие паки ОТРАБОТАНЫ 03.09, ПРИНЯТЫ С ДОФИКСОМ и залендженыD39.187 движок, D39.188 платформа; составы и приёмочные дампы ТЕЛАМИ НОТ, промты в archive/prompts/ с баннерами исхода, план паков — archive/reports/NEXT_PACKS_PLAN_2026-09-03.md, решения — D39.190. ⚠ Живое отсюда одно и оно уже вылечено паком P13: у формы манифеста БЕЗОПАСНОГО ПОРЯДКА ДЕПЛОЯ НЕТ — гейт интейка сравнивает версию со строгим равенством одной константе (platform/internal/ingest/manifest.go, греп KnownManifestVersion), окна двух версий нет, поэтому порядок «сначала платформа, потом движок» из рантбука разворачивается на обратный.

Проводка --max-units в платформу остаётся ГЕЙЧЕНОЙ. Живое основание одно и оно механическое: единственный писатель bank_moved_at — дверь правок банка (platform/internal/runs/bank.go:182), а рост АВТО-банка от майнинга этого флага не ставит, поэтому майнящая книга на второй покупке идёт без --resnapshot и умирает на снапшот-гарде движка — холд взят, попытка сожжена (PD-422). ⚠ Сюда же переехал остаток закрытой строки 234 (испр. 05.09): проводка полей rebill_* через шов — часть ЭТОГО гейта, а не отдельная работа; ревизия справедливо заметила, что после закрытия 234 её остаток остался без видимого носителя. Это чинится проводкой признака движения банка от майнинга, а не решением владельца.

ОТКРЫТО НА ОРКЕСТРАТОРЕ №22: Ресёрч-сессия textmachine-36 — лендинг research/29 ЗАКРЫТО 04.09. Оба отчёта топологии заленджены полигоном на СВОЕЙ ветке по прямому указанию владельца (a7951a7) и приехали в main мержем ветки — то есть маршрутом, который и был назван правильным. Файлы на месте: docs/research/29-harness-topology-survey.md и …-codex.md.

ЖИВОЙ ОСТАТОК — РЕВЬЮ-ШАПКИ, и он на оркестраторе. У research/30 шапка НАПИСАНА 05.09 — долг по нему закрыт (попутно исполнена эррата, которую он сам требовал пять недель: research/22 «LinguaGacha явно НЕ в мульти-агент/редактор» помечено протухшим; и снято его же требование к 29-codex — якорь :368 протух, реальный носитель :108 говорит слабее и о другом). У 29-codex шапка НАПИСАНА 05.09 — и она подтвердила снятое выше независимо: его же §4 п.12 говорит, что пробел в long-form детекторе машинности — в held-out точности и доле ложных срабатываний, а не в русском языке. У research/29 шапка НАПИСАНА 05.09 — ДОЛГ ЗАКРЫТ ПО ВСЕМ ТРЁМ ОТЧЁТАМ. Первым в ней стоит §5.6: сфабрикованный sha256 (совпали 52 знака из 64, хвост дописан по памяти, потому что хеш ни разу не был виден целиком из-за cut в конвейере) — и норма, из него следующая: идентификатор, не виденный ЦЕЛИКОМ в выводе команды, нельзя воспроизводить по памяти. Тот же класс, что D39.207 п.5, пришедший с другой стороны. ⚠ И граница, которую обязан знать всякий, кто цитирует оттуда числа: из 113 находок автор лично пере-открыла ШЕСТЬ. ⚠ Расхождения 29 и 29-codex между собой НЕ разрешены никем — автор 29 не читала параллельный отчёт дальше его §1, (⚠ испр. 05.09: сама шапка 29 уже поправлена — «НЕ закоммичено» помечено протухшим, файл в main с a7951a7; здесь остаётся долг ШАПКИ, а не факта о коммите). До шапок читать оба отчёта как ФАКТУРУ, не как ратифицированное. ⚠ Формулировка, которую шапка обязана нести, иначе следующая сессия выбросит замеры топологии: судья как СТАДИЯ ДВИЖКА не построен и не вызывался (0 вызовов), но судьи в ПОЛИГОНЕ были и есть. Маршрут закрыт словом владельца 02.09: «не трогай соседнюю git tree ветку вообще» — файл принадлежит ветке polygon, в main приезжает мержем ветки, копированием из соседнего worktree — никогда (№22 так сделал, был поправлен, лендинг откачен).

НОРМЫ, ЗАРАБОТАННЫЕ ЭТИМИ ПРИЁМКАМИ:

  • Зелёная батарея — это ПОЛНЫЙ список пакетов ПЛЮС отсутствие FAIL, а не отсутствие FAIL: обёртка подавала exit 0 при падении в хвосте (поймала сама движковая сессия).
  • Линтер якорей гоняется ПОСЛЕДНИМ шагом, после того как код замер. Он судит доки трёх зон, но зоны его не зовут; в этот заход нашёл 21 указатель на исчезнувший код, и правки сдвигали цели дважды подряд — включая мои собственные, уже после починки.
  • Якорь разрешается тем, ЧТО он утверждает, а не номером строки, на которой лежал (движковая сессия записала переезд по совпавшему номеру и промахнулась предметом).
  • Колонка «подтверждено» отчёта, пойманного на ложных подтверждениях, снимается с доверия ЦЕЛИКОМ — критерий, отличавший ошибочные строки от верных, назвать нельзя.
  • pkill по имени процесса на машине с параллельными сессиями бьёт по чужим.
  • Число или «доказано» уходит владельцу только после СВОЕГО прогона.

⚠ ПИНГ ЗОНЕ БЭКЕНДА (оркестратор №22, 04.09, вечер) — РЕВИЗИЯ ДОКУМЕНТАЦИИ ЗОНЫ ЦЕЛИКОМ

Внешний ревизор прочитал backend/README.md, все 11 файлов backend/docs/ (включая оба PUML текстом) и арх-доки движка от первой строки до последней. Правит ЗОНА. Порядок — по цене ошибки.

1. README.md:36 описывает инвариант через ключи, которые загрузка ОТВЕРГАЕТ. «Канал adult — только permissive (fail-closed)»: permissive: и channel: — RETIRED и валят конфиг (internal/config/models.go, греп LegacyPermissive; internal/config/pipeline.go, греп LegacyChannel). Настоящий механизм — content_labels книги × accepts_labels модели — в README не назван ВООБЩЕ. Сессия, строящая маршрутизацию контента по README, получит неподнимающийся конфиг. Ту же ложь несут оба PUML.

2. ОБА PUML БЕЗ ⚠-БАННЕРА рисуют снесённое, при том что docs/README.md подаёт их как канонические диаграммы, правящиеся «одним коммитом с кодом»: exit-контракт из ЧЕТЫРЁХ кодов (в cmd/tmctl/main.go — коды 4, 5 и полоса 1019), глаголов 6 против 11, mined_delta/mined_rejects как ключи book.yaml (RETIRED, валят загрузку), машинная .bank-stop.json (снесена D39.158), Adult bool. В заголовке обоих — «синхронизировано с D1D39.25» при живой голове D39.195.

3. README.md:95 называет боевой редакторский промпт v3 (⚠ испр. 05.09: второй адрес этого пинга — 10-prompt-architecture.md:23 — снят, потому что этот файл ЗОНА ОРКЕСТРАТОРА и бэкенд его не правит; поправлено своей рукой) — в configs/pipeline-c1.yaml метка v4-discourse-reflow-nogenre, и с D39.182 она НЕСУЩАЯ (TestPromptLabelsPinTheirBytes). Поверивший README либо бампнет v3→v4 в уже-v4 файле, либо получит красный гейт.

4. README.md:3 обещает автоматику, которой нет: «подсистемы не импортируют друг друга (проверяется go list -deps)». Сама изоляция ДЕРЖИТСЯ — проверено, — но проверки нет: grep -rn 'go list' backend --include=*_test.go --include=Makefile → 0, а internal/archguard несёт три анализатора, границы импортов среди них нет. 13-tech-debt-anchors.md это констатирует, README нет.

5. ⚠ ОБЩНОСТЬ ПЕРЕОЦЕНЕНА, и долг без носителя. README.md:23 («гейты по данным, Go-веток по паре нет») и README.md:16internal/text — script-agnostic, без языковой политики») — сверх-утверждения: internal/text/norm.go встраивает китайскую таблицу трад→упр, складывает катакану в хирагану и БЕЗУСЛОВНО сливает ё→е для ЛЮБОЙ цели (белорусская цель ломается тихо); санитайзер считает только latinLetters/cyrLetters, поэтому греческая/арабская/хинди цель получает «латинскую вставку» на каждом слове; граница слова в банке проверяется только для Latin/Cyrillic. ⇒ Ревью-вопрос «пара, которой в репо нет, без правки Go» для не-кириллической цели отвечается НЕТ, а README это скрывает.

6. Ратифицированная норма зоны держится на СНЯТОЙ строке. DISCLOSURE_LAW_DESIGN.md:219-221: «Пока строка бэклога 246 открыта, новый класс вводится в полосу ТОЛЬКО вместе со сверкой… Закроется 246 — оговорка снимается». 246 ЗАКРЫТА 04.09 (D39.194) ⇒ оговорка снялась молча, и это надо подтвердить или переписать сознательно, а не по факту исчезновения строки.

7. ⚠ СЕМЬ ПРОТУХШИХ ТОКЕН-ЯКОРЕЙ В backend/docs/ — и до сегодня их не видел никто. Корень backend/docs в линтере ОТСУТСТВОВАЛ с самого его заведения; добавлен 04.09 (docs/scripts/counts.py, греп backend/docs в lint_anchors). ЗАКРЫТО 05.09: все семь пере-навешены (616a8e4 два мёртвых + e7d6b3f пять съехавших), --lint → 0. Ниже — состояние на середине дня, читать как историю. ⚠ Прежняя редакция: «починены ДВА из семи, пять живы» (DISCLOSURE_LAW_DESIGN.md:40-44 целят в quality.go · status.go ×3 · bookbuild.go — зона бэкенда, пинг в её секции). ⚠ Прежняя редакция этой строки говорила «семь пере-навешены» — ложь, выведенная из ожидания, а не из прогона линта; поймана внешним ревьюером. Починенные два не съехали, а УМЕРЛИ: целили в (DISCLOSURE_LAW_DESIGN.md:264 и MONEY_HONESTY_REPORT.md:285) не съехали, а УМЕРЛИ: целили в chunkrun.go=SourceEchoExpected: role == roleTerminologist, подстроки которой на HEAD нет вовсе — её съел переход на isBankRole. Прежняя редакция этой строки перечисляла краснеющие цели и была верна ровно до починки. Прежде краснели: DISCLOSURE_LAW_DESIGN.md:40-44 (пять целей подряд — quality.go, status.go ×3, bookbuild.go), :264 и MONEY_HONESTY_REPORT.md:285 (chunkrun.go:40). ⚠ Эррата D15.2 от 02.09 УЖЕ указывала мимо — гейт не мог этого увидеть по построению. Команда: python3 docs/scripts/counts.py --lint.

8. Ссылки «строка N» на строки, ВЫПАВШИЕ из таблицы при закрытии: README.md:26 (103 — фантом, снят 31.08), pipeline.puml (99 · 100 · 101 · 125 · 145), DISCLOSURE_LAW_DESIGN (246 · 238 · 239 · 194), internal/membank/decisions.go:84 (210 — закрыта 04.09). Бэклог закрытые строки НЕ хранит, а доки зоны адресуют их как живые.

9. Мелочи с адресом: README.md:5 «актуализировано 01.08», тело цитирует ноты 2328.08 · 13-tech-debt-anchors.md:174 цитирует STACK.md в состоянии, которого там уже нет (ручка эффорта proоба носителя датированы 04.09 и противоречат) · SEAM_PACK_FINDINGS.md:130 «у bank-apply ноль вызывающих на платформе» — platform/internal/runner/bankapply.go строит вызов · :1133 «два хита» → четыре · MONEY_HONESTY_PLAN-NOTE.md:35 «22 поля» → 21 на её же HEAD.

10. НЕ ОПИСАНО, А НАДО: пакет internal/langscreen (новый, на денежном пути вердиктов) в README не упомянут вовсе · карта пакетов не называет ~20 несущих файлов internal/pipeline (volume.go, rebill.go, reprice.go, refusal.go, terminologist.go, bookbuild.go…) и пять в internal/store · cmd/tmmutate (каталог 141 посадки, объявленный ГЕЙТОМ) и cmd/tmvet не названы · цена закона раскрытия («загейчен на 40 %», Г1/Г2 не построены) в статус-борде 09 не оговорена.

Что оркестратор поправил СВОЕЙ рукой в свою зону тем же заходом: статус-борд 09-target-architecture.md говорил «цикл РАЗОМКНУТ» и «канон 0.9.0» в день своего же «освежения» — оба ложны с adf5e53/58bca19; висячая ссылка на закрытую 246 в шапке секции «Бэкенд»; корень backend/docs в линтере.

Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)

Закрытые строки здесь НЕ хранятся — они уходят в D-лог с номером решения. ID строки стабилен навсегда (не перенумеровывается и не переиспользуется — на «строку N» ссылаются доки и промты, D39.80). Вес: «блокер-очереди» = мешает текущему шагу · «скоро» = ближайшие 12 касания · «когда-нибудь» = записано, не потеряно. Длинная строка начинается жирным лидом — таблица сканируется по лидам; «диспозиция сверху, археология вниз», ячейка >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) — их строки сюда НЕ заходят; здесь движок/полигон/доки, включая движковые стыки фронта (зона «бэкенд», как 99102); строки 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 отвечен — семейства не окупаются (C3SC=+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) владелец скоро (⚠ испр. 05.09: D39.205 п.4 сделал эту строку ПРЕДУСЛОВИЕМ решения владельца по гейту глоссария — прежний вес «когда-нибудь» противоречил ратифицированному; порядок работ — строка 295) (после фазы 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б speech-cue.txt zh НЕ шипить до замера голос-флаггера; замера НЕТ (D39.86) — оси не считались НИ РАЗУ.Причина ПЕРЕ-НАЗВАНА: прежний довод «редакторская волна не гонялась» ПРОТУХ 31.08 (холодный прогон coldrun-v16 её гонял и оплатил — строка 16); живой блокер — ПУСТОЙ РЕЕСТР профилей, см. ниже. ⚠ ГЕЙТ ПЕРЕ-СНЯТ 05.09: прежний требовал «подписанных профилей (строка 24)», а подпись владелец снял (D39.198 п.5) — значит гейтом остаётся ОДНО: первый прогон добора идеала С редакторской волной. Но снятие подписи открыло дыру, и её надо закрыть раньше стройки: реестр voices:/addresses: физически заполняет только подпись (backend/internal/config/seed.go, греп no miner emits them), и если подписи нет — заполняет НИКТО. Вопрос вынесен строкой 24. ⚠ Сам гейт в схеме ЕСТЬ (internal/config/pipeline.go VoiceGate, пак-19/D39.55). ⚠ rules= в отчёте = «гейт СКОНФИГУРИРОВАН», не «отработал» — до фикса читать по знаменателям replies= — носитель 292 (испр. 05.09: 105 закрыта D39.200 только половиной (а), знаменатели уехали в 292). Археология дословно — 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.15.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 ГЕЙТОМ БОЛЬШЕ НЕ ЯВЛЯЕТСЯ — испр. 05.09 (D39.198 п.5): прежняя редакция держала «профили голоса НЕ ПОДПИСАНЫ» как предусловие, а владелец подписи снял («зачем мне это подписывать») и вытаскивать черновик из книжного дерева не надо. Голос — приоритет №3 из трёх, то есть работа, а не блокер. Остаток: авто-режим флага (проект Б не гонялся) · оси голоса AD · слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в). ⚠ ОТКРЫТЫЙ ВОПРОС, РОЖДЁННЫЙ СНЯТИЕМ ПОДПИСИ: реестр профилей (voices:/addresses: сида) сегодня физически заполняет ТОЛЬКО подпись владельца — backend/internal/config/seed.go, греп no miner emits them. Если подписи нет, ЗАПОЛНЯЕТ КТО? Ответ нужен раньше стройки: без него строка 13б навсегда «отложено до замера» бэкенд когда-нибудь работа третьего приоритета 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 п.89, 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:1181=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: карточки из подписанного сида, фильтр по именительному падежу, 86112 сверок/арм — 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а Экран кодировки не видит <meta charset> без XML-объявления (епаб с gb18030-метой прочтётся как UTF-8) — до-паковая дыра, сознательно не тронута пачкой 14а (паритет со старым ридером) бэкенд когда-нибудь отдельное решение D39.54, SMALLPACK §8
35 Не-CJK майнер/банк: en-детектора не существует (hanRuns=0), ja с zh-таблицами активно неверен (0/10); нужен второй ДЕТЕКТОР (прототип mine_nonhan.py) + G1G10 требования 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) ⚠ ПРЕДМЕТ ШИРЕ ЗАЯВЛЕННОГО, испр. 05.09 по итогу веера. Снято у прежней формулировки: «не пинится ничем» — ЛОЖНО, zh с настоящими langpacks гоняется в пяти интеграционных тестах; дыра именно в ПОБАЙТОВОМ пине. И «побочно это фикстура общности» — вывернуто: нынешний golden И ЕСТЬ доказательство цели №2 (пара БЕЗ пакета проходит книгу end-to-end байт-в-байт), вторая фикстура служит целям детерминизма и денег. Настоящая цена дыры: один из фолдов снапшота — руками поддерживаемая строка RenderFormatVersion (backend/internal/membank/memory.go); забыли бампнуть при смене байтов провода — денежная ось молчит, а контент-ось перекупает затронутые чанки БЕЗ гарда и БЕЗ согласия (rebill.go: «the CONTENT axis … re-bills exactly the touched chunks and is invisible here»). Единственный механический подстраховщик здесь — побайтовый golden, которого на langpack-пути нет. бэкенд когда-нибудь отдельное решение 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)
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 ~на 4060% при 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
— ШОВ ДВИЖОК↔ПЛАТФОРМА: деньги и механизмы (D39.106/107 п.2) —
136 Write-ahead intent + состояние uncertain-эскроу + closing: холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка платформа/бэкенд скоро (промты по команде владельца) стройка по research/25 D39.106
137 Ночная сверка расходов с данными провайдера (в движок цены входят float64 по ручной таблице ledger/pricing.go — систематика процентная; сверка приоритетнее споров об округлении) платформа когда-нибудь (до первого платного пользователя) стройка по research/25 D39.106
— НАХОДКИ ПРИЁМКИ ЭКСПОВ 1820 (D39.108) —
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.190 п.3 — стройка ПОСЛЕ шагов 01 полигона, а не по первой свободной смене) бэкенд-промт D39.108, D39.117, D39.190 п.3
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_ttlcache_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 на последней попытке как ДИАГНОСТИКА тихого усечения 28k [PARTIAL, GATED] · п.17 assistant-prefill continuation на finish=length вместо ре-рана всего вызова [PARTIAL, DEFER]. Оба помечены в ресёрче как отложенные и ни в одной строке трекера не появились бэкенд/полигон когда-нибудь замер → решение свип доков 08.08, research/21 §1617
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 не трогается; не включена: цена в размере юнитов не замерена бэкенд скоро — ГЕЙТ СНЯТ 05.09: поле ПРИЕХАЛО. Манифест публикует размер юнита в знаках — source_chars (плюс раздельно плотные/разрежённые), лендинг 81a89e9, акт D39.206, аддитивно, версию манифеста не двигало. ⇒ «решение уровня ноты» больше не нужно, замер берётся. Ниже — археология гейта. ⚠ ГЕЙТ ПАЛ И ОКАЗАЛСЯ НЕДОСТИЖИМ (испр. 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: ставится ближайшим бэкенд-паком с мандатом максимального качества; ⚠ испр. 05.09: блокер 236 МЁРТВ — «писатель книги» закрыт D39.175 (30.08), и очередь его больше не держит. Живая диспозиция другая: строка отложена ПОРЯДКОМ — D39.190 п.2, то есть ждёт своего окна, а не предшественника; тесты структуры глав — узлом будущего холодного прогона) пак 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 бэкенд когда-нибудь (до второго прогона книги) малое касание
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 ДВИЖКОВАЯ ПОЛОВИНА ПОСТРОЕНА 05.09expected_usd по главам, book_once_usd, step_max_usd в manifest --json/status --json (лендинг 81a89e9, акт D39.206). Открыта ПЛАТФОРМЕННАЯ: числа публикуются и никем не читаются (`git grep -lE "StepMax step_max" -- platform/` пусто). Движковая поверхность оценки $/глава (ставка-константа платформы $0.03 из exp08 v2 — временная мера беты, П-10 зоны платформы; честная оценка по книге/паре — движковая) бэкенд когда-нибудь отдельный пак
168 Состав волн пайплайна = пар-конфиг (данные), не общий хардкод: вопрос владельца 10.08 «нормально ли под китайский строить весь бэкенд и конфиги?» — жильцы ролей и промпты уже конфиг/langpacks, но ТОПОЛОГИЯ волн (перепис · точечный edit-контур · без второго прохода) одна на всех пар; если фаза Д покажет разных победителей по парам (H-3/H-4: en-черновик+edit против zh-связки), состав волн уезжает в пар-конфиг данными; ревью-вопрос общности §0 12-go-style-notes.md бэкенд когда-нибудь (после данных фазы Д) замер (фаза Д) → решение владельца → малое касание слово владельца 10.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 не начинать до ответа вендора «по какой отметке времени тарифицируется вызов» — вендором НЕ задокументировано — и замера доли пика; дешёвый рычаг: операционное правило «прогоны не стартуют в 0104/0610 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/NormVersionmanifest.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 (после шагов 01 полигона — D39.190 п.3). координационная строка → промт(ы) батча аудит 15.08, D39.134/136/137
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 бинарей: удалять не пиненные ни одной незакрытой попыткой, последние 23 релиза держать для отката; (в) окно совместимости читателей / пин уровня книги — строить ТОЛЬКО по триггерам: много тенантов · бампы схемы еженедельно+ · потребители 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): ретрай в ту же секунду после сорванного шага = 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) оркестратор ⚠ ОЦЕНКА «ПЕРВОГО КАСАНИЯ» ЗАНИЖЕНА — измерено 05.09 веером. Записанное «синк зеркала + перегенерация типов ОДНОЙ командой» неверно по ОБЪЁМУ: перегенерация — одна команда, но она вскрывает переписывание слоя данных. Замерено: 16 операций против 21; 40 новых имён схем в каноне и 10 МЁРТВЫХ в зеркале, на которые src ссылается 31 раз; две ручки, которых платформа не отдаёт вовсе. Плюс гейт версии у фронта читает СВОЁ зеркало (строка 268), то есть отставание он не увидит и после синка. скоро (остаток = только (б) зеркало фронта при разморозке) P7 → фронт при разморозке D39.138, D39.142, D39.143
185 Дописывание глав в ТЕКУЩУЮ книгу («костылей не будет»): форма POST /books/{id}/parts + ответ «сколько глав добавится, что сдвинется и почём» ДО подтверждения; экономика уже позволяет В КОНЕЦ за ~$0.02 (ключ вызова позиционный, исходник вне снапшота), вставка в середину = МОЛЧАЛИВАЯ перекупка хвоста ~$911/500 глав — движковый гейт против молчания ОБЯЗАТЕЛЕН (родня дыры Р6 строки 160); платформа второй файл принять не может (re-parse нет); ja-мина: новый ruby-алиас двигает memory_version → снапшот (громкий --resnapshot, уточнение приёмки); полный $0-резюм хвоста — предусловие D15.2 (строка 49) бэкенд+платформа+контракт когда-нибудь (вместе со строками 160162 — дизайн в паке 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 у клиента; шаги 12 — платформа (её же platform/docs/PLATFORM_DIRECTION.md, греп Условные запросы), семантика — в спеку батчем 183; транспорт НЕ менять (решение владельца по §5б) ⚠ ШАГИ 12 ПОСТРОЕНЫ И ЗАЛЕНДЕНЫ P7 (D39.153) — gzip на JSON и НЕ на SSE + ETag/If-None-Match304 на коллекциях, карточке книги и /capabilitiesи ПЕРЕ-ПРОВЕРЕНЫ ЗАМЕРОМ 28.08 (воркфлоу-ревью P9 на стенде, приёмка D39.162): банк 437 Б холодным → повтор с If-None-Match даёт 304 / 0 Б; юниты главы 3008 Б → 740 Б gzip (×4.1); ниже порога 1024 Б gzip честно НЕ применяется; SSE корректно не сжимается. Остаток — шаги 35 платформа (+контракт/фронт) скоро (остаток: шаги 35) мидлварь/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
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, запись приёмки №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:<bookID>:<wave>:<chapter>:<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)
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:1982=is reserved and is the server), открыта только ГРАНИЦА ступеней замечаний (две ступени при девяти рангах движка); ⚠ её прежний носитель — строка 148 — СНЯТ 21.08 по слову владельца. (з) СНЯТ как ратификация 22.08 сквозной трассировкой (разбор, на который ссылается строка 191): конфликта моделей НЕТ — гейт движка проверяет полноту не ПОДПИСЕЙ, а ФАЙЛА решений, и ОДИН файл со всем банком его снимает (loadMinedDelta штампует только Source, mining.go:855-867 → опущенный статус дефолтится в approved, membank/memseed.go:130=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 держит рукописную копию закрытого словаря ЧУЖОЙ зоны: причин движка 16 (испр. 05.09 — шестнадцатой приехала off_target_langwrong_language с минором 0.10.0; прежняя редакция говорила 15 и это ровно то расхождение, которое строка предсказывала) → коды замечаний контракта. Импортировать движок платформе нельзя (D39.85 — разные модули), поэтому расхождение появится молча в тот день, когда движок добавит причину: платформа отдаст unspecified и напишет ERROR в лог, то есть деградация честная, но карта протухнет незаметно. ⚠ Правила заполнения контрактных фраз по этим причинам УЖЕ НАПИСАНЫ и выводить их заново не надо — компаньон 14-api-contract/README.md, греп по ДОККОММЕНТУ (фраза пишется по доккомменту disposition.go, а не по имени константы; класс 2 схлопывается в ОДИН код). Лечение: движок публикует свой словарь причин артефактом-данными (тем же классом, что манифест и сайдкары банка), платформа читает его вместо копии. ⚠ Класс: носителем был ТОЛЬКО регистр платформы (PD-246) — обязательство к ЧУЖОЙ зоне жило внутри зоны автора бэкенд когда-нибудь (со следующим касанием эмиссии флагов) отдельное решение приёмка P7 (D39.153), релей §7(в)
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
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
227 signature в квитанции двери правок считается от карты, которую переписывает ЛЮБАЯ граница майнинга (находка воркфлоу-ревью P9, 28.08): запись карты стоит ВЫШЕ решения о стопе (backend/internal/pipeline/mining.go:192=writeFileAtomic(r.signatureMapPath()), поэтому signature != null НЕ означает состоявшегося стопа подписи; surfaces/undecided дрейфуют между двумя вызовами владельца, а undecided: 0 достижим при НЕпредъявленных решениях (кап top-200 вытесняет). ⚠ Починка аддитивна и носитель для неё уже есть: карта несёт СВОЙ идентификатор (backend/internal/membank/decisions.go:981=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:2158=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 ЛИД ПРОТУХ — испр. 05.09: вторая половина (слот гранта на прерванном между волнами юните) ЗАКРЫТА паком «число согласия» (D39.187, пин TestAUnitInterruptedBetweenWavesTakesNoSecondSlot; эррата 03.09-а). Настоящий остаток — две схемные оси («первая редакторская стадия», «прерванная пере-делка») и отложенное слово владельца о семантике переноса. Ось «свежий/пере-делка» выведена из ПОЛНОТЫ СТРОК, а не из факта отгрузки (D39.170, находки охотника 3 и 4). Следствия ДЕНЕЖНЫЕ на слух покупателя: добавление стадии в пайплайн превращает ДОЧИТАННУЮ книгу в «3 unit(s) NEVER delivered» и приглашает купить её снова; юнит, прерванный между волнами (signature stop, денежный потолок, Ctrl-C), второй раз считается свежим и тратит слот гранта повторно — замерено 4 купленных юнита → 2 главы. Носитель у движка УЖЕ есть: реестр анонсов events_outbox.once_key (backend/internal/pipeline/events.go:401=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
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'ом вендора. ⚠ Испр. 05.09: НОСИТЕЛИ БОЛЬШЕ НЕ ПРОТИВОРЕЧАТ — и квирки (docs/experiments/00-provider-quirks.md §3г), и 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:509=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 Остаток аудита доков 3031.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 часа) оркестратор скоро пройти списком аудит доков 3031.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
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 + пункт чек-листа приёмки
249 (пример в теле ниже ссылается на ряд PD-246 — он ЗАКРЫТ D39.194; пример держим как археологию класса, живым рядом его не читать) Девять рядов бэклога потеряли слово веса, и гейт на них НЕ краснеет.Лечение ПОСТРОЕНО (сверено кодом 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 ЛИД ПРЕУВЕЛИЧЕН — испр. 05.09: «не работают вовсе / блокирует любой прогон» ложно — пользователь ubuntu, литерал пути РАЗРЕШАЕТСЯ, полигон покупал 30.0802.09. Живой долг — сам захардкоженный путь, а не блокировка. Скрипты полигона захардкодили АБСОЛЮТНЫЕ пути двух корней и не работают на этой машине вовсе. ДВА РАЗНЫХ слома. Корень репо — смена пользователя: литерал в 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) плюс корневые гейты и сборщики корпусов; остальное — скрипты закрытых эксп-1216, их владелец велел ВЫБРОСИТЬ, а не чинить (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:559=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-шаги миграций v8v14 не идемпотентны вопреки шапке 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-довесок исполнен частично; ⚠ ПЕРЕ-СНЯТА 05.09 (D39.198 п.5): требования НОВОЙ книги здесь НЕТ. Владелец: прогоняем на тех же текстах (мастер Гу и Жан-Кристоф), а «известность модели по претрейну» остаётся ОГРАНИЧЕНИЕМ ВЫВОДА — результат на классике читается как предварительный, и это пишется в вывод, а не покупается новой книгой. Прежняя редакция несла ЖЁСТКИЙ платный заказ полигону. срез эксп-21 НЕ купил (главный zh-замер на книге 4/5, без пинга) — остаток = ОГОВОРКА В ВЫВОДЕ, а не покупка: замер идёт на мастере Гу и Жан-Кристофе, а «модель знает текст по претрейну» пишется ограничением результата (⚠ испр. 05.09 — колонки продолжали заказывать неконтаминированный zh-срез уже ПОСЛЕ того, как шапка строки его сняла: полигон читает колонки) полигон когда-нибудь (оговорка вывода, не заказ) формулировка в отчёте 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 · дистилляция 714B); + 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)
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
114 Конфиго-слой ручки эффорта: два дешёвых хвоста приёмки (вне снапшота, $0 прогонов). (а) Д4 отчёта: gates.terminology.target_script НЕ сверяется с book.target_langtarget_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 заведён) — ⚠ тот же факт несёт строка 237(а), испр. 05.09: чинится ОДИН раз и там, здесь он ЗАПИСЬ РЕЕСТРА, а не заказ · вахта маппинга эффорта 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 ЛИД УКАЗЫВАЕТ НА НЕСУЩЕСТВУЮЩУЮ ФУНКЦИЮ — испр. 05.09: продового buildCheckers нет (grep -rn 'buildCheckers' backend --include=*.go → только тест-хелпер), и lang.Load( вне тестов не вызывается вовсе. Класс «бейзлайны ключуются по классу, не по паре» может быть жив — но искать его надо не здесь. ⚠ Где искать (пере-снято 05.09): единственный прод-носитель бейзлайнов сегодня — backend/internal/config/models.go, и ключуются они по KIND ПРОВАЙДЕРА, а не по паре; пара-специфика чекеров живёт данными internal/lang. ⇒ строка держится как ревью-вопрос общности («заработает ли пара, которой в репо НЕТ»), а не как известный адрес правки: прежде чем строить — предъявить дефект на паре, которой нет. 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) ⚠ ФОРМУЛИРОВКА ПРОТУХЛА, испр. оркестратором 05.09 по итогу стратегического веера: лид говорит «экспорта на стопе нет, пишется только в ветке авто-продолжения» — сегодня exportBank(ctx, "bank-mining/signature-stop") НА СТОПЕ ЕСТЬ (backend/internal/pipeline/mining.go, греп signature-stop). Отсутствует не ВЫЗОВ, а НАПОЛНЕНИЕ: exportBank проецирует таблицу глоссария, а майненные строки попадают в неё только через writeAutoBank+seedGlossary, и оба лежат ВНУТРИ ветки if !stopping. ⇒ Экран подписи читает артефакт, гарантированно пустой ровно от тех строк, ради которых открыт. Кто пойдёт чинить по прежнему тексту — будет искать несуществующий пропущенный вызов. бэкенд + платформа скоро (держит экран подписи вместе с 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, а она двигает EmbeddedVersioncutTag → ключ манифеста → снос 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. (а)ЭТО ТОТ ЖЕ ДЕФЕКТ, ЧТО СТРОКА 224 — испр. 05.09: корень там уже найден и назван (майненные строки пишутся внутри ветки if !stopping), поэтому «разобрать порядок публикации» здесь заказывать НЕЛЬЗЯ — работа удвоится. Половина (а) закрывается лендингом 224; живой в этой строке остаётся только (б). Прогон встал 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=*.go0, аллоулист сайдкара несёт только термины. ⇒ пользователь подписывает как ПОЛНЫЙ банк то, что движок сам называет неполным. Лечение (б) — КАНАЛ: полнота консолидации в сайдкар + поле на BankPage; лечение (а) — разбор порядка «стоп против публикации». ⚠ Обе половины на шве, чинятся согласованно бэкенд+платформа скоро (до первого внешнего пользователя) разбор порядка публикации + канал полноты наблюдение платформы за живым потоком 04.09, H10/H11
254 Шесть движковых ловушек, увиденных ПЕРВЫМ живым прогоном (04.09) и НЕ тронутых платформой — чужая зона.ОДНА ИЗ ШЕСТИ РЕШЕНА ВЛАДЕЛЬЦЕМ 05.09 — остальные ПЯТЬ живы, строку не закрывать (испр. 05.09; строка 285 закрывает ровно эту одну и не больше). Решённая — самая дорогая: manifest на пустом файле даёт exit 11, а интейк на 11 УДАЛЯЕТ ЗАГРУЗКУ ⇒ пользователь, приславший пустой файл, терял его. Лечение названо владельцем: fail fast на загрузке — строка 285. · 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
256 Лейбловая ветка CheckKeys прибита только СПИСКОМ — БЛИЗНЕЦ денежной дыры, закрытой на безлейбловой. Безлейбловую ветку круг 3 починил определением gateModels() и прибил вызовом самого CheckKeys; лейбловая по-прежнему держится тестом на СПИСОК (TestABankModelIsAReachableModel) — тем самым способом, про который тот же круг записал «пин на списке не есть пин на префлайте». Посадка круга 4: лейбловая ветка собирает модели стадий вместо ReachableModels()ВЕСЬ пакет зелёный. Проба предъявлена: лейблованная книга с банк-моделью на провайдере без ключа проходит префлайт целиком. Симптом денежный и тот же: покупается черновая волна, смерть на воротах. ⚠ Не чинилось только потому, что круг свёрнут решением владельца бэкенд скоро пин на вызове CheckKeys для обеих веток + проба под лейблом круг 4 петли, X40
257 Порядок bound() перед reconcile не держится ничем, и цена — исчезнувшее сообщение оператору. Перенос блока bound() после reconcile пережил весь пакет. Проба: книга в одну главу, второй прогон под грантом 1, редактор отказывает — единственная работа вне гранта флагуется; оригинал печатает «1 PAID FOR BUT FLAGGED», под посадкой отчёт об объёме = nil, то есть раскрытие, ради которого он построен, пропадает целиком. ⚠ Комментарий коммита посылает читателя в юнит-тест volumeScope, который порядок в waverun увидеть не может — второй экземпляр класса «тест утверждает не то, что думает» бэкенд скоро пин порядка в waverun, а не в volumeScope круг 4 петли, X14
258 Конструктор classifyInputFor можно захардкодить на ru/zh — вся батарея зелёная, и причина СТРУКТУРНАЯ: через раннер нет ни одной фикстуры с не-ru целью. Есть только zh→ru и ja→ru. Рефлексивный пин круга 3 ловит «поле нулевое», но не «поле взято не у книги». Пробы предъявлены: →ja книга с китайским выводом под посадкой перестаёт быть →ja. ⚠ Бьёт прямо в цель №2 (ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go»): сегодня ответ на него не может дать ни один тест. Родня — 259 бэкенд скоро фикстура не-ru цели ЧЕРЕЗ раннер + пин «поле взято у книги» круг 4 петли, X1/X2/X3
259 Настоящей латинописьменной цели в репозитории НЕТtarget-en.txt не существует, и →en достижим только через пустое объявление. Следствие: часть общности проверяется рассуждением, а не тестом, и пара, которой в репо нет, не может быть предъявлена живьём ни одним прогоном. Замер общности 04.09: ветвлений Go по конкретному языку два на обе зоны, оба — проверка на пустоту; книжной специфики в Go нет, кроме константы худшей строки банка (строка 40) бэкенд скоро (гейт второй пары) минимальный langpack →en + прогон на нём замер общности оркестратора 04.09 по требованию владельца
260 Экран цели калиброван на ОДНОМ сянься и даёт ложный off_target на латинице-тяжёлом здоровом русском (0.461 с пиньинем при пороге). ⚠ Ложный флаг ЭСКАЛИРУЕТ, то есть стоит ПЛАТНОГО хопа за здоровый текст — это деньги, а не только шум. Порог и пол улики обязаны быть пере-калиброваны на корпусе, включающем латиницу-тяжёлый русский бэкенд скоро пере-калибровка на расширенном корпусе + пин границы самоотчёт бэкенд-сессии о непокрытом, круг 3
261 ОСТАТОК СНЯТОЙ СТРОКИ 277 ЖИВЁТ ЗДЕСЬ (возвращён 05.09 по ревью — при закрытии 277 он едва не потерялся): остаток PD-441 = 261 + 262 (третья часть, строка 277, ПОСТРОЕНА и закрыта D39.206 — «одним паком» уже невозможно). Пак «денежный стоп» (акт D39.206) снял только ОТМЕНУ допущенного; структурный корень невидимого расхода — эта строка, а сверх-утверждение комментария ветки отмены — строка 262. ⇒ платформенной зоне: PD-441 закрывать «паком денежного стопа» НЕЛЬЗЯ, он закрыт наполовину. BilledDecodeError виден только когда ретрай НЕ спас: успешный ретрай стирает оплаченную попытку из леджера. Тип заведён, чтобы оплаченный-но-нечитаемый вызов стал ВИДЕН (рантайм доседает по оценке), но retryLoop при успехе возвращает ответ и предыдущую ошибку выбрасывает — рантайм видит один успешный ответ и седит его Usage. Оплаченный 2xx перед ним не попадает никуда. ⚠ Бьёт не в отчётность, а в ЦЕЛОСТНОСТЬ потолка: допуск выдан под ОДНУ оценку, а под ней могло пройти до трёх запросов (MaxAttempts 3), и Reserve об этом не узнает. Комментарий рядом сам говорит «each retry is a new billed 2xx» — авторы знали и закрыли только детерминированный случай (усечение). ⚠ ЧАСТОТА пути НЕ измерена бэкенд скоро (вместе с денежным паком) единица учёта = единица биллинга + вендор-факт по правилу квирков чтение под вопрос, бэкенд-сессия 04.09
262 Комментарий ветки отмены — сверх-утверждение: «No 2xx ever arrived: nothing was billed» описывает ветку ШИРЕ, чем она есть. Верно для отказа соединения, DNS, таймаута до первого байта и терминального 4xx; ложно для вызова, который отменили МЫ после начала генерации — он приходит в ту же ветку через context.Canceled. Правка отложена намеренно: ветка денежная, лечение структурное (см. 261), однострочная правка фразы разъедется с решением бэкенд скоро (вместе с 261) привести ветку и её описание к одному радиусу чтение под вопрос, бэкенд-сессия 04.09
263 Дизъюнкты предупреждения банкноты и forWrite не прибиты по отдельности (позитивная фикстура без обоих входов, негативная — с обоими): пережили посадки «нет контраста», «нет пака», «предупреждать и на read-open». WB15 несёт тот же дефект ложного пина, что найденный и починенный WB36 — одиночный сдвиг порога под TestGoldenDeterminism: на чистом литерале голден не двинется и запись выживет при целой гарантии. AST-тест исчерпаемости парсит ТОЛЬКО disposition.goFlagReason, объявленный в другом файле, в карту не попадёт при зелёном тесте. Дайджест корпуса не покрывает provenance — адрес пере-снятия, подмену которого дайджест не видит бэкенд когда-нибудь четыре независимых пина круг 4 петли, X11/X12/X13 · WB15 · X9 · X30
265 Питоново зеркало полигона держит ВТОРУЮ копию таблицы плейсхолдеров движка, и она разошлась: genre есть, book_id нет. eval/bank_arbitration/editor_wire_probe.py — ПЛАТНАЯ проба, читающая ШИППИНГОВЫЙ backend/prompts/zh-ru/editor.md, на неё ссылаются ещё 25 скриптов (grep -rl editor_wire_probe eval --include=*.py; ⚠ испр. 05.09, первая редакция говорила «девять»); 27 промтов под eval/ несут {{genre}}, который движок ОТКАЗЫВАЕТСЯ собрать при загрузке. ⇒ замеры идут на проводе, которого в проде не существует, и это «третий путь», которого в Go больше нет. ⚠ Зона ПОЛИГОНА — чинит она, носитель заведён оркестратором пингом полигон скоро (перед следующим платным замером) зеркало читает таблицу движка, а не держит копию передано бэкенд-сессией 04.09, чужая зона
266 Правки кругов 3 и 4 петли не ревьюил НИКТО — круг свёрнут решением владельца, а не замкнут. Замеренная база, из-за которой это долг, а не формальность: ДВАЖДЫ подряд дефект вносил фикс предыдущего круга (круг 2 объявил денежную дыру закрытой — круг 3 показал, что она открыта; ратификация оркестратора по дедупу внесла живой дефект — поймала зона). Круг 3 добавил ~2000 строк и не ревьюил из них ни одной; круг 4 — две правки, обе проверены исполнением, но не чужими глазами. ⚠ Дисциплина петли исправлена эрратой: круг крутит СЛЕДУЮЩАЯ сессия по готовому паку, а не прежняя — правило «сессия отрабатывает скоуп и завершается» бьёт норму петли бэкенд скоро проход свежей сессии по диффу c77c3ba+2e13cd1 решение владельца 04.09 остановить полировку
267 ОДИН ТЕРМИН В ОДНОМ СМЫСЛЕ МОЖЕТ НЕСТИ ДВЕ КОНКУРИРУЮЩИЕ ФОРМЫ, И ОБЕ ЕДУТ НА ОБА ПРОВОДА — дыра в ПРОВЕРКЕ схлопывания.Пере-снято 05.09: было заведено как ДОКТРИНА («показывать обе или схлопывать») — это была неверная постановка оркестратора. Владелец: у неподписанного термина тоже обязан быть ОДИН перевод, отвечает за это стадия схлопывания, подпись ни при чём. Измерено зоной по коду и предъявлено на банке: ключ уникальности БД — (book_id, src, sense, since_ch, until_ch), значит один смысл при РАЗНЫХ окнах законен для БД; гард «одна форма на главу» существует (backend/internal/pipeline/memseed.go, греп a term has ONE rendering per chapter) и статус-слеп, но работает ВНУТРИ ОДНОГО ФАЙЛАloadMinedDelta проверяет дельту саму против себя и НЕ против сида; точка слияния (bankmaterialize.go, греп storeOrder) отвергает только ТОЧНЫЙ дубль, перекрывающиеся окна проходят. Предъявлено: сид [0,0] «юаньши» + майнинг [3,9] «камень первоисточника», глава 5 внутри обоих ⇒ injected=2, две строки и редактору, и черновику. ⇒ Банк перестаёт быть законом ровно там, ради чего построен — консистентность термина на всю книгу. ⚠ ГРАНИЦА, названная зоной: доказано, что состояние ДОСТИЖИМО и провода его несут; НЕ доказано, что обычная последовательность операций его производит (консолидация даёт один dst на термин — сверено; сверяет ли она предложение с УЖЕ существующей сид-строкой другого окна — не мерено). Это дыра в проверке, а не наблюдённый инцидент. Чинить на СЛИЯНИИ, где видны все три источника, а не на загрузке каждого бэкенд скоро гард перекрытия окон на слиянии + пин на достижимом состоянии решение владельца 05.09 + замер зоны
268 Гейт версии контракта у фронта читает СВОЁ зеркало, а не канон — и потому слеп по построению. frontend/src/api/contract.test.ts сверяет ${cwd}/docs/api-contract/openapi.yaml с фикстурой, то есть копию с копией, и зелен при любом отставании; соседний тест сравнивает только МАЖОР, а он у 0.2.3 и 0.10.0 одинаков — ноль. Зеркало отстало на ВОСЕМЬ миноров. Сравнение: тот же класс гейта у платформы читает КАНОН с диска и поймал расхождение 0.9.0→0.10.0 в тот же час. ⚠ Зона фронта ЗАМОРОЖЕНА — строка ждёт разморозки, но входит в перечень первого касания фронт скоро (первое касание при разморозке) перенацелить гейт на канон находка платформенной сессии 04.09, подтверждена оркестратором
272 ШАБЛОН КНИГИ ДЕПЛОЯ ОДИН НА ВСЕ ПАРЫ, а в нём лежит ПАР-СВЯЗАННОЕ значение — transcription: palladius. Платформа рендерит book.yaml из единственного операторского шаблона и подставляет ровно пять ключей (book_id · title · source_lang · target_lang · source_file); всё остальное едет из шаблона нетронутым. Палладий — система транскрипции ДЛЯ КИТАЙСКОГО. Движок значение не валидирует (свободная строка) и подставляет прямо в промпт. ⇒ Деплой, объявивший zh>ru,ja>ru, отдаёт КАЖДОЙ японской книге инструкцию транскрибировать по-китайски: не отказ и не флаг, а тихо неверные имена во всей книге — ровно тот класс брака, ради которого продукт существует. ⚠ Чинить придётся не одну книгу: значение вшито в book.yaml, который платформа НИКОГДА не перезаписывает (O_EXCL) платформа+бэкенд скоро (гейт второй пары) пар-связанные ключи шаблона + валидатор значения в движке критик полноты стратегии 04.09
273 ПАР-ШОВ ЛОМАЕТСЯ АСИММЕТРИЧНО: промпт-пак падает ГРОМКО, целевые ДАННЫЕ выключаются МОЛЧА — вместе с банком. Отсутствие промптов пары — жёсткая ошибка загрузки («never silently substitute another pair's conventions»). Отсутствие ЦЕЛЕВЫХ данных — тишина в трёх местах: lang.InjectionTextsFor на незнакомом таргете возвращает пустое, обе банк-инъекции рендерят пустоту (if !tx.HasData() { return "" }), LoadReaderWords отдаёт значки вместо слов без ошибки. ⇒ Книга на новый таргет переводится ЦЕЛИКОМ и за ПОЛНЫЕ деньги, но БЕЗ банка-как-закона — то есть без единственного механизма, держащего термины консистентными на всю книгу, без $0-чекеров цели и с пометками из значков в выданном файле. Ни ошибки, ни варнинга, ни поля в отчёте сборки. ⚠ Строка 32 закрыта формулировкой «инертна ПО ОТСУТСТВИЮ данных» — для ЧЕКЕРОВ это хорошо, для БАНК-инъекции такого вывода не делал никто бэкенд скоро (гейт второй пары) префлайт готовности таргета: банк-данные есть ⇒ работаем, нет ⇒ громко критик полноты стратегии 04.09
275 ПЕРЕ-СНЯТА 05.09 СЛОВОМ ВЛАДЕЛЬЦА — прежняя формулировка «КАЧЕСТВО НЕ МОЖЕТ СТАРТОВАТЬ ВООБЩЕ» БЫЛА НЕВЕРНА (ошибка оркестратора). Она называла четыре гейта; из них три сняты словом владельца, четвёртый гейтом не был (разбор — D39.198): 13а веса рубрики НЕ НУЖНЫ — веса меряют РАЗНЫЕ узлы (консистентность — банк памяти, выдумки — редактор, художественность — редактор И черновик), единого веса быть не может, а одно взвешенное число измеряет, но не ДИАГНОСТИРУЕТ · 24 профили голоса — приоритет №3, подписи владельца не требуют («зачем мне это подписывать») · 149 разморозка панели не нужна: пока идут доработки, менять жильцов ролей незачем · 55 прогоняем на ТЕХ ЖЕ текстах (мастер Гу, Жан-Кристоф), оговорка про претрейн остаётся ОГРАНИЧЕНИЕМ ВЫВОДА, а не требованием новой книги. ЧТО ОСТАЁТСЯ ЖИВЫМ В ЭТОЙ СТРОКЕ: привязать каждый класс дефекта к УЗЛУ и мерить по узлам; поставить порог остановки для приоритетов №1 и №2 (разъехавшийся термин — стоп, выдумка — стоп, сухая фраза — не стоп). ⚠ Консистентность проверяема ДЕТЕРМИНИРОВАННО за $0 — это ГЕЙТ, а не строка рубрики; ближайший её носитель — строка 267 полигон+бэкенд скоро привязка классов к узлам + пороги остановки для №1 и №2 решение владельца 05.09, D39.198
276 ФОРМА ЗАКАЗА ПЕРЕВОДА — решение владельца 05.09, ратифицировано D39.196. На аккаунте баланс в ДЕНЬГАХ и он виден. Человек стартует перевод; хочет задать потолок — тянет ползунок в деньгах; рядом ответ на его настоящий вопрос: хватает на полную книгу или нет. Хочет задать объёмом — второй ползунок: ГЛАВЫ когда книга распозналась, ЗНАКИ когда нет (о нераспознавании говорим ЯВНО). Старт = холд с баланса. Отдельная кнопка «перевести книгу целиком» — за целую книгу оценка точнее, чем за произвольный кусок. ⚠ Две ручки связаны проекцией: объём — ЗАКАЗ (главная), деньги — ЛИМИТ (вторая); тронутая последней ограничивает, другая пересчитывается и показывается производной («5 глав ≈ $0.55, зарезервируем до $0.8»); минимум денежного ползунка = неделимый шаг движка, чтобы ползунком нельзя было выразить невозможный заказ. Не тронута ни одна ⇒ заказ = вся книга. ⚠ Цифра на экране — ПАРА, а не точка: «ожидаемо ≈ $1.1, зарезервируем до $1.6, спишем по факту», и закрытие фактом после прогона — проекция имеет дисперсию (редакторские вызовы 2590 % worst-case), точечное число превратится в «сказали 1.14, списали 1.31». Главный ответ — фраза, цифра рядом и мельче. ⚠ Запрет «денег в UI» ОТОЗВАН владельцем (D39.196 п.2): виден баланс, потолок, холд; цены моделей и стадий — нет. «Страница» из контракта убирается совсем — владелец назвал ЗНАКИ, форматирование «≈67 стр.» это локаль фронта. Исполнение — 279283 (⚠ испр.: 277 и 278 ПОСТРОЕНЫ лендингом 81a89e9 и сняты) движок+платформа+фронт скоро решение принято и ратифицировано D39.196; исполняется 279283 (277 и 278 закрыты) решение владельца 05.09 + сведение с внешним рецензентом
279 ШАГ 3, КОНТРАКТ (минор, полоса ломающих правок мажора 0 законна): заказ объёмом. ceiling_chapterschapters со смыслом ОБЪЁМА (null = вся книга) · CeilingBounds{min,max,default} → `OrderOptions{chapters_left, affordable_chapters, verdict: covers_all covers_part covers_none, blocked}·PausedReason+=run_limit_reachedcredit_exhaustedСТАНОВИТСЯ правдой — сегодня лжёт при 34% баланса, наблюдение H14) ·Run+=ordered_chapters/delivered_chapters. ⚠ Фразы — ДАННЫМИ по коду причины и локали, не литералом. ⚠ **ПЕРЕ-СНЯТО 05.09 под D39.196:** наружу ВЫХОДЯТ баланс, потолок заказа и холд — деньгами; контракт получает balance, estimate{expected, hold}под выбранный заказ, границы денежного ползунка{min: неделимый шаг, max: баланс}иshortfallу паузы; процент остатка остаётся СИГНАЛОМ «мало/пусто». НЕ выходят: цены моделей, стоимость стадий и вызовов, структура НАШИХ расходов. ПлюсOrderOptionsобязан нести ТРИ вида заказа (вся книга · знаки · до главы N), а не только главы. Ремедиа-таблицаresumeRun` упрощается: «Продолжить» — новый прогон ТОГО ЖЕ заказа контракт скоро
280 ШАГ 4, ПЛАТФОРМА: заказ живёт на КНИГЕ, холд считается от проекции, --max-units наконец едет в argv. books.ordered_through_chapter (null = вся книга) — сегодня интент живёт на ПРОГОНЕ, оттого и неловкость «поднять лимит = НОВЫЙ прогон с бо́льшим ceiling_chapters»; с заказом на книге «Продолжить» после пополнения тривиален, и дверь пере-прохода встаёт рядом вторым типом заказа. Холд = min(баланс, проекция × k); bookCap = committed + холд (PD-158 цел). В argv добавляется --max-units = сумма юнитов заказанных глав минус доставленные. Удаляются DefaultPerChapter, Scale и draftWork: план движка становится РАВЕН заказу, и «черновики на весь потолок при нуле готовых глав» исчезает структурно. Закрывает PD-410, PD-440, PD-446. ⚠ ПРЕДУСЛОВИЕ, названное отдельно: PD-422--resnapshot передаётся УСЛОВНО, а условие ставит только правка банка; рост авто-банка от майнинга флага не ставит. Частичный заказ на майнящей книге растит банк ⇒ следующий заказ без --resnapshot умрёт на снапшот-гарде, холд взят, попытка сожжена. Взять В ТОТ ЖЕ пак платформа скоро заказ на книге + холд от проекции + проводка --max-units + PD-422 согласование 04.09
281 ЗАМЕР: сколько наших денег стоит тысяча ПЛОТНЫХ и тысяча РАЗРЕЖЕННЫХ знаков по стадиям и парам. Цель — НЕ константа (D39.165 п.1г прямо запрещает ставку константой), а дисперсия проекции: коэффициент k для холда и честность вердикта «хватит ли». Снимать есть из чего и это $0: find -L books даёт 162 базы прогонов, в request_log лежат chapter · chunk_idx · stage · prompt/completion_tokens · cost_usd · tm_hit, исходник по юниту отдаёт tmctl export --pairs бесплатно. Метод: по юниту плотные/разреженные знаки против суммы cost_usd при tm_hit=0, по стадиям; хвост ретраев и эскалаций считать ОТДЕЛЬНО; базы до 16.08 пере-прайсить по токенам. ⚠ Гейт для коэффициента холда в строке 280 полигон скоро (гейт строки 280) замер по 162 базам, $0 согласование 04.09, вторая редакция
282 ЧИСЛО, ПОДПИСАННОЕ «ЗНАКОВ», СЧИТАЕТ РУНЫ ПОТОКА ЗАПИСИ ФАЙЛА — что для UTF-8 txt И ЕСТЬ знаки, а для EPUB даёт руны ZIP-АРХИВА. ⚠ Заголовок первой редакции («считает байты») — противоположная полуправда, испр. 05.09: ложно оно для EPUB, GB18030 и UTF-16, а не всегда. Проверено оркестратором по коду: platform/internal/books/books.go, греп type counter — счёт идёт по не-продолжающим байтам UTF-8 ПОТОКА ЗАПИСИ файла, а не по тексту; там же комментарий признаёт приближение для GB18030. Наружу уходит как character_count (platform/internal/httpapi/v0.go), на экране подписано 'about.characters': 'Знаков' (frontend/src/i18n/ru.ts). ⇒ Живая ложь на продуктовом экране, и она же — вторая ненадёжная единица, найденная тем же вопросом «откуда берётся число». Основой страницы быть не может. Лечение: переименовать в размер файла ЛИБО заменить манифестной суммой знаков движка — источник ПОСТРОЕН: source_chars по юниту в manifest --json (лендинг 81a89e9, акт D39.206; строка 278 закрыта и снята). Остаток строки — платформенная половина: взять число и снять ложную подпись. ⚠ Фронт заморожен — подпись правится при разморозке, число на платформе раньше платформа+фронт скоро снять ложную подпись + заменить источник на манифест движка согласование 04.09; проверено оркестратором по коду
283 СТРУКТУРА ГЛАВ ДЛЯ ВЫДАЧИ — отдельная задача, которую «страница» НЕ отменяет, и она гейтит бету для не-CJK и EPUB. Билдер кладёт по одному XHTML на главу движка и сам признаёт, что ридер делает главу из каждого документа spine (backend/internal/bookfile/epub.go) ⇒ для не-CJK txt читатель получает книгу ОДНИМ ПОЛОТНОМ при любой единице заказа. Состав — этап 1 research/27: EPUB по nav/NCX (обязательно по стандарту), FB2, индуктор оглавления для txt, разрез по ДАННЫМ ПАРЫ вместо захардкоженного CJK (сегодня асимметрия: распознавание строки-заголовка данные пары читает — configs/langpacks/zh-ru/heading.txt, — а РАЗРЕЗ на главы нет). ⚠ Делать в единственном окне пере-снапшота, пока платная книга одна: перекрой двигает нарезку. Пере-скоуп строк 160162 бэкенд скоро (ДО открытия беты не-CJK и EPUB-входам) этап 1 research/27 своим паком согласование 04.09, вторая редакция
284 НАЗВАНИЕ КНИГИ И ЗАГОЛОВКИ ГЛАВ ИДУТ ЧЕРЕЗ ТЕРМИНЫ — ОТДЕЛЬНОЙ СТАДИЕЙ (решение владельца 05.09).СЮДА ЖЕ ПЕРЕЕХАЛ ОСТАТОК ЗАКРЫТОЙ СТРОКИ 274 (D39.201 п.7): доставка имени В ФАЙЛ. Платформенная половина построена — имя вычисляется ПРИ СКАЧИВАНИИ (platform/internal/httpapi/v0.go, греп exportName), внутрь файла не пишется намеренно: движок сворачивает title в BriefHash → снапшот → каждый request-hash, то есть запись в book.yaml отказала бы следующему прогону недопереведённой книги и стоила бы ПЕРЕ-ОПЛАТЫ книги целиком. ФОРМА ОПИСАНА, ПАТЧ НЕ ПРОВЕРЕН (слово платформенной зоны, принято дословно): путь — tmctl build --title аргументом при спавне, прецедент --ceiling-usd, но НЕ предъявлено исполнением, что движок примет незнакомый флаг без правки разбора аргументов — по закону шва там громкий отказ по построению. Остаток регистра — PD-450. Сегодня их не переводит НИКТО: dc:title берётся из book.yaml как есть (backend/internal/bookfile/epub.go, греп dc:title), заголовок главы собирается детерминированно шаблоном из langpack (backend/configs/langpacks/zh-ru/heading.txt, template Глава {n}). ⇒ Русский EPUB приезжает в читалку с китайским названием — ломается первое, что видит человек. Владелец: «пусть едет как термины, причём отдельные, то есть как-то надо называть эту стадию». ⚠ Значит у стадии своё имя, свой бюджет и своя ПОДПИСЬ: название книги владелец утверждает так же, как утверждает термин. ⚠ Родня — строка 274 (ручка переименования у пользователя) и открытый лист владельца «что печатать на титуле и в имени файла» (D25.1): механизм строится, СЛОВО остаётся за владельцем бэкенд скоро стадия перевода заголовков + подпись владельца решение владельца 05.09
285 FAIL FAST ПРИ ЗАГРУЗКЕ вместо приёма-и-удаления (решение владельца 05.09). Сегодня при загрузке проверяется ТОЛЬКО размер (platform/internal/httpapi/middleware.go, греп LimitBody); понять, есть ли в файле книга, умеет лишь движок и лишь при разборе — то есть ПОСЛЕ приёма и записи, а на классе «источник нечитаем» интейк УДАЛЯЕТ загрузку. Владелец: «почему просто не fail fast, как это обычно принято». ⚠ Механизм для этого есть и он $0: tmctl manifest режет книгу и возвращает число юнитов без ключей и без единого платного вызова, и платформа уже умеет его звать. Звать СИНХРОННО на загрузке: либо человек сразу видит «в этом файле книги нет» и файл не принят вовсе, либо получает принятую книгу и её объём. ⇒ Снимает вопрос про удаление целиком — удалять нечего, если не приняли (строка 254 закрывается этим). ⚠ Решить: латентность синхронного разбора на большой книге и что показывать, пока он идёт платформа скоро синхронный $0-разбор на приёме + отказ вместо удаления решение владельца 05.09
286 ЧИТАТЬ ЧЕРЕЗ D39.205: стоп остаётся ЦЕЛЬЮ, но гейт gates.glossary.postcheck_gate владелец 05.09 ОТЛОЖИЛ до замера точности («Не знаю. Тут надо мерить типо?… ложные срабатывания — это плохо, очень плохо») — это отсутствие замера, а не запрет («ложные срабатывания — это плохо, очень плохо»); предусловие — строки 295 и 12. ПРИОРИТЕТ №1 ВЛАДЕЛЬЦА («100% консистентность») НЕ ИСПОЛНЯЕТСЯ КОДОМ И ПРОТИВОРЕЧИТ ДЕЙСТВУЮЩЕМУ ПОРОГУ. Найдено ревизией документации 05.09. Три расхождения, каждое с носителем: (1) ПОРОГ. docs/architecture/02-mvp-plan.md и реестр D10 держат «≥98%» — владелец 05.09 сказал 100% (D39.198). Два процента на книге в тысячи терминов — это десятки разъехавшихся имён. (2) МЕХАНИЗМ. Единственный сегодняшний носитель консистентности — флаг glossary_miss РАНГА 5, то есть замечание, с которым текст ОТГРУЖАЕТСЯ (backend/internal/pipeline/status.go + disposition.go, греп FlagGlossaryMiss). Владелец сказал «разъехавшийся термин — СТОП». Флаг стопом не является. (3) СЕМАНТИКА. Приоритет №2 («никаких выдуманных сюжетных линий и смыслов») не имеет носителя вовсе: в реестре требований такого ПТ нет, ближайшее — гейт по ДЛИНЕ, а не по смыслу; семантический судья в движке не построен (слой 5). ⇒ Сессия качества, собранная по нынешним докам, построит от неверной цели. ⚠ Родня: строка 267 (две конкурирующие формы одного термина доезжают до редактора) — она и есть живой экземпляр нарушения приоритета №1 бэкенд+полигон скоро порог 100% в носителях · консистентность как СТОП, а не флаг · носитель для приоритета №2 ревизия документации 05.09, D39.198
287 ТЕСТ ИСЧЕРПАЕМОСТИ ФЛАГОВ СЛЕП НА ТРЕТЬЮ ЛЕГАЛЬНУЮ ФОРМУ Go — найдено ПОСАДКОЙ верификатора приёмки, не автором. Тест читает объявления причин через go/ast и покрывает две формы (X FlagReason = "…" и X = FlagReason("…")), о чём говорит его собственный комментарий «BOTH GO SPELLINGS COUNT». Третья форма — типизированная спека со значением-конверсией (const X FlagReason = FlagReason("…")) — ПЕРЕЖИВАЕТ посадку: типизированная ветка ждёт *ast.BasicLit, получает CallExpr, lit == nil и молча продолжает. Пол found < 15 её тоже не ловит. ⚠ Это ГРАНИЦА, а не живая дыра: ни одной такой формы в дереве сегодня нет (все константы в disposition.go типизированные) — но комментарий обещает больше, чем тест держит, а это тот самый класс «утверждение шире ветки», который пак ловил четырежды. Там же не назван и var-случай. бэкенд когда-нибудь покрыть третью форму ЛИБО сузить комментарий до двух верификатор приёмки 05.09, посадка вне списка автора
288 «ПОПРАВИЛ ЧИТАТЕЛЯ, ОСТАВИЛ ПИСАТЕЛЯ» — ЕЩЁ ОДНО ПОЛЕ РЯДОМ, и оно бьёт в цель №2. Сессия прибила читателя classifyInputFor и писателя SetSourceScripts; СОСЕДНЯЯ строка того же defer в loadLangPackbackend/internal/pipeline/runner.go, греп CompileCheckersFor(r.pack, lang.TargetChecksFor — не прибита ничем. Предъявлено посадкой верификатора: подмена TargetChecksFor(r.Book.TargetLang) на TargetChecksFor("ru") оставляет ВЕСЬ пакет pipeline зелёным (ok 65s). ⇒ Книга на →ja с включённым санитайзером компилировала бы РУССКИЕ паттерны читаемости: ложные sanitizer_defect, а ложный флаг ЭСКАЛИРУЕТ — это платные хопы за здоровый текст. От этой строки зависят TargetActive(), ёфикатор и латинский гард. Пин строится тем же двухкнижным приёмом, что и у SourceScripts бэкенд скоро пин писателя целевых чекеров двумя книгами верификатор приёмки 05.09, посадка вне карты отчёта
289 ДВЕ ВЕТКИ CheckKeys ДАЮТ ПРОТИВОПОЛОЖНЫЙ ОТВЕТ НА ОДИН И ТОТ ЖЕ КОНФИГ, а новый тест закрепляет лейбловую на фикстуре, где её собственная посылка ЛОЖНА. Безлейбловая ветка требует ключ хопа ТОЛЬКО при Escal.BudgetUSD > 0 (и это ратифицировано комментарием); лейбловая берёт ReachableModels(), куда ResolvedHop попадает БЕЗУСЛОВНО. При бюджете 0 хоп в рантайме не стреляет никогда. Зонд верификатора: одна стадия с escalate_to на провайдере без ключа, бюджет 0 ⇒ безлейбловая nil, лейбловая missing API keys. ⚠ Что внёс 74ffe4f: кейс «the stage's escalation hop» и why записи WB65 («a labelled run CALLS its escalation hop») стоят на фикстуре БЕЗ бюджета — то есть тест ПИНИТ требование ключа для модели, которую этот прогон вызвать не может. Зеркало класса, который пак сам и нашёл: пин на «достижима» не есть пин на «вызывается». Лечится либо бюджетом в фикстуре, либо приведением веток к одному правилу бэкенд скоро свести ветки к одному правилу ЛИБО починить посылку фикстуры верификатор приёмки 05.09, зонд вне карты
290 ARM 1 нового теста банкноты проходит ВАКУУМНО, если каталог пары переедет — класс WB41, названный самой сессией. Тест вписывает langpack_root, но не проверяет, что пак ЗАГРУЗИЛСЯ (r.pack != nil). Предъявлено: с несуществующим корнем все три плеча зелёные, а посадка WB58 (снятие плеча контраста) ПЕРЕЖИВАЕТ. То есть красный WB58 держится не тестом, а наличием каталога на диске. Лечение — посылка о состоянии пака в самом тесте. ⚠ Тот же класс: тест исчерпаемости флагов слеп ещё на ДВЕ формы сверх найденной первым верификатором — var X = FlagReason("…") на уровне пакета и const ВНУТРИ тела функции: обе посадки прошли, ни пол found < 15, ни сверка с картой не сработали (объявлено 17, найдено 16, карта 16). Итого форм пять, тест держит две, комментарий обещает «обе» бэкенд скоро посылка о загрузке пака + покрыть или сузить обещание исчерпаемости верификаторы приёмки 05.09
291 РЕШЕНО ВЛАДЕЛЬЦЕМ 05.09 (D39.204): деградировать во ФЛАГ, отличный по причине от исчерпания регенераций; текст попытки 0 оплачен и отгружается, волна идёт дальше. Вариант «минимальная покупка ≥ step_max_usd» СНЯТ — он стоил бы покупателю входного порога в пять глав. ⚠ Работа СВОИМ паком движка (правка пути ошибки в stagerun.go + новая причина флага + пин «купленное доставлено ⇒ не exit 4»), в принятый пак не дописывается. ОБЯЗАТЕЛЬСТВО, БЕЗ КОТОРОГО ПАК НЕПОЛОН: новая причина флага выходит ОДНИМ АКТОМ С ПЛАТФОРМЕННОЙ ПОЛОВИНОЙ. Карта заметок платформы РУКОПИСНАЯ (platform/internal/ingest/notes.go) и уезжает независимо от словаря движка; цена несделанного замерена — PD-246/эррата 04.09-в: минор 0.10.0 сутки жил ЛОЖНЫМ на проводе, причина доезжала читателю как unspecified, поймала это зона своей пере-проверкой ПОСЛЕ слов оркестратора «приёмка закончена». ⇒ промт этого пака обязан назвать ОБЕ зоны, а акт — предъявить зеркало. ⚠ Записано СТРОКОЙ, а не каналом, по слову сдавшей зоны: «/tmp/textmachine-channel не переживает рестарт — это в него и заложено», и обязательство, живущее в переписке двух сессий, умирает вместе с ними. ⚠⚠ НИЖЕ — ИСТОРИЧЕСКИЙ РАЗБОР, ПО КОТОРОМУ РЕШАЛИ; как ЖИВОЕ не читать. Его фраза «ВЫБОР НЕ СДЕЛАН» противоречит голове этой же строки — выбор СДЕЛАН владельцем (D39.204). И ссылка «смена D2.3» в нём НЕВЕРНА ДВАЖДЫ, проверено по телу ноты (../archive/architecture/05-decisions-D1-D38.md, греп ^## D2. Диспозиция): (1) D2 уже кончается флагом («ретрай с бо́льшим max_tokens до капа, потом флаг») ⇒ это ДОСТРОЙКА, а не смена; (2) D2.3 — по правилу подномеров ПУНКТ 3 тела D2, то есть «детектор вырождения перед удвоением max_tokens», к деградации отказа резервации отношения не имеет. Настоящий адресат — D2 п.2 «Тегировать flag_reason», и он делает вывод СИЛЬНЕЕ: тегирование причины там уже ТРЕБУЕТСЯ ⇒ новая причина есть новый тег под существующим правилом, а требование «причина обязана отличаться от исчерпания регенераций» — не добавка к канону, а его ИСПОЛНЕНИЕ. ⚠ Голова и хвост одной строки противоречили друг другу о состоянии решения — тот же класс, что находка F7 приёмки, только не в коде, а в бэклоге; поймала сдавшая зона движка уже после закрытия своего пака. ОТКАЗ РЕЗЕРВАЦИИ НА РЕТРАЕ НЕ ДЕГРАДИРУЕТ И НЕ ОСТАВЛЯЕТ СЛЕДА — юнит может заклинить НАВСЕГДА, а волна не может продолжиться без дыры. maxTokensForAttempt удваивает бюджет на каждой регенерации (backend/internal/pipeline/disposition.go, греп maxTokensForAttempt), так что attempt 1 резервирует вдвое больше attempt 0. Отказ ретрая уходит наверх из цикла попыток (backend/internal/pipeline/stagerun.go, греп return nil, err в цикле попыток) РАНЬШЕ UpsertChunkStatus ⇒ чекпойнт attempt 0 есть (реплей за $0), строки chunk_status НЕТ, читающие модели видят юнит как pending, экспорт не отдаёт ничего. Следствия два. (1) Если потолок покупки не вмещает attempt 1 — юнит не доделается НИКОГДА: каждый резюм реплеит attempt 0 за $0 и умирает на attempt 1, прогон уходит exit 4 при ПОЛНОСТЬЮ доставленных купленных юнитах. (2) Продолжить волну после отказа ретрая нельзя без ДЫРЫ в непрерывном префиксе — то есть цена глобальной защёлки (недодача юнитов, которые влезали; разброс резервов внутри волны замерен ×2.976) различителем «свежий/ретрай» НЕ снимается. ⚠ Оркестратор предлагал такой различитель на посылке «ретрай оставляет ФЛАГОВАННЫЙ юнит» — посылка ЛОЖНА, опровергнута зоной по строкам. Два пути лечения, ВЫБОР НЕ СДЕЛАН: (а) отказ ретрая деградирует во флаг attempt 0 — смена D2.3, закрывает ОБА следствия; (б) минимальная покупка платформы ≥ step_max_usd движка (он включает ретраи именно поэтому) — закрывает только (1) и стоит продукту минимальной покупки ~5 глав бэкенд+платформа скоро выбор владельца между (а) и (б) + пин бэкенд-сессия денежного стопа 05.09, формулировка зоны
292 ЧЕСТНОСТЬ ТРЁХ СТРОК НАБЛЮДАЕМОСТИ — ЖИВАЯ ПОЛОВИНА (б) ЗАКРЫТОЙ СТРОКИ 105, заведена 05.09 отдельным носителем. Закрытие 105 сняло только половину (а) — предикат isBankRole; половину (б) чинить никто не заказывал, а на неё ссылались ДВА носителя как на «до фикса 105». Три дефекта, все воспроизведены: (1) строка VOICE берёт rules= из конфига ВРЕМЕНИ ОТЧЁТА (backend/internal/pipeline/quality.go, греп rules=), поэтому включение gates.voice ПОСЛЕ прогона печатает «измерено, чисто» для книги, которую никто не мерил; (2) та же строка печатается при ВЫКЛЮЧЕННОМ гейте, если SpoilerLeaks>0 — поведение верное, неверна формулировка отчёта; (3) знаменатель BANKNOTE = len(states) вместе с призрачными строками retrieval_state, тогда как соседний агрегатор их фильтрует ⇒ после пере-чанковки покрытие ЗАНИЖАЕТСЯ. ⚠ Цена молчания прямая: отчёт говорит «измерено», когда не мерили, — это ложь читателю в том самом месте, куда смотрят, решая, готова ли книга. Печатает cmd/tmctl/render.go (греп rules=), пин — render_observability_test.go. бэкенд скоро правка формулировки + знаменателя + тест на «включил гейт после прогона» D39.86, D39.200; археология — architecture/13-tech-debt-anchors.md §Б-105 п.(б)
293 ФАЙЛ ПОД ЛЮБЫМ КАТАЛОГОМ books/ НЕВИДИМ ДЛЯ GIT — git status его не показывает, git add молча не берёт, и сдающая зона теряет работу, не заметив. Предъявлено 05.09 платформенной сессией и проверено оркестратором до лендинга: git check-ignore -v platform/internal/books/counter_test.go<git-common-dir>/info/exclude:9:books. Причина: правило books в .git/info/exclude НЕЯКОРЕНО, а gitignore без ведущего / ловит каталог с этим именем на ЛЮБОЙ глубине. ⚠ Неякорность ОСМЫСЛЕННА и снимать её нельзя не думая: books в связанном рабочем дереве — СИМЛИНК, а трекнутое правило /books/ матчит только каталоги (комментарий стоит там же). ⚠ Почему это не поймал никто: тронутые файлы того же каталога в git status ВИДНЫ (игнор действует лишь на неотслеживаемое), поэтому пропажа не читается глазами; а git commit -- <путь> untracked роняет и без игнора. Замер: без git add -f уехал бы 31 файл из 32. Лечение — не «поправить exclude»: файл ОБЩИЙ для всех рабочих деревьев клона, включая полигонное, и менять семантику игнора под живыми сессиями нельзя. Формы, между которыми выбирать: (а) якорить правило под КОНКРЕТНЫЙ симлинк (/books в корне дерева) и проверить, что симлинк по-прежнему игнорируется во ВСЕХ деревьях; (б) оставить как есть и завести проверку лендинга — git status --ignored --short <зона> перед каждым актом. оркестратор скоро (гигиена лендинга, $0) выбор формы + проверка во всех воркtree предъявлено платформенной сессией 05.09; проверено исполнением при лендинге 7e2226a
294 ФОРМА «СКОЛЬКО ДОБАВИТЬ» — решение владельца 05.09, ратифицировано D39.203. Наружу вместо «сколько не хватило на ЭТОТ вызов» едет «сколько добавить, чтобы прошёл ЛЮБОЙ следующий» = max(shortfall, step_max headroom): сегодняшняя недостача закрывает текущий вызов, а следующий может быть крупнее, и человек доплачивает дважды. ⚠ НЕ однострочник, и объявлять его дешёвым было бы ошибкой (зона дешевизну не подтвердила): новая величина · ПЕРЕИМЕНОВАНИЕ поляshortfall_micro_usd станет ложным именем, кандидат top_up_micro_usd · минор StreamVersion 1.3→1.4 · зеркало словаря у платформы · пере-снятие пина белого списка кадра ceiling. ⚠ Построенное поле НЕ ложно, оно у́же: закрывает вызов, а не следующий шаг бэкенд+платформа скоро новая величина + переименование + минор потока D39.203; тензия п.(3) против п.(4) заказа найдена зоной движка
295 СНАЧАЛА ПОДАТЬ ПОДПИСАННЫЙ КАНОН В ПРОГОН — только потом мерить точность чекера и решать про гейт. Живая дыра приоритета №1 владельца («100% консистентность») — НЕ порог и НЕ флаг: канон из 53 подписанных терминов не подключён к стенду, весь замеренный дрейф — дрейф С ОТКЛЮЧЁННЫМ каноном, а там, где его подключали, консистентность 99.3100%. ⇒ мерить полноту чекера на прогоне без канона значит мерить не то. Порядок: (1) канон в прогон · (2) пере-замер точности/полноты (строка 12, прежний замер порочен — класс одного иероглифа не имел ни одного положительного примера) · (3) решение владельца по gates.glossary.postcheck_gate. ⚠ Владелец 05.09: «если он ложно положительно будет стрелять это плохо, очень плохо» полигон+бэкенд скоро подача канона + замер D39.205, D39.198 п.3-4, строка 12
296 ТОЧЕЧНАЯ ПЕРЕГЕНЕРАЦИЯ ПО ПРОМАХУ ГЛОССАРИЯ — направление владельца 05.09 («или флагать, или перегенерировать проблемный участок»), работы сегодня НЕТ. Актуаторы ремонта — только RepairLatinResidue и RepairBrokenWord (backend/internal/pipeline/repair.go, греп defaultRepairClasses); glossary_miss нет ни там, ни в knownRepairClasses. Сегодняшние лекарства не точечные и обе дороги: удержать ВЕСЬ фрагмент (гейт) либо править глоссарий с --resnapshot, то есть ПЕРЕ-ОПЛАТИТЬ книгу. ⇒ заказ: glossary_miss как класс-актуатор — перегенерация участка с подписанной формой. ⚠ Гейтится строкой 295: без замера точности перегенерация по ложному срабатыванию перепишет верный текст бэкенд когда-нибудь (после 295) новый класс актуатора + пост-инвариант D39.205
297 СЛОВАРЬ ПРОВЕНАНСА СТРУКТУРЫ КОРОЧЕ НА ОДНО ЗНАЧЕНИЕ, И ПЛАТФОРМА ЖИВЁТ НА ВРЕМЕННОМ ПРАВИЛЕ. Для EPUB-spine ложны ВСЕ ТРИ значения Document.Structure (backend/internal/chunk/ingest.go:70-113): declared = «ФОРМАТ назвал границу», а spine называет ПОРЯДОК ЧТЕНИЯ, и «документ = глава» — догадка движка, не слово формата; detected определено МЕХАНИЗМОМ «header-shaped lines in the prose» (splitTextChapters), которого здесь не было; none = «одна глава». ⚠ Само поле спроектировано ВЕРНО — оно отвечает на «КАКОЙ ПУТЬ провёл границы» (:94-95); неверна его же первая строка (:70), рекламирующая «how much the chapter cut can be trusted». Прибор отвечает на свой вопрос, а читают его как ответ на другой, и здесь неверное чтение НАПЕЧАТАНО ВНУТРИ прибора, двумя строками выше верного. Пока значения нет, платформа исполняет потребительское решение, прописанное в самом комментарии (:93-94, «decline to offer an order in chapters»): declared ведётся как none для целей ползунка заказа. Правило ВРЕМЕННОЕ, и снятие его — уборка, а НЕ сцепленный деплой. Добавить значение можно АДДИТИВНО: manifestVersion версионирует ФОРМУ ДОКУМЕНТА (backend/internal/pipeline/manifest.go:40-46), а новое значение строкового поля формы не меняет — так же приехали сами Structure и Price. Стоп-мир возник бы только из CHECK-ограничения схемы платформы (platform/internal/pgstore/migrations/00033_order_and_price.sql:28), которое противоречит её же обещанию «unknown → not recognised» и снимается ДО лендинга. ⇒ как только движок пошлёт новое значение для spine, платформа прочтёт неизвестное как none своим StructureTrusted, и для SPINE-книг ползунок станет верным САМ. ⚠ Испр. 05.09: «без правки на её стороне» — НЕВЕРНО и снято. Правка нужна, и снятие правила ОБЯЗАТЕЛЬНО: после пака declared станет означать ТОЛЬКО настоящую структуру глав из nav/NCX, и временное правило начнёт ОТНИМАТЬ у таких книг заслуженный ползунок глав. Отказ безопасен по направлению (продаём по знакам там, где могли по главам — консервативно, не опасно), но он МОЛЧА недодаёт продукт, и потому это не уборка, а обязательный шаг. Носитель довода зона положила в комментарий ingest.ChapterOrdersOffered, чтобы снимающий нашёл его по коду. ⚠ По тому же правилу под недостающее значение попадает и \f в txt — form feed есть разрыв СТРАНИЦЫ, а не утверждение о главе, и сегодня он тоже declared; решает структурный пак бэкенд+платформа скоро (структурный пак) недостающее значение на проводе, и declared означает ТОЛЬКО объявленную форматом структуру глав D39.202, D39.205
298 unit_resolutions КЛЮЧЕВАНЫ ПОЗИЦИЕЙ, И ЛЮБОЙ ПЕРЕКРОЙ ИХ СНОСИТ ЦЕЛИКОМ. Ключ (book_id, chapter, unit, wave) позиционен по построению, и миграция это прямо объявляет: «keyed by the ENGINE's own ordinals» (platform/internal/pgstore/migrations/00015_seam_ceiling_and_units.sql:50-56); событие unit_done несёт номер главы и ординал юнита, синк пишет их как есть (platform/internal/pgstore/sink.go:249). Потому при перекрое платформа ОБЯЗАНА удалять решения — иначе они перевесятся на чужую главу. Сегодня цена нулевая: решения есть только у стенд-книги, и это окно закрывается с каждой новой платной книгой. ⇒ разрешать (chapter, unit) в идентификатор ПРИ ПРИЁМЕ события, пока дерево у платформы на руках, и хранить идентификатор. Платформенная половина структурного пака: миграция плюс синк. ⚠ Этой строкой НЕ закрывается одноразовая перечеканка всех id при смене смысла cutTag — это другой предмет и другая цена бэкенд+платформа скоро (структурный пак) решения переживают перекрой, не переклеиваясь на чужую главу D39.202
299 ИМЯ В GO-КОММЕНТАРИИ, КОТОРОЕ НИ ВО ЧТО НЕ РАЗРЕШАЕТСЯ, — И НИЧТО ЭТОГО НЕ ЛОВИТ. ЗАМЕР 05.09, полностью меняющий форму ДОРОГОЙ половины (той, что сверяет имя с каталогом мутаций): она обязана писать ФАЙЛ, а не читать stdout. Полный прогон каталога дал: несущих верхнеуровневых тестов 194 из 1213 тест-функций движка (16,0 % батареи), и 139 записей из 197 пинятся РОВНО ОДНИМ тестом — то есть краснота атрибутируется однозначно, и долговременная запись «какие тесты несущие» реально получается. Но тул обрезает список имён на четырёх и печатает +N more — так усечены 9 записей из 197, и механизм, читающий stdout, насчитал бы 178 вместо 194 И НЕ УЗНАЛ БЫ ОБ ЭТОМ. Это тот же класс «прибор ответил на свой вопрос»: величина ВЫЧИСЛЯЕТСЯ сегодня, но в поток приезжает УСЕЧЁННОЙ. ⇒ вход механизма — -logs, не вывод. Точный список имён воспроизводится пере-прогоном каталога с -logs; сохранять его отдельным артефактом не нужно. Два живых носителя, найдены верификацией 05.09 (D39.207 п.3): (а) backend/internal/runevents/runevents.go:187 цитирует docs/BACKEND_MONEYSTOP_SESSION_PROMPT.md:78, а файл УДАЛЁН — промт уведён в архив тем же коммитом, что писал акт, и цитируемая фраза лежит в архивной копии на другой строке; (б) backend/internal/config/internal_call.go:11 и backend/internal/pipeline/live_reprobe_test.go:14 называют сторожами тесты TestSyntheticStageSeamIsSingle и TestProviderEgressSeamIsSingle, которых в дереве НЕТ — инварианты при этом реально сторожатся вет-анализаторами StageSeam/EgressSeam (backend/internal/archguard/archguard.go:80,377), то есть гарантия цела, а назначенный ей сторож ВЫДУМАН. Замер верификатора: из 2026 упомянутых в Go имён Test… определены 2012; из восьми неразрешающихся четыре — не дефекты (надгробия и иллюстрация), два — мелочь, два — эти. ⇒ дешёвая половина открытого вопроса D39.202 п.9: не «доказал ли каталог, что названный тест умеет падать» (дорого, требует интеграции с tmmutate), а «РАЗРЕШАЕТСЯ ли названное имя вообще» — это греп, и сегодня он находит два дефекта.counts.py --lint этого класса не видит по построению: он читает доки, а не код. ⚠⚠ ДВА ПРАВИЛА, БЕЗ КОТОРЫХ ГЕЙТ ВЫКЛЮЧАТ НА ВТОРОЙ ДЕНЬ (принесены верификатором вместе с находкой): (1) разрешением считается и ПРЕФИКС — доки и комментарии цитируют имя усечённым, как греп-цель; (2) НАДГРОБИЯ не дефект — комментарий, прямым текстом говорящий «удалён/заменён», законен, как и иллюстративное имя в примере. Замер, обосновывающий оба: из восьми неразрешающихся имён СЕГОДНЯ четыре — надгробия и иллюстрация, два — усечение в шапке над функцией, и лишь два — настоящие выдуманные сторожа. Гейт без этих правил краснеет 8 из 8, то есть врёт вчетверо, и его погасят — а гейт умирает не отключением, а вытеснением из привычки (D39.202 п.3-бис) бэкенд скоро грепом: имя Test… и <док>.md:<строка> в Go разрешаются, иначе красно D39.207, D39.202
300 РЕПО-ШИРОКИЙ СТОРОЖ НЕ ДОТЯГИВАЕТСЯ ДО СОСЕДНЕГО ВОРКРИ НА ДРУГОЙ ВЕТКЕ — и стенд от этого УЖЕ СГНИЛ. ⚠ Замер 05.09, вторая половина: снять пин манифеста стенд-конфигами удалось для ОДНОГО исходника из восьми; семь падают, и ни одно падение не про структурный пак. Причины — ретированные в main вещи, живые в дереве polygon: плейсхолдер {{genre}} (ретирован D39.138 п.2в) — в моём дереве grep -rln '{{genre}}' backend/prompts/ ПУСТ, в соседнем живёт в ШЕСТИ файлах промтов, и падают на нём 6 конфигов из 8; поля stm_depth/overlap_tokens, которых больше нет в config.ContextAssembly — 1 из 8; ключи mined_delta:/mined_rejects: (ретированы D39.156 п.3) — 17 конфигов из 31. Тест genre_retired_test.go:46 предсказал этот случай дословно («should be caught by the repository that retired it, not by a paid run») — и поймали его действительно бесплатно, но сторож не дотянулся до соседней ветки, где ретированное живо. ⇒ общая форма дефекта: ретирование, проведённое репо-широким гейтом, НЕ распространяется на воркри другой ветки, и стенд тихо остаётся в прошлом. ЧАСТНЫЙ СЛУЧАЙ ТОГО ЖЕ КОРНЯ — ДАННЫЕ ПАР-ПАКА В ДВУХ ВЕТКАХ. Замер бэкенд-сессии 05.09 по 31 конфигу book.yaml стенда 蛊真人: у 20 langpack_root указывает в СОСЕДНЕЕ РАБОЧЕЕ ДЕРЕВО /home/ubuntu/projects/textmachineа оно на ветке polygon; у 9 — в main; 2 не объявляют его вовсе. Пока каждая ветка собирается из своего дерева, расхождения не видно. ⚠ Структурный пак (CHAPTER_STRUCTURE_SESSION_PROMPT.md) выносит marker/units из zh-ru/heading.txt в данные ИСТОЧНИКА и учит parseHeading ОТВЕРГАТЬ эти ключи с переходным сообщением ⇒ старый файл, оставшийся на polygon, станет невалидным, и двадцать конфигов не загрузятся вовсе (загрузка пар-пака FAIL-LOUD). Выстрелит НЕ при лендинге в main, а в момент, когда полигон вольёт main в свою ветку — то есть цена назначена чужой зоне и в чужой момент. ⇒ заказ: перед мержем полигон либо снимает marker/units из своего heading.txt, либо переводит langpack_root своих конфигов на main. ⚠ Второе дешевле и, возможно, правильнее по существу: каталоги configs/langpacks в обоих деревьях сегодня БАЙТ-В-БАЙТ идентичны (diff -rq пуст, sha256 heading.txt совпадают), а комментарии в конфигах, утверждающие «ru/ есть только здесь», ПРОТУХЛИ — класс строки 299. То есть двадцать конфигов смотрят в чужую ветку по причине, которой больше нет полигон скоро (до мержа main в polygon) конфиги грузятся после мержа, либо langpack_root переведён D39.207
301 --max-units НЕ УМЕЕТ СКАЗАТЬ «ДОРАБОТАЙ ПЕРЕНЕСЁННОЕ И НЕ НАЧИНАЙ НОВОГО», И ЧЕЛОВЕК ЗА СВОИ ДЕНЬГИ ПОЛУЧАЕТ НЕ ТУ РАБОТУ. Флаг бюджетирует N НОВЫХ стартов, а carried-юниты (задрафченные прошлым прогоном и не отгруженные) движок допускает СВЕРХ гранта, до N штук: granted() их не считает (backend/internal/pipeline/volume.go:396-407), и собственный тест движка это фиксирует — под --max-units 1 при одном carried выходит Delivered=2, Carried=1 (volume_test.go:721). ⇒ прогон, оборвавшийся МЕЖДУ волнами (стоп на подпись банка, деплой, краш), при респауне получает --max-units = заказ доставлено, и движок оплачивает ЧЕРНОВИКИ глав, которых человек НЕ ЗАКАЗЫВАЛ, раньше редактуры заказанных. ⚠ Это НЕ перерасход--ceiling-usd держит сумму; ломается ровно обещание «вы купили N»: за те же деньги приходит другая работа. Выразить нужное платформа не может по построению: вычесть carried значит обнулить грант, а ноль для движка = «без границы» (planVolume при MaxUnits <= 0 возвращает nil, volume.go:321). ⇒ заказ: словарь скоупа обязан различать «сколько НОВЫХ начинать» и «сколько всего допускать». Живая половина эрраты 03.09-а (перенос юнита вне гранта, семантика НЕ ратифицирована, слово владельца «подумаем»), но со следствием более острым, чем записано в ноте: там был перерасход единиц, здесь — подмена предмета покупки бэкенд+платформа скоро флагом выражается «ничего нового не начинать»; пин на респауне между волнами D39.207
302 РЕЗКА xhtml ПО ЯКОРЯМ nav: текст цел, ГРАНУЛЯРНОСТЬ ТЕРЯЕТСЯ. Массовая форма EPUB — несколько глав в ОДНОМ документе, разделённых якорями, и nav объявляет на них отдельные цели. Структурный пак 1 такие цели СХЛОПЫВАЕТ: одна глава вместо трёх, текст не теряется (формулировка бэкенд-сессии 05.09: «текст цел, гранулярность потеряна»). ⚠ Ложь при этом уже не едет — тем же паком ратифицировано: схлопнулась хоть одна цель ⇒ книга НЕ declared, а delimited, плюс счёт targets collapsed: N в WARN. То есть провенанс честен, а разрез груб. ⇒ заказ: резать документ по якорям целей. Почему НЕ сделано паком 1 и почему это дорого: это единственное место, трогающее extractXHTML, у которого четыре пина байт-паритета (ingest_test.go:323, 359, 423, 467 — void-теги, несбалансированный ruby, raw-text-элементы, голый амперсанд), и ошибка там ТИХАЯ. Заходить в него в конце пака, ради гранулярности, при живом гейте разреза — плохой размен. ⚠ Строкой закрывается ГРАНУЛЯРНОСТЬ, а не провенанс: продать такую книгу по главам платформа и так не предложит бэкенд когда-нибудь (после пака 2) книга с тремя якорями в одном документе даёт три главы; четыре пина байт-паритета целы D39.207

(Указатели на архив-слайсы хроники — бюллетенем «Архивы хроники» в CURRENT-STATE; здесь копий нет.)

Бэкенд

ПИНГ ОРКЕСТРАТОРА №22 от 05.09 про якоря — ИСЧЕРПАН В ТОТ ЖЕ ДЕНЬ, работать по нему НЕ НАДО. Зона починила всё коммитом e7d6b3f: counts.py --lint0 битых якорей, сверяемых по токену стало 200. ⚠ И нашла БОЛЬШЕ, чем было в пинге: из шести битых ПЯТЬ оказались старше её пака — их скрывало то, что backend/docs добавили в корни линта только 04.09; чей это дрейф, предъявлено замером, иначе пять чужих долгов записались бы ей. ⚠ Номера строк, продиктованные пингом, были НЕВЕРНЫ — зона пере-нацелила по СОДЕРЖИМОМУ и перевела ссылку в токенную форму, чтобы дальше её сторожил линт, а не человек. Что из этого стоит дороже починки — норма, найденная зоной у себя: она гоняла СВОЮ проверку якорей после каждого касания кода и ни разу не прогнала гейт, который уже стоит в репозитории. Два множества якорей и одна привычка — та, которую завела сама. Разбор — D39.202 п.3-бис.

Состояние зоны на 05.09 (вечер): активного промта НЕТ — пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ (акт D39.206, 81a89e9 + 616a8e4), промт в archive/prompts/ с баннером исхода; дерево backend/ чисто. Следующая работа зоны — строки 291 · 294 · 296. Прежняя редакция («на 31.08 активного промта нет, дерево чисто») читалась как текущее и приглашала следующего править чужое дерево. Ратифицированные лендинги зоны: входная дверь шва — 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 (ЗАКРЫТА 04.09 актом D39.194 — копия потребителя приведена к производителю) · 247 · 232 · 233 · 197 (ресурс ушёл в фазу 1, строка не взята) · 228 · 229 · 230 · 141-остаток · 131. ⚠ Строк 231 и 236 в таблице БОЛЬШЕ НЕТ — 231 съел пак «деньги», 236 сужена D39.175.

Прожитая проза зоны за 2431.08 СНЯТА отсюда — история живёт слайсом 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.

05.09 — ОТЧЁТ пака «ФОРМАТЫ И ЧЕСТНЫЙ СЛОВАРЬ» (сессия textmachine-main-fe, промт CHAPTER_STRUCTURE_SESSION_PROMPT.md)

Полный отчёт — backend/docs/CHAPTER_STRUCTURE_REPORT.md. Здесь только несущее. Денег $0.

Гейт §3 взят по ветке (а) на ВОСЬМИ исходниках из восьми: id глав и номера байт-в-байт, structure не изменился. Двинулось ровно заказанное — key и сегмент cutTag внутри unit-id при неподвижном префиксе id главы (c3aa4cbbb53de134:d4fb75e2:0c3aa4cbbb53de134:1b30b1dd:0). Батарея: make battery EXIT 0, 19 пакетов, 0 FAIL, линтер 0 issues, скипов 3 — те же три, что и до правок.

Построено: данные структуры ИСТОЧНИКА со своим загрузчиком и лестницей (файл языка → CJK-дефолт по скрипту → честный none) · компонент Structure в cutInputs и в ключе манифеста · четвёртое значение delimited и КОНКУРЕНЦИЯ свидетелей вместо сложения · EPUB nav/NCX с правилами прикрепления и счётами · title_raw аддитивно · бамп chunkerVersion v6→v7 с пере-захватом голдена.

Дрейф ingest↔chunker был ЖИВОЙ, а не гипотетический (замерено до кода): ингест резал по пяти юнитам 章节節回話 из embedded cjk-section.txt, чанкер — по четырём 章节節回 из пар-файла, и комментарий ingest.go, утверждавший «ONE source, no ingest↔chunker byte-drift», описывал намерение, а не код. Пак его ЗАКРЫЛ, а не предотвратил: cjk-section.txt не тронут ни строкой, чанкер начал читать ЕГО.

ГЛАВНОЕ, ЧТО СТОИТ ДОРОЖЕ КОДА — заказ содержал ЦИКЛ, и существующий тест его не ловил. Решить «есть ли шапки» нельзя до нейтрализации \f: шапка сразу за ним лежит на ОДНОЙ строке с прозой предыдущей главы и отвергается двумя предикатами сразу. При наивном порядке глава теряется МОЛЧА, а doc.Structure остаётся ВЕРНЫМ — то есть тест, проверяющий только ярлык, проходит над потерей. Класс D39.205. Предъявлено посадкой: наивный порядок красит TestTXTHeaderRightAfterAFormFeedIsNotLost («chapters = 2, want 3»), а тест провенанса при этом ЗЕЛЁН.

Шесть находок до кода, все приняты и внесены в промт (24f02bb · 23b00a3 · 5a502e7 · cd55329). Кроме цикла и дрейфа: гейт был недостижим по построению (требовал байт-в-байт манифест, а пак сам заказывает сдвиг cutTag); langpack_root 20 конфигов из 31 указывает в дерево ветки polygon; стенд отстал от движка — стенд-конфиг даёт манифест ровно для 1 исходника из 8 ({{genre}} ретирован и жив в шести промтах polygon, mined_delta/mined_rejects — в 17 конфигах из 31, поля stm_depth/overlap_tokens исчезли).

Норма, купленная сменой трижды за день: счёт по ИМЕНИ и счёт по СОДЕРЖИМОМУ — разные замеры, и первый молча даёт зелень. Шапки книги уникальны, а НОМЕРА повторяются шестикратно (первый прогон дал «повторов 0» и был неверен); файлы разноимённы, а байты те же (исходников восемь, не девять). Меряй хешем, не basename.

Выжившая посадка, записанная с аргументом: переворот сортировки целей nav не покрасил ничего — starts читается как МНОЖЕСТВО, группировка идёт по spine. Комментарий поправлен на правду вместо красивого утверждения; сортировка оставлена как контракт поля, а не как несущее свойство.

Каталог мутаций 201 → 204. Две записи целили в предикаты, которые §1 приказал УДАЛИТЬ, и пере-нацелены на свойства, занявшие их место; три новые — на правила формата. Все пять прогнаны: 5 RED, 0 неожиданных. ⚠ Полный прогон 201 записи НЕ делался (124 из них гоняют ./internal/pipeline/ по ~145 с); вместо него механически проверено, что у всех 204 записей цель ЖИВА.

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 batteryMAKE_EXIT=0, golangci-lint 0 issues, ok в 19 пакетах, SKIP три и те же: TestMinerFullBookParity, TestHelperEventsRun, TestHelperKillLoop. Тесты. grep -rn '^func Test' backend --include=*_test.go | wc -l1105 → 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.GenderDeltaFile → сид-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 БД стенда, через СОБСТВЕННУЮ предобработку движка (splitBanknotechecks.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 -l6 → 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-reflowv2-reflow-nogenre, v3-discourse-reflowv4-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 > 0Carried > 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 -l1105 → 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 мс — то есть запрос был выпущен и, скорее всего, оплачен. Латентность разводит два случая (2031 мс против 156 с). Я это НЕ чинил: stagerun.go в моей зоне, но это ДЕНЕЖНЫЙ путь и отдельный предмет, а не пункт вайр-батча. Заказ на него — отдельным паком.

ЧЕГО Я НЕ ДЕЛАЛ ПО ГРАНИЦАМ: не коммитил, индекс и историю не трогал; platform/ и eval/ только читал; соседний worktree не открывал; .env не читал.

ДОФИКС ПО ПРИЁМКЕ (04.09) — четыре пункта наряда, все закрыты

Класс, который приёмка вскрыла и которого моя самопроверка не нашла: СЕМЬ ЗАЯВЛЕННЫХ ГАРАНТИЙ СУЩЕСТВОВАЛИ ТОЛЬКО КАК КОД. Двенадцать её посадок пережили полную батарею. Это ровно образец D39.187 — тот же дефект, что этот пак чинил у чужого пака, повторённый мной. И нашёлся он там, где я сам сказал «ставь гуще», то есть карта слепых зон работает; чего у меня не было — это привычки сажать мутации на СВОЙ новый код, а не только на соседний.

Д1 — пять неприбитых гарантий прибиты, каждая тестом И записью каталога (WB5WB13, каталог 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 -l27. ⚠ Заказанная смена поведения, объявляю (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, записи WB1WB13 красные.

КРУГ 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, записи WB1WB29 красные одним прогоном. Удалённых имён по-прежнему одно — переименование TestEditorSectionFollowsProvenance.

КРУГ 3 ПЕТЛИ (D39.191) — ЗАМКНУЛСЯ ПО СОДЕРЖАНИЮ, НО НЕ ПО УСЛОВИЮ: веер нашёл 20 переживших посадок и 1 дыру исполнением, все закрыты

Условие замыкания не выполнено и здесь. Круг замыкается, только когда проход с непустым веером не нашёл НИ ОДНОЙ пережившей посадки. Этот нашёл двадцать — плюс дыру, найденную не посадкой, а исполнением. Ниже веер, все находки с диспозициями, что я перепроверила сама, и чего круг не покрыл.

Веер

Два источника, и это первый круг, где второй — не мой агент. (1) Агент fable, read-only, работавший в СВОИХ копиях дерева (рабочее дерево не тронуто — подтверждено им и сверено по git status): 68 посадок в семи предметах, 48 красных, 20 переживших, 0 несостоявшихся. (2) Круг оркестратора — независимый веер по тому же батчу, девять находок, пять новых для меня. По трём пунктам два веера сошлись НЕЗАВИСИМО (дедуп полисемии · порог без пина · класс структурных утверждений), и это первое за три круга свидетельство, что находки воспроизводимы между читателями, а не являются вкусом одного.

ГЛАВНОЕ: денежная дыра, которую круг 2 ОБЪЯВИЛ ЗАКРЫТОЙ, была открыта

Мой фикс круга 2 внёс банк-роли в ReachableModels() и на этом остановился. CheckKeys читает этот список ТОЛЬКО в лейбл-ветке. Безлейбловая книга — shipping-дефолт — идёт второй веткой, которая собирала модели стадий руками и про ворота не знала. Проверено исполнением: терминолог, классификатор и ремонт на провайдере с пустым api_key_env проходили префлайт целиком, CheckKeys возвращал nil. Прогон покупал черновую волну и умирал на воротах.

Почему тест круга 2 был зелёным поверх дыры: он утверждал СПИСОК, а не префлайт. Пин на списке не есть пин на проверке, которая его читает.

И вторая половина той же дыры: рантайм-список reachableModels() тоже не был прибит — посадка «только стадии» (без ремонта и банк-ролей) держала ВЕСЬ пакет pipeline зелёным. Причина — совпадение pipeline-c1, воспроизведённое в фикстурах: каждая фикстура ставит воротам model: fake-model, ту же модель, что у стадий. Закрыто: одно определение gateModels(), которое читают обе ветки CheckKeys и ReachableModels; тест зовёт CheckKeys, а не смотрит список; и фикстура, где банк-роль ходит СОБСТВЕННОЙ моделью, с пином на пре-строенной карте клиентов.

Что нашлось ещё — по классам

А. ЦЕЛЬ С CJK-ПИСЬМОМ НЕ ЭКРАНИРОВАЛАСЬ ВООБЩЕ (находка оркестратора). Гейт !isCJKTarget принадлежал ЭХО-правилу, а держал оба правила сразу. «Вывод в письме ИСТОЧНИКА» для →ja бессмысленно — верный перевод zh-книги полон ханьцзы; «вывод в письме ЦЕЛИ» отвечается прекрасно. Итог: →ja/→zh/→ko не судились ничем, при том что доккоммент langscreen обещал обратное. Это бьёт в цель проекта №2: на ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go» ответ для CJK-целей был «нет». Экран вынесен из-под гейта, эхо-правило осталось под ним. Документированный предел супермножества (китайский вывод для →ja не флагуется) прибит как ПРОМАХ, чтобы никто не принял экран за защиту от zh-эха на →ja.

classifierVersion НЕ двигали — ратифицировано оркестратором. Для →ru поток управления побайтово тот же (!isCJKTarget истинно и до, и после, обе ветки в том же порядке), →CJK-снапшотов не существует, а строка в этом батче уже сдвинулась дважды и пере-снапшот уже предписан единым актом. Различитель на будущее: бамп должен любой смене, способной пере-вердиктить СУЩЕСТВУЮЩИЙ снапшот — не «кажется, безопасно».

Б. ПРОИЗВОДНОСТЬ ВЕРСИИ ЭКРАНА БЫЛА ЗАЯВЛЕНА И НЕ ДЕРЖАЛАСЬ (3 посадки). Доккоммент Version говорит «выведена по построению, поэтому сдвиг порога забирает громкий --resnapshot с собой». Не проверял никто. Посадка: переписать var литералом, который он сейчас печатает, и сдвинуть порог 0.50 → 0.45 — строка не двинулась, голден не двинулся, оба интервальных пина прошли (0.45 внутри пустой полосы), весь пакет зелёный. Резюмированный чанк пере-вердиктился бы порогом, за который никто не платил. Третья дверь: %.2f не выражает 0.504 — окно точности ±0.005. Закрыто: тест пересчитывает строку из констант, и round-trip-guard требует, чтобы напечатанный порог читался обратно тем же числом. Формат НЕ расширен намеренно — это стоило бы --resnapshot всем книгам за правило, которое не менялось; расширение теперь осознанный акт.

В. ГРАНИЦА СРАВНЕНИЯ, КОТОРУЮ НЕ ВЫРАЖАЕТ НИ ОДНА КОНСТАНТА. share < floor<= пережило весь пакет: ни одна фикстура не сидела ровно на линии. Прибито фикстурой ровно на 200 буквах, из которых ровно 100 целевых — доля 0.50 без плавающего люфта.

Г. ВАЛИДАТОР ПЛЕЙСХОЛДЕРОВ — ТРИ ДВЕРИ. (1) Сканирование только System-части пережило всё — каждая фикстура кладёт плохой маркер в системную половину, а самое вероятное место для автора — пользовательский хвост, где живут почанковые переменные. (2) Снятие проверки незакрытого {{ пережило. (3) Тест «равенства множеств» обходит placeholderNames(), то есть таблицу РЕНДЕРЕРА, и доказывает только «рендерер ⊆ валидатор»; дорогое направление — обратное, и оно было прибито четырьмя ЛИТЕРАЛЬНЫМИ словами, так что пятое слово проходило насквозь. Закрыто устранением, а не пином: валидатор ТЕПЕРЬ ЕСТЬ РЕНДЕРЕРCheckPlaceholders рендерит по настоящей таблице значений. Второго списка не существует, расходиться нечему.

Д. ЗАКОН-БЛОК: ПОДПИСЬ ПРОТИВ УВЕРЕННОСТИ (5 посадок). Подпись — это СТАТУС, а не уверенность матча: подписанная строка, сработавшая по сомнительному ключу, всё равно канон, которому уступают. Ключевание набора подписей на диспозиции пережило. Уступать должен ЛЮБОЙ неподписанный статус, а не только draftauto пишет майнер, то есть ровно та строка, ради подчинения которой правило и существует. Плюс: подписанная строка с ПУСТЫМ переводом не канон (иначе термин исчезает из блока), несимметричный TrimSpace разрушает набор, и однопроходная версия зависит от порядка. Отдельно — вакуумность в моём собственном тесте: его комментарий утверждал, что случай (1) держит независимость от порядка, а стоящий там же sortByPriority это утверждение обнулял. Комментарий исправлен, независимость от порядка вынесена в отдельный случай, который рендерит блок НАПРЯМУЮ, в обоих порядках.

Е. ЛИПКИЙ ПЕРЕНОС: ПОЛОВИНА ДИСПОЗИЦИИ. Перенос наследует обе половины, но пересчёт диспозиции ИЗ СОБСТВЕННОЙ ПОВЕРХНОСТИ строки пережил: в прибитой фикстуре src сам и есть сомнительный ключ, поэтому пересчёт воспроизводит тот же ответ. Разделяющая фикстура (ханьский src, сомнительный кана-алиас) существовала, но утверждала только KeyTrusted. Под посадкой перенос молча повышался до Confirmed — пропуск принудительного пост-чека и место повыше в бюджете, — а провод молчал, потому что половина доверия цела. Это D16.2-повышение в чужом пальто.

Ж. ЛЕДЖЕР КОРПУСА ПИНИЛ ЭКСТРЕМУМ, А НЕ ПОПУЛЯЦИЮ (5 посадок). Второй по трудности здоровый образец можно было смягчить, второй по низости целевой — тоже, а трудную строку — заменить числами лёгкой ПОД ЕЁ ЖЕ id: счётчики, экстремумы и множество id держались. И у интервала не было записи про ВТОРУЮ сторону: доля off-target могла уехать 0.000 → 0.490 при всех зелёных тестах, и порог 0.50 сел бы прямо на образец, пока леджер говорит «полоса пуста». Закрыто: запись wantBestOffTargetTgt и дайджест по всей популяции (id · метка · четыре счётчика, сортировка по id) — пере-взятие корпуса стало осознанным актом, переписывающим строку в том же коммите.

З. ОПЕРАТОРСКОЕ ПРЕДЛОЖЕНИЕ: ЧИСЛО ФЛАГОВ ПЕЧАТАЛОСЬ ЧИСЛОМ ПЕРЕДЕЛОК. Пережило весь пакет: обе фикстуры, читающие это предложение, имели Reworked == Flagged == 1. Разведены.

И. ФЛАГ, РАДИ КОТОРОГО ПОСТРОЕН ПУНКТ 2, БЫЛ САМЫМ БЕЗОБИДНЫМ В ПАСПОРТЕ (находка оркестратора). flagReasonSeverity не знал off_target_lang → дефолт 8, ниже length (6). Глава, вернувшаяся не на том языке, показывала «length» как худшую проблему. У функции не было ни одного теста. Закрыто: switch стал картой, а исчерпаемость держит тест, читающий константы FlagReason из исходника через go/ast — список в тесте гнил бы ровно так же, как список в коде, и заверял бы гниль.

К. ВТОРОЙ CALL-SITE classify (находка оркестратора). repairReGate собирал classifyInput руками из тех же полей, что classifyOutput. Поле TargetScripts однажды уже забыли там, починили руками — и посадка показала, что починку не держит ничто. Закрыто устранением: один конструктор classifyInputFor, пин на нём через рефлексию — любое поле, пришедшее нулевым, валит тест. Список полей в тесте не пишется: его обновлял бы тот же, кто забыл обновить конструктор.

Л. ДВЕРЬ 3 ГЕНДЕРНОГО ТЕСТА ОБЕЩАЛА НЕ ТО, ЧТО ДЕРЖИТ (находка оркестратора, подтверждена исполнением). Её комментарий говорил: «впустят mined-строки в базовый банк — покраснею». Не краснеет: внутри ОДНОГО прогона черновая волна покупается ДО ответа классификатора, поэтому никакое правило про банк не положит род на тот провод. Утверждение об отсутствии оставлено как утверждение о ПОРЯДКЕ, а денежный контракт теперь утверждается там, где живёт — на двух материализованных банках: обогащённый несёт mined-строку, базовый её не выбирает.

М. ИНСТРУМЕНТ ТЕРЯЛ СВОЙСТВО «ГОНЯЕТСЯ ЦЕЛИКОМ» (находка оркестратора). Протухший якорь AF-keys-file-reason-covers-all (протух ещё до этого пака, на 8adcb86) возвращал ОШИБКУ ПРОГОНА и клал весь каталог на 33-й записи из 120 — а прогоны через -id продолжали проходить, и никто не видел. Закрыто: протухание стало ПЕРЗАПИСНЫМ вердиктом ROTTED — прогон идёт дальше, выход остаётся ненулевым, запись предъявляется. Якорь починен.

Что я перепроверила САМА, не приняв на слово

  • Три находки оркестратора, где код на вид противоречил заголовку (repair.go передаёт TargetScripts; CheckPlaceholders сканирует весь canon и ловит незакрытый {{; TestUnionStickyNewestWins на вид ловит keep-first) — прогнала собственные посадки. Две подтвердились как непокрытость, одна — нет.
  • UnionSticky (его находка №4) — ОТВЕДЕНА. Четыре независимые посадки красные. Оркестратор проверил свою на чистой копии b8154cd и снял её сам с точным разбором: его «инверсия» (обход новое→старое с keep-first) ПОВЕДЕНЧЕСКИ ЭКВИВАЛЕНТНА оригиналу (обход старое→новое с перезаписью). Третий класс ложной зелени за сутки — посадка, не меняющая поведения, рядом с моими двумя: упавшая сборка, прочитанная как зелень, и обрезанный вывод, прочитанный как ноль. Общее у всех трёх: читатель верит ВЕРДИКТУ, не проверив, что его произвело.
  • Дыра CheckKeys — не поверила отчёту агента: написала тест, увидела его красным на всех трёх воротах, потом чинила.
  • Каждая из 19 новых записей каталога предъявлена красной прогоном. Одна (WB41) вернулась SURVIVED — моя фикстура случайно давала верный ответ и под посадкой (неподписанная строка была Confirmed и сама наполняла набор подписей). Фикстура переписана так, что подпись — единственный возможный источник; предъявлена красной.

⚠ Чего круг НЕ покрыл

  • Причина S6e — совпадение ли это фикстур или у банк-ролей есть второй путь к клиенту помимо clientFor. Названо агентом, не открыто; я закрыла СЛЕДСТВИЕ (пин на карте клиентов), не причину.
  • Сквозной прогон дыры CheckKeys через NewRunner → волна: закрыто на уровне CheckKeys и пре-строенной карты, но что происходит на живом проводе с ключом-пустышкой, никто не гонял.
  • Резюме через смену версии — end-to-end пере-вердикта резюмированного чанка нет ни одного теста; вся аргументация про --resnapshot держится на чтении.
  • Конвенционный путь стадийного промпта — пер-путевой тест гоняет только prompt_override. Маркер внутри вырезаемого комментария проходит по построению, и НАМЕРЕННОСТЬ этого никем не проверена.
  • Два НЕПОДПИСАННЫХ ряда одной поверхности оба рендерятся: «один приказ на термин» держится только когда подпись есть. Наблюдение агента, теста нет ни в ту, ни в другую сторону.
  • precomputeStickyсброс на границе главы и запись переноса, заблокированного спойлером.
  • Сам харнесс tmmutate (отпечаток и восстановление) и единственная запись expect: survives (G-byte-gate) не ревьюились ни одним кругом из трёх.
  • Ракурсы, унаследованные непокрытыми из круга 2 и не открытые снова: $0-проекции на дефектной книге · липкий перенос до редакторского провода сквозным · настоящая латинописьменная цель (target-en.txt в репо нет) · eval/-харнессы вне модуля.
  • F11 остаётся риском дизайна, не чинен: порог экрана калиброван на ОДНОЙ сянься-новелле; на латино-тяжёлом здоровом русском даёт ложный off_target (0.461 с пиньинь-глоссами, 0.077 с shell-командами), а ложный флаг ЭСКАЛИРУЕТ — то есть стоит платного вызова. Оркестратор забрал носителем.
  • Круг 3 не ревьюил мои правки круга 3. Копии агента сняты до них. Четвёртый круг, если он будет, начинается отсюда.

Числа круга

Батарея MAKE_EXIT=0, 0 issues, все пакеты ok (pipeline 571 s под -race), скипы те же. Голден в этом круге не трогали, и TestGoldenDeterminism проходит против него — круг не сдвинул ни одного байта провода. Тесты 1156 → 1173. Каталог 120 → 141; все двадцать одна новая запись предъявлена КРАСНОЙ (WB41со второй попытки, после починки фикстуры, которая случайно давала верный ответ и под посадкой).

КАТАЛОГ ПРОГНАН ЦЕЛИКОМ — впервые, и первый же целый прогон окупил починку инструмента. 141 запись: 136 RED · 0 SURVIVED · 0 NOTHING · 1 записанный survives (G-byte-gate, аргументирован) · 4 ROTTED. Протухли четыре МОИ ЖЕ записи, чьи якоря увезли рефакторы кругов 23: WB5 (сборка classifyInput уехала в конструктор), WB12 (правило дедупа исправлено кругом 2 — запись описывала регрессию, которую я же и починила), WB16 (у валидатора не стало собственного списка), WB21 (банк-роли уехали в gateModels). Под прежним поведением прогон лёг бы на первой из них, и трёх остальных никто бы не увидел — ровно то, что произошло с AF-keys-file-reason-covers-all и держалось незамеченным два пака. Все четыре пере-навешены на нынешние выражения тех же свойств (у WB12 и WB16 заодно переписан why: свойство изменилось, а не только адрес) и предъявлены красными. AF в целом прогоне — RED, то есть починка якоря проверена не на слово.

Файлы

Изменены: 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 НЕ трогаю: правка данных двигает EmbeddedVersioncutTagmanifest_key → снос unit_resolutions книги ПАРАЛЛЕЛЬНОГО платного прогона платформы. Что НЕ делаю. Чужие зоны platform/ frontend/ eval/ и соседний worktree. Строки 131 · 105(а) · 14 · 119 · 124 · 115 · 160 · 161 · 142. Самопроверка исполнением. Дифф ^func Test пофамильно до/после (удалённых имён 0) · маскированный дифф голдена (только названные версионные оси + ровно две строки диспозиций) · собственные посадки tmmutate ВНЕ шести пунктов на копии дерева · отдельный адверсариальный проход свежим контекстом (модель назову) · отчёт о движении cutTag: tmctl manifest до и после.

Канала к оркестратору нет: адрес в /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=<usd>; одна формулировка 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 на копии до и на дереве после.

Итог: четыре пункта состава исполнены, дерево backend/ готово к лендингу, НЕ КОММИЧУ (git diff --cached --name-only → пусто). HEAD на входе 494c4ef; после согласованного с платформой (textmachine-37) git pull --ff-only2a63c37. Входящее (72 файла) не пересекалось ни с одним моим файлом, кроме docs/PROGRESS.md: свою записку сняла редактором, дала git пройти fast-forward, вернула. Индекс не трогала, stash не применяла. Канала к оркестратору нет: textmachine-33 в ListAgents отсутствует, промт писан на другой машине — вопросы секцией ниже. Все file:line-якоря промта сверены грепом здесь и сошлись. Батарея на финальном дереве: cd backend && make batteryMAKE_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 -l1083 → 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 -l1 ⚠ (в первой редакции отчёта стояло «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 — нулевую структуру, так что новое поле не может пережить «неизвестный» ответ, забытое в одной ветке), в StatusReportrebill_historical_rows и rebill_model_moved_rows под тем же rebill_basis.
  • (б) отказ по названному потолку --accept-rebill=<usd> несёт 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 ниже Carriedgranted() уходил в минус, строка стопа говорила «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 '<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/archive/prompts/BACKEND_CONSENT_SESSION_PROMPT_2026-09-02.md (строка 52 на момент выдачи; в архиве номера сдвинул баннер исхода) pipeline/status.go:217 «can never quote a different number» снят по заказу (ФЧ-5 п.4)
docs/archive/prompts/BACKEND_CONSENT_SESSION_PROMPT_2026-09-02.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/archive/prompts/PLATFORM_P13_SESSION_PROMPT_2026-09-02.md (строка 286 на момент выдачи) и docs/archive/prompts/BACKEND_CONSENT_SESSION_PROMPT_2026-09-02.md (строка 227 на момент выдачи) целятся в одну снятую ею строку рантбука platform/deploy/README.md:213 «сначала платформа, потом движок»; плюс docs/archive/prompts/PLATFORM_P13_SESSION_PROMPT_2026-09-02.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 batteryMAKE_EXIT=0, golangci-lint 0 issues, ok в 18 пакетах, SKIP: TestMinerFullBookParity, TestHelperEventsRun, TestHelperKillLoop. Тесты ^func Test: grep -rn '^func Test' backend --include=*_test.go | wc -l1083 → 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=<usd> — требует «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-каталоге сессии.

05.09 — ОТЧЁТ пака «денежный стоп перестаёт быть аварией» (сессия textmachine-main-be, промт BACKEND_MONEYSTOP_SESSION_PROMPT.md)

ПОЛНЫЙ ОТЧЁТ — backend/docs/MONEYSTOP_REPORT.md (происхождение решений, пять рисков зоны по одному, самопроверка, объявления по D39.183, obstacle reporting). Здесь — итог и то, что нужно оркестратору для лендинга. Дерево НЕ закоммичено.

В дереве лежат ЧУЖИЕ правки — вся platform/ (параллельный пак textmachine-main-63). Не тронуты ни байтом. Платного прогона НЕТ: все три оси предъявлены за $0.

Четыре пункта закрыты. (1) строка 271 — правки банка больше не могут писать свои строки внутрь system-сообщения платного вызова: одна граница (internal/membank/wirefence.go), три точки исполнения — дверь отказывает, загрузчик сида отказывает, рендереры пропускают; предел 200 рун, запрет Cc + U+2028/9 + bidi-переопределений (Trojan Source), при этом ZWJ/ZWNJ/LRM/RLM РАЗРЕШЕНЫ (общность §0.1); фолд версии СКОУПНЫЙ, чистая книга хеширует байт-в-байт как до фикса — запинено значением, снятым сборкой 32be78a. (2) строка 277 — отказ резерва защёлкивает волну и не отменяет допущенное; отказ не окончателен при непустом полёте (ждём settle, повторяем тот же резерв); только ОБЯЗАТЕЛЬНЫЕ вызовы ждут. (3) строка 278 (событие) — недостача едет в ceiling, StreamVersion 1.2 → 1.3, денежный леджер в finished. (4) строка 278 (проекция) — цена книги ДО покупки в manifest --json и status --json.

Числа, каждое получено командой (полный список — §6.7 отчёта). ⚠⚠ ТРИ ИЗ НИХ ПРОТУХЛИ ЧЕРЕЗ ТРИ ЧАСА, И ОДНО ПЕРЕВЁРНУТО — поправка в конце абзаца; она найдена ВЕРИФИКАТОРОМ 05.09, не зоной и не мной: тестовых функций 1172 → 1208 (+36), все тридцать шесть в трёх новых файлах; git diff -U0 -- backend | grep -E '^[+-]func Test' ПУСТ — ни одна существующая не удалена и не переименована, два протухших починены внутри тела. Каталог мутаций 158 → 191. Батарея: MAKE_EXIT=0, 19 пакетов, 0 упавших, 0 issues (шестой прогон — первые пять красны или остановлены). Каталог ЦЕЛИКОМ: 191 запись, 187 RED, 0 SURVIVED, 0 NOTHING, 0 ROTTED, 0 неожиданных исходов — второй полный прогон; ПЕРВЫЙ не сошёлся и нашёл четыре дефекта в моих же артефактах, включая named-артефакт приёмки (§6.5 отчёта) (и go vet -vettool собственного анализатора зоны — чисто; он поймал у меня один хенд-билд config.Stage, см. отчёт).

⚠⚠ ПОПРАВКА 05.09 (замер верификатора по дереву на d766007; числа выше НЕ переписаны — они были верны в свою минуту). Абзац заленджен коммитом ba4fd34 через девять секунд после пака 81a89e9 и за три с лишним часа ДО дофикса 616a8e4, который добавил ещё +5 тест-функций и +10 записей каталога. Сообщение коммита подписало их «final counts», и после дофикса их никто не тронул. Верно на сегодня: тестовых функций 1172 → 1213 (+41) · каталог мутаций 158 → 201 · каталог целиком — 201 запись, 197 RED, ЧЕТЫРЕ аргументированных выживших, 0 неожиданных исходов. Переворачивается именно последнее: «0 SURVIVED» против четырёх записанных выжившиха это то самое различение из D39.202 п.3 (SURVIVED как СООБЩЕНИЕ О НЕДОСТИЖИМОСТИ, а не как провал), и следующая движковая смена открывает этот журнал РАНЬШЕ акта. Акт D39.206 всё это время нёс верные числа — разошлись НОСИТЕЛИ, а не факт: класс «поправил читателя, оставил писателя» (D39.202 п.1).

ТРИ ВЕЩИ, КОТОРЫЕ ОРКЕСТРАТОРУ НАДО ЗНАТЬ ДЛЯ ЛЕНДИНГА:

  1. Наружу едет НЕ то число, что назвал промт, и это согласовано. §4(3) назвал denied estimate и следующей фразой запретил его класс («цены вызовов не выходят»). Едет недостача committed+reserved+estimateceiling, поле shortfall_micro_usd (строка 278 называла next_step_micro_usd). Две оговорки в доке поля: при непустом полёте это ВЕРХНЯЯ граница; для day-скоупа поле ОПУЩЕНО (дневной потолок суммирует все книги стора, движковые цифры — одной).
  2. Третье лечение пункта 1 («обрамление как ДАННЫХ») в ТЕКСТОВОЙ форме невыполнимо. lang/data/injection.txt побайтно входит в EmbeddedVersion()cutTagвнутрь каждого unit.id: добавление одной строки пере-чеканило бы id всех книг. Сделано структурно.
  3. res.Volume при денежном стопе НЕ прикладывается. Семь счётчиков VolumeStop — план; денежный стоп оставляет допущенные-и-не-доделанные юниты посчитанными как Delivered, а LeftFresh заниженным на них, и при Left()==0 прогон, вставший посреди книги, объявил бы «дошёл до конца». Восьмого бакета нет ⇒ у денежного стопа СВОЙ леджер Finished.Money{units_resolved, units_deferred} из тех же счётчиков, что и progress.

ЧЕТВЁРТОЕ ДЛЯ ЛЕНДИНГА, и это вход в СТРОКУ 283, а не мой дефект: structure: detected сегодня CJK-ONLY. Сопоставление заголовков в интейке идёт по lang.DefaultCJKSection()КОНСТАНТА (章节節回 + класс CJK-числительных), не данные пары. ⇒ книга в любой другой письменности возвращает none, как бы явно её главы ни были размечены. Асимметрию пак НЕ вносит — движок уже читает данные пары для РЕНДЕРА заголовка (configs/langpacks/*/heading.txt), а РАЗРЕЗ остаётся захардкоженным, и строка 283 называет именно этот раскол работой. Что поле ДОБАВЛЯЕТ: у асимметрии появляется имя на проводе вместо того, чтобы прятаться в числе глав — не-CJK книга честно говорит none, и форма заказа (D39.196) не предложит ползунок в ГЛАВАХ против разреза, которого никто не делал. Классификация сама пар-агностична (спрашивает, какой ПУТЬ провёл границы) и скажет detected без правки Go в день, когда разрез научится читать пару. ⚠ Первую редакцию комментария и отчёта я написала как «пар-агностично по построению» — это было пере-утверждение, поймано собственным проходом и исправлено в обоих местах.

ПРАВКИ ЧУЖИХ ТЕСТОВ — объявление по D39.183 (все три вызваны сменой поведения, заказанной паком): · runevents_test.go — пин «the ceiling event must carry the fact and no figures» СУЖЕН, не снят: белый список ключей (halted|scope|shortfall_micro_usd), запрет любого $, ПЛЮС новое утверждение — book-стоп обязан назвать недостачу, day-стоп обязан её не называть. ⚠ Фраза ратифицирована (D39.106 §2/ПТ-33) — ноту о сужении берёт на себя оркестратор. · wavepanic_test.go, volumepanic_test.goоба ВИСЛИ (panic: test timed out after 1m30s): парковали падающий воркер на <-ctx.Done(), которую вызывал ПОТОЛОК. Потолок больше не отменяет — это заказ пака. Триггер заменён, утверждения не ослаблены.

ПРАВКА ВНЕ ЗАКАЗА, взятая по своему усмотрению: течь резервации на ветке json.Marshal(resp.Usage) (stagerun.go) — возврат без release и без settle. Довод: денежный путь, и у него появился второй читатель — утёкшая резервация ЗАВЫШАЕТ публикуемую недостачу. Ветка практически недостижима, поэтому её посадка занесена аргументированным выжившим, а не находкой.

ЧЕТВЁРТЫЙ КЛАСС ЛОЖНОЙ ЗЕЛЕНИ, найденный в этой смене (общий, не про мой пак): t.Fatalf из ПОРОЖДЁННОЙ горутины — runtime.Goexit не на той горутине: утверждение теряется, прогон висит до таймаута ПАКЕТА. Посадка, чей отказ выглядит как таймаут, неотличима от нагрузки и потому не является посадкойа Makefile зоны сам документирует разброс internal/pipeline 95 → 560 с под параллельными сессиями. Рядом с тремя известными: упавшая сборка, вырожденное утверждение, эквивалентная посадка.

ГОТОВЫЙ ТЕКСТ СТРОКИ БЭКЛОГА (таблица — зона оркестратора, поэтому текст лежит здесь, а заводит его он; уже принят и заведён как строка 291):

Отказ РЕЗЕРВАЦИИ на ретрае не деградирует и не оставляет следа — юнит может заклинить навсегда, а волна не может продолжиться без дыры. maxTokensForAttempt удваивает бюджет на каждой регенерации (disposition.go:398) ⇒ attempt 1 резервирует вдвое больше attempt 0. Отказ ретрая уходит наверх из цикла попыток (stagerun.go:164-167) РАНЬШЕ UpsertChunkStatus (stagerun.go:285) ⇒ чекпойнт attempt 0 есть (реплей за $0), строки chunk_status нет, читающие модели видят pending. Следствия два: (1) если потолок покупки не вмещает attempt 1 — юнит не доделается НИКОГДА, каждый резюм реплеит attempt 0 за $0 и умирает на attempt 1, прогон уходит exit 4 при полностью доставленных купленных юнитах; (2) продолжить волну после отказа ретрая нельзя без дыры в непрерывном префиксе — то есть цена глобальной защёлки (недодача юнитов, которые ВЛЕЗАЛИ; разброс резервов внутри волны замерен 2.976×, разбор 04.09) не снимается различителем «свежий/ретрай». Два пути, ВЫБОР НЕ СДЕЛАН: (а) отказ ретрая деградирует во флаг attempt 0 — смена D2.3, закрывает оба следствия; (б) минимальная покупка платформы ≥ step_max_usd движка — закрывает только (1) и стоит продукту минимальной покупки ~5 глав | бэкенд+платформа | скоро | выбор владельца между (а) и (б) + пин | бэкенд-сессия денежного стопа 05.09

ГДЕ ПРОМТ НАПИСАН НЕ ТАК (требование §5-тер(а), полный список — §5 отчёта): §4(3) внутренне противоречив (см. выше) · §4(1) заказывает лечение, невыполнимое без нарушения §4(6) · §3 п.1 называет секцию 15-money-path.md, переименованную 05.09 · §4(2) обосновывает защёлку доводом, который снят самой конструкцией (haltErr — отдельный слот, путь ошибки один при любом W); защёлка оставлена по ДРУГОМУ доводу — продуктовому · §4-тер риск (б) назван мягче, чем он есть: счётчики не «получают новую форму», а врут по шести полям из семи.

Полигон

📌 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.yaml58 записей, из них 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.3100% (Д50.2, 375548 пар). ⚠ Записи в сиде НЕ ХВАТАЕТ поля 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 опора покрывала 5579%). Редакция 2 на склеенном по манифесту черновике (покрытие 99100%) плюс активные нули (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, на уже купленном). Терминов с более чем одной передачей в тексте — 1316% от измеренных; сменивших форму между главами — 68%. Независимым путём (поле spread, считает сам движок): 30 записей из 102 несут >1 передачу, максимум 7 форм у одного ключа (元石: «юаньши · камень юань · изначальный камень · первородный камень…»). ⚠ Разброс МЕЖДУ режимами (0.31.9%) не превышает шум-пола (2.4%, снят по паре реплик одной руки) ⇒ дрейф на этом отрезке — свойство черновика и банка, не редактора; экономия на редакторе к нему отношения не имеет.

  • ⚠ Мои ошибки этого пака, названные вслух: первая редакция пре-рега имела невалидный первичный тест (ничьи в знаменателе против H₀=50% дают ошибку I рода 17.8%) и правило решения с непокрытым пространством исходов; гейт слепоты искал [A-Za-z]{2,} и пропускал одиночные латинские буквы (2325 на руку, слепота при этом не пробита — асимметрия 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:72llm/httpllm.go:415), только тела, без URL и заголовков — снято, что у low-рук в теле стоит reasoning_effort:"low", у -рук ключа НЕТ, у glm-5thinking:{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.320.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 давал книгу за $715, фаза — за $4168. Оба верны — (а) «книга 1500 глав» в Д29.1 это 1500 НАШИХ единиц ≈ 735 глав Гу, (б) ресёрч считал ВИДИМЫЙ вывод, а у deepseek-v4-pro 46% токенов — размышление, и это ЧЕРНОВИК, а не проверка (96% предложений финала дословно есть в трейсе): модель пишет перевод дважды и обе копии тарифицируются по выходу. Правило для сметы: цену роли считать по total_tokens, а не по длине перевода.

  • ЧТО ОСТАЛОСЬ И СКОЛЬКО СТОИТ (Д38.6, ранжировано): Шаг 7 — 15 глав Гу ПОДРЯД боевым профилем с ЗАСЕЯННЫМИ характер-листами, ~$2 + движковый прогон. Это единственный замер, дающий прибор под Вопрос 0 («консистентность на всю книгу»), и он же готовая in-loop телеметрия прода. Без засева характер-листов результат ложно-отрицателен ПО ПОСТРОЕНИЮ: полей пола в банке нет вовсе, механизма не существовало ни в одном прогоне. Дальше — цензур-ось дешёвой линии $0.20.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, но по ИЮЛЬСКОМУ прайсу. Пере-счёт тех же клеток по текущему: связка $4043 вместо $1314. (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.050.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.0780.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.0780.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.42.5, а рядом стоит рычаг ×711 — смена модели на 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% связки) ⇒ читать «луну как черновик» значило бы потратить кап на шестипроцентный рычаг; читался порядковый (×711). Результат: средние места 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: 46619 559), у луны 49% и ×3 (5111 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»). Это опровергнуто пере-пином 1315.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.24.4 в пике. Квирки — ваша зона, рукой не трогаю; поправьте при ближайшем касании, потому что по ним считают деньги проб. ⚠ ВТОРОЙ пункт этого пинга СНЯТ 05.09 как ЛОЖНОЕ ОТРИЦАНИЕ оркестратора. Он утверждал, что факт про пиковые окна цен «в квирках ОТСУТСТВУЕТ (греп = 0)». Факт ТАМ ЕСТЬ (docs/experiments/00-provider-quirks.md, греп ПИК DEEPSEEK) — и несёт поправку, которой не было в моей копии: пик только ПО БУДНЯМ, выходные целиком идут по офф-пику. То есть оркестратор, живший по своей копии, отодвигал платное на вдвое дороже по выходным. Копия снята, единственный носитель — квирки. Отрицание было получено грепом, который не мог сработать; урок общий: команда, на которой стоит отрицание, приводится в тексте, чтобы её мог воспроизвести другой. ⚠ Третий пункт того же аудита (eval/README.md держит мёртвый СТОП на платные прогоны) сведён ниже, в пинг №20 — один носитель на факт.

ВТОРОЙ пункт этого пинга ПЕРЕ-СНЯТ 05.09: спора нет и не было. Он утверждал, что квирки и docs/STACK.md говорят «ручки эффорта у deepseek-v4-pro НЕТ» — оба говорят ОБРАТНОЕ (квирки §3г: «параметр low на pro ТЕПЕРЬ ДОХОДИТ ДО МОДЕЛИ», $0.038276, 79 prompt_tokens; STACK.md:11 — то же). ⚠ Это был ЧЕТВЁРТЫЙ носитель фантомного противоречия, снесённого D39.200 п.4(а), и он пережил первую зачистку. Живой остаток один и он не спор: вендор-сверка САМОГО МАППИНГА (low → что именно) и ВЕЛИЧИНА эффекта — замера поведением после 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 и 3 СНЯТЫ 05.09 — зона их закрыла, пинг об этом не знал. (2) eval/README.md:40 уже говорит «не один скрипт, а зона из ~40», а docs/experiments/README.md несёт строки и 22, и 23 (:40, :41). (3) naklon.py в main ВЛИТ: git ls-tree -r HEAD --name-only -- eval/ | grep -c naklon → 1, и в eval/dovodka/ у HEAD 90 отслеженных файлов, а не 42. Живым остаётся только пункт 1.

ФАЗА Д «ДОВОДКА ЭКСП-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 с тремя поправками в шапке: потолок, закрытые пункты листа владельца, протухшие «долги». Открытым на владельце из неё остаётся ОДИН пункт — возражение 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.)