textmachine/docs/PROGRESS.md

333 KiB
Raw Blame History

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

⟶ ТЕКУЩЕЕ СОСТОЯНИЕ (на 2026-08-28, голова D39.163 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). ОЧЕРЕДЬ №19 (единственный носитель — здесь; роль передана 22.08, №18 закрыт D39.155): (а) P7 платформы ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН, сессия закрыта владельцем 20.08 (D39.153; зонный фикс-лист из тринадцати пунктов плюс врезанный первым блокер свипа — пинг №18 в platform/docs/platform-PROGRESS.md; ⚠ прежний врезанный пример «первым ContractVersion 0.3.0 при формах 0.4.0» СНЯТ — константа поднята и запинена гейтом против канона лендингом 31f1f82) · (а1) контракт API v0 0.4.0 РАТИФИЦИРОВАН (D39.152; PD-327 закрыт; зеркало фронта отстаёт ратифицированно, при разморозке cmp) · (б) лендинг петель полигона (фаза Д) — ОТКРЫТ: приёмка ФАЗЫ у параллельного оркестратора, лендинг за этим; ⚠ предупреждение в силе: работа полигона в дереве по-прежнему НЕЗАКОММИЧЕНА (20 позиций: START_PROMT.MD + 14 правленых и 5 новых файлов eval/). Владелец перевозил её на новую машину транспортным коммитом temp, но 24.08 снял его словом владельца (reset --mixed, дерево не тронуто — сверено побайтно, бэкап ~/tm-backup-2026-08-24/textmachine-HEAD.bundle + reflog): транспортный коммит вдобавок уносил START_PROMT.MD, который канон коммитить запрещает. Состав читать командой git status --short -- eval/, снимок здесь протухает. Не трогать и не «прибирать»; приёмка ФАЗЫ — за параллельным оркестратором, пинг №20 — в секции «Полигон». Форма коммита строго pathspec · (в) дофикс-пак P8-FIX ПРИНЯТ И ЗАЛЕНДЕН 22.08 (D39.154, лендинг 31f1f82): блокер свипа закрыт четырьмя механизмами и пере-проверен живой пробой оркестратора, деньги сошлись двумя путями из сырого леджера; мои четыре строки регистра — PD-371PD-374. ⚠ Порядок вышел ОБРАТНЫМ этой очереди: промт дофикса требовал запуска ПОСЛЕ читающего пака, запущен был раньше. Цена перестановки, названная мной вслух 21.08 («блокер живёт всё время читающего пака»), тем самым НЕ заплачена — это лучший исход, чем планировалось; в минус — §4.7 (аддендум релеем) пуст и читающий пак пойдёт по только что переписанному коду. ЧТО ДАЛЬШЕ С ПЛАТФОРМОЙ — решено 22.08 при актуализации доков, порядок такой. (1) Читающий пак P8-REVIEW — ОТРАБОТАН, ПРИНЯТ И ЗАЛЕНДЁН 27.08 (D39.159): четыре оси, 24 новые строки регистра (PD-375PD-398), 17 дописок, каталог воспроизведения platform/docs/p8-review/. Единственный vuln — PD-379 (major): открытый поток событий переживает отзыв сессии. Числа сдачи пере-мерены приёмкой на дереве С лендингом бэкенда. Промт архивируется. Следующая работа зоны — кодовый пак по этим строкам, запуск по слову владельца. Промт ЖИВ и переписан 22.08 в трёх местах, которые дофикс сделал ложными: «два денежных дефекта не заведены» (заведены и закрыты — PD-333/PD-334, вместо них дан их КЛАСС и живой образец PD-372) · приор оси 4 «наблюдаемость без ручки» (ручка построена ⇒ вопрос стал «достаточна ли она») · абсолют «оси ни в один дифф не входили» (сужен: системного разбора не было, кусками входили). Довод ЗА пак — базовая ставка, а не вера: первый же серьёзный взгляд на ОДНУ из четырёх осей (очередь, 21.08) дал пред-продовый блокер, проживший два пака под статусом fixed. Осей осталось три, и на двух из них лежат деньги и вход. (2) ПОРЯДОК РАБОТ ПО ШВУ — ратифицирован D39.156 (23.08), исполняется строго так. (2а) Движковый пак — АКТИВНЫЙ ПРОМТ ЗОНЫ (BACKEND_SEAM_PACK_SESSION_PROMPT.md, выдан 23.08, запуск по слову владельца): конвенционные дефолты mined_delta/mined_rejects · $0-глагол приёма правок банка · путь к файлу ключей аргументом (211 — движковый конец; платформенный доехал паком P9, строка ЗАКРЫТА D39.162) · строгость сид-загрузчика · путь артефакта и версия документа в status --json (213 — движковая половина; платформенная снята P9, у строки остался один дев-путь). (2б) Контрактный минор — ПОСЛЕ него и ОДНИМ куском: снос отменённой пер-термной модели + новая дверь, тело которой выводится из словаря глагола, а не сочиняется до него; сюда же строка 203 и хвосты компаньона. ⚠ Строка 200 ушла НЕ сюда: D39.160 изъял её из этого минора и отправил с паком (2в), где она и закрылась минором 0.6.0. ⚠ Гигиена держится сознательно: снести дверь сейчас и завести в следующем миноре — две перегенерации фронта вместо одной; фолбэк объявлен — если пак застрянет надолго, гигиену шипить отдельно. (2в) Платформенный пак P9 — ОТРАБОТАН, ПРИНЯТ И ЗАЛЕНДЁН 28.08 (D39.162): дверь правок банка смонтирована синхронно и под пер-книжным мьютексом · ключи доехали до движка аргументом --keys-file (строка 211 ЗАКРЫТА) · дубль конвенции пути снят (строка 213 — осталась одна строка в дев-пути) · снята сквозная полоса прогресса вместе с её канонной половиной, минор 0.6.0 (строка 200 ЗАКРЫТА) · с провода сняты два поля упразднённой модели (PD-399). ⚠ Пункт «воркер решений» СНЯТ эрратой 27.08-з: синхронность держится, замер сессии её подтвердил. Фикс-раунд приёмки — 13 позиций, две мои диспозиции сессия ОПРОВЕРГЛА исполнением и я это принял (см. D39.162). (3) sqlc отдельной сессией (решение владельца 22.08, BACKLOG.md П-19, граница 41 запрос в пяти файлах) — механическая работа, не мешать её с содержательной. (4) Живой прогон книги насквозь — строка 202, гейт прежний: ПОСЛЕ холодного прогона движка. ⚠ На владельце и блокирует пункт своей темы: развилка владения book.yaml (строка 199а, зона сдала четырьмя вариантами с ценой, рекомендация зоны C или D+B) — без неё труба доставки правок банка не строится, а верхнего края у неё теперь нет вовсе · (г) контракт: сквозная полоса прогресса ЗАКРЫТА — минор 0.6.0 заленджен вместе с паком P9 (D39.162): доля одна на всю работу прогона через обе волны, подпись стадии объявлена ВТОРЫМ ограниченным исключением из границы «ничего о том, КАК переводится книга». ⚠ Остаток назван и НЕ забыт: платформа продаёт главы, а движку передаёт только --ceiling-usd — единицы разные, и это PD-410 (архитектурный стоп зоны). Хвосты релеев (203) ждут следующего минора · (д) свободные бэкенд: 160 Этап 0, фикс-лист ФЧ строкой 197 (носителя-сессии нет по слову владельца); ⚠ строки 176/181/187 СНЯТЫ с таблицы при лендинге 20.08 — они закрыты ещё D39.149, а очередь всё это время звала 181 свободной работой (поймано ревью доков; остатки живут строками 194/196/197) · (е) фронтовый фрагмент pre-commit хука получает норму «жалуйся владельцу» — решение владельца 21.08: ДА, исполняется первым касанием зоны (пинг в её журнале). · (ж) ПЕРЕЕЗД НА НОВУЮ МАШИНУ — стенд ПЕРЕСОБРАН 24.08 (№19), как поднимать — карта README.md, строки «Тулчейн» и counts.py. Ubuntu 26.04 WSL2, пользователь ubuntu-26; тулчейн стоял НУЛЕВОЙ. Поставлено: Go 1.26.7 · golangci-lint 2.12.2 · Node 22.23.2 — тарболами вендоров со сверкой sha256 в ~/.local/opt (симлинки в ~/.local/bin); PostgreSQL 18.4 — рецептом самой зоны (platform/docs/STACK_DECISIONS.md §«Postgres на стенде без root»); build-essential + python3-venv — руками владельца, они единственные требовали root. Обе батареи зелены под -race: бэкенд make battery EXIT=0, линтер 0 issues, скипы только корпус-гейченные и хелперы; платформа make check EXIT=0, 18 пакетов, линтер 0 issues, скипов 0. Фронт: npm ci + npm run check проходит целиком (335 тестов), vite build собирается. Сквозняк проверен ЖИВЬЁМ: демон платформы → сид через настоящий интейк → движок распарсил книгу (3 главы) → дев-прокси фронта достучался до платформы. ⚠ Что НЕ проверено: ни одного платного вызова · браузеров Playwright нет ⇒ check:full не гонялся · локальной модели и GPU на машине нет вовсе (слово владельца 24.08: мерить нечем, ветка не закрыта) · OIDC не поднимался, вход только дев-логином. ⚠ Правка .gitignore владельца несла дефект — правило books/ без якоря глушило ЛЮБОЙ каталог books, включая живой пакет platform/internal/books/ (новый файл там уходил бы в игнор молча); заякорено в /books/, проверено пробой в обе стороны. Новые строки бэклога — 217 (пути полигона), 218 (дефолты корпуса в движке — ЗАКРЫТА и снята 27.08, D39.159 эррата-д), 219 (line-якоря D-лога съехали — ⚠ ОБЪЯВЛЕНА 24.08, а В ТАБЛИЦЕ ЗАВЕДЕНА только 27.08: три дня очередь ссылалась на несуществующий носитель) Открытые обязательства, которых нет больше нигде: веса pro — строка 172-г НЕ закрыта, прогон мерил классификатор на flash; дешёвый вход — спросить полигон, говорят ли что-то данные фазы Д (там pro гоняется редактором), отдельный замер не покупать без этого · docs/experiments/00-provider-quirks.md несёт протухшие цены DeepSeek («не изменились, flash $0.14/$0.28») — зона полигона, чинить пингом · санкция на платный прогон в архивном промте пака честности была РАЗОВОЙ · норма плотности комментариев — ОТВЕЧЕНА владельцем 21.08: режем ВОДУ, а не длину — счёт строк «пиши одну-две» негодный гейт и снят; уходит пересказ решений, провенанс и изложение исследования вместо ссылки, остаётся всё, что из одной функции не выводится, сколько бы строк ни заняло (норма переписана — 12-go-style-notes §1; PD-255 платформы этим закрывается). ⚠ Метод-урок: её хендофф объявил «вопросов на владельце нет», а строка регистра просила именно решения — вопрос был закрыт ОБЪЯВЛЕНИЕМ, поймано ревьюером полноты выгрузки. Оркестраторов ДВА (решение владельца 07.08): этот — движок/платформа/фронт/доки; параллельный (РОЛЬЮ, без номера — счётчик один, D39.112 п.6) — приёмка полигона. Одновременно не запускаются; CURRENT-STATE ведут оба, чужие строки не трогают. Норма изоляции панелей — D39.113, гардрейлы в CLAUDE.md.)

  • СОСТОЯНИЕ ПРИЁМКИ P9 на 28.08 — дамп перед компакцией (D39.121). Дерево передано, лендинг НЕ сделан. Пройдено: адверсариальное ревью независимой сессией (26 находок) + воркфлоу-ревью самой сессии (16 линз, 2 прогона, Fable 5 на тяжёлых). Блокер полосы закрыт и пере-проверен пробой ревьюера на новом дереве (2/2 против 0/4). Блокер preview закрыт тремя пинами, включая живой против настоящего движка. Починены: обрыв валидации на потолке · ключи в композиционном корне · ложный клейм пина · пин кадра · два лгущих комментария. ЖДЁТ починки (заказано, не сделано): двойной замер 1 МиБ (json.Marshal экранирует HTML, 1 байт → 6) · мьютекс без контекста · Р1 окно bank_stopfinished_at · Р2 миграция для прогонов в полёте · Р3 draftWork=0 у continuation · Р5 presence-vs-null · Р4 limitedBuffer. Состав лендинга: дерево P9 + канонная половина прогресса (обязательна: канон openapi.yaml:1339 описывает посегментный прогресс, который пак снял) + закрытие PD-166 + PD-400.2 в accepted-risk + закрытие PD-401.
  • ИЗ ПОЛНОГО ЧТЕНИЯ БЭКЛОГА 28.08 — в ПЛАТФОРМЕННЫЙ пак, не в бэкендовый: строка 215 — движковый $0-точечный репин работает только под --resnapshot, а платформа флага НЕ передаёт; строка прямо говорит, что этот механизм и делает подпись термина дешёвой ⇒ правка термина может стоить полной пере-покупки волны вместо точечной пере-редактуры. Самое денежное из найденного за день. Строка 216 — подпись банка, halt на потолке и резюм после пополнения не проверялись против живого движка ни разу; живая проба P9 закрывает ЧАСТЬ, диспозировать при лендинге.
  • Бэкенд-промт BACKEND_SILENT_HARM_SESSION_PROMPT.md: второй рубеж ПРОТУХ. Опровержение (12 находок) делалось ДО четырёх добавлений — движковой идемпотентности (§3.3), четвёртой дыры (141), предупреждения о столкновении (201) и соседа (131). Механическая сверка против 12 блоков и фантом-гард пере-прогнаны и чисты; независимого опровержения текущей редакции НЕТ.
  • ОБЯЗАТЕЛЬСТВА ЛЕНДИНГА P9, часть 2 (28.08): перевести половину 2 строки PD-400 (внутрипроцессный мьютекс) в статус accepted-risk — граница v1 названа с условием («перестаёт держать в день второй реплики; лечение тогда арбитр в хранилище, не больший мьютекс») и ценой (ограничена убираемым шумом: холостая попытка у translate, «повтори позже» у глагола — ни ложного слова, ни денег); однорепличность — сегодняшний допуск всей зоны. Смена статуса — акт лендинга, строка сессией под это уже сформулирована. ⚠ Там же закрыть PD-401 — лечение в дереве и зелёное.
  • ОБЯЗАТЕЛЬСТВО ЛЕНДИНГА P9, записано 27.08, чтобы не потерялось второй раз: при взятии дерева закрыть PD-166 — её тело уже объявляет механизм НЕДОСТИЖИМЫМ (запись версии переехала из Begin в effect, одна транзакция с курсором; Begin — legacy), диспозиция «закрыть как построенное» написана, пин TestTheChunkerVersionOfTheStreamReachesTheBook (pgstore/sink_test.go:618) на месте, согласие получено ещё до рестарта — не исполнена только смена статуса. Проверка одной командой: awk -F'|' '/^\| PD-166 \|/ {print $7}' platform/docs/DEFECT_REGISTER.mdopen. Закрытие — акт лендинга, не работа пака (прецедент P6). ⚠ Сейчас регистр правит сессия P9 — параллельно не лезть.
  • 27.08: КОНТРАКТНЫЙ МИНОР 0.5.0 ПРИНЯТ И ЗАЛЕНДЖЕН (D39.161). Отменённая пер-термная модель снесена из канона и компаньона; дверь POST /books/{bookId}/bank/corrections ОБЪЯВЛЕНА и выведена из словаря bank-apply поле в поле; отказы разложены (409 = класс 14, 503 = класс 15 «слать тот же документ», 413 = 1 МиБ); признак «не построено» машиночитаем (bank_corrections_enabled, false ⇒ 404). Константа платформы поднята тем же коммитом — батарея зоны 18 пакетов, EXIT=0, линтер 0. Дверь ждёт МОНТАЖА паком (2в), туда же прогресс (200) и снятие двух полей с провода (PD-399). ⚠ Промт содержал ошибку оркестратора («поля навсегда нули»), исполнитель принёс её пингом — эррата 27.08-ж.
  • 27.08: ВЫДАН ПРОМТ КОНТРАКТНОГО МИНОРА (CONTRACT_MINOR_SESSION_PROMPT.md, пункт 2б очереди D39.156). ВОПРОС ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 27.08 (D39.160): сквозная полоса прогресса (строка 200) из минора ИСКЛЮЧЕНА и едет с паком (2в). Причина механическая: гейт платформы требует, чтобы объявленная деплоем версия равнялась канону, поэтому канон и деплой обязаны совпасть В МОМЕНТ ЛЕНДИНГА; снос двери этому не мешает (платформа свою половину снесла 22.08), а смена семантики прогресса мешает — сервер её не считает и не будет до пака (2в), и 0.5.0 у старого прогресса был бы ровно той ложью, против которой гейт стоит. Прежнее «одним куском» покупалось тем, что иначе фронт перегенерируется дважды, — но фронт ЗАМОРОЖЕН и перегенерируется один раз независимо от числа миноров. Промт ВЫДАН: прошёл оба рубежа роли, девять находок опровергателя применены.
  • 27.08: ПАК P8-REVIEW ПЛАТФОРМЫ ПРИНЯТ (D39.159). Четыре оси прочитаны исполнением, кода не тронуто; регистр 374→398 строк, открытых 72→96 (major 1→3). Ратифицированы норма копии-с-каноном, эррата §13 и токен ОСПОРЕНО(PD-N); статусы трёх спорных строк НЕ пере-открыты. Приёмка пере-мерила батарею на движке из HEAD — шов пережил лендинг бэкенда d1eb8a9 — и подтвердила PD-376 своей посадкой. Правка гейта формы регистра ОТКЛОНЕНА замером: краснила бы семь законных строк. Новая строка бэклога 225.
  • 27.08: ВХОДНАЯ ДВЕРЬ ШВА ЗАКОНЧЕНА И ЗАЛЕНДЖЕНА (D39.158). Четыре пака зоны бэкенда приняты одним деревом: $0-глагол приёма правок банка · стоп банка стал ФЛАЖКОМ в самом движке (память предъявленного, схема хранилища v16) · единая точка фиксации отчёта (шесть исходов, v2) · полоса отказов в два яруса с классом write_incomplete/exit 15 · пути решений только конвенцией. Порядок деплоя обязателен: движок первым → tmctl migrate по каждой книге до прогонов → и только потом платформа снимает свой обход (пинг в её журнале). Строки 211/212/213/218 закрыты, 191(б)/203(з) пере-диспозиционированы (устранено, не обойдено), заведены 221224. Онтология банка записана — architecture/18-bank-ontology.md.
  • Эра №15 закрыта — семь приёмок, все ПРИНЯТЫ и залендены; лента, коммиты и разборы — D39.109123 (D-лог) и реестр нот architecture/05-decisions-index.md; снимок прежних бюллетеней этой шапки — архив-слайс -08-02-04.
  • ЖИВОЕ: полигон — фаза Д ИДЁТ (заказ 10.08; деньги санкционированы 15.08 напрямую полигону — ⚠ числа потолка в носителях расходятся, фактическую цепь сверить при лендинге петель; ja-книга enkan_no_hate_ja; при ратификации фазы Д в D-ноту: декой-правило + обязательный кросс-семейный опровергатель приёмки — одобрены 10.08; свежие фриз-коммиты полигона в дереве — НЕ трогать) · платформа и контракт — статус в строке выше, здесь НЕ дублируется (один носитель на факт) · фронт ЗАМОРОЖЕН (D39.136 п.2 + D39.147: морозится ДАЛЬШЕ лендинга P7 — слово владельца 17.08; P7 зону НЕ размораживает, S5-промт не выдаётся, разморозка отдельным словом по достижении сквозного пути; перечень первого касания зоны — синк зеркала на ТЕКУЩИЙ канон (не на «0.3.0»: канон с тех пор ушёл на 0.4.0 и уйдёт дальше строкой 200; оба минора уедут в ОДНУ перегенерацию — D39.152 п.7) + перегенерация типов + моки + гейт утечки конвейера + ФС-1..12 + Ф-63/Ф-28 + фразы В-11 по словарю кодов — не отменён, ждёт разморозки) · закрытые стройки эры — лентой нот: эмиттер D39.131 · P5/P6 D39.130/132 · migrate D39.134 · S4+0.2.3 D39.135 · DeepSeek-репин D39.137 (тела — D-лог и слайсы).
  • Открыто на владельце: развязка git с origin (локальная линия ИСТИННА, force-push его рукой; не пуллить) · Приложение А контракта (148: фразы — по словарю кодов 0.3.0, структура готова) · продуктовое слово «остановлена: лимиты» (В-3) · В-4/Ф-30 (глава без заголовка — движковая половина строка 160) · мини-проба флора 44 (одобрена, промт не выдан; число — после ре-пробы 188) · подпись денежного шага 46 · лист В-3+К-6 · авто-резюм paused (вопрос платформы) · схема time-based DeepSeek (доклад — архив-слайс PROGRESS-2026-08-14-15; рекомендация: пик оставить + операционное правило «прогоны в долины», scheduler не начинать без ответа вендора об отметке тарификации) · вход ратификации фазы Д: посылка «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже, D39.137 п.4) · возражение Sol по проходу tier эксп-23 (⚠ расхождение носителей СНЯТО 22.08 срезкой: второй носитель — фраза «возражение снято, и владелец назвал причину» — уехал в слайс archive/PROGRESS-2026-08-10-15.md вместе с хроникой, и её довод там читается целиком: Sol судил СВОЁ семейство, что запрещено D13.3. Живым остаётся ровно этот пункт на владельце; подтвердить или снять — при лендинге петель фазы Д) · фронт-вопросы зонного журнала: В-7 (плотность; держит Ф-54) · В-8 (слово состояния в дереве) · В-9 (языки интерфейса — механизм готов, ПТ-36) · Ф-38 (вкладка «Замечания»). Закрытые пункты листа (PD-104 · В-10 · В-11-форма · Ф-56/57/61/62/63 · Ф-28 · ПТ-33-граница · 116 · 126 · 172-пин · PD-203 · санкции фазы Д · дизайн 160/161 · title) — в нотах D39.136145, здесь не держатся.
  • Сделано (сводно) — снимок ленты закрытых эр в archive/PROGRESS-2026-08-04-09.md; детали — D-лог и слайсы.
  • Курс: ОБЩНОСТЬ → КАЧЕСТВО БАНКА → ПАКЕТ-ЧЕКЕРОВ (D39.5978) → ФРОНТ-ЭРА (D39.81100: зоны живые, контракт API ратифицирован) → шов/платформа/движковые блокеры построены (D39.106123). Хвосты курса живут строками: 16 (полная цена холодного старта не измерена: у coldrun-a/coldrun-b нет НИ ОДНОГО редакторского вызова, хотя сама edit-волна отработала и оплачена — 58 вызовов волновым драйвером 2325.07 на малых прогонах, плюс 648 до драйвера; ⚠ прежняя редакция писала «не гонялась НИ РАЗУ» — абсолют ложен, испр. оркестратором №19 по леджерам ~/books/gu-zhenren/**/*.db; держит и оси голоса 13б/24) · 46 (дизайн заморожен D39.92/93, промт ждёт выдачи) · coldrun-b фаза C заморожена чекпойнтом легитимно (D39.86; эталон денег/поведения — coldrun-a, read-only); развилка 0731 решена и исполнена (D39.87/91, код 553f1a3).
  • Горизонт (D39.62/67, освежён D39.95): ДОБОР ИДЕАЛА (первым прогоном: оси голоса 24 · авто-режим · цена 16; жильцы ролей решаются ДО прогона эксп-22 — строка 149 · веса K1K12 13а · вне-претрейн чекпоинт 55; остаток арбитража банка = рецензент спорных кластеров при ре-пробе 74 — D39.102) → ВТОРАЯ ПАРА живьём (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; закон-блок ОБЯЗАТЕЛЕН — строка 134; glm-5 резерв; вахта маппинга эффорта pro — §Б-108) → судья gemini (Ф2, в движке НЕ построен — строка 33); канал B Mistral+grok; ~$0.85/ранобэ (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 в долине — замер по трём прогонам); ⚠ про эффорт pro НОСИТЕЛИ ПРОТИВОРЕЧАТ и это НЕ РЕШЕНО (испр. 23.08 №19: прежняя редакция утверждала здесь одну сторону — «эффорт стал настраиваемым low/high/max, квирк 3а устарел»): квирк-канон и STACK.md говорят «ручки у pro НЕТ», замера поведением после 13.08 нет ни у одной стороны, и по гардрейлу владельца такое закрывается ВЕНДОР-СВЕРКОЙ, а не выбором стороны; до неё в силе канон, разбор — STACK.md строка редактора; ⚠ ВЕСА pro сменились под тем же слагом (V4-Pro-0813, класс D39.61) — вахта-риг готов (остаток 172); ⚠ посылка интерим-редактора «dspro дешевле glm» в пике ПЕРЕВЁРНУТА (×1.26 дороже — вход ратификации фазы Д, D39.137 п.4); покупки фазы Д на deepseek до 16.08 16:00 UTC — по старым ценам. ⚠ ВЕСЬ банковый контур (банкнота+терминолог+классификатор) в shipping-c1 НЕ включён — жив ран-локальным конфигом книги (строка 140; сверка STACK.md 09.08 — факт шире прежней декларации «одна банкнота»); эскалация в shipping за budget_usd: 0 (STACK.md §примечания).
  • ЕДИНЫЙ БЭКЛОГ — секция «Бэклог» ниже (одна таблица, единственный трекер; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено; ведёт оркестратор). СЧЁТ ОЧЕРЕДИ на 27.08 (скриптом по таблице — python3 docs/scripts/counts.py; обновлять при каждом лендинге): всего 175 строк · зона бэкенд 82 строго / 120 широко (175 пере-скоуплена D39.134; 176/177 заведены 15.08; 178 — D39.136; 179 ЗАКРЫТА D39.138; 180/181 — D39.137; 182 — wire-батч, аудит 15.08; 183187 — контракт-ревью 28, D39.138; 188190 — аудит бэклога, D39.140; 191/192 — модель подписи банка и пост-ридинговый цикл, D39.144; 193 — молчащие дыры выдачи, D39.147; 194196 — приёмка пака честности, D39.149; 197 — фикс-лист ФЧ, D39.150; **198204 — приёмка P7 и слова владельца 20.08, D39.153; 205 — слепота гейта якорей, аудит 21.08; 206207 — приёмка P8-FIX, D39.154; 208209 — аудит доков 22.08 (потеря глоссария на Gemini, риг живых проб); 210 — трассировка цепи банка 22.08 (род не производится авто-путём); 211213 — консилиум шва 2223.08: ключи провайдеров не доезжают до движка на SaaS (блокер 202), нестрогий загрузчик сида, дубль конвенции пути у платформы — 211 ЗАКРЫТА и 213 сужена лендингом P9 (D39.162); 214216 — разбор журнала трассировки банка: подпись не оставляет следа, $0-репин недостижим с платформы, три несущих сценария не проверены живым движком; 217218, 220 — аудит переезда машины 24.08: абсолютные пути полигона, дефолты корпуса в движке, бутстрап гейта доков чужой замороженной зоной; 219 (съехавшие line-якоря D-лога) ЗАКРЫТА тем же заходом — D39.157 п.6) (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · блокеров очереди 0, платные прогоны разблокированы · «скоро» 48 (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строки эксп-22: 55·153 (плюс 150 — руки владельца); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
  • Архивы хроники: archive/PROGRESS-2026-07-04-10.md (D31) · -10-13 (D39.6-гигиена) · -13-25 (стройка паков 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).

Бэклог (ЕДИНЫЙ, собран 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) владелец когда-нибудь (после фазы 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а Веса рубрики K1K12 не выбраны (Q1: «по данным фазы B»; фаза B прошла на BWS без весов — выбор нужен к агрегатной приёмке качества книги) владелец когда-нибудь (к пилоту) Ф2.5 / отдельное решение D39.44 Q1, D39.46
13б speech-cue.txt zh НЕ шипить до замера голос-флаггера; замера НЕТ (D39.86): флаггер живёт на ФИНАЛЬНОЙ волне, редакторская волна не гонялась ⇒ оси не считались НИ РАЗУ. Гейт: первый прогон добора идеала С редакторской волной (строка 24) → решение владельца о шипе. ⚠ ФАКТ 22.08, делающий строку жёстче: флаггер выключен НЕ только тем, что волна не гонялась — gates.voice не встречается НИ В ОДНОМ шиппинг-конфиге (grep -c voice backend/configs/pipeline-c1.yaml = 0, то же в арм-конфигах), при том что сам гейт в схеме есть (internal/config/pipeline.go VoiceGate, пак-19/D39.55). То есть даже прогон С редактурой осей голоса НЕ посчитает, пока гейт не включён конфигом — отдельное касание, и его надо сделать ПЕРЕД покупкой прогона, иначе замер куплен впустую. ⚠ rules= в отчёте = «гейт СКОНФИГУРИРОВАН», не «отработал» — до фикса 105 читать по знаменателям replies=. Археология дословно — architecture/13-tech-debt-anchors.md §Б-13б. ⚠ ПОПРАВКА 23.08 (№19): блокер — ПУСТОЙ РЕЕСТР профилей, а не выключенный гейт: заполнить voices:/addresses: может только подпись владельца (internal/seed/seed.go:23=Voices and Addresses are the two D21 record types — «no miner emits them»), а при пустом реестре RunVoiceChecks выходит на !reg.HasData() ДО ВСЕХ осей, поэтому нулями отдаются и оси, и знаменатели — «ноль флагов» неотличим от «оси не считались». ⚠ Отдельно: gates.voice отсутствует в backend/configs/, НО в конфигах реальных прогонов (вне git) он ВКЛЮЧЁН — ~/books/gu-zhenren/coldrun-a/pipeline.yaml:68 и coldrun-b:71, enabled: true; дыра не «оператор забыл включить», а «шаблоны репозитория гейт не несут» владелец отложено-до-замера первый прогон добора идеала С РЕДАКТОРСКОЙ ВОЛНОЙ (оси голоса, строка 24) → отдельное решение D39.56, PACK19_BUILD §7.2, чат 31.07, D39.86
14 Четыре data-инженерных флага фазы-2 общности, каждый с рекомендованным дизайном (§5 отчёта): ё-фолд → target-данные (char_fold; смена сигнатуры core-примитива через вердикт-несущий банк, сдвиг memory_version) · segmentation-фолбэк громким (ломает контракт corridor-фолбэка pipeline.go:839-848 + голден-фикстура на нём; лечение — объявить блок в голден-yaml) · Fertility per-script map (калибровка ждёт боевого токенизатора) · source-encoding.txt + Go-реестр декодеров владелец когда-нибудь (следующий пак общности) отдельное решение D39.64, GENERALITY_PHASE2 §5.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 Полная цена холодного старта: edit-волна не гонялась НА НЁМ (Р7; на малых прогонах гонялась и оплачена); цена холодного старта измерена ДО редактуры (драфт+банкнота $0.0247/волна · терминолог $0.0060.013/проход). ⚠ Прогон НЕ НАЧАТ и закрыт владельцем как неуспешный на этом этапе (02.08, D39.90) — деньги фазы C не тронуты ($0). Свежие числа с пробы bank-low (10 глав, low на черновике И на бэнк-ролях): черновая волна 20/20 ok. ⚠ АРИФМЕТИКА ИСПРАВЛЕНА 23.08 (№19) по базе прогона ~/books/gu-zhenren/coldrun-b/reprobe/bank-low/guzhenren-bank-low.db, прежняя редакция не сходилась: вся ДРАФТ-стадия $0.031639 (из них flash $0.021289 + pro $0.010350 — прежняя редакция звала «$0.031639 flash» и потом ПРИБАВЛЯЛА pro вторым слагаемым, то есть считала его дважды) · терминолог $0.005750 · классификатор $0.007706 (было «$0.004286» — расходится с базой) · весь заход $0.045095, и теперь слагаемые дают именно его (прежние давали $0.052025). Редакторская волна на ЭТОМ прогоне не гонялась (coldrun-a/b: ноль редакторских вызовов) ⇒ строка жива, и она же держит оси голоса (13б/24) бэкенд когда-нибудь (первый прогон добора идеала — после решения по 46) добор идеала D39.58, D39.90
18 Эмиссия головы 蛊: сид-половина = чек-лист (определяющий терм книги сидится allow_short, D39.50); эмиссия-КАНАЛ демотирован до ИЗМЕР-ГЕЙТА (Q7): полигон-замер «меняет ли эмиссия головы рендер композитов» — строить ТОЛЬКО по эффекту и ПОСЛЕ #10 (однознаковый пост-чек чинится чекер-паком); перед стройкой резолвить K-гейт и KWIC-грязь одиночной головы полигон → бэкенд скоро (санкция Q7 D39.70 — после #10, очередью с ре-пробой) полигон-замер → решение D39.58, D39.60, D39.69
24 Остаток: авто-режим флага (проект Б не гонялся) · оси голоса AD (профили не подписаны; черновик готов — coldrun-a/SIGN-PACKAGE.md §3) ; + слот инъекции голоса и решение gates.voice при ненулевых осях (D39.55/D21 п.2) · слой-2 voice не строим до доказательства слоя-1 · сверить until_ch 白凝冰 при курации сида (D19.3в) бэкенд когда-нибудь (первый прогон добора идеала) добор идеала D39.40, D39.58
— ТЕКУЩАЯ ОЧЕРЕДЬ (D39.59) —
78 Леджер денег = НИЖНЯЯ граница: «2xx body decode failed (call IS billed)» — провайдер списал, исходная попытка в request_log НЕ попадает (≤$0.009/сессия); дизайн фикса ГОТОВ (GENERALITY_PHASE2 §5.6: BilledDecodeFails + per-billed-attempt settle с Estimated=true), но это money/ledger-путь — не $0-хастл. Живое число (D39.86): на ре-пробе 74 — 3 таких вызова на 14, неизвестность $0.015111 при леджере $0.114378 (13% захода); движок засеттлил оценку и честно напечатал estimated-cost rows: 3 ⇒ канал ВИДЕН, но decode_error при этом ещё и терминален (не retryable, не escalatable) — 3 из 7 терминальных флагов пробы A бэкенд когда-нибудь (money-паком) отдельное решение (дизайн §5.6) D39.61, D39.64, D39.86
79 Граница ПЛОТНОСТИ письма для серий: enabled через Go-константу cjkScriptNames — новый плотный скрипт требует правки Go (head-finality уже в данных script-series.txt; пре-существующая граница, D39.75). Первые два компонента строки (isCyrLetter→isTargetWordLetter · magnitude SourceScripts-гейт) исполнены пакетом-чекеров, D39.78 бэкенд когда-нибудь следующий пак общности / касание чекеров D39.64, D39.78
90 Ф2-кандидаты 02-mvp-плана без носителя (свип-хвост, D39.73): CometKiwi/T-index метрики судьи · Batch API судьи (экономия) · llama-server-интеграция локали · стриминг — взять/закрыть при пилот-препе; + H16 самоулучшение (V3-п.2, ПТ-26): дизайн петли по данным судьи — тем же препом полигон/бэкенд когда-нибудь (Ф2.5) пилот-преп-промт (с 85) 02-mvp-plan, D39.66, D39.73, D39.80
— НАХОДКИ СВИПА ПОЛНОТЫ (D39.66: 951 обязательство проверено, потери возвращены в трекер) —
80 Резюме-слой памяти — проза-суммарайзер ЗАКРЫТ (D39.69); строка = ГЕЙТ ПИЛОТА Ф2.5: первый деливерабл пилота — «допускает ли автономная нарратив-состояние-строка ДЕТЕРМИНИРОВАННЫЙ верификатор (source-anchored) — или это D1-компаундинг со схемой»; не-покрытые классы (source-anchored reveal · арк-колбэки без ключа) реальны, но не измерены как дефект Ф2.5 (Q3 подтверждён D39.70) когда-нибудь (пилот) Ф2.5 пре-рег D25 п.89, D39.66, D39.69
81 ja-преп B6-ja (сужено пост-сверкой D39.66): Поливанов-валидатор (translit_policy = «Phase 2»-заглушка, migrate.go:187/194) + kana-омограф POS/known-word гейтинг / B6-токенизатор (memory.go:1048); чек-лист 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) бэкенд когда-нибудь отдельное решение D39.37(6)
42 prompt_override — легальный обход гарантии слоя-2, сформулировать честно бэкенд когда-нибудь отдельное решение D39.37(7)
43 request_log без скоупа/ретеншена + first_flag_reason = третье представление истории попыток (корень — неразведённые скоупы) бэкенд когда-нибудь отдельное решение D39.37(9)
44 Флор — выбор числа ПОСЛЕ ре-пробы 74; модель «thinking в completion» ПОЛУЧЕНА замером (D39.86): рычаг против неограниченного думания = reasoning_effort, флор не рычаг. Мини-проба флора одобрена владельцем, промт не выдан; у dspro эффорт не настраивается (quirks 3а). Расхождение трекера с 74 снято D39.90. Археология дословно — architecture/13-tech-debt-anchors.md §Б-44. ⚠ Вводная сменилась 13.08 (вахта §Б-108 СРАБОТАЛА): вендор дал pro/flash настраиваемые уровни low/high/max — квирк 3а («у dspro эффорт не настраивается») устарел, пере-проба маппинга ПОВЕДЕНИЕМ + абсорбция в quirks — полигоном бэкенд когда-нибудь (триггер «приёмка 104» НАСТУПИЛ — D39.91, ручка заленжена; «сколько ставить» остаётся НЕзамеренным — нужен вариационный замер флора при low) отдельное решение D39.37(10), D39.86, D39.90, вендор 13.08
45 max_tokens-упоры (две единицы) — вернутся на en-книге ; halve-chunk-on-retry (research/22 §2 №7) ОТКЛОНЁН D39.74 — вернуться сюда же при живых упорах бэкенд когда-нибудь отдельное решение (с en) D39.37(11)
46 Экран целевого языка: «полный связный перевод на английский» проходит classify как ok — живой носитель класса (D39.86); дизайн пака ЗАМОРОЖЕН (D39.92 п.1 closed-set + D39.93: изолированный модуль, именованные причины), промт ждёт выдачи. Гейт-связка: мини-проба флора (44). Археология дословно (двусторонняя дыра оси цели · константы · мины реализации) — architecture/13-tech-debt-anchors.md §Б-46 владелец → бэкенд скоро (порядок §5.4: сначала 113, шаг 6 — под подпись) правка Go по плану §5.4 D39.39(д), D39.86, D39.90
47 M2-кэш / доктрина Д2 — кандидат на отдельную ратификацию оркестратор/бэкенд когда-нибудь отдельное решение D39.42
48 Направленная банкнота — вернуться по замеру покрытия терминолога бэкенд когда-нибудь отдельное решение D39.42
48а Серийный шаринг банка — РЕАЛИЗАЦИЯ (экспорт подписанного глоссария как сид-YAML следующей книги серии; спойлер-окна плющатся в since_ch=0); контракт round-trip держится тестом, самой фичи нет бэкенд когда-нибудь (перед второй книгой серии) отдельное решение D39.42 задел (а), PACK20_BANK_BUILD З-а
48б Импорт «оригинал + чужой перевод» как режим данных терминолога (target-агностичный вход есть контрактом; сам режим + провенанс источника + юр-сторона в юр-пакете) бэкенд/владелец когда-нибудь отдельное решение + Ф2.5 (юр) D39.42 задел (б), PACK20_BANK_BUILD З-б
130 emitRankCap × writeAutoBank — ОСТАТОК после фикс-пака (D39.118): $0-минимум ИСПОЛНЕН (дифф старого/нового авто-файла + WARN с именами выпавших; само-исключение сырого seed закрыто unsignedEngineSurfaces дофиксом приёмки); остаток = накопительный мердж авто-банка / освобождение слотов seed-rejects — СТОП-решение владельца (двигает банк → memory_version); материал для решения даст WARN со ВТОРОГО прогона (§6 п.8 отчёта пака) владелец → бэкенд когда-нибудь (гейт: WARN второго прогона) СТОП-решение D39.102 п.3, D39.118
131 Кап инъекции не считает маркер и гендер-ноты: glossaryLineTokens бюджетирует только «src → dst» (memory.go:512-515 против рендера :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
134 Дата-правка инжект-заголовков под доктрину D39.105 (единый закон-блок редактора вместо двухсекционки · оговорка ОБЛАСТИ употребления · снятие маркера ⟨проверить⟩ с провода; статусы строк и подписная таблица НЕ меняются): кандидат-тексты — §B промта пробы 18; ГЕЙТ ПАЛ (D39.108): текст = ОТПРАВЛЕННАЯ строка пробы 18 БЕЗ оговорки области (девиация №1; оговорка опровергнута §A.4 — НЕ вносить); двигает рендер → RequestHash → перекупка, цену назвать при внесении бэкенд скоро малое касание D39.104 п.2, D39.108
— ШОВ ДВИЖОК↔ПЛАТФОРМА: деньги и механизмы (D39.106/107 п.2) —
136 Write-ahead intent + состояние uncertain-эскроу + closing: холд НЕ освобождается по выходу юнита (сигнал обгоняет денежные события); spend не постится без свидетельства провайдера; расход сверх холда — полной суммой, превышение явной строкой убытка платформа/бэкенд скоро (промты по команде владельца) стройка по research/25 D39.106
137 Ночная сверка расходов с данными провайдера (в движок цены входят float64 по ручной таблице ledger/pricing.go — систематика процентная; сверка приоритетнее споров об округлении) платформа когда-нибудь (до первого платного пользователя) стройка по research/25 D39.106
— НАХОДКИ ПРИЁМКИ ЭКСПОВ 1820 (D39.108) —
140 Банковый контур в shipping-c1 НЕ включён — и это ШИРЕ прежней постановки про одну банкноту (сверка STACK.md, D39.126 п.2а): терминолог и классификатор тоже живут только ран-локальным конфигом книги (ратифицированный путь D39.42 п.4; coldrun 56/128; gates.terminology/gates.banknote в c1 = 0 вхождений); решить: включить в c1 (двигает промпт драфта → RequestHash — цену назвать) либо поправить декларацию; родня 36г владелец → бэкенд скоро СТОП-решение D39.108, exp20 §6, D39.126
141 Дыра детектора примечаний: сноска «[1] …» без слова-заголовка проходит мимо (sanitizer.go:273-278 требует «Примечание:/прим. перев.») — после StripCosmetic уезжает в экспорт с дырой на месте вырезанного ханьцзы бэкенд когда-нибудь малое касание + тест D39.108 (приёмка 20)
142 Механизм «гейты флагают → точечная починка по флагу» как прод-путь: exp20 §3.3 — $0.0002/дефект, 12/12 (при ИДЕАЛЬНОЙ детекции); механизм конкурентов (research/22:179), у нас петля пака-16 за enabled:false (строка 13); детекторы «выдуманное слово»/«инверсия» прототипированы эксп-21. ДИСПОЗИЦИЯ D39.117: ОТКЛОНЁН как замена редактора (C2/A_law 3.75 Holm 0.0006; «$0.0002 чинит всё» мерилось при идеальных флагах и при реальной детекции пало), ПРИНЯТ формой «механический ПРЕ-ГЕЙТ перед редактором» — брак 5 клеток против 10/23 при половинной цене ($0.00298/$0.00602); ремонт ТОЛЬКО с банком (без банка ломает канон 0.917→0.895) владелец → бэкенд скоро (форма решена D39.117; стройка — бэкенд-промтом по команде владельца) бэкенд-промт D39.108, D39.117
143 Абсорбция норматива судейства в 09-pilot-protocol.md: разброс инструмента ДО замера · объявленный порог различимости · MQM-lite/error-span первичен, pairwise только для стиля · декой обязателен · запрет судьи семейства жильца арма полигон/оркестратор скоро ($0) правка дока D39.108, exp20 §7
144 Вахта: grok reasoning_tokens ВНЕ completion_tokens — формула цены харнессов может недосчитывать (до $0.0325 на exp20); вендор-сверка биллинга xAI при следующем прогоне с grok полигон когда-нибудь (следующий xAI-прогон) вендор-чек D39.108 (приёмка)
146 Два техдолга движка без строки трекера (свип 08.08): prices_checked (120 д) гейтит read-only report и $0-resume — свежесть цен проверять только на ПЛАТНОМ пути (03-implementation-notes:244) · cache_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
149 Эксп-22 «панель жильцов»: профиль-скрин (pass/fail пороги ДО замера; урок эксп-21 — скрин, убивший 2 из 12, скрином не был) → панель черновиков (слот несёт ~70% эффекта финала, мерился ТОЛЬКО flash за всю историю) → панель редакторов поверх замороженных черновиков (обязательный кандидат gemini-3.1-pro — аутлаер-гипотеза эксп-04) + шумовой пол + прямой D_/A довесками; агент-судейство под капом ≤60; невиданный zh-срез — повторный жёсткий заказ полигон ИСПОЛНЕН и заленден 10.08 (приёмка №16; промт — archive/prompts/POLYGON_TENANT_PANEL_SESSION_PROMPT_2026-08-08.md); выводы заморожены до фазы Д — закрыть строку при ратификации прогон по промту → ратификация D39.117, приёмка №16
150 Sol-арбитраж — внешний контур вместо слепого чтения владельца: пере-суд расходящихся контрастов эксп-21 (A/F: luna +0.84 против gemini +3.03 — расхождение 14 sd шума судьи-замены) и слепых пар эксп-22 руками владельца через подписку (третье семейство, high reasoning); пакеты готовит эксп-22 Ф0.4 (слепые метки · оба порядка · декой), транскрипты персистятся как голоса внешнего судьи; luna-клетки Sol не судит (своё семейство) владелец + полигон скоро (пакет арбитража — из существующего сырья) эксп-22 Ф0.4 + руки владельца D39.117
151 Отказной режим связки: эхо-мина черновика воспроизводима на материале (глава 11 — 3/3 попыток; частота 31% на zh), связка покрыла 9/10 подряд идущих глав против 10/10 у однопроходки — единственный довод ПРОТИВ связки во всём эксп-21; движку нужен fallback при невозможности годного черновика (вариация ре-гена · эскалация модели черновика · деградация в однопроходку) владелец → бэкенд когда-нибудь (до МАСШТАБА) СТОП-решение D39.117, exp21 §14
152 Слипание абзацев — слепое пятно детерминированного контура: батарея на тех же текстах даёт ДРУГОЙ порядок армов (D — худший по судье — лучший по правилам), расхождение локализовано в слипании, которого не проверяет ни одно правило; правило в батарею полигона + кандидат в гейты движка бэкенд/полигон когда-нибудь малое касание + тест D39.117, exp21 §13
153 Чистый контраст мандата перевёрстки: D/D_ загрязнён (объём промта ×1.92 + вёрсточная строка + правило чэнъюй); уравненные промты и пере-гон ≈$0.35; по грязному контрасту мандат ВРЕДИТ по оси ФОРМА (1.09 из 3.31 D/A) полигон когда-нибудь (опция эксп-22 Ф3 — реши сессия) замер D39.117, exp21 §16.3
— ХВОСТЫ ФИКС-ПАКА БАНКА (D39.118) —
154 Одноруновая голова семьи (// едет в отдельном вызове от 12 своих поверхностей — якорь семьи обязан быть ≥2 рун) — включается ОДНОЙ строкой данных family_containment_runes han 1, Go не трогается; не включена: цена в размере юнитов не замерена бэкенд скоро (гейт: замер размеров юнитов на первом холодном прогоне, вместе со 157) строка данных по замеру 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 велик — ослабить гард до «родство по любому члену юнита» вместо «по корню серии» бэкенд скоро (гейт: первый холодный прогон, §6 отчёта) замер → решение 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: ставится ближайшим бэкенд-паком с мандатом максимального качества; тесты структуры глав — узлом будущего холодного прогона) пак 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 бэкенд + полигон когда-нибудь (после Этапа 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 Движковая поверхность оценки $/глава (ставка-константа платформы $0.03 из exp08 v2 — временная мера беты, П-10 зоны платформы; честная оценка по книге/паре — движковая) бэкенд когда-нибудь отдельный пак D39.123
167 Докс-пак по аудиту D39.125 — ЯДРО ИСПОЛНЕНО (D39.126): реестр всех нот architecture/05-decisions-index.md · counts.py --check полнота реестра + --lint якорей · разгрузка топ-10 строк · входы 15-money-path/16-events-emitter/STACK.md · К-статусы сведены · 09-target/product-requirements освежены. Остаток строки: статус-баннеры экспов + шапка эндпоинтов quirks (передано полигону промтом фазы Д, §Д8 п.12) (⚠ пункт «DEFECT_REGISTER секциями» СНЯТ 22.08 — исполнено зоной ещё в P5: файл секционирован по весу и по эрам, форма проверена аудитом доков) доки/полигон/платформа скоро (остаток — фаза Д полигона) пинги зонам D39.125, D39.126
168 Состав волн пайплайна = пар-конфиг (данные), не общий хардкод: вопрос владельца 10.08 «нормально ли под китайский строить весь бэкенд и конфиги?» — жильцы ролей и промпты уже конфиг/langpacks, но ТОПОЛОГИЯ волн (перепис · точечный edit-контур · без второго прохода) одна на всех пар; если фаза Д покажет разных победителей по парам (H-3/H-4: en-черновик+edit против zh-связки), состав волн уезжает в пар-конфиг данными; ревью-вопрос общности §0 12-go-style-notes.md бэкенд когда-нибудь (после данных фазы Д) замер (фаза Д) → решение владельца → малое касание слово владельца 10.08, промт фазы Д
169 Экспорт банка для чтения фронтом — ДВИЖКОВАЯ половина ПОСТРОЕНА, строка заводилась слепой к ней (испр. оркестратором 14.08): сайдкар <project_db>.bank.json — весь банк тремя статусами, стабильные id, атомарная запись — существует с D39.122 (internal/pipeline/bankexport.go; рядом bank-stop.json — полная таблица подписи для S5); прежний текст строки («артефакта экспорта нет») повторял жалобу Ф-43, снятую тем паком. ОСТАТОК: платформенная проекция сайдкаров в GET /books/{id}/bank + канал решений подписи — пак читающей поверхности платформы; без неё витрина банка фронта стоит на моке, подписной экран S5 строить не на чем ⚠ ПЛАТФОРМЕННАЯ ПОЛОВИНА: ЧТЕНИЕ ПОСТРОЕНО P7, ЗАПИСЬ СНЯТА 22.08 (D39.153, затем D39.154). Живо: проекция банка listBankTerms с агрегатами. ⚠ Приём решений submitBankDecisions удалён вместе со всей пер-термной моделью подписи (PD-370, ратификация D39.144) — прежняя редакция строки называла его существующим. Остаток строки стал ШИРЕ, а не уже: нет ни доставки решений до движка, ни самой ручки, куда их вводить; носитель — строка 199(а) плюс контрактная 206 платформа скоро (остаток = доставка, строка 199а) строка 199(а) Ф-43 фронта, D39.122, D39.127, испр. 14.08
170 tmctl init — движок сам заводит книгу (форма В развилки интейка): платформа зовёт $0-команду, движок пишет СВОЙ book.yaml — требования к полям живут там же, где проверяются (config/book.go); до неё бета живёт формой Б (рендер из деплой-шаблона платформой при создании книги, ратификация D39.130) бэкенд когда-нибудь (после беты формы Б) малый пак приёмка P5, D39.130
172 Остаток после пере-пина DeepSeek (пин ИСПОЛНЕН и ПРИНЯТ — D39.137, 76049bb): (а) схемное решение владельца по time-based — доклад §5 отчёта вендор-сессии (рекомендация: пик оставить; scheduler-вариант строки 60 не начинать до ответа вендора «по какой отметке времени тарифицируется вызов» — вендором НЕ задокументировано — и замера доли пика; дешёвый рычаг: операционное правило «прогоны не стартуют в 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, сам риг применяет её же. ⚠ Прежняя редакция строки требовала «внести порог ПЕРЕД прогоном вахты» и объявляла риг ложно-падающим — это протухло 17.08 и снято аудитом доков 22.08: работа уже сделана и предусловием платного прогона больше не является. ⚠ ИМЯ СТРОКИ ВВОДИТ В ЗАБЛУЖДЕНИЕ (испр. №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 §В.г) оркестратор → бэкенд скоро (собрать к ратификации фазы Д; вносить перед первым платным прогоном добора идеала) координационная строка → промт(ы) батча аудит 15.08, D39.134/136/137
171 Число символов книги — от движка (PD-177 платформы: character_count интейка точен только для UTF-8; GB18030/UTF-16 движок декодирует сам — цифра платформы на них неверна, для UTF-16 занижена ~вдвое): счёт символов в манифест (рядом source_bytes/encoding) либо перерасчёт платформой после разбора бэкенд когда-нибудь малое касание (манифест) П-13 платформы, PD-177, приёмка P5
173 backupStamp секундной точности: два translate в одну секунду дают коллизию имени бэкапа и exit 1, маскируя класс «проект занят» (12) — метка до наносекунд/uniquify либо распознавать коллизию явно; преexisting, вскрыт ревью эмиттер-пака бэкенд когда-нибудь малое касание приёмка D39.131
175 Деплой движка «в полёте» — ДАЛЬНИЙ ОСТАТОК (ближняя половина — типизированный version-mismatch у status + money-тест — ИСПОЛНЕНА паком 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.3.0 финален» ПРОТУХЛО — канон стоит на 0.4.0, ратифицирован D39.152 (испр. 20.08). Промт в архиве. ОСТАТОК-указатель: (а) P7 разблокированпрожито: P7 исполнен, принят и заленден 20.08 (D39.153), промт в архиве зоны; (б) зеркало frontend/docs/api-contract/ + типы + моки + гейт утечки — первое касание фронта при разморозке (расхождение канона и зеркала ВРЕМЕННО ратифицировано D39.142 п.5); (в) вопрос владельцу — BankTerm.decision — СНЯТ ОРКЕСТРАТОРОМ ещё 16.08 как стоящий на ложной посылке (D39.144 п.4), в остатке строки его быть не должно; прежний текст (D39.142 п.4, рекомендация заводить; при «да» — 4 строки схемы + 1 строка P7) оркестратор скоро (остаток = только (б) зеркало фронта при разморозке) P7 → фронт при разморозке D39.138, D39.142, D39.143
184 Жанр книги — ВЫКИНУТЬ (слово владельца 16.08). ⚠ ДВЕ ПОЛОВИНЫ ИЗ ЧЕТЫРЁХ УЖЕ ИСПОЛНЕНЫ (сверено кодом при аудите доков 22.08): поле ушло из контракта и из формы интейка батчем 0.3.0, и платформа жанра больше НЕ ЗНАЕТplatform/internal/books/render.go несёт genre шаблона нечитаемым насквозь и говорит об этом прямо. ЖИВЫМИ остаются две: (а) движковая — снять {{genre}} из промптов пары (сегодня он ещё в terminologist.md, editor-mono.md, translator-banknote.md) + поле из канона брифа: двигает BriefHash ⇒ ТОЛЬКО в общее resnapshot-окно, координировать со 161/182, дешёвое окно пока платная книга одна; (б) фронтовая — форма при разморозке; влияние жанр-строки на качество не измерено и уже не будет бэкенд (+платформа/контракт/фронт) скоро (движковая половина — resnapshot-окном) касание в окне 161/182 + батч 183 research/28 Б-23/§8 п.6, D39.138 п.2в
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_DIRECTION.md:202-205), семантика — в спеку батчем 183; транспорт НЕ менять (решение владельца по §5б) ⚠ ШАГИ 12 ПОСТРОЕНЫ И ЗАЛЕНДЕНЫ P7 (D39.153): gzip на JSON и НЕ на SSE + ETag/If-None-Match304 на коллекциях, карточке книги и /capabilities; валидатор считается от БАЙТ ответа, поэтому страница 2 и дельта той же ревизии различаются по построению. ⚠ ШАГИ 12 ПЕРЕ-ПРОВЕРЕНЫ ЗАМЕРОМ 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
191 Подпись банка = ОДИН ОК всему банку (модель владельца 16.08, D39.144) — пер-термный полный набор решений НЕ гейт нигде: (а) контракт поправлен (409-полноты снят с resume, pending_decisions информационный — исполнено D39.144); (б) движок: verify_bank-пауза снимается командой resume с решениями «как есть», нерешённое едет авто-строками с пометкой — авто-провод D39.42 п.3 УЖЕ так работает, проверить/ослабить только границу самой паузы; (в) платформа: канал решений P7 строится накопительным БЕЗ гейта полноты + проводка «resume = снятие стопа» до движка; (г) пост-ридинговый цикл правок — выселен строкой 192 (носитель думания) ⚠ ДИСПОЗИЦИЯ ЛЕНДИНГА P7 (D39.153): (в) проводка «resume = снятие стопа» до движка ИСПОЛНЕНА платформой (флаг --verify-bank на resume не передаётся, пин есть); (б) граница паузы движка СВЕРЕНА чтением его кода — зависания нет, движок уходит по авто-ветке при снятом флаге. ⚠ ОСТАТКА-РАТИФИКАЦИИ НЕТ — снято 22.08 сквозной трассировкой (разбор в 203(з)). Прежняя редакция объявляла остатком «движковую половину»: пер-термный гейт полноты жив и лишь обойдён, развилка «одно из двух уступает». Опровергнуто кодом: гейт проверяет полноту ФАЙЛА решений, а не подписей, и ОДИН файл со всем банком его снимает — конфликта с моделью владельца нет. Живой остаток другой и он не решение, а работа: снять обход в платформе, когда появится доставка (строка 199(а)), эррата к атрибуции — карта шапки D-лога, запись 20.08 ⚠ ПЕРЕ-ДИСПОЗИЦИЯ 27.08 (D39.158 п.1/п.7): движковая половина УСТРАНЕНА, не обойдена. Отложенная половина пункта (б) — «ослабить границу самой паузы» — исполнена: стоп срабатывает только на кластере, которого ни один прежний стоп не предъявлял (память bank_stop_presented, схема v16), возобновление БЕЗ решений продолжает прогон. Прежняя диспозиция «остатка-ратификации нет» верифицировала СОСТАВНОЕ поведение с обходом платформы и на вопрос «работает ли флажок без обхода» не отвечала. Остаток строки — снятие обхода в платформе (её пак), и он ТОЛЬКО после лендинга движка. бэкенд+платформа скоро (остаток — движковая половина, 203з; (б) сверка границы паузы движка — внутри P7 чтением кода, правка движка при расхождении = пинг №18) (б) малое касание движка · (в) внутри P7 слово владельца 16.08, D39.144, D39.42 п.3
192 Пост-ридинговый цикл правок банка — «наше подумать» владельца 16.08 (записано, чтобы не потерялось; точную механику «не продумал ещё никто и нигде» — его слово). UX-модель целиком: юзер нажал перевод → черновая волна + майнинг вместе → на фронте появляются ЧЕРНОВОЙ перевод и ЧЕРНОВОЙ банк · подписывается ВЕСЬ банк одним ОК (D39.144) → перевод уходит в доработку · дальше юзер ЧИТАЕТ, и его опции: поправить термин в банке ЛИБО добавить свой → кнопка «поправить» → пере-генерация, которая по ВХОЖДЕНИЯМ правит запрошенное. Открытые вопросы дизайна: что именно перегенерируется (вхождения ключа · затронутые юниты · со сметой и согласием?) · нужен ли движковый ТОЧЕЧНЫЙ РЕДАКТОР (полигон над этим работает — фаза Д) · форма в контракте (ручки нет) и на экране. Уже лежит под ногами: движковый re-edit по ключу банка со сметой и $0-пере-пином ПОСТРОЕН (строка 49: repin.go/rebill.go, D39.42 п.5/D39.45) · пометка неподписанных строк · дельта-чтение банка (0.3.0). НЕ проектировать до полигонных итогов; затем дизайн-пак на их результатах → слово владельца → стройка владелец+полигон → бэкенд/контракт/фронт когда-нибудь (триггер: итоги фазы Д по точечному редактору) дизайн-пак после полигона → слово владельца → стройка слово владельца 16.08, D39.144 п.1
193 Дыры выдачи МОЛЧАТ в самом тексте книги (инвентарь №18, всё грунтовано кодом): выпавший c-lite-член юнита исчезает из отгруженного текста БЕЗ маркера — читатель получает склейку без пропущенного куска и признака в тексте нет (internal/pipeline/export.go:211-223) · флагнутый юнит отдаётся пустым final_text (:324-329) · платформа поверх сознательно срезает flag_reason/detail до трёх значений (platform/internal/ingest/export.go:21-24) ⇒ на читательской поверхности дыра есть, а причины нет · и ни один гейт не отказывается выдать дырявую книгу: export возвращает успех даже при 100% pending (cmd/tmctl/render.go:474-475 — «export is an audit projection, not a run verdict»), лестницы run_complete/structurally_complete/publishable в коде 0 вхождений. Родня: 141 (сноска без слова-заголовка уезжает дырой) и «политика красных» строки 49 — брать ОДНИМ касанием с ассемблером, врозь не имеет смысла бэкенд (+платформа) скоро (вместе с 49) маркер дыры в тексте + причина на провод + отказ отдавать дырявое как готовое инвентарь №18, D39.147 п.2б
194 Деньги банковых ролей вне контура согласия (приёмка №18, клейм сессии подтверждён двумя линзами и признан ПРЕЕXISTING): UpsertChunkStatus зовётся только волновыми путями, а терминолог и классификатор чекпоинтятся под стадией terminology в главе 0 и строк chunk_status НЕ пишут ⇒ их деньги не входят НИ в число согласия, НИ в projected_book_usd, при этом на сдвиге снапшота они реально пере-покупаются. Дыра ровно того же класса, что чинила строка 181, и это вторая половина дыры Р6 (родня 160/185, 38). Паком не введено и в его заказ не входило бэкенд скоро (следующее касание денежного пути) расширение проекции на банковые роли + тест приёмка №18, отчёт сессии 17.08
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 (D39.149; тело — archive/PROGRESS-2026-08-17.md, запись приёмки №18): три НЕПРИБИТЫЕ гарантии (снятие фильтра по книге в CheckpointUsageForBook не валит ни один тест — воспроизведено оркестратором · ключ ячейки без chunk_idx съедает деньги соседнего чанка · ветка «строка не пере-оценена» не ловится на продовом пути) · два докстринга reprice.go описывают НЕ то, что делает код · 187 исполнен наполовину (тот же снятый закон в докстринге теста и backend/docs/D15.2-*.md:317) · HistoricalRows не доезжает до status/--json, второй операторский текст (--accept-rebill) без basis · ФЧ-5 РЕШЁН владельцем 17.08 (D39.150): прайсить по модели, которую стадия резолвит СЕЙЧАС, + округление вверх и оговорка в тексте согласия · Status() жёстко падает при ошибке репрайсера против соседней политики деградации · паника поверх ceiling-стопа даёт failed вместо paused (PD-113) · три стейл-докстринга. Носителя-сессии НЕТ — по слову владельца 17.08 пока только записано бэкенд скоро (следующее касание денежного пути; ФЧ-5 обязателен до первого пере-прогона со сменой модели) дофикс-промт ЛИБО попутно ближайшим паком 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)
199 Канал доставки правок банка в движок НЕ построен — цепь «поправить/добавить термин → перегенерация» рвётся на шве платформа→движок (расследование 20.08 по слову владельца; грепы пере-проверены оркестратором). ⚠ ВЕРХНЕГО КРАЯ У ЦЕПИ БОЛЬШЕ НЕТ (испр. 22.08 при лендинге P8-FIX, D39.154). Прежняя редакция строки опиралась на ручку submitBankDecisions с полем dst, куда пользователь мог впечатать исправленный перевод, — она СНЯТА вместе со всей пер-термной моделью подписи (PD-370, ратификация D39.144). То есть сегодня разорван не один конец, а оба: снизу движок умеет точечную ре-редактуру по вхождениям за $0 на незатронутых юнитах со сметой и порогом согласия (stagerun.go:88-107, repin.go/rebill.go), а сверху ручки «поправить/добавить термин» нет НИ В ЗОНЕ, НИ В КАНОНЕ — на 17 путей канона запись в банк была ровно одна, и она ушла. Это ужесточает строку, а не смягчает: раньше не хватало трубы посередине, теперь не хватает ещё и входа. ⚠ И третья половина, вскрытая сквозной трассировкой 22.08 — «снизу движок готов» верно ЛИШЬ НАПОЛОВИНУ, сверено кодом: (а) правка существующего термина доедет до РЕДАКТОРА, но не до ЧЕРНОВИКА — loadMinedDelta принудительно ставит Source:"mined" (backend/internal/pipeline/mining.go), а базовый банк черновой волны mined-строки ИСКЛЮЧАЕТ (seeding.go:143-153, if row.Source == "mined" { continue }). Чтобы правка формировала сам черновик, она должна ехать через glossary_seed, а это сдвиг БАЗОВОГО снапшота ⇒ пере-оплата всей черновой волны. То есть «дёшево» работает только для редакторского слоя; (б) вход в пере-генерацию после прочтения закрыт двумя флагами, которых платформа не передаёт: --resnapshot и --accept-rebill сверх порога. platform/internal/runner/engine.go TranslateArgs собирает РОВНО translate --config <...> [--verify-bank] [ceiling] и больше ничего; (в) команды, превращающей карту подписи в подписанный mined_delta, у движка НЕТ — в tmctl девять подкоманд, среди них ни sign, ни promote, а банк-экспорт объявлен «проекция, никогда не источник». Писателя файла надо НАЗВАТЬ, и это ровно развилка (а) выше. ⚠⚠ И ТРИ МИНЫ В САМОМ ФОРМАТЕ ФАЙЛА, которые обязана знать сессия, которая его напишет (сверено кодом 22.08): (1) копи-паст карты подписи НЕ РАБОТАЕТ. Карта пишется вся со Status: "auto" (internal/miner/miner_emit.go, док прямо: «Every term stays status:auto — that is the load-bearing line», и это запинено). А unsignedEngineSurfaces выбрасывает Source=="mined" && Status!="approved" (mining.go:710-719) ⇒ механически скопированные строки отфильтруются как неподписанные и стоп НЕ снимется — бесконечная петля. Писать надо ЯВНЫЙ status: approved. ⚠ Тонкость в другую сторону: ОПУЩЕННЫЙ статус в сид-загрузчике дефолтится в approved (membank/memseed.go:96=status = "approved"), то есть файл БЕЗ поля статуса работает, а файл со скопированным auto — нет. (2) терм БЕЗ dst промотить нельзя вообще: approved/draft с пустым dst — ПАДЕНИЕ загрузки сида, то есть срыв всего прогона (memseed.go:83-86). А dst есть не у всех — часть термов WHICH-only (mining.go считает withDst именно поэтому). Для них единственный очищающий глагол — ОТКАЗ (mined_rejects, берёт только src). (3) хвост реверс-секции ломает «один ОК» на больших книгах: reverseSectionTerms режет кап 200 ПОСЛЕ фильтров, и движок сам предупреждает — «the tail is NOT in this signature map and re-proposes on the next run». При >200 banknote-only поверхностей подпись всей карты стоп НЕ снимет: приедет свежая двухсотка, и актов подписи понадобится ceil(N/200). Носителя между ними нет: колонки action/dst не читает НИ ОДИН SELECT (единственная выборка readmodel.go:336 проверяет лишь факт наличия строки) · mined_delta ⚠ **СУЖЕНА 27.08 приёмкой (D39.159, свип по норме §3 п.8): движковая половина ЦЕПИ ПОСТРОЕНА.** tmctl bank-applyзалендженd1eb8a9` и ратифицирован D39.158 — писатель файлов решений существует, правку термина есть куда положить. Открытым остаётся ровно ПЛАТФОРМЕННЫЙ конец: воркер, который дёргает глагол перед возобновлением (пункт (2в) очереди). Формулировка «канал НЕ построен» с этого дня неверна и отправляла бы следующий пак строить построенное mined_rejects по Go платформы = **0** вхождений · воркер, который должен переносить решения в эти файлы перед resume, описан в комментарии её же миграции (00002_readmodel.sql:172-174) и НЕ построен. **Делится надвое:** (а) **труба** — платформа пишет решения в два файла, которые движок читает. ⚠ **«Контракт файлов существует, проектировать нечего» — ОПРОВЕРГНУТО КОДОМ 21.08** (опровергатель промта, пере-проверено оркестратором построчно): движок читает mined_delta/mined_rejects, ⚠ **прежняя формулировка «ТОЛЬКО если их путь объявлен в book.yaml» УСТАРЕЛА и снята 28.08:** гард if r.Book.MinedDelta == ""снесён лендингомd1eb8a9— пути стали КОНВЕНЦИОННЫМИ (D39.158), и объявлять их вbook.yaml больше не требуется (backend/internal/pipeline/mining.go:822), а объявленный ключ с НЕсуществующим файлом валит загрузку конфига целиком (backend/internal/config/book.go:254=is not readable). Ключей нет ни в шаблоне оператора, ни в дев-стенде (backend/example/book.yaml— ноль вхождений), и добавить их платформа не может молча: она пишетbook.yamlОДИН раз подO_EXCL и «никогда не перезаписывает» (platform/internal/books/render.go:106-109=writes the file once and never again), а схему движка знать не должна — это ратифицированная форма Б (D39.110 §2б). **Значит развилка есть и она упирается в ратифицированную границу владения book.yaml:** объявляет ли ключи платформа при рождении книги (и создаёт ли два пустых файла сразу, иначе движок не стартует) · несёт ли их шаблон оператора · двигается ли граница владения. Решать её — ратификацией, не паком. Закрывает и честность decline(PD-277 — его текст сегодня относит работу к отложенной 192, пере-диспозиция нужна тем же решением); (б) **отложенное владельцем** — правки ПОСЛЕ прочтения уже переведённой книги: там правка банка двигает снапшот, движок падает громко без явного согласия на пере-оплату, аresnapshot accept-rebillпо Go платформы = 0 ⇒ прогон не перегенерирует, а УПАДЁТ (сегодня не кусает только потому, что до движка не доезжает ничего). Половина (б) — территория строки **192**. ⚠ **ПОПРАВКИ 23.08 (№19, консилиум шва):** (1) формулировка «ни на одном конце» СНЯТА — принимающий конец ДВИЖКА построен (там же,pipeline/mining.go:784; гард снят тем же лендингом), не построен ПЛАТФОРМЕННЫЙ путь целиком; (2) тело развилки с четырьмя вариантами и ценой лежит ТОЛЬКО в platform/docs/archive/platform-PROGRESS-P8.md:176-205=Двигается ратифицированная граница владения; (3) есть СЕДЬМОЙ вариант, которым развилка не решается, а РАСТВОРЯЕТСЯ: движок дефолтит mined_delta/mined_rejectsпо конвенции каталога (как уже делает сproject_dbconfig/book.go:189=b.ProjectDB = filepath.Join(dir, b.BookID+".db")— и как уже читает.auto-bank.yaml, mining.go:644), писателем становится движковый $0-глагол ⇒ ключей никто не объявляет, файлов заранее никто не создаёт; (4) зона дополнена ВЛАДЕЛЬЦЕМ: канон зовёт половину (а) блокером на нём; (5) ⚠ **ГРАНИЦА, которую труба НЕ снимает и которая до 23.08 жила только внутри чужого списка ошибок:** правка, доставленная через mined_delta, доезжает до РЕДАКТОРСКОЙ волны, но НЕ формирует черновик — черновая волна выбирает по банку БЕЗ mined-строк (backend/internal/pipeline/seeding.go:140=The DRAFT wave selects over a BASE-scoped bank). Для читателя это не дефект: отгружается выход редактора, а юниты с термином пере-редактируются, незатронутые пере-пиниваются за $0 (backend/internal/pipeline/stagerun.go:88-107=POINTWISE RE-EDIT). Настоящая цена тоньше и НЕ ИЗМЕРЕНА: редактор латает черновик, построенный вокруг старого термина (согласование, род, игра слов). Правка, формирующая сам черновик, — это glossary_seed`, то есть сдвиг базового снапшота с пере-оплатой; территория строки 192, глубину решает владелец ПОСЛЕ фазы Д владелец + платформа + бэкенд (а) РАСТВОРЕНА D39.156 · (б) гейчена 192
201 Движковое «Глава N» доезжает читателю ВНУТРИ текста, обходя дисциплину heading: null (линза шва P7, пере-прочитано оркестратором): backend/internal/pipeline/export.go:230 приклеивает детерминированный порядковый к экспортному тексту первой юнит-главы (ce.FinalText = chunk.ApplyHeading(...)), колонка Source при этом остаётся heading-stripped. Платформа переносит обе как есть и честно отдаёт heading: null — то есть клиент нарисует СВОЙ порядковый на языке своего интерфейса над абзацем, который уже начинается с русского «Глава N», а исходная колонка соответствующего маркера не несёт: пара визуально рассинхронизирована на каждой первой главе. Конкретное следствие открытого К-2 контракта; родня движковой строки 160 (глава без заголовка) бэкенд когда-нибудь (с 160) отдельное решение приёмка P7 (D39.153)
202 Живой перевод книги НАСКВОЗЬ через API платформы не гонялся НИ РАЗУ (obstacle сессии P7, подтверждён приёмкой): всё после «прогон стартовал и остановился» — подпись банка, halt на потолке, резюм после пополнения — покрыто батареей против живого Postgres, но с движком-заглушкой; настоящий манифест, сайдкар банка и причины флагов будут ПЕРВЫМИ данными, форму которых платформа не сочинила сама. Форма проверки (решена): только через API, как ходил бы клиент — интейк → старт → живой движок с ключами провайдера → поток событий → подпись и продолжение → чтение глав/юнитов/замечаний/банка и сверка с тем, что движок реально произвёл; качество перевода НЕ предмет (полигон). Цена ≈ $0.05 на десятиглавую книгу. Решение владельца 20.08: ПОСЛЕ холодного прогона движка — гонять одну неготовую систему против другой смысла нет платформа скоро (гейт: холодный прогон движка) короткая сессия по промту оркестратора слово владельца 20.08, D39.153
203 Хвосты контракта после синка 0.4.0 — ОТКРЫТА ЧЕТВЕРТЬ, остальное исполнено (тела релеев — platform/docs/archive/P7_ACCEPTANCE_HANDOFF_2026-08-17.md §7; сюда переписаны НЕ тела, а статус — один носитель на факт). ⚠ Сверено грепом при лендинге, потому что первая редакция этой строки уже разошлась с деревом: (б) ИСПОЛНЕН — срезанная фраза компаньона §2.14 стоит на месте (14-api-contract/README.md:548=различать причины отказа клиент не может по замыслу) · (д) ИСПОЛНЕН — клетка приложения А заполнена unspecified (README.md:1376 — ⚠ первая редакция писала :1391, это строка ДРУГОГО приложения; испр. 20.08) · (г) наполовинуunspecified ратифицирован в каноне (openapi.yaml:1784-1787), открыта только ГРАНИЦА ступеней замечаний (две ступени при девяти рангах движка) → это строка 148 · (и) закрыт полем stop_requested (D39.152) · (л)(м)(н)(о) закрыты контрактной сессией. ОТКРЫТО РЕАЛЬНО:(а) ИСПОЛНЕН 27.08 минором 0.5.0 (D39.161) — канон получил предупреждение о конверте вне /v0; открытым по строке остаётся (к). Прежний текст пункта: (а) канон-половина про /auth — компаньон поверхность описывает (§2.14), а канон говорит только «Signing in is not part of this surface» (openapi.yaml:35-36) и НЕ предупреждает, что конверт вне /v0 может прийти БЕЗ обязательного code; сгенерированный по канону клиент об это спотыкается · (з) ⚠ СНЯТО КАК РАТИФИКАЦИЯ 22.08 — конфликта моделей НЕТ, я нёс причину и следствие наоборот. Прежняя редакция писала: «D39.144 ратифицировал подпись = ОДИН акт, движок держит пер-термный гейт полноты, одно из двух должно уступить». Сквозная трассировка это опровергла КОДОМ: гейт проверяет полноту не ПОДПИСЕЙ, а ФАЙЛА решений, и ОДИН акт его снимает — loadMinedDelta штампует только Source, статус не трогает (mining.go:855-867) → опущенный статус дефолтится в approved (membank/memseed.go:96=status = "approved") → unsignedEngineSurfaces выбрасывает лишь Source=="mined" && Status!="approved" (mining.go:710-719) ⇒ промоутнутые строки остаются сид-поверхностями, дельта пустеет, стоп снимается. Шапка файла говорит это прямым текстом. Один файл со всем банком = один ОК. Обход в платформе (--verify-bank не передаётся на resume) — костыль под ОТСУТСТВУЮЩУЮ ДОСТАВКУ, а не под расхождение моделей: как только доставка появится, флаг можно просто оставить включённым. Настоящий и единственный блокер темы — владение book.yaml, строка 199(а). Ратификации здесь НЕ нужно; остаётся снять обход одной боевой строкой (platform/internal/runs/spawn.go) и семью строками ставшего ложным обоснования — работа платформенного пака, не решение владельца · (к) ключ project_db в book.yaml: договорить, кто им владеет — шаблон оператора его не содержит, движок делает необязательным. ⚠ Следствие «на штатном деплое банк не читается» ОПРОВЕРГНУТО живым кодом (проверено при лендинге): ⚠ носитель довода СМЕНИЛСЯ лендингом P9 (D39.162): опровержение опиралось на фолбэк <book_id>.db, который платформа вычисляла сама, а он СНЕСЁН вместе с дублем конвенции (строка 213). Сегодня путь публикует ДВИЖОК конвертом артефактов, и пустой путь — ГРОМКИЙ отказ (platform/internal/runner/artifacts.go:39=the engine published no bank read-out path), то есть банк либо читается, либо деплой говорит об этом вслух; первая редакция этой строки повторила клейм хендоффа зоны, не сверив с деревом — остаток чисто договорной · (л) остаток закрытой строки 148 — Приложение А компаньона. ⚠ Сама 148 СНЯТА 21.08 по слову владельца: она держала мир, которого больше нет — «карта потеряна инцидентом 08.08, реконструкция у оркестратора №15, решить, брать ли черновиком». Реконструкция брать нечего: прежняя карта вела «причина движка → ФРАЗА», то есть предполагала, что фразу рисует СЕРВЕР, а батч 0.3.0 эту политику ОТМЕНИЛ — Note несёт машинный code, фразу рисует клиент, Note.message с провода снят (14-api-contract/README.md:1564=Карта «причина → КОД контракта). Реально пуста другая клетка: соответствие причин движка кодам замечаний, и правила её заполнения в компаньоне уже написаны (фраза по ДОККОММЕНТУ disposition.go, а не по имени константы — инверсия уже стоила двух фраз; класс 2 схлопывается в ОДИН код). Исполнитель — контрактная сессия, не оркестратор ⚠ ПЕРЕ-ДИСПОЗИЦИЯ 27.08 (D39.158 п.7): хвост (з) закрыт — «ратификации не нужно» отвечало на вопрос про один файл решений, не про флажок; движковый гейт полноты снят, не обойдён. контракт/доки скоро (следующее касание контракта, вместе с 200) контрактная сессия приёмка P7 (D39.153)
204 Движок не публикует причины флагов ДАННЫМИ — карта причин у платформы рукописная и расходится молча (релей §7(в) хендоффа P7; зона платформы в чужой бэклог не пишет и просила строку сюда — platform/docs/archive/platform-PROGRESS-P7.md:206). Сегодня platform/internal/ingest/notes.go держит рукописную копию закрытого словаря ЧУЖОЙ зоны: 15 причин движка → коды замечаний контракта, сверено побайтно на 20.08 и верно СЕЙЧАС. Импортировать движок платформе нельзя (D39.85 — разные модули), поэтому расхождение появится молча в тот день, когда движок добавит причину: платформа отдаст unspecified и напишет ERROR в лог, то есть деградация честная, но карта протухнет незаметно. Лечение: движок публикует свой словарь причин артефактом-данными (тем же классом, что манифест и сайдкары банка), платформа читает его вместо копии. ⚠ Носителем был ТОЛЬКО регистр платформы (PD-246) — то есть обязательство к зоне движка жило внутри зоны автора; поймано ревьюером полноты выгрузки при лендинге бэкенд когда-нибудь (со следующим касанием эмиссии флагов) отдельное решение приёмка P7 (D39.153), релей §7(в)
205 Гейт якорей: ИСПОЛНЕН 21.08 — сверка по содержимому, двусторонняя дельта, объявленная слепота. Был: проверял только существование файла и переполнение номера, поэтому дал ЗЕЛЁНЫЙ на четыре якоря, сломанных архивацией — а оркестратор на эту зелень опёрся вместо ручной сверки. Стало (docs/scripts/counts.py): якорь может нести ОПТ-ИН токен ожидания `путь:12-14`=`подстрока`, и такой якорь сверяется по содержимому; область расширена с docs/ на platform/docs и frontend/docs (98 доков); из хука убран быстрый выход по «коммит не трогает docs/» — он ампутировал ЦЕЛЕВУЮ сторону, а цели у нас в основном КОД, то есть главный двигатель протухания приезжал ровно тем коммитом, на котором хук молчал (проверено ТЕСТ-КОММИТОМ, не ручным прогоном — норма D39.148). ⚠ Разбор с внешним ревьюером снял три моих ошибки дизайна: (1) у дельты ДВЕ роли, и путать их нельзя — ТРЕБОВАТЬ токен можно только на затронутых строках (иначе долг блокирует всех), а ПРОВЕРЯТЬ уже написанные токены дельта ограничивать не должна вовсе: токен был истинным при записи, значит упавший — гниль по построению; corpus-wide проверка схлопывает «пропущенное окно» (коммит без хука, --no-verify, свежий клон, проигнорированный warn) из «навсегда» в «до следующего прогона»; (2) окно диапазона 80-82,243 считалось как min..max — 164 строки, и токен, случайно живущий внутри, красил зелёным; теперь ОБЪЕДИНЕНИЕ отрезков; (3) литеральная сверка токена была машиной ложных тревог — фраза, разорванная переносом строки в цели, непроверяема в принципе, а будущая пере-вёрстка абзаца кричала бы «цель уехала» на невиновного; теперь ПРОБЕЛЬНАЯ нормализация (детерминированная и симметричная), разметка остаётся литеральной. ⚠ Мой довод «неудобство и есть механизм» был неверен: мой собственный случай был FALSE POSITIVE самого гейта — токен был истинным, цель не двигалась. ОБЪЯВЛЕННАЯ СЛЕПОТА (печатается гейтом каждый прогон): якорь БЕЗ токена — только существование и длина · подмена цели файлом с тем же путём ловится только токеном · цели читаются из ДЕРЕВА, поэтому чужой незакоммиченный WIP может транзиентно и уронить токен, и спасти · токен доказывает ссылочную свежесть, НЕ истинность фразы дока о цели · в ручном прогоне «дельта» = всё незакоммиченное кем угодно, поэтому ТРЕБОВАНИЕ токена живёт только под --from-index. ОСТАТОК: миграция корпуса на токен-форму органическая — токен требуется на ЗАТРОНУТЫХ строках, поэтому счёт растёт сам с каждым касанием. Числа здесь НЕ держим (первая редакция держала «4 из ~580» и протухла за сутки): текущий счёт токенов, якорей и доков гейт печатает КАЖДЫЙ прогон — python3 docs/scripts/counts.py --lint оркестратор/доки сделано 21.08, миграция органическая исполнено; остаток гасится касаниями аудит работы №18 + разбор с внешним ревьюером, 21.08
207 Пол самосогласованности манифеста стоит только у материализатора, интейк тот же документ ПРИНИМАЕТ — и по такой книге можно ОПЛАТИТЬ прогон (PD-367, вторая волна ревью P8-FIX). Манифест {ChaptersTotal: 120, UnitsTotal: 400} с пустым списком глав Whole() отвергает, а books.Parse заводит книгу not_started с chapter_count=120 и пустым деревом; потолок считается ОТ chapter_count. Очевидное лекарство опровергнуто исполнением самой зоной: применить Whole() на интейке нельзя — вся батарея интейка ездит на манифестах без списка глав, контракт интейка это только счётчики. Значит решение не зонное: либо контракт интейка меняется, либо пол ставится в другом месте цепи оркестратор → платформа скоро нужно решение (лекарство ломает запиненный контракт интейка) D39.154 п.10, PD-367
208 Эскалационный хоп на Gemini ТИХО ТЕРЯЕТ инъекцию банка памяти — книга едет без канона имён (живая проба полигона 22.08, подтверждена вендор-докой и пере-проверена оркестратором по коду). OpenAI-совместимый слой Gemini принимает РОВНО ОДНО системное сообщение, лишние выбрасывает МОЛЧА — без ошибки, при finish=stop и внешне правильном переводе. Замер полигона на одном и том же системном тексте 7970 знаков: одним сообщением → prompt_tokens 2994 и маркерная инструкция ИСПОЛНЕНА, двумя → 535 токенов и инструкция НЕ исполнена. Механизм вендорский, поэтому уход на нативный API НЕ лечит: systemInstruction там — один объект Content. Наша сторона: backend/internal/pipeline/render.go штатно строит ВТОРОЕ системное сообщение (инъекция глоссария/STM), backend/internal/llm/httpllm.go toOpenAIMessages копирует сообщения дословно, склейки под Gemini нет нигде — а gemini-3.1-pro-preview стоит в ратифицированной цепочке эскалации ВО ВСЕХ четырёх арм-конфигах. ⇒ любой хоп на Gemini при непустой инъекции теряет глоссарий, и это невидимо гейтам годности. ⚠ Класс в проекте УЖЕ решён рядом и не обобщён: provider_anthropic.go сворачивает ведущий system-префикс в одно поле и падает громко на system посреди диалога. Оговорка D22.3 «экспозиция Ф1 нулевая» держится на МАРШРУТЕ (до Gemini в дефолте не доходят), а не на коде — то есть на одном включённом budget_usd от дефекта в проде. Полигон у себя починил склейкой по вендору (eval/dovodka/rol.py), в движок не лез; квирк записан в 00-provider-quirks.md бэкенд скоро (до первого платного прогона с ненулевым budget_usd эскалации) склейка системных сообщений для Gemini в транспорте + пин пинг полигона №19 (22.08), вендор-дока ai.google.dev/api/generate-content
209 Риг живых проб не может залогировать тела запросов ни при каких env (находка бэкенд-пака честности 17.08, оставшаяся без носителя до аудита доков 22.08): LOG_LLM_BODIES=1+LOG_LEVEL=debug объявлены носителем тел, но ключ читается из obs.ReqInfo контекста, а live_reprobe_test.go строит ctx БЕЗ WithReqInfo — гейт obs/logging.go не пропускает. Обход, которым пользовались: ручной дамп сообщений в файл. Цена — каждая живая проба, которой нужно прочитать провод глазами, платит за обход заново бэкенд когда-нибудь (следующее касание рига живых проб) малое касание (WithReqInfo в риге) + пин пак честности 17.08, вынесено аудитом доков 22.08
210 Род НЕ ПРОИЗВОДИТСЯ авто-путём вовсе — механизм доставки построен, а данных для него нет (найдено трассировкой цепи банка 22.08, сверено кодом оркестратором; полигон вскрыл то же независимо: «в банке НЕТ ПОЛЕЙ ПОЛА»). Доставка рода на провод ПОСТРОЕНА и работает: membank/memory.go кладёт genderConstraintNote в черновую инъекцию — но ТОЛЬКО для строк со статусом Confirmed, по прямой директиве владельца D39.21 «род должен доезжать». Данных ей никто не даёт: промпт терминолога возвращает РОВНО ТРИ поля (backend/prompts/zh-ru/terminologist.md: термин · перевод · уверенность 0100) — поля рода в ответе НЕТ; майнер берёт gender исключительно из СИДА (internal/miner/miner_emit.go seedMeta, meta.gender = e.Gender), эмитируемые кандидаты его не несут. ⇒ на любой книге без ручного сида ось рода мертва по построению, и «плывущий род» — это не дефект рендера, а отсутствие входных данных. Прямо бьёт по цели №1: реестр памяти C3 называет русский глагол прош. вр. при скрытом роде «механическим спойлер-каналом» и «жалобой №1 читателей MTL» (строка 82). Развилка, которую надо назвать до стройки: добавлять ли поле рода в ответ терминолога (двигает провод ⇒ ТОЛЬКО в вайр-батч 182) ЛИБО выводить род отдельным дешёвым проходом, ЛИБО признать род сид-только свойством и гейтить им качество явно. Родня 82 (морфо-гейт рода) и 178 (калибровка sense). ⚠ ДОПОЛНЕНО 23.08 (№19): замка ДВА и они независимы — род рендерится только при Disp == Confirmed (membank/memory.go:705-713,823-827=Mirrors the editor block's confirmed-only gender), а mining.go:676 запрещает авто-банку статус approved. Род НЕ единственное осиротевшее поле: Sense/Speech/Decl тоже приходят только из сида, авто-продюсер есть лишь у Dst (терминолог) и Type (классификатор). ⚠ Поле Gender в схеме сида УЖЕ ЕСТЬ (internal/seed/seed.go:71=Gender string) — ось мертва в ПИСАТЕЛЯХ, не в формате. ⚠ И тесты слепы ПО ПОСТРОЕНИЮ (пере-проверено 23.08): все gender-кейсы конструируют род РУКАМИ, то есть зелёная батарея не отличает «производитель работает» от «производителя нет»; гейта на дрейф рода в движке нет бэкенд (+полигон на замер) скоро (цель №1; правка провода — вайр-батчем 182) развилка → решение → правка промпта/прохода + замер на прогоне с редактурой трассировка цепи банка 22.08, D39.21, C3 реестра памяти
213 ОСТАТОК — одна строка в ДЕВ-пути: супервизор зашивает "book.yaml" мимо константы ConfigFile (platform/internal/ingest/supervisor.go:142="status", "--config"). ⚠ ГЛАВНАЯ половина ЗАКРЫТА лендингом P9 (D39.162): платформа больше не парсит book.yaml нестрогим декодером и не вычисляет <project_db>.bank.json по чужой конвенции — путь берётся из конверта артефактов, который публикует движок (platform/internal/runner/artifacts.go:28-35; пустой путь — ГРОМКИЙ отказ, а не тихий недо-чит), и собственный projectDB() снесён вместе с суффиксом. Осталась ровно та тривиальность, которую строка называла рядом с дефектом. ⚠ Пере-именование банк-экспорта в фикс-имя рядом с events.jsonl — ЛОМАЮЩЕЕ, его место в окне строки 161, НЕ здесь платформа когда-нибудь (одна строка, следующим касанием зоны) правка дев-супервизора консилиум шва 22.08; главная половина — D39.162
214 Подпись банка не оставляет на банке НИ ОДНОГО следа. Единственная долговечная запись акта подписи — булев bank_released на прогоне (platform/internal/pgstore/runs.go:870=bank_released = bank_released or $2): кто и когда подписал, что именно вошло в подписанный набор — не хранится нигде. Следствие: пост-фактум ответить «почему в книге этот перевод термина» нельзя, а при пере-нарезке или пере-прогоне восстановить намерение человека не из чего. ⚠ ЧАСТИЧНЫЙ ответ появился с дверью правок (D39.162): её документы решений — долговечная запись того, ЧТО владелец решил, и они переживают прогон. Не отвечено по-прежнему: КТО и КОГДА подписал, и что именно вошло в подписанный набор. Всплыло трассировкой цепи банка 22.08, подтверждено пере-проверкой платформа + бэкенд когда-нибудь (с трубой доставки правок, D39.156) отдельное решение о провенансе подписи трассировка цепи банка 22.08, пере-проверено №19
215 $0-точечный репин движка работает ТОЛЬКО под --resnapshot, а платформа этого флага не передаёт. Механизм пере-привязки незатронутых юнитов при сдвиге банка построен (backend/internal/pipeline/stagerun.go:88-107=POINTWISE RE-EDIT) и он и делает подпись термина доступной по цене; но с платформы он недостижим — она зовёт translate без флагов сверх потолка и --verify-bank. ⇒ на SaaS правка термина сегодня стоила бы полной пере-редактуры, а не дельты. Родня строки 199(б) (нулевой набор consent-флагов) платформа + бэкенд когда-нибудь (с платформенным паком шва) отдельное решение трассировка цепи банка 22.08, пере-проверено №19
216 Подпись банка, halt на потолке и резюм после пополнения не проверялись против ЖИВОГО движка ни разу. Проверки этих путей в батарее платформы стоят на фейках; единственный живой прогон движка в батарее — не по этим маршрутам. То есть три несущих сценария продукта держатся на договорённости о поведении чужой стороны, а не на замере. ⚠ Гейтится тем же, чем и живой прогон книги (строка 202): холодный прогон движка платформа когда-нибудь (с 202) живой прогон по трём маршрутам трассировка цепи банка 22.08, пере-проверено №19
227 signature в квитанции двери правок считается от карты, которую переписывает ЛЮБАЯ граница майнинга (находка воркфлоу-ревью P9, 28.08): запись карты стоит ВЫШЕ решения о стопе (backend/internal/pipeline/mining.go:191=writeFileAtomic(r.signatureMapPath()), поэтому signature != null НЕ означает состоявшегося стопа подписи; surfaces/undecided дрейфуют между двумя вызовами владельца, а undecided: 0 достижим при НЕпредъявленных решениях (кап top-200 вытесняет). ⚠ Починка аддитивна и носитель для неё уже есть: карта несёт СВОЙ идентификатор (backend/internal/membank/decisions.go:903-912=id, err := seed.SignatureMapID(content)), а шов его не читает — отдать идентификатор в квитанцию и судить по нему. ⚠ Якорь находки был неверен (pipeline/signaturemap.go не существует) — исправлен приёмкой чтением. Цена сегодня мала (поле информационное, гейтом не служит) и растёт вместе с экраном подписи: именно он будет решать «что я подписываю» по этому числу бэкенд когда-нибудь (гейт: заказ экрана подписи) аддитивная правка квитанции воркфлоу-ревью P9, D39.162
217 Скрипты полигона захардкодили АБСОЛЮТНЫЕ пути двух корней и не работают на этой машине вовсе. ДВА РАЗНЫХ слома. Корень репо — смена пользователя: литерал в 121 файле, из них 104 дословно REPO = Path("/home/ubuntu/projects/textmachine"), портабельных форм всего 5. Корень книгоба события порознь: литерал /home/ubuntu/books 86 файлов (пользователь), портабельный Path.home()/"books" 89 файлов (переезд каталога; на прежних машинах работал). Объединение 173 файла. Пользователь теперь ubuntu-26, книги переехали в <репозиторий>/books ⇒ ломается и то и другое, включая ЖИВОЙ гейт фазы Д eval/conformance.py:48=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: три эрраты за сессию убили якоря в 17-seam-inbound-law.md:120 и research/25-seam-cold-review.md:5 (оба целили в :232, тело уехало на :239). Лечение — не пере-нацеливание (оно повторится через эррату), а СМЕНА ФОРМЫ якоря: в тела D-лога целиться номером ноты (^## D39.106), который стабилен навсегда, а не строкой. ⚠ Строка ОБЪЯВЛЕНА в CURRENT-STATE 24.08 и до 27.08 в таблице НЕ СУЩЕСТВОВАЛА — очередь три дня ссылалась на носитель, которого нет; поймано свипом якорей при выдаче контрактного минора оркестратор скоро (растёт с каждой эрратой) --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:500=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-довесок исполнен частично; срез эксп-21 НЕ купил (главный zh-замер на книге 4/5, без пинга) — остаток = неконтаминированный zh-срез полигон скоро (эксп-22 Ф0 — повторный ЖЁСТКИЙ заказ, стоп при неисполнимости) эксп-22 D39.37(4), D39.40, D39.46, D39.108, D39.117
56 Ёфикатор/санитайзер-классы не размечены (§6.5 отчёта пакета-6) полигон когда-нибудь полигон-пакет D39.46, CURRENT-STATE
57 Пере-замер «контексты — главный рычаг» на трудной выборке пакета-7 с боевой сборкой (до него kwic-веса/семантику не трогать; перф-хвост AttachKWIC — строка 37: фикс-пак 128 закрыт D39.118, опция в нём не взята, семантика не менялась) — напряжение с D39.46 названо, не отменено полигон когда-нибудь полигон-пакет D39.50, D39.118
58 Не покрыто пакетом-8: вторая книга/пара/модель · строка drafts: · ось batch_runes · разметчики-модели (не люди) · precision роли на «расширенном, но осмысленном» материале ; + контрастивный регрессионный сьют по каталогам режимов отказа (12-*) · чистовик exp15-выводов полигон когда-нибудь полигон-пакет POLYGON_PREMEASURE §1.8/§2.5/§3.5/§7.6
59 Вендор-чек префикс-кэша ZAI/GLM (на нём стоит вся кэш-экономика W1/Q2c) ; + GLM context-overflow гард (finish=model_context_window_exceeded — NOT-do пака-12 без решения) ; + Mistral-strip гейт message-builder (research/21 §1.1: extra_forbidden на reasoning-поля; ЛАТЕНТЕН при нашем single-shot wire — гейт перед прод-путём mistral в канале B / любым multi-turn; D39.74) полигон когда-нибудь (до МАСШТАБА) полигон-пакет D39.34(6)
60 Scheduler-aware волны под peak-valley DeepSeek (прямой COGS-рычаг) полигон/бэкенд когда-нибудь (до МАСШТАБА) отдельное решение D39.34(6)
61 Прайс/wire-гигиена: продление prices_checked без правки чисел · гейтнутые платные армы (edit-единица >3200 и др.) · wire-probe temperature в thinking-канале DeepSeek полигон когда-нибудь полигон-пакет D39.34(6)
— Ф2.5 / ПИЛОТ / ПРОД —
62 Билингв-якорь (D25 п.9 Q1) владелец когда-нибудь Ф2.5 D25 п.9, CURRENT-STATE
63 Контаминация корпуса (D27 п.4) владелец/полигон когда-нибудь Ф2.5 D27 п.4, CURRENT-STATE
64 Судья-дублёр (D22.6) бэкенд когда-нибудь Ф2.5 D22.6, CURRENT-STATE
66 Пилотные D25-гейты: publishable/waiver (п.1) · FN-bound L3 (п.4) владелец когда-нибудь Ф2.5 D25, CURRENT-STATE
67 Прод-гигиена: юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом (D27) ; + юрисдикционные annex-ре-чеки при новых рынках (D39.29) + поле «версия исходника» book.yaml на интейке (04-unhappy §5) владелец когда-нибудь Ф2.5 D27, CURRENT-STATE
68 Residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов (ОТЛОЖЕН до первого длинного прогона — D39.103) · precision@30 (books/gu-zhenren/exp16/) полигон когда-нибудь Ф2.5 / полигон-пакет CURRENT-STATE
— Ф3 / ПРОДУКТ —
69 Gemini API «под-18» обязательство на конечный продукт (независимо от лейблов) владелец когда-нибудь Ф3 / отдельное решение D39.32, D39.34(7)
70 Action-security gate перед выдачей tools/webfetch (D25 п.5) бэкенд когда-нибудь Ф3 D39.34(7)
71 Планы research/22: epub-tag-rewrite · Q7-леджер ; + F3-brief из D29 п.3 (chat-edit · Not-useful-петля · cost-of-fix) + Ф3-скоуп 02-mvp-plan (TMX/TBX · Bertalign · дистилляция 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)
105 Роль classifier мис-вердиктится как эхо (verdict=cjk_artifact при bad_lines=0); ЛАТЕНТНО — classify_types выключен во всех шиппинг-конфигах. Цена фикса, знать заранее: бамп classifierVersion → перекупка чекпойнтов классификатора (центы). Поля rules=/VOICE читать по знаменателям (13б). Разбор дословно — architecture/13-tech-debt-anchors.md §Б-105 бэкенд когда-нибудь (ближайшее касание банка/наблюдаемости; (б) — дешёвая часть, вердиктов не двигает) малое касание + вердикт-двигающая половина (а) через СТОП-решение D39.86
106 Слой 3: целевой контракт «узкие мандаты + ДИФФЫ» против текущего full-regen — гейт «перепроверить до стройки» в силе, приоритет ПОНИЖЕН (D39.117: full-regen выигрывает у ремонта; оговорка полигона — чинил дешёвый фиксер по предложению, не сильный редактор узким мандатом). Реактивация — только через эту строку. Археология дословно (эмпирика D39.108 · история дыры учёта) — architecture/13-tech-debt-anchors.md §Б-106 владелец → бэкенд когда-нибудь (пере-проверка «сильный редактор × узкий мандат» — перед стройкой слоя 3) замер → решение владельца 09 §Слой 3, D39.90, D39.108, D39.117
113 Запас боевого гейта не зафиксирован тестом, а харнесс, давший число, УДАЛЁН (Д-хвост D39.90). Числа «18 из 20 · 0 ложных на 1055 · запас 13× (0.0117 против 0.15)» и «санитайзер поймал бы английский черновик» получены ВРЕМЕННЫМ тестом в пакете pipeline (splitBanknote+StripThink+sourceScriptShare), который сессия удалила после снятия. Число ушло в контракт (строка 46), воспроизвести его нечем. Делать: корпус-фикстура в репо (~20 off-target + ~40 здоровых, с движковой предобработкой; снапшот НЕ двигает) + регресс-тест на реальный запас — это база, которую обязано побить любое предложение по 46. СТОП, если фикстура не воспроизводит 18/20 при 0 FP, или если запас меньше 3× бэкенд скоро (перед любой правкой по строке 46) $0 фикстура + регресс-тест D39.90, EFFORT_HANDLE §5.4 шаги 12, §7
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 заведён) · вахта маппинга эффорта dspro «early August 2026» · движение тулчейна к go1.27 ⇒ строка 119 ПЕРВОЙ оркестратор скоро ($0, гигиена трекера) завести реестр + сверку в норму лендинга D39.66, D39.90
109 Продуктовые требования без строки-носителя: ПТ-6 (структура абзацев) · ПТ-7 (слабый оригинал — вопрос владельца) · ПТ-22 (продуктовый интейк настроек) · ПТ-10 (механизм веб-фетча). Носители заводить при первом касании тем; реестр product-requirements.md первичен. Разбор дословно — architecture/13-tech-debt-anchors.md §Б-109 оркестратор/владелец скоро ($0 — расписать носители) завести строки/вопросы → диспозиции D39.90, product-requirements
110 Детектор повторов лемм / защита авторских рефренов (04-unhappy-paths.md:97,130 п.5): $0-минимум исполнен промптом (editor.md, пакет-чекеров 02.08), механизм явно не строился — «нет размеченного класса; связка с alignment/Bertalign». Строки-носителя не было; предмет живой, потому что отличить дефектный повтор от авторского рефрена без выравнивания нельзя бэкенд/полигон когда-нибудь (с корпусом пилота, строка 85) размеченный класс → решение 04-unhappy §5, D39.90
111 Дубль ключа пар-файла: фикс накрыл половину. D39.82 закрыл строку 53 через putUniqueDC в parseDCCheckers, но генерик-парсер категорий parseCategoryRows (internal/lang/langpack.go:806-826, строка cats[f[0]][f[1]] = val) по-прежнему МОЛЧА last-wins — а якорь техдолга указывал именно на него. Пар-данные с опечаткой-дублем тихо теряют первую строку бэкенд когда-нибудь (малое касание, с любой правкой langpack) fail-loud + тест 13-tech-debt-anchors, D39.82, D39.90
118 tools/go.mod — РЕШЕНИЕ ПРИНЯТО (D39.97 п.4): строить отдельным малым паком. cmd/tmvet+internal/archguard → отдельный модуль (backend/tools/); make battery гоняет оба модуля; tool-директива Go 1.24 НЕ решает (MVS общий). Выигрыш: бамп инструментов физически не двигает x/net/x/text. Sqlite 1.55 остаётся (D39.97 п.4) бэкенд скоро (до следующего бампа зависимостей) малый пак по D39.97 п.4 D39.96 п.6, D39.97
119 x/text-детерминизм: вердикт-несущие вызовы НЕ свёрнуты в версии (находки-5/6 приёмки). SanitizerVersion не сворачивает ничего x/text-ного, а detectCJKLeak зависит от width.Fold (sanitizer.go:211,687) — смена x/text перевернула бы вердикт БЕЗ смены снапшота; ExportNormalize меняет экспортные байты вне хешей (sanitizer.go:709); xTextVersion пинит строку go.mod, НЕ скомпилированные таблицы — тулчейн go1.27 переключит x/text на Unicode 17.0.0 МОЛЧА (tables17.0.0.go //go:build go1.27; жилец реестра 108). Делать: явные версии-свёртки + механическую сверку «таблицы↔константа» вместо совпадения бэкенд скоро правка версий-свёрток + тест D39.96 п.6, отчёт §5 находки-5/6
120 buildCheckers жёстко берёт lang.Load(root,"zh","ru"), бейзлайны ключуются по классу, не по паре (§7-8) — приезд ja-ru требует правки Go, против мандата общности §0.1. Родня строки 115 (явный embed-список целей) — брать одним касанием бэкенд скоро правка Go + тест на паре-которой-нет D39.96 п.6, отчёт §7-8
121 archguard v2 — остаток (б)/(в)/(г)/(д); (0а)/(0б)/(а) ЗАКРЫТЫ дофиксом D39.97. Полный фикс-лист посадок приёмки D39.96 с file:line — дословно в architecture/13-tech-debt-anchors.md §Б-121 бэкенд скоро (остаток: (б) тип вместо свитча · (в) build-теги · (г) 4-й анализатор · (д) семь пропусков) правка анализатора + посадки D39.96 п.2/п.6, отчёт §7-9/12/13
122 Гигиена пака стандартов — 11 микро-пунктов, не-блокеры приёмки (D39.96/97). Полный список дословно — architecture/13-tech-debt-anchors.md §Б-122 бэкенд когда-нибудь мелкие правки D39.96 п.6, отчёт §7-6/7, §9 хвост
123 Полигон: jieba==0.42.1 — build-time зависимость артефакта контраста eval/exp16/data/jieba_dict_general_zh.txt (пере-собран бэкенд-сессией 03.08, полный sha256 сошёлся с пином 16-bank-mining.md); дописать в манифест окружения полигона с пометкой «build-time, не runtime» полигон когда-нибудь строка манифеста D39.96 п.6, отчёт §7-4/§6
124 Калибровка снапшота (вопрос владельца 04.08, разбор D39.97 п.5): нацеленность, не агрессивность.Осей теперь ЧЕТЫРЕ — дописка D39.151: (г) идентичность оплаченной работы («строка диспозиции ↔ вызовы, которые её оплатили») — переселена сюда из строки 195 решением владельца 17.08; родня оси (в), потому что массовое кросс-снапшотное переиспользование подрывает наивную атрибуцию по равенству снапшота; смежный носитель — §7 спеки D15.2. Прежние три оси одним дизайн-паком: (а) недо-чувствительность — вердикт-несущие вызовы x/text не свёрнуты (вход: строка 119); (б) пере-охват — EmbeddedVersion фолдит все пары разом → пер-парный хеш (родня 115/120); (в) дешёвая перекупка: tmctl resnapshot --dry-run — байт-сверка тел по чекпойнтам (msgsContentHash), идентичные юниты пере-привязываются без пере-вызова, платятся только изменившиеся. «Поведенческий отпечаток вместо строки версии» отложен (пол ≠ доказательство) бэкенд когда-нибудь (перед МАСШТАБОМ — когда перекупки станут реальными деньгами) дизайн-пак по D39.97 п.5 D39.97
221 Джойн «предложено × решено × нерешено» живёт ТОЛЬКО в движке. Читаемый банк несёт итоги без предложений, карта подписи — предложения без решений; семантика «решено ли» (ownerHandled) существует в двух файлах движка и больше нигде (греп по трём зонам). Экран подписи при разморозке фронта заставит платформу пере-реализовать движковый закон у себя — дубль, запрещённый п.6 закона шва. Фикс: движок публикует нерешённость (секцией банк-экспорта или отдельной проекцией) — но ТОЛЬКО когда экран закажут: рефакторить под несуществующий экран не надо. Сейчас — ноль кода ⚠ КОНСИЛИУМ 27.08 (оркестратор №19 + автор движковой двери), итог записан, чтобы его не выводили заново. (1) Это ОДИН дефект, а не три: 221 и 224 — ось СОДЕРЖАНИЯ (проекция не несёт предложенное и не несёт джойн), остаток компаньона — ось СВЕЖЕСТИ (дверь пишет источники мгновенно, проекция ждёт границы прогона, которой при стоящем прогоне не наступает). Классический разрыв CQRS. Чинить порознь = три полу-лечения. (2) Поле BankTerm.decision МЕРТВО СТРУКТУРНО — довод сильнее прежнего «запрет владельца»: decline выражает себя ИСЧЕЗНОВЕНИЕМ строки, а не значением поля (writeAutoBank делает continue на ownerHandled, mining.go:709+), и негде показаться ни в одном из трёх окон; для approve поле избыточно — status: approved публикуется. Проверено двумя независимыми трассами. ⚠ Вопрос был СНЯТ ещё D39.144 вместе с ложной посылкой «марш к нулю, 17 из 300»; сегодняшняя потребность иная и уже — перезагруженный экран показывает СДЕЛАННЫЕ ПРАВКИ. (3) Форма-кандидат Д′: ДВЕ проекции, у каждой РОВНО ОДИН писатель — «решено на границе» пишет прогон рядом с картой, «решено после границы» пишет дверь при записи; экран склеивает по паре (поверхность, map_id), счёт приезжает ПОСЧИТАННЫМ. Правило единственного писателя остаётся буквально, поправка онтологии НЕ нужна. Конверт карты из дофикса-2 получает здесь первого потребителя. ⚠ Колонка undecided обязана ехать с тем же НЕ-гейтовым контрактом, что SignatureState, иначе пер-термная модель вернётся через новую проекцию. (4) Подпункт «история»: glossary_revisions построен наполовину — читатель вызывается только из тестов, графа reason заполняется литералом seed-replace, а ревизия пишется лишь для ОСТАВШИХСЯ строк, то есть журнал слеп к отклонениям; владельческий note доезжает до вида (glossary.go:41,161) и не публикуется ни одной проекцией. ⚠ Journal append-only: не заказать ревизии без исчезновений задним числом уже не выйдет. Пак не заказан — ждёт слова владельца бэкенд гейчена разморозкой фронта аддитивное поле проекции приёмка двери 27.08, D39.158
222 ВНУТРИкнижный остаток оси арбитра (заголовок исправлен 27.08 — прежний говорил «межкнижный» и инвертировал собственное тело: межкнижную гонку конвенция как раз сняла): второй конфиг ТОЙ ЖЕ книги с другим project_db пишет ту же пару файлов решений под ДРУГИМ локом, мимо флока живого прогона. Достижимо по построению: пути решений считаются от каталога book.yaml и book_id, лок — от project_db. Рукотворная конфигурация оператора (две базы одной книге), лечение трогает ратифицированный п.2 закона (второй арбитр на идентичности файлов решений либо отказ при загрузке). ⚠ Межкнижная версия ЗАКРЫТА снятием объявляемых ключей (D39.158 п.5) бэкенд когда-нибудь (непропорционально: правка ратифицированного закона ради операторского футгана) второй арбитр ЛИБО отказ при загрузке приёмка двери 27.08, D39.158
223 Майнерский хвост за потолком структурно недостижим. Потолок эмиссии (200) применяется ДО фильтров пригодности, сида и отказов, а детектор кандидатов сида и отказов не видит вовсе — репозиторий пишет это про себя дословно. Замер: 2110 ранжированных → 442 годных во всём алфавите → 117 внутри окна потолка → 325 невидимы постоянно; отклонение всех 117 не подняло ни одного. ⚠ Решения владельца слотов НЕ освобождают, и это верно СЕГОДНЯ, а не следствие флажка; цитата «пере-предлагается once these are signed or declined» относится только к ОБРАТНОЙ секции. Двигать потолок — трогать фрозен-паритет, отдельное решение. Якорь-пин: internal/miner/emissioncap_test.go бэкенд когда-нибудь решение о потолке, не правка приёмка двери 27.08, D39.158
224 Банк-экспорт на стопе ПУСТ — проекция, наиболее пустая ровно в момент, когда её читает экран подписи. Замерено: стоп с двумя предложенными термами даёт total=0, авто-банк на стопе отсутствует, потому что он пишется только в ветке авто-продолжения; при этом комментарий рядом называет стоп «границей, которую читает экран подписи», а платформа читает именно .bank.json. Член класса «проекция без контракта потребителя» (architecture/18-bank-ontology.md) бэкенд + платформа скоро (держит экран подписи вместе с 221) публиковать предложенное на стопе приёмка двери 27.08, D39.158
225 Гейт «строка open, а лекарство уже в дереве». При лендинге пересекать ПОЛНЫЕ пути застейдженных файлов с якорями открытых строк регистра и бэклога; совпадение — вопрос лендеру, а не находка следующего пака. Замерено прежде решения: по именам файлов 22 совпадения, почти все ложные; по полным путям 2, оба настоящие, и один из них (PD-157) убил мой же лендинг d1eb8a9. Норма-половина уже стоит в platform/docs/ENGINEERING_STANDARDS.md §3 п.8; здесь — машинная половина, режимом counts.py оркестратор скоро (окупился до постройки) режим counts.py, берущий список путей и печатающий открытые строки, чьи якоря в них целят приёмка пака P8-REVIEW 27.08, D39.159 п.7
226 История ПРЕДЪЯВЛЕННОГО не ведётся — «почему меня не остановило на этом термине» ответить нечем. Карта и человеческая таблица стопа перезаписываются каждым прогоном, память флажка — плоское множество поверхностей без map_id и без времени. Это прямая расплата за то, что стоп срабатывает ОДИН раз (кластерная память, названный остаток дофикса-2), и единственная возможная диагностика спора. Кандидат в пак решённости, не заказ. ⚠ Шестое, названное консилиумом и оставленное владельцу: авторство и время решения — сегодня цена нуля (владелец один), станет нужным при мультипользовательской платформе, и тогда его захотят ЗАДНИМ ЧИСЛОМ бэкенд скоро (диагностики нет вовсе) движок метит предъявленное map_id и временем; оверлей отвечает «что предъявлялось на прошлом стопе» консилиум по читающей стороне банка 27.08

(Хроника сессий №11№13, 0204.08 (D39.91105: ручки эффорта · стандарты репо · archguard · S2 · контракт API v0 · платформа P0 · банк-арбитраж research/24) — в archive/PROGRESS-2026-08-02-04.md.)

(Хроника сессий №9/№10, 31.0702.08 (D39.5990: курс «общность вперёд» · свип полноты · качество банка · фикс-пак · coldrun-b · фронт/платформа открыты · шов движок↔платформа · промт арбитража банка) — в archive/PROGRESS-2026-08-01-02.md.)

(Хроника 25.0731.07 до курса D39.59 — эры №7/№8 и начало №9: паки 1620, мини-прогон, полигон-пакеты 58, ToS-речеки, пак-19, холодный прогон (лендинги D39.2658) — в archive/PROGRESS-2026-07-25-31.md.)

Бэкенд

⟶ Состояние бэкенда — CURRENT-STATE (один носитель, D39.80); здесь только пинги живых сессий.

ИТОГ БЭКЕНД-СЕССИИ 28.08 — ПАК «ТИХАЯ ПОРЧА» (docs/BACKEND_SILENT_HARM_SESSION_PROMPT.md), все три пункта. Дерево готово, НЕ закоммичено.

§6 КОМПЛЕКТНОСТЬ — пункт → что сделано → каким ИСПОЛНЕНИЕМ подтверждено.

Заказ Что сделано Чем подтверждено ИСПОЛНЕНИЕМ
§3.1 инъекция банка доезжает на каждом провайдере либо громкий отказ Новая ось llm.Capability.SystemMessages (multi|single, capability.go:87-127,158-165); под single toOpenAIMessages СКЛЕИВАЕТ ведущий системный ряд в одно сообщение (httpllm.go:513-559) и падает громко на системном посреди диалога — зеркально Anthropic; YAML-ось capabilities.system_messages с валидацией enum (config/models.go:101-106,566-578,646-650); квирк объявлен у провайдера gemini с вендор-ссылкой и датой (configs/models.yaml:120-137) 6 тестов internal/llm/systemmessages_test.go + сквозной на ОБОИХ волнах internal/pipeline/systemmessages_wave_test.go. Мутация «ось игнорируется» → падает TestSingleSystemEndpointCarriesTheBankOnBothWaves обеими под-ветками и …CarriesTheInjection с текстом got 2 (roles [system system user]). Мутация «ось теряется по дороге из YAML» → тот же тест. Каталог: SH1, SH2
§3.2 дыра выдачи видна читателю файла Заказ пере-формулирован по находке (разрешено оркестратором 28.08): маркер уже существовал и ВРАЛ. ChunkOutcome/ChunkExport несут DroppedMembers (bookrun.go:69-75, export.go:45-51, waverun.go:488, export.go:227-230); cmd/tmctl/render.go печатает маркер В ПОТОКЕ ТЕКСТА (gapMarker, :26-63) в обоих рендерах и честные счётчики withheld/incomplete Сквозной прогон БОЕВОГО бинаря cmd/tmctl/exportgap_cli_test.go: tmctl translatetmctl export --plaintext, текст ДО и ПОСЛЕ на ОДНОМ состоянии (ниже). Матрица семи состояний. Мутации SH3 (маркер пуст) и SH4 (счёт выпавших не ведётся)
§3.3 повтор принятого документа сходится refuseSeedConflicts больше не срабатывает, когда отказ УЖЕ на записи (membank/decisions.go:365-393, новый rejectsHoldSurface :690-700); порядок записи в writeDecisionFiles изменён на REJECTS-FIRST с обоснованием (bankdecisions.go:427-441,458-489) 5 тестов membank/decisions_converge_test.go + 3 дверных pipeline/bankdecisions_converge_test.go (реальные файлы, реальные классы отказа). Мутации SH5 (сужение снято) и SH6 (порядок возвращён)

РЕШЕНИЯ ПО ПРОПУСКАМ И РОДНЕ — строкой каждое, как просил оркестратор.

  • Четвёртая дыра (строка 141) — ВЗЯТА БЕСПЛАТНО, работы не потребовала. Проверено исполнением (проба по internal/checks, файл удалён после замера): сноска [1] 蛊真人 — название романа. мимо детектора примечаний идёт, но поднимает класс CJKLeak, а он CosmeticOnly (checks/sanitizer.go:161-163) ⇒ StripCosmetic вырезает ханьцзы, юнит уходит sanitizer_stripped, и баннер «leak cleaned, verify» для НЕГО правдив. Механизм этого же заказа накрывает класс без правки детектора — граница промта соблюдена буквально. ⚠ Смежное, НЕ взятое и названное строкой: сноска БЕЗ ханьцзы ([1] Название романа.) не поднимает ни одного класса (замер: total=0), едет как есть — но текста при этом НЕ теряет, это лишняя добавка, а не дыра. Маркер на ней дезинформировал бы ( анти-скоуп промта). Ловля таких сносок — работа В ДЕТЕКТОРЕ, промт её прямо запретил.
  • Д1 — НЕ ВЗЯТ, отдельным предметом. Право §9. Канон определяет decline ПОВЕРХНОСТНО («declining a surface removes EVERY window of that surface», 14-api-contract/openapi.yaml:2038), и расширять его до энтити значило бы менять ратифицированный контракт из бэкенд-сессии. Вторая половина Д1 («память глушит стоп») — уже НАЗВАННЫЙ и принятый двусторонний остаток в комментарии mining.go:308-313, а не необнаруженный дефект. ⚠ Но одна траектория Д1 реальна и требует ЧУЖОГО решения: эмиссия майнера энтити-широка (miner_emit.go clusterTouches), а фильтр авто-банка ключуется только по собственному src строки (mining.go:662), поэтому ОТКЛОНЁННАЯ поверхность может вернуться алиасом уцелевшей строки. Это противоречит канону уже сегодня. Не чиню в этом паке (правильная форма — снять алиас со строки, а не снести строку; это предмет банковой онтологии, а не тихой порчи) — но это заказ, который стоит выдать.
  • Д3 — НЕ ВЗЯТ, вне моей зоны. LiftBankStop в backend/ не существует ни в каком написании; символ живёт в platform/internal/runs/spawn.go и reconcile.go, то есть в зоне, запертой паком P9. Движковая половина при этом здорова: порядок «карта → память» ратифицирован и исполнен (mining.go:191 пишет карту, :274 метит память), отказ памяти оценён в комментарии :275-276 как «one extra stop, nothing lost». ⚠ Поправка к моему же раннему пингу: я сказал «гарда не существует» — точнее «не существует В ДВИЖКЕ».
  • Сосед 131 — НАЗВАН, не чиню. Кап инъекции считает только src → dst (membank/memory.go:517-521 glossaryLineTokens), а рендер дописывает к КАЖДОЙ строке tx.UnverifiedMarker (:706) либо genderConstraintNote(...) (:711), а редакторский блок ещё и префикс - с кавычками-ёлочками (:821). То есть отгружаемая строка строго длиннее той, за которую платит бюджет; на коротких именных строках перерасход велик. Тема денег и качества инъекции — не тихий брак в тексте.

НАХОДКИ, МЕНЯЮЩИЕ ПРОМТ (все три подписаны, ни одна не абсорбирована молча).

  1. §3.2: маркер существовал и ВРАЛ. Ветка case ce.FinalText != "" печатала «(leak cleaned, verify)» ЛЮБОМУ флагнутому юниту с текстом, а c-lite member-drop (export.go ставит DispFlagged при непустом тексте) попадал ровно в неё. Существующий тест не ловил: покрывал ветку только причиной sanitizer_stripped (export_cli_test.go:66). Предмет заказа изменён с «завести маркер» на «перестать врать и покрыть непокрытое» — разрешено оркестратором 28.08 при закрытом гейте.
  2. §3.2: подсказка промта про место правки была опасна. Промт указывал export.go:237 рядом с ApplyHeading. Туда нельзя: ChunkExport.FinalText — поле артефактного контракта, а провод судит translated/withheld предикатом «текст непуст» (waverun.go:203-204 и events.go:538-554, runevents.go:130 Shipped). Маркер в пустом юните перевернул бы withheldtranslated — ровно (а) промта. ApplyHeading этого не делает лишь потому, что на пустом тексте он no-op. Маркер живёт в РЕНДЕР-слое. Проверено: FlagReason-константы до и после ИДЕНТИЧНЫ, exportVersion не двигался, dropped_members аддитивно и omitempty.
  3. §3.1: посылка «Gemini принимает ровно одно» отозвана автором (оркестратор, 28.08) — вендор- вердикт со ссылками и датами отправлен ему отдельно, для 00-provider-quirks.md. Кратко: структурная посылка ПОДТВЕРЖДЕНА (systemInstruction — один object (Content), Content.role ∈ {user, model}), поведение шима вендором НЕ документировано нигде, наш замер даёт «не склеиваются» и «инструкция первого не исполнена»; «выживает одно или ноль» остаётся ОТКРЫТЫМ и для решения безразлично.

ДЕФЕКТ, КОТОРЫЙ Я ВНЁС САМ И ЗАКРЫЛ (называю, потому что он показателен). Первая редакция ветки маркера срабатывала по DroppedMembers > 0 БЕЗ проверки непустого текста. Юнит, у которого выпали ВСЕ члены, ship-ит пустоту — и получил бы баннер «(INCOMPLETE)» с фразой «фрагмент отсутствует в тексте НИЖЕ», указывающей на несуществующий текст. То есть я едва не заменил одну ложь читателю на другую. Найдено собственным разбором ветвлений до опровергателей, закрыто гардом на обоих сайтах вызова, покрыто состоянием «выпали все» в матрице и запинено мутацией (снятие гарда → тест падает).

§5 ОСИ РЕВЮ.

  1. Читатель книги. Все четыре класса проверены на ОТГРУЖЕННОМ ТЕКСТЕ, не на структурах: (а) c-lite — был помечен ложно, теперь помечен верно и в потоке текста; (б) юнит целиком withheld и (в) glossary_miss — помечены верно и раньше, работы не требовали, теперь ещё и не попадают под маркер по ошибке; (г) сноска с ханьцзы — накрыта существующим верным маркером.
  2. Пара, которой в репо нет. Правка не ветвится по паре ни в одном месте: ось system_messages — свойство ЭНДПОЙНТА, маркер — английский операторский словарь той же поверхности, что и соседние баннеры, поэтому у книги с любым target_lang и БЕЗ langpack вывод байт-идентичен. Специально НЕ стал класть маркер в langpack: InjectionTextsFor для незнакомой цели возвращает нулевое значение молча (lang/embedded.go:411-423) — маркер бы исчез, и дыра снова стала бы тихой ровно для той пары, ради которой мандат общности и написан.
  3. Детерминизм. Голден зелёный (go test ./internal/pipeline/ -run TestGolden -count=1), и это сильная улика: голден пинит ПОЛНОЕ тело запроса с обоими системными сообщениями (testdata/golden/capture.golden:110), то есть глобальная свёртка сделала бы его красным, а квирк-свёртка не трогает никого, кто квирк не объявил. omitempty на новом поле запинен тестом (TestCapabilityWithoutTheAxisMarshalsUnchanged сверяет БАЙТЫ). Снапшот фолдит Capability только праймари и escalate_to (snapshot.go:316-340), а в pipeline-c1.yaml это deepseek-v4-pro (:60) — gemini там лишь третий в цепочке при budget_usd: 0 и SINGLE-HOP раннере ⇒ снапшот боевого конфига не двигается, перекупки нет.

§8 OBSTACLE — что НЕ удалось и что НЕ проверено.

  • Живого вызова к Gemini НЕ было (пак платных вызовов не требует, и я их не делал). Что склейка ПОМОГАЕТ, доказано структурно вендор-докой и логикой «при любом чтении, кроме склеивания, два системных теряют текст» — но НЕ замерено на проводе. Решающая проба стоит денег и принадлежит полигону: маркер на ПОСЛЕДНЕЕ системное + user-only контроль закрыли бы открытый вопрос «выживает одно или ноль». Также: проба полигона гонялась на gemini-3.1-flash-lite, а в цепочке стоит gemini-3.1-pro-preview — слой тот же, слаг другой, перенос не замерен.
  • Достижимость §3.1 сегодня НУЛЕВАЯ, и это не смягчение дефекта, а его честная рамка. Раннер исполняет SINGLE-HOP, escalate_to боевого конфига — deepseek-v4-pro, budget_usd: 0. Gemini не достигается ни одним шиппинг-конфигом; дефект ждал первого конфига, который назовёт его в escalate_to или в chain[0] лейбла. Кривая пост-чек-промахов на эскалационном хопе, которую §4.2 просил как второй замер, СНЯТА БЫТЬ НЕ МОЖЕТ по той же причине — мерить нечего.
  • Ловушка, которую я НЕ чинил и обязан назвать: capabilities у провайдера с kind: anthropic принимается валидацией и молча игнорируетсяclients.go не передаёт Cap в Anthropic-клиент вовсе. Это ПРЕД-СУЩЕСТВУЮЩИЙ класс (так ведут себя ВСЕ оси: budget_field, temperature, reasoning, min_max_tokens), моя ось лишь наследует его. Чинить правильно — тащить kind в validateCapabilities, что трогает каждую ось; в этом паке это чужой предмет. Практический риск сегодня нулевой: провайдера anthropic в models.yaml нет.
  • Изменён СУЩЕСТВУЮЩИЙ тест — заявляю прямо, не прячу в дифе. internal/pipeline/bankreport_test.go TestHalfLandedIsNamedPerFile кодировал ПОРЯДОК переименований в своей фикстуре (занимал путь rejects, чтобы упал второй rename). Порядок изменён заказом §3.3, и фикстура пере-нацелена на путь delta. Утверждение НЕ ослаблено: по-прежнему требуется, что ровно одна половина легла, что это ПРОВЕРЕННЫЕ байты и что отчёт называет какая. Сверх того добавлен TestTheRenameOrderIsWhatMakesADeclineRecover, который пинит САМ порядок вместе с его причиной, чтобы его нельзя было вернуть как «уборку». Если оркестратор считает это подгонкой — я готов откатить и вынести §3.3-половину с полусостоянием отдельным заказом.
  • Каталог мутаций: запись AJ-seed-alias-decline пере-заякорена. Моя правка сдвинула строку, на которую она указывала, и инструмент падал жёсткой ошибкой «the source moved under the catalogue» — это был бы хард-блокер для следующей сессии. Атакуемое свойство сохранено дословно (снять дельта-оговорку, оставить остальное); плюс добавлены шесть СВОИХ посадок SH1SH6, по две на пункт, чтобы фикс был постоянным гейтом, а не разовым замером.
  • Не проверено: поведение под реальным параллелизмом двух bank-apply (лок это исключает, но я не гонял); поведение склейки на провайдере, который принимает одно системное И имеет префиксный кеш (у gemini кеш иной) — довод «склейка кеш не портит» опирается на комментарий самого кода и на то, что префикс сохраняет байты и позицию, живьём не мерен.

§4 ОПРОВЕРГАТЕЛЬ — ЗАКАЗ ИСПОЛНЕН, И ОН ОКУПИЛСЯ. Шесть линз, мандат «опровергни». Веер шесть, а не «24» из §4: численный потолок снят словом владельца 28.08, соразмеряю предмету. Линзы: Anthropic-путь и кеш · читатель книги · провод withheld/translated · безопасность банковых решений · пара, которой в репо нет + детерминизм · вырожденность собственных тестов. Пять из шести вернули вердикт REFUTED или PARTIAL, и это правильный исход: они нашли ШЕСТЬ дефектов, из них ЧЕТЫРЕ я внёс сам этим паком. Все воспроизведены ИСПОЛНЕНИЕМ на копиях дерева, не чтением.

Находка Кто/чем доказано Что сделано
MAJOR: маркер называл ЧУЖУЮ причину. Юнит, где редактура флагнулась САМА (косм. чистка) И выпал член, печатал причину ЧИСТКИ как причину дыры: «фрагмент не переведён: sanitizer_stripped». Та же ложь, что убирал пак, перенесённая в поток текста 2 линзы независимо, боевой бинарь ИСПРАВЛЕНО: заведены DroppedReason на ChunkOutcome/ChunkExport, маркер несёт причину ЧЛЕНА, баннер — вердикт ЮНИТА. Пин SH7, состояние в матрице обоих рендеров
MAJOR: анти-скоуп. В черновично-однофазном конвейере юнит — одиночный чанк, и его СОБСТВЕННЫЙ флаг читался как «выпавший член» ⇒ косметически почищенный чанк, у которого ВЕСЬ текст на месте, объявлялся неполным боевой бинарь, tmctl translate и tmctl export расходились на одном юните ИСПРАВЛЕНО: учёт выпадений только когда финальная волна — редакторская (export.go). Тест TestADraftOnlyStrippedChunkIsNotCalledIncomplete, пин SH8
MAJOR: перестановка порядка записи купила сходимость ЦЕНОЙ второго тихого вреда. Rejects-first оставляет строку дельты на диске, а seedGlossary дельту отказами НЕ фильтровал ⇒ в окне между падением и ре-сендом ОПЛАЧЕННЫЙ прогон вливал в глоссарий редактора терм, который владелец отклонил 2 линзы, исполнение на реальных файлах ИСПРАВЛЕНО: loadMinedDelta отбрасывает поверхность, стоящую в списке отказов, и говорит об этом WARN'ом. Тест на реальном полусостоянии, пин SH12. Заодно исправлено утверждение в шапке writeDecisionFiles, которое после перестановки стало ложным
MAJOR: сходимость останавливалась на ОДНОЙ из двух дверей. refuseInertDeclines я решил не трогать — и ошибся: траектория из ОДНИХ ПРИНЯТЫХ вызовов (decline терма-со-своей-строкой → approve терма, который несёт его алиасом) делала повтор стоячего реестра решений отказным навсегда, а всё-или-ничего уносило с ним законный approve исполнение, полная трасса ИСПРАВЛЕНО: та же оговорка на второй двери (по in.Rejects, не res.Rejects — фолд уже отработал). Тест TestTheStandingLedgerConvergesThroughBothDoors + направление-гард на живом алиасе, пин SH13
MAJOR: у боевого объявления в configs/models.yaml не было ГЕЙТА вовсе. Две строки — единственное, что доводит фикс до реального эндпойнта, а удаление их оставляло ВЕСЬ модуль зелёным опровергатель посадил свою мутацию и получил SURVIVED ИСПРАВЛЕНО: TestShippedGeminiDeclaresOneSystemMessage над боевым конфигом, пин SH9 (проверено: удаление строк → тест краснеет)
MINOR: гарды в renderTranslate не были запинены (близнецы в renderExport были), case "multi" не покрыт, счётчики читались как разбиение целого исполнение ИСПРАВЛЕНО: матрица шести состояний для renderTranslate, тест TestExplicitMultiCostsNothing, счётчик переписан как exported=N (of them incomplete=M). Пины SH10, SH11

ЧТО ОПРОВЕРГАТЕЛИ АТАКОВАЛИ И НЕ СЛОМАЛИ (чтобы следующий читатель знал, что уже покрыто): Anthropic-путь (склейка до него не доходит структурно — Cap в него не передаётся; два блока и живой cache_control на месте) · префиксный кеш (стабильный префикс сохраняет байты и позицию) · провод translated/withheld (UnitDone.Shipped считается по пустоте текста; ни DroppedMembers, ни маркер её не трогают) · отсутствие новых причин флага (константы FlagReason до и после ИДЕНТИЧНЫ) · exportVersion не двигался · снапшоты боевых конфигов не двигались · арм-конфиги грузятся.

ЧТО НАЙДЕНО, НО СОЗНАТЕЛЬНО НЕ ЧИНИТСЯ — с аргументом.

  1. Ловушка capabilities на kind: anthropic — оказалась чинибельной дёшево, и я её ВЗЯЛ: ось теперь отказывается на этом виде по образцу cache_ttl (models.go), с тестом. Пред-существующий класс для ОСТАЛЬНЫХ осей (budget_field, temperature, reasoning, min_max_tokens) остаётся — его правильная форма тащит kind в validateCapabilities и трогает каждую ось; это чужой предмет.
  2. Снапшот не покрывает модель ГЕЙТА ТЕРМИНОЛОГИИ (config/pipeline.go — не фолдится сознательно, ратифицированно), а терминолог шлёт ДВА системных. ⇒ флип оси у провайдера, которым пользуется только этот гейт, меняет байты под НЕИЗМЕННЫМ RequestHash, и чекпойнты ложно попадают. Дыра НЕ моей оси — по ней ездят все оси capabilities с D3.1 — но моя первая, чей смысл именно в смене этих байтов. Утверждение в комментарии я ослабил до правды и дыру НАЗВАЛ прямо в коде (capability.go); закрытие — фолд модели гейта, как это делает repairSnapshot, и это правка снапшот-контракта, принадлежащая владельцу решения «не фолдить», а не провайдерскому квирку.
  3. Сузив отказ по поверхности, я потерял поучение в одном углу: decline, который И записан, И по-прежнему инертен против подписанного сид-терма, теперь отвечает already_applied вместо единственной работающей инструкции «убери из glossary_seed». Сходимость сочтена более тяжёлой обязанностью (у вызывающего, который следует опубликованному ретраю, другого хода нет), но размен реальный: закрывается полем отчёта, несущим стоячий факт, и это форма шва.

ХАРД-БЛОКЕР, НАЙДЕННЫЙ И СНЯТЫЙ (требование владельца «после тебя не осталось хард-блокеров»). go test ./cmd/tmctl/ строил боевой бинарь в os.MkdirTemp и НИКОГДА не убирал каталог — по 20 МБ за прогон. За этот пак накопилось 249 брошенных каталогов tmctl-bin*, ~5 ГБ, и /tmp заполнился до 99%: батарея под -race начала падать с link: mapping output file failed: no space left on device, что читается как сломанная сборка, а не как кончившееся место. Я на это и купился на один прогон — сообщать «батарея красная» было бы ложью. Причина найдена, место освобождено, харнесс починен: добавлен TestMain, снимающий каталог (cmd/tmctl/exitcontract_test.go); проверено исполнением — два прогона подряд, прирост каталогов 0. Дефект пред-существующий, пак его лишь довёл до отказа.

ЧИСЛА, С КОМАНДАМИ (§4.1).

  • go build ./... · gofmt -l . (пусто) · go vet ./... · go vet -tags live ./...все 0.
  • go test ./... -count=1 -timeout=20mEXIT 0.
  • go test ./... -race -count=1 -timeout=20m (= строка make test) → EXIT 0, real 2m09s.
  • golangci-lint run --timeout=15m ./... (= make lint) → 0 issues.
  • go test ./internal/pipeline/ -run TestGolden -count=1ok (голден пинит ПОЛНОЕ тело запроса).
  • go run ./cmd/tmmutate -root <КОПИЯ>73 посадки, 0 неожиданных исходов, EXIT 0 (72 RED + один каталогизированный выживший G-byte-gate; все 13 моих красны); каталог вырос 60 → 73 (13 новых посадок: SH1SH13), у каждой из трёх заказанных тем ≥2 своих. ⚠ Каталог гонять ТОЛЬКО на копии — сам инструмент это требует, а я один раз запустил его на рабочем дереве и словил таймаут; дерево спас обработчик сигнала самого инструмента (проверено: мутационного текста не осталось, батарея зелена). Записываю как урок, а не как мелочь.

ФАЙЛЫ (19 правленых + 5 новых; всё в backend/, плюс эта запись в журнале). cmd/tmctl/render.go · cmd/tmctl/exitcontract_test.go · cmd/tmmutate/mutations.json · configs/models.yaml · internal/config/models.go · internal/config/models_catalog_test.go · internal/llm/capability.go · internal/llm/httpllm.go · internal/llm/provider_openai.go · internal/llm/provider_local.go · internal/membank/decisions.go · internal/membank/decisions_fuzz_test.go · internal/pipeline/bankdecisions.go · internal/pipeline/bankreport_test.go · internal/pipeline/bookrun.go · internal/pipeline/export.go · internal/pipeline/mining.go · internal/pipeline/runner_test.go · internal/pipeline/waverun.go. Новые: cmd/tmctl/exportgap_cli_test.go · internal/llm/systemmessages_test.go · internal/membank/decisions_converge_test.go · internal/pipeline/bankdecisions_converge_test.go · internal/pipeline/systemmessages_wave_test.go.

ВОПРОСЫ И ПИНГИ ОРКЕСТРАТОРУ — четыре, каждый требует ЧУЖОГО решения.

  1. Изменён СУЩЕСТВУЮЩИЙ тест, и я это заявляю, а не прячу. bankreport_test.go TestHalfLandedIsNamedPerFile кодировал в фикстуре ПОРЯДОК переименований, который заказ §3.3 изменил; фикстура пере-нацелена на второй rename, утверждение сохранено дословно и усилено новым TestTheRenameOrderIsWhatMakesADeclineRecover, пинящим сам порядок с его причиной. Считаешь подгонкой — откачу, и тогда половину §3.3 с полусостоянием надо выносить отдельным заказом.
  2. Вендор-вердикт по Gemini — прислан отдельным сообщением, с URL и датами; три поправки к 00-provider-quirks.md:157 (структурная посылка ≠ поведенческий вывод · Content.parts[] повторяемо · «форум Google» — это два не-сотрудника из 2025). Пишешь ты, зона твоя.
  3. Дыра снапшота у модели гейта терминологии (см. выше, п.2 «не чинится»). Закрытие — правка снапшот-контракта; принадлежит владельцу решения «гейт не фолдится», не мне.
  4. Д1 достоин собственного заказа. Не «расширить decline до энтити» (это против канона), а узко: эмиссия майнера энтити-широка (miner_emit.go clusterTouches), а фильтр авто-банка ключуется только по собственному src строки (mining.go:662), поэтому ОТКЛОНЁННАЯ поверхность возвращается алиасом уцелевшей строки. Канон уже сегодня обещает «declining a surface removes EVERY window of that surface» — то есть движок не держит обещание. Правильная форма — снять алиас со строки, а не снести строку; это банковая онтология, и в «тихую порчу» её тянуть не следует.

ПРАВО §9 ПРИМЕНЕНО ТРИЖДЫ, каждый раз с грунтом: Д3 отклонён (символ живёт в platform/, зона заперта; движковая половина здорова и порядок «карта → память» исполнен) · Д1 отклонён как отдельный предмет (выше) · подсказка промта про место маркера отклонена (она перевернула бы withheldtranslated). ⚠ И один раз право §9 я применил ОШИБОЧНО: решил не трогать вторую дверь refuseInertDeclines, рассудив, что её случай — «устаревший документ, а не ретрай». Опровергатель показал траекторию из ОДНИХ ПРИНЯТЫХ вызовов. Рассуждение было неверным, исполнение это доказало, дверь починена.

⚠ ЗАПИСКА НИЖЕ — ПЛАН ДО ПРАВОК (§6), она СОХРАНЕНА как след дисциплины, но её выводы местами ОПРОВЕРГНУТЫ итогом выше. Не наследовать из неё: «сломан только класс (а)» (сломан ещё и стык «редактура флагнулась сама + выпал член»), «фиксация порядка записи безопасна» (она купила второй тихий вред, закрытый фильтром дельты) и «Д3 не существует» (существует, в platform/).

📝 ЗАПИСКА-ПЛАН БЭКЕНД-СЕССИИ 28.08 — ПАК «ТИХАЯ ПОРЧА» (docs/BACKEND_SILENT_HARM_SESSION_PROMPT.md), §6. Правок кода на момент записи НЕТ. Три заказа: §3.1 инъекция банка не теряется · §3.2 дыра выдачи видна читателю файла · §3.3 повтор принятого документа сходится. Ниже — что установлено ЧТЕНИЕМ до правок и как из этого следует план. ⚠ Всё, что помечено «проверить исполнением», в план входит как обязательство, а не как факт.

Находка 1 (меняет §3.2). Маркер уже есть — и он ВРЁТ. cmd/tmctl/render.go:499 печатает для флагнутого юнита с НЕПУСТЫМ текстом баннер «(leak cleaned, verify)», а :38 — «[FLAG … — leak cleaned, exported cleaned, verify]». Ветка выбирается по ce.FinalText != "", и c-lite member-drop (export.go:226-230 ставит DispFlagged при непустом тексте) попадает ровно в неё. То есть юнит, у которого ВЫПАЛ ЦЕЛЫЙ ЧЛЕН, объявляется читателю косметической чисткой санитайзера, которой не было. Существующий тест это не ловит: cmd/tmctl/export_cli_test.go:66 покрывает ветку только причиной sanitizer_stripped. ⇒ Предмет §3.2 не «завести маркер», а «перестать врать и покрыть непокрытое» (пере-формулировка разрешена оркестратором 28.08 при закрытом гейте «что читает человек»).

Гейт §3.2 закрыт чтением: движок НЕ ПИШЕТ ФАЙЛОВ ВООБЩЕ. Все команды рендерят в stdout (cmd/tmctl/main.go:227-228, :338-349). Читаемых человеком поверхностей у движка две, обе текстовые и обе уже несут пер-юнитный баннер: tmctl translate (render.go:27-72) и tmctl export --plaintext (render.go:478-511). Дефолт export — JSON (export_cli_test.go:24-28), и он же артефакт шва к платформе (research/23 строка 76 — «артефактный контракт (export-JSON · 101 · 100)»). Читательский файл (epub и пр.) собирает ПЛАТФОРМА по POST /books/{bookId}/exports (14-api-contract/openapi.yaml:824-870) — чужая зона. ⇒ Адресат моего маркера — человек, читающий plaintext-выгрузку движка; платформенная половина остаётся за платформой, и провод различение несёт (14-api-contract/README.md:300).

Следствие для места правки, и оно расходится с подсказкой промта. Промт указывал на export.go:237 (прецедент ApplyHeading). Туда маркер класть НЕЛЬЗЯ: ChunkExport.FinalText — это поле final_text артефактного контракта, а waverun.go:203-204 кормит провод предикатом oc.FinalText != "" (shipped). Любой маркер, вклеенный в текст ПУСТОГО юнита, перевернул бы withheldtranslated — ровно (а) промта. ApplyHeading этого не делает только потому, что на пустом тексте он no-op (chunk/chunker.go:186-191). Различение: титул — часть КНИГИ и обязан ехать на провод; маркер дыры — метаданные О тексте, и в поле, по которому провод судит, ему нельзя. ⇒ маркер живёт в РЕНДЕР-слое (cmd/tmctl/render.go), на слой дальше проекции. Это ответ на требование промта «либо тем же механизмом, либо объясни, почему другое».

Классы дыр — ревизия по коду. (а) c-lite member-drop — помечен, но ЛОЖНО (находка 1); (б) юнит целиком withheld (waverun.go:496-509) и (в) gate-override glossary_miss (export.go:319-323) дают пустой текст и попадают в ветку render.go:502-504 «(not translated, flagged for a human)» — помечены ВЕРНО, работы не требуют; (г) четвёртая, сноска «[1] …» мимо детектора примечаний: детектор требует заголовочного слова (lang/data/target-ru.txt, sanitizer_trailing_note), но ханьцзы в сноске поднимают класс CJKLeak, а он CosmeticOnly (checks/sanitizer.go:161-163) ⇒ юнит уходит как sanitizer_stripped, и баннер «leak cleaned» для НЕГО правдив. То есть класс (г) накрыт существующим механизмом БЕСПЛАТНО и работы в детекторе не требует — граница промта соблюдена. Проверить исполнением обязательно: что сноска с ханьцзы действительно даёт CosmeticOnly, а не подтягивает субстантивный класс.

§3.1 — план и его цена. Свёртки в toOpenAIMessages нет (llm/httpllm.go:513-521, копия один-в-один); её комментарий :511-513 говорит, что CacheBoundary на этом пути бессмысленна ⇒ свёртка кеш не портит. У Anthropic путь другой и трогать его нельзя (llm/provider_anthropic.go:169-179: ведущий system-префикс → блоки, CacheBoundary → реальный cache_control). Ось лечения — llm.Capability + блок capabilities: (провайдерный ИЛИ модельный, config/models.go:85,:146,:442-450), прецедент безопасного расширения — MinMaxTokens с json:",omitempty". Детерминизм: снапшот фолдит РАЗРЕШЁННУЮ Capability только для праймари и единственного escalate_to (pipeline/snapshot.go:316-340,:479,:495); в pipeline-c1.yaml escalate_to: deepseek-v4-pro (:60), а gemini стоит лишь третьим в цепочке default (:129) при budget_usd: 0 (:136) и раннере SINGLE-HOP ⇒ объявление квирка у gemini снапшот боевого конфига НЕ двигает. Проверить исполнением (голдены + снапшот-тесты). ⚠ Честная граница достижимости: при SINGLE-HOP и текущих конфигах gemini не достигается ВООБЩЕ; дефект латентный и ждёт конфига, который назовёт gemini в escalate_to или в chain[0] лейбла. ⚠ Развилка, которую выношу на опровергателя (§4 заказ): дефолт оси. «Квирк объявляет тот, у кого он есть» (нулевое значение = сегодняшнее поведение) не двигает ничего, но НОВЫЙ провайдер с той же ловушкой снова теряет инъекцию молча — тот же класс тихого вреда. «Свёртка по умолчанию, исключение объявляет проверенный» безопасна для незнакомого провайдера, но меняет провод боевому переводчику без замера (запрет «эмпирика решает») и двигает снапшот. Решение — после опровергателя, с обоснованием. ⚠ Посылка промта «Gemini принимает ровно одно системное» ОТОЗВАНА автором (оркестратор, 28.08): это было рассуждение; собственный замер полигона (00-provider-quirks.md:157) даёт 535 токенов ≈ не выжило НИ ОДНО. Заказу это безразлично, тесту — нет: утверждается пост-фиксный инвариант «системное РОВНО ОДНО и инъекция ВНУТРИ него», он верен при любом чтении. Вендор-вердикт со ссылкой уходит оркестратору для 00-provider-quirks.md (его зона).

§3.3 — трасса контрактной сессии ПОДТВЕРЖДЕНА моим чтением, и подтверждено то, что она сама не читала. Отказ живёт в membank/decisions.go:374-377, бежит ДО фолда (:296-300), и всё-или-ничего вытирает документ целиком (:302-307). Порядок записи я прочитал сам: bankdecisions.go:458-473 коммитит ДЕЛЬТУ ПЕРВОЙ, а собственный комментарий функции :436-438 говорит дословно: «delta-first is safe for an approve and NOT for a decline … convergence is what actually carries both». ⇒ окно застревания реально, и код сам называет допущение, которое ложно. Идемпотентная ветка уже есть (already_applied, :221-224,:269-272) — вводить понятие не надо. План: сузить условие отказа так, чтобы оно не срабатывало, когда отказ УЖЕ записан в rejects, плюс направление-гард (настояще-инертный decline обязан отказывать по-прежнему тем же текстом). Идентичность документа НЕ вводить — сходимость по СОСТОЯНИЮ.

Д1 и Д3 — беру право §9 и НЕ чиню, оба с грунтом. · Д3 ОТКЛОНЁН как несуществующий: гард LiftBankStop не найден в коде НИ В КАКОМ написании (греп по всему backend/); реальный носитель — mining.go:266-277, и он уже реализует ратифицированный порядок «карта → память»: writeFileAtomic карты на :191, MarkStopPresented на :274, с комментарием :270-273 «strictly after the map … the reverse order can mark surfaces presented whose map never reached disk» и с явной оценкой отказа памяти как «one extra stop, nothing lost» (:275-276). То есть механизм написан ВМЕСТЕ с памятью v16, а не до неё. · Д1 ОТКЛОНЁН как ратифицированное поведение + названный остаток: канон определяет decline ПОВЕРХНОСТНО («declining a surface removes EVERY window of that surface» — 14-api-contract/openapi.yaml:2038), и расширение до энтити противоречило бы контракту; а «память глушит стоп» — уже НАЗВАННЫЙ и принятый двусторонний остаток в комментарии mining.go:308-313. Оба — строка с причиной, не правка.

Сосед 131 (называю, не чиню, как велит §3.4): кап инъекции считает только «src → dst» и не считает маркер ⟨проверить⟩ и родовые пометки (lang/data/injection.txt несёт их как отдельные значения) ⇒ реальная инъекция шире бюджета. Проверю точный носитель при работе в этом коде и назову file:line в итоге; чинить не буду — тема денег и качества инъекции, а не тихого брака в тексте.

Порядок работы: §3.1 → §3.2 → §3.3, каждый с тестом на ПОСТ-фиксный инвариант; батарея под -race + линтер; посадки мутаций ≥1 на пункт с вердиктом по ДЕЛЬТЕ и ТОПИЧНОСТИ; опровергатель на выбор места §3.1 (заказ §4). Веер агентов соразмеряю предмету: численный потолок «24» из §4 промта снят словом владельца 28.08.

ИТОГ БЭКЕНД-СЕССИИ 27.08 (2) — ФИКС3 ПО ФИКС-ЛИСТУ ПРИЁМКИ (docs/BACKEND_SEAM_FIX3_SESSION_PROMPT.md), все 6 пунктов. Дерево готово, НЕ закоммичено; продолжает дерево трёх паков. Четыре пина, один снос, ноль новых механизмов: пин порядка «карта → память» (мутация приёмки воспроизведена в трёх пакетах ДО пина; занятый путь карты → ошибка прогона + пустая память) · пин «отчёт класса 15 мерит подпись по ДИСКУ, не по намерению» (утверждение панели воспроизведено) · оба носителя старого пола полосы приведены к двух-ярусной букве · отменённая формула «стоп гаснет, когда решён каждый терм» зачищена ГРЕПОМ — восемь носителей, включая два файла самого пака · снесена машинная таблица .bank-stop.json вместе с писателем и четырьмя тестами (читателя нет ни в одной зоне — свой греп; человеческая .bank-stop.txt не тронута) · банк-экспорт получил якорь свежести as_of+run_id (аддитивно на tm-bank-v1; «может быть устаревшим» больше не живёт только в логе). Доказательная база — FINDINGS §46; каталог мутаций 58 → 60 (FX23, FX24).

Пинги:

  1. Платформе/оркестратору: .bank-stop.json СНЕСЁН (мёртвая публикация упразднённого D39.144 пер-термного экрана) — платформенные журналы (platform-PROGRESS.md, STACK_DECISIONS.md) называют его атомарно-читаемым сайдкаром, упоминания устареют при лендинге.
  2. Потребителям банк-экспорта: документ несёт as_of (граница прогона) и run_id (тот же id, что стрим events.jsonl); аддитивно, старые читатели не ломаются; пустой run_id = «идентичности нет», не «текущий».

ИТОГ БЭКЕНД-СЕССИИ 27.08 — ДОФИКС-2 «ФЛАЖОК СТАНОВИТСЯ ФЛАЖКОМ» (docs/BACKEND_SEAM_FIX2_SESSION_PROMPT.md). Дерево готово, НЕ закоммичено; продолжает дерево паков 2425.08. Все 13 пунктов §4 закрыты: движок сам реализует модель D39.144 — стоп банка срабатывает только на кластер, которого ни один прежний стоп не предъявлял (персистентная память bank_stop_presented, схема v16); авто-провод неподписанных строк работает и при ПОДНЯТОМ флаге; отчёт двери собирается ОДНИМ конструктором по явному исходу (проекция · отказ · no-op · прерывание · записано · запись не удалась), версия отчёта → v2 (written_delta/written_rejects, mode refused/write_incomplete); полоса отказов получила два яруса и класс write_incomplete (exit 15); оба файла решений готовятся целиком до первого rename + fsync каталога; ключи mined_delta/mined_rejects СНЯТЫ (пути только конвенцией — МЕЖКНИЖНАЯ гонка недостижима, -пинг прошлого пака закрыт; воркфлоу-ревью нашло остаток той же оси: второй конфиг ТОЙ ЖЕ книги с другим объявленным project_db пишет те же файлы под другим локом, мимо flock живого прогона — пинг ниже, решение не паку); карта подписи пишется атомарно и несёт конверт map_version+map_id; шесть слепых пятен гейта закрыты пинами, проверенными посадкой. Поверх — воркфлоу-ревью (шесть полос × три скептика, FINDINGS §45): его две кодовые находки закрыты правками с пинами — --dry-run теперь отказ для всех глаголов без проекции (раньше translate --dry-run МОЛЧА запускал платный прогон), а повтор после отказа синка каталога держит класс 15, пока долговечность не пере-доказана. Доказательная база — backend/docs/SEAM_PACK_FINDINGS.md §§36§45; каталог мутаций 36 → 58 записей, 0 неожиданных исходов. Здесь — только требующее действия.

ПОРЯДОК ДЕПЛОЯ/ЛЕНДИНГА — зависимость НАПИСАНА, а не выведена (заказ §4.12):

  1. Движок первым, платформа второй. Сброс флага --verify-bank платформой (её персистентная колонка + особый случай в спавне, platform/internal/runs/spawn.go) может умереть ТОЛЬКО ПОСЛЕ лендинга этого пака: в обратном порядке каждая книга с поднятым флажком в день лендинга перестаёт писать авто-банк и пере-сидироваться ровно в режиме, ради которого флажок существует.
  2. tmctl migrate до прогонов (голова схемы v15 → v16): OpenReadOnly отказывает классом 13 всем непере-мигрированным книгам — ратифицированный порядок D39.134 п.3 это покрывает, но назван явно.
  3. Миграционная нота: после апгрейда память пуста → ОДИН доброкачественный стоп на первом verify-прогоне каждой книги.

ПИНГИ ЧУЖИМ ЗОНАМ (правок не делал):

  1. Платформе: у неё умирает сброс флага при resume (после лендинга движка — п.1 выше) · отчёт двери теперь v2 (tm-bank-decisions-report-v2: mode refused/stopped/write_incomplete, пофайловые written_*) — её readEngine выбрасывает stdout при ненулевых кодах, прежний пинг об этом стал острее: класс 15 БЕЗ отчёта неотличим от «ничего не легло» · новый exit 15 в полосе 1019 читается её ридером как refused по построению полосы — ратификация значения на оркестраторе при лендинге.
  2. Полигону: eval/bank_autonomy/parse_common.py парсит mined-signature.yaml — карта теперь несёт верхние ключи map_version/map_id (лежащие артефакты coldrun не тронуты; новые прогоны будут в новом жанре).
  3. Фронту: экран подписи, читающий signature.undecided из отчёта двери, обязан перестать трактовать его как «стоп не погаснет» — поле информационное (D39.144), контракт поля пере-описан в коде.
  4. Майнерский хвост за потолком структурно недостижим (§4.4, НЕ чинилось по заказу): потолок эмиссии (200) режет ранжированный пул ДО фильтров пригодности/сида/отказов (miner_emit.go, ranked[:emitRankCap] до emissionEligible). Пере-замерено своей командой (числа прежнего сплошного читателя в дерево не попали): 2354 ранжированных · 209 годных во всём алфавите · 11 в окне потолка · 198 невидимы постоянно; отклонение всех годных окна не подняло ни одного из хвоста (FINDINGS §38). Первоисточник замера — постоянный якорь-пин internal/miner/emissioncap_test.go: он утверждает ТЕКУЩЕЕ поведение и покраснеет в день сдвига потолка или порядка фильтров, приведя двигающего к этому пингу. Двигать потолок — трогать фрозен-паритет; отдельное решение.
  5. Гипотеза «подписание промахивается мимо чекпоинтов терминолога и пере-оплачивает роль» механизмом НЕ подтверждена (§4.13): память предъявленного входов чекпоинта не трогает; если перерасход существует — он существовал и до пака, отдельный предмет.
  6. Остаток оси арбитра (нашло воркфлоу-ревью, воспроизведено живьём): второй конфиг ТОЙ ЖЕ книги (один каталог, один book_id, другой объявленный project_db) пишет ту же пару файлов решений под ДРУГИМ локом — в т.ч. мимо flock живого прогона. Межкнижная версия снята конвенцией; эта — второй конфиг одной книги, т.е. рукотворная конфигурация оператора. Выбор лечения (второй арбитр на идентичности файлов решений или отказ при загрузке) трогает закон п.2 — решение не паку, пинг. Довод в коде сужен честно (bankdecisions.go, THE ARBITER).

ИТОГ БЭКЕНД-СЕССИИ 25.08 — ДОФИКС ТОЙ ЖЕ ДВЕРИ по приёмке (docs/BACKEND_SEAM_FIX_SESSION_PROMPT.md). Дерево готово, НЕ закоммичено; продолжает дерево пака 24.08, а не заменяет его. Все 16 пунктов §4 закрыты: блокер формата (дверь писала байты, которых её же парсер не читает, и любой следующий вызов по книге — включая проекцию — падал) · пред-существующие поломки чинятся по одной · два ключа на один путь · гарды флагов на ПРИСУТСТВИЕ (--decisions= уходил на ПЛАТНЫЙ путь) · кап документа решений · конверт путей на manifest --json · алиасы судятся по НАБОРУ · перевёрнутое окно глав · честность отчёта о стопе · SIGTERM · десять слепых пятен гейта · цепь целиком в репозитории. Доказательная база, замеры, попунктный чек и обе итерации ревью — backend/docs/SEAM_PACK_FINDINGS.md §§1430; здесь только то, что требует ДЕЙСТВИЯ.

-ЗАКАЗ ПРИЁМКЕ ИЗ ПАКА СНЯТ. Цепь «стоп → bank-apply → резюм → стоп ГАСНЕТ» теперь живёт в репозитории как $0-тест на фейковом провайдере (internal/pipeline/bankchain_test.go), на ОДНОМ проекте от стопа до погасшего стопа. Довод пака «своими силами невозможно, надо дойти оплаченной черновой волной» был шире правды: харнесс для этого уже был в репозитории. Мина №1 строки 199 (ливлок на status: auto) закрыта исполнением, а не рассуждением.

⚠ РАТИФИКАЦИЯ КЛАССА 14 — прежнее требование в силе, объём немного шире. Класс decisions_rejected теперь несёт и отказ по КАПУ (документ больше, чем движок применяет за один акт): это факт о ЗАПРОСЕ, а не о деплое, поэтому 10 был бы неверен. Носители полосы поднимает оркестратор при лендинге, как и планировалось.

ПИНГИ ДОФИКСА (правок не делал):

  1. exit 2 при OOM платформа читает как успех — общедвижковый класс; кап удерживает bank-apply от того, чтобы стать первым, кто до него доедет, но самого класса не снимает.
  2. Каталог книги без права записи даёт exit 1 (вне полосы). Класс движка корректен и одинаков у всех глаголов — чинить надо чтение кода 1 на платформе, которая списывает проблему прав ХОСТА в бюджет попыток КНИГИ.
  3. Проекция отвечает «что применится», а не «почём». Рекомендация — НЕ строить: глагол $0 по построению, поле «$0» было бы шумом. Решать оркестратору.
  4. Карта подписи не удаляется после погасшего стопа — пред-существующее; зафиксировано тестом как текущее поведение. Честный ответ на «есть ли что подписать» — новое поле отчёта signature.undecided.
  5. Цена глагола Θ(N²) по построению — каждый пер-решенческий помощник сканирует весь документ. Именно поэтому кап на КОЛИЧЕСТВЕ стоит на 5 000. Поднимать его без индексации этих сканов нельзя.
  6. Апстрим-дефект gopkg.in/yaml.v3 v3.0.1 (эмиттер пишет блочный скаляр, который его же парсер не читает) вылечивается по-настоящему только скаляр-типом схемы с явным стилем или переездом на go.yaml.in/yaml/v4 (релиз-кандидат, смена module path в ДВУХ зонах). Мой обход несёт ссылку на исходник библиотеки и характеризационный тест, который покраснеет в день починки апстрима.
  7. Фолд поверхностей Go-резидентный: internal/text/norm.go держит trad2simp и катакана→хирагана в Go, а не в langpack'е. Пара, которой в репо нет, деградирует до NFKC+lowercase — не блокирована, но это ровно тот класс, о котором ревью-вопрос общности. Шире двери, поэтому пингом.

⚠ ЧТО В ЗАПИСИ ПАКА 24.08 (ниже) УСТАРЕЛО — читать её через эту поправку.

  1. Пинг 2, «таймаут: 1.6с на 5 000 термов, 9.1с на 20 000» — ЧИСЛА НЕВЕРНЫ, и это ровно тот датум, которым платформенный пак будет мерить свой таймаут. Мой замер той же командой: 5 000 approve5.2 с, 20 000 → 50 с; на минимальных decline (самая дешёвая форма, и потому та, которой байтовый кап пускает больше всего) 5 000 → 11.3 с, 12 000 → 58 с, 28 900 → 308 с. Брать надо FINDINGS §18 и §29 п.1, не эти.
  2. Пинг 6 «однострочник при лендинге: документ решений не капирован» — СДЕЛАН. Капов теперь два (1 МиБ на чтение + 5 000 решений на применение), потому что байтовый не ограничивает время.
  3. Пинг 3 про флейки пере-снят сильнее: изолированный A/B против дерева HEAD даёт побайтно одинаковое падение с обеих сторон — FINDINGS §31.

ПИНГИ, КОТОРЫЕ ЖИЛИ ТОЛЬКО В FINDINGS И НЕ ДОЕЗЖАЛИ ДО ЖУРНАЛА (найдено проверкой согласованности): карта подписи пишется обычным os.WriteFile мимо атомарной конвенции сайдкаров того же пакета (пред-существующее) · цена доказывающего рендера ≈5 % времени, плюс notCanonical теперь тоже разбирает документ · опубликованные пути двух файлов решений не несут версионного конверта (пинг пака §10.5) · схема сида без omitempty (пинг пака §10.6).

⚠ Два пред-существующих -race-флейка в internal/store не тронуты (TestKillMinus9LosesAtMostOneCall, TestTheSeamIsNotChargedToTheStoreOperationBudget). База ДО правок, снятая на нетронутом дереве пака, уже была красной по первому — это моя собственная атрибуция, а не наследованная.

ПИНГ, КОТОРЫЙ ТРОГАЕТ РАТИФИЦИРОВАННЫЙ ЗАКОН (п.2) — решать не паку. Арбитр двери — flock на <project_db>.lock, а пишутся mined_delta/mined_rejects, которые book.yaml может направить куда угодно. Две книги с РАЗНЫМИ project_db и ОДНИМ delta друг друга не исключают: воркфлоу-ревью продемонстрировало гонку на 1500 одобрений с каждой стороны — одна сторона потеряла всё, exit 0, отчёт «применено». Внутрикнижную версию этого §4.3 уже запрещает; межкнижная законна сегодня. Выбор — второй арбитр или отказ при загрузке на путь вне каталога книги. В корпусе нарушителей нет. В коде стоит явное «арбитр покрывает проект, а не пути», а не молчаливое допущение.

🔧 В репозиторий добавлен инструмент: backend/cmd/tmmutate — харнесс мутаций с каталогом из 36 посадок, у каждой названо СВОЙСТВО, за которое она отвечает, и записан ожидаемый исход. Три сессии подряд писали такой инструмент в скретчпад и теряли его; приёмка при этом нашла восемь мест, где гейт был слеп. ⚠ Он дважды подводил и оба раза был починен по следу: сначала подсадил мутацию и прошёл собственную sha256-самопроверку (эталон второй правки снимался с уже пропатченного файла), затем считал КРАСНЫМ провал СБОРКИ — из-за чего две записи каталога, сломанные рефакторингом, целую итерацию числились пойманными тестами, которые не могли отработать. Теперь: одно чтение и запись на файл, отпечаток всего каталога перед каждой посадкой, зелёная базовая линия пакета ДО первой посадки и третий вердикт NOTHING, роняющий гейт. FINDINGS §25 и §34.

ИТОГ БЭКЕНД-СЕССИИ 24.08 — ПАК «ВХОДНАЯ ДВЕРЬ ШВА», движковая половина D39.156. Дерево готово, НЕ закоммичено, передаётся на лендинг. Заказ §4.1§4.6 выполнен: конвенционные дефолты mined_delta/mined_rejects (ключей не объявляет и файлов заранее не создаёт никто) · глагол tmctl bank-apply --config <book.yaml> --decisions <doc.json> [--dry-run] ($0, идемпотентен побайтово, всё-или-ничего, занятый flock — ровно 12 неблокирующе, ответ несёт версию и явное depth: edit_wave) · --keys-file у translate (строка 211) · строгость сид-загрузчика (212) · status_version + artifacts{} с абсолютными путями (213) · дефолт стендового корпуса маркерным резолвом (218, критерий оркестратора выполнен буквально). Вся доказательная база, замеры и попунктный чек промта — backend/docs/SEAM_PACK_FINDINGS.md; здесь только то, что требует ДЕЙСТВИЯ.

⚠ ТРЕБУЕТ РАТИФИКАЦИИ: заведён класс полосы отказов 14 decisions_rejected. Отвергнутый по существу набор решений ≠ сломанный деплой: platform/internal/ingest/exit.go DeploymentFault относит 10 к «условию, общему для всех книг хоста», и по 10 набор решений одного пользователя списался бы на оператора. Старый читатель деградирует безопасно (Refused(14)OutcomeRefused). 10 сохранён для документа, не прочитавшегося КАК документ решений. Гейт тотальности таблицы добавлен.

ЗАКАЗ ПРИЁМКЕ — единственный незакрытый замер (согласован со сторонним архитектором). Цепь целиком не гонялась ни разу: стоп красный → bank-apply → резюм → стоп гаснет. Части доказаны порознь, но мина №1 строки 199 — livelock уровня ЦЕПИ, которого частичные тесты по построению не видят. Снять не могу, и это проверено: банк-стоп на машине не воспроизводится (contrast_path → отсутствующий eval/exp16/data/jieba_dict_general_zh.txt, строка 123), а до стопа надо дойти оплаченной черновой волной. Команда: на КОПИИ книги на exit 3 скормить bank-apply документ на всю карту подписи, затем translate --verify-bank. ДЕФЕКТ — стоп снова с ТЕМИ ЖЕ поверхностями; не дефект — свежая пачка ≤200 термов реверс-секции (мина №3 строки 199). До этого прогона вердикт по циклу — PLAUSIBLE.

ПИНГИ ЗОНАМ И СЛЕДУЮЩИМ ПАКАМ:

  1. rubyToCandidates мёртв в проде — единственный вызов из теста (memseed_test.go:204); seeding.go:36-38 строит manualSrcs и никуда не передаёт (Go молчит: запись в map = использование). Строк Source:"ruby" в банке не возникает, а платформа держит для них ветку словаря (ingest/bank.go termOriginOriginAnnotated).
  2. Платформенному паку: первый контакт с непере-мигрированной книгой даёт exit 13 — воркер решений обязан планировать 13 → migrate → повтор · проекция берёт тот же лок, поэтому правка термина при живом прогоне даёт 12 даже на превью, на всю длину прогона · таймаут: 1.6с на 5 000 термов банка, 9.1с на 20 000, бюджет платформы на вызов движка — 60с (runs/reconcile.go:280) · bank-apply создаёт <project_db>.lock при первом касании никогда не запускавшегося проекта.
  3. ⚠ БАТАРЕЯ НЕ ДЕТЕРМИНИРОВАННО ЗЕЛЕНА, и это НЕ пак — прочесть ДО пере-рана. Два пред-существующих -race-флейка в internal/store срабатывают примерно раз на 24 полных прогона (go test ./... -race -count=1 ×4 → 1 чист, 2-й красный). Красное именно в этих двух тестах ожидаемо; любое другое красное — регрессия. Тесты НЕ трогал (D39.121). TestTheSeamIsNotChargedToTheStoreOperationBudget, TestKillMinus9LosesAtMostOneCall. Чередующийся A/B на git worktree HEAD: оба падают на HEAD не реже (kill9 2/30 против 0/30; seam 2/30 против 1/30; без -race 0/30). Покрытие: LockProject/Release этими тестами не исполняются вовсе. ⚠ 0/30 против 2/30 НЕ значит «пак улучшает» — на таком числе это шум (Фишер p≈0.5); достаточно того, что флейк живёт на дереве, которого пак не касался.
  4. Гейт TestDispatchCommandsCoversTheSwitch слеп к case с константой (считает только *ast.BasicLit) — команда, объявленная константой, невидима гейту, чей смысл в дефекте строки 176. Я вернулся к литералу (конвенция файла), дыра не эксплуатируется.
  5. redrive — платный путь без канала ключей аргументом. Промт: «флаг только у translate», сделано ровно так; канал у него есть (конвенционный .env), платформа его не зовёт. Развилка следующему паку.
  6. Однострочник при лендинге (не блокер): документ решений читается неограниченным os.ReadFile, тогда как платформа свои чтения от движка капает. Документ на 10 000 решений ≈2МБ ⇒ кап 116МБ.

⚠ ПРАВИЛА, ВЫНЕСЕННЫЕ ИНЦИДЕНТАМИ — для следующих сессий, не про этот пак. Прогон харнесса мутаций был убит таймаутом, finally не отработал, и посадка просидела в дереве ~40 минут, выглядя продакшн-кодом; сторонний ревьюер снял с него замеры и доложил несуществующий дефект. Поймал посадку собственный пин пака. Отсюда три правила: харнесс мутаций обязан фингерпринтить цели (починено) · снимай отпечаток дерева перед сборкой бинаря замера (на этом наступили обе стороны) · одиночный прогон — не замер (атрибуцию флейков я дважды вывел неверно из одиночных прогонов).

Что НЕ доказано: рантайм-вердикт по платному пути — PLAUSIBLE. Доказано, что ключ из --keys-file доезжает до заголовка и что без флага прогон отказывает конфигом; не доказано, что реальный провайдер примет ключ и что SaaS положит файл по этому пути — платформенная половина строки 211, чужая зона. Живой translate не гонялся: санкции на платные вызовы у пака нет. (24.08)

ПИНГ ОРКЕСТРАТОРА №19 — 23.08, ЗОНЕ БЭКЕНДА. Четыре движковых дефекта, все сверены моими командами.

  1. ОТВЕТ НА ПИНГ ПОЛИГОНА: дефект ПОДТВЕРЖДЁН, он ваш. Эскалация на Gemini теряет инъекцию банка памяти (строка 208). Механизм пере-проверен: pipeline/render.go:256-258=Role: "system", Content: injection, CacheBoundary: false штатно строит ВТОРОЕ системное сообщение, а llm/httpllm.go:517-523=func toOpenAIMessages(msgs []Message) []openAIMessage копирует сообщения дословно — склейки нет нигде. ⚠ Лекарство того же класса в проекте УЖЕ написано и работает для другого провайдера: llm/provider_anthropic.go:169-179=inSystemPrefix := true сворачивает ведущий system-префикс в одно поле. Не обобщено на Gemini — это и есть работа. Полигон ждёт ответа с 22.08 и починил у себя по вендор-доке; их находка верна.

  2. Род не производится авто-путём вовсе (строка 210, дополнена 23.08): замка ДВА и они независимы, а поле Gender в схеме сида УЖЕ есть — ось мертва в ПИСАТЕЛЯХ, не в формате.

  3. Выпавший член юнита исчезает из отгружаемых байт БЕЗ внутритекстового маркераpipeline/waverun.go:487-490=the flagged member is DROPPED from the edit. Родня строки 193; для читателя это молчаливая дыра в тексте.

  4. Загрузчик сида НЕстрогий (строка 212): голый разбор YAML без проверки имён ключей, и seed-lint этого не видит. Опечатка в имени поля молча теряется — в файлах, которые владелец правит руками чаще всего.

⚠ Плюс строки 211 (движок на SaaS не получает провайдерских ключей — блокер живого прогона) и 213 (платформа дублирует вашу конвенцию пути): обе половинные, движковая часть ваша.

ПИНГ ОРКЕСТРАТОРА №20 — 22.08, ЗОНЕ БЭКЕНДА: три ваших дока разошлись с деревом (аудит доков, сверено кодом; рукой не лезу — ваша зона).

  1. backend/README.md, карта пакетов объявлена сверенной по коду, а в ней НЕТ internal/runevents — эмиттера журнала прогона, то есть ВСЕГО шва движок↔платформа (D39.131), — и нет второго бинаря cmd/tmvet. Греп: runevents и tmvet в файле по нулю вхождений, при том что оба каталога в дереве.
  2. backend/README.md, «Известный техдолг» держит живыми Cyrillic-хардкоды DC-чекеров, которые сам код называет ПОГАШЕННЫМ долгом (фаза 2 общности, D39.64: isRuTarget удалён, TargetActive/TargetScriptNonLatin), и оба его file:line-якоря указывают мимо.
  3. (дописано 24.08) backend/README.md:47=/home/ubuntu/books/gu-zhenren/ зовёт книгу-стенд по МЁРТВОМУ пути /home/ubuntu/books/gu-zhenren/ — каталога нет ни там, ни в $HOME: книги переехали в <репозиторий>/books и версионируются своим git (D39.157 п.2). Там же фраза «тексты и производные ВНЕ git» стала неточной: вне ЭТОГО git. Тем же касанием — три тест-хелпера, резолвящие корпус от $HOME/books (строка 218); они уже в заказе движкового пака шва §4.6, так что дублировать правку не надо, но док обязан сойтись с ними.
  4. backend/docs/components.puml — диаграмма, которую карта доков продаёт как правимую «одним коммитом с кодом», отстала примерно на месяц: старый exit-контракт (без 4/5 и полосы 1019), неполный список глаголов CLI, удалённый паком-17 failover.go и ни следа эмиттера. ⚠ Рендерить её в svg/png НЕ надо (гардрейл) — править исходник.

(Пак «честные числа и статусы» — ИСПОЛНЕН, ПРИНЯТ С ФИКС-ЛИСТОМ и ЗАЛЕНДЕН f840867 (17.08; D39.149, ФЧ-5 — D39.150). Отчёт, две волны адверсариального ревью, мутационная приёмка и тело фикс-листа ФЧ-1…ФЧ-8 — в archive/PROGRESS-2026-08-17.md; живой остаток — строка бэклога 197.)

(Пинги закрытых паков — фикс-пак банка D39.118, блокеры контракта D39.122 — в archive/PROGRESS-2026-08-04-09.md, D39.125.)

(Закрытые бэкенд-записи 0102.08 — общность фаза 2 · качество банка (оба этапа) · фикс-пак банка · finding-1 · пакет-чекеров · мелкая пачка · coldrun-b · ручка эффорта — в archive/PROGRESS-2026-08-01-02.md.)

(Закрытые бэкенд-записи 1415.08 — эмиттер шва (D39.131) · tmctl migrate (D39.134) · пере-пин цен DeepSeek (D39.137) — в archive/PROGRESS-2026-08-14-15.md; вынесено D39.139.)

(Закрытая хроника пакетов №0№4 (0410.07) перенесена в archive/PROGRESS-2026-07-04-10.md — ревизия D31.)

(Хроника пакетов 1112.07 (пакет-5, D15.2-этап-А, санитайзер-фикс D33) — в archive/PROGRESS-2026-07-10-13.md.) (Трек-A пак-1/1.5 (D39.2/D39.5) — см. записи оркестратора №6 выше.)

(Хроника бэкенд-паков 1116 (1925.07, вкл. отчёт-запись пака-15) — в archive/PROGRESS-2026-07-13-25.md; отчёты паков — archive/reports/.)

(Закрытые записи 2531.07 — пак-18 · мини-прогон · фикс-пак · сквозная проверка · хендофф 26.07 · ресёрч общности фаза 1 — в archive/PROGRESS-2026-07-25-31.md.)

Полигон

ИТОГ ПОЛИГОН-СЕССИИ 23.08 — ШАГ 1 ПЛАНА 22.08 ЗАКРЫТ (панель-0, $0). Отчёт — секция Д32 docs/experiments/23-editor-tier.md; фризы bedc39a, 9e33a1b. Кратко:

  • Снят блокер сборки: rol.py не знал арма E6 (клетки чужой фазы ФД-G, другая схема), и неизвестное имя молча возвращало ПУСТУЮ строку — панель собралась бы из скольких-то глав без единого слова в лог. Заведён реестр FOREIGN, гейт клетки по СОДЕРЖИМОМУ, неизвестный арм = СТОП; гейты проверены фальсификацией (обезвредил гейт — селфтест краснеет).
  • ЛАТЕНТНАЯ МИНА ДВУХ КОНТУРОВ ВЫСТРЕЛИЛА. Селфтест предупреждал с 22.08 («до данных не добралось»); 23.08 добралось: wire('en') настраивал один экземпляр, а free_text шёл в другой и вернул пустой текст английской главы. Починено в корне (rol._wire включает оба).
  • Вердикт Шага 1 (интеракция «архитектура × жилец на ИСПЫТАННЫХ жильцах», не минимакс): слабый жилец glm-5 РЕДАКТОРОМ над боевым черновиком неотличим от боевого deepseek-v4-pro в той же роли (разрыв средних мест +0.00, p=0.80; дефект-классы 0 различия; «машинных» глав 3/16 у обоих). Тот же жилец ОДНОПРОХОДКОЙ различимо хуже: +1.12 места при пороге 0.99, знаковый p=0.0042 (конъюнкция пройдена) и +13 фаталов, p=0.0312. Буфер существует и замерен.
  • Два независимых прибора сошлись на КАЖДОЙ главе: детерминированный счётчик дефект-классов (новый eval/dovodka/schet.py) и слепое чтение назвали одни и те же дефекты одними словами.
  • ДЛЯ БЭКЕНДА, находка под метавопрос: в 2 окнах из 8 с первым лицом пол рассказчика по главе НЕ УСТАНАВЛИВАЕТСЯ вовсе (эталон снят вслепую тремя независимыми чтениями на главу). Тот же голос ведёт другие главы, где пол очевиден ⇒ закрыть эти ~25% может ТОЛЬКО книжная память. А в ~/books/role-topology/bank-en.json полей пола НЕТ (25 терминов, поля dst/rx/manual/why — проверено файлом). Это смыкается с пингом №19 ниже и со строкой бэклога 210.
  • Долг В21 (сверка кассы двумя путями) ИСПОЛНЕН, результат отрицательный: сверка на диске НЕВОЗМОЖНА в принципе — cost_usd вычисляется нашим же roster.cost (buy.py:93-95), а не приходит от вендора. У четырёх вендоров из шести арифметика сходится до последнего знака (213 клеток); у DeepSeek расхождение объясняется пере-пином 16.08, а «офф-пик = ½» в записанных ценах НЕ НАБЛЮДАЕТСЯ. ⇒ вопрос владельцу: сверить $17.04 с реальным счётом DeepSeek может только он.
  • Агент-сессий: 114 из 200 (16 читателей панели-0, заняты runs.py --claim до запуска, закрыты после). Денег не потрачено: панель целиком на уже купленных клетках.

ПИНГ ОРКЕСТРАТОРА №19 — 22.08. ЖИВОЙ ДЕФЕКТ ДВИЖКА: эскалация на Gemini ТИХО ТЕРЯЕТ ГЛОССАРИЙ. Найдено полигоном живой пробой, подтверждено вендор-докой. OpenAI-совместимый слой Gemini принимает РОВНО ОДНО системное сообщение; лишние выбрасываются молча, без ошибки. Механизм назван вендором: в нативном API systemInstruction — один объект Content (ai.google.dev/api/generate-content), поэтому уход на нативный API проблемы НЕ решает — склеивать надо в любом случае. Замер (один и тот же системный текст 7970 знаков): одним сообщением → prompt_tokens 2994, маркерная инструкция ИСПОЛНЕНА; двумя → 535 токенов и инструкция НЕ исполнена, при finish=stop и внешне правильном переводе. Отказа нет — есть тихая потеря промта, невидимая гейтам годности.

Почему это ваша зона, а не наша. backend/internal/pipeline/render.go:256-258 штатно строит ВТОРОЕ системное сообщение — инъекцию банка памяти (глоссарий/STM); backend/internal/llm/httpllm.go:517-522 (toOpenAIMessages) копирует сообщения дословно; склейки под Gemini нет нигде. При этом gemini-3.1-pro-preview стоит в ратифицированной цепочке эскалации во ВСЕХ арм-конфигах (backend/configs/pipeline-c1.yaml:129, pipeline-arm-glm.yaml:61, pipeline-arm-deepseek-pro.yaml:62, pipeline-arm-mistral.yaml:61). ⇒ любой эскалационный хоп на Gemini при непустой инъекции теряет глоссарий, и книга едет без канона имён. Оговорка D22.3 «экспозиция Ф1 нулевая» держится только на том, что до Gemini в дефолте не доходят — то есть на маршруте, а не на коде. ⚠ Класс в проекте УЖЕ решён рядом: backend/internal/llm/provider_anthropic.go:169-179 сворачивает ведущий system-префикс в одно поле и падает громко на system посреди диалога. Не обобщено на Gemini. Полигон у себя починил склейкой по вендору (eval/dovodka/rol.py ONE_SYSTEM/fit_msgs); в бэкенд рукой не лезу. Квирк записан в 00-provider-quirks.md (наша зона) с механизмом и ссылками.

Тем же касанием — две поправки в квирках, обе наши прежние ошибки, уже внесены нами: (1) форма extra_body.google.thinking_config... в бюллетене НЕ доезжает через openai-SDK: вендорская форма несёт ключ extra_body на верхнем уровне тела (extra_body={'extra_body': {'google': …}}), а один уровень даёт HTTP 400 «Unknown name "google"». Из-за этой ошибки eval/providers.json:59 объявил рабочую форму багом, и проект три недели считал, что ручки размышления у Gemini нет. (2) reasoning_tokens=0 у Gemini — НОРМА слоя, а не измерение: вывод «размышление выключено» из этого поля недействителен, считать надо total prompt completion. У серии Gemini 3 размышление вообще невыключаемо (вендор, 17.08.2026).

⚠ Пинг оркестратора №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 (⚠ испр. 20.08: первая редакция пинга приписала flash кэш-хит pro — ошибка ×3.1 ровно в той клетке, ради которой пинг и писался; сверено с backend/configs/models.yaml:167,183=cached_per_m и телом D39.137 §2а), и счёт шиппинга = 100% DeepSeek ⇒ ×4.24.4 в пике. Квирки — ваша зона, рукой не трогаю; поправьте при ближайшем касании, потому что по ним считают деньги проб. ⚠ И ВТОРОЙ факт тем же касанием, он сейчас БЕЗДОМНЫЙ: у DeepSeek цена ходит окнами — пики UTC 0104 и 0610 вдвое дороже долин, платное планировать в долины. Факт куплен замером и жил в справочнике ролевого промта; я оттуда его убирал как вендор-специфику, а в квирках его НЕТ (греп по peak|долин|пики UTC = 0), то есть указатель вёл в дом, который факта не несёт. До вашего переноса держу копию в ролевом промте с явной пометкой. ⚠ Третья, и она самая дорогая по цене ошибки: eval/README.md первой врезкой держит СТОП на платные прогоны — «Платные прогоны/докупки СТОП до ре-пробы (бэклог-строка 74)». Строка 74 закрыта (D39.95), ограничение пало лендингом 112 (D39.97), pipeline-c1.yaml несёт reasoning: "low" с объяснением, а зона всё это время платно гоняет фазу Д. Врезка объявляет запрещённым то, что зона делает ежедневно, — и этим обесценивает все прочие ⚠ в файле. Живым из неё остаётся только ⚠0731 (смена весов под слагом) и стохастичность эха.

Тем же касанием — вторая протухшая клетка справочника, найденная аудитом доков 22.08: квирки утверждают, что веса deepseek-v4-pro вендором не тронуты. Это боевой РЕДАКТОР и апекс эскалации, и по нему у нас прямое расхождение двух носителей, которое до сих пор не снято: docs/STACK.md говорит «ручки эффорта у pro НЕТ (lowhigh), так говорит квирк-канон», а CURRENT-STATE — «у pro эффорт стал настраиваемым low/high/max, квирк 3а устарел». Из репозитория правая сторона НЕ выводится: замера поведением после 13.08 нет ни у одной стороны. Закрывается вендор-сверкой, а не выбором стороны — и вы это только что делали по Gemini, то есть заход дешёвый.

⚠ Прежняя редакция этого пинга просила вас сверить расхождение по «возражению Sol» — расхождение снято 22.08 срезкой хроники, второй носитель уехал в archive/PROGRESS-2026-08-10-15.md; сверять больше нечего, пункт живёт один и висит на владельце.

ПИНГ ОРКЕСТРАТОРА №20 — 22.08, ФАКТЫ О СОСТОЯНИИ ДЕРЕВА ЗОНЫ (снято командами, не решение). Аудит доков спрашивал у дерева, а не у записей, и картина такая: 13 отслеженных файлов eval/ изменены и не закоммичены (+2166/79 строк), плюс 6 неотслеженных, из них в рабочем каталоге фазы eval/dovodka/ вне git — naklon.py · ja6.py · HANDOFF-21-08.md · PLAN-16-08.md · PLAN-17-08.md · КОНТЕКСТ-ДЛЯ-КОНСУЛЬТАЦИИ.md. Почему это пинг, а не правка. Диспозиция D39.135 п.4 («полигон работал 16.08 БЕЗ записи в журнале — PLAN-16-08.md, ja6.py, naklon.py; состав выяснять при лендинге») висит шестой день, а состав за это время вырос с трёх файлов до девятнадцати. Прямое следствие, названное без оценки: из чистого клона репозитория часть фазы сегодня не воспроизводится — в частности naklon.py, гейт позиционного наклона, вне git целиком. Зона живая, приёмка фазы — у ПАРАЛЛЕЛЬНОГО оркестратора, поэтому я ничего не коммитил, не переносил и не удалял: решает владелец или он. ⚠ Тем же аудитом: eval/README.md описывает каталог dovodka/ ОДНИМ файлом runs.py, тогда как там сорок скриптов и главный инструмент фазы; docs/experiments/README.md объявляет себя сведённой «до эксп-22», а строк для 22 и 23 в ней нет ни одной. Обе правки — зонные, рукой не трогаю.

ФАЗА Д «ДОВОДКА ЭКСП-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 — две передачи ПАРАЛЛЕЛЬНОМУ оркестратору (приёмка фазы Д — его зона, №17 полигон не трогает по слову владельца). (1) Просьба хендоффа фазы Д «эррата zh-канона: пере-сборка = правка закрытой оси, ратифицирует оркестратор» (POLYGON_PHASE_D_HANDOFF.md:84-86, завышение +0.0039, вердикты не двигает) — диспозиция №17: к параллельному при приёмке, не к движковому. (2) Мелочь аудита корпуса 15.08: 23-editor-tier.md:2243 цитирует «PROGRESS.md:346» для потолка $4.50 — фактически строка была :348; учесть при приёмке тел. Санкции владельца по деньгам фазы и замене ja-книги уже записаны (D39.136 п.1, CURRENT-STATE).

(Память · Голос и состояние · Ридер-IDE — ЗАКРЫТЫЕ секции (D39.125): темы исполнены/переехали в зонные журналы; хроника — в архив-слайсах. Фронт пишет ТОЛЬКО в frontend-PROGRESS.md.)