1334 lines
484 KiB
Markdown
1334 lines
484 KiB
Markdown
# Журнал решений оркестратора — контракт D1–D39.170 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
|
||
|
||
> **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто:
|
||
> ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+).
|
||
> ⚠ **Эррата 15.08 (D39.132):** D39.131 п.2(а) перечисляет полосу отказов «10 конфиг · 11 источник · 12 лок · 19 безымянный» — читать через D39.132 п.2(г): полоса ДОПОЛНЕНА **exit 13 = `schema_mismatch`** (~~обе зоны сошлись на числе независимо~~; ратифицирован направлением, ФИНАЛИЗИРОВАН приёмкой D39.134).
|
||
> ⚠ **Эррата 15.08-б (D39.134 п.2а, вписана по аудиту корпуса):** клейм «зоны сошлись на 13 НЕЗАВИСИМО» (строкой выше и в D39.132 п.2г) СНЯТ — платформа прочитала число из незакоммиченного дерева движка и сама это записала (`platform/internal/ingest/exit.go:63-64`); на силу ратификации не влияет.
|
||
> ⚠ **Эррата 15.08-в (D39.136 п.5):** форма контракт-ревью «фазный воркфлоу оркестратора» ОТМЕНЕНА словом владельца тем же днём — исполняет ОТДЕЛЬНАЯ СЕССИЯ со своим онбордингом (норма D39.120 п.2; оркестратор — автор части ратификаций 0.2.3, author≠reviewer); запущенная воркфлоу-фаза 1 остановлена, её результаты выброшены; промт — `docs/CONTRACT_REVIEW_SESSION_PROMPT.md`.
|
||
> ⚠ **Эррата 16.08-д (D39.144 п.3) — ЧИТАТЬ С ПОПРАВКОЙ 22.08:** её хвост «гейт полноты УЖЕ ОТЛИТ в коде платформы, демонтаж заказан» ПРОТУХ — пер-термный write-путь банка СНЯТ зоной 22.08 целиком (`PD-370`, D39.154), гейта полноты в коде платформы больше нет, а якорь хвоста указывает в чужой код. Живой остаток вопроса — ДВИЖКОВЫЙ пер-термный гейт (`mining.go`), он сегодня лишь обойдён, и это строка бэклога 203(з). Тело эрраты ниже не переписано (D23.3).
|
||
>
|
||
> ⚠ **Эррата 16.08-д (D39.144 п.3):** клейм «`bank_decisions_incomplete` в файле 0» проверял ТОКЕН, а не ПРАВИЛО — четыре места канона/компаньона продолжали нести снятый гейт полноты прозой (`BankDecisionsResult.complete` «stop clears ONLY on a complete set» · `BankPage.complete` «can be cleared» · компаньон §2.14 и А-2); дочищены 16.08 при пересборке промта P7 (нашёл опровергатель промта). Плюс факт, который D39.144 не назвала: гейт полноты УЖЕ ОТЛИТ в коде платформы (`internal/runs/reconcile.go:934-938`) — его ДЕМОНТАЖ заказан P7 явным пунктом.
|
||
> ⚠ **Эррата 16.08-г (D39.138 п.2а, часть «TermStatus снять с провода»):** ОПРОКИНУТА пост-ревью АВТОРА отчёта research/28 (по заказу владельца, речек оркестратора уликами): обоснование Б-0 «ни один экран их не рисует» подменяло «экрана подписи ещё НЕТ» — ось статуса ПРОДУКТОВАЯ (спека `:1070-1072`: «главный фильтр работы» S5; шов клиента уже потребляет — `frontend/src/api/vocabulary.ts:159-163`). Читать так: ось `TermStatus` ОСТАВИТЬ, движковые слова значений переименовать в продуктовые; «`TermOrigin` снять/переименовать» (`ruby` — паро-специфика) — В СИЛЕ. Контекст метода: Б-0/Б-11а/Б-23 добавлены в отчёт ПОСЛЕ раунда адверсариального судейства сессии — их основания проверять строже (помечено в ревью-шапке отчёта).
|
||
> ⚠ **Эррата 20.08 (D39.153 п.7б):** D39.144 п.2 атрибутирует пер-термный гейт полноты банка «изобретению КОНТРАКТНОЙ линии (Ф-14 → спека → 0.3.0)» — верно про ГЕЙТ и **неверно про ФОРМУЛУ**. Формула «стоп очищается, когда каждый терм промоутнут ИЛИ отклонён» родилась 19.07 В ДВИЖКЕ как лечение ливлока R1-FL-B (отклонённый терм переспрашивался каждый прогон — тело D39.19, слайс `../archive/architecture/05-decisions-D39-arch-reset.md:22`) и живёт там до сих пор (`backend/internal/pipeline/mining.go:80-82,243`); контрактная линия 04.08 переписала её дословно и вывела из неё ЭКРАННЫЙ гейт — счётчик «решено N из M» и запрет продолжить (коммит `16e20e5`, `frontend/docs/API_CONTRACT_INPUT.md:258-264`). **Следствие, из-за которого эррата несущая:** снимая гейт, D39.144 адресовала только контракт, поэтому движковая половина осталась БЕЗ явной отмены — она сегодня ОБОЙДЕНА платформой (флаг не передаётся на resume), а не устранена; носитель — строка 191(б), развилка — строка 203(з).
|
||
> ⚠ **Эррата 27.08 (D39.158 п.7):** D39.153 п.7б объявляет «ОСТАТКА-РАТИФИКАЦИИ НЕТ… гейт проверяет полноту ФАЙЛА решений, а не подписей, и ОДИН файл со всем банком его снимает — конфликта с моделью владельца нет». Читать так: диспозиция отвечала на вопрос «снимает ли гейт один файл» (снимает) и верифицировала СОСТАВНОЕ поведение — платформа снимает флаг, движок уходит по авто-ветке. Вопрос «работает ли флажок БЕЗ обхода» ею не закрывался, и заказанное той же строкой 191(б) «ослабить границу самой паузы» исполнено не было. Исполнено D39.158: движковая половина УСТРАНЕНА, не обойдена.
|
||
> ⚠ **Эррата 27.08-б (D39.158, страница `18-bank-ontology.md`):** названный там класс дефекта «проекция без потребителя и без якоря свежести» на момент ратификации имел ОДИН ярус и не судил носитель с ДВУМЯ писателями и нулём читателей. Дописан второй ярус: расхождение писателей ничем не судится, пока читателя нет, а в день его появления СТАНЕТ семантикой, разрешаемой задним числом по накопленной истории. Найдено платформенной сессией при вычитке приёмки D39.159 (живой член — `PD-396`); правило «у источника РОВНО один писатель» с этого дня читается в обе стороны.
|
||
> ⚠ **Эррата 27.08-в (D39.158 п.1):** «движок исполняет продуктовую модель сам» сказано без ратифицированной ОГОВОРКИ — правка ОТДЕЛЬНОГО термина через дверь доступна только для mined-термов; правка СИД-терма дверью отклоняется по имени (`internal/membank/decisions.go:359`), потому что это перенос базового снапшота и пере-оплата черновой волны — другое решение (щель ратифицирована, строка бэклога 192). Ещё три места, где модель шире кода, названы строками: окно глав одним решением не правится (named-узость v1) · банк-экспорт на стопе пуст (224) · «полный останов» — это граница ПЕРЕД редакторской волной, черновая довершается (S16). Найдено вычиткой старшего при ревью D39.159.
|
||
> ⚠ **Эррата 27.08-г (D39.159 п.8):** отказ от правки `n != shape` СТОИТ, но обоснование было шире истины — «краснит семь ЗАКОННЫХ строк» неверно для двух из них. `PD-99` несла корректно markdown-экранированные черты (виноват был парсер, не строка), а `PD-197` — сырую черту в регексе, которая молча сдвигала ВЕС, потому что он читался с конца, а от конца далеко. Названный там остаточный риск ПОСТРОЕН 27.08 на эмпирике зоны (три молчаливых случая за двое суток): парсер уважает экранирование · вес регистра читается с НАЧАЛА · гейт `tail_vocab` судит словарь хвоста. Проверено подсадкой; числа не сдвинулись. Строка `PD-398` остаётся открытой на отсутствие автоматического пина у самого гейта.
|
||
> ⚠ **Эррата 27.08-д (D39.159 п.7) — норма §3 п.8 применена к СОБСТВЕННОМУ бэклогу, три строки переsуждены.** Свип грепом по путям лендинга `d1eb8a9` нашёл, что лекарство трёх строк уже в дереве. **212 ЗАКРЫТА и снята с таблицы:** голый `yaml.Unmarshal` заменён строгим `seed.DecodeFile` (`internal/membank/memseed.go:51`, код называет строку по номеру), пин двойной — `internal/seed/decode_test.go:16` и `internal/membank/seedlint_test.go:39`. **218 ЗАКРЫТА и снята:** три тест-хелпера снесены, `miner_parity_test.go:35` говорит «the old $HOME/books address is dead». **199 СУЖЕНА:** движковая половина цепи доставки правок банка ПОСТРОЕНА, открыт только платформенный конец (пункт 2в очереди) — прежняя формулировка «канал НЕ построен» отправляла бы следующий пак строить построенное. Бэклог 177 → 175. ⚠ Норма окупилась на своём авторе в тот же день, что и на чужом.
|
||
> ⚠ **Эррата 27.08-е (D39.159 п.8, финал): `PD-398` ЗАКРЫТА — у построенного гейта появился пин.** `selftest_tail_vocab()` гоняется на каждом `--check`, четыре утверждения, проверен ПОСАДКОЙ трёх мутаций самого гейта (все три пойманы, базовая линия молчит). ⚠ Первая редакция пина молчала на одной из трёх: утверждение про вес проверяло `cells()`, а мутация меняет то, чем пользуется `register()`. Пин, проверенный одним прогоном вместо посадки, — ровно тот класс, который эта строка описывает; поймано только потому, что посадку сделал. Регистр 96 → 95 открытых.
|
||
> ⚠ **Эррата 27.08-ж (D39.160 п.2) — ошибка ОРКЕСТРАТОРА, найденная исполнителем пака.** Нота утверждала, что после сноса отменённой двери «канон и деплой СОВПАДУТ точно», а промт минора (§3.2-бис) — что счётчики `pending_decisions`/`complete` «навсегда нули». **Верно по ПУТЯМ, неверно по ПОЛЯМ:** проекция `GET /bank` продолжает их слать, и это не нули — `bankCountsTx` (`platform/internal/pgstore/readmodel.go:330`) считает `proposed`-строки, о чём говорит её собственный комментарий. Клиент 0.5.0 лишние поля игнорирует, но аллоулист-норма нарушена до монтажа (2в). Носитель — `PD-399`. ⚠ Контрактная сессия принесла это ПИНГОМ по §11 промта, вместо того чтобы тихо подогнать работу под неверную посылку; это и есть поведение, которого норма требует.
|
||
> ⚠ **Эррата 27.08-з (D39.156, состав пункта 2в): «воркер решений → глагол перед возобновлением» СНЯТ — посылка изменилась.** Пункт писался, когда двери в контракте не было и подразумевалось НАКОПЛЕНИЕ: платформа копит решения у себя и скармливает их движку перед `resume`. С дверью канона 0.5.0 накопления не существует — правка ПРИМЕНЯЕТСЯ в момент подачи, и гарантия «до возобновления» у синхронной формы СИЛЬНЕЕ воркерной: применено прежде, чем клиент получил `200`. Проверено исполнением с обеих сторон: движок на стопе ВЫХОДИТ (`cmd/tmctl/main.go:95`, код 3), флок не-блокирующий и отпускается ядром на выходе процесса (`store/store.go:187`), между стопом и возобновлением живого процесса на проекте нет — запинено `pipeline/bankchain_test.go:62-64`; кап 5000 решений выведен ИМЕННО из синхронности («the call stops fitting the caller's timeout»). Остаётся не воркер, а пер-книжная сериализация в обработчике. `Resume` «с решениями как они есть» не тронут.
|
||
> ⚠ **Эррата 28.08-и (D39.165 §3, размер мины) — ошибка ОРКЕСТРАТОРА, найденная опровергателем промта P10.** Нота утверждает: «первый же ПРОДОЛЖАЮЩИЙ прогон после первой же правки банка УПАДЁТ». **Переоценено.** Гард снапшота стреляет по СУЩЕСТВУЮЩЕМУ джобу (`backend/internal/pipeline/stagerun.go:47` — `EnsureJob` создаёт джоб стадии в момент, когда стадия впервые исполняется), а правка в ГЛАВНОМ окне — стоп подписи `awaiting_bank` — двигает edit-снапшот, когда edit-джобов ЕЩЁ НЕТ: возобновление создаёт их свежими, и гард молчит. Драфт-волна mined-строк не видит вовсе (`seeding.go:143-153`). **Дефект СТОИТ, но его триггер уже: правка, сделанная ПОСЛЕ появления edit-джобов** — пауза потолком посреди редактуры и ДОЧИТАННАЯ книга. ⚠ Срочность при этом НЕ падает: флагманский случай продукта («поправил имя героя в дочитанной книге») — ровно тот, где edit-джобы существуют, то есть мина бьёт именно по нему. **Цена ошибки была бы прямой:** репро на потоке `awaiting_bank` показало бы ЗЕЛЕНЬ без фикса, и пак мог быть отозван как мнимый. Промт P10 §4.2 исправлен: репро обязано фиксировать состояние «edit-джоб существует ДО правки».
|
||
> ⚠ **Эррата 28.08-к (D39.165 §3 + решение оркестратора о глава-полосе) — ДВЕ ошибки, обе найдены широким самопроходом платформенной сессии, обе доказаны исполнением.** **(1) Посылка «смета УЖЕ публикуется в `status --json`» верна только ПОСЛЕ свёртки.** `bank-apply` пишет только ФАЙЛЫ решений, а `status` считает ре-билл от СОХРАНЁННОГО глоссария (`backend/internal/pipeline/status.go:733-744`, `projectStoredMemory` — его собственный комментарий: «A seed-FILE edit not yet re-run is NOT reflected here… that drift surfaces on the next translate's re-seed»). Свёртка происходит внутри СЛЕДУЮЩЕГО `translate`, поэтому сразу после правки движок отвечает `units=0`/`drift=false`. Следствие: продажа «затронуто N юнитов» и холд от сметы В ТЕКУЩЕМ ШВЕ НЕДОСТИЖИМЫ — для них нужен движковый глагол «свернуть банк и оценить ВНЕ translate», которого нет. **(2) Решение оркестратора «полоса пере-прохода — в ГЛАВАХ» ОТМЕНЯЕТСЯ: его посылка опровергнута.** Я рассудил, что $0-репин двигает полосу, потому что идёт через тот же `resumeFromChunkStatus`, — и не проверил анонс. Движок анонсирует юнит ОДИН РАЗ на жизнь книги (announce-once, `backend/internal/pipeline/events.go:49,143-162`), пере-проход не ре-анонсирует ни репины, ни пере-переводы ⇒ `done` остался бы НУЛЁМ навсегда. Это ровно тот класс, от которого предостерегает памятка «не выводить из соседнего механизма, не проверив свой». ⚠ **Что при этом НЕ отменяется:** запрет класть ЮНИТЫ в поле, объявленное в главах, стоит — но объявленная в каноне «одна единица работы» запретом не является, потому что она НЕ молчаливая.
|
||
|
||
> ⚠ **Навигация (актуализация 07.08, эра D39.1xx):** append-only-дисциплина (D23.3) означает, что
|
||
> НЕВЕРНЫЙ ФАКТ внутри старой ноты не переписывается, а получает эрратау — и тогда он опасен ровно
|
||
> тем, что грепающий его найдёт ПЕРВЫМ, а эрратау ниже может не дочитать. Поэтому поправки к фактам
|
||
> живут ЗДЕСЬ, в карте, а не только в хвосте: **D39.109 п.3 читать через D39.112 п.2(а)** («30 суток
|
||
> — не буква NIST: SHALL требует установить overall-таймаут, 30 суток это SHOULD; сбрасывает ли его
|
||
> успешная ре-аутентификация, NIST не говорит — наш жёсткий предел это НАШ выбор, строже нормы») ·
|
||
> **D39.109 п.4 читать через D39.106 п.3** (PD-59 superseded, пайп-путь `supervisor.go` = дев-режим)
|
||
> · **D39.109 п.1 и «живой уязвимости не нашла» читать через D39.112 п.2(в)** (отказ в обслуживании
|
||
> входа ЕСТЬ — PD-80) · **D39.110 п.1 «дословно по смыслу» читать как ПЕРЕСКАЗ** решения, не цитату ·
|
||
> **D39.108 (продуктовый вывод «второй проход на dspro отрицателен», эксп-20 §5.2 «со слов») читать
|
||
> через D39.117 п.4** — опровергнут эксп-21 честным ригом: `A/F3` +2.50 Holm 0.0004, топология
|
||
> подтверждена, жильцы неразличимы · **D39.113 (таблица потерь: «правки промта — параллельный
|
||
> оркестратор») читать через D39.117 п.7** — ошибочная атрибуция: правки параллельного не терялись
|
||
> (его HEAD — финальная версия); чьи модификации были в дереве — достоверно неизвестно.
|
||
|
||
> ⚠ **Навигация (актуализация 04.08):** два supersede-указателя эры D39.9x: **D39.88/D39.84 п.8 (право самокоммита фронта/платформы) → отозвано, коммитит ТОЛЬКО оркестратор** (D39.98 п.3; тела переписаны на месте с санкцией владельца, pre-rewrite — git `2b166b7`) · **норма 30.07 «короткая приёмка» → амендирована владельцем 03.08: приёмка всегда адверсариальная** (носитель — промт оркестратора §Анти-паттерны + D39.101 п.1) — упоминания «короткой приёмки» в телах читать через эту пометку · **двухсекционная редакторская инъекция и смягчающая роль маркера ⟨проверить⟩ → доктрина инжекта D39.104**: банк на проводе = ЗАКОН для всех ролей независимо от статуса строки, право «перевести иначе» упразднено, блок редактора — ЕДИНЫЙ, маркер с провода снимается (статусы строк и подписная таблица не меняются; внесение в движок — строка 134 после пробы 18) — упоминания двухсекционки/смягчения в телах читать через это.
|
||
> ⚠ **РЕЕСТР ВСЕХ НОТ (карта актуальности v2) — [`05-decisions-index.md`](05-decisions-index.md):** одна строка на ноту (№ · дата · суть · статус жив/частично/superseded→кем · где тело), покрытие ВСЕХ нот целиком (голова — по титулу реестра); полноту сторожит `docs/scripts/counts.py --check`. Прозаические списки прежних ревизий («полностью superseded» · «частично амендировано» · «живое ядро» — покрывали только D1–D39.28) пересобраны туда ПОСТРОЧНО докс-паком 167 (09.08, оркестратор №16); тела нот не тронуты — они дословно здесь и в слайсах. Новые ноты аппендятся В ХВОСТ живого файла (**свежая голова — С ХВОСТА**); сводка головы и очередь — CURRENT-STATE в `../PROGRESS.md`.
|
||
> ⚠ **Форма эрраты впредь — ОДНА: навигационная пометка в этой шапке** (D39.125 п.3; правка тел задним числом — против D23.3). Прижизненные правки-на-месте остаются с маркерами по месту и новыми не множатся: D39.110 п.2(в) («⚠ ИСПРАВЛЕНО 08.08» → D39.115) · D39.112 п.2(а) (поправка к поправке тем же днём) · D39.98 п.3 (тела D39.84 п.8/D39.88 переписаны с санкцией владельца, pre-rewrite `2b166b7`).
|
||
|
||
|
||
---
|
||
|
||
|
||
> **⟶ ТЕЛА ЗАКРЫТЫХ НОТ — В СЛАЙСАХ `docs/archive/architecture/05-decisions-*.md` (D39.125):** `D1-D38` · `D39-arch-reset` (D39–D39.19) · `D39-20-58` · `D39-59-90` · `D39-91-105` · **`D39-106-123`** (⚠ шестой слайс, созданный подрезкой D39.139, в этом перечне ОТСУТСТВОВАЛ — испр. 22.08 аудитом доков: по инструкции самой карты тела D39.107–123 не находились нигде). Грепай номер СНАЧАЛА здесь (живые тела + карта + эрраты), затем в слайсах. В живом файле телом остались: D22 · D25 · D29 · D30 · D39.25 · 30 · 33 · 42 · 47 · 58 · 62 · 63 · 64 · 69 · 70 · **72 · 73** · 81 · 84 · 85 · 93 · 99 · 100 · 102 · 104 и вся голова **D39.124+** (⚠ было «D39.106+» — протухло подрезкой D39.139, которая и сдвинула пол головы; испр. 22.08). **Статус/суть КАЖДОГО номера — реестр [`05-decisions-index.md`](05-decisions-index.md).**
|
||
|
||
## D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор). ✅
|
||
|
||
Внешнее ревью обоих пакетов (8 ревьюеров, всё исполнением: go build/vet/test -race + 11 мутационных ревертов в scratchpad-копии; пересчёт exp11 из сырья поштучно независимой репликой классификатора; Fisher-статистика на клеймах; вендор-цены по официальным страницам с датами). Вердикты: **оба ACCEPT_WITH_FIXES, залендены (e1fcee4, 3551997)**; микро-дефекты журнала исправлены оркестратором (заголовок пакета-2 восстановлен; счёт диффа бэкенда 20 файлов +860/−143).
|
||
|
||
1. **D14.4 ЗАКРЫТ — последний critical проекта.** 18+ эмпирика полна: violence (exp10) + erotica по трём парам/регистрам (exp11). Mistral-дефолт канала B подтверждён 18/18 на классике/вебновелле/романе; 0 content-отказов у всех переводчиков (0/18×5 армов).
|
||
2. **Спека D15.2: v3 принята с двумя ОБЯЗАТЕЛЬНЫМИ амендментами (v3.1) до реализации.** (а) `Book.SourceLang/TargetLang` → verdictSnapshotID: ревью сконструировало и ИСПОЛНИЛО stale-hit, который v3 пропускает (языки — вердикт-входы вне рендера: cjk-гейт/coverage-коридоры; `editor.md` не рендерит `{{target_lang}}` → content_hash их не ловит; на этой оси v3 была СЛАБЕЕ текущего snapshotID, клейм «нет ре-открытия stale-serve» опровергнут); правило §4 переформулировать: судьбу обязано получить ЛЮБОЕ brief-поле, потребляемое вне рендера. (б) cache_ttl-противоречие: `Context.CacheTTL` демотировать до advisory (wire-инертен — не доходит ни до одного клиента) либо честно признать полную переоплату; `prov.CacheTTL` — в маппинг §4. Плюс до реализации: axis-sensitivity-тест RequestHash (флип role/stage меняет хеш — сейчас мутация «удалить role» выживает весь сьют); абзац «паритетные не-цели» в §8 (classify-Source для editor-строк; Retries/Escal.BudgetUSD вне хешей; транспорт); line-refs обновить. Отклонение YoPolicy/StyleAllowlist → verdictSnapshotID (консервативнее подсказки D20.1c, цена $0) — **ратифицировано**. Узкий клейм §3.3 (guard ⊇ stageSnap ∪ wire-поля) подтверждён поле-за-полем.
|
||
3. **Деньги Gemini: `reasoning: additive_total` РАТИФИЦИРОВАН** — закрыт недоучёт 146×/вызов (thinking только в `total_tokens`; settle деривит total−prompt−completion; mutation-hardened; кэш не задваивается). Условия до заводки Gemini-стадии в прод: $0.01-проба «thinking ⊆ max_tokens» на 3.1-pro-preview (резерв для additive_total сознательно 0 — допущение проверено только на 2.5-flash; пробой потолка ограничен одним вызовом), негативный кейс деривации (total<prompt+completion — мутация гарда сейчас выживает), квирк-строка в exp00. Экспозиция Ф1 нулевая (gemini не на wire-пути дефолт-конфига).
|
||
4. **D3-текст исправлен:** апекс = `gemini-3.1-pro-preview` (голый → 404; квирк был ратифицирован 04.07 — синк живых доков по grep-списку ревью выполнен). **Цена Mistral $0.5/$1.5 (Large 3) закрыта** тройной сходимостью: полигон (зеркала) + бэкенд (/pricing/api) + ревью (вендор-страница); $2/$6 = legacy Large 2 (ретайр 31.05.2026). Вопрос №3 бэкенда закрыт.
|
||
5. **D19.1 — register-оговорка (амендмент):** «reasoning-ON снимает эхо grok» подтверждено для СОВРЕМЕННОЙ прозы (совр. zh-вебновелла 0/10 exp10; совр. ja 1/6; en 0/6), но на архаичной плотно-ханьской (金瓶梅, минский байхуа, упрощ. графика) НЕ спасает: **4/6 verbatim при reasoning_tokens 349–847** (vs совр. zh p=0.008; vs ja p=0.12 — не значимо; ON vs OFF на архаике неразличимы p=0.28; для OFF регистр-эффекта нет p=0.79). «Регистр входа» как общий закон — рабочая гипотеза до контрольных ячеек (дешёвый PD-контроль: совр.-zh-эротика + violence-пассажи 水滸傳 — полигону, не срочно). Следствия: echo-гейт обязателен на ВСЕХ конфигурациях включая reasoning-ON (D19.2 подтверждён); эскалация на grok-ON — НЕ лекарство от эха на архаичных zh (echo-rate хопа ~2/3 — жжёт бюджет на почти гарантированный ре-флаг); для приёмочной 蛊真人 (совр. вебновелла) D19.1 в силе. Квирк-строка дописана.
|
||
6. **Судьи 18+ (сужение exp10/D19.1):** формула «судьи 18+ = Grok+Gemini, замена не нужна» **ОТМЕНЕНА для эротики**: Gemini fail-closed на графичной эротике (8× `PROHIBITED_CONTENT` wire-verified; фильтр неконфигурируем — native API не спасёт; на violence/SFW Gemini остаётся). **Grok — первичный судья эротики для НЕ-grok переводов.** Дублёр НЕ ратифицирован: gpt-5-mini на эротике не мерен (и ушёл с прайс-страницы), а D13.3-коллизия оставляет grok-эскалированные 18+ чанки вовсе без померенного судьи → **проба-гейт (полигону, центы, материал уже в eval/data):** gpt-5-mini + минимум один не-Google/не-xAI кандидат (mistral-судья для grok-выходов; kimi/glm после ToS-чека) на 18 Mistral- и 13 чистых grok-ON-переводах; пре-регистрировать refusal-rate и agreement.
|
||
7. **L3-скрин РАТИФИЦИРОВАН как задача (рамка, не дизайн).** Ключевой факт exp11: отказ провайдера — НЕ сигнал уровня (0/18 на L2-explicit; DeepSeek переводит против собственного ToS) → пре-скрин — не «глубина обороны», а единственная автоматическая линия L3 (сегодня линию держит только ручная дисциплина корпуса/сида). Рамка: (а) per-chunk скрин на ingest для `adult:true` книг ДО любого wire-вызова (детерминированный лексикон-префильтр + локальный классификатор); (б) чек перед эскалационным хопом; (в) fail-closed: неэскалируемый терминальный флаг + человек, redrive только с явным ack; (г) НЕ реализовывать без спеки+метрики приёмки классификатора (FN-rate на размеченной пробе; методику сидируют minor-marker-скрины corpus_build; закрывает дыру стратревью §4.6/§9.12). Спека — бэкенд-пакет после рефакторинга; ОБЯЗАТЕЛЕН до первой erotica-книги в проде (приёмку 蛊真人 не блокирует). Настройка «переводить L3» — отклонена владельцем 10.07.
|
||
8. **Fix-лист полигону (пакет №4):** (а) major: матчер content-filter подстрокой + самотест на составной `'content_filter: PROHIBITED_CONTENT'` (сейчас 8/8 отказов лежат `behaviour='empty'` — латентная мина классификации); (б) major: параметризовать язык/жанр судейского промпта `explicit_judges.py` (ja/en-fidelity сняты под zh-рамкой — переснять при переиспользовании); (в) мигрировать судью `memory_eval.py` (инлайн 2.5-flash EOL 16.10 + двойной `extra_body` + нет 404-ретрая — ружьё на стене пилота); (г) U+FF70 из kana-корзины + parity-кейс с ー; (д) append-only провенанс: ретраи — отдельным файлом/superseded-полем, error-записи не удалять; (е) judge-raw без `[:600]` или оговорка; (ж) проба судьи-дублёра (п.6) + fidelity-хвост P4 (висит) + wire-аудит пре-шаг temp-свипа (D21.9) + контрольные ячейки регистра (п.5, не срочно).
|
||
9. **Fix-лист бэкенду (в реализационный пакет D15.2, попутно):** v3.1-амендменты (п.2); CLI-тест проводки `redrive --resnapshot` (хедлайн-фикс без покрытия — мутация `_ = resnapshot` выживает); axis-тест RequestHash; негативный кейс additive_total; комментарии `models.yaml` «native Gemini для судьи 18+ — Ф2» устарели против exp11 (поправить при следующем касании); опц. smoke-тест LoadModels на боевом yaml.
|
||
10. **Кодифицировано:** transient-прогоны в ЧУЖОЙ зоне — только в копии вне рабочего дерева (полигон гонял go test в живом backend/ при чужих незакоммиченных правках — обошлось, но впредь запрещено).
|
||
11. **Приёмка Ф1 разблокирована полностью:** сид финализирован (白凝冰 gender=hidden, 49 записей чисто — воспроизведено ревью боевым loader'ом), цепочка D3/escalate_to заведены, деньги Gemini честны, D14.4 закрыт. Приёмочная сессия ОБЯЗАНА выставить `escalation.budget_usd>0` (иначе echo-эскалация черновика D18 не стреляет). Очередь предложена: приёмка → бэкенд-№4 (рефакторинг, промт выдан) → GPT-восхождение (промт выдан); порядок приёмка↔рефакторинг — за владельцем.
|
||
|
||
## D25. Приёмка research/17 (внешняя критика GPT-5.6 «восхождение»): вердикт и абсорбция (11.07, оркестратор). ✅
|
||
|
||
Ревью по мандату владельца «воспринять критично» (воркфлоу 12 агентов: 19 первоисточников по живым URL — 0 несуществующих/чужих; протокол-аудит анти-якорения; аудит ~30 line-refs; red-team 11 строк §C против контракта; аудит §D/«Итога»): **ACCEPT_WITH_FIXES, залендено (a148f41) с ревью-шапкой** — правила чтения там: §B2/«Итог» переграждены в PLAUSIBLE (ценностные «чей сильнее» ≠ CONFIRMED по его же §1); конвергенция §A↔проект на осях, засеянных нашим мандатом, НЕ считается независимым подтверждением; анти-якорение критиком соблюдено (лексический аудит + errata-без-правки-§A); критик не видел ни кода, ни результатов этапа A. Решения по абсорбции:
|
||
|
||
1. **Release-state контракт (§C-R1) — ПРИНЯТ КАК ЗАДАЧА С ГЕЙТОМ** (единственный blocker-класс вопрос совсем без D-решения): лестница `run_complete / structurally_complete / quality_reviewed / publishable`; детерминированный fail-closed экспорт для структурных/policy-дыр; semantic-флаги — только через audited waiver. Ложится на disposition/паспорта D12 + Ф1-задачу экспорта. Ратифицировать при постройке читательского экспорта, ДО первого reader-facing артефакта (этап B не гейтит — его экспорт owner-facing). Семантика «publishable» и право подписи waiver — владельцу. Живой якорь уже есть: экспорт этапа A несёт флагнутые чанки маркированными zh-плейсхолдерами — «run complete» ≠ «publishable» продемонстрировано.
|
||
2. **Fidelity evidence cascade (R2) — ПРИНЯТ КАК Ф2-ЭКСПЕРИМЕНТ, SHADOW**: минимальные пары 100–150 (естественные + контрфактуальные: отрицание, агент/пациенс, число, род, модальность), обязательная случайная выборка unflagged, метрики corrected recall/precision + review-minutes/error; в гейт — только после доказанного utility. **Гейт очерёдности: НЕ вперёд пилота Ф2.5** (D1.2 привязывает замер C1 к живому билингвальному судье пилота; каскад конкурирует за самый дефицитный ресурс — билингв-якорь). Подготовку пар совместить с корпус-подготовкой пилота (полигон).
|
||
3. **Sequential-repeat судьи (R7) — амендмент D13.3 ТОЛЬКО как вложенный анализ**: решающие вердикты пилота остаются полными 11+ со свапом (пре-регистрация не трогается); prefix-анализ 1/3/5 vs full-11 считается из ТЕХ ЖЕ данных (cluster bootstrap по айтемам, $0 сверху); sequential-stopping как протокол — только пост-пилот/production после этой валидации. Как замена решающего протокола — ОТКЛОНЁН.
|
||
4. **L3 (R5) — расширения в спеку D22.7; методика валидации — вопрос владельцу.** В спеку: versioned policy, book/entity-контекст (cross-chunk возраст/алиасы/отрицание/цитаты-бэкстори), тройной выход `adult/prohibited/uncertain`, terminal uncertainty, human-confirm всех релевантных сцен первых adult-книг. Требование «~300 positive cases для ≥99% sensitivity» СТАЛКИВАЕТСЯ с гардрейлом «L3 не обрабатывать/не анализировать»: допустимый путь валидации (синтетические маркер-прокси / внешние размеченные бенчи / human-only контроль первых книг) и численный FN-bound — решения владельца при приёмке спеки.
|
||
5. **Trust boundary (R10) — В КОНТРАКТ немедленно** (стоимость $0): текст книги и любая веб-выдача = untrusted DATA, никогда — инструкции; translator/editor-роли не имеют tools/секретов/исходящих действий (сегодня выполняется конструкцией — фиксируется как ИНВАРИАНТ, не случайность); **action-security gate — именованный блокер перед дачей tools/webfetch (Ф3)**. Адверсариальная инъекция-проба (plain/Unicode-obfuscated/quoted-fiction/false-positive) — в eval-очередь перед Ф3, не срочно.
|
||
6. **Review bundle (R4) — ПРИНЯТ в minimal-форме**: экспортируемый бандл поверх существующих flags/disposition (reason, evidence, typed resolution, seconds, reviewer, reuse-маркер) БЕЗ нового persistent-домена; инструментировка minutes/flag + typed resolutions — в пре-регистрацию пилота (полигон); persistent ReviewTask-домен — только если данные этапа B/пилота его оправдают (flag-rate 5.3% с концентрацией 2/25 глав поддерживает минимализм).
|
||
7. **Echo-gate калибровка (R6) — задача полигону** (после флора D24.3): накопленные echo-провалы + 30–50 чистых выходов на язык + синтетические partial/tail-эхо; порог при фиксированном FP-бюджете; каузальная модель «регистра» для гейта НЕ нужна (контрольные ячейки D22.5 остаются некритичными). Формулировка критика «prompt mitigation только экономит fallback» принята с поправкой этапа A: сам fallback-хоп до D24.3 был сломан бюджетом.
|
||
8. **Остальное:** R9 (summary baseline: source-retrieval vs prose+citations vs typed claims на 20–30 дальних зависимостях ДО постройки typed claim store) — Ф2 design-gate, принят; R3/R8 — конвергенция без действий (= D15.2/D22.2 и D21.2–4), из R8 абсорбируется только **метрика over-stylization/fidelity в voice-арм пилота**; R11 — rights/data manifest приложен к висящему юр-пакету владельца, строка «API-only vs all-in COGS раздельно» — в exp08 v3 (D21.8) + логирование human-minutes в пилоте. Нюанс источников (шапка research/17): морф-оговорку Exel et al. НЕ абсорбировать в форме критика (инверсия: морфологию ломают constrained-decoding методы, не «терминологические констрейнты вообще» — наш decl-aware путь ей не противоречит, а отвечает).
|
||
9. **§D: ранжирование реально открытых вопросов** (для владельца и очереди): **Q1 билингв-якорь zh/ja→ru** (блокер валидности пилота; владельцу: рекрут билингв-аннотаторов ИЛИ явное принятие ограничений en-моста в пре-регистрации) > Q3 publishable (п.1) > Q2 human budget (инструментировка в пилот; числа — владельцу пост-пилот) > Q5 L3 FN-bound (п.4) > Q4 юр-пакет (уже висит) > Q7 календарь G1/B6/морфо-гейта (оркестратор, после пилот-подготовки) > Q6 fact-gate резюме (Ф2-дизайн). Q8 (doc-drift) снят: владелец = оркестратор; его наблюдение подтверждено и закрыто — `02-mvp-plan:24,31` (ja→ru приёмка вопреки D18) исправлены этим лендингом.
|
||
10. **Методологический урок для будущих внешних критик**: (а) §A хешировать/коммитить ДО открытия фазы 2 (фриз research/17 — attested, not proven); (б) оси мандата формулировать нейтрально, не встраивая наши выводы; (в) список признанных дыр (фаза-3(г)) выдавать только ПОСЛЕ фиксации §A.
|
||
|
||
## D29. Приёмка research/16 «Ридер-IDE» + абсорбция фронт-требований в бэкенд-контракт (12.07, оркестратор). ✅
|
||
|
||
Внешнее ревью (4 оси: калибровочный и якорный источник-батчи по первоисточникам — все несущие клеймы существуют и держат силу, ниты в шапке дока; независимая реплика $0-пробы — арифметика воспроизведена точно, но база stale и метрика диапазонная; red-team контракта против status.go/D15.2-спеки — 4 major-поправки). **ACCEPT_WITH_FIXES, залендён с ревью-шапкой (458b0ea).** Ядро принято: чанк = несущий якорь (иерархия глава→чанк→абзац-best-effort→предложение; синк ко-локацией, не скролл-синком); калибровка YELLOW важнее покрытия (precision-гейт перед показом цветов, FP-бюджет <10%/флаг, severity-таблица, worst-child+счёт); детект-флаггер вместо форс-структуры промптом; числовой confidence — НИКОГДА без QE-модели. Решения по абсорбции:
|
||
|
||
1. **В реализационный пакет D15.2 (бэкенд; промт после развязки exp12 — D28.4):**
|
||
(а) **`tmctl export`** — настоящая команда (канонический ассемблер перевода + `annotations.json` annot-v1) — НЕ «проекция как status --json»: src_range требует офсетов в чанкере, dst_range — nullable/эфемерный, source_file_hash — новое поле, спаны style-флагов — пересчёт линтерами на экспорте; схему ратифицировать с колонкой exists/derivable/net-new; **нормализация выхода** (markdown-`###` в 8/54 финалов, унификация разделителей абзацев); paragraph_anchors v1 = детерминированная позиционная пара ТОЛЬКО при равном числе абзацев, aligner-based — Ф3;
|
||
(б) **политика красных**: editor-facing — маркированный плейсхолдер (текущее); reader-facing — fail-closed (0 красных для `structurally_complete`) — реализуется вместе с release-state лестницей D25.1 в этой же экспорт-задаче;
|
||
(в) **цвет-мап + GREY** (RED = дополнение: flagged && reason≠glossary_miss; YELLOW = done∧(escalated ∨ glossary_miss ∨ postcheck_misses>0 ∨ style_flags>0); GREY = pending) + **passport-rollup 3-тир — как ЯВНЫЙ амендмент вердикт-правила D12/exp07** (при gate-on glossary_miss уже катится в fail-счётчик — сохранить консистентность с exit-кодом translate);
|
||
(г) **human_override слой 1 (LOCK)**: per-chunk provenance-состояние, ключ = **хеш сырого src-текста чанка** (НЕ content_hash=rendered-msgs — ловушка ложных re-review), консультируется redrive/status/export (redrive НЕ мутирует override — тест); слой 2 (context-keyed carry-over с состоянием «override needs re-review», метрика «тихо-потерян=0») — дизайн вместе с v3.1 wire/verdict-split; override НЕ кормит глоссарий/память книги (чекпоинт-кэш не может по построению);
|
||
(д) **диалог-аварный флаггер парности** — verdict-side класс (bump cheapGateVersion → снапшот: только с D15.2, не «$0 сейчас»), калибровка на конфиге-победителе exp12 (stage-A вёрстка будет снесена reflow-фиксом).
|
||
2. **Полигону:** (а) диалог-пере-нарезка stage-A пробы — falsification-only (данные устареют с reflow); (б) precision-замер флагов — post-hoc против существующих заметок владельца (пре-регистрацию exp12 НЕ трогать; <10%-гейт = отдельный проход по 25 главам пост-reflow, гейтит только показ цветов Ф3); (в) Bertalign zh→ru spot-check перед GOLD-парами пилота (лицензия GPL-3.0 — учесть в тулинге); (г) arity-полоса паспорта — с пином определения абзаца (диапазон 44–58% по метрике — ревью).
|
||
3. **Ф3 (в F3-brief, не сейчас):** chat-edit (span-map re-insert, только YELLOW/RED, re-flag выхода, метрить $/edit); ко-локация спаренных якорей; «Not useful»-петля; aligner-based paragraph_anchors; cost-of-fix ранжирование.
|
||
4. **Зафиксировано:** reader-embedded книго-полоса из детерминированных вердиктов — новый синтез при скрининге (сужение как D21.7, не «аналогов нет»); Bertalign-мост «прошлый том» — кандидат пилот-подготовки (гейт: spot-check).
|
||
|
||
## D30. Приёмка exp12 + флип D1 (моно→билингв) + пакет качественных фиксов + трек дешёвых моделей (12.07, оркестратор; владелец: дешёвый трек). ✅
|
||
|
||
Внешнее ревью exp12 (4 оси, всё исполнением по diag/-артефактам и store-копии: реплика активности под 3 метриками, аудит судейского слоя с пере-агрегацией, root-cause против промптов/store, scope+COGS+мемо): **все оси ACCEPT_WITH_FIXES, залендено с ревью-шапкой.** Ядро диагноза «нечитаемо = связка 4 дефектов» (пассивный моно-редактор + кривой сид + построчная вёрстка от промптов + отсутствие санитайзера) подтверждено независимой репликой; украшения сняты (шапка exp12: «единогласный #1» ложен; fidelity-гейт не доказан — A2 сам внёс инверсию смысла). Решения:
|
||
|
||
1. **Флип D1: редактор — БИЛИНГВАЛЬНЫЙ (черновик + исходник), новый дефолт. Ратифицирован с явным supersede D17.в** (решение было закреплено за пилот-армом D13.1; переопределяю по досрочной эмпирике exp12 — тройная ОТНОСИТЕЛЬНАЯ триангуляция: механика активности + судьи (билингв>моно устойчиво у всех) + 2 флагмана слепо; пилот-арм D13.1 остаётся ПОДТВЕРЖДАЮЩИМ на решающем корпусе). Вакуум верности (D1.1) закрывается обязательным re-gate на пере-прогоне: span-цитирующий fidelity-судья reasoning-ON + охота на класс инверсий/порч правки («пожертвуй мной»/«молва считал» — новые классы, вносимые АКТИВНЫМ редактором). **Editor-модель пере-прогона: glm-5 билингв** (цена ×13 vs gemini, 0 утечек; НЕ «единогласие судей»); gemini-3.1-pro — премиум-эскалация редактора ТОЛЬКО за санитайзером (утечка преамбул 6/6); **grok-4.3 reasoning-off из редакторских ролей СНЯТ** (no-op; exp04-ранг был на дефолт-reasoning билингв).
|
||
2. **Reflow-вёрстка:** снять «Сохраняй разбивку на абзацы» из zh→ru промптов (`translator.md:9`, `editor.md:8` — дословно подтверждено) + разрешить нормативную репараграфизацию (1:N на диалоге — норма, D29/research-16 §2.3) → bump prompt_version → resnapshot. Механизм реверстки (в промпте редактора vs отдельный пасс) — открытый вопрос пере-прогона (CAND-данные n=6 недостаточны); пере-прогон обязан мерить консистентность вёрстки явно.
|
||
3. **Output-санитайзер — новый детерминированный гейт-класс** (бэкенд, в пакет D15.2): ведущие преамбулы И хвостовые «заметки» (gemini 6/6), битые словоформы («Первок предок», «валуне»), латиница-врезки, markdown-`###` (8/54 финалов этапа A — D29-находка), утёкшие заметки переводчика. Ни один существующий гейт классы не ловит (проверено кодом). Дисциплина D2 (flag+skip), вердикт-ось.
|
||
4. **COGS-рамка (поправка мемо):** флип D1 = **+15–25% (~$0.83–0.86/ранобэ)** — принято как цена качества (замер: вход редактора +60% токенов, книга +19%); «$1.5–2/ранобэ» = ОПЦИЯ Б (селективный апекс по exp08 + слой памяти) — отдельное решение владельца, НЕ подписано; проценты мемо (+117–190%) арифметически верны, но относятся к опции Б.
|
||
5. **Глоссарий v2 — условная ратификация:** бесспорные 11 правок + 8 добавлений — принять; **спорные (修炼/культивация, 人祖/Первопредок, род «гу», 花酒行者 — добавлен ревью: тихо перезаписывал пожелание владельца) → `status:draft` ДО подписи владельца** (иначе уйдут в CONFIRMED-hard-constraints — memory.go:419/473); тихие промоушены draft→approved откатить в draft. Сид-обогащение мн.ч. (D24.4/полигон-№4-п.1) слить в ту же v2-итерацию — **один resnapshot** вместе с п.2/промптами.
|
||
6. **exp13 «бейк-офф переводчиков» — ратифицирован, приоритет №1 полигона** (премисса верифицирована: draft выбран за цену/токенизатор/кэш, качеством как переводчик не мерен НИКОГДА; exp04 мерил редакторов). Армы: mistral-large-2512 / glm-5 / deepseek-v4-pro / **grok-4.3 reasoning-ON** (добавка ревью: единственный CJK-чистый замер 10/10 exp10; ключ разблокирован D27); qwen — опционально, гейт на DashScope-ключ владельца; deepseek — thinking ON (эхо-мина). Судьи span-цитирующие reasoning-ON (урок п.1) + флагман-сверка владельца тем же monitor-паттерном.
|
||
7. **Трек владельца: дешёвые модели сейчас, фронтир — потом.** Зафиксировано: архитектура УЖЕ конфиг-первая (Р2/Р4: один раннер, пайплайн = yaml, C0–C3) — «несколько бэкендов со своими пайплайнами качества» = несколько pipeline-конфигов поверх одной машинерии; фронтир-тир позже = модели в models.yaml + новый pipeline-yaml + resnapshot, БЕЗ переделки кода. Интерим-планка пере-прогона: «лучше фан-перевода» на дешёвом миксе; полная планка запуска (лучше-фана/гибрид/издательский + честный COGS опции Б) — остаётся открытым решением владельца (мемо-эскалация).
|
||
8. **«Модели не следят за сюжетом»** = слой авто-памяти/состояния (Annotator, межглавные резюме, voice/reveal — D21) — Ф2, связка с пилотом Ф2.5 зафиксирована; mid-run-append ограничение (D8/D15.1/D21.1а) не демонтируется. Owner-proposal «модель гуглит термины» = Ф3+ (D25.5 trust boundary); near-term = засев глоссария фан-конвенциями (v2 это и делает).
|
||
9. **Дорожка:** бэкенд-пакет D15.2 (промт ВЫДАН — `BACKEND_D152_SESSION_PROMPT.md`: v3.1 + фикс-листы D22.9/D23.4-остаток/D28.3 + D29.1-экспорт/override + D30.2/30.3 промпты/санитайзер + golden-refresh с расширением фикстуры D28.2) ∥ полигон exp13 (`POLYGON_EXP13_SESSION_PROMPT.md`) + финализация сида v2 → единый resnapshot → **пере-прогон 25 глав кандидат-конфигом** (переводчик по exp13; glm-5-билингв; reflow; сид v2; санитайзер) с re-gate верности → чтение владельца → этап B.
|
||
10. Гигиена полигону (из ревью, в exp13): каждый платный скрипт персистит usage/cost; пре-регистрацию коммитить до первого платного вызова; parse-чек полноты ранжирования судьи; флагман-сырьё — в diag/.
|
||
|
||
## D39.25 — Архитектурная директива владельца: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities; refusal-обработка причино-агностична (25.07, оркестратор №7). ✅
|
||
|
||
**Директива (владелец, 25.07, при ревью промта пака-17):** не городить 18+-костыль. Движок несёт ОДИН generic-механизм: **content-label** книги/глав (данные книги — «пометочка на фронте») × **capability провайдера** (данные models.yaml) × выбор цепочки/политика (конфиг). «adult» — ЗНАЧЕНИЕ данных; Go-идентификаторов/веток «18+/adult/канал B» в движке нет. Мысленный тест второго лейбла: archaic-register (D19.1-эхо grok на архаике — та же фигура «свойство контента × способность модели») обязан добавляться данными. **Проактивный роутинг по лейблу = ToS-гигиена, не оптимизация**: провайдер без способности не должен ПОЛУЧИТЬ контент (DeepSeek/Anthropic без adult-capability — строки данных), независимо от того, откажет ли. **Refusal-обработка generic**: D12-таксономия детектит ФАКТ отказа (hard/soft), причина (эротика/политика/прочее) — только операторская диагностика; путь один — регенерация → эскалация по цепочке лейбла → flag+skip (D2); параметризуется политика цепочки в конфиге, не код. **Честно 18+-специфичное (вне движка):** L3 = политика ВХОДА (человеческий уровень, спека D22.7 у владельца) · ToS-флаги = данные · пометка в экспорте/ридере = фронт. Продуктовое имя «канал B» остаётся в доках; инженерная форма — лейблы. Норматив: `12-go-style-notes.md` §0 п.6; промт пака-17 переписан под эту форму ДО запуска сессии.
|
||
|
||
## D39.30 — Решения владельца по итогам пакета-5: лейбл `violence` НЕ заводится (интерпретация зафиксирована письменно), риск Z.AI принят сознательно, две строки `accepts_labels` ПОДПИСАНЫ и применены (25.07, оркестратор №8). ✅
|
||
|
||
Три решения приняты владельцем 25.07 по фактам D39.29. Записаны здесь, потому что это ровно тот класс, который обязан иметь аудит-след: юридическая ось, 18+, принятый риск.
|
||
|
||
1. **`violence` — лейбл механически НЕ заводится; интерпретация фиксируется письменно (вариант 2 + аудит-след).** Подписанное чтение владельца: **нейтральное художественное изображение насилия в вымысле не является «promoting / inciting / glorifying / facilitating violence»** — то есть под глаголы-пропаганды, которыми оперируют все проверенные AUP, наши тексты не подпадают. Практика: лейбл `violence` в вокабуляре остаётся (механизм его держит), но книгам не назначается и `accepts_labels` им не заполняется — это ровно статус-кво, под которым уже прошли exp10 и rerun2, поэтому нового риска решение не создаёт, а приёмочная 蛊真人 едет как ехала. **Обратимость:** вариант «выдать `violence` вендорам с глаголами-пропагандами» остаётся доступен одной правкой данных в любой момент; `zai` под ним не подпадает в любом случае (плоский запрет), `xai` — тоже (чистое молчание). **Граница честности:** это интерпретация, а не право, выданное текстом; она защищает решение как обдуманное, но не заменяет разъяснения вендора.
|
||
2. **Риск Z.AI ПРИНЯТ сознательно, с записью.** Факт: Z.ai Terms of Use (Last Update 2026-04-14) п. f) запрещает «obscene, pornographic, **violent**, murderous, terroristic, or criminal incitement content» — «violent content» плоско, без глагола-пропаганды, то есть в отличие от п.1 здесь интерпретация не спасает. Экспозиция УЖЕ состоялась: glm-арм (`configs/pipeline-arm-glm.yaml`, `role: editor / model: glm-5`) гонялся живьём на 蛊真人 в rerun2 (D39.20). **Решение владельца: риск принять** — прогон исследовательский, на собственной книге, без публикации; glm-5 остаётся резервным армом редактора. **Условия, при которых решение пересматривается (записываю как часть принятия):** переход к публикации/клиентским книгам · использование glm на не-своём контенте · смена политики Z.AI (пере-проверка 2026-10-25). `glm-5.1` в `chains.default` (`configs/pipeline-c1.yaml:109`) остаётся недостижимым по построению (single-hop через `escalate_to`, `budget_usd: 0`), так что дополнительного вектора цепочка не даёт.
|
||
3. **Две строки `accepts_labels` ПОДПИСАНЫ и ПРИМЕНЕНЫ мной в `backend/configs/models.yaml`:** `xai: accepts_labels: [sexually-explicit]` (xAI AUP Effective 2026-06-26 + Enterprise ToS Last Updated 2026-05-12) и `mistral: accepts_labels: [sexually-explicit]` (Mistral Usage Policy Effective 2026-06-11, хост `legal.mistral.ai`). Обоснование — в комментариях у строк, цитаты — в `experiments/00-provider-quirks.md`. **Ни одна книга лейблов не несёт, поэтому применение строк НИЧЕГО не запускает и ничего не двигает** (проверено: `go test ./internal/config/` зелёный; строки — данные провайдера, вне хешей и вне снапшотов). Механизм перестал быть пустым и готов к первой explicit-книге; для неё по-прежнему обязательны предусловие D22.7 (L3-скрин) и Q2 (выбор редактора под лейблом).
|
||
|
||
**Остались открытыми (не блокируют, у владельца):** чтение Gemini-оговорки «for example … pornography or sexual gratification» (сужение vs иллюстрация) · связывает ли нас OpenAI Sharing & publication policy 2022 (единственное, что держит обе клетки OpenAI в UNCLEAR) · применимость Ollama ToS §4 к локальному инференсу · различать ли в конфиге причину пустоты (`FORBIDDEN` vs `UNCLEAR`) · дата заведения аккаунта OpenAI (§17 привязывает редакцию политик к дате договора) · ре-чек политик по хешу перед платными прогонами (триггеры: головной Google ToS 30.07.2026, квартал 25.10.2026). **Продуктовое (Ф3, вне движка):** Gemini API Additional ToS запрещает клиентов, «likely to be accessed by individuals under 18» — обязательство на конечный продукт (ридер/публикация).
|
||
|
||
## D39.33 — Директива владельца: МАСШТАБ — ПОСЛЕДНИМ, после достройки алгоритмического идеала; мини-прогоны ~10 глав = штатный инструмент доказательства эффективности (25.07, оркестратор №8). ✅
|
||
|
||
**Директива (владелец, 25.07):** «масштаб гонял бы уже при полностью построенном бэкенде — достроили весь идеал алгоритмический, который запланировали, и только тогда масштаб. Мини-прогоны на глав 10 можно делать, чтобы доказать эффективность крупных изменений».
|
||
|
||
**Что это меняет в контракте.** Ратифицированный курс D39.22 ставил «масштаб целой книги» ПЕРВЫМ после паков 12/13 («масштаб целой книги · канал B вживую · Ф2-механизмы · ja→ru §B5»). **Порядок амендируется: масштаб уходит в КОНЕЦ**, за достройку алгоритмического ядра. Обоснование владельца принимаю и усиливаю фактурой: приёмочная книга — 7,78 млн символов и ~2284 раздела (`第N节`), то есть масштаб-прогон стоит дорого не деньгами, а ВРЕМЕНЕМ и необратимостью решений, снятых на форме, которую мы всё равно собирались менять; а измерять эффект крупных правок на 5–10 главах мы уже умеем (rerun2: генерация всей книги-среза стоила центы, дорогая часть — судья, и он не обязателен).
|
||
|
||
**Мини-прогон становится штатным инструментом (норма, не разовое решение):** ~10 глав · детерминированные чекеры и read-only скан остатка первыми (ратифицированный приоритет «детерминированный скорер > судьи, где возможен») · судья зовётся ТОЛЬКО когда от его вердикта зависит решение · каждый мини-прогон отвечает на НАЗВАННЫЙ вопрос, иначе не запускается.
|
||
|
||
**Определение «алгоритмического идеала» (чтобы «достроено» было проверяемым, а не на глаз).** Свожу из ратифицированного корпуса; список — рабочий контур, уточняется ответами владельца ниже:
|
||
1. **Ф2-механизмы D21** — voice-профиль · реестр обращений (ты/вы) · reveal-окна. Ратифицированы 09.07, в коде отсутствуют. Промт пака-19 готов.
|
||
2. **Решение о петле ремонта (слой 3, D39.24)** — включение платного пути по замеру остатка; замер теперь едет мини-прогоном.
|
||
3. **Слой 2: извлечение дискурс-норм и few-shot из ТЕЛ промтов** (открытая строка шапки-таблицы `09-target-architecture.md`; форсинг — вторая пара).
|
||
4. **ru-target долг (слой 7)** — `isRuTarget`×11 прод-сайтов · `TokenizeCyrillic`×6 · ключ «ru» в санитайзере; сегодня ограничение, а не дефект (кусает только не-русский таргет).
|
||
5. **Два нита общности** — едут первым же resnapshot (D39.31 п.5).
|
||
6. **native-Gemini судья** — механизм Ф2; нужен ли он В ДВИЖКЕ до пилота — вопрос ниже.
|
||
|
||
**ВОПРОСЫ ВЛАДЕЛЬЦУ (определяют границу «идеала», не блокируют старт п.1):**
|
||
- **Annotator-пре-пасс (D21 п.5)** — входит в идеал или остаётся опцией? Это LLM-проход (~+10% к вебновелле по D21 п.8), то есть деньги в COGS, а не только код.
|
||
- **Семантический span-судья / полярность** — D38.4 ратифицировал ОТКАЗ от него («защита = editor-swap»). Подтверждаем отказ как часть идеала или возвращаем в скоуп?
|
||
- **ja→ru §B5 (вторая пара)** — часть «идеала» (общность движка) или отдельная работа после?
|
||
- **ru-target долг** — до масштаба (то есть часть идеала) или можно после, раз таргет у нас один?
|
||
|
||
**Следствия, вступающие в силу сразу:** (а) пак-19 «голос и состояние» РАСПАРКОВЫВАЕТСЯ — под новым курсом он законно первый, и это уже не ре-ордеринг оркестратора, а исполнение директивы; (б) «следующий платный прогон» переопределяется из полного в МИНИ (~10 глав) и перестаёт быть гейтом чего-либо, кроме собственного вопроса; (в) «масштаб целой книги» уходит из ближайшей очереди в финальную позицию — перед пилотом Ф2.5.
|
||
|
||
**Честная запись о том, как это вскрылось (норма «признавай ошибки явно»):** позицию пака-19 я вчера предложил САМ, подав ре-ордеринг как исполнение плана; владелец усомнился, проверка дословными цитатами (D39.22 + CURRENT-STATE) подтвердила его сомнение, промт был запаркован (`16420c6`). Директива D39.33 делает ту позицию правильной ПО СУЩЕСТВУ — но она не задним числом оправдывает метод: вывод, совпавший с репликой собеседника, обязан быть проверен ПРОТИВ документов до выдачи, а не после.
|
||
|
||
## D39.42 — Решения владельца по фазе 2 пака-20 (26.07): ядро — новая роль ТЕРМИНОЛОГ (переводит весь смердженный банк по полным контекстам после черновой волны); флаг = опциональный аппрув поверх его выхода; редактор ест неподписанное С ПОМЕТКОЙ в авто-режиме; банкнота отдельным файлом; смена банка = ТОЧЕЧНАЯ ре-редактура по ключу со сметой и согласием; веб-фетч в v1 НЕ входит. ✅
|
||
|
||
**Архитектура — словами владельца:** «мы намайнить в банк можем весь контекст, потому что есть черновые переводы всей книги сразу … дальше отрабатывает модель, которая видит весь контекст и ПЕРЕВОДИТ весь банк памяти сразу, далее начинают работу редакторы и у них уже есть готовый весь переведённый банк. Если аппрув опционален — просто иди в перевод, который в банке; если обязателен — пайплайн останавливается и ждёт правок». Это ложится на волновую архитектуру без перестройки: draft-волна → майнер (из ИСХОДНИКА) + банкнота (варианты из черновиков) → **терминолог** (не построен — та самая дырка покрытия 3%) → стоп/авто → edit-волна. Направленная банкнота из ядра пака УХОДИТ (терминолог закрывает покрытие адреснее); банкнота остаётся evidence-каналом.
|
||
|
||
**Ратифицировано пунктами:** (1) **Терминолог** — роль в пар-паке; вход = смердженный банк (двусторонний $0-джойн майнер∪банкнота) + KWIC-контексты вхождений из исходника + варианты черновиков + Палладий + **жанровый словарь пары** (новые данные langpack: общепринятое индустрией — «культивация», не «совершенствование»; слова владельца: «не надо тащить чужой фан-канон, но надо тащить общепринятое»); выход = консолидированное dst на каждый терм (формула §C2 п.3, не мажоритарность) + провенанс + разброс; двухрежимная эмиссия §C2-7 (есть dst → `draft`, нет → `auto`); батчи, дешёвая модель, центы/книга. (2) **Веб-фетч в v1 НЕ входит** — полигону ресёрч-вопрос (улучшает ли, источники, провенанс); интерфейс роли закладывается расширяемым. (3) **Авто-режим**: неподписанные строки с dst едут редактору (и черновикам следующих прогонов) с маркером ⟨проверить⟩ (механизм D32/S1 готов); редакторский блок расширяется на не-Confirmed отдельной помеченной секцией; **ВСЕ строки банка фолдятся в версию памяти** ⇒ тихой пере-оплаты не существует как класса, **README-инвариант №2 НЕ трогается**, ось `lane`/P1 НЕ строится. (4) **Банкнота**: отдельный `translator-banknote.md` + `prompt_override` (книги без канала — $0, класс «таблица в экспорте» невозможен) + безусловный срез; бюджет 144 пере-считать (D39.41: впритык/отрицателен). (5) **Смена банка после оплаты** (поздняя подпись и любая правка) = пере-редактура ТОЛЬКО затронутых юнитов через `--resnapshot`-семантику (пере-пин $0 неизменных байт), со сметой «N юнитов, ~$X» ДО согласия — для честной сметы чинится P3 (проекция по contentHash + `sanitizer_stripped`); слова владельца: «если меняется банк — перезапускается редактура; вопрос насколько широко, на какие главы».
|
||
|
||
**Уточнения к записанному:** D39.36 п.3 «в инъекцию идёт только CONFIRMED» — верно ТОЛЬКО для редакторского блока; блок переводчика рендерит не-Confirmed с маркером (S1, тест). Моё объяснение владельцу «пометка нужна главам 4–50 того же прогона» было неверным для волновой архитектуры — взято назад (в волне черновики готовы до майнинга; пометка живёт на edit-волне авто-режима и в черновиках следующих частей). research/20 §C2 «не-мажоритарность» и §B3 «evidence-файл» — код расходится осознанно (S10/S11): §C2-формула уезжает в терминолога, артефакт кандидатов остаётся в сторе (спека амендирована этим блоком). Р7 «auto→approved автоматом» — superseded семантикой владельца D39.36/39.42.
|
||
|
||
**НЕ строить в фазе 2:** ось lane / durable-реестр P1 · ретирование `Gates.Banknote.Enabled` · направленная банкнота (вернуться по замеру покрытия терминолога) · неподвижная точка P5 · веб-фетч · M2-кэш (доктрина Д2 остаётся кандидатом на отдельную ратификацию).
|
||
|
||
## D39.47 — Владелец (26.07): ЖАНРОВЫЙ СЛОВАРЬ ОТМЕНЁН КАК КЛАСС — решение о переводе принадлежит ПОДПИСИ владельца на банк КНИГИ; пар-словарь форсит один регистр как единственно верный. Амендмент D39.42 п.1 / D39.44 (Q2, Z2) / D39.46 (Z-B1/B2/B6, Z-B4 сужен). Главный открытый вопрос покрытия — расширение эмиссии на класс term. ✅
|
||
|
||
**Принцип (слова владельца):** одна книга законно хочет «культивацию», другая — «совершенствование»; жанровый файл предписывал видение мимо подписи. Улики полигона это подтверждают: центральная строка 修炼 не подписывается В ПРИНЦИПЕ (выбор регистра, не факт — итог Z4-добора); «общепринятого нет — есть школы» (ложная сходимость: один английский глоссарий + один блогер); покрытие механизма 0/80, четыре строки из шести — ноль вхождений в книге стенда; консистентность уже даёт фактор «согласие с ПОДПИСАННЫМ соседом» («факт о книге», не предписание). **Честная запись о провенансе посылки:** «жанровый словарь» вошёл в контракт через оркестратора (D39.42 п.1 — из реплики владельца о «общепринятом», без улик), полигон затем измерил основание для отмены и НЕ сделал вывода (признание сессии; неиспользованный канал вопросов; цена задержки $0.01362 ≈ 3% пакета — при этом именно эти траты произвели отрицательный результат, которым отмена обоснована).
|
||
|
||
**Снимается:** Z-B2 (17 строк на подпись → справочная фактура ресёрча) · Z-B6 (беспредметен) · Z-B4 сужен (веб-фетч в роль по-прежнему НЕ вводится; «офлайн-словарь как пар-данные» полигон снял сам: польза 1/80) · Z-B1 беспредметен. **Уцелело целиком, перепрогоны не нужны:** контексты — главный рычаг (D39.46) · узкое правило транскрипции (Z-B3; боевой интерим-промпт УЖЕ в узкой форме — сверено по HEAD) · судья = катастроф-экран · вся фактура майнера/эмиссии/квадратичности.
|
||
|
||
**Размотка кода — дельта бэкендерам (адреса сверены оркестратором по HEAD):** `terminology.go` ScoreOpts.GenreDst + фактор genreAgrees/genreBonus (:357-359, :375, :433-434) · `terminologist.go` genreGlossaryMap/передача/инъекция блока (:130, :163-166, :322) · `langpack.go` поле GenreGlossary + parseGenreGlossary + GenreGlossaryFor · два теста-пина · файл `configs/langpacks/zh-ru/genre-glossary.txt` — удалить. ⟦TM-CANON⟧-якоря и CanonConflicts НЕ трогаются. Цена: пере-покупка только батчей терминолога (файл вне pack.Version — правка самого пака это обеспечила); волны не двигаются. **Вместо словаря главным вопросом становится эмиссия:** recall term=0.040 (修行 ×326 невидим терминологу); расширение СОГЛАСУЕТСЯ с принципом — даёт владельцу больше строк на решение, ничего не решая за него; цена известна из абляции (cap→0.429 при 624 строках; +тип→0.875 при 13 246, precision ≈0.15) + feed_cap (D39.45); kwic-дефолты 3×40 не покрыты замером (мерено на ~8×120). Санкция владельца на дизайн расширения — ожидается.
|
||
|
||
**Процессное правило №4 — в нормы промтов** (к трём из D39.46): деливерабл промта не отменяет права сессии сказать «этого делать не надо»; замер, подрывающий ПОСЫЛКУ задачи (не исполнение), обязывает остановиться и поднять через канал вопросов, а не выдать формально требуемый артефакт.
|
||
|
||
## D39.58 — ХОЛОДНЫЙ МИНИ-ПРОГОН ПРИНЯТ И ЗАЛЕНДЕН ($0.126068 из $0.50; закрыт владельцем после банк-стопа, Р7 «замер достаточен»): ГЛАВНОЕ — совместный recall холодного банка майнер∪банкнота = **0.918/0.980** против 0.069–0.103 у майнера соло, банк приходит владельцу ПЕРЕВЕДЁННЫМ (149/150 строк с dst) · банкнота-парсер v2 ПАР-СЛЕПОЙ («src непуст и засвидетельствован книгой», строка 19 закрыта) + восстановление порядка колонок тем же инвариантом · РАЗДЕЛЕНИЕ ВЕРСИЙ КАНАЛА ратифицировано (Р2, амендмент инварианта №2: `bankSliceVersion` фолдится — его выход оплачен чекпойнтом; `bankParseVersion` едет с прогоном — его выход пересчитываемые улики) · секция редактора по ПРОВЕНАНСУ (S7), путь (ii) — экспозиция 0 доказана диффом (1119 пар «запись×ключ», 32 банка, позитивный контроль; версии не бампались) · ЭХО-МИНА ЖИВА при thinking-ON (П3 пре-регистрации: 2/20 черновиков чистым исходником, han_share 0.999; гейт `cjk_artifact` поймал, эскалация вылечила; «echo 0» D39.20 — свойство выборки, не гарантия) (31.07, оркестратор №9). ✅
|
||
|
||
## D39.62 — ОТВЕТЫ ВЛАДЕЛЬЦА ПО §12 ОБЩНОСТИ + НОРМА САМОПРОВЕРКИ + ДИРЕКТИВА ГОРИЗОНТА (01.08): **(Q1) П1 цель-шов САНКЦИОНИРОВАН** в состав rewrite-пакетов — формула владельца: «поедет в следующих паках — не принципиально когда и где именно, главное бэкенд писать по умному; цель исследования = найти и предложить, как снять инертность китайского/мастер-гу подхода в коде» ⇒ заморозка D39.24 §15.3 («ru-target-долг НЕ чинить») АМЕНДИРОВАНА: назначенный носитель = П1, приёмка = «пара, которой нет в репо, проходит слой 7 без правки Go»; **(Q5) пак-21 как единица РАСТВОРЁН** («мне в принципе без разницы» + карта D39.60): дешёвая шестёрка (#11 · #2 · #4 · гомоглиф · строгий OffLanguage с оговоркой 36а · строка 26) → батч фазы 2 · корзина (II) → П1/П2/П3 · #9 → арка банка (строка 73) · #12/K4a — сняты как не-дефекты; **(Q2)** resnapshot-фигура объяснена владельцу по-человечески — его внимания сверх одной будущей подписи не требует: запуск ОДНОГО общего resnapshot после развилки 74, цена сегодня ~$0.3–0.5 корпуса, после МАСШТАБА — порядки; **(Q3)** расщепление хеша пар-данных — НЕ делаем (объяснено; дисциплина взамен: правки данных копятся в тот же resnapshot-батч); **(Q4)** Р2/Р4 раскрыты владельцу отдельным сообщением, ответы ожидаются (строка 1); **НОРМА (дословно по смыслу): «сессиям ВСЕГДА писать мандат самопроверки исполнением на ВАЖНЫХ задачах — как текущий бэкенд и ресёрчи; на мелких — самопроверки меньше»** — вписана в промт-нормы оркестратора (вместе с уроком D39.61 «вывод на агрегате до вскрытия единиц запрещён»); **директива «планировать подальше и получше»** — горизонт достроен в CURRENT-STATE до Ф3 (фаза 2 общности → арка автономности банка → пере-замеры на новом стеке одним мини-прогоном → свип гипотез качества → добор идеала → ВТОРАЯ ПАРА живьём → МАСШТАБ → пилот Ф2.5 → Ф3 ридер-IDE); выданы промты: `BACKEND_GENERALITY_PHASE2_SESSION_PROMPT.md` (П0–П4+шестёрка+77/78, $0-код, resnapshot только по отдельному слову) · `POLYGON_BANK_RAWMATERIAL_SESSION_PROMPT.md` (строки 21/22 + аудит типов 36а на сырье холодного прогона, $0; проб-пакет §12.7 — только по слову владельца) (01.08, оркестратор №9). ✅
|
||
|
||
## D39.63 — Р2/Р4 ОТВЕЧЕНЫ + ФИГУРА RESNAPSHOT РАСТВОРЕНА ПОСЫЛКОЙ ВЛАДЕЛЬЦА (01.08): **(1) Р2 = ЗНАЧЕНИЕ**: контракт семейства детекторов единиц/шкал (DC1-часы · магнитуды 万/億 · 成-доли · любой пересчёт) — жёсткий флаг ТОЛЬКО за неверное ЗНАЧЕНИЕ; неконвертированная в единицы читателя форма = мягкий счётчик/линт, НЕ дефект (согласуется с precision 1.000 против 0.167 разметки пакета-6); контракт передан фазе-2 промтом; **(2) Р4 — норма подтверждена** («Ладно»): у правила бывает потолок полноты by construction, записывается в контракт правила, «неразрешимая речь/мысль» не дефект и поклассово не переспрашивается ⇒ **строка 1 (Р1–Р4) ЗАКРЫТА ЦЕЛИКОМ** (Р1 расщеплён D39.60, Р3 закрыт D39.44 Q4); **(3) владелец оспорил посылку «один общий resnapshot» — и ПРАВ для текущей фазы**: боевых книг в полёте нет, стендовый корпус ОДНОРАЗОВЫЙ (старые БД остаются читаемым $0-сырьём, перекупать их не для чего), каждый следующий замер — СВЕЖИЙ мини-прогон на новом стеке ⇒ фигура D39.60 п.(2) вырождается в дисциплину секвенирования: платных замеров не покупать, пока фаза-2 не залендена (иначе меряем вчерашний стек); механика `--resnapshot`/условных фолдов/П0-хеширования остаётся и строится — она про эру боевых книг после МАСШТАБА; побочное упрощение: данные-правки (шестёрка · #8 两 · класс speech-cue) на этой фазе перестают быть «дорогими»; **(4) развилка 74 — оперативное состояние «(в) ждать» по умолчанию**: платных прогонов до конца фазы-2 нет; перед следующим платным прогоном — ре-проба flash за копейки, довесок того же прогона — итерация №2 редакторов (D39.22); **(5) само-ревью выданных промтов по вопросу владельца — три дыры найдены и закрыты правками**: контракт Р2 вписан бэкенду · заметка о параллельной сессии и заморозке бинаря — обоим · карта чтения — полигону; параллельный запуск двух сессий подтверждён безопасным (зоны и артефакты не пересекаются) (01.08, оркестратор №9). ✅
|
||
|
||
## D39.64 — ОБЩНОСТЬ ФАЗА 2 ПРИНЯТА И ЗАЛЕНДЕНА ($0 — ноль платных вызовов, `--resnapshot` НЕ запускался; приёмка исполнением + адверсариальное 6-агентное ревью оркестратора: ни одно несущее утверждение отчёта не опровергнуто): построено **П0** — `lang.EmbeddedVersion()` (sha256 эмбед-данных, framing как у `Load`) БЕЗУСЛОВНЫМ фолдом в снапшот, дыра эмбед-плоскости ЗАКРЫТА (строка 76; мутационный тест: байт `target-ru.txt`/`injection.txt` = громкий resnapshot); **П1 цель-шов слоя 7 по данным** — `isRuTarget`×6 УДАЛЁН → `TargetActive()`/`TargetScriptNonLatin()`, токенизатор цели `TokenizeScript` с алфавитом из `word_script` данных + Mn-фолд U+0301 (#11 закрыт) = ЕДИНЫЙ шов линт↔репэйр (долг `repair.go` РЕПЭЙНУТ), `ExportNormalize`-гейт (7 сайтов), `ruSanitizer`→per-run поля `Checkers`, реестр целей из эмбед-файлов; книга `target_lang: en` инертна ПО ОТСУТСТВИЮ данных (мут.тест) — строка 32 ЗАКРЫТА; **П2 скрипт-шов источника** — `cjkShare`→`sourceScriptShare` по ОБЪЯВЛЕННОМУ письму (новый `lang-script.txt` + единый реестр `scriptRanges`), Hangul в CJK-leak: живой баг ko ЗАКРЫТ (строка 75), en/ko-эхо больше не слепые (вердикт-вокабуляр `cjk_artifact` сохранён); **П3** — 話-глава данными · sourceAbbrevs по языку книги · generic-детект глав без units («Chapter 12») · sizing-таксономия в ОДНОМ доме (`text.DenseScript`); **П4** — табличные опц-файлы + манифест-по-каналам: источник без пиньинь-морфологии грузится без Palladius-файлов, манифест-less пак БАЙТ-ИДЕНТИЧЕН (`langpack-v2-a28ed743c99c` — независимая проба оркестратора HEAD-vs-дерево), `packAlgoVersion` НЕ бампался — самый жёсткий блокер слоя данных СНЯТ; **шестёрка 2/6** — #11 + `translitInterjections`→данные (строка 26 закрыта); **#77** — ручка `RegenerateEchoBeforeEscalate` (дефолт 0 = байт-в-байт текущее поведение; гейт D19.2 не тронут; включение — решением при ре-пробе 74; при включении помнить: общий счётчик attempt с length-ре-геном + рост `maxTokensForAttempt` на каждом ре-гене). Верификация оркестратора: `-race` 14/14 · **Ш-1 НЕЗАВИСИМОЙ классификацией диффа голдена: 172 строки = ровно 5 осей** (`embedded_version` НОВАЯ · cheapgate-v6 · sanitizer-v7-hangul-leak · classify-v2 · chunker-v6; content_hash/disp/wire-тела/stage_text — 0) · майнер-парити EXACT (`n=13618`, катастрофы точны, recall 0.9655) · перекупок НЕТ (D39.63). Приёмочный критерий «пара, которой нет в репо, проходит слой без правки Go» ДЕРЖИТСЯ для П0/П1/П2/П4 + generic-П3 (свип: новых языковых ветвлений диф не внёс; остатки = документированные ru-дефолт-обёртки + флаги). **9 флагов §5 (не «10» — off-by-one) — очередь владельца (строка 14):** ё-фолд→данные (вердикт-несущий банк, сдвиг `memory_version`) · segmentation-фолбэк громким (ломает контракт corridor-фолбэка — `pipeline.go:839-848` + голден-фикстура на нём) · Fertility-map (калибровка ждёт боевого токенизатора) · encoding-реестр · 4 дефекта пака-21 → пакет-чекеров при свежем мини-прогоне (корпус `labels/` на стенде ЕСТЬ — барьер = утраченный в scratch харнесс) · #78 money-путь (дизайн §5.6 готов, не $0-хастл — строка 78 остаётся). Новая строка 79: остаточные Cyrillic-хардкоды пар-гейтед DC-чекеров (`checks/repair.go:131` · `checkers.go:457,474`) — инертны без dc-данных пары, кандидат на `c.wordScript`. Строки 72 · 75 · 76 · 77 · 26 · 32 ЗАКРЫТЫ (01.08, оркестратор №9). ✅
|
||
|
||
## D39.69 — КАЧЕСТВО БАНКА: ОБА ЭТАПА ПРИНЯТЫ И ЗАЛЕНДЕНЫ (этап 1 дизайн ратифицирован ВЛАДЕЛЬЦЕМ напрямую; этап 2 стройка той же сессией, $0, чекер-пак ещё не стартовал — коллизий нет; приёмка оркестратора: тесты/парити/голден исполнением + независимое воспроизведение флагманских чисел + 4-агентное адверсариальное ревью): **ПОСТРОЕНО ТРИ ПРИМИТИВА** — **§1 серия-батчинг (36в ЗАКРЫТА)**: `DetectSeries` HEAD-AWARE (равная длина · общая голова · различие только в модификаторе · L=1 вне · без транзитивного замыкания) + серия ЦЕЛИКОМ в батч + value-порядок отреза бюджета (частота-desc — **feed_cap ЗАКРЫТ этим**, из строки 86 изъят); канал по классу письма из данных (`lang-script.txt`), алфавитный источник инертен; «ровно 4 серии на живом BANK-FULL, ноль блоба, 方源/元石/元海 вне» — воспроизведено оркестратором НЕЗАВИСИМО; **§2 тип-классификатор ПЕРВИЧНЫМ (36а ЗАКРЫТА)**: отдельная фокус-фаза ДО RenderBatch (единственная форма с живой пробой 6/6), корректный тип роутит conform + праймит рендер + банкуется `attachClassifiedType` БЕЗ смены эмиссии (D39.50 не реоткрыт); своя роль/бюджет/промт `classifier.md`, request-hash-ось, fail-loud пары без промпта; честный $0-экран (тест ПИНИТ, что он пропускает юаньши/Юаньхай — флаг, не гейт); денежный цикл терминолога зарефакторен в общий `runBankRoleBatches` (resume $0 запинен тестом); **§3 Decl-шов (строки 27/84 ЗАКРЫТЫ)**: `lang.TargetStemmer` из ru-ДАННЫХ `decl_suffix` (пара без данных инертна) → `dstFormPresent` принимает косвенные падежи; короткая форма 27 — уже работала через `decl.forms[]` (пин пре-существующим тестом); neuter end-to-end (enum · `gender_neuter` в injection-данных · SeedLint громко отбраковывает неизвестный род); ось = **scoped `neuter-directive-v1`-фолд в `memory_version`** (отступление от дизайна ПРИНЯТО как улучшение — точнее правила условного фолда §6.2, книга без neuter байт-идентична, голден доказал). **ЗАКРЫТО ПО НУЖНОСТИ дизайном (ратификация закрытий):** 36б второе мнение — бэкенд-стройки НЕТ, маршрут = полигон-замер (Q2, строка 5 перевязана) · резюме-слой (строка 80) — проза-суммарайзер закрыт, строка = ГЕЙТ ПИЛОТА Ф2.5 («допускает ли нарратив-строка детерминированный верификатор — или это D1 со схемой») · эмиссия головы 蛊 — сид-половина (чек-лист) + измер-гейт Q7 ПОСЛЕ #10 (строка 18 перевязана) · эмбеддинг A7/D2 — закрыт по нужности, реопен = измеренный recall-разрыв на МАСШТАБЕ, только batch-time лейн · STITCH — закрыт до давления МАСШТАБА (реопен = бюджет ИЛИ измеренный эффект размера инъекции) · ranked-set — качество закрыто §1, hard-режим = Q4. **First-occurrence-тест ($0, исполнен): гипотеза первенства ОПРОВЕРГНУТА** — роль не первовхожденческий и не частотный выбиратель, ре-решает контекстом (позитивное подтверждение D39.65). **Голден: 172/172 hex-only** (сдвиг = `embedded_version` от данных injection/target-ru), вердикты байт-идентичны. **Фикс-лист → строка 87** (несущее: «ь» в `decl_suffix` — приёмочный кейс «Фан Юаню» сейчас ПРОВАЛИВАЕТСЯ; неверный комментарий Batch про независимость request-hash; оверсайз-серия одним батчом — помнить cap-8000; classify-валидация/тесты; мутационный тест neuter; voice-stemmer вопрос). **⚠ Вопрос владельцу Q8: `classifier.md` несёт книжные каноны (方源 и др.) в общий пар-слой** — санкция или жанрово-генерические примеры. Вопросы §9 Q1–Q7 + Q8 — строка 88. Платный порог «6/6 harm» — добрать при ре-пробе 74 (02.08, оркестратор №9). ✅
|
||
|
||
## D39.70 — ОТВЕТЫ ВЛАДЕЛЬЦА ПО §9 БАНК-ПАКА + КАНОН ЦЕЛЕЙ (02.08): **(Q8) книжные примеры в `classifier.md` САНКЦИОНИРОВАНЫ** с восстановленной нормой: языко-/книго-специфичное ДЕЛАТЬ МОЖНО — но выносить в данные/отдельные модули, встраиваемые архитектурно чисто (пар-промпт = легитимный модуль); **(Q1–Q7) делегированы инженерному «как лучше по исследованию, соблюдая цели»** — диспозиции: Q1 канон-пин серий НЕ сейчас (вернуться на МАСШТАБЕ) · Q2 полигон-замер нужности 36б — ДА, до любой стройки (слот при ре-пробе 74) · Q3 резюме = гейт пилота Ф2.5 ПОДТВЕРЖДЁН (строка 80) · Q4 hard-инъективность — НЕТ (warning-only по дизайну, порядок закрыт серией) · Q5 авто-транслит реалий — промпт-инструкцией роли «предпочитай смысловой перевод реалий; транслит — именам собственным» (данные пар-промпта, в фикс-лист 87; судится следующим прогоном) · Q6 «сокращённая форма» = МОРФОКЛИП (`decl.forms[]` достаточно, $0; прозвища живут алиасами банка — отдельного поля НЕ строить); отбраковка неизвестного рода компат-безопасна (neuter-сидов в природе нет) — строка 27 остаётся закрытой · Q7 замер эмиссии головы — ДА, дешёвым полигон-слотом ПОСЛЕ #10 (очередью с ре-пробой; строка 18 уже так стоит); **(2) оценка `series.go` по канонам (вопрос владельца)**: ядро — ПО КАНОНАМ (пакет пар-агностичен, параметры приходят значением, алгоритм generic и детерминирован, языковые примеры только в комментариях с измеренным «почему»); один этаж ниже канона — `SeriesMorphology`: `head_final` захардкожен Go-константой CJK-класса вместо данных (код сам помечает «the one place to revisit») → в фикс-лист 87 добавлено «`series`/`head_final` → строкой в `lang-script.txt`» + консолидация дубля `lang.TokenizeWords`↔`text.TokenizeScript`; **(3) КАНОН ЦЕЛЕЙ ПРОЕКТА сформулирован и вписан в CLAUDE.md** («Цели и мерило», 6 пунктов: продукт-качество · мультиязычность модулями/данными · чистая поддерживаемая архитектура · современные подходы/харнесс-превосходство · экономика с видимыми деньгами · детерминизм) — собран оркестратором из формулировок владельца (START_PROMT, 24.07 общность, 01.08 критерий, 02.08 харнесс-буллеты), НА ПОПРАВКУ владельцу; сессионные промты далее ссылаются на канон вместо пере-цитирования. Строка 88 ЗАКРЫТА (02.08, оркестратор №9). ✅
|
||
|
||
## D39.72 — ОСТАТКИ КАРТЫ ОБЩНОСТИ ПОЛУЧАЮТ НОСИТЕЛЯ (вопрос владельца 02.08 «мы что-то взяли оттуда в бэклог?» — аудит показал ПРОПУСК оркестратора): из карты D39.60 взято и закрыто/затрекано ПОЧТИ всё — П0–П4 построены (D39.64) · П5 generic-майнер = строка 35 (гейт ja→ru) · П6 отклонён (D39.62 Q3) · 4 data-флага = строка 14 · остаток ведра C = строки 79/34 · книго-ось чиста по построению; **НЕ имело носителя ведро D («удалить», 12 сайтов)** — свип D39.66 заметил «не удалено, вне скоупа фазы-2», но строку я не завёл (нарушение собственной нормы D39.66 «каждое отложено получает строку тем же лендингом»); живые остатки подтверждены грепом: указатели на несуществующий `checkers_zh_ru.go` в комментариях (cheapgates.go:56,125,130 · langpack.go:73+) · ложная шапка checkers.go:22-25 · дубль isHeaderContentRune↔isHeaderSeparator · minerPackVersion «zh-universal-v1» · глифы ⟨проверить⟩ в tmctl/render · вес palladius в miner.go (часть исходной дюжины могла уйти фазой-2 — сверить по карте §3). **Заведена строка 89** (аудит-и-чистка ведра D + сверка ведра B «6 пар-модуль-без-гейта» против фазы-2); носитель = ПАКЕТ-ЧЕКЕРОВ (бо́льшая часть сайтов в checks/ — промт дополнен пунктом) либо мелкая пачка (02.08, оркестратор №9). ✅
|
||
|
||
## D39.73 — РЕКОНСИЛЯЦИЯ ТРИАЖА: ПОЛНАЯ МАШИННАЯ СВЕРКА НАХОДОК ПРОТИВ НОСИТЕЛЕЙ (владелец 02.08 «что ещё проебал? технические решения сессий проебал?»): все 77 находок свипа D39.66 + рекомендации пост-чека + фикс-листы приёмок D39.64–71 прогнаны механически против живых строк/дописок/закрытий. **Вердикт по решениям СЕССИЙ: целы** — их держал 951-позиционный свип (92% доказанных диспозиций) и адверсариальный пост-чек кодом; **провал локализован в ТРИАЖЕ оркестратора**: из ~95 рекомендаций уронено 5 (ведро D — уже исправлено D39.72; идиоматика-словари сехоуюй/васэй-эйго/вэньянь → дописка 52; Ф2-хвосты 02-mvp CometKiwi/T-index · Batch API судьи · llama-server · стриминг → строка 90 к пилот-препу; arity-полоса паспорта D29.2г → дописка 55; платный порог приёмки §2 «6/6 harm» жил только в гниющей шапке → дописка в строку 74 с полигон-слотами Q2/Q7). 7 из 8 греп-кандидатов оказались ложными (носители живы: порог-3 в 25 · lintNumberMagnitude в 79 · источник 74 · триггер 12 · линк 02-mvp починен · F3-brief в 71 · echo-R6 в PACKAGE4). Норма-урок: триаж многоисточниковых находок завершать МАШИННОЙ сверкой «каждая рекомендация → носитель», не глазами (вписано в промт-нормы оркестратора) (02.08, оркестратор №9). ✅
|
||
|
||
## D39.81 — Фронт открыт: SaaS ратифицирован, процессная модель движка, инвариант непротекания конвейера, бэкенд-работы Ф3 получили строки (02.08)
|
||
|
||
По релею записки фронт-направления; все несущие техутверждения сверены кодом до записи (HTTP-слоя в backend нет — 0 вхождений ListenAndServe; рамка research/16:13 «выхлоп = экспорт-артефакты, НЕ веб-сервер; API/SSE — Ф3» дословна; `pipeline/ratelimit.go:11` — гарды per-процесс, mistral ~48% отказов под параллелизмом; `store.go:43` EXCLUSIVE flock + `OpenReadOnly`-пути без flock; банк-пауза `--verify-bank` построена). Ратифицировано: **(1) Продукт = SaaS**, не локальное приложение (решение владельца 02.08); зоны `frontend/` (фронт-сессия на моках, промт `frontend/docs/FRONTEND_SESSION_PROMPT.md`) и `platform/` (control plane) — живые, роль «Платформа» в CLAUDE.md; натив-прицел V0-п.26 снят этим решением (реестр ПТ-23). **(2) Инвариант непротекания конвейера:** интерфейс не раскрывает модели/стадии/внутреннюю терминологию — пользователь видит «загрузка → разбор → перевод → подпись банка → финал → готово»; API отдаёт продуктовые понятия, слой перевода внутренних вердиктов обязателен (сегодняшний read-model с flag_reason/стадиями наружу не выдаётся); ревью-вопрос — зеркало общности: «сменится стадия конвейера — придётся ли править фронт?» (реестр ПТ-33). **(3) Процессная модель:** движок = процесс-на-прогон (EXCLUSIVE flock — инвариант, не ограничение); СЕРВЕР В backend НЕ ПИШЕТСЯ — HTTP/SSE и пользователи/квоты/очередь живут в `platform/`; read-API строится поверх готовых `OpenReadOnly`-путей. **(4) Строки:** НОВЫЕ 95 «контракт API v0 + продуктовый словарь статусов» ($0; ЕДИНСТВЕННАЯ ранняя вставка — фронт на моках, без пришпиленного контракта моки и API разойдутся классом «док↔код»; двухфазный поток вывести из готового `--verify-bank`, не проектировать) · 96 «HTTP/SSE + сервисная обвязка в platform» (Ф3, после 95) · 97 «глобальный брокер рейт-лимитов» (гейт «до второго параллельного пользователя»); ПЕРЕВЕСЫ: 49 annot-половина D15.2 → «скоро» (annot-v1 = источник замечаний фронта, критический путь подключения) · 94 → «к подключению фронта». **(5) Курс НЕ пере-упорядочен:** движковая очередь (смолпак → ре-проба 74 → добор идеала → ja→ru → МАСШТАБ) стоит — фронт бэкенда не ждёт. Поправки записке при приёмке: реестр требований, который она предлагает завести, УЖЕ построен (D39.80, `product-requirements.md`); H7/H8/H10 уже несла строка 94; ETA — строка 54; H-требования сверены — статусы записки совпали с реестром (02.08.2026, оркестратор №9, по релею владельца «надо записать в планы»). ✅
|
||
|
||
## D39.84 — Стек фронта/платформы запинен, восемь решений владельца ратифицированы, работы движка под фронт получили строки, перевод не индексируется (02.08)
|
||
|
||
По релею отчёта фронт-сессии (исследование стека закрыто: 15 агентов — 7 направлений × независимые скептики-опровергатели + синтез, версии сверены с вебом 02.08, blocker/major-поправки скептиков записаны исправленными вариантами; артефакты `frontend/docs/STACK_DECISIONS.md` и переписанный `frontend/docs/FRONTEND_SESSION_PROMPT.md` — фронт режется на этапы S0–S7, первая кодовая сессия кончается витриной токенов). Приёмка оркестратора: 10-агентный refute-воркфлоу — ВСЕ несущие бэкенд-утверждения записки CONFIRMED по коду, 8/8 веб-пинов подтверждены первоисточниками (TS7 GA 08.07.2026 БЕЗ программного API до 7.1 → TS 6.0.3 · Vite 8 = Rolldown · Fleet закрыт 22.12.2025 · react-resizable-panels v4 Group/Separator · react-router 8.3 Node≥22.22 — стенд 22.22.3 проходит). **(1) Восемь решений владельца:** рынок глобальный, SEO только Google (Яндекс снят) · выравнивание колонок грубое по единицам экспорта — механизм ГОТОВ (`tmctl export --pairs`, побайтное выравнивание по edit-unit, `internal/pipeline/export.go:89-93`; уточнение приёмки: draft-only-пайплайн шипит по чанкам, для штатного edit-пайплайна утверждение точно) · подсветка сомнительных мест только блок/глава, внутритекстовые спаны НЕ строятся (у $0-гейтов нет байтовых смещений) · остановка на подписи банка = параметр запуска per-run — ГОТОВО (`--verify-bank`, exit 3, `invocation.go:108`/`main.go:39-46`; галочка формы = передача флага, движок не трогается; в draft-only не останавливает — `mining.go:193-197`) · оплат в MVP нет, денежных полей в UI нет вовсе (расход остаётся телеметрией владельца; потолки/rebill-согласие движка канон §5 не трогает) · десктоп = устанавливаемое PWA первым шагом, Tauri по явным триггерам · макет-инструменты не используются, источник вида = пиксель-замеры референса (Fleet невоспроизводим — растровое совпадение не критерий готовности) · аутентификация: ОДНА серверная сессия, предъявление кукой (браузер) или Bearer (десктоп/CLI), principal только в middleware — вход дизайна П-1 платформенного бэклога. **(2) ПТ-34, продуктовый запрет:** ни один символ пользовательского перевода никогда не попадает на публично индексируемый URL — ни витрин, ни «поделиться», ни публичных ссылок чтения (авторское право + политика Google по масштабируемому машин-контенту бьют по всему домену); носитель — двухконтурный деплой (SPA `app.<домен>` целиком под noindex + статический публичный контур, STACK_DECISIONS §4). **(3) ПТ-21 переформулировано:** якорь чтения = edit-unit экспорта, НЕ «чанк пайплайна» — финальный текст существует только на уровне юнита (~1.9 юнита/главу по замеру фронта; «4276 юнитов» из артефактов репо не выводится — полнокнижной БД не существует, что само подтверждает тезис о ре-ингесте; принято как замер сессии, порядок величин сходится с coldrun-a); читалка обязана жить с «глава = один блок». **(4) Работы движка → строки 99–102** (каждая проверена кодом): 99 пофазный прогресс draft N/M ∥ edit N/M (done = все draft-строки членов + edit-строка, `status.go:328-331/365` — индикатор 0% ВСЮ черновую волну; `chunk_status` уже несёт гранулярность — выводимо без миграции схемы) · 100 персист манифеста глав/чанков + хеш источника (каждый read-вызов заново ингестит и режет исходник — `status.go:177-195`, redrive дважды за вызов; замер фронта 1.42–1.51 с CPU/23 МБ; `chunker_version` уже в снапшоте — `pipeline/render.go:53`) · 101 машиночитаемая таблица подписи банка (кап 20 = только stdout `render.go:98`; полная таблица — текстовый сайдкар `.bank-stop.txt`; JSON нет нигде) · 102 внешний trace-контекст в tmctl (TraceID минтится заново каждым вызовом — `main.go:67-70`; внутри вызова трасса цельная, `request_log.trace_id` персистится). **(5) Противоречие разрешено ВЕРНО:** рекомендация интеграционного агента «долгоживущий демон в backend» отвергнута самой сессией по D39.81 — ратификация удержана, HTTP/SSE/очередь в `platform/`. **(6) Две ловушки эксплуатации подтверждены и заведены входами дизайна (строка 95 · П-1):** подпись термина ≠ UPDATE строки — банк пересобирается каждым прогоном (seedGlossary REPLACES + ReplaceBank DELETE/re-INSERT, `seeding.go:18/110`, `glossary.go:158-162`; контракт подписи пишет в файлы-источники: mined-delta/сид; след затирания — только журнальная строка glossary_revisions, без предупреждения) · порядок деплоя платформы: read-путь схему НЕ мигрирует никогда (`store.go:135-143`, «schema vN … expects vM» в обе стороны; чинит write-команда, годится и `redrive --dry-run`; `tmctl backup` НЕ мигрирует). **(7) Норма зонных бэклогов (решение владельца при лендинге):** фронт и платформа держат СВОИ бэклоги в своих зонах — `frontend/docs/BACKLOG.md` (Ф-1..Ф-6) · `platform/BACKLOG.md` (П-1..П-4); засеяны оркестратором при лендинге переносом уже записанных отложенных решений, дальше ведут зоны; ЕДИНЫЙ бэклог PROGRESS фронт/платформа-строк НЕ принимает — остаётся трекером движка/полигона/доков; движковые стыки фронта (зона «бэкенд») живут в едином (строки 99–102); строки 96/97 переехали в платформенный (П-1/П-2) с ID-надгробиями-указателями (ID стабильны навсегда — внешние ссылки не рвутся). **(8) Лендинг зон** `frontend/` + `platform/` + `.gitignore` (`frontend/references/` — скриншоты вне git, пины замеров сохранены в доках). (02.08.2026, оркестратор №9). ✅
|
||
|
||
## D39.85 — Шов движок↔платформа: индустриальный стандарт ратифицирован — событийный поток, материализация, артефакты; ресёрч записан (02.08)
|
||
|
||
По слову владельца («двигаемся в сторону стандарта индустрии, запиши что узнал аргументированно»). Ресёрч: `docs/research/23-engine-platform-seam.md` (5-агентный воркфлоу: три веб-направления по первоисточникам + репо-инвентаризация + независимый арбитраж — 9/9 вердиктов подтверждены, 3 поправки внесены; правила internal проверены ЖИВЫМИ сборками go1.26.4; $0). Ратифицировано: **(1) Форма шва — три канала:** живой статус = версионированный однонаправленный NDJSON-поток событий движка (шаблон terraform -json: version-хендшейк первой строкой, semver «минор = ignore-unknown / мажор = reject», stdout только потоку — человеческие логи уже на stderr) → воркер-обёртка платформы материализует в СВОЙ Postgres идемпотентным апсертом (run_id, seq) → SSE и все чтения ТОЛЬКО из Postgres (Reporting Database, НЕ полный CQRS — предостережение Фаулера принято); массивный контент = артефакты границ стадий (export-JSON готов · таблица банка = строка 101 · манифест = строка 100); пост-фактум/ре-синк = `status --json`/`export` (CLI-as-API по критериям git-porcelain/kubectl/terraform — только для завершённого состояния, не для поллинга живого прогона). Реконсиляция обязательна: на обрыве потока материализация пересобирается из status --json и артефактов (BEP-каveat о потерянных при краше событиях). **(2) Анти-паттерны — запреты:** платформа НЕ читает живой SQLite движка (EXCLUSIVE-локи + смешение локинг-протоколов = порча по howtocorrupt §2.4 · checkpoint starvation = операционное проникновение · IntegrationDatabase-связность со схемой v1–v14+ · индустрия единодушна: Litestream/LiteFS/sqlite3_rsync/Fossil строят снапшот/реплику, не шарят живой файл); движок НЕ пушит HTTP (направление: движок эмитит — адаптер платформы пушит); человеческий вывод не парсится; неверсионированный ad-hoc JSON не эмитится (прецедент гниения docker jsonmessage); допустимая будущая форма чтения файла — ТОЛЬКО immutable-снапшот, экспортированный самим движком (VACUUM INTO уже есть — F4) с явным export-контрактом. **(3) Публичный read-пакет ОТКЛОНЁН репо-фактом:** NewReadOnlyRunner тянет 12 из 14 internal-пакетов (полный конфиг-стек + шаблоны + langpack + ре-рендер снапшотов, `runner.go:151-266`; арбитраж усилил: 12/14, не 10/13) — тонкого среза не существует; процессный контракт D39.81 подтверждён дословно. **(4) Модули:** sibling-структура двух модулей правильная — честный аргумент НЕ видимость (один модуль дал бы ту же изоляцию internal), а изоляция графа зависимостей: pgx/river не попадают в go.mod движка и не двигают транзитивные версии через MVS — довод от детерминизма; живой эксперимент-лазейка: модуль с путём, вложенным под `textmachine/backend/*`, импортирует internal (проверка по префиксу пути, golang/go#23970) → **ревью-гард: пути Go-модулей платформы/фронта никогда не вкладывать под путь движка**; go.work закоммитить при появлении Go-кода платформы (паттерн kubernetes/grafana). **(5) Носители:** НОВАЯ строка 103 (NDJSON-эмиттер со стабильным словарём + событие потолка — единственное отсутствующее, деньги сейчас только в тексте ошибки `stagerun.go:472-494`; малое касание — единичные call-sites рядом с готовыми slog) · входы контракта 95 дополнены тройкой (i)поток/(ii)артефакты/(iii)ре-синк · П-1 платформенного бэклога уточнён формой потока · README research-навигация += 23. Дизайн-промт контракта 95 — по слову владельца; словарь событий и продуктовый словарь статусов (ПТ-33) проектируются вместе (02.08.2026, оркестратор №9). ✅
|
||
|
||
## D39.93 — Дизайн-ввод владельца по строке 46 (02.08, ночь): проверки выхода — ИЗОЛИРОВАННЫМ модулем с ИМЕНОВАННЫМИ причинами; деталь «переиспользовать FlagCJKArtifact» СНЯТА в пользу именованного флага. ✅
|
||
|
||
Слово владельца: «какая разница почему пришёл отказ — бэкенду надо ПРИЧИНУ назвать (эхо · не тот язык · вообще не ответила); я выступаю за степень изолированности кода» + классический вопрос «сколько стоит добавить пару». Следствия, вносимые в дизайн пака экрана ДО его выдачи: (1) детекторы выхода живут отдельным пакетом чистых функций (вход: текст + дата-план цели; выход: именованный вердикт + счёт), движок только вызывает и маппит в диспозицию; (2) **деталь §3.6 отчёта «переиспользовать `FlagCJKArtifact` для нового экрана» СНЯТА** — она экономила правку `escalatable()`, но ВРЁТ о причине (off-target-язык лёг бы в телеметрию как «артефакт исходной письменности»); правильно: новый именованный флаг + явное включение в белый список `escalatable()` (диспозиция та же: эскалируем, не ретраим); (3) пары: сам экран пар-слепой (скрипт-набор цели из `data/lang-script.txt`), новая пара = строка данных; известные ограничения — 115 (явный embed-список: новая ЦЕЛЬ сегодня требует правки Go) и семантика ПОДМНОЖЕСТВ письменностей для ja/ko (чисто китайский выход для →ja набирает 1.000 — решается в данных набором скриптов, не в Go). Попутно: предложение владельца по DeepSeek «поднять токены размышления при low» = ровно открытый замер строки 44 (вариация флора при `low` не проводилась; при `high` фальсифицировано D39.86) — мини-проба ждёт его санкции.
|
||
|
||
## D39.99 — КОНТРАКТ API v0 РАТИФИЦИРОВАН: строка 95 закрыта; форма = OpenAPI 3.1; три пасса приёмки, 19/19 находок вправлены; пост-мортем промт-ревью в канон (04.08). ✅
|
||
|
||
**1. Артефакт и форма.** S3 упёрлась в замок (контракта не существовало, строка 95 без промта) — по слову владельца написала вход Ф-14 (`frontend/docs/API_CONTRACT_INPUT.md`) и черновик контракта. **Решение владельца о форме: нормативная поверхность = OpenAPI 3.1** (`openapi.yaml`: JSON Schema моделей, spectral-линт шестым шагом `npm run check`, типы фронта ГЕНЕРЯТСЯ `openapi-typescript` с дрифт-тестом по голден-паттерну, MSW типизируется от них) — класс «фикстура выдумала форму», случившийся ЧЕТЫРЕЖДЫ (org/fullname · титульная политика · «Раздел N» · девять статусов), закрыт механически; прозаический md остался компаньоном (провенанс ✓/◆/○ · обоснования · К-вопросы). AsyncAPI отложен с записью (Ф-24). **Дом ратифицированной копии — `docs/architecture/14-api-contract/`** (спека байт-копией + компаньон-README с ревью-шапкой; байт-сверка копий — обязанность каждого лендинга; генерация типов далее из ратифицированной копии — контракт первичен).
|
||
|
||
**2. Приёмка — три адверсариальных воркфлоу-пасса, 0 опровергнутых из 19 подтверждённых** (черновик: 4 линзы×скептики, 2 high — «withheld=текст не выдан» ложно о движке (sanitizer_stripped и c-lite drop отгружают текст под флагом, `disposition.go:96-104`/`export.go:203-215`) и чтения без канала шва (текст юнитов посреди прогона · полный банк — строка 101 это таблица подписи, не экспорт) + 8 medium — сквозной паттерн «инфляция провенанса ✓ на ◆-предложениях»; round-1 дофикс: 6/6 применён, перепроверено кодом, генерённая цепочка подтверждена пере-генерацией байт-в-байт; round-2 свежий взгляд на новые схемы: 5 medium — экспорт ненаблюдаем · promote без dst (движок hard-reject, `memseed.go:84-86`) · закрытый required kind против легального пустого (`memseed.go:323-326`) · самопротиворечие §2.7 · resume после потолка без канала поднятия; все вправлены, включая if/then-констрейнт с честным замером «openapi-typescript игнорирует 3.1-условия» → К-11). Сессия сама завела К-10 (несплитованный счётчик главы) и К-12 (poll vs push экспорта). State выведен из ПАРЫ (вердикт, наличие текста); фразы приложения А — плейсхолдеры (В-3 за владельцем); ПТ-34-инвариант вписан (noindex · no-store · выгрузка только владельцу).
|
||
|
||
**3. Очередь.** Строка 95 ЗАКРЫТА. **99/100/101/103 перевешены «к подключению фронта» → «скоро, БЛОКЕРЫ контракта»** (аргументы сессии подтверждены кодом: без 100 у главы нет стабильного id — нумерация плотная, `chunker.go:99-105`; без 99 индикатор 0% всю черновую волну — `status.go:328-331`; без 101 подписной экран читает сайдкар с капом 20 — `cmd/tmctl/render.go:98`). НОВЫЕ строки: **125** банк-экспорт артефакт (канал `/bank`) · **126** механизм поднятия потолка (платформа; продуктовое слово — К-8) · **127** DDL-коммент `migrate.go:193` устарел (`auto` не пишет никто — фантом утёк во фронт-доки дважды). Счёт скриптом: 103 строки · скоро 21 · бэкенд 58/66.
|
||
|
||
**4. Пост-мортем процесса (вопрос владельца «где мы ошиблись на берегу») — три слоя, фиксы в канон.** (а) Ошибка последовательности оркестратора: ратифицирован S3-промт с мёртвым основным сценарием (замок закрыт, промта строки 95 не существовало) — фронт три сессии упирался в один вход. (б) Ревью промта было структурным, не построчным: инструкция «пинг в docs/PROGRESS.md» дословно следовала таблице ролей CLAUDE.md, но противоречила решению владельца 02.08 из шапки зонного журнала. (в) Системная дыра: решения владельца, принятые в зонных сессиях, не доезжают до канона. **Фиксы:** CLAUDE.md — пинг-канал фронта/платформы = ЗОННЫЙ журнал (`frontend/docs/frontend-PROGRESS.md` — переименован по слову владельца, писать туда всем включая оркестратора), не docs/PROGRESS.md; промт оркестратора — два чек-пункта (хендофф-промты сверяются ПОСТРОЧНО: каждая инструкция с путём/каналом вне зоны — против зонной таблицы; при каждом лендинге зоны — свип новых «решений владельца» из зонного журнала на confirm списком); шапка `frontend/docs/BACKLOG.md` разведена «предлагать обязан / ратифицирует оркестратор» (просьба №3 сессии — прежняя формулировка спровоцировала остановку первого захода).
|
||
|
||
**5. Открыто на владельце:** продуктовые К контракта — К-1 (десять статусов) · К-3 (метка главы в дереве) · К-5 (ETA в MVP; ПТ-19 существует) · К-6 (ось ступеней замечаний — операторская унаследована) · К-8 (слово и статус стопа по потолку) + заполнение приложения А (В-3) + прежний список D39.98 п.4 (confirm двух решений · авторство подчистки · приёмка банк-арбитража). **Следующий разговор на берегу — бутстрап платформы П-1: у второй стороны контракта ноль строк кода, К-4/К-7/К-12 адресованы зоне, которой нет** (урок строки 95 — не ждать, пока три сессии упрутся). (04.08.2026, оркестратор №12). ✅
|
||
|
||
## D39.100 — РЕШЕНИЯ ВЛАДЕЛЬЦА 04.08 ВЕЧЕР: четыре К контракта закрыты, лимиты «как Claude Code» (ПТ-35), платформа ОТКРЫТА промтом P0, зонные журналы = name-PROGRESS (04.08). ✅
|
||
|
||
**1. К-вопросы контракта, закрытые владельцем:** **К-1** — десять статусов приняты. **К-8** — механизм «как Claude Code»: страница лимитов/использования в настройках (СТАТУС, не суммы — запрет денег на экране D39.84 в силе и НЕ superseded), стоп по потолку = новое 11-е значение `BookStatus:paused` + оповещение «перевод остановлен: лимиты исчерпаны»; заведены **ПТ-35** (реестр) и **П-5** (платформенный бэклог: API лимитов — форму проектирует P0). **К-5** — ETA показывать: `eta_seconds` в спеку (движок отдаёт, `status.go:112`). **К-6** — принцип принят: две ступени замечаний, граница по ЧИТАТЕЛЬСКОМУ эффекту, не по операторской шкале; карта пере-раскладки — одним листом с фразами В-3 на подпись (владелец: «позже»). **К-3** — закрыт канон-уточнением владельца: метка главы — ИЗ ДАННЫХ книги, зашитой формы «Глава N» не существует (это шаблон langpack-данных; легальна книга без номеров/глав вовсе) — фронту проверить спеку и фикстуры на зашитую форму. Правки спеки — задачей первого шага S3 (блок в `S3_SESSION_PROMPT.md`; минорный бамп версии + регенерация типов + байт-сверка копий; канон правит только оркестратор пере-ратификацией диффа).
|
||
|
||
**2. Платформа ОТКРЫТА:** выдан промт **P0** (`platform/docs/PLATFORM_SESSION_PROMPT.md`): стек live-сверкой → layout (гард D39.85: модуль НЕ под путём движка) → компилируемый скелет (HTTP+`/healthz` · session-auth каркас П-1 · драфт схемы read-model · интерфейс NDJSON-ингеста) → зонная батарея → дизайн-ответы К-4/К-7/К-12 + форма П-5 ПРЕДЛОЖЕНИЯМИ (ратифицирует оркестратор); $0, LLM не зовёт, не в скоупе П-2/деплой/UI. **Норма зонных журналов (решение владельца): весь прогресс фронта и платформы — в зонных `frontend/docs/frontend-PROGRESS.md` / `platform/docs/platform-PROGRESS.md`** (заведён), пишут все включая оркестратора; `docs/PROGRESS.md` = движок/полигон/доки.
|
||
|
||
**3. Старые хвосты:** оба «решения владельца 04.08» из журнала фронта CONFIRMED («+» в левой панели = Добавить книгу, половина Ф-7 закрыта легитимно · референсы возвращены на диск). Подчистка D-лога (D39.98 п.3): владелец — «не я, но санкционировал, может, и я» ⇒ закрыто как «санкционировано владельцем, исполнено сессией-синхронизатором»; дисциплина D23.3 впредь — без изменений. Приёмка банк-арбитража — ПОЗЖЕ по слову владельца (артефакты остаются в дереве незалендены). Заполнение приложения А (В-3 фразы + карта К-6) — позже, готовит оркестратор с фронтом одним листом.
|
||
|
||
**4. Актуализация носителей этим лендингом:** ПТ-реестр (ПТ-35 нов; ПТ-18/19/20/33 — ссылки на закрытую строку 95 заменены контрактом 14) · CLAUDE.md (пинг-канал платформы = зонный журнал) · docs/README (промт платформы в активных) · шапка ратифицированного компаньона (пост-ратификационные решения). Единый бэклог не менялся: счёт прежний (103 · скоро 21 · бэкенд 58/66, D39.99). (04.08.2026, оркестратор №12). ✅
|
||
|
||
## D39.102 — ПРИЁМКА БАНК-АРБИТРАЖА (оркестратор №13): research/24 ПРИНЯТ — все числа чисты пере-раном; консилиум закрыт классом, бэкенд-доработки спланированы строками 128–132, 4 вопроса владельцу (04.08). ✅
|
||
|
||
**1. Вердикт.** Отчёт `research/24-bank-arbitration.md` + харнесс `eval/bank_arbitration/` + черновик v1 (`archive/reports/`) ПРИНЯТЫ и залендены. Верификация тремя контурами: (а) 12-агентный воркфлоу — пере-раны ВСЕХ строк «заявление = команда» ($0, офлайн по сырью): 8/8 CONFIRMED без единого расхождения чисел; 23/23 адресов §A подтверждены по HEAD `7f6270a`; веб-сверка §D по первоисточникам; байт-сверка инжект-пробы с рендером движка; (б) независимое ревью харнесса: деньги пересчитаны из сырья — $0.107334 против $0.107335 (округление записи), цены = `models.yaml`, 84/84 finish=stop, слаг-дрейфа нет, голд 53/53 против сида; арифметика ПИНГА («+$0.0161») — склейка инкрементов C+E, леджер чист; «потолок $1.00» — со слов сессии (ратифицирован $1.20, D39.90 п.5), при факте $0.107 беспредметно; (в) слепое ревью кода банка (author≠reviewer) + 12 опровергателей. Оговорки приёмки (конфаунд армов C/D · хрупкий C4 · SC=недетерминизм провайдера · пары-иллюстрации A4 · атрибуция Xiong'23) — в ревью-шапке research/24; выводов отчёта они не двигают.
|
||
|
||
**2. Ратификации по итогам замера** (в русле приоров D39.46/50/65/69): корзина «закрыть по нужности» ратифицирована ЦЕЛИКОМ — равноправный консилиум как прод-механизм · кросс-модельное взвешивание уверенностью · self-consistency N прогонов · селекция «выбери из вариантов» (потолок 17/45 классом) · отказ-сигнал ⟦TM-NO-DST⟧ · эмбеддинг-фетч (остаётся закрыт D39.69). Строка 5 пере-скоуплена: остаток Q2 = рецензент-второго-семейства ТОЛЬКО на спорных КЛАСТЕРАХ (слот при ре-пробе 74), роутинг целыми family/series-юнитами (урок E1-химеры), эмиссия рецензента — та же draft/⟨проверить⟩ (инвариант D39.42 §C2-7 не тронут). Вербализованная числовая уверенность — ordinal-очередь ревью ВНУТРИ модели (AUC 0.77–0.85), не арбитр и не кросс-модельный сигнал. Маркер ⟨проверить⟩ на транслятор-проводе поведенчески пуст (Δ=0) — доктрина «неподписанное с пометкой» получает цену; проба редакторского провода — вопрос владельцу.
|
||
|
||
**3. Бэкенд-доработки строками.** **128** — фикс-пак банка (вход §G, класс D39.71; гейт — подпись владельца, вопрос №4 отчёта). **129** — банкнота-парсер теряет хвост многословного dst (`banknote.go:236` против ре-джойна `terminology.go:880-885`; находка приёмки против клейма A10). **130** — emitRankCap×writeAutoBank: терм, выпавший из топ-200, молча стирается из авто-банка посреди книги; FL-3 ратифицирован ДО авто-провода D39.42, взаимодействие не ратифицировалось. **131** — кап инъекции не считает маркер/гендер-ноты: авто-книга превышает бюджет ~на 40–60% (биллинг компенсирован резервацией по рендеру); фикс двигает RequestHash ⇒ СТОП-решение. **132** — стойкий аутедж ТОЛЬКО банк-провайдера валит ран вопреки коммент-контракту «optional step never aborts». Строка 38 дополнена указателем «со слов» (ординал-адресация чекпойнтов). Опровергнуто/не заводится: term-класс эмиссии (ратифицирован замером D39.43/50, гейт Q7 строки 18) · «луна»-пример Палладия (жадная сегментация не даёт; класс «сама/вода» реален, бласт-радиус — порядок drafts под подписью) · NoDst-почти-сентинел на zh-ru (target_script обязателен конфигом, OffLanguage отбивает; остаток — латиница-target, хвост 128).
|
||
|
||
**4. Вопросы владельцу** (подняты отчётом, приёмка подтверждает): (i) мини-голд алиасов §E-1 research/20 (висит с 17.07) — делать?; (ii) «Гуюэ» слитно — пар-норма Палладия для составных фамилий (данные класса Z-B3, чинит 8/45) или вкус книги (канал — сид)?; (iii) санкция пробы редакторского провода двухсекционки (~$0.05); (iv) выдать промт фикс-пака 128 одним паком (перекупка бэнк-батчей — центы)? Рекомендация оркестратора: (ii) пар-норма и (iv) да.
|
||
|
||
**5. Гигиена лендинга:** путь промта в шапке research/24 → архив; аннотации приёмки в §A4/§D; пинг «Полигон» получил закрывающий маркер с поправкой арифметики; README/CURRENT-STATE актуализированы; `platform/*` не тронуто; сырьё (84 json) сверено sha256-манифестом до/после пере-ранов — байт-нетронуто; `gold.jsonl`/`forms_dump.json` пере-раном воспроизведены байт-в-байт.
|
||
|
||
## D39.104 — ДОКТРИНА ИНЖЕКТА РАТИФИЦИРОВАНА: банк на проводе — ЗАКОН для всех ролей независимо от статуса строки; свобода — только по ОБЛАСТИ употребления; «Гуюэ» закрыт (04.08). ✅
|
||
|
||
**1. Доктрина** (слова владельца: «надо давать везде одинаково; если кто-то ошибся — это уровнем выше»; финал — «фиксируем так»): банк на проводе = ЗАКОН для всех ролей, независимо от статуса строки; право «перевести иначе, если сомнительно» УПРАЗДНЕНО — это канал разнобоя между параллельными главами по построению, а настоящие юзкейсы свободы (игра слов · разбор знаков · буквальное не-терминное прочтение) от статуса строки не зависят и получают узкую оговорку ОБЛАСТИ употребления, действующую на все строки одинаково. **Принятая цена:** неверная авто-строка едет консистентно до ревью (чинится одной правкой банка + ре-эдитом; разнобой не чинится ничем). **Остаточный риск:** оговорка как лазейка — под leakage-метрикой пробы. Инвариант D39.42 §C2-7 не задет: статусы draft/auto и подписная таблица не меняются — доктрина о ПРОВОДЕ. Ошибки чинятся уровнем выше (терминолог+гейты+подпись) ⇒ фикс-пак 128 — главный рычаг качества банка.
|
||
|
||
**2. Форма на проводе:** единый закон-блок редактора вместо двухсекционки; маркер ⟨проверить⟩ с провода снимается (поведенчески пуст — research/24 §C; минус токены); транслятор-заголовок — та же логика. Кандидат-тексты — §B промта пробы; внесение в движок — **строка 134** ПОСЛЕ отчёта пробы (двигает рендер → RequestHash → перекупка, цену назвать при внесении).
|
||
|
||
**3. «Гуюэ» (вопрос (ii) D39.102) ЗАКРЫТ: не чинить** — расхождение с голдом = вкус, канал сида; конвенцию в проде держит сам банк инжектом; ру-специфика этого класса на голде ровно одна (замер research/24 §F1) ⇒ отдельный аудит транскрипционных правил не заводится. Зависимость принята владельцем: **фикс-пак 128 обязателен** — без него авто-банк даёт не конвенцию, а химеру.
|
||
|
||
## D39.106 — ШОВ: прогон переживает деплой платформы; журнал в каталоге книги + systemd-юнит-на-прогон; платформа НЕ родитель движка (05.08). ✅
|
||
|
||
**1. Решение владельца 05.08.** Верификация до ратификации: четыре чистых панели, ~18 агентов, две модели (research/25, там же отвергнутые альтернативы с причинами) — 0 голосов за «родитель+пайп», 0 за монолит, 0 за gRPC/брокер; атака на готовое решение: «доминирующей альтернативы нет».
|
||
|
||
**2. Форма (заменяет ТРАНСПОРТ D39.85 §1; остальное D39.85 в силе):** движок = транзиентный systemd-юнит на прогон (`Restart=no`, SIGTERM); события = `events.jsonl` каталога книги как проекция коммитов SQLite движка (outbox, та же транзакция, что чекпойнт); платформа тейлит, курсор `(engine_run_id, seq)` коммитится с эффектом в одной Postgres-транзакции; `status --json` — ремонт по остановленному прогону. Формат NDJSON/hello/seq, деньги (холд+потолок = защита, события = свежесть, D39.84/D39.100) и запрет на живой SQLite — без изменений.
|
||
|
||
**3. Обязательные механизмы при постройке — research/25 §«Обязательные механизмы» (реконсилятор на каждый выход юнита + перезапуск после ребута · intent/`uncertain` + ночная сверка с провайдером · пиннинг версии бинаря на прогон · гейт потолка пер-вызов). Следствия: PD-59 superseded; пайп-путь `supervisor.go` P1 = дев-режим; ответ PD-13 переезжает на cgroup юнита прогона. Строка 103 и денежные строки единого бэклога — при освобождении PROGRESS.md; задачи зонам — промтами.**
|
||
|
||
*(Тела D39.107–D39.123 — слайс [`../archive/architecture/05-decisions-D39-106-123.md`](../archive/architecture/05-decisions-D39-106-123.md), вынесено D39.139; D39.106 ниже — живое тело.)*
|
||
|
||
## D39.124 — ЗАКРЫТИЕ СЕССИИ №15, передача №16; докс-диета: хроники в архив-слайсы, CURRENT-STATE и зонный журнал платформы подрезаны (09.08). ✅
|
||
|
||
**1. Итог №15 одной строкой:** семь приёмок эры закрыты (D39.109–123, лента в CURRENT-STATE); последняя — платформа-раннер P4 (`d29e30c`, D39.123). Все реестры/финдингс-гейты закрыты, `counts --check` зелёный, чужие живые зоны (полигон эксп-22/23, правка владельца в промте оркестратора) не тронуты — кроме санкционированного: правка владельца по D39.120 (Fable↔Opus как «другая модель семейства») причёсана и залендена этим же коммитом.
|
||
|
||
**2. Докс-диета (заказ владельца 09.08: stale-вес мешает моделям читать).** Перемещено ДОСЛОВНО, без переписывания: (а) зонный журнал платформы 1856→~630 строк — эры P0–P3 (сессии + ратификации P1/P2/P3, вопросы P0/P1) → `platform/docs/archive/platform-PROGRESS-P0-P3.md`; «Текущее состояние» переписано на живые факты; пинги оркестратора (формы артефактов движка) оставлены живыми в хвосте; (б) `docs/PROGRESS.md`: хроника №11–№13 (D39.91–105) + снимок шести бюллетеней шапки эры №15 → `docs/archive/PROGRESS-2026-08-02-04.md`; шапка CURRENT-STATE пересобрана (лента · живое · открыто-на-владельце · указатели; служебные буллеты курс/горизонт/стек/счёт сохранены) (лента закрытого · живое · открыто-на-владельце · указатели); (в) `docs/README.md`: строка «активные промты» сведена к действительно активным, отработанные — общим указателем на архив. Правило прежнее: архив = дословный перенос с баннером, решения живут в D-логе.
|
||
|
||
**3. Хендофф №16** *(очередь ДОПОЛНЕНА D39.125 п.4: докс-пак 167 — первой задачей)*. Счётчик в `ORCHESTRATOR_SESSION_PROMPT.md` бампнут (№15 закрыт после этой ноты). Очередь — CURRENT-STATE п. «ЖИВОЕ»: лендинг эксп-22 (+вопрос про эксп-23) · промт эмиттера (входное чтение — п.4 D39.123) · платформенный промт по слову. Норма-добавка в промт оркестратора: хендофф-артефакты другим сессиям — только durable абсолютные пути (`~/tm-handoff/`, `~/tm-backups/`), не scratchpad. Незакоммиченного за №15 не осталось; в дереве — только живой полигон (09.08.2026, оркестратор №15). ✅
|
||
|
||
## D39.125 — ДОКС-ДИЕТА ПО АУДИТУ: D-лог слайсирован (−66%), PROGRESS −42%, факты-против-кода исправлены; нормы формы доков; сессия №15 закрыта передачей №16 (09.08). ✅
|
||
|
||
**1. Аудит (заказ владельца 09.08, метод — его же).** Инвентарь ОБОИХ файлов целиком отдельным Opus-агентом + 4 холодных Opus-читателя с поисковыми заданиями (главы · деньги · эмиттер · модели) + верификатор жалоб: **61 VALID / 9 PARTIAL / 1 INVALID**; ответы читателей без фактических ошибок — но ценой двойных чтений и слепых грепов. Worksheet с ревью-шапкой: `archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`. Диагноз: оба замысла выродились в хронику приёмок; событие жило в 3–4 носителях; дублирование дало три ФАКТИЧЕСКИХ расхождения (каждое ловила приёмка, ни одно — процесс); карта D-лога покрывала 14% веса.
|
||
|
||
**2. Исполнено этой нотой.** (а) **Слайсинг D-лога**: тела закрытых эр → 5 слайсов `archive/architecture/05-decisions-{D1-D38, D39-arch-reset, D39-20-58, D39-59-90, D39-91-105}.md` ДОСЛОВНО (сверка разбиения побайтным ассертом); телом в живом остались карта+эрраты, гейт-ноты D22·D25·D29·D30, несущие D39.25·30·33·42·47·58·62·63·64·69·70·81·84·85·93·99·100·102·104 и вся голова D39.106+; живой файл 961→323 КБ. (б) **PROGRESS 215→131 КБ**: пинги закрытых паков и блоки закрытых экспов → `archive/PROGRESS-2026-08-04-09.md`; мёртвые секции Память/Голос/Ридер-IDE закрыты указателем (синк CLAUDE.md); «Свежее состояние бэкенда» → указатель на CURRENT-STATE (D39.80). (в) **Факты-против-кода**: эррата D39.111 (баланс-минус-холды superseded D39.115) в шапку; research/27+строка 160 — subtitle ПОНИЖАЕТСЯ в тело, не выбрасывается. (г) Глоссарий: легенда неймспейсов (PD/П/Ф/В/К), «глава», денежный словарь, лексикон экспов. (д) README: правило чтения со слайсами, экспы 21 закрыт / 22-23 живые.
|
||
|
||
**3. Нормы формы (направление).** D-нота = РЕШЕНИЯ (что+почему одной фразой+указатель на нарратив); нарратив приёмки живёт ТОЛЬКО в ревью-шапке отчёта, прочие носители — указатели. Эррата — ОДНОЙ формой: навигационная в шапке D-лога (правка тел задним числом — против D23.3). Слайсы — только дословный перенос. Бэклог-строка: «диспозиция сверху, археология вниз»; ячейка >800 байт — кандидат на выселение в носитель. Статус-строка под заголовком каждого отчёта эксперимента (ПРИНЯТ Dxx / не ратифицирован). Остальной объём аудита — **строка 167** (карта→реестр всех нот · разгрузка жирных строк · 15-money-path · нормативный док эмиттера СО строкой 103 · STACK.md · DEFECT_REGISTER-форма П-строкой).
|
||
|
||
**4. Хендофф №16.** Очередь: докс-пак 167 ПЕРВОЙ задачей (worksheet готов) · лендинг эксп-22 (+вопрос про эксп-23) · промт эмиттера (входное чтение — D39.123 п.4 + нормативный док шва из 167) · платформенный промт по слову. Урок сессии — в промт оркестратора: двухфайловая правка одним скриптом БЕЗ транзакционной проверки потеряла блок (восстановлен из git за минуту; правки читающих>1 файла — сначала все чтения, потом все записи, затем сверка). Незакоммиченного за №15 нет; в дереве — живой полигон (09.08.2026, оркестратор №15). ✅
|
||
|
||
## D39.126 — ДОКС-ПАК СТРОКИ 167 ИСПОЛНЕН: реестр всех нот + линтер формы + разгрузка бэклога + топикальные входы (деньги · эмиттер · стек); строка 167 пере-скоуплена в остаток (09.08). ✅
|
||
|
||
**1. Исполнено** (состав заказа — worksheet `../archive/reports/DOC_AUDIT_INVENTORY_2026-08-09.md`; механика — дифф лендинга, здесь не пересказывается): (а) **реестр всех нот** — [`05-decisions-index.md`](05-decisions-index.md) (№·дата·суть·статус·тело·темы; извлечение 6+6 агентов воркфлоу, полнота против заголовков шести файлов сверена скриптом, единственная находка верификатора — титул D39.64 — вправлена); прозаическая карта шапки (17-КБ строка, покрытие 14% веса) заменена указателем на реестр, вводный текст Фазы 1 перенесён ДОСЛОВНО в слайс D1-D38; (б) **counts.py**: `--check` += полнота реестра (нота без строки реестра = расхождение), новый `--lint` = file:line-якоря живых доков (файл существует · строка ≤ длины файла; обзоры чужого кода research/21/26 вне линта); линт доведён до нуля — 8 путей research/17 на заархивированные файлы поправлены; (в) **разгрузка топ-10 жирных строк бэклога** (46·108·126·121·105·106·44·122·109·13б): тела ячеек ДОСЛОВНО → `13-tech-debt-anchors.md` §Б-*, в таблице — диспозиция+указатель («диспозиция сверху, археология вниз», D39.125 п.3); PROGRESS −24.5 КБ; (г) **топикальные входы**: [`15-money-path.md`](15-money-path.md) (деньги от гранта до settle; якоря сверены кодом) · [`16-events-emitter.md`](16-events-emitter.md) (сборка-норматив эмиттера, обязательное пре-чтение сессии строки 103; разрешённое расхождение «карантин прогона → карантин ПРОЕКЦИИ» показано, побеждает D39.123 п.2в) · [`../STACK.md`](../STACK.md) (роль→модель→конфиг→квирки); (д) **К-статусы компаньона контракта** сведены: шапка `:14` противоречила блоку пост-ратификации и таблице §4 — К-1/К-3/К-5/К-8 аннотированы ЗАКРЫТЫМИ (D39.100), К-13 заведён строкой таблицы (его там не было вовсе); (е) шапка 09-target дотянута до пост-D39.125 · product-requirements освежён (ПТ-9/19/20/25/35) · CURRENT-STATE сжат (лента-дубль и рукописный скоро-список сняты, курс/горизонт/стек — короче с указателями) · форма эрраты впредь — ТОЛЬКО навигационная в шапке (три прижизненных правки-на-месте поименованы там же).
|
||
|
||
**2. Находки пака, получившие носителей:** (а) ⚠ **ВЕСЬ банковый контур (банкнота+терминолог+классификатор) жив только ран-локальным конфигом книги** — шире заявленного строкой 140 («банкнота»); сверено грепом shipping-c1 (`gates.terminology`/`gates.banknote` = 0 вхождений), дописано в строку 140 и STACK.md; (б) эскалация в shipping мертва `budget_usd: 0` — STACK.md §примечания; (в) шапка-таблица эндпоинтов quirks датирована 04.07 и отстала — полигону при лендинге эксп-22 (вместе со статус-баннерами экспов); (г) кросс-ссылка 160↔Ф-30/В-4 поставлена (строка 160 + пинг в журнал фронта); пинг платформе о форме DEFECT_REGISTER секциями отправлен (П-строку заводит зона).
|
||
|
||
**3. Строка 167 пере-скоуплена в остаток:** статус-баннеры экспов + шапка эндпоинтов quirks (полигон, при лендинге эксп-22) · DEFECT_REGISTER секциями (зона платформы, пинг отправлен). Счёт очереди не меняется (09.08.2026, оркестратор №16). ✅
|
||
|
||
|
||
## D39.127 — ПРИЁМКА ФРОНТА S3.6 ПРИНЯТА И ЗАЛЕНДЕНА (`57e6bd1`); промт S3.7 выдан; Ф-47 ратифицирован (`sense` обязателен); строка 169 — экспорт банка (10.08). ✅
|
||
|
||
**1. Приёмка (оркестратор №16; воркфлоу 12 агентов: 6 линз + скептики-верификаторы, author≠reviewer).** Гейты пере-прогнаны ИСПОЛНЕНИЕМ: `check:full` EXIT=0 · vitest 160 · `shot` ×3 · сценарии зелёные; десять ключевых клеймов записи S3.6 подтверждены кодом. **12 находок CONFIRMED (1 high: замер ширин таблицы банка молча проваливается в скрытой keep-alive вкладке и не повторяется при показе — `frontend/src/ui/Table.tsx:232`), 24 минорных, 1 опровергнута** — все переданы промтом S3.7 §8. Нарратив и поправки к записи S3.6 (ложный клейм §12 о механизме сторожа спойлера · число-дрейф §7–§14 · обратный порядок разделов 12–15) — приёмочная запись в зонном журнале фронта, здесь не пересказываются. Референс fleet_2.png докинут владельцем при приёмке, якоря палитры подтверждены пиксельной пробой (доминанта #181818 · #292929 · #184176 дословно).
|
||
|
||
**2. Ратификации.** (а) **Ф-47: `BankTerm.sense` — обязательное поле, пустая строка = «различителя нет»** (спека объявляет `sense` частью ключа уникальности `(book, src, sense, since, until)`, держа его вне `required` — противоречие внутри одного файла); исполняет S3.7 в зонной копии (0.2.1→0.2.2), канон `14-api-contract/` — диффом при лендинге S3.7. (б) Черновик ДОБАВОЧНЫХ полей `BankTerm` (note/gender/contexts/variants/…) НЕ ратифицирован — ждёт слова владельца по границе ПТ-33 (contexts = спойлер по построению; variants/confidence раскрывают конвейер). (в) Гейт S4 (D39.119 п.4) снят этой приёмкой; очередь фронта: S3.7 → приёмка → S4. (г) **Владелец при ревью выданного промта поймал ПРОПУСК приёмки: Ф-35 (интерфейс без хардкода русского) в промт не попала** — оркестратор собрал состав пака из бэклога зоны и долгов, записанных самой сессией, не пройдя лист владельца (START_PROMT) независимым свипом; промт дополнен задачей 9 (словарь строк + линт-гейт против кириллических литералов + хранилище выбора; переводы и список языков НЕ выдумываются). Свип вглубь показал: требование отсутствовало и в реестре продукта — заведено строкой **ПТ-36**. Урок в память оркестратора: состав пака сверять со ВСЕМИ источниками требований, не только с трекером зоны.
|
||
|
||
**3. Бэклог.** Новая строка **169** — экспорт банка для чтения фронтом (Ф-43: канала под `GET /books/{id}/bank` нет вообще; банк в приватном SQLite, платформе читать запрещено D39.85): движковый артефакт экспорта + платформенная проекция, гейт подписного экрана S5.
|
||
|
||
**4. Хвосты чужих зон, НЕ тронуты (передано полигонному лендингу):** застейдженный `docs/README.md` линкует `POLYGON_EXP2223_DOVODKA_SESSION_PROMPT.md`, а файл в индексе — `POLYGON_EXP2223_REDO_SESSION_PROMPT.md` (битая ссылка после коммита); тот же указатель в полигонной части CURRENT-STATE; строка «активные промты» README отстаёт по фронту (S3.5→S3.7) — чинится тем же касанием (10.08.2026, оркестратор №16). ✅
|
||
|
||
## D39.128 — ПОЛНОЕ ПЕРЕ-ЧТЕНИЕ КОРПУСА ПО ЗАКАЗУ ВЛАДЕЛЬЦА; выданы промты: бэкенд-эмиттер (103+135+165, закрывает PD-113) и платформа P5 (П-9+PD-140+П-11) (10.08). ✅
|
||
|
||
**1. Чтение.** По заказу владельца 10.08 («изучи вопрос досконально, перепрочитай документацию, не грепами») прочитаны ЦЕЛИКОМ: живой D-лог (все тела, 1–469) · `docs/PROGRESS.md` · `platform/docs/platform-PROGRESS.md` · `frontend/docs/frontend-PROGRESS.md` · `16-events-emitter.md` · `15-money-path.md` · `research/23` (через баннер) · `research/25`. Противоречий, меняющих план паков, не найдено; одно поверхностное расхождение передано сессии задачей (граница гейта потолка: `15-money-path.md` §2 пп.1–2 расходятся на поверхности — выяснить по коду, строка 135).
|
||
|
||
**2. Промты (запуск обоих — по слову владельца; параллельность легальна, зоны не пересекаются; фронт S3.7 живёт в `frontend/` параллельно).** (а) **Бэкенд-эмиттер** `docs/BACKEND_EMITTER_SESSION_PROMPT.md`: строка 103 (журнал `events.jsonl` по форме D39.106; словарь — ответ ДИФФОМ на предложение платформы `events.go`; сквозная проба своим журналом через настоящий декодер платформы в копии зоны) + 135 (гейт потолка пер-вызов) + 165 (различимые exit-коды — PD-113) + 102 опционально; $0; дизайн-развилки нормдока §5 отданы сессии с записью решений; голден/снапшот-нейтральность — обязательное доказательство. (б) **Платформа P5** `platform/docs/PLATFORM_P5_SESSION_PROMPT.md`: П-9 `POST /books` (+PD-72; ⚠ развилка «кто пишет `book.yaml` при интейке» ГЕЙЧЕНА ратификацией — вопрос в зонный журнал до стройки той половины) + стоп/резюм PD-140 (кандидат-дизайн: намерение стопа своей стороной до SIGTERM — дискриминатор против PD-152) + наблюдаемость П-11 + печать конфигурации PD-114 + DEFECT_REGISTER секциями (остаток 167).
|
||
|
||
**3. Хвост чужого дерева (повтор D39.127 п.4):** строка «активные промты» `docs/README.md` отстаёт (S3.5→S3.7, эмиттер/P5 не назван) и несёт чужой застейдженный полигонный hunk — актуализирует полигонный лендинг (10.08.2026, оркестратор №16). ✅
|
||
|
||
## D39.129 — ПРИЁМКА ФРОНТА S3.7 ПРИНЯТА И ЗАЛЕНДЕНА (`3e465bd`); канон контракта — 0.2.2; арбитраж 8.1: HIGH приёмки S3.6 снята как ложноположительная (10.08). ✅
|
||
|
||
**1. Приёмка (оркестратор №16; воркфлоу 11 агентов: 6 линз + скептики, отдельная арбитражная линза по спорной 8.1).** Гейты исполнением: `check:full` EXIT=0 · vitest **279** · 9 сценариев / 88 проверок. **12 находок CONFIRMED (1 high: запись ложно клеймит импорт `fill.ts` сценами — дубль подстановки в `scenes.mjs` жив и добавлен самой сессией), 0 опровергнуто, 16 minor**; блокеров лендинга нет. Носитель находок — блок «находки приёмки S3.7» следующего фронт-промта (S4); нарратив — приёмочная запись зонного журнала.
|
||
|
||
**2. Арбитраж 8.1 (спор моей приёмки S3.6 с сессией): ПРАВА СЕССИЯ.** В Chromium геометрический запрос форсит расчёт раскладки и под `content-visibility: hidden` — замер таблицы в скрытой keep-alive вкладке даёт ширины эталона (живой прогон сцены `hidden` при этой приёмке). HIGH из D39.127 п.1 снята как ложноположительная; сессия не поверила приёмке, замерила и сняла свой же готовый механизм — образцовое поведение. **Урок в норму приёмки (дописан в память оркестратора): браузерное поведение не подтверждается рассуждением от кода — вердикт без живого прогона = PLAUSIBLE, не CONFIRMED.**
|
||
|
||
**3. Ратификации и закрытия.** (а) Канон `14-api-contract/` догнал **0.2.2** байт-копией зонной спеки (`sense` → required, пустая строка = «различителя нет» — исполнение D39.127 п.2а); зеркало байт-равно. (б) Строки зоны Ф-47/Ф-49/Ф-50/Ф-51/Ф-40 закрыты; Ф-25/Ф-35 закрыты код-половиной; заведены Ф-52…Ф-55 и вопрос **В-9** (какие языки интерфейса обещает продукт — владелец). (в) **ПТ-36 → 🔶**: механизм i18n построен (каталог 157 ключей · гейт «текст местом» · стор языка · `<html lang>`), содержимое — только ru; список языков — 🔒 владелец. (г) Остатки слоя данных из ревью (глушащие отметки reread · `asked` при resync · дырка гейта вычисленных литералов · вакуумные пассы perf/zoom-сторожей) — фронт-зона, в блок находок S4-промта. **S4 — следующий этап; промт после приёмки P5** (экран загрузки стоит на `POST /books`) (10.08.2026, оркестратор №16). ✅
|
||
|
||
## D39.130 — ПРИЁМКА ПЛАТФОРМЫ P5 ПРИНЯТА И ЗАЛЕНДЕНА В ТРИ РАУНДА (`69d485a`); ратификации: Go-floor 1.26.6 · интейк `book.yaml` формой Б · контракт-диспозиции · строка 170 и дописка 165; гейт S4 фронта ПАЛ (14.08). ✅
|
||
|
||
**1. Приёмка (оркестратор №16).** Раунд 1 — воркфлоу 10 агентов: **8 находок (1 high: пол ревизии библиотеки игнорировался на вставке; деньги: `FinishUnspawnedStop` без гарда живой попытки; интейк: цепочки зомби/потери исходника), 0 опровергнуто.** Раунд 2 — ре-чек дофикса 6 агентами: **3 находки (2 high: гейт тулчейна фактически ПРИНИМАЛ 1.26.5 — floor жил только в тексте ошибки; гард корня хранилища не переживал unmount-в-BooksDir и маскировался бутовым MkdirAll).** Раунд 3 — закрыт с пинами/посадками; кросс-семейное ревью дофикса самой сессией дало 5 находок (две — уничтожение данных), эмпирически подтвердив D39.120. Финальная верификация исполнением: батарея EXIT=0 (16 пакетов, `-race`, живой PG `~/.local/pgsql:55433`); **гейт версий живьём отказывает 1.26.5 и `go1.27rc1`, принимает 1.26.6/1.26.10**; сентинел `.tmplatform-books`; `revision+1` ровно у двух заявленных прогресс-писателей; тестов **261→359** (удалённых 0), регистр **198** (145 закрыто · 48 открыто · 1 major PD-113 — ждёт эмиттера). Живые числа проб — «со слов» с пометкой. Нарратив — зонный журнал (три записки-плана).
|
||
|
||
**2. Ратификации.** (а) **Go-floor 1.26.6** (пять stdlib-адвизори, две трассированы в живые пути сетевого модуля): `make version-check` сравнением версий (`sort -V`, пререлизы отвергаются) + `toolchain go1.26.6` в go.mod; цена названа и принята — офлайн-хост с `GOTOOLCHAIN=local` и 1.26.5 зону не соберёт; **движок этим не двигается** (патч-версия, x/text-вахта Ш-2/119 не задета). (б) **Интейк `book.yaml` — форма Б** (платформа ОДИН раз рендерит стартовый конфиг новой книги из деплой-шаблона; дальше файл принадлежит оператору): ратифицирована как ИНТЕРПРЕТАЦИЯ D39.110 §2б с аудит-следом — то решение о потолках/правке СУЩЕСТВУЮЩЕГО файла, создание стартового конфига несуществующей книги ему не противоречит; несогласие владельца отменяет одной репликой; стройка Б — следующим касанием зоны. **Форма В** — строка **170** (`tmctl init`, движок пишет свой конфиг). (в) **Контракт (диспозиции владельца контракта):** PD-172 `file` последним · PD-173 enum-причина `rejected` (продуктовые фразы — владелец) · PD-174 404/503-классы · PD-180 «201 несёт `parsing`» + перечень отказов интейка — спек-правка **0.2.3 = задача S4-промта** (фронт бампит зеркало и типы, канон — диффом при лендинге S4). (г) Мотивированное исключение Н2 (два прогресс-писателя синка остаются на `revision+1` — прыжок через пол развязал бы книжную и главную шкалы) ПРИНЯТО. (д) PD-178 закрыта переформулировкой (состояние user-менеджера плавает между сессиями стенда) + скип-гейт по СПОСОБНОСТИ.
|
||
|
||
**3. Бэклог и очередь.** Строка **170** заведена; строка **165** дополнена PD-196 (exit 1 движка не различает классы отказа `manifest` — «источник нечитаем»/«конфиг битый»/«лок»; интейк чуть не удалил файл пользователя за опечатку оператора — различимость классов = мандат эмиттер-пака). **Гейт S4 фронта ПАЛ** (D39.129 условие исполнено): вход S4 = экраны библиотеки/загрузки на живом `POST /books` + находки приёмки S3.7 + спек-правка 0.2.3; промт — по слову владельца (14.08.2026, оркестратор №16). ✅
|
||
|
||
## D39.131 — ПРИЁМКА БЭКЕНД-ПАКА «ЭМИТТЕР ШВА»: строки 103+135+165+102 закрыты, движковая половина PD-113/PD-196 построена (14.08). ✅
|
||
|
||
**1. Приёмка и лендинг (`9cfe080`, 31 файл, тестов 749→794).** Панель 5 верификаторов: сквозная проба ПЕРЕ-СНЯТА с нуля (свой tmctl из дерева пака → живой `ingest.Tail` платформы в копии зоны: hello adopted, чужой регион пропущен, повтор за курсором = 0, подделка payload = `ErrPayloadConflict`) · 5 СВОИХ мутаций вне списка сессии — все CAUGHT (суммарно 16/16) · деньги исполнением (settle+чекпойнт+`spend` — одна транзакция; репэйр-гейт «2.0×→0» воспроизведён; micro-USD int64 с ceil; события вне BriefHash/снапшота/RequestHash — голден бит-в-бит) · кросс-модельный опровергатель (D39.120 п.1а). Дофикс-раунд ДО лендинга: `once_key`-lookup предикатом `AND once_key <> ''` (частичный индекс заработал — EXPLAIN-пин над боевой константой, до фикса SCAN = O(units²) на пути волны) · `PendingEvents` батчем LIMIT 256 (аварийный путь из O(N²) в константу на событие) · `StreamVersion` 1.0→1.1 (добавлены `Ceiling.Scope` и outcome `ceiling|stopped` — минор по собственному правилу). Механика — журнал, секция «Бэкенд» §0–§10.
|
||
|
||
**2. Ратификации.** (а) Полоса отказов **10–19** с классами словарём (10 конфиг · 11 «прочли и нарезали — книги в байтах нет» · 12 лок · 19 безымянный) + exit **4** потолок / **5** graceful stop; сужение класса 11 ратифицировано (11 = вердикт, по которому интейк удаляет загрузку; всё конфиг-объяснимое = 10). (б) `eta_seconds` эмитится из темпа ТЕКУЩЕГО прогона (пропуск поля ОБНУЛЯЛ бы колонку читателя каждой строкой — `pgstore/sink.go:110-113`). (в) Отказ не пишет терминального `finished`. (г) Предложение платформе «фолд `unit_done` ПРИСВАИВАНИЕМ, не инкрементом» ратифицировано направлением (at-least-once требует идемпотентности у потребителя; заодно самолечит потерю недодрейненного хвоста при рестарте). (д) Эскалационный кап НЕ прицениваает хоп — ОСТАВЛЕН: перелёт ≤1 хопа escalate_to-модели, задокументирован и запинен; реопен — первый живой инцидент. (е) Посылка «гейт потолка на границе юнита» ОПРОВЕРГНУТА кодом: `Reserve` всегда был пер-вызовным; на границе юнита сидел репэйр-суб-бюджет — он и ужесточён (строка 135); `15-money-path.md` §2 поправлен.
|
||
|
||
**3. Находки приёмки → носители.** **ПЛАТФОРМЕННАЯ половина шва НЕ построена** — заленденный потребитель не читает новые сигналы: exit 4 превращается в `failed` (outcome() знает 0/2/3, `paused_reason` читается из stale-снапшота ДО drain), `refusedTheSource()` не смотрит на код вовсе (опечатка book.yaml по-прежнему ведёт к удалению загрузки), `Ceiling.Scope` дропается, dev-супервизор стейл ⇒ **П-15 зонного бэклога платформы** (пинг в их журнал; PD-113/PD-196 в их регистре остаются open до её стройки). **Деадлок деплоя v15**: `status` (read-only) отказывает старой схеме, а платформа зовёт его ПЕРЕД каждым спавном и settle ⇒ апгрейд бинаря запирает все старые книги — строка **174** (решить ДО деплоя нового бинаря: `tmctl migrate`-команда либо деплой-порядок). `backupStamp` секундной точности маскирует класс «занято» — строка **173**. Сериализацию писателей журнала держит только flock проекта (два конфига в одном каталоге = перемешанный поток) — наблюдение в теле, реопен при живом инциденте.
|
||
|
||
**4. Инцидент нормы: «author≠reviewer» сессия исполнила как стиль чтения** (свой контекст, без второго) и в первой редакции отчёта приписала себе разделение — сама вскрыла, независимые панели провела пост-фактум; корень («требование без механизма исполнения») канонизирован п.6а норм хендофф-промтов (`aef64f3`) ДО этой приёмки. Ультраревью владельца 14.08 шва не видело (облачный бандл собирает только tracked-файлы, пак был untracked) — «молчание ревью ≠ свидетельство корректности» (14.08.2026, оркестратор №16). ✅
|
||
|
||
## D39.132 — ПРИЁМКА ПЛАТФОРМЫ P6 + ДОФИКС ПРИНЯТЫ И ЗАЛЕНДЕНЫ: шов закрыт с обеих сторон, PD-113 закрыт, 0 major; ратификации — day_usd вне шаблона · пере-подпись направления §3 · второй гейт батареи · exit 13 направлением (15.08). ✅
|
||
|
||
**1. Приёмка (оркестратор №16).** Раунд 1 — панель 5 адверсариальных верификаторов по P6 (две линзы другой моделью; исполнением: живой демон, живой PG, live-пробы) → фикс-лист ФП-1…ФП-8 (тяжёлое: `status --json` с exit 2 при flagged-юнитах читался платформой как отказ — расчёт flagged-прогона откладывался вечно, спавн по книге отказывал; порядок апгрейда в деплой-доке гонял `migrate` СТАРЫМ бинарём; денежный гейт `BooksForMigration` не запинен — посадка приёмки переживала батарею). Раунд 2 — дофикс той же сессией: все ФП закрыты, её собственное ревью нашло и закрыло ещё 6 (глоток ошибки перечитки в ветке маркера; документ-не-манифест как пустой манифест на единственном файло-удаляющем пути; stdout без потолка). Финальная верификация исполнением: батарея `-race` + живой PG + ОБА гейта — EXIT=0, скипов 0; тестов 359→**416** (команды в журнале зоны); деньги из сырого леджера стенда двумя путями; 2 СВОИХ посадки — пойманы. Механика — зонный журнал, разделы «P6» и «Дофикс P6».
|
||
|
||
**2. Ратификации.** (а) **`day_usd` убран из платформенного шаблона книги** (решение владельца 15.08): трата прогона ограничена купленным объёмом (холд+`--ceiling-usd`), дневная ось на платформе дублирующая; в движке остаётся операторской опцией, обработка `daily_ceiling`/409 — предохранитель. **PD-199 закрыт этим же решением: `null` на проводе подтверждён**, слово в контракт не заводится. (б) **`PLATFORM_DIRECTION` §3 пере-подписан**: oapi-codegen «взять — доказано» → кандидат при P7; sqlc — привязан к P7 (масса запросов читающей поверхности); River-факт поправлен. (в) **Второй гейт батареи принят** (`TM_PLATFORM_TEST_ENGINE_BIN`+`_BOOK_TEMPLATE`, форма как у БД-гейта; с обоими гейтами скипов 0). (г) **exit 13 = `schema_mismatch` ратифицирован НАПРАВЛЕНИЕМ**: обе зоны сошлись на числе независимо (платформа — ждущий класс, движок — полоса 10–19); финализация и закрытие строк 174/175 — приёмкой бэкенд-пака migrate. (д) **PD-241 (стоп пользователя переименовывается в `paused/credit_exhausted`, если потолок приехал тем же дрейном) — направление: намерение стопа выигрывает НА СТАТУСЕ**, деньги не затронуты; исполнение — следующим касанием зоны, отменяется одной репликой владельца.
|
||
|
||
**3. Исправления оркестратора при лендинге и хвосты.** Регистр: откачено переименование PD-198→PD-199 и удалена строка-дубль (246→245; «ID стабилен навсегда»); PD-200/PD-180 — по секциям; счёт-базис журнала «396→403» заменён воспроизводимым (359→416, PD-234). Новые остатки — строками PD-217…PD-223, PD-241…PD-245 (тяжелее прочих: PD-217 — книга на `daily_ceiling`/вечном холде блокирует апгрейд движка без выхода). Единый бэклог: строка 176 — движку `recover`/другой код на панику (exit 2 коллизия с completed-with-flags, PD-212). Урок приёмки — знанием: **шов, у которого движковая половина менялась под потребителем, проверяется перечислением ВСЕХ каналов движка** (exit-контракт сверили — status-канал упустили и сессия, и её ревью; поймала только панель). Очередь: приёмка бэкенд-migrate (дерево ждёт в `backend/`) → приёмка S4 → промт P7. (15.08.2026, оркестратор №16) ✅
|
||
|
||
## D39.133 — ЗАКРЫТИЕ СЕССИИ №16, передача №17 (15.08). ✅
|
||
|
||
Сессия №16 (09–15.08): лендинги D39.126–132 (докс-пак 167 · приёмки S3.7 · P5 в три раунда · эмиттер шва · P6+дофикс). Состояние, очередь и открытое на владельце — CURRENT-STATE и D39.132 п.3 (не дублируются). Первые задачи №17 по очереди: **приёмка бэкенд-migrate ПОСТ-ФАКТУМ** (код в main коммитом владельца `535581d` БЕЗ приёмки — обязательна до деплоя; закрывает строки 174/175, финализирует exit 13 по эррате шапки) → строка 172 (цены DeepSeek 16.08 — на владельце) → приёмка S4 → промт P7 платформы. Роль-промт обновлён этим же коммитом. (15.08.2026, оркестратор №16) ✅
|
||
|
||
## D39.134 — ПРИЁМКА БЭКЕНД-ПАКА «tmctl migrate» ПРИНЯТА И ЗАЛЕНДЕНА (`d55edd4`): строка 174 закрыта, 175 пере-скоуплена, exit 13 ФИНАЛИЗИРОВАН; ратификации — отказ write-пути БД новее бинаря · restore point под локом вне секундного неймспейса (15.08). ✅
|
||
|
||
**0. Контекст git.** Темп-коммит владельца `535581d` (снапшот всего дерева, слово владельца — не инцидент) откачен локальным soft-reset; содержимое пересобрано скоуп-раздельными коммитами (`8929566` gitignore · `3b1fe9a` док-закрытия №16 · `d55edd4` этот пак); origin/main на момент лендинга держит старую линию — развязка на владельце (force-push его словом, локально не пуллить).
|
||
|
||
**1. Приёмка исполнением (панель 6 линз в изолированных копиях без .git; $0, только агент-токены).** Все 8 пере-раненных клеймов отчёта сошлись: батарея EXIT=0 · 810 тестов (+16 воспроизведён по диффу) · голден бит-в-бит · живые пробы на КОПИЯХ стендовых БД v14→v15 и v7→v15 (деньги до цента ДВУМЯ путями: status/report и независимый SQL; 0.126068 / 0.408077 не сдвинулись) · лок = 12 без restore point · v99 = 13 в обе стороны, файл байт-в-байт. 6/6 СОБСТВЕННЫХ мутаций приёмки (шов на no-op · снятие класса 13 · снятие гарда newer · зануление committed · перестановка found/expected в токене · слом идемпотентности) пойманы тестами пака. Мутационные числа автора («8/8», «10/10», «2.6 ГБ-репро») — со слов сессии, независимо не пере-ранены; несущее свойство «шов не под бюджетом пакета» запинено тестом пака и мутацией №1 приёмки. Механика, фикс-лист ФМ-1..7 и поправки цитат отчёта — запись приёмки в PROGRESS «Бэкенд» 15.08 (состав — там).
|
||
|
||
**2. Ратификации.** (а) **exit 13 = `schema_mismatch` ФИНАЛИЗИРОВАН** (эррата шапки исполнена): полоса отказов = 10 конфиг · 11 источник · 12 лок · **13 схема** · 19 безымянный; машинный токен `schema_mismatch found=N expected=M`; found<expected чинится `tmctl migrate`, found>expected — только новым бинарём (migrate не врёт успехом). ⚠ **Поправка провенанса** (поймано кросс-модельной линзой панели): формулировка «обе зоны сошлись на числе НЕЗАВИСИМО» (D39.132 п.2г и эррата шапки 15.08) неверна — платформа прочитала 13 из незакоммиченного дерева движка и сама это записала (`platform/internal/ingest/exit.go:63-64`); на силу ратификации не влияет (финализация состоялась этой приёмкой), клейм независимой сходимости снят. (б) **Отказ write-пути БД новее бинаря** — расширение сверх буквы заказа, названное автором явно, РАТИФИЦИРОВАНО: тихое письмо старым кодом в новую схему — опаснейшая половина того же факта, и без него самолечение платформы зацикливалось бы на ложном успехе. (в) **Restore point** — под локом, только при реально применяемом шаге, имя `<метка>-pre-migrate.db` вне секундного неймспейса платного пути. (г) exit 19 из migrate не производится (неопознанный store-отказ и провал снятия restore point = exit 1 ВНЕ полосы) — принято направлением «полоса обещает „ничего не произошло, жди"», хвосты честности — фикс-лист.
|
||
|
||
**3. Строки.** 174 ЗАКРЫТА (деадлок разорван; деплой-порядок «дренаж → новый бинарь → migrate ИМ → прогоны» записан платформой дофиксом P6 — их README уже верен, клейм §5(в) отчёта устарел к приёмке, не ошибочен). 175 ПЕРЕ-СКОУПЛЕНА: ближняя половина (типизированный mismatch у status + money-тест) исполнена паком, строка остаётся на дальний остаток (а)–(в). Новая 177 — гигиена restore point (находки панели ВНЕ карты отчёта: ретрай в ту же секунду после сорванного шага = exit 1 «backup already exists» на цикле самолечения · kill -9 посреди шва оставляет РВАНУЮ копию под легитимным именем · копии не подчищаются · SIGINT в migrate не прерывает). Дописки тем же касанием: 93 (`redrive --dry-run` на устаревшей БД мигрирует БЕЗ restore point), 146 (ценовой гейт держит и ДЕТЕКТОР самолечения: на протухших ценах `status` даёт 10, не 13 — цикл «поймал 13» не наступает), 176 (usage-строка invocation.go не знает migrate/backup/seed-lint — чинить разом тем же касанием exit-контракта).
|
||
|
||
**4. Платформе (пинг в зонный журнал):** движковая половина финальна — PD-201 (самолечение «поймал 13 → migrate → повтор») можно строить; их хвосты: `deploy/README.md:131` и П-1 зонного бэклога несут МЁРТВЫЙ текст ошибки схемы («schema vN … expects vM» движок больше не печатает) · комментарий-образец `runs.go:45` зовёт голый `tmctl` из PATH (копипаст = тихий no-op старым бинарём при живом деадлоке). Всё — вход промта P7. (15.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.135 — ПРИЁМКА ФРОНТА S4 ПРИНЯТА И ЗАЛЕНДЕНА (`267aa35`); КОНТРАКТ 0.2.3 В КАНОНЕ: PD-172 уточнён по коду платформы, title/reject_reason — форвард-контракт с носителем в P7 (15.08). ✅
|
||
|
||
**1. Приёмка исполнением (панель 5 линз в изолированных копиях; $0, только агент-токены).** Слепая линза по заказу+диффу — «принять» до чтения отчёта; пере-ран гейтов: `npm run check` 335/335 · `check:full` EXIT=0 (8 маршрутов · 11 сценариев · axe 0 блокирующих; «136 проверок» отчёта = фактически 134 — наивный греп ловил 2 строки vite) · spectral/типы/тест дрейфа зелёные · до-пакные числа арбитража (157 ключей · чанк 724130) подтверждены ОБРАТНЫМ применением диффа байт-в-байт · живые нарушения двух гейтов — красные · фикстура формы: обязательное поле за файлом = 400, необязательное = 201. Линза истинности спеки: PD-172/173/174/180 — ВЕРНО ПО КОДУ платформы (обе стороны цитатами). Механика, фикс-лист ФС-1..12 и поправки отчёта — запись приёмки в зонном журнале фронта 15.08 (состав — там).
|
||
|
||
**2. Ратификации.** (а) **Контракт 0.2.3 — В КАНОНЕ**: `docs/architecture/14-api-contract/openapi.yaml` = байт-зеркало зонной копии (cmp пуст). (б) **PD-172 — формулировка спеки УТОЧНЕНА ПРОТИВ текста заказа, уточнение ратифицировано**: платформа останавливает чтение формы НА файле (`v0.go:349-361`) — обязательное поле после файла = 400 «как не слали», необязательное молча теряется (201); текст D39.130 п.2в «поле после файла = 400» амендирован кодом (сессия назвала отклонение вслух, две линзы сверили независимо). (в) **BookIntake.title и Book.reject_reason = ФОРВАРД-контракт**: платформа сегодня title НЕ читает (switch формы без case "title", имя всегда titleFrom) и reject_reason НЕ проецирует на провод (`v0.go:497` «never projected»); оба конформны (поля необязательные), но обещание без носителя — дефект класса «обязательство без адресата» ⇒ реализация обоих — ЯВНЫЙ вход промта P7. (г) `not_configured` сегодня недостижим на книге (не терминален — `waitsForTheDeployment`) — в enum оставлен осознанно как словарь версии. (д) **verify_bank дефолт OFF — временно, направлением**: с включённой галочкой прогон приходит в `awaiting_bank`, куда идти некуда до S5; дефолт возвращается при построенном пути подписи; отменяется словом владельца. (е) S4 = ПРИНЯТО с фикс-листом ФС-1..12 → вход промта S5 (тяжелейший ФС-1: интейк-мир стартует прогон с total=0 — общий прогресс 0/0 и ETA NaN, путь заказа §4 в мок-мире добить).
|
||
|
||
**3. Владельцу (confirm-лист, сам не ратифицирую):** В-11 фразы PD-173 (⚠ кавеат панели: фраза not_configured «Сервис пока не готов принять эту книгу» говорит о приёме, а книга уже принята и отклонена позже) · В-10 спойлер (поиск по странице/печать обходят размытие) · Ф-62 (переименовать книгу нечем — у книги в контракте нет ни одной записи) · Ф-63 (рамка поля 1.20:1 — токен всей оболочки, вид принимает владелец).
|
||
|
||
**4. Поправки к отчёту S4** (носитель — запись приёмки в зонном журнале): «словарь платформы — четыре значения» → пять (пропущен schema_mismatch) · «одна из трёх фраз недостижима» → сегодня недостижимы ВСЕ ТРИ (reject_reason не проецируется вовсе) · §1/§2 отчёта несут СНЯТОЕ правило PD-172 (противоречие с собственным §9а; тот же текст остался в докблоке upload.ts — ФС-5) · «31 строка DOM / 59 618px» — замер S2 04.08, не этого пака · «46 находок → 6 выжило» = 5 различных (одна — дубль). (15.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.136 — ПАКЕТ СЛОВ ВЛАДЕЛЬЦА 15.08 (напрямую №17, первоисточник): фриз фронта · структура глав В ОЧЕРЕДЬ · контракт-ревью 0.3.0 ЗАКАЗАН · пере-заказ фраз PD-173 · санкции фазы Д; закрыты строки 116 и 126 (15.08). ✅
|
||
|
||
**1. Санкции и снятия (слово владельца напрямую оркестратору №17, 15.08).** (а) Расход фазы Д $6.0024 и цепь потолков $4.50→$6.74 — рука владельца, устный синк с полигоном легитимен; замена ja-книги на `enkan_no_hate_ja` — тоже; СТОП ja-оси снят. (б) Возражение Sol по `tier` — с листа №17 СНЯТО («полигон не твоя забота»), остаётся у параллельного оркестратора/владельца.
|
||
|
||
**2. Фриз фронта (слово 15.08: «я бы фризанул»).** S0–S4 приняты — зона ЗАМОРОЖЕНА; промт S5 не выдаётся. Разморозка: лендинг P7 + ответы на настоящий гейт S5 (В-10 спойлер · пере-заказ фраз В-11 · ПТ-33 закрыт п.4). Мок-мир НЕ сносится (П-16/Ф-29: снос — после читающей поверхности); живая smoke-линия против дев-стенда — легитимный мини-пак и во фризе, по слову владельца. Одобрено тем же словом к исполнению первым касанием зоны: Ф-63 (перекраска токена рамок минимальным сдвигом) · Ф-28 (бамп пинов сборки с security-адвайзори).
|
||
|
||
**3. Структура глав — В ОЧЕРЕДЬ (слово 15.08: «эти доработки очень важны… максимально качественными»).** Гейт D39.122 п.4 ПАЛ: Этап 0 (строка 160) ставится ближайшим бэкенд-паком; Этап 1 (161) — сначала ДИЗАЙН-ПАК с мандатом максимального качества (стройка после ратификации дизайна; дешёвое окно закрывается первой книгой внешнего пользователя); тесты структуры глав — узлом будущего холодного прогона (одним из, не главным — до прогона далеко). Фактура: research/27 + epub-стенд (`~/books/*.epub` — Кристофф/en, isekai/ja), мастер-гу = txt GB18030.
|
||
|
||
**4. Банк: фразы и sense (слово 15.08).** (а) **Фразы PD-173 НЕ утверждены** — направление: КОНКРЕТНЕЕ причина отказа; **граница ПТ-33 ПЕРЕ-ЧИТАНА владельцем: охранять АЛГОРИТМЫ бэкенда, а не минорную механику** — «не раскрывать внутренности» не значит «говорить абстракциями»; пере-заказ фраз — вход S5; мультиязычность фраз ВСЕХ зон (бэкенд/платформа/фронт, машинные коды vs хардкод-строки) — вход контракт-ревью. (б) **Добавочные поля `BankTerm` НЕ заводить** (ПТ-33-вопрос закрыт): смысла хватает — «главное чтоб смысл был ёмкий и достаточный на всю книгу, но не слишком подробный»; новая строка 178 — sense возможно КОРОТКОВАТ, калибровка при касании банка. (в) Переименование книги (Ф-62) — В КОНТРАКТ направлением; форма — из контракт-ревью.
|
||
|
||
**5. Контракт-ревью 0.3.0 — ЗАКАЗАН (слово 15.08: «жёсткий ресёрч по всему репозиторию кучей агентов… кросс-модели… судейство буллетов прежде чем записывать в бэклог»).** Строка 179; форма: фазный воркфлоу оркестратора — (Ф1) инвентарь-чтение кода трёх зон + планов; (Ф2) greenfield-проект API без нашей спеки + линза индустриальных стандартов (RFC 9110/9457, SSE, публичные стайлгайды) + аудит квирков «контракт или протёкшая реализация»; (Ф3) кросс-модельное СУДЕЙСТВО каждого буллета (опровергатели другой моделью) с миграционной ценой; (Ф4) доклад владельцу → ратификация → ТОЛЬКО потом бэклог/0.3.0 батч. Мандат анти-инерции: «ратифицировано ≠ правильно». Входы: Ф-56 · Ф-57 · Ф-61 · Ф-62 · форма PD-172 · пагинация/производительность чтения банка · i18n сообщений всех зон · спойлер-защита (если В-10 = «защита»).
|
||
|
||
**6. Точечные ратификации.** (а) **PD-203**: флаг остановки на АККАУНТЕ — только по причинам уровня аккаунта (исчерпание кредита); пауза одного прогона живёт на прогоне (владелец согласился с рекомендацией №17). (б) **Строка 116 ЗАКРЫТА по делегации** («разберись и стоит ли моего внимания» — не стоит): порог приёмки классификатора становится ВЫБОРОЧНЫМ — «≥4/5 прогонов N=5 достигают 6/6» (рекомендация 02.08); вахта: риг пере-снять после смены цен/весов DeepSeek 16.08 (опция вендор-сессии). Классификатор здоров: защитный $0-смежный проход типов терминов, вреда не пишет (draft-side-only), 6/6 на думающем уровне. (в) **Строка 126 ЗАКРЫТА** (остаток «ручка на экране» исполнен S4, D39.135; помечена 15.08, закрывается этой нотой). (г) Вендор-сессия DeepSeek — промт `docs/BACKEND_DEEPSEEK_REPIN_SESSION_PROMPT.md` ВЫДАН (строка 172 получила носитель; консервативный пин ПИКОМ ратифицирован направлением). (15.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.137 — ПРИЁМКА ВЕНДОР-СЕССИИ «ПЕРЕ-ПИН DeepSeek» ПРИНЯТА И ЗАЛЕНДЕНА (`76049bb`): пик запинен, потолки снова защищают; строка 172 пере-скоуплена, новые 180/181; ToS-дельты нет (15.08). ✅
|
||
|
||
**1. Приёмка инлайн, исполнением ($0).** Дифф вне комментариев = ровно 3 строки (дата + 2 цены) — сверено; вендор-страница пере-прочитана оркестратором НЕЗАВИСИМО (WebFetch): все шесть пиковых клеток, окна 01–04/06–10 UTC и дата вступления 16.08 16:00 UTC совпали до цента; голден бит-в-бит + ledger/config-тесты — зелёные пере-раном приёмки; поиск вне карты: fallback-якорь цены = `default_model: deepseek-v4-flash` (ссылка, не литерал) — переехал автоматически, дыры нет. Реплей леджера трёх прогонов двумя таблицами (контрольная дельта старой таблицей = 0.00000000) и ToS-дифф по Wayback (444/444 и 364/364 строк, 0 расхождений; вердикты D39.29/30 не двигаются) — приняты по механике, со слов сессии с воспроизводимым методом. Отчёт и §8-самоervью — образцовые.
|
||
|
||
**2. Статусы.** (а) Пик запинен: flash 0.44 / 1.32 / cache-hit 0.014 · pro 1.32 / 3.96 / 0.044 за 1M; офф-пик = ½ (в комментарии, схема плоская); `cache_write_per_m: 0` верно — цены записи у вендора нет. (б) Шиппинг-цепочка c1 = 100% DeepSeek ⇒ множитель СЧЁТА ×4.2–4.4 в пике / ×2.1–2.2 в долине (замер по трём реальным прогонам). (в) Кэш-хит pro ×12.1 — эскалация с горячим префиксом перестала быть почти бесплатной. (г) Стендовая книга coldrun-a: `book_usd: 0.25` тем же объёмом работы теперь пробивается (пик $0.559) — CeilingHalt при пере-прогоне = цена, не поломка.
|
||
|
||
**3. Строки.** 172 ПЕРЕ-СКОУПЛЕНА: пере-пин ИСПОЛНЕН; остаток — (а) схемное решение владельца по докладу §5 отчёта (рекомендация сессии: пик оставить; scheduler-вариант не начинать до ответа вендора «по какой отметке времени тарифицируется вызов» — не задокументировано — и замера доли пика; дешёвый рычаг = операционное правило «прогоны не стартуют в 01–04/06–10 UTC», почти всё ×2 без строчки Go) · (б) пере-калибровка ставки $0.03/глава (166/П-10; множитель замерен) · (в) exp08 v3 (85) обязателен до budget_usd · (г) вахта весов **V4-Pro-0813** (веса сменились под тем же слагом — класс D39.61; риг готов: §7.4 отчёта, `TestLiveClassifierHarmSet`, после 16:00 UTC 16.08). Новые: **180** — `prices_checked` одно поле на ВСЮ таблицу: бамп по факт-чеку одного вендора сдвинул 120-дневный гейт свежести остальным семи (дедлайн 07.11→13.12); лечение — пер-модельная дата ЛИБО ре-чек остальных вендоров до исходного дедлайна. **181** — консент-число пере-покупки врёт после смены цен: `projectRebill` складывает ИСТОРИЧЕСКИЙ `cost_usd` (`rebill.go:166`), а резерв/сеттл считают НОВОЙ таблицей (`stagerun.go:431/:613`) ⇒ оператор соглашается на сумму до ×4.4 меньше реальной, `projected_book_usd` у `status` — так же; траты защищены потолками, врёт ЧИСЛО СОГЛАСИЯ.
|
||
|
||
**4. Владельцу/фазе Д (не решается этой нотой):** экономическая посылка интерим-редактора D39.22 «dspro ×2 дешевле glm» в ПИКЕ ПЕРЕВЁРНУТА — замер на 129 реальных edit-вызовах: dspro пик ×1.26 ДОРОЖЕ glm-5, офф-пик дешевле лишь ×1.59 (контрфактика по оси цены, оговорка сессии честная). Вход ратификации жильцов при фазе Д. (15.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.138 — ПРИЁМКА КОНТРАКТ-РЕВЬЮ (research/28) ПРИНЯТА; решения владельца 16.08 по докладу РАТИФИЦИРОВАНЫ; заказан ломающий батч 0.3.0; строка 179 закрыта, PD-104 и В-10 закрыты, новые строки 183–187 (16.08). ✅
|
||
|
||
**1. Приёмка (оркестратор №17, $0).** Отчёт — `docs/research/28-contract-review.md` (сессия по промту `CONTRACT_REVIEW_SESSION_PROMPT.md` → архив; зона не нарушена: единственный файл сессии, дерево не коммичено). Верификация: 4 независимых опровергателя пере-открыли ИСПОЛНЕНИЕМ 42 улики несущих блоков (Б-0/Б-13а · Б-1/Б-15 · Б-2/Б-3/Б-23 · Б-7а-п.4/Б-19а) — **0 опровергнуто по существу**; 5 косметических поправок + находка приёмки (вердикт К-10 в §6 противоречит Б-0 — закрывается «НЕ строить») — всё в ревью-шапке отчёта. REJECTED-секция существует (29 отвержений: 9 на ратификациях владельца, 4 — самопризнанные ошибки чтения); покрытие обязательных входов промта — полное (таблица §6); leave-one-out по линзам задекларирован и выборочно сходится. Ограничение метода честно заявлено сессией: все опровергатели — семейство Claude; кросс-СЕМЕЙНЫЙ проход доклада — отдельный заказ (этой нотой не решается, полигон занят фазой Д).
|
||
|
||
**2. Ратификация решений владельца 16.08 (первоисточник — §8 отчёта; перенос сюда — по §8б п.1; при конфликте побеждает эта нота).**
|
||
(а) **Б-0 «переделываем»:** конвейер уходит с провода — `Progress` → ОДИН счётчик до ближайшей остановки, знаменатель — КУПЛЕННЫЙ объём (после подписи банка полоса заново — В-5, §8 п.8); `finalizing` свернуть (лестница фаз — устная фраза владельца, не норма, §8 п.15); `verify_bank` → `stop_for_signing`; `TermOrigin`/`TermStatus` снять с провода; конвейерные слова вычистить из описаний (компилируются в исходники клиента); завести гейт на утечку. Колонки платформы и словарь шва движок↔платформа НЕ трогаются.
|
||
(б) **В-1 модель ошибок — вариант B (§8 п.4):** машинный `code` (двухуровневый: стабильный корневой + расширяемый вложенный) + `request_id`; `title`/`detail` — developer-facing, клиент НЕ показывает, фразу рисует клиент по словарю кодов; серверная локализованная фраза — отдельным полем только для неперечислимых причин; `errors[]` с указателем поля. **Два класса конкретности (В-2, §8а):** класс 1 (детерминированные — вход/счёт) — конкретика максимальная; класс 2 (модельные — прескрин/провайдер/фильтр) — ОДИН грубый код на класс, без вариации между попытками, с лимитом попыток; К-9 тем же решением: `rejected` + грубый код, 12-й статус не заводить.
|
||
(в) **Жанр — выкинуть** (Б-23, «Просто выкидываем»): из промптов, канона брифа (двигает `BriefHash` ⇒ только в общее resnapshot-окно), `book.yaml`-рендера платформы, контракта, формы — строка 184.
|
||
(г) **Дописывание глав — в ТЕКУЩУЮ книгу, «костылей не будет»** (Б-19а): форма `POST /books/{id}/parts` + ответ «что сдвинется и почём» ДО подтверждения; движковый гейт против МОЛЧАЛИВОЙ перекупки хвоста при вставке не в конец; вместе со строками 160–162 — строка 185.
|
||
(д) **Транспорт НЕ менять** (§5б, проверено агентом другого тира с веб-ресёрчем): REST/SSE остаются, паттерн poke/pull легитимен; план — сжатие → ETag/304 → скоуп в кадре → дельта-чтения → staleTime (строка 186); сжатие и условные чтения записываются В КОНТРАКТ, не в зонный док.
|
||
(е) **Экспорт БУДЕТ:** операции остаются; Б-4 обязателен — `state` вместо булева `ready`, `failure_code`, `expires_at`, эхо формата, правило доступа к ссылке (ПТ-34); закрывает К-12.
|
||
(ж) **История прогонов — в МВП не нужна** (из батча снята; данные уже в Postgres, один read-путь по запросу поддержки).
|
||
(з) **В-6:** `run-options`/409 получают `blocked: {code, book_id}`.
|
||
(и) **К-6:** замечания показывать ВСЕ; в тексте сворачивать/раскрывать кнопкой; словарь ступеней заранее НЕ проектировать; зависимость `Note.id` закрывает батч; зонная половина — фронту при разморозке.
|
||
(к) **В-10 спойлер = «вежливость» — ЗАКРЫТ:** контракта не касается, `sense` обязателен, размытие — визуальное дело фронта, находимость Ctrl+F — приемлемое следствие.
|
||
(л) **PD-104 ЗАКРЫТ словом владельца** (§8 п.14): `SignupGrantMicroUSD` → **0** на бете, начисление руками; возврат $5 — вместе с суточным агрегатным потолком при появлении платежей; исполнение — P7-однострочник (грант при неверифицированном email уже 0, `login.go:306-308`).
|
||
(м) **0.3.0 — НЕ последний 0.x:** право ломать в 0.x держится весь бета-период; окно 1.0 — после беты.
|
||
|
||
**3. Батч 0.3.0 ЗАКАЗАН (строка 183).** Состав и порядок — §5 отчёта (порядок не косметика: Б-1 модель ошибок ПЕРВОЙ — от словаря кодов зависят Б-2/Б-3/Б-8/Б-14а/§8а); резка — §5а; направления вне батча — хвост §5. Исполнение — ОТДЕЛЬНАЯ сессия по промту (норма D39.120 п.2 / эррата 15.08-в), промт — очередь №17. Правила лендинга (§8б): решения перенесены ЭТОЙ нотой до любой правки спеки · компаньон правится ВМЕСТЕ со спекой (его §5-ответ про волны опровергнут исполнением, Б-0; «канала банка нет» — Б-7а) · канон первым, зеркало фронта отдельным зонным коммитом, cmp-сверка обязательна.
|
||
|
||
**4. Строки.** 179 ЗАКРЫТА (сессия → доклад → эта ратификация; исполнение — 183). Новые: **183** батч 0.3.0 (носитель состава — research/28 §5) · **184** жанр вон · **185** дописывание глав + гейт молчаливой перекупки · **186** сеть/перф §5б · **187** два лживых комментария движка о `memory_version` (`snapshot.go:188-189` + `membank/memory.go:360-363` — оба описывают до-pack-20 поведение). Владелец-лист: PD-104 и В-10 закрыты; Ф-56/Ф-57/Ф-61/Ф-62 — диспозиции §6 (исполнение батчем); К-13-остаток (описание `:879`) — в батч.
|
||
|
||
**5. Пинги розданы** (§8б п.4/§9): платформе — деньги/надёжность §9 + PD-104 + платформенная половина батча + К-10 «не строить»; фронту — диспозиции четырёх вопросов зоны + мок-находки §9 + перф-входы разморозки. Движковые находки §9 — строки 187 и 185 (ja-мина: новый ruby-алиас двигает `memory_version` → снапшот; громкий `--resnapshot`, не тихая перекупка — уточнение приёмки). (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.139 — ПОДРЕЗКА ХВОСТОВ И АКТУАЛИЗАЦИЯ ПЛАНИРОВОЧНЫХ ДОКОВ (заказ владельца 16.08: «перечитай закоммиченное, пройди все доки планирования, спили протухшее»). ✅
|
||
|
||
**1. Хвосты подрезаны (санкция — слово владельца 16.08 «не пора ли подрезать»).** (а) D-лог: тела D39.107–123 (закрытые эры №14–15) → слайс `archive/architecture/05-decisions-D39-106-123.md`; живая голова теперь **D39.124+**, живым телом оставлен D39.106 (шов — на него ссылаются классом); пол обновлён во всех носителях правила чтения (CLAUDE.md ×2 · README · ORCHESTRATOR_SESSION_PROMPT · титул D-лога); 591→389 строк. (б) PROGRESS: три закрытые бэкенд-записи 14–15.08 (эмиттер · migrate · DeepSeek-репин) → слайс `archive/PROGRESS-2026-08-14-15.md`; секция «Полигон» НЕ тронута (живая зона); 578→406 строк. Реестр 05-decisions-index.md покрывает все номера одним хопом — counts `--check` зелёный.
|
||
|
||
**2. Свип планировочных доков трёх зон (прочитаны целиком: product-requirements · 09-target · ORCHESTRATOR_SESSION_PROMPT · backend/README · platform/README+BACKLOG+PLATFORM_DIRECTION · frontend FRONTEND_PLAN+FRONTEND_SESSION_PROMPT+BACKLOG+STACK_DECISIONS §8). Противоречия найдены и разведены:**
|
||
(а) **Моя зона — исправлено этим лендингом:** ПТ-16/ПТ-18 держали «открытый К-9» (закрыт D39.138 п.2б) · ПТ-20 держал «живой 0.2.2» и «гейт S4 пал» (0.2.3; S4 принят, зона заморожена) · ПТ-22 нёс жанр (выкинут — строка 184) · ПТ-33 нёс «лестницу фаз» как норму (устная фраза владельца, §8 п.15) и опровергнутый ответ §5 компаньона (Б-0) · ПТ-34 дополнен носителем Б-4 · ПТ-35 держал открытый К-13 (закрыт) · README держал В-10 в гейте разморозки (пропуск МОЕГО лендинга D39.138 — пойман пере-чтением коммита) · шапка 09-target освежена.
|
||
(б) **Зона платформы — пинг-аддендум в журнал (сама не правится):** `PLATFORM_DIRECTION` §2 и `BACKLOG` П-7 держат «дефолт $5» против закрытого PD-104 (грант 0 на бете) · баннер §3 «ратификация за оркестратором» закрыт ещё D39.132 п.2б (oapi-codegen кандидат при P7 · sqlc привязан к P7) — баннер не обновлён · §4 п.5 «сервер вправе склеивать» сузится батчем (запрет склейки `note`, Б-6в).
|
||
(в) **Зона фронта — пинг-аддендум в журнал:** `FRONTEND_SESSION_PROMPT` §9 п.1, `FRONTEND_PLAN` §6 п.1 и `STACK_DECISIONS` §8 п.1 учат ПОФАЗНОМУ прогрессу «draft N/M ∥ edit N/M» — устареет батчем (Б-0: один счётчик, знаменатель купленный); `STACK_DECISIONS` §8 протух целиком — все 4 пункта построены (D39.122/131/132); Ф-59 закрывается ответом В-10 «вежливость»; Ф-37 ждала К-10 — отвечен «НЕ строить»; Ф-39 закрыта D39.136 п.4б.
|
||
|
||
**3. Не тронуто сознательно:** зонные доки чужих зон (правят сессии зон по пингам); исторические тела под ⚠-баннерами (01–06, FRONTEND_SESSION_PROMPT §исторические — баннеры уже стоят); секция «Полигон» PROGRESS и все файлы живого полигона. (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.140 — АУДИТ ЦЕЛОСТНОСТИ БЭКЛОГА (заказ владельца 16.08 «не потеряли ли строки»): ПОТЕРЬ НЕТ — 200/200 ID со следом судьбы; 9 загейченных хвостов без носителя получили носителей (строки 188–190, дописки 172-г/28, три жильца Б-108). ✅
|
||
|
||
**1. Приёмка аудита (агент-аудитор + выборочная перепроверка оркестратора исполнением).** Метод аудита: 292 ревизии `docs/PROGRESS.md` по git-истории → множество всех когда-либо существовавших ID (200 + один номер-однодневка 117, выданный нотой и не доживший до таблицы) → судьба каждого ушедшего. **Вердикт: из бэклога ничего не потеряно** — 144 живых, 56 ушедших и ВСЕ 56 со следом закрытия в D-логе; дыры нумерации 29/133 — номера не выдавались. Оркестратор перепроверил сам: live-набор ID идентичен HEAD и дереву; четыре несущих клейма — по первоисточникам (риг `live_reprobe_test.go:181-190` · D39.136 п.6б · грепы «ре-проб» и research/28 §6).
|
||
|
||
**2. Три аномалии ФОРМЫ (исторические, работы не стоили, все — до/около ратификации соответствующих норм):** (а) **117** — строка-однодневка: номер выдан D39.96, предмет исполнен и закрыт D39.97 раньше, чем строку записали в таблицу (проба провода PASS 3/3, $0.0053); ссылки старых доков на «носителя 117» фактически указывают на 118–123. (б) **20** — закрыта поглощением в переписанную 21 без произнесённого «закрыта» (за день до нормы D39.66). (в) **14** — единственное переиспользование ID на 200 (пак-19 → data-флаги фазы-2, 01.08, за день до нормы «ID не переиспользуется» D39.63 п.5); обе работы целы.
|
||
|
||
**3. Девять загейченных хвостов БЕЗ носителя — класс NEVER_CLOSED, все получили носителей ЭТИМ лендингом** (шесть — первый проход аудита; ещё три — глубокий свип хвостов по 26 закрытым строкам трёх эр): (а) **событие «ре-проба 74»** ждали живые строки 5/36б/44 и шапка CURRENT-STATE, владельца не было (74 закрыта D39.91, а гейт «слот при ре-пробе» ставился D39.102 уже ПОСЛЕ её закрытия) → **строка 188** (носитель события + все слоты); (б) **порог 116 не доехал до рига**: ратифицировано «≥4/5 при N=5» (D39.136 п.6б), риг требует 6/6 на каждом прогоне и сам предупреждает «threshold and sample disagree» — вахта весов V4-Pro-0813 упала бы ложно на 4/5 → **дописка в 172-г** (внести порог ДО прогона вахты); (в) граница пробы 117 (CONNECT/CONTINUATION/нагрузка; SETTINGS-фингерпринт не в quirks) → **жилец Б-108**; (г) «перспектива» гендер-аннотации пака-19 → **жилец Б-108** (триггер: оси голоса); (д) мультиязычность фраз логов/артефактов движка (вторая половина слова владельца 15.08; research/28 §6 «носителя назвать отдельно») → **строка 189**; (е) кросс-СЕМЕЙНЫЙ проход контракт-ревью (жил только колонкой реестра) → **строка 190**; (ж) **решение о включении `RegenerateEchoBeforeEscalate`** (экс-77, D39.64: «включение — решением при ре-пробе 74»; ручка построена и мертва во всех конфигах, ре-ген ≈7.6× дешевле эскалации; жила только кодом и README-бюллетенем без номера) → **слот строки 188**; (з) **реопен эскалационного капа** (D39.131 п.2д «не прицениваает хоп, реопен — первый живой инцидент» — отложка 14.08 жила только телом ноты) → **жилец Б-108**; (и) **хвост 128 «латиница-target/NoDst»** (D39.102; при закрытии 128 нотой D39.118 дословно не переехал) → **дописка в строку 28**.
|
||
|
||
**4. Урок процессу (знанием, без новой нормы):** норма «закрытая строка уходит в D-лог» держится безупречно (0 потерь на 56 закрытий), а теряется ровно класс, который §Б-108 и заведён ловить, — загейченные РЕОПЕНЫ внутри текстов закрывающих нот; сам Б-108 признавал ≥6 нарушений, и аудит добавил 6 новых. Дешёвый контр: при закрытии строки грепать её тело на «остаток/вернуться/реопен/гейт» — уже в нормах (D39.66 + промт §8), исполнять механически. (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.141 — РЕСТРУКТУРИЗАЦИЯ ПРОМТА ОРКЕСТРАТОРА (заказ владельца 16.08: сжать, убрать нарративные дельты, форма «ситуация → инструкция»). ✅
|
||
|
||
**1. Форма.** Читатель промта — холодный оркестратор №N, которому нужна инструкция, а не хроника чужих ошибок. Пересобран в разделы-ситуации («заказана тяжёлая работа?» · «пишешь промт?» · «принимаешь?» · «лендишь?» · «ратифицируешь?» · «говоришь с владельцем?» · «панель?») + чек-лист 11 обязательных блоков промта с двумя рубежами выдачи (механическая сверка + опровергатель-субагент; перечтение автором рубежом не считается) + таблица линз приёмки ПО ХАРАКТЕРУ работы (код — исполнение/посадки/индустриальный первоисточник; полигон — пере-вывод из сырья/независимость сигналов/leave-one-out; ресёрч — claim-fidelity; доки — сверка с кодом). Генезис — только D-ссылками.
|
||
|
||
**2. Верификация переноса.** −59% объёма (29k→12k символов); механический свип маркеров всех норм v16 против новой редакции — 4 кандидата на пропажу, все ложные (перенос строки/падеж/латиница), потерь 0. Снимок прежней редакции — `archive/prompts/ORCHESTRATOR_SESSION_PROMPT_v16_2026-08-16.md`. Дополнено против v16: вопросы владельцу по-человечески (урок 15.08, жил только в памяти) · форма тяжёлых работ отдельной сессией (эррата 15.08-в — теперь в роли, не только в эррате). (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.142 — ПРИЁМКА БАТЧА 0.3.0 ПРИНЯТА И ЗАЛЕНДЕНА (`8d82096`): канон 0.3.0 + компаньон в каноне; дофикс-раунд ФБ-1..10 заказан; зеркало фронта временно отстаёт ратифицированно (16.08). ✅
|
||
|
||
**1. Приёмка — панель трёх линз (механика-минимум антипаттернов).** (а) Слепая сверка заказ+дифф БЕЗ отчёта (кросс-тир): **потерь 0, существенных искажений 0** — все пункты §5 включая одностройники, обе эрраты (TermStatus ось сохранена, В-6 заведён), §5(а-д) компаньона; гейты пере-прогнаны зелёными; запрещённое («не заводить») не пролезло. (б) Холодный потребитель финальной спеки (другая модель, tsc-проба): анти-утечка — «редкий чистый проход», «file-последним убит схемой»; 5 блокеров-вопросов и ~30 находок — триаж в п.3. (в) Аудит отчёта: 25+ предметных клеймов сошлись пере-раном; **9 числовых клеймов не пере-раны после финальных правок — ВСЕ занижают собственную работу** (16 кодов названы 15, 57 находок — 26, 2315 строк — 2290); дыры записки-плана Б-23/К-10/В-6 (работа сделана, строк нет). Вердикт: отчёту верить как карте сделанного, числам — только пере-раном.
|
||
|
||
**2. Ратификации отступлений сессии (§8 отчёта, вопросы 1–3):** (а) прогонный поток СНЯТ, канал один — книжный (буква ратифицированного §5 п.5 соблюдена; «узкий вид» был телом Б-6, вторая поверхность = второй источник расхождения); (б) `Note.message` → `Note.code` (фразы замечаний — приложение А компаньона, слова пишет владелец, строка 148) и `Note.unit_id` сохранён; (в) `content_refused` в `RejectReason` остаётся (К-9 ратифицирован; значение без сегодняшнего писателя — честно помечено); (г) единый `page_size_default` вместо пер-коллекционных — принят (значение деплоя, не константа спеки).
|
||
|
||
**3. Дофикс-раунд ФБ-1..10 ЗАКАЗАН** (носитель — аддендум промта батча, та же сессия релеем владельца): HIGH — wire-форма SSE-кадра неоднозначна · петля переподключения книги в покое без истории · «note не теряется» не переживает reconnect · противоречия Revision/водяного знака; MED/LOW — пачка недоопределённостей и правка чисел отчёта. Триаж отклонённого из линзы (б): вход вне поверхности — ратифицировано D39.99 §4 №27 · 500 не документируется — D39.123/Zalando · словари `Note.code`/`failure_code` ждут приложения А — осознанный obstacle (строка 148) · `localized` — ратифицированный слот §8 п.4 · генераторные предательства типов — шов клиента (норма зоны фронта, сужение на `src/api/`).
|
||
|
||
**4. Вопрос владельцу (не решается этой нотой):** экран подписи не может показать, КАКИЕ строки уже решены после перезагрузки (`pending_decisions` говорит «осталось 17», но не какие) — лечение `BankTerm.decision` (4 строки схемы, Ц0); НЕ сделано из-за запрета «полей BankTerm не заводить» (D39.136 п.4б); чтение сессии и оркестратора: запрет был о СМЫСЛОВЫХ полях, это — состояние подписи (предмет Б-14а). Рекомендация — заводить.
|
||
|
||
**5. Порядок дальше:** дофикс → его приёмка → P7 (гейт §1 промта держится на дофиксе — SSE-форма это ядро P7); зеркало `frontend/docs/api-contract/` + типы + моки + гейт утечки — первое касание фронта при разморозке (временное расхождение канона и зеркала РАТИФИЦИРОВАНО этой нотой как известное состояние). Строка 183 пере-скоуплена. (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.143 — ДОФИКС БАТЧА 0.3.0 ПРИНЯТ И ЗАЛЕНДЕН: все ФБ-1..10 закрыты в каноне; батч отработан целиком, P7 РАЗБЛОКИРОВАН (16.08). ✅
|
||
|
||
**1. Приёмка инлайн (лёгкий класс, D39.142 предсказала малый дифф — 246 строк спеки).** Дифф прочитан оркестратором ЦЕЛИКОМ до чтения отчёта; оба гейта пере-раны своей рукой (spectral exit 0 · генератор exit 0); зона — ровно те же три файла, зеркало не тронуто. Все десять ФБ закрыты, решения точные: петля переподключения убита правилом `id: 0` для книги без истории (Last-Event-ID: 0 → существующее 204) · «note не теряется» честно сужено до одного соединения + ОБЯЗАННОСТЬ дельта-чтения после каждого reconnect · resume получил таблицу поведения по КАЖДОМУ статусу без нового enum-значения (ратификация D39.132 п.2а не тронута) · Revision сведён в одну модель (водяной знак = НАИМЕНЬШАЯ ревизия обхода — безопасное направление) · приоритет пяти носителей «нет кредита» записан на RunOptions · `parser_unavailable` → `processing_failed` · внутренние ссылки research/28 вычищены из компилируемых описаний.
|
||
|
||
**2. Числа отчёта пере-раны сессией командами после ПОСЛЕДНЕЙ правки, и вывод «доля прозы не сдвинулась» ЧЕСТНО ПЕРЕВЁРНУТ** (42%→47%, скрипт мерки приложен): дофикс закрывает находки правилами, а правило — проза. Принято: рост доли обоснован предметом. Записка-план дополнена строками Б-23/К-10/В-6; два ярлыка «исполнено иначе» переквалифицированы в «отступление, аргумент».
|
||
|
||
**3. Ратификации отступлений:** (а) §5(д) промта — генезис-проза УЖАТА НА МЕСТЕ, а не перенесена в компаньон (третья копия ссылки бессмысленна; компаньон §6а поправлен); (б) «carried forward marked as unverified» СНЯТО с провода как фраза без носителя — наблюдаемое = `BankPage.signed`/`total`.
|
||
|
||
**4. Статусы:** батч 0.3.0 отработан ЦЕЛИКОМ, промт в архиве; **P7 разблокирован** (его §1-гейт удовлетворён: канон 0.3.0 финален) — запуск по слову владельца; зеркало+типы+моки+гейт утечки — первое касание фронта при разморозке (D39.142 п.5); на владельце остаётся вопрос `BankTerm.decision` (D39.142 п.4). Строка 183 пере-скоуплена в остаток-указатель. (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.144 — МОДЕЛЬ ПОДПИСИ БАНКА (слово владельца 16.08, напрямую №17): подписывается ВЕСЬ банк ОДНИМ ОК; гейт полноты пер-термных решений СНЯТ с канона; вопрос BankTerm.decision РАСТВОРЁН (16.08). ✅
|
||
|
||
**1. Модель (первоисточник — владелец, дословный смысл).** UX: юзер жмёт перевод → черновая волна + майнинг → на фронте появляются черновой перевод И черновой банк; банк на книгу может быть огромным, пер-термная подпись = сотни кликов — НЕ модель продукта; подписывается банк ЦЕЛИКОМ («условный ок»), перевод уходит в доработку. После прочтения: поправить/добавить термин → «поправить» → пере-генерация по вхождениям (возможно, движковый точечный редактор — полигон работает); ⚠ точную механику пост-ридинговых правок «не продумал ещё никто и нигде» — НЕ проектировать до полигонных итогов.
|
||
|
||
**2. Сверка с движком (заявление=команда):** движок УЖЕ живёт этой моделью — дефолт авто-продолжение с НЕПОДПИСАННЫМ банком, неподписанные строки персистятся и едут с пометкой (`mining.go`, авто-провод D39.42 п.3); `--verify-bank` — пауза «посмотреть», не марш по строкам. Гейт «стоп снимается полным набором решений» был изобретением КОНТРАКТНОЙ линии (Ф-14 → спека → 0.3.0), пережившим даже greenfield-ревью — инерция, которую владелец уже осаживал 10.08 (снятие счётчиков «подписано N», Ф-44), но поправка тогда дошла только до экрана, не до модели контракта.
|
||
|
||
**3. Исполнено этой нотой (канон 0.3.0, микро-правка оркестратора по прямому слову владельца; гейты пере-раны — spectral/генератор зелёные, `bank_decisions_incomplete` в файле 0):** resume снимает банк-стоп при ЛЮБОМ состоянии решений (таблица resumeRun); `pending_decisions`/`complete` — информационные, «подпись = один акт над всем банком» записана на чтении банка; `stop_for_signing` описан как «пауза посмотреть → один resume»; `bank_decisions_incomplete` удалён из причин 409. Версия остаётся 0.3.0 — спека ещё никем не потреблена (P7 не стартовал).
|
||
|
||
**4. Следствия:** строка **191** заведена (движковая граница паузы · канал P7 без гейта полноты · пост-ридинг = направление после полигона); аддендум в промт P7 («полноту не отливать в код»); пинг фронту (Ф-44/Ф-45/Ф-46 при разморозке читать через модель); **вопрос BankTerm.decision (D39.142 п.4) СНЯТ ОРКЕСТРАТОРОМ** — он стоял на ложной посылке «длинная пер-термная сессия, которую надо резюмить»; в модели одного ОК сценария «какие 17 из 300 решены» не существует. (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.145 — ПРОМТ P7 ПЕРЕСОБРАН по слову владельца (перечитать после батча · без воды) + опровергатель промта: канон дочищен от снятого гейта, демонтаж построенного гейта заказан явно (16.08). ✅
|
||
|
||
**1. Два рубежа нормы D39.141 исполнены:** механическая сверка (11/11 блоков) + опровергатель-субагент. Автор-перечтение поймало 7 протуханий (худшее: промт заказывал «кадр конца разбора», которого в заленденном каноне НЕТ — ратифицированное отступление батча); опровергатель — 8 HIGH сверх того, два за пределами промта: (а) **гейт полноты банка уже построен** (`reconcile.go:934-938`) — запрет «не отливай» был вырожденно исполним при живом старом гейте, демонтаж теперь заказан явным пунктом; (б) **недочистка D39.144** — эррата 16.08-д, канон/компаньон дочищены, spectral зелёный. Остальные HIGH влиты: экспорт явно отложен в P8 · structure_version во всём ядре · снятие `genre` с провода (allowlist) · `Usage.halt_reason` со своим словарём · ловушка `heading` (проецировать null до строки 160) · ◆-словарь `Note.code`. Отклонено с уликой: «лимит попыток класса 2 потерян и в каноне» — он в каноне есть (`:2394-2395`).
|
||
|
||
**2. Форма промта — по слову владельца «конкретика без прозы»:** пересобран с ~170 до ~120 строк, каждый пункт = «что сделать → где форма/факт → чего не делать»; правки построенного получили ПРАВИЛО (пофайловый дифф wire-структур против required канона) + именованный минимум; PD-241 (D39.132 п.2д «следующим касанием» — касание и есть P7) возвращён императивом. (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.146 — ЗАКРЫТИЕ СЕССИИ ОРКЕСТРАТОРА №17, ПЕРЕДАЧА №18 (16.08). ✅
|
||
|
||
**1. Лента №17 (15–16.08, ноты D39.134–145):** приёмки migrate/S4/DeepSeek-репина · пакет слов владельца D39.136 · контракт-ревью research/28 заказано, принято, ратифицировано (D39.138) · подрезка хвостов и свип планировочных доков (D39.139) · аудит целостности бэклога — потерь 0, девять бесхозных хвостов закрыты (D39.140) · реструктуризация промта оркестратора «ситуация → инструкция» с чек-листом промтов (D39.141) · батч 0.3.0 + дофикс исполнены и приняты, канон финален (D39.142/143) · модель подписи банка «один ОК» (D39.144) · пересборка промта P7 с демонтажом построенного гейта (D39.145). Уроки сессии — в законе роли (D39.141), не в хронике.
|
||
|
||
**2. Очередь №18 (по готовности, не по номеру):** (а) **приёмка P7** (сессия ЖИВАЯ, запущена 16.08) → лендинг → **S5-промт + разморозка фронта** (входы первого касания — CURRENT-STATE «фронт»); (б) лендинг петель полигона по фазе Д (приёмка фазы — ПАРАЛЛЕЛЬНЫЙ оркестратор; декой-правило и кросс-семейный опровергатель — в его D-ноту); (в) **вахта весов V4-Pro-0813** — перед прогоном внести в риг выборочный порог 116 (строка 172-г, иначе ложное падение); (г) свободные бэкенд-паки: 160 Этап 0 (мандат качества) · 181 (дедлайн — первый пере-прогон старой книги); (д) строка 148 — после фраз владельца. Онбординг — стандартный (CLAUDE.md), состояние — только CURRENT-STATE.
|
||
|
||
**3. Гигиена передачи:** CURRENT-STATE ужат (лента закрытых строек и закрытые пункты листа владельца — указателями на ноты); строки 169/186/191 приведены к «P7 запущен»; README/09-target/реестр требований актуализированы; журналы зон срезаны в зонные архивы по слову владельца (фронт 2434→469 строк — `frontend-PROGRESS-S0-S4.md`; платформа 1843→152 — `platform-PROGRESS-P4-P6.md`); секция «Полигон» ужата (закрытые записи эксп-22/23 — в слайс `PROGRESS-2026-08-14-15.md`, живое: CONFIRM/DENY-листы и фаза Д).
|
||
|
||
**4. Аудиты готовности (два Опуса, полный контекст) — диспозиции.** ОБЩИЙ («готова ~90%, 3 блокера»): полигонные доки фазы Д, жившие только в индексе с 15.08, ЗАКОММИЧЕНЫ (`67e3260` — потеря при reset исключена) · очередь №18 сведена в ЕДИНСТВЕННЫЙ носитель CURRENT-STATE (пункты а–д, вкл. потерянные «лендинг петель полигона» и «строка 148») · денежные литералы фазы Д ($4.50/$6.74) СНЯТЫ с README/CURRENT-STATE — числа в носителях расходились ($6.85/цепь промта), честный указатель «сверить фактическую цепь при лендинге петель» · ⚠ дереву добавлена запись: полигон работал 16.08 БЕЗ записи в журнале (`PLAN-16-08.md`, `ja6.py`, `naklon.py`) — состав выяснять при лендинге · глоссарий/компаньон-зеркало/провенанс реестра/два якоря migrate.go/чейнджлог-шапка — починены · норма «обязательство с адресатом вне зоны закрывается файлом ВНЕ зоны» — в закон роли (жила только памятью) · ОТКЛОНЕНО: вынос живых тел D22+ из D-лога (осознанная структура диеты D39.125). ЗОННЫЙ («платформа готова, фронт нет без двух правок»): компаньон дочищен от гейта полноты в §2.9 и «15 кодов»→16 — пятое и шестое места недочистки D39.144 (к эррате 16.08-д) + мёртвые якоря mining.go:201 · фронту — дописка-пинг о четырёх нормах, сменивших знак (зеркало отстаёт ратифицированно · метка «Глава N» теперь ОБЯЗАННОСТЬ клиента · Ф-31/В-6 закрыты, EventCeiling снят · В-11 на словарь 0.3.0 + дев-стенд P6 существует) · платформе — дозакладка протухших мест зоны к §4.6 промта (релей). (16.08.2026, оркестратор №17) ✅
|
||
|
||
## D39.147 — СЛОВО ВЛАДЕЛЬЦА 17.08 (напрямую №18): ФРОНТ МОРОЗИТСЯ ДАЛЬШЕ ЛЕНДИНГА P7, курс — движок и платформа до состояния «работает и отдаёт результат» (17.08). ✅
|
||
|
||
**1. Решение (первоисточник — владелец, дословный смысл).** «Фронт морозим ещё дальше. Нам нужно довести бэкенд и платформу до логического какого-то завершения, чтоб они работали и отдавали что-то. А фронт будем накручивать уже на готовую функциональность и спиливать оттуда лишние моки, которые неплохо бы держать где-то на уровне бэкендов или как-то ещё отдельно.» ⇒ **условие разморозки D39.136 п.2 АМЕНДИРОВАНО: лендинг P7 зону БОЛЬШЕ НЕ размораживает**, S5-промт не выдаётся; разморозка — отдельным словом владельца по достижении сквозного пути. Входы первого касания зоны (зеркало 0.3.0 · типы · моки · гейт утечки конвейера · ФС-1..12 · Ф-63/Ф-28 · фразы В-11) не отменены — они ждут РАЗМОРОЗКИ, а не лендинга P7. Направление по мокам: мок-мир фронта уступает реальному источнику (дев-стенд платформы существует с P6, D39.132); форма («на уровне бэкендов или отдельно») — вопрос дизайна при разморозке, сейчас не проектируется.
|
||
|
||
**2. Инвентарь под этот курс (три читающих аудита №18, всё грунтовано кодом; знание, не заказ — носители названы).** (а) **Движок не умеет отдать книгу:** `tmctl export` пишет только stdout — JSON либо ленту с баннерами `=== CHAPTER n CHUNK m ===` (`cmd/tmctl/render.go:477`, баннер флагнутого `:502`); ассемблера в файл нет ни в движке, ни в платформе, а `export` возвращает успех даже при 100% pending — «never an exit-2 sentinel … export is an audit projection, not a run verdict» (`cmd/tmctl/render.go:474-475`) — лестницы `run_complete/structurally_complete/publishable` в коде 0 вхождений. Носитель — **строка 49** (этап В D15.2), подтверждена кодом, вес не меняется. (б) **Дыры выдачи молчат в самом тексте** — новая **строка 193**. (в) **Боевой конфиг переводит «голым»** (0 вхождений терминолога/банкноты/майнера/классификатора/голоса/репейра в `configs/pipeline-c1.yaml`, `escalation.budget_usd: 0`): это **строка 140**, и её внесение ратифицированно живёт в wire-батче **182** — одним касанием перед первым платным прогоном; отдельной развилки нет (уточнение владельца 17.08 на вопрос №18). (г) **Масштаб:** жёстких потолков размера в коде нет, но чтения стора беспагинационны под `opTimeout = 10s` — **дописка в строку 54**. (д) **Платформа после P7 — «читаемая», не «законченная»:** экспорт-ручки отложены в P8 явно, денежный контур = холд-с-обрезкой без эскроу (перерасход срезается до холда и остаётся текстом в колонке, `platform/internal/pgstore/credits.go:212-235`), сверки с провайдером нет — **строки 136/137, П-18** зоны. (е) Раскладка бэклога движка по критерию «мешает ли сквозному пути»: 103 строки зоны, блокирующих **18** (+6 спорных), и два тяжелейших — **54** и **16** — не про код вовсе: книгу больше 10 глав и редакторскую волну не гоняли НИ РАЗУ, их закрывает только платный прогон.
|
||
|
||
**3. Синхронизировано этим же коммитом:** CURRENT-STATE · `README.md` · ПТ-20 реестра требований · пинг в зонный журнал фронта. Очередь №18: приёмка P7 → лендинг **без** S5 и без разморозки; промт бэкенд-пака честности (176 · 181 · 172-г · 187) выдан и ждёт слова владельца на запуск. (17.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.148 — РЕВИЗИЯ D39.126: линт якорей вплетён в pre-commit хук доков (warn-only); попутно закрыт метод-урок «как проверять хук» (17.08). ✅
|
||
|
||
**1. Решение (слово владельца 17.08 по докладу параллельного ревьюера; ревизия, а не недоделка).** Хук зоны `docs/` зовёт теперь ОБА режима `counts.py` — `--check` (числа и голова) и `--lint` (file:line-якоря), оба `--from-index`, оба warn-only, коммит не блокируется никогда. Прежняя запись «хук зовёт только `--check`, `--lint` руками» (D39.126) СНЯТА. Довод: ручной запуск жил только в промте оркестратора, то есть держался прозой — ровно тот класс, из-за которого хук и заводился (голова отставала трижды у трёх разных сессий, D39.112 п.5б); а ловил он реальное — протухший якорь `render.go`, внесённый в канон оркестратором №18 17.08. Цена — 0.21 с на docs-коммит.
|
||
|
||
**2. Дизайн — четыре уточнения, каждое против названного канала вреда «хук, который врёт, учат игнорировать».** (а) **Сканируемые доки читаются по содержимому коммита** (индекс для застейдженного, HEAD для прочих): 24 из 87 сканируемых доков — `docs/experiments/`, зона живого полигона с постоянным незакоммиченным деревом, и чтение дерева давало бы ругань на чужой WIP. (б) **ЦЕЛИ якорей — из рабочего дерева**: код не входит в docs-коммит, его актуальная истина — дерево (целей в `eval/` всего 4 из 392, риск мизерный). (в) **Триггер линта шире носителей чисел** — любой `docs/**` или `CLAUDE.md`: якоря живут и в промтах сессий; полигонский фриз-коммит изредка увидит warn-only строку, это принято. (г) **Состав коммита и состояние дерева считаются по одному разу на процесс**: наивная реализация звала git на каждый из 87 доков.
|
||
|
||
**3. Верификация — реальными тест-коммитами, а не ручным прогоном скрипта, и она поймала ДВА моих дефекта.** Четыре сценария на стендовом репозитории: чужой modified-WIP и чужой untracked рядом с чистым своим доком → тишина · свой мёртвый якорь в коммите → предупреждение с телом, коммит проходит · коммит вне `docs/` → хук не вмешивается · снесённый в дереве `CLAUDE.md` → без падения. Поймано и исправлено до лендинга: оптимизация «чистый файл читаем с диска» падала `FileNotFoundError` на файле, которого в дереве нет (прежняя ветка молча пропускала), и хук на падении скрипта печатал шапку предупреждения с ПУСТЫМ телом — теперь при отсутствии строк-находок печатается хвост вывода.
|
||
|
||
**4. Метод-урок (записан, потому что куплен ошибкой оркестратора №18 в тот же день).** Хук нельзя судить, запуская его руками в шелле: при частичном коммите (`git commit -- <пути>`, наша каноническая форма) git строит ВРЕМЕННЫЙ индекс и отдаёт его хуку через `GIT_INDEX_FILE`, поэтому `git diff --cached` и `git show :файл` ВНУТРИ хука видят состав коммита, а ручной прогон — настоящий индекс с чужим стейджем. №18 на этом основании объявил хук мёртвым для наших коммитов; диагноз опровергнут экспериментом параллельного ревьюера и пере-воспроизведён №18. ⚠ Опровергающая улика лежала в его же наблюдении (фронтовый фрагмент того же диспетчера отрабатывал на pathspec-коммитах) и была объяснена, а не проверена — «связность вместо истинности» из дисциплины ревьюера. Проверка хука = тест-коммит, не вызов скрипта.
|
||
|
||
**5. Носители:** докстринг `docs/scripts/counts.py` (строка «--lint руками» переписана), шапка `docs/scripts/githooks/pre-commit`, `docs/README.md`. (17.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.149 — ПРИЁМКА БЭКЕНД-ПАКА «ЧЕСТНЫЕ ЧИСЛА И СТАТУСЫ» ПРИНЯТА С ФИКС-ЛИСТОМ И ЗАЛЕНДЕНА: строки 176/181/187 закрыты, 172-г НЕ закрыта, новые 194–196 (17.08). ✅
|
||
|
||
**1. Приёмка исполнением (панель 5 линз в изолированных копиях + пере-раны оркестратора; $0, только агент-токены).** Линзы: слепая (заказ+дифф ДО отчёта) · деньги · шов · вне карты · собственные мутации в копии дерева. Все пять — ACCEPT_WITH_FIXES, ни одного REJECT, регрессов против HEAD нет. **Пере-проверено МОЕЙ рукой:** батарея EXIT=0 с ровно двумя SKIP (оба helper-процессы) · голден бит-в-бит · `^func Test` = 827, удалённых имён 0 (числа отчёта 819/823 — промежуточные снимки, поправлено на месте) · **деньги живой пробы ДВУМЯ независимыми путями** (сумма чекпоинтов минус вызов 02.08 · пере-счёт из сырого `usage_json` по запинённой таблице `models.yaml`) — оба дали **$0.005582424**, знак в знак с заявленным · вердикт гейта из СЫРОГО артефакта: `runs: 5, runs_at_threshold: 4`, `finish=stop` ×5. Механика, фикс-лист ФЧ-1…ФЧ-8 и «что не проверено» — запись приёмки в PROGRESS «Бэкенд» (состав там).
|
||
|
||
**2. Что ратифицируется этой нотой.** (а) **Паника любой горутины движка → exit 1** принято: номера полос не двинуты (добавлен ровно один `return 1`), платформа читает 1 как `failed` во всех ПЯТИ точках потребления, тогда как ДО пака упавший посреди книги прогон записывался `ready` — это закрытие PD-212 со стороны движка. (б) **`obs.PanicError` намеренно без `Unwrap`** — ратифицировано: иначе паника значением `context.Canceled`/`*CeilingHalt` уехала бы в 5/4 при формально нетронутом словаре. (в) **Пере-прайс проекции идёт ФАКТИЧЕСКИМИ токенами чекпоинтов через шов сеттла**, а не оценкой; обе половины гейта (числитель и база 5%-порога) починены вместе — ратифицировано как единственная форма, при которой порог не сравнивает две валюты. (г) **Выборочный порог D39.136 п.6б внесён в риг**; прогон дал 4/5 — гейт ПРОЙДЕН, и это ровно тот случай, на котором прежняя форма «6/6 на каждом» упала бы ложно.
|
||
|
||
**3. Строки.** **176 ЗАКРЫТА** для паник (остаточный класс `fatal error` — новая **196**). **181 ЗАКРЫТА** (число согласия и `projected_book_usd` считаются текущей таблицей; ось МОДЕЛИ — открытый хвост ФЧ-5). **187 ЗАКРЫТА** в коде (тот же снятый закон в докстринге теста и `D15.2:317` — ФЧ-3). **172-г НЕ ЗАКРЫТА и закрывать по этому прогону запрещено** (риг меряет классификатор на flash, сменившиеся веса — у pro-редактора; дописка в теле строки). Новые: **194** деньги банковых ролей вне контура согласия (преexisting, подтверждён двумя линзами) · **195** маркер поколения на `checkpoints` — схемное решение владельца, а не третья заплата поверх ВЫВОДА членства · **196** остаточный класс `fatal error`.
|
||
|
||
**4. Владельцу (не решается этой нотой).** (а) **Ось МОДЕЛИ в числе согласия (ФЧ-5):** при смене модели стадии проекция считает ценой отставленной модели — замер линзы $0.003640 против честных $0.036400, и текст согласия при этом заявляет «current price table» без оговорки. Развилка: прайсить по модели, которую стадия резолвит СЕЙЧАС, либо оставить и назвать вслух в тексте согласия. Это деньги ⇒ слово владельца. (б) **Строка 195** — заводить ли `snapshot_id`/`run_id` на денежной таблице.
|
||
|
||
**5. Метод-заметка приёмки.** Три HIGH фикс-листа — не дефекты поведения, а НЕПРИБИТЫЕ гарантии: мутации переживали зелёную батарею. Самую тяжёлую (снятие фильтра по книге в `CheckpointUsageForBook`) оркестратор воспроизвёл лично — ни store-, ни денежные pipeline-тесты не краснеют, то есть единственная защита от денег ЧУЖОЙ книги в числе согласия держится не тестом. Сессия сама провела два раунда адверсариального ревью (38 агентов) и нашла в своей работе два настоящих регресса при зелёной самопроверке — это правильное поведение, и оно же показывает, что финальная панель приёмки не заменяется самопроверкой. (17.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.150 — РЕШЕНИЕ ВЛАДЕЛЬЦА ПО ОСИ МОДЕЛИ В ЧИСЛЕ СОГЛАСИЯ + актуализация доков после приёмки; фикс-лист записан строкой 197, вопрос маркера поколения вынесен на внешнее мнение (17.08). ✅
|
||
|
||
**1. Ось МОДЕЛИ — решено (владелец 17.08, ФЧ-5 приёмки D39.149).** Проекция пере-покупки обязана прайсить записанные токены по модели, которую стадия резолвит **СЕЙЧАС**, а не по той, что ответила тогда. Принято в форме, предложенной оркестратором и одобренной владельцем: **прайс по текущей модели + при невозможности знать округлять ВВЕРХ + называть оговорку в тексте согласия**.
|
||
|
||
**Обоснование, которое важнее самой правки (и оно же меняет обещание механизма).** Число согласия — предсказание будущей покупки из фактов прошлой, и точным быть не может: смена модели двигает не только цену, но и САМО количество токенов, а его мы взять неоткуда. Поэтому обязательство переформулировано: гарантируется **не точность, а направление ошибки** — «никогда не занизить молча»; завышение безопасно (оператор согласился на большее, чем заплатит), занижение — тот самый вред, ради которого чинилась строка 181. **Следствие: обещание точности снимается с провода** — комментарий «`status` не может назвать сумму, отличную от `translate`» (родня открытой строки 164) при исполнении ФЧ-5 обязан быть заменён честной формулой «оценка, ошибается вверх, вот чем». Исполнение — строкой 197.
|
||
|
||
**2. Фикс-лист ФЧ-1…ФЧ-8 ЗАПИСАН, сессия НЕ заказана** (слово владельца 17.08: «пока просто занеси в бэклог»). Носитель — строка **197**; тело фикс-листа — запись приёмки №18 в PROGRESS «Бэкенд». ФЧ-5 внутри неё помечен решённым этой нотой и обязателен до первого пере-прогона со сменой модели стадии.
|
||
|
||
**3. Маркер поколения (строка 195) — РЕШЕНИЕ ОТЛОЖЕНО, заказано внешнее мнение** (слово владельца 17.08). Причина отложить: при разборе вопроса нашлось, что предложение сессии («`snapshot_id`/`run_id` на таблице чекпоинтов») — не одинокая правка, а четвёртый жилец одной семьи: **строка 49** (content-addressed resume / `guard_hash`, D39.31 сознательно НЕ строил) · **строка 124** (дизайн-пак калибровки снапшота, ось «сверка тел по чекпоинтам, идентичные юниты пере-привязываются без пере-вызова») · **195**. Общий корень: денежная таблица не помнит, какой конфигурацией куплен вызов, поэтому принадлежность ВЫВОДИТСЯ. Рекомендация оркестратора — вносить 195 входом в дизайн-пак 124, а не колонкой; владелец вынес вопрос на внешний вердикт (глубокое чтение доков и кода отдельным агентом другого семейства): «хорошее ли это предложение, насколько глубоко надо решать корень, не переусложняем ли».
|
||
|
||
**4. Актуализация доков после приёмки (заказ владельца тем же словом).** **ПТ-14 понижен ✅ → 🔶** — траты защищены потолками, но само ЧИСЛО согласия неполно и приблизительно (194 банковые роли вне контура · ось модели до исполнения ФЧ-5 · 195 вывод вместо тождества); держать ✅ значило бы, что реестр требований обещает больше механизма. Промт пака отработан → архив с баннером-исходом (`archive/prompts/BACKEND_HONESTY_PACK_SESSION_PROMPT_2026-08-17.md`), разовая санкция на платный прогон помечена как НЕ распространяющаяся дальше; состав активных промтов в `README.md` обновлён тем же коммитом (норма D39.80). (17.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.151 — РЕШЕНИЕ ВЛАДЕЛЬЦА 17.08 (вариант А): маркер поколения отдельной колонкой НЕ строится, вопрос переселён осью в дизайн-пак 124; посылка «колонка = тождество» ОПРОВЕРГНУТА внешним разбором (17.08). ✅
|
||
|
||
**1. Решение (владелец, вариант А).** `snapshot_id`/`run_id` на таблице `checkpoints` **сейчас не заводится**; строка 195 как самостоятельная стройка ЗАКРЫТА и переформулирована в ось «идентичность оплаченной работы» дизайн-пака **124** (там же получила номер оси (г)). Пак 124 раньше своих триггеров не форсируется: дописывание глав в текущую книгу (185) · МАСШТАБ · первый внешний потребитель числа согласия.
|
||
|
||
**2. Чем это обосновано — две посылки оркестратора ОПРОВЕРГНУТЫ (внешний разбор, другое модельное семейство, чтение доков целиком + кода).** (а) **«Колонка превращает вывод в тождество» — НЕВЕРНО.** $0-пере-пин законно переносит строку `chunk_status` на новый снапшот со СТАРОЙ ценой (`internal/pipeline/stagerun.go:96-105` — `repinned.SnapshotID = snapID`; сверено оркестратором лично), поэтому у честно ре-пиненной строки деньги принадлежат чужому поколению ПО ЗАКОНУ и равенство снапшотов даёт пустоту; ретроактивного бэкфилла нет вовсе (`jobs.snapshot_id` перезаписывается каждым ре-снапшотом) ⇒ вывод-обход остаётся в коде НАВСЕГДА как legacy-ветка, а колонка лишь добавляет рядом второй путь. (б) **«Одна семья, решать разом» — слишком широко.** 49 и 195 отвечают на РАЗНЫЕ вопросы: 49 — «когда переиспользование законно» (гейт трат), 195 — «как честно посчитать будущую покупку» (учёт); общий у них субстрат, не задача. Из строки 124 родня только ось (в), оси (а)/(б) к деньгам отношения не имеют. Деферы D39.31 и гейт спеки D15.2 («онгоинг») не наступили и не отменяются.
|
||
|
||
**3. Настоящий корень назван (для будущего пака 124).** Не «денежная таблица не помнит конфигурацию», а «в сторе нет первоклассной связи *строка диспозиции ↔ вызовы, которые её оплатили*»: `checkpoints` append-only на жизнь книги, `chunk_status.cost_usd` перезаписывается каждым поколением, и единственный пер-поколенный авторитет — деньги самой строки. Снапшот на чекпоинте — прокси этой связи, а не примитив; класть в схему надо провенанс, а не флаг конфигурации.
|
||
|
||
**4. Почему срочности нет.** Под контрактом D39.150 («гарантируется НАПРАВЛЕНИЕ ошибки, не точность») ни один исход нынешнего механизма не занижает молча: нормальный случай точен, недостача несётся историческими деньгами С РАСКРЫТИЕМ, пойманный откат откатывается к устаревшей цене ВСЛУХ. Остаточные нарушения контракта чинятся БЕЗ схемы и уже имеют носителей — **197** (прибить гарантии тестами и довести раскрытие до `status`) и **194** (деньги банковых ролей в число согласия). ⚠ Уточнение цены 194, сверенное оркестратором: миграция ей НЕ нужна — `store.RoleSpentUSD` уже ключуется по РОЛИ чекпоинта, а не по колонке класса (`internal/store/ledger.go:105-118`, докстринг прямо: «a new call class needs no migration to become countable»). (17.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.152 — КОНТРАКТ API v0 **0.4.0 РАТИФИЦИРОВАН** (лендинг `6e84574`) (синк с платформой, 14 пунктов; author≠ratifier соблюдён сессией); четыре текстовые правки внесены при ратификации; клейм «ломающая правка одна» верен для типов и неточен поведенчески (20.08). ✅
|
||
|
||
**1. Что ратифицируется.** `docs/architecture/14-api-contract/openapi.yaml` + компаньон, `info.version: 0.4.0`. Автор — ОТДЕЛЬНАЯ контрактная сессия (20.08) в ответ на записку зоны платформы `platform/docs/archive/CONTRACT_SYNC_FROM_PLATFORM_2026-08-20.md` (14 пунктов A–N); разбор каждого — §6в компаньона. Сессия ратификацию за собой не записала и сдала текст оркестратору — норма author≠ratifier исполнена ею самой, отмечаю как правильное поведение. **0.3.0 действовал до этой ноты**; зависимость зоны (PD-327) закрывается ею.
|
||
|
||
**2. Рубеж перед ратификацией исполнен** (норма: тяжёлая ратификация — контракт — смотрится ревьюером другой модели, мнение владельцу ДО). Fable-5, чтение обеих версий ЦЕЛИКОМ: вердикт «ратифицировать с правками». Пере-проверено ИМ независимо дважды: структурный дифф схем и дифф генерённых типов дают ровно одну строку `stop_requested`. Корневой `ErrorCode` — 16 значений, байт-в-байт не тронут; все открытые уровни (`ErrorCause`, `ErrorItem.code`, `Note.code`, три reason-словаря) объявлены открытыми явно. Все 14 пунктов записки имеют диспозицию, остатков прежних формулировок ноль (грепы по снятым фразам = 0).
|
||
|
||
**3. Четыре правки внесены оркестратором при ратификации** (микро-дефекты доков своей зоны; в yaml — без маркера, описания компилируются в типы фронта): (а) `stopRun` не называл СЕТТЕРА нового поля и отправлял клиента хранить состояние у себя — прямо против описания самого поля («survives a reload, which a client's own pending state does not»); теперь названо, что стоп-вызов и есть сеттер и `202` уже несёт `true`. (б) Компаньон §6в A нёс «пустой СЧЁТ — не ответ этого вызова», что опровергается его же аддендумом и каноном (`credit_unavailable` — ровно ответ этого вызова); исправлено с пометкой. (в) «cleared by `resume`» уточнено до УСПЕШНОГО resume — отвергнутый буквально тоже resume. (г) Третий случай `resumeRun` приписан к таблице явно, как это сделала вторая ось: судится ПОСЛЕ таблицы и только там, где та сказала `202`.
|
||
|
||
**4. Пункт G («сделано» = последний проход, который книга на ЭТОМ деплое реально получает) — ратифицирован, и вот на каком основании.** У G, в отличие от J и A, записанного слова владельца не было, и зона сама пометила его продуктовым. Развилка снята владельцем 20.08 иначе, чем спрашивалось: он отверг саму рамку «какая фаза считается» и потребовал, чтобы форма пайплайна вообще не была видна клиенту. Формулировка канона этому УЖЕ удовлетворяет дословно — «the last pass the book actually gets, **whatever that is**» — и потому ратифицируется как есть: она не связывает пайплайн, а альтернатива (счёт по редакторской волне) — живой денежный дефект, на деплое без редактора ни одна глава не сделана никогда и шкала покупки не подрезается. Признак монотонен ⇒ книга, прошедшая редактирующий пайплайн, назад не откатывается.
|
||
|
||
**5. Клейм зоны «ломающая правка ровно одна» — верен для ТИПОВ, неточен поведенчески; записано, чтобы следующая приёмка на него не опёрлась.** Дифф генерённых типов слеп ко всему, что не двигает тип. Против 0.3.0 расходятся ПЯТЬ мест (⚠ первая редакция этой ноты называла четыре — пятое принесла проверка записей при лендинге): `Run.stop_requested` (типовое) · тождество интейка по дайджесту СОДЕРЖИМОГО против дословного 0.3.0 «compared over the DECLARED parts… and **never over the bytes themselves**» · `409 ceiling_reached` на исчерпанном прогоне там, где таблица §resumeRun 0.3.0 говорит «continues it — `202`» · валидатор/`304` на `getRunOptions` и `getUsage` сверх объявленных · **`410 Gone`**: 0.3.0 отвечает им «главе, которая БЫЛА и больше нет» и прямо противопоставляет `404` («would mean a typo»), 0.4.0 — «whether or not the id was ever real» (носитель расхождения назван зоной сама: `platform/docs/DEFECT_REGISTER.md` PD-253 — «расхождение снято НЕ кодом, канон изменён в нашу сторону»). Все пять 0.4.0 благословляет ⇒ цена уплачена этой ратификацией, дефекта пака здесь нет.
|
||
|
||
**6. Оговорка про пер-термные решения расширена с `decline` на ВСЮ ручку — внесена в канон при ратификации.** Прежний текст предупреждал только про `decline`, а инертны одинаково `approve`, `decline` и впечатанный `dst`; у `dst` не было ни слова, и грепающий канон расширения не увидел бы (поймано проверкой записей при лендинге — клейм ноты опережал текст). Теперь `BankDecision.action` несёт «NOTHING recorded here reaches the work itself yet», `dst` — отсылку к ней, и там же сказано, что́ работает СЕГОДНЯ: сама подпись, один `resume` над всем банком при любом состоянии решений. Оговорка ВРЕМЕННАЯ и объявлена свойством деплоя, а не обещанием контракта — снимается исполнением строки 199(а).
|
||
|
||
**7. Почему следующий минор не втиснут сюда.** Требование сквозной полосы прогресса (строка 200, слово владельца 20.08) — новое обязательное поле, то есть ещё один минор и ещё одна перегенерация клиента. Пока фронт заморожен и не потребляет ничего, миноры бесплатны: оба уедут в ОДНУ перегенерацию при разморозке. Значит нет причины вскрывать уже принятый пак платформы и заставлять зону доделывать на ходу. Зеркало фронта отстаёт ратифицированно (D39.142 п.5), при разморозке сверяется `cmp`. (20.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.153 — ПРИЁМКА И ЛЕНДИНГ P7 ПЛАТФОРМЫ (пять актов, читающая поверхность; лендинг `9b23e8c`, записи `6e84574`): **ПРИНЯТ С ФИКС-ЛИСТОМ**; шесть линз + собственные посадки, одна дыра пинов найдена оркестратором; новые строки 198–203; сессия закрыта владельцем (20.08). ✅
|
||
|
||
**1. Приёмка исполнением.** Панель шести линз в изолированных копиях, каждой свой каталог, бэкап чужого незакоммиченного ДО запуска (D39.113): слепая (заказ+дифф ДО отчёта) · контракт-конформность (пофайловый дифф wire-структур против ОБЕИХ версий канона) · деньги (два независимых пути из сырого леджера + живой стенд) · шов (инвентарь ВСЕХ каналов движка чтением чужого кода) · вне карты · ревью канона 0.4.0 другой моделью. Ни одной REJECT, регрессов против HEAD нет. **Пере-проверено рукой оркестратора:** `make check` с обоими гейтами — 18 пакетов, EXIT=0, **скипов 0**, линтер 0 issues · реестр 327 строк / 65 открытых (13 minor, 52 info), major и BLOCKER нет · оба док-гейта зелёные · миграционный манифест сходится, released-миграции не тронуты · `tmplatformctl books --migratable` живой. ⚠ Тестовых функций **532**, не 533 (команда — `grep -rh '^func Test' platform --include='*_test.go' | wc -l`; норма «дифф `^func Test` исполнением, не памятью» — `docs/ORCHESTRATOR_SESSION_PROMPT.md` §кодовый промт, со ссылкой на D39.121; в теле самой D39.121 команды нет — испр. при проверке записей); удалённых имён семь — каждое проверено, у каждого есть преемник, и преемники СИЛЬНЕЕ либо перевёрнуты по ратифицированному решению (гейт подписи банка → `TestResumeLiftsABankStopWithTheDecisionsAsTheyStand` плюс НОВЫЙ встречный `TestTheReconcilerDoesNotLiftABankStopNobodySigned`).
|
||
|
||
**2. Замер, обосновавший разворот схемного решения ВНУТРИ пака (00016 → 00022), пере-выведен независимо.** Свой бенчмарк на трёх вариантах в копии дерева: джойн **14.6 мс** · счётчик **5.3 мс** · без счётчика **2.9 мс**. Порядок и вывод подтверждаются, разворот законен: 00016 снёс колонку с доводом «её никто не пишет», 00022 вернул её ВМЕСТЕ с писателем. ⚠ Процент назван ЧЕТЫРЬМЯ носителями (журнал зоны 83% · `platform/internal/pgstore/perf_test.go:13`=`96% of the page` 96% · миграция 00022 «16.8 против 3.4, джойн сам 9 мс» · регистр PD-306 повторяет 83% и 16.8/3.4) — распад нормы «один носитель на факт» (D39.112) внутри одного пака. ⚠ **Первая редакция этой ноты писала «96% не выводится ни из чего» — ЭТО НЕВЕРНО и снято проверкой записей при лендинге:** число выводится точно, просто из ДРУГОГО замера — `platform/docs/archive/P7_ACT5_FIX_PLAN_2026-08-20.md:444-446`=`636 мс против`, «636 мс против 24 мс» на холодном корпусе акта 4, (636−24)/636 = 96.2%. То есть носители меряли разное (холодный корпус против вакуумированного) и оба честны; сводить их надо указанием УСЛОВИЙ замера, а не удалением одного как фантома — иначе следующая сессия снесёт верное число.
|
||
|
||
**3. Собственные посадки ВНЕ списка автора — 8, поймано 7.** Долг не поставлен третьей концовкой · `edit_wave` не монотонен · снят `Vary` · HEAD лишён валидатора · `reopen` снимает стоп банка кому угодно · погашение долга без сверки метки · вынос метки долга из закрывающей транзакции во второй оператор (техника `xmin` из их §36 работает — проверено исполнением, а не принято на слово). **НЕ поймано:** снятие `structure_version` И `revision` из `emitFrame` проходит ВСЮ батарею — два поля, которые канон требует на КАЖДОМ кадре `EventBase`. По норме самой зоны (PD-1) свойство без пинящего теста считается незакрытым.
|
||
|
||
**4. Что ратифицируется этой нотой.** (а) **Долг на материализацию — колонка с арендой** (`books.read_model_owed_at`), ставится в ТОЙ ЖЕ транзакции, что закрывает границу работы, гасится сверкой метки, берётся в аренду тем, кто платит; очередь в памяти процесса и второй бэкстоп удалены — один механизм вместо двух. Правило «каждая транзакция, ЗАКАНЧИВАЮЩАЯ прогон, оставляет книгу должной» (их §33) принято вместе с формой его записи одним фрагментом на все три концовки. (б) **«Есть ли у пайплайна редактор» — свойство КНИГИ, монотонное, от объявления движка** (§35): читать с последнего прогона нельзя — счётчик ходил назад в момент допуска нового прогона, что канон запрещает. Половина «форму объявляет движок» проверена чтением ЧУЖОГО кода (`beginWaves`: знаменатель ноль у волны, которой нет). (в) **Владелец у клейма идемпотентности + тождество интейка дайджестом содержимого** — закрывает класс «застрявшая попытка удаляет строку преемника / пишет квитанцию поверх чужой». (г) **Остановка АККАУНТА читается с аккаунта**, а не с потолка одного прогона; аномалия «97% остатка рядом с `credit_exhausted`» закрыта СТРУКТУРНО (единственная точка присваивания под `!Spendable`), пере-проверено денежной линзой живьём. (д) **Счётчик замечаний вернулся на главу** — по замеру п.2. (е) **Демонтаж гейта полноты банка** в платформе — исполнение D39.144; согласованность с движком проверена чтением его кода: движок уходит по авто-ветке при снятом флаге, зависания нет.
|
||
|
||
**5. Фикс-лист и долг — где живут.** Зонный фикс-лист (тринадцать пунктов плюс врезанный первым блокер свипа; ⚠ первая редакция писала «восемь», вторая «десять» — оба числа брались из отчёта ревьюера без пере-счёта носителя, испр. аудитом 21.08) — **пинг оркестратора №18 в `platform/docs/platform-PROGRESS.md`**; зона заводит из него строки СВОЕГО бэклога и регистра. ⚠ Константу версии оркестратор НЕ правил: зонное правило «код не правишь, находки в фикс-лист» держится и при закрытой сессии; практического вреда сегодня нет (фронт заморожен на 0.2.3, 0.3.0-клиент лишнее поле игнорирует), но деплой объявляет версию, которую не отдаёт. Новые строки ЕДИНОГО бэклога: **198** (апгрейд движка стирает замечания и счётчики безвозвратно — композиция зачистки при ре-кате и announce-once движка; гейт холодного прогона) · **199** (канал доставки правок банка) · **200** (сквозная полоса прогресса) · **201** («Глава N» внутри текста экспорта) · **202** (живой прогон насквозь) · **203** (хвосты контракта, релеи §7 зоны).
|
||
|
||
**6. Решения владельца 20.08, записанные этой нотой.** (а) **sqlc БЕРЁМ** («я вообще за») — отступление P7 от D39.132 п.2б закрыто решением, а не оправданием; ⚠ оркестратор добавил к заказу то, чего в предложении зоны не было: все рантайм-ошибки «нет такой колонки» случились в СКЛЕЕННОМ SQL read-модели, куда sqlc по построению не дойдёт (⚠ счёт: РЕПОЗИТОРИЙ несёт две — `platform/docs/DEFECT_REGISTER.md` PD-44 и журнал зоны, «дважды укусил этот пак»; ещё две — `column c.note_count does not exist` и `missing FROM-clause entry for table "b"` — зона назвала в ответе владельцу 20.08, пересланном оркестратору, и в доки зоны они не попали: проверяемого носителя у них нет, поэтому опираться следует на две), поэтому тем же паком — разбор каждого СОБРАННОГО запроса Postgres'ом против мигрированной схемы и ответ на вопрос «есть ли запрос, которого не касается ни один тест». (б) **Живой прогон книги насквозь — ПОСЛЕ холодного прогона движка** («гонять одну неготовую систему против другой смысла нет»), строка 202. (в) **Сквозная полоса прогресса вместо пофазной** — строка 200; заодно снята рамка вопроса о «сделано» (см. D39.152 п.4).
|
||
|
||
**7. Метод-заметки, купленные этой приёмкой.** (а) **Композиция двух известных фактов — класс, который карта отчёта не содержит по построению.** Строка 198 сложена линзой «вне карты» из двух вещей, каждая известна автору ПО ОТДЕЛЬНОСТИ (зачистка ратифицирована PD-264, «движок не переанонсирует» установлено PD-298) — никто не сложил. (б) **Ошибка оркестратора, названная вслух:** пер-термную ручку банка я подал владельцу как продуктовую дыру; гейт был снят четырьмя днями раньше D39.144 в том самом разговоре, на который владелец ссылался, а контракт с 16.08 сам называет пер-термные решения ОПЦИОНАЛЬНЫМ путём правки. Расследование (5 читающих линз + сводка + два опровергателя) установило провенанс: формула «стоп очищается, когда каждый терм промоутнут ИЛИ отклонён» родилась 19.07 В ДВИЖКЕ как лечение ливлока R1-FL-B (отклонённый терм переспрашивался каждый прогон), то есть как условие выхода из паузы ОПЕРАТОРА CLI; 04.08 контрактная линия переписала её в спеку дословно и вывела продуктовое правило, которого никто не заказывал — счётчик «решено N из M» и запрет продолжить (коммит `16e20e5`, `frontend/docs/API_CONTRACT_INPUT.md:258-264`; журнал фронта сам пишет, что этого «в Ф-14 не было»). ⚠ **Эррата к D39.144 п.2:** атрибуция «гейт был изобретением контрактной линии» верна про ГЕЙТ и неверна про ФОРМУЛУ — она старше контракта на три недели и рождена в движке, поэтому движковая половина осталась без явной отмены (строка 191б, живёт в `mining.go:80-82,243` и сегодня ОБОЙДЕНА платформой, а не устранена). (в) **Опровергатели поймали ошибку собственной сводки:** она описывала РАБОЧЕЕ ДЕРЕВО, выдавая его за заленденный код — то есть нарушила ровно то правило «объявленное ≠ построенное», на котором ловила контрактную линию. Формулировка исправлена: до этого лендинга «один ОК» владельца не «доезжал пустым», а был ОТКАЗАН на первом звене (`HEAD:reconcile.go:934-938`).
|
||
|
||
**8. ВТОРОЙ РУБЕЖ — приёмка приёмки (слово владельца 20.08: «сначала приёмка твоей же работы, потом коммит»).** Четыре линзы прочитали не пак, а РАБОТУ ОРКЕСТРАТОРА: широкий инвентарь доков (другая модель, чтение всей документации четырёх зон целиком) · claim-fidelity обеих нот и всех сегодняшних записей · поиск того, что панель пропустила · полнота выгрузки долга и зонная дисциплина. Результат оправдал остановку коммита.
|
||
|
||
**(а) Пять овер-атрибуций в первой редакции ЭТИХ нот — снято, каждая проверена автором лично.** «96% не выводится ни из чего» — неверно: число выводится точно из ДРУГОГО замера зоны (`archive/P7_ACT5_FIX_PLAN_2026-08-20.md:444-446`, 636 мс против 24 мс на холодном корпусе), и удаление его как фантома снесло бы верное измерение · расхождений с 0.3.0 не четыре, а ПЯТЬ (пятое — семантика `410 Gone`, носитель PD-253) · «четыре рантайм-ошибки» проверяемого носителя не имеют, репозиторий несёт две · клейм «оговорка расширена на всю ручку» опережал текст канона — оговорка внесена только сейчас (D39.152 п.6) · «фикс-лист из восьми пунктов» устарел на собственной правке. **Класс один и тот же — верное утверждение приписано не тому источнику**, и это ровно тот провал, против которого написана дисциплина «эрудиция ≠ улика».
|
||
|
||
**(б) Долг, живший только внутри зоны автора, вынесен наружу.** Строка в бэклог ДВИЖКА про публикацию причин флагов данными (релей §7в) жила только в регистре платформы, который движок не читает — заведена строка **204** · вопрос платформы К ВЛАДЕЛЬЦУ про норму плотности комментариев (PD-255) был объявлен несуществующим её же хендоффом («вопросов на владельце нет») — вынесен в обязательства CURRENT-STATE · норма «жалуйся владельцу, не обходи молча» для фронтового фрагмента хука жила только в моей прозе — написан пинг в зонный журнал фронта. Плюс сняты три строки бэклога (**176/181/187**), закрытые ещё D39.149: очередь всё это время звала 181 свободной работой, то есть направляла сессию чинить построенное.
|
||
|
||
**(в) Найден жёсткий блокер ВНЕ пака, которого диффовая линза увидеть не могла по построению** (проверен мной построчно): `Sweep` платформы имеет бюджет прохода 2 минуты (`cmd/tmplatformd/runner.go:189`) при бюджете одного прогона 60 с (`internal/runs/reconcile.go:70`) — **двух медленных прогонов достаточно, чтобы проход кончился до `UnsettledRuns`**, единственного ретрая отложенного расчёта, а живые прогоны ниже по списку не реконсилировались и не спавнились; `ListLiveRuns` сортирует по `started_at`, поэтому заклиненный прогон стоит в голове и голодит остальных детерминированно, а ручки нет — `runs.Config.RunBudget` объявлен и в `startRunner` не присваивается. Цена: холд не возвращается, `runs_one_live_per_book` не даёт запустить новый прогон книги. Код приехал в P6, дифф `Sweep` против HEAD идентичен ⇒ ни одна линза приёмки P7 его видеть не могла. ⚠ **`PD-169` стоит `fixed(P5)` и этим ЛЖЁТ приёмке** — его пин гоняет `Sweep` без дедлайна прохода, то есть доказывает пер-прогонный бюджет, а не выживание прохода; пере-открыть. Носитель — первый пункт фикс-листа в пинге №18. **Тот же класс, что строка 198: композиция двух известных по отдельности фактов.**
|
||
|
||
**(г) Побочно получен ответ на вопрос, который я поставил открытым в фикс-листе:** собранный SQL read-модели извлечён через `go/types` и прогнан `EXPLAIN (GENERIC_PLAN)` против мигрированной схемы — 141 запрос, все планируются чисто, тестом СВОЕГО пакета недостижимы десять. ⚠ **Число «десять» как ответ на вопрос «есть ли запрос, которого не касается ни один тест» — НЕВЕРНО, снято аудитом 21.08:** пере-мер покрытием по батарее ЦЕЛИКОМ даёт семь из десяти покрытыми на 58–87% тестами соседних пакетов (например посадка в `ReleaseUnspawned` ловится `internal/runs/sweep_test.go`), реально не покрыты ТРИ — `DeleteOldLoginEvents`, `UserByIdentity`, `Observe`, и все три лежат в осях «вход/сессии» и «метрики», которые пункт 8 фикс-листа называет не смотренными никем. Замер был верен для узкого вопроса «трогает ли запрос тест ЭТОГО пакета» и записан как ответ на широкий. Ни один из десяти не трогает схему 00016–00024. Дыры в схеме пака нет; гейт нужен как ПОСТОЯННЫЙ, потому что именно он делает этот ответ воспроизводимым.
|
||
|
||
**9. ТРЕТИЙ РУБЕЖ — аудит работы САМОГО оркестратора (слово владельца 21.08: «где ты ещё проебался»).** Пять линз + сводка + два опровергателя прошли по всему, что оркестратор сделал за лендинг. Итог: **из 55 присланных ему рекомендаций часть была закрыта в НОТЕ и не закрыта в НОСИТЕЛЕ, а девять вещей он сломал или соврал САМИМ актом исправления.** Всё названное ниже исправлено 21.08; записано, потому что класс важнее списка.
|
||
|
||
**(а) Конфабуляция в доке о провайдере — тяжелейшее.** Чиня «протухшую» строку `docs/STACK.md:11`, оркестратор СНЁС верное утверждение («ручки эффорта у pro НЕТ, `low`→`high`» — дословно квирк-канон §3а) и подставил «ручка появилась 13.08 (low/high/max — D39.137)». Тело D39.137 про эффорт молчит целиком (11 строк, ноль упоминаний — проверено `awk` по живому файлу). Механизм — конфабуляция по смежности: `V4-Pro-0813` это чекпойнт ВЕСОВ при вендорском «Model names remain unchanged», прочитан как дата появления ручки. ⚠ Уточнение, снимающее половину обвинения: носитель у клейма ВСЁ ЖЕ есть — CURRENT-STATE несёт «у pro эффорт стал настраиваемым low/high/max, квирк 3а устарел» (запись №17). То есть в репозитории ДВА носителя противоречат, замера поведением после 13.08 нет ни у одного, и правильный ход — назвать противоречие и потребовать вендор-сверку (гардрейл владельца «не гадаем»), а не выбрать сторону. Так и записано; до сверки в силе КАНОН.
|
||
|
||
**(б) Единица работы была ФРАЗА, а не её отпечаток в репозитории.** Шесть исправлений устроены одинаково: правится НОТА (повествование) и это считается починкой, а НОСИТЕЛЬ — документ, из которого действует человек, — продолжает врать. Нота пересчитала рантайм-ошибки на «две» — пинг зоны держал «ЧЕТЫРЕ», и заводить строку зона будет по пингу. Нота пере-написана на «ПЯТЬ расхождений с 0.3.0» — ратифицированный компаньон и пинг остались на «ЧЕТЫРЁХ», то есть контракт-док противоречил ратифицирующей его ноте. Число фикс-листа правилось дважды («восемь» → «десять») и оба раза бралось из отчёта ревьюера без пере-счёта носителя: машинный счёт даёт ТРИНАДЦАТЬ пунктов, причём непосчитанным оказался самый тяжёлый — латентная потеря всего текста книги на пустом манифесте.
|
||
|
||
**(в) «Проверено» писалось как перформатив, а не как отчёт о действии.** Строка 203 несла шапку «⚠ Сверено грепом при лендинге» — и её якорь указывал в ДРУГОЕ приложение компаньона (`:1391` = карта кодов ошибок вместо `:1376`), а соседний промахивался на две строки; файл при этом правился сбалансированно, нумерация не двигалась, то есть грепа просто не было. Тот же класс — «файла там нет, проверено» про существующий файл, пойманное автором через минуту.
|
||
|
||
**(г) Собственная архивация убила четыре `file:line`-якоря, и гейт этого не увидел.** Врезав пятистрочные баннеры в архивируемые доки, оркестратор пере-адресовал ПУТЬ и не пере-считал НОМЕР. Два из четырёх стоят в этой самой ноте и охраняют число «96%» от удаления как фантома — улика, защищающая число, перестала резолвиться. ⚠ **`counts.py --lint` дал зелень на все четыре**, потому что проверяет только существование файла и переполнение номера, а `platform/docs`/`frontend/docs` не сканирует вовсе — носитель находки — новая строка **205**. Инструмент не просто не поймал: он создал ложную уверенность, заменив собой ручную сверку.
|
||
|
||
**(д) Живая инструкция убита архивацией.** Баннер утверждал, что рецепт стенда «переехал в `STACK_DECISIONS`», тогда как переехали две грабли из четырёх разделов: сборка бинарей, шаблон книги, ОБА гейта батареи с предупреждением «без них `make check` МОЛЧА скипует ~200 тестов» и переменные дев-демона остались единственным экземпляром в доке под баннером «инструкции НЕ исполнять» — при том что `platform/README.md` отсылает за рецептом именно в `STACK_DECISIONS`. Перенесено по-настоящему 21.08.
|
||
|
||
**(е) Ложное число в ратифицированной ноте.** §8(г) писал «тестом недостижимы ДЕСЯТЬ запросов» с поимённым списком. Пере-мер покрытием по батарее ЦЕЛИКОМ: семь из десяти покрыты на 58–87% тестами СОСЕДНИХ пакетов, реально не покрыты ТРИ — и все три лежат в осях «вход/сессии» и «метрики», которые пункт 8 фикс-листа называет не смотренными никем. Замер был верен для узкого вопроса «трогает ли запрос тест ЭТОГО пакета» и записан как ответ на широкий.
|
||
|
||
**(ж) Две новые дыры пинов, найденные посадками аудита** (пункты 12–13 фикс-листа): снятие изоляции `RepeatableRead`+`ReadOnly` у `inReadTx` проходит ВСЮ батарею, хотя под инвариантом шесть ручек выдачи и PD-163; и оговорка `book_id <> $2` в `CreditHeldBy` не исполняется ни одним пином, потому что в фикстуре у исключаемой книги нет холда. Обе — в коде, приехавшем НОВЫМ в P7, то есть внутри диффа, который читали шесть линз приёмки.
|
||
|
||
**(з) Диагноз, который важнее списка.** Самодиагноз оркестратора («триаж глазами вместо машинной сверки») объясняет три находки из двадцати трёх и уводит от причины: остальные двадцать — это места, где рекомендация БЫЛА исполнена ровно один раз, и машинная сверка их бы не поймала. Настоящая форма: **стандарт держится в КОДЕ и обрушивается в ПРОЗЕ О ФАКТАХ** — единственной среде, где утверждение не опровергнет ни компилятор, ни тест, ни гейт. Все код-якоря оркестратора резолвятся, отказ править `ContractVersion` был верным, дыра `emitFrame` найдена им же — а рядом в прозе рождается «ручка появилась 13.08» со ссылкой на молчащую ноту. ⚠ И форма ЗАРАЗНА: линза-аудитор с чек-листом пометила два самых ложных клейма репозитория как ЗАКРЫТЫЕ, потому что проверила, что ПРАВКА СУЩЕСТВУЕТ, а не что КЛЕЙМ ИСТИНЕН. Отсюда норма, которую эта нота вносит: **«ревью исполнением» значит исполнить САМ КЛЕЙМ** — открыть цитируемую строку, пере-мерить число, дойти до первоисточника ссылки, — а не подтвердить, что редактирование приземлилось; и применять это к прозе о фактах ровно так же строго, как к коду.
|
||
|
||
**10. Что НЕ проверено (obstacle приёмки).** Живого перевода через платформу не было НИ РАЗУ — всё после «прогон стартовал и остановился» покрыто батареей против живого Postgres, но с движком-заглушкой (строка 202). Четыре оси не смотрел никто и никогда: деньги и леджер целиком · вход/сессии/CSRF · очередь и джобы · метрики — пак их не менял, а все приёмки смотрели дифф; это отдельная работа, не довесок. PD-297 зона не взяла осознанно (мерить на корпусной книге). Сессия P7 ЗАКРЫТА владельцем 20.08; промт отработан → `platform/docs/archive/` с баннером-исходом. (20.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.154 — ПРИЁМКА И ЛЕНДИНГ P8-FIX ПЛАТФОРМЫ (фикс-лист приёмки P7 + врезанный первым блокер свипа; лендинг `31f1f82`, токен якоря `ab3e22b`): **ПРИНЯТ**; блокер PD-169 закрыт четырьмя механизмами и вся его цепь пере-проверена живой пробой оркестратора; одиннадцать собственных посадок мутаций, четыре новые строки регистра; порядок паков вышел обратным очереди (22.08). ✅
|
||
|
||
**1. Что принято.** Пункты 1–7 и 9–13 фикс-листа (п. 8 — заказ читающего пака), врезанный первым блокер свипа, вторая волна ревью и спил пер-термной подписи банка. Батарея на моём стенде: 18 пакетов, exit 0, линтер «0 issues». Тестов **561** против 532 на HEAD — сверено исполнением, `git show HEAD:<файл>` по всем `_test.go` против дерева. Оба док-гейта зелёные.
|
||
|
||
**2. Блокер PD-169 закрыт, и это единственная строка регистра, которая солгала ДВУМ приёмкам.** Она стояла `fixed(P5)`, а её пин гонял `Sweep` вообще без дедлайна прохода — по построению не мог увидеть проход. Живое свойство: проход 2 минуты против прогона 60 секунд, двух зависших прогонов хватало съесть проход, после чего `UnsettledRuns` — единственный ретрай отложенного расчёта — не звался ВООБЩЕ: для всей инсталляции, каждый проход, потому что `order by started_at` ставит заклиненный прогон в голову детерминированно. Лечение — не подъём константы: (1) проход разделён на фазы, реконсиляция берёт половину; (2) прогон, ВЫБРАВШИЙ бюджет или упавший, получает отсрочку с растущим бэкоффом и перестаёт держать голову; (3) после `StalledAfter` неудач — гейдж и `tmplatformctl runs --stalled`; (4) терминальный вердикт остаётся у ОПЕРАТОРА (`run abandon`). Оба числа стали ручками, `RunBudget` присвоен впервые за свою жизнь.
|
||
|
||
**3. Цепь пере-проверена не по отчёту, а моей живой пробой.** Свой дев-демон на дереве пака, своя БД, настоящий `tmctl`. Отсрочка копит неудачи между проходами (`FAILS 6`), переходит порог → `tm_platform_runs_stalled 1` на проводе → `--stalled` называет прогон, счёт, что держит и НАСТОЯЩУЮ ошибку движка. **Деньги — двумя путями из сырого леджера:** до `run abandon --release-hold` кэш `account_balances` = 24910000 и `sum(credit_ledger)` = 24910000 при одном открытом холде 90000; после — 25000000 и 25000000, холдов 0, строки `grant · hold · hold_release`. Книга разморозилась: следующий прогон принят 202. Обе новые ручки печатаются на буте с источником — норма PD-114 держится.
|
||
|
||
**4. Одиннадцать собственных посадок вне списка автора; выжили три, и различать их пришлось руками.** Убиты восемь: разделение фазы · «бюджет выбран = отказ» · очистка счёта тишиной · бэкофф · пропуск фазы расчёта · версия контракта · пол идентичностей манифеста · «стоп перевешивает отсрочку». **`StalledAfter` выжила ЗАКОННО** — носитель один, пин ездит на константе, второй экземпляр числа был бы лишним местом забыть. **`maxAttempts` выжила и это находка (`PD-373`)** — у неё есть второй носитель прозой в рантбуке («После пяти неудач»), и подъём константы делает рантбук лгущим молча. **`truncateReason` в `DeferRun` выжила и это находка (`PD-372`)** — пин ездит на самой функции, ни один из четырёх вызовов не проверен, а комментарий этой же функции называет цену: невалидный UTF-8 из stderr движка Postgres отвергает, отказ не считается, попытка держит голову вечно — то есть механизм отключается тем самым текстом, ради которого заведён.
|
||
|
||
**5. Находка вне карты пака — `PD-371`.** Исключение «стоп перевешивает отсрочку» не имеет границы: прогон с запрошенным стопом выбирается КАЖДЫМ проходом независимо от `reconcile_after`. Видно живьём: `NEXT TRY` стоял на ~30 минут вперёд, а счётчик рос каждые 15 секунд — отсрочка не действовала ни разу. На дешёвой ошибке безвредно, на дорогой класс PD-169 внутри фазы возвращается, и запускает его ЛЮБОЙ пользователь кнопкой «остановить». Комментарий у `RunsToReconcile` называет цену НЕ-исключения и молчит о цене исключения. Не блокер: расчёт денег живёт во второй фазе, счётчик растёт, гейдж и `run abandon` работают.
|
||
|
||
**6. Ошибка МОЕГО харнесса приёмки, объявленная вслух.** Две посадки дали ложное «выжила»: я гонял не тот пакет — мутация лежала в `internal/pgstore`, а пин в `internal/runs`. Пере-прогнано, обе убиты. Норма отсюда: **посадка мутации обязана называть пакет, где ищется пин, а не пакет, где лежит правка**; необъявленная ошибка харнесса приёмки — это находка, которой нет, и она опаснее пропущенной, потому что выглядит как результат.
|
||
|
||
**7. «Скипов 0» не воспроизведён, и виноват не пак.** У меня три скипа: `systemdOrSkip` гейтит три теста `internal/runner` достижимостью пользовательского менеджера systemd, а на этом хосте `/run/user/1000` не существует. Отчёт зоны мерил на хосте с живым менеджером и честен. Незакрытым остаётся `PD-374`: рецепт объявляет у батареи ДВА гейта, а их три, и сама цель `check` над списком скипов печатает «set TM_PLATFORM_TEST_DSN» — отправляя читателя к ручке, которая тут ни при чём.
|
||
|
||
**8. Спил пер-термной подписи банка принят, контрактная половина открыта.** D39.144 отменил модель 16.08, зона сняла write-путь 22.08 по слову владельца: маршрут, хендлер, wire-типы, метод интерфейса, `BankDecision`/`BankReceipt`, `UnknownTermError` и их пины. Пол размера поверхности 15 → 14 сдвинут ЯВНО и с причиной в комментарии — гейт СРАБОТАЛ и поймал спил, а не был подогнан; проверено, что 14 равно реальной длине таблицы, то есть запаса не оставлено. Три исчезнувших имени теста — тесты снятого кода, одно переписано на сохранившееся свойство. Пометка на месте write-пути честна: её клейм про `action NOT NULL` с чек-констрейнтом на отменённый глагол сверен по миграциям 00002 и 00016. **`PD-370` уезжает открытым мажором и это правильно:** канон 0.4.0 несёт путь, три схемы и глагол — правка канона это ломающий минор 0.4.0 → 0.5.0, работа контрактной сессии, и закрывать её в зоне было бы подгонкой под критерий приёмки. До неё деплой обслуживает на одну ручку меньше, чем объявляет — цена, названная заранее.
|
||
|
||
**9. Порядок паков вышел ОБРАТНЫМ моей очереди, и последствия несимметричны.** Промт P8-FIX строкой 3 требует запуска «ПОСЛЕ пака P8-REVIEW»; запущен он был раньше. **В плюс:** цена, названная мной вслух при перестановке 21.08 — «блокер свипа живёт всё время читающего пака» — НЕ заплачена, блокер закрыт первым, и это лучший исход, чем планировала очередь. **В минус:** §4.7 (аддендум релеем) пуст и честно назван таковым в отчёте, а читающий пак пойдёт теперь по коду, который этот пак только что переписал. Ось 3 его промта зона пере-нацелила сама (константы переехали, якоря починены, правка ЧУЖОГО документа раскрыта прямо) — правку утверждаю: якоря умерли по вине пака, пак их починил и сказал об этом, вместо того чтобы обойти красный гейт. Остальные три оси не затронуты.
|
||
|
||
**10. Что зона сдала вопросами, а не решениями, и это засчитано.** Строка 199(а): развилка владения `book.yaml` не решалась, сдана четырьмя вариантами с ценой — ждёт ратификации. `PD-367` (пол интейка односторонний: манифест с пустым списком глав материализатор отвергает, а интейк заводит книгу, по которой можно СТАРТОВАТЬ и ОПЛАТИТЬ прогон) — лекарство ломает запиненный контракт интейка, нужно решение. `PD-368` (когерентность пары бюджетов) · `PD-369` (`ClaimIdempotency` отдаёт 500 под конкуренцией, файл вне диффа пака). П-19 (sqlc) — отдельной сессией по слову владельца 22.08; вместо него построен гейт, который планирует КАЖДЫЙ собранный запрос против мигрированной схемы, и это лучше sqlc ровно там, где зону дважды укусило: sqlc видит только целиком-литеральный SQL, а оба рантайм-падения были в запросах, собранных из фрагментов.
|
||
|
||
**11. Что НЕ проверено (obstacle приёмки).** Сквозного живого перевода по-прежнему не было — строка 202 гейчена холодным прогоном движка. `PD-297` зона не мерила осознанно (нужен корпусный текст). Четыре оси читающего пака по-прежнему не смотрел никто. Мою живую пробу я вёл на хосте без systemd-шины, поэтому путь «юнит поднялся и живёт» в ней не участвовал — он покрыт батареей там, где менеджер есть. (22.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.155 — СКВОЗНАЯ АКТУАЛИЗАЦИЯ ДОКУМЕНТАЦИИ ПО МНОГОАГЕНТНОМУ АУДИТУ + ПЕРЕДАЧА РОЛИ №18 → №19 (заказ владельца 22.08: «актуализировать, лишнее в архив, дампнуть нюансы без воды, подрезать логи, доактуализировать бэклог»): 14 линз × опровергатель на находку, 132 находки, 30 опровергнуто; журналы срезаны 471→291 и 897→239; заведены строки 206–210; СНЯТА ратификация, которой не требовалось. ✅
|
||
|
||
**1. Метод и его цена.** Аудит доков — воркфлоу 180 агентов (14 линз по областям + опровергатель на КАЖДУЮ находку + синтез), 12.7M токенов, 56 минут. Трассировка цепи банка — второй воркфлоу, 6 линз, остановлен владельцем на опровергателях по токенам (успело 38 вердиктов из ~72, все шесть линз вернулись). **Опровергатели окупились: 30 находок из 132 убиты**, в том числе три, где линза читала заголовок вместо тела, и одна, где «протухшая цифра» стояла с верной оговоркой. Норма, которую это подтверждает: панель без опровергателя даёт список правок, а не список ИСТИН.
|
||
|
||
**2. Что срезано и куда.** `docs/PROGRESS.md` 471 → 291 строк: закрытая бэкенд-хроника пака честности → `archive/PROGRESS-2026-08-17.md`; две хроники полигона (10.08 и 15.08) → `archive/PROGRESS-2026-08-10-15.md` с тремя поправками в шапке (потолок фазы — снимок, а не цепь; два пункта листа владельца закрыты; «долги» протухли). Зонный журнал платформы 897 → 239: эра P8-FIX → `archive/platform-PROGRESS-P8.md`, остаток актов P7 дослан в свой слайс — заголовок «эра P7 в архиве» стоял, а ~185 строк лежали в живом файле.
|
||
|
||
**3. Что вынесено ПЕРЕД архивацией (норма «сперва носитель, потом срез»).** Инвентарь каналов шва с движком → `platform/docs/STACK_DECISIONS.md`, и там он ПОЛНЕЕ оригинала: аудит нашёл, что в исходной таблице пропущен `tmctl export --json --pairs` — единственный канал, несущий ТЕКСТ пары. Развилка владения `book.yaml` → строка 199(а) · разбор канона → 206 · граница sqlc → П-19 · ловушка `.check.log` и третий гейт батареи → PD-374.
|
||
|
||
**4. Ложь, которую читала КАЖДАЯ сессия.** `12-go-style-notes` §0 п.4 предписывал привязку промптов ключом `prompts: {<пара>: файл}` — такого ключа нет, форма снята паком-15, а конфиг с ним ОТВЕРГАЕТСЯ загрузкой (`config.TestRetiredPromptKeysAreRejected`). То есть норматив, обязательный к чтению бэкенд-сессией, предписывал форму, на которой движок не поднимется. Рядом: `docs/README.md` звал у платформы «активного промта НЕТ», когда промт был; таблица §3 компаньона контракта — единственный носитель статуса построенного — объявляла НЕ ПОСТРОЕННЫМИ шесть поверхностей, работающих в деплое (носитель «вход P7» никто не гасил при лендинге, правило нарушено пятый раз подряд).
|
||
|
||
**5. Найдено вне заказа и записано строками.** **210** — род НЕ ПРОИЗВОДИТСЯ авто-путём вовсе: доставка построена (`genderConstraintNote`, confirmed-only, директива D39.21 «род должен доезжать»), а данных ей никто не даёт — промпт терминолога возвращает ровно три поля без рода, майнер берёт `gender` только из сида ⇒ на книге без ручного сида ось рода мертва по построению; реестр памяти зовёт это «жалобой №1 читателей MTL». Тем же касанием: `gates.voice` не встречается НИ В ОДНОМ шиппинг-конфиге — прогон с редактурой осей голоса не посчитает, пока гейт не включён. **208** — эскалация на Gemini молча теряет инъекцию банка (пинг полигона, пере-проверен кодом). **209** — риг живых проб не может залогировать тела ни при каких env.
|
||
|
||
**6. СНЯТА ратификация, которой не требовалось (и это исправление МОЕЙ ошибки причинности).** Строки 203(з)/191(б) я нёс как «D39.144 говорит один ОК, движок держит пер-термный гейт, одно из двух должно уступить — ратификация владельца». Опровергнуто кодом: гейт проверяет полноту не ПОДПИСЕЙ, а ФАЙЛА решений, и ОДИН файл его снимает — `loadMinedDelta` штампует только `Source`, опущенный статус дефолтится в `approved` (`membank/memseed.go:71-74`), `unsignedEngineSurfaces` выбрасывает лишь `Source=="mined" && Status!="approved"` ⇒ промоутнутые строки остаются сид-поверхностями, дельта пустеет. Обход в платформе — костыль под ОТСУТСТВУЮЩУЮ ДОСТАВКУ, а не под конфликт моделей. Единственный живой блокер темы — владение `book.yaml` (199а). **Урок метода: «два дока противоречат» ≠ «нужна ратификация»; сперва трассируй МЕХАНИЗМ, потом объявляй развилку.**
|
||
|
||
**7. Три мины формата `mined_delta`, которые обязана знать сессия трубы** (сверено кодом, ни одной не было в докax): копи-паст карты подписи НЕ работает — карта пишется вся со `Status:"auto"`, и это запинено, а `auto` фильтруется как неподписанный ⇒ бесконечная петля; терм БЕЗ `dst` промотить нельзя вовсе — approved с пустым `dst` роняет загрузку сида и срывает прогон, для WHICH-only термов единственный очищающий глагол это ОТКАЗ; хвост реверс-секции ломает «один ОК» на больших книгах — кап 200 режет ПОСЛЕ фильтров, при >200 banknote-поверхностей нужно ceil(N/200) актов.
|
||
|
||
**8. Контрактный батч РАЗДЕЛЁН, и довод, которым я его склеивал, снят.** Я вёз 206+200+203 одним минором «ради одной перегенерации фронта вместо трёх». Довод почти ничего не весит: зеркало фронта ратифицированно стоит на 0.2.3 и при разморозке платит переход одним куском в любом случае. А блокеры разные, и склейка подчиняла незаблокированное заблокированному: гигиена 206 не заблокирована ничем, ручка правки термина ждёт ратификации 199(а), строка 200 ждёт ответа ДВИЖКА про знаменатель майнинга. **0.5.0 — только гигиена, сейчас; 0.6.0 — ручка, прогресс и хвосты, после ратификаций.**
|
||
|
||
**9. Ответ по sqlc (вопрос владельца).** Граница П-19 сходится точно (41 запрос, пере-считано), но описана оптимистичнее: набор НЕ замкнут по транзакции (8 из 41 идут из транзакций неконвертируемого кода), а «11 денежных запросов в чужой транзакции» занижено вдвое — их 20. Главное: **гейт `TestEverySQLStatementParsesAgainstTheMigratedSchema` съел бо́льшую часть ценности** — он закрывает класс «нет такой колонки» для всех 162 операторов, включая 121, куда sqlc не дойдёт никогда и где случились оба реальных падения зоны. Остаётся арность `$n` и целей `Scan`: два запроса из 41 не исполняются ничем, закрывается поведенческим тестом. Рекомендация №18: брать, когда что-то другое заставит тронуть эти пять файлов; решение за владельцем, он сказал «БЕРЁМ».
|
||
|
||
**10. Мои ошибки этой смены, названные полностью.** (а) Число отпечатков миграций «41» написано из головы — их 25, поймал аудит. (б) Баннер в промте читающего пака утверждал «оси 1, 2 и 4 не тронуты» — тронуты 1 и 4, поймал аудит через час после моей записи. (в) «Добавить новый термин работает» — верно лишь в неважной половине: движок файл примет, но mined-строки исключены из БАЗОВОГО банка, значит термин доедет до редактора и НИКОГДА до черновика. (г) Причинность 203(з), п. 6 выше. (д) Довод склейки контрактного батча, п. 8. **Общее у всех пяти: ни одна не в коде, все в ПРОЗЕ О ФАКТАХ — той единственной среде, где утверждение не опровергнет ни компилятор, ни тест, ни гейт (диагноз D39.153 §9(з) подтверждён на мне ещё раз).**
|
||
|
||
**11. Что ловило меня лучше, чем я сам** — новому №19 стоит на это опереться: гейт токенов якорей поймал четыре мёртвых ссылки, три из них сломала МОЯ ЖЕ архивация · `counts.py --check` держал числа очереди при каждом касании · опровергатель-субагент убил 30 находок из 132 и две мои собственные формулировки. Норма отсюда: **посадка мутации обязана называть пакет, где ищется ПИН, а не где лежит правка** — две мои посадки дали ложное «выжила» из-за этого, и необъявленная ошибка харнесса приёмки опаснее пропущенной, потому что выглядит как результат.
|
||
|
||
**12. Передача.** Счётчик роли бампнут **№18 → №19** (D39.112 п.6). Очередь, порядок работ по платформе и все блокеры — CURRENT-STATE. На владельце к моменту передачи: развилка владения `book.yaml` (199а) · веса `pro` (172-г, дешёвый вход — вендор-сверка, полигон только что делал такую по Gemini) · санкция на первый прогон с редакторской волной. (22.08.2026, оркестратор №18) ✅
|
||
|
||
## D39.156 — РАТИФИКАЦИЯ ЗАКОНА ВХОДНОЙ ДВЕРИ ШВА ДВИЖОК↔ПЛАТФОРМА (слово владельца 23.08: «Я согласен касательно нормы шва»). ✅
|
||
|
||
**1. Что ратифицировано.** Не каталог команд, а ДИСЦИПЛИНА входного направления — семь пунктов, тело и прецеденты каждого: [`17-seam-inbound-law.md`](17-seam-inbound-law.md). Прежний статус «ПРЕДЛОЖЕНО» снят этой нотой. Следствие, ради которого норма и заводилась: **двери встают паками без нового решения владельца** — как код выхода 13 встал в ратифицированную полосу через ратификации оркестратора.
|
||
|
||
**2. Почему понадобилось.** Контракт фронт↔платформа ратифицирован, контракт платформа↔движок — нет: исследование шва дошло до `events.jsonl` и дальше отвечало на «как запускать движок». Наружу поток богатый, внутрь — ничего, кроме запуска с флагами, поэтому данные пользователя движок принимать не умеет и каждый внешний участник имперсонирует человека-оператора с текстовым редактором. Метод: консилиум оркестратора со сторонним архитектором (Fable-5), два раунда нажима author≠reviewer; свип ВСЕЙ границы дал ровно ОДНО гнилое место (строка 213) при шести ратифицированных каналах — «широкого рефакторинга не надо» подтверждено перечислением, а не впечатлением.
|
||
|
||
**3. Развилка 199(а) закрывается РАСТВОРЕНИЕМ, а не выбором.** Ни один из четырёх вариантов зоны: движок дефолтит `mined_delta`/`mined_rejects` по конвенции каталога (как уже делает с `project_db` и как уже читает `.auto-bank.yaml`), писателем становится движковый $0-глагол ⇒ ключей никто не объявляет, файлов заранее никто не создаёт, формат знает ОДНА сторона. Единственный вариант, где число мест, знающих формат, уменьшается.
|
||
|
||
**4. Три выноса, внесённые ПО ТРЕБОВАНИЮ ревьюера — без них буква закона запрещала действующее.** (а) Форма Б (одноразовый рендер `book.yaml`, D39.130 п.2б) вынесена явно: «единственный писатель файлов своей схемы» иначе объявляло её вне закона. (б) «Пути, СООБЩЁННЫЕ платформе» дополнено «ИЛИ ратифицированные контрактом шва»: имя `events.jsonl` — константа, никто его не сообщает, и буква ломала главный канал шва. (в) Отказ занятого flock — РОВНО класс 12, не «конфиг/лок» через слэш: 10 значит «деплой сломан, чинит человек», 12 значит «подожди и повтори», и слэш позволил бы исполнителю выбрать 10.
|
||
|
||
**5. Эррата к `research/25` (обязательна, ставится этой нотой).** Там «поднятие потолка файлом через atomic rename» отнесено к носителям D39.106 — в теле D39.106 механизма НЕТ вовсе. Строка была кандидатом и не ратифицировалась никогда; живой канон решил ось иначе (потолок едет со стартом прогона и после не меняется). Без эрраты дверь выведут заново из «обязательных механизмов».
|
||
|
||
**6. Порядок работ, вытекающий из нормы.** Движковый пак (конвенционные дефолты двух путей · глагол приёма правок банка · путь к файлу ключей аргументом · строгость сид-загрузчика) → контрактный минор ОДНИМ куском (снос отменённой пер-термной модели + новая дверь, тело которой выводится из словаря глагола, а не сочиняется до него) → платформенный пак (воркер решений · путь ключей из конфига · снятие дубля вывода пути · дев-супервизор на тот же механизм ключей). Гигиена контракта держится до этого сознательно: снести дверь сейчас и завести в следующем миноре — две перегенерации фронта вместо одной.
|
||
|
||
**7. Заведено тем же заходом:** строки **211** (движок на SaaS не получает провайдерских ключей — блокер живого прогона 202; дев-путь наследует окружение платформы, прод-путь нет, поэтому стенд зелёный, а прод голодает), **212** (нестрогий загрузчик сида), **213** (платформа дублирует движковую конвенцию пути). Оба пинга доставлены зонам. **Гейт якорей: закрыта его собственная слепота** — множество зонных префиксов было побайтно равно корневому, из-за чего сломанный зонно-относительный якорь тихо числился «внешней ссылкой»; починено и доказано мутацией. (23.08.2026, оркестратор №19) ✅
|
||
|
||
## D39.157 — ПЕРЕЕЗД НА НОВУЮ МАШИНУ: СТЕНД ПЕРЕСОБРАН, КОРЕНЬ КНИГ ПЕРЕОПРЕДЕЛЁН, МАРШРУТ ХОЛОДНОГО ВХОДА ПОЧИНЕН ПО СЛЕПОМУ ЗАМЕРУ (24.08, оркестратор №19). ✅
|
||
|
||
**1. Стенд.** Тулчейн на машине был нулевой. Носитель подъёма — строка «Тулчейн на чистой машине» в карте [`../README.md`](../README.md). ⚠ Отдельный док `dev-stand.md` я завёл и в тот же день СНЁС по возражению владельца («зачем он нужен, всё и так выводится»): аудит по правилу одного носителя подтвердил его правоту — из шести разделов четыре были дублями или снимком машины, то есть ровно тем классом, который свип D39.155 выносил. Пережили три факта, и они разложены по существующим носителям. Root потребовали ровно два пакета (`build-essential` — `-race` требует cgo, снять его значило бы выдать отсутствие тулчейна за зелёный прогон; `python3-venv` — в системном питоне нет `ensurepip`), поставил владелец. Обе батареи прогнаны ЦЕЛИКОМ под `-race`: бэкенд `make battery` EXIT=0, платформа `make check` EXIT=0 при 18 пакетах и скипах 0. Сквозняк проверен живьём: демон → сид через настоящий интейк → движок распарсил книгу. Чего стенд НЕ проверяет, названо в CURRENT-STATE врезкой (ж): ни одного платного вызова · Playwright · GPU · OIDC.
|
||
|
||
**2. Корень книг — `<репозиторий>/books`, отдельный git.** Каталог перенесён владельцем внутрь дерева и версионируется своим репозиторием со своим origin; внешний держит `/books/` в `.gitignore`. Инвариант «книга и производные вне git» в силе — вне ЭТОГО git. Два следствия внесены в `CLAUDE.md`: `git status` внешнего репо правок книг не показывает, а `clean -xdf` снёс бы каталог с историей. ⚠ Правило игнора без якоря (`books/`) ловило ЛЮБОЙ каталог с этим именем, включая живой `platform/internal/books/`, — новый файл там уходил в игнор молча; заякорено в `/books/`, доказано пробой в обе стороны.
|
||
|
||
**3. Цена переезда измерена, не оценена.** Движок задет ТРЕМЯ тест-хелперами (дефолт `$HOME/books`), и переопределения в коде уже есть: с ними корпус-батарея зелена, красен только `TestMinerFullBookParity` из-за отсутствующего jieba (строка 123, к переезду отношения не имеет) — строка **218**. У полигона ДВА РАЗНЫХ слома, и их нельзя валить в один (⚠ **ИСПРАВЛЕНО 24.08 тем же днём:** первая редакция писала «полигон ломает не переезд книг, а переезд МАШИНЫ» — для корня книг это НЕВЕРНО, поймано пере-счётом после уточнения владельца). **Корень репозитория** ломает смена пользователя: литерал `/home/ubuntu/projects/textmachine` в 121 файле, из них 104 — дословно одной строкой `REPO = Path(...)`; портабельная форма есть лишь у 5. **Корень книг** ломают ОБА события порознь: литерал `/home/ubuntu/books` — 86 файлов (смена пользователя), портабельный `Path.home()/"books"` — 89 файлов (135 вхождений; их сломал ПЕРЕЕЗД каталога, на прежних машинах они работали). Объединение — 173 файла, живых носителей 26, и среди ЖИВЫХ портабельная форма преобладает 20:6. Следствие для формы правки: подстановка нового абсолютного префикса чинила бы эту машину и ломала прежние — годится только резолв от МАРКЕРА вверх по дереву — строка **217**. Все 20 `book.yaml` репозитория книг несут мёртвые пути по девяти ключам.
|
||
|
||
**4. Решения владельца 24.08.** (а) **Чинить всё; что легаси — выкидывать, а не поддерживать** («незачем копить техдолг») — это САНКЦИЯ полигонному паку на УДАЛЕНИЕ скриптов закрытых эксп-12–16 вместо их починки; довод, снимающий возражение о потере воспроизводимости: те прогоны шли на Ubuntu 24 / CPython ~3.12 с НЕИЗВЕСТНЫМИ версиями, и `eval/requirements.txt` сам объявляет их перепрогон НОВЫМ замером, а не репродукцией. (б) **GPU на машине нет**, локальную модель мерить нечем; ветка не закрыта — «в будущем может понадобиться».
|
||
|
||
**5. Онбординг замерен СЛЕПЫМ входом, а не мнением.** Три сессии без истории проекта прошли маршрут `CLAUDE.md` в ролях бэкенда, платформы и полигона. Сошлись на трёх дефектах, все починены: (а) холодная развилка не вела к таблице активных промтов — послушная сессия читала ~300 тыс. знаков и лишь потом узнавала, что её работа уже заказана; (б) шаг 2 требовал «живую голову» D-лога (33 ноты) вопреки правилу «целиком НЕ читать» в этом же файле — заменён на шапку + реестр + 2–3 последние; (в) пути шага 3 были написаны от `docs/` и от корня не резолвились — даны от корня, все 14 проверены. Структура маршрута здорова; ломался вход.
|
||
|
||
**6. Класс «line-якорь в D-лог» закрыт, гейт вооружён (строка 219 ЗАКРЫТА).** Замер по git-blame (для каждого якоря — версия лога на коммит, которым он написан): из 55 якорей живого корпуса съехал **51** — подрезки D39.125/D39.139 сдвинули нумерацию. Починены поштучно 24 якоря двух живых нормативных доков (`16-events-emitter` — обязательное пре-чтение перед кодом эмиттера — и `13-tech-debt-anchors`); тела `research/17` и `research/20` НЕ правились (D23.3, внешняя улика) — они получили пометку в шапке. Реестр нот врал про место тела у 17 нот подряд (D39.107–123 — «жив» при теле в слайсе); исправлено, пере-проверено скриптом: лжи 0. **Гейт `counts.py --lint` научен структурной сверке без токена** — владелец целевой строки обязан совпасть с номером, названным рядом. ⚠ **Первая редакция правила была молчащим no-op** (голые имена без `/` отсеивались до неё) и это поймала ПОСАДКА МУТАЦИИ, а не перечтение: урок ровно тот же, что D39.155 п.11.
|
||
|
||
**7. Транспортный коммит снят.** `temp` (`2f17752`), которым владелец перевозил дерево, снят по его слову `reset --mixed`: он уносил `START_PROMT.MD`, который канон коммитить запрещает. Дерево не тронуто — сверено побайтно по каждому из 20 файлов; страховка — бандл вне репо и reflog. Работа полигона снова НЕЗАКОММИЧЕНА, приёмка фазы за параллельным оркестратором. (24.08.2026, оркестратор №19) ✅
|
||
|
||
## D39.158 — ВХОДНАЯ ДВЕРЬ ШВА ЗАКОНЧЕНА: стоп банка — ФЛАЖОК в самом движке; полоса отказов получает два яруса и класс 15; отчёт двери v2; пути решений — только конвенцией (27.08, оркестратор №19). ✅
|
||
|
||
Четыре пака зоны бэкенда приняты и заленджены одним деревом. Механика и доказательная база — `backend/docs/SEAM_PACK_FINDINGS.md` (вход §26 и §43), решения зоны с доводами — там же §37; здесь только ратифицированное.
|
||
|
||
**1. Стоп банка — флажок, и его исполняет ДВИЖОК.** Флаг опущен — прогон не останавливается, неподписанные строки едут редактору с пометкой. Поднят — полный останов на кластере, которого ни один прежний стоп не предъявлял. «ОК» — возобновление БЕЗ решений, прогон идёт дальше. Носитель — персистентная память «предъявленного стопом» (схема хранилища v16), предикат новизны по пересечению кластеров на итоговой карте ПОСЛЕ потолков. ⚠ Это исполнение отложенной половины строки бэклога **191(б)** — её пункт заказывал «проверить/ослабить границу самой паузы», исполнено было только «проверить», а верифицировалось СОСТАВНОЕ поведение с обходом. Обход платформы (снятие флага на возобновлении) теперь лишний и умирает её паком, но ТОЛЬКО после этого лендинга.
|
||
|
||
**2. Полоса отказов — два яруса.** Пол полосы (минимум для читателя, не знающего номера) — «нет работы, которую надо откатывать; повтор безопасен»; «безопасен» значит «не навредит», не «поможет». Каждый класс поверх пола объявляет свой, более сильный инвариант: конфиг, источник, лок и отвергнутые решения сохраняют «ничего не произошло» как клаузу КЛАССА. **Гардрейл:** разрушительное действие ключуется только на КЛАССЕ, никогда на принадлежности полосе — истинно де-факто в обеих зонах, становится буквой без миграции.
|
||
|
||
**3. Класс `write_incomplete` = exit 15** — и для «не легло ничего», и для «легла половина»: потребитель ветвится одинаково (условие хоста, не книги; повтор безопасен), различие несёт пофайловая правда отчёта. Второй номер не заводится. Это единственный класс, который не может обещать «ничего не произошло», — и ради него пол полосы и переформулирован.
|
||
|
||
**4. Отчёт двери — `tm-bank-decisions-report-v2`**: шесть явных исходов, единый конструктор, исходные поля выводятся из ПЕРЕЧИТАННОГО состояния после записи, вердиктные — из решений против состояния ДО.
|
||
|
||
**5. Ключи `mined_delta`/`mined_rejects` сняты**: пути решений — только конвенцией каталога книги, объявляемый ключ отвечает retired-отказом. Это исполнение D39.156 п.3 до конца: объявляемый путь и делал межкнижную гонку записи достижимой.
|
||
|
||
**6. Порядок деплоя, обязательный:** движок первым → `tmctl migrate` по каждой книге до прогонов → и только потом платформа снимает свой обход. Миграционная нота: пустая память даёт один доброкачественный стоп на книгу.
|
||
|
||
**7. Эрраты, ставятся этой нотой.** Диспозиция D39.153 п.7б «остатка-ратификации нет, конфликта с моделью владельца нет» отвечала на ДРУГОЙ вопрос — «снимает ли гейт один файл со всем банком» (снимает) — и верифицировала составное поведение с обходом; вопрос «работает ли флажок без обхода» ею не закрывался. Строки бэклога **191(б)** и **203(з)** пере-диспозиционированы: движковая половина УСТРАНЕНА, не обойдена.
|
||
|
||
**8. Онтология банка записана** — `docs/architecture/18-bank-ontology.md`. Форма была строгой и до этого пака (источники → вид → проекции, у каждого источника единственный писатель, вид пересобирается полностью на каждой границе), но не записана нигде, из-за чего девять носителей читались как девять заплаток. Проекция без названного читателя и без якоря свежести — класс дефекта, а не стиль: по нему снесена мёртвая машинная таблица стопа и заведён конверт свежести банк-экспорта.
|
||
|
||
**9. Заведено строками бэклога:** **221** джойн «предложено × решено × нерешено» живёт только в движке и при разморозке фронта заставит платформу пере-реализовать закон · **222** межкнижный остаток оси арбитра (второй конфиг ТОЙ ЖЕ книги с другим `project_db`) · **223** майнерский хвост за потолком структурно недостижим · **224** банк-экспорт на стопе пуст. (27.08.2026, оркестратор №19) ✅
|
||
|
||
## D39.159 — ПАК P8-REVIEW ПРИНЯТ: четыре оси прочитаны исполнением, 24 строки заведены; токен `ОСПОРЕНО` и рецепт копии-с-каноном ратифицированы; предложенная правка гейта формы ОТКЛОНЕНА замером (27.08, оркестратор №19). ✅
|
||
|
||
Читающий пак зоны платформы принят и залендён одним деревом. Механика — отчёт «ПАК P8-REVIEW
|
||
ОТРАБОТАН» в `platform/docs/platform-PROGRESS.md` и артефакты `platform/docs/p8-review/`; здесь
|
||
только то, что решено, и то, что приёмка добавила своим исполнением.
|
||
|
||
1. **Числа сдачи воспроизведены приёмкой на БОЛЕЕ НОВОМ дереве.** `make check` с тремя гейтами —
|
||
18 пакетов, EXIT=0, линтер 0 issues, скипов 0 (счёт снят отдельным `-v`, как требует `PD-374`);
|
||
регистр 398 строк, открытых 96 (3 major). Движок для гейта живого рендера собран из HEAD, то есть
|
||
**уже включая лендинг бэкенда `d1eb8a9`** — шов движок↔платформа его пережил.
|
||
2. **Правка НОРМЫ `ENGINEERING_STANDARDS` §3 п.3 — РАТИФИЦИРОВАНА.** Мутации сажаются в копию,
|
||
копия снимается ВМЕСТЕ с каноном (`cp -a --parents platform docs/architecture/14-api-contract`),
|
||
вердикт судится по ДЕЛЬТЕ против чистой базовой линии той же копии и по ТОПИЧНОСТИ упавшего
|
||
теста. Ратифицируется в том числе ПЕРЕЕЗД рецепта: он жил только в промте ревью-пака, а промты
|
||
после лендинга уезжают в `archive/` — ловушка взводилась заново каждой следующей сессии. Это тот
|
||
же класс, что назван в `18-bank-ontology.md`: живая инструкция на эфемерном носителе.
|
||
3. **Эррата к `STACK_DECISIONS` §13 — РАТИФИЦИРОВАНА**, включая её дисциплину: абзацы политики
|
||
оставлены как есть до закрытия `PD-379`. Переписывать обоснование раньше, чем закрыт дефект,
|
||
значило бы задним числом объявить нормой то, что дефектом и признано.
|
||
4. **`PD-379` (единственный vuln пака, major) подтверждён приёмкой чтением:** `pump` получает уже
|
||
разрешённого пользователя и до конца соединения не смотрит строку сессии ни разу
|
||
(`internal/httpapi/stream.go`), маршрут смонтирован в `v0.go:84`. Отзыв мгновенен для НОВЫХ
|
||
запросов и не действует на открытый поток.
|
||
5. **Статусы `PD-159`, `PD-293`, `PD-361` НЕ пере-открываются, токен `ОСПОРЕНО(PD-N)` ратифицирован
|
||
как стоячий инструмент.** Основание: описанный строкой дефект из кода УШЁЛ — недостаёт не
|
||
лекарства, а ПИНА, и пробел уже несёт своя открытая строка. Пере-открытие сказало бы «денежный баг
|
||
вернулся», что ложно, и посчитало бы один пробел дважды. Условие ратификации — двусторонняя
|
||
ссылка: закрытая строка называет открытую, открытая называет закрытую (проверено, все три пары на
|
||
месте). Приёмка подтвердила спор СВОЕЙ посадкой: `min` → `max` в `internal/pgstore/runs.go:588`
|
||
на чистой базовой линии оставляет батарею зелёной, названный пин не падает — `PD-376` настоящая.
|
||
6. **Галочка `ASVS 5.0 7.4.1` в `platform/docs/archive/platform-PROGRESS-P0-P3.md:572` помечена
|
||
эрратой в БАННЕРЕ файла, а не правкой строки** («баннер прежде содержимого»). Снимется закрытием
|
||
`PD-379`, а не правкой архива. Зона считала файл чужим — он в её зоне, но при архиве правку
|
||
делает лендер, и это сделал я.
|
||
7. **Вопрос 4 («open, а лекарство построено») — норма принята, гейт заведён строкой.** Норма НЕ
|
||
уезжает в промты паков (они архивируются — см. п. 2), а живёт в стоячей норме зоны. Гейт замерен
|
||
прежде решения: по ИМЕНАМ файлов даёт 22 совпадения, почти все ложные (`main.go`, `runner.go`
|
||
есть в обеих зонах); по ПОЛНЫМ путям — 2, и оба настоящие. Строится по полным путям.
|
||
8. **Вопрос 5 (`PD-398`, правка `malformed()` в `counts.py`) — ОТКЛОНЁН замером.** Предложенное
|
||
`n != shape` краснит СЕМЬ законных строк, потому что колонки читаются С КОНЦА намеренно
|
||
(`docs/scripts/counts.py:132`): `|` внутри первой содержательной ячейки легален и назван в самом
|
||
комментарии. Числа регистра из-за избытка НЕ врут — проверено, статус и вес читаются из хвоста.
|
||
Остаточный настоящий риск иной: избыток в ХВОСТОВОЙ ячейке. Строка пере-формулирована под него.
|
||
9. **Якорь `PD-157` пере-нацелен мной при лендинге** (`backend/internal/config/book.go` `:250` →
|
||
`:321`) с названной причиной: требование уехало от лендинга бэкенда `d1eb8a9`, не от правки
|
||
платформы. Найдено гейтом из п. 7 — он окупился на собственном лендинге прежде, чем построен.
|
||
|
||
## D39.160 — КОНТРАКТНЫЙ МИНОР ВЫДАН; сквозная полоса прогресса ИЗЪЯТА из него и едет с платформенным паком (2в) — слово владельца (27.08, оркестратор №19). ✅
|
||
|
||
Промт — `docs/CONTRACT_MINOR_SESSION_PROMPT.md`, состав и заказы там; здесь только решённое.
|
||
|
||
1. **Строка 200 (сквозная полоса прогресса) в минор 0.4.0 → 0.5.0 НЕ входит. Ратифицировано
|
||
владельцем**, изменяет пункт (2б) очереди D39.156 в части «сюда же строка 200».
|
||
2. **Основание — механическое, не вкусовое.** Гейт `TestTheAnnouncedContractVersionIsTheOneTheCanonRatified`
|
||
(`platform/internal/gates/contract_test.go:14`) читает канон и требует, чтобы константа
|
||
`platform/internal/httpapi/capabilities.go:13` ему равнялась ⇒ канон и деплой обязаны совпасть В
|
||
МОМЕНТ ЛЕНДИНГА. Снос отменённой двери этому не мешает: платформа свою половину снесла 22.08.
|
||
Смена семантики прогресса мешает: сервер считает его по отрезкам и будет до пака (2в), а объявить
|
||
`0.5.0` у деплоя со старым прогрессом — ровно та ложь, против которой гейт и заведён (однажды
|
||
деплой обслуживал `0.3.0` при каноне `0.4.0`).
|
||
3. **Цена прежнего «одним куском» обнулилась.** Она покупалась тем, что иначе фронт перегенерируется
|
||
дважды; фронт ЗАМОРОЖЕН (D39.147), зеркало отстаёт ратифицированно, и при разморозке он
|
||
перегенерируется ОДИН раз независимо от числа прошедших миноров.
|
||
4. **Третьего варианта нет, и это проверено, а не предположено:** «править канон, не двигая номер»
|
||
ломает честность semver; «прогресс капабилити-флагом» невозможен — это семантика СУЩЕСТВУЮЩЕГО
|
||
счётчика, а двух семантик у одного поля не бывает.
|
||
5. **Промт прошёл оба рубежа роли.** Механическая сверка против списка из 11 блоков + опровергатель
|
||
(сессия-автор движковой двери, независимая от `docs/`). **Девять находок, все девять проверены
|
||
моей командой и применены**; три из них промт бы не пережил: (а) моя формулировка идентичности
|
||
убивала ДОБАВЛЕНИЕ терма — сессия спроектировала бы «неизвестный кортеж → отказ», как канон 0.4.0
|
||
и делает (`openapi.yaml:486`); (б) счётчики `pending_decisions`/`complete` (`openapi.yaml:442-447`)
|
||
кормятся таблицей со снесённым write-путём и остались бы в каноне вечными нулями — их не поймал бы
|
||
греп ни мой, ни сессии; (в) публикация `undecided` без запретительного контракта `SignatureState`
|
||
воспитала бы у экрана подписи отменённую пер-термную модель ТЕМ ЖЕ минором, который её сносит.
|
||
6. **Ошибка буквы, исправленная тем же рубежом:** пункт строки 203 про `/auth` — **(а)**, не (е);
|
||
у строки открыт ещё (к), в пак не входящий.
|
||
|
||
## D39.161 — КОНТРАКТНЫЙ МИНОР 0.5.0 ПРИНЯТ И ЗАЛЕНДЖЕН: отменённая модель снесена, дверь правок объявлена и выведена из глагола, счётчики сняты (27.08, оркестратор №19). ✅
|
||
|
||
Пак исполнен по промту `CONTRACT_MINOR_SESSION_PROMPT.md` (D39.160) и принят. Механика — канон,
|
||
компаньон и отчёт `docs/CONTRACT_MINOR_REPORT.md`; здесь решённое и то, что добавила приёмка.
|
||
|
||
1. **Канон 0.5.0 заленджен; константа `platform/internal/httpapi/capabilities.go:13` поднята мной ТЕМ
|
||
ЖЕ коммитом**, как обязывала D39.160. Проверено исполнением на копии-с-каноном: до подъёма гейт
|
||
краснеет предсказанным текстом («announces contract 0.4.0 and the ratified canon is 0.5.0»), после
|
||
подъёма ПОЛНАЯ батарея зоны платформы — **18 пакетов, EXIT=0, линтер 0 issues**. Лендинг чужую
|
||
зону красной не оставляет.
|
||
2. **Снос полон, пере-проверен приёмкой:** в каноне ноль вхождений пути, операции и трёх схем
|
||
отменённой модели; счётчики сняты. Канон парсится, **дублей ключей 0**, висячих `$ref` 0, сирот 0
|
||
(две «сироты» — `securitySchemes`, подключаемые блоком `security`, а не ссылкой). В компаньоне три
|
||
упоминания — все ИСТОРИЧЕСКИЕ (баннер ломающего минора · провенанс · зачёркнутая строка таблицы,
|
||
которую промт велел сохранить как историю).
|
||
3. **Дверь `POST /books/{bookId}/bank/corrections` выведена из словаря, а не сочинена** — сверено
|
||
приёмкой поле за полем: `BankCorrection` совпадает с `membank.Decision` один в один. Раскладка
|
||
отказов сделана по существу: **409 `bank_corrections_refused`** = класс 14 (всё-или-ничего, отказ
|
||
всего документа), **503 `bank_corrections_incomplete`** = класс 15 с «слать ТОТ ЖЕ документ» и
|
||
названной сходимостью, **409 `run_in_flight`** = класс 12, **413** = потолок 1 МиБ, 5000 — в схеме.
|
||
`preview` = `--dry-run`. Отказанные решения едут `refusals[]` в конверте `Problem`, а не списком в
|
||
квитанции 200, — следствие всё-или-ничего.
|
||
4. **Машиночитаемый признак «не построено» — `Capabilities.bank_corrections_enabled`, false ⇒ 404.**
|
||
Требование промта исполнено: дверь объявлена честно, а не голой.
|
||
5. **Третий носитель счётчиков нашла САМА сессия** — `EventBank`, которого в списке промта не было.
|
||
6. **Ошибка ОРКЕСТРАТОРА, найденная исполнителем** (эррата 27.08-ж): «после сноса канон и деплой
|
||
совпадут точно» и «поля навсегда нули» верны по ПУТЯМ и неверны по ПОЛЯМ — проекция `GET /bank`
|
||
продолжает слать `pending_decisions`/`complete`, и это живой счёт `proposed`-строк. Носитель —
|
||
`PD-399`, лечение пунктом (2в). ⚠ Сессия принесла это ПИНГОМ, а не подогнала работу под неверную
|
||
посылку промта; это ровно то поведение, которого требует CLAUDE.md.
|
||
7. **Строка бэклога 206 ЗАКРЫТА и снята с таблицы** — она и была заказом этого минора («канон объявляет ручку, которой зона больше не отдаёт»); лекарство в дереве, пере-проверено приёмкой грепом: ноль вхождений. Её якорь `openapi.yaml:469` умер именно оттого, что путь снесён. Строка **203** пункт (а) исполнен, открытым по ней остаётся (к). Бэклог 176 → 175.
|
||
8. **Щели v1 названы, не спрятаны** (в каноне и компаньоне): машинного словаря причин отказа нет ·
|
||
алиасы клиенту невидимы · счёт `signature` недостижим без правки или превью · на 409 не едут
|
||
`preexisting`/`signature`, хотя движок их печатает — названная цена, не забывчивость.
|
||
|
||
## D39.162 — ПЛАТФОРМЕННЫЙ ПАК P9 ПРИНЯТ И ЗАЛЕНДЖЕН + КОНТРАКТНЫЙ МИНОР 0.6.0: дверь правок банка смонтирована, ключи доехали, полоса стала сквозной (28.08, оркестратор №19). ✅
|
||
|
||
**Что заленджено.** Пункт (2в) очереди D39.156 — последний в связке шва — отработан целиком:
|
||
дверь `POST /books/{bookId}/bank/corrections` смонтирована синхронно и под пер-книжным мьютексом ·
|
||
ключи деплоя доезжают до движка аргументом `--keys-file` (строка **211** ЗАКРЫТА, 11 пинов) ·
|
||
дубль движковой конвенции пути снят, путь банка берётся из конверта артефактов движка (**213**
|
||
сужена до одной строки дев-пути) · полоса прогресса стала ОДНОЙ монотонной долей на всю работу
|
||
прогона через обе волны, с канонной половиной — минором **0.6.0** (строка **200** ЗАКРЫТА) · с
|
||
провода сняты `pending_decisions`/`complete` (`PD-399`). Бэклог 176 → 175.
|
||
|
||
**Приёмка — исполнением, не чтением отчёта.** Батарея пере-прогнана мной с живым Postgres:
|
||
`EXIT=0`, 18 пакетов, `=== RUN` **793**, FAIL 0, DATA RACE 0, SKIP 2 (оба гейчены живым бинарём
|
||
движка). ⚠ Первый мой прогон БЕЗ `TM_PLATFORM_TEST_DSN` дал 279 пропусков из 774 — то есть «зелёная
|
||
батарея» без DSN проверяет две трети зоны, и это стоит помнить всякой будущей приёмке.
|
||
|
||
**Две мои диспозиции сессия ОПРОВЕРГЛА, и я принял опровержение.**
|
||
1. **Р4 — «`limitedBuffer` не убивает чайлда» НЕВЕРНА, мой заказ отозван.** Проверено МОИМ
|
||
исполнением, а не её доводом: отдельная программа с чайлдом, печатающим бесконечно, и writer'ом,
|
||
отказывающим на первой записи, — чайлд умер САМ за 1 мс с `signal: broken pipe`. Механизм стоит в
|
||
исходнике Go (`os/exec`, `writerDescriptor`: `pr.Close() // in case io.Copy stopped due to write
|
||
error`) и работает для `Stdout = io.Writer`; `drain()` носит свой `Kill` потому, что читает через
|
||
`StdoutPipe`, где никто ничего не закрывает. Ревьюер экстраполировал одну семантику на другую и
|
||
НЕ исполнял. Урок общий: находка «по аналогии с соседним кодом» — гипотеза, пока не посажена.
|
||
2. **Р2-dispute (READ COMMITTED между двумя UPDATE) растворён фиксом** — миграция сведена к одному
|
||
стейтменту, окна не существует; проверено чтением миграции.
|
||
|
||
**Одну её рекомендацию я ОТКЛОНИЛ.** Строку **186** она предлагала закрыть по своему замеру. Замер
|
||
верен и внесён в строку (`If-None-Match` → `304`/0 Б; gzip ×4.1; ниже 1024 Б честно не применяется),
|
||
но он подтверждает шаги 1–2, заленденные ещё P7, — а у строки живы шаги 3–5. Закрытие унесло бы долг
|
||
целиком. Строка остаётся открытой с ПОДТВЕРЖДЁННОЙ половиной.
|
||
|
||
**Р3 — архитектурный СТОП, и он назван, а не заметён (`PD-410`).** Проверено мной по коду и жёстче её
|
||
формулировки: у движка НЕТ флага числа глав вовсе — `TranslateArgs` несёт только `--ceiling-usd`
|
||
(`platform/internal/runner/engine.go:90-98`), а сам флаг каппит КУМУЛЯТИВНУЮ трату по книге
|
||
(`backend/cmd/tmctl/invocation.go:129`), тогда как волна идёт по всем чанкам. Платформа продаёт
|
||
ГЛАВЫ, движок останавливается по ДЕНЬГАМ: единицы разные, и никакая формула полосы их не мирит, пока
|
||
платёжная модель и план работ не согласованы. **Канон я НЕ смягчил** — по прецеденту §3.3 бэкенд-пака:
|
||
обещание верное, дефект в реализации; смягчение канона под текущий деплой — это то, как обещание
|
||
тихо становится ложью. Вместо смягчения канон получил честную оговорку у `stage` (D39.163) и явное
|
||
«прогон, кончившийся рано, до `total` не доходит».
|
||
|
||
**Строка 227 заведена с ИСПРАВЛЕННЫМ якорем.** Находка Д4 (квитанция считает `signature` от карты,
|
||
которую переписывает любая граница майнинга) ссылалась на `pipeline/signaturemap.go` — такого файла
|
||
НЕТ. Существо находки верно, носитель другой: идентификатор карты живёт в
|
||
`backend/internal/membank/decisions.go:903-912` (`seed.SignatureMapID`), и шов его не читает, то есть
|
||
починка аддитивна.
|
||
|
||
**Тесты под зелень не подгонялись — проверено диффом, а не заявлением.** 108 удалённых строк в тестах
|
||
разобраны поимённо: словарь кодов 16 → 18 (минор 0.5.0 добавил два банковских), «шесть фактов» →
|
||
«семь» с новым полем в проверяемом списке, снесённые утверждения о `pending_decisions` — вслед за
|
||
снесёнными полями. Единственная снесённая ФУНКЦИЯ
|
||
(`TestLiftingTheStopOnADraftOnlyDeploymentRetakesTheRightBaseline`) проверяла пере-взятие базовой
|
||
линии — механику, которую сквозная полоса упразднила; на её месте стоит тест противоположного
|
||
инварианта («снятие стопа не двигает бар») плюс два новых, каждый с названной пойманной мутацией.
|
||
|
||
**Фикс-раунд приёмки — 13 позиций** (`platform/docs/platform-PROGRESS.md`, таблица F1-F13). Из
|
||
проверенных мной по коду: потолок 1 МиБ меряется на ОТРЕНДЕРЕННОМ документе до спавна, поэтому
|
||
законное тело получает канонный `413`, а не движковое «пере-решите» (экранирование HTML выключено —
|
||
документ читает движок, не браузер); гард resume разделил слова честно — живой сосед `run_in_flight`,
|
||
финишировавший `not_resumable`; грейс стопа поднят с 10 с выше измеренных 11.3 с непрерываемого
|
||
участка.
|
||
|
||
**Что осталось открытым и НЕ спрятано:** `PD-410` (стоп Р3) · `PD-281` (прогон-применение над полной
|
||
книгой) · строка **213** одной строкой дев-пути · строка **186** шагами 3–5 · строка **214** вопросом
|
||
«кто и когда подписал» · строка **227**. Наследие `Н2`/`Н3` (смена формы конвейера на живой книге
|
||
перепродаёт купленные главы) упирается в ПРОДУКТОВОЕ решение владельца и ждёт его словом, а не
|
||
кодом.
|
||
|
||
## D39.163 — ГРАНИЦА КОНТРАКТА получает ВТОРОЕ исключение: `Progress.stage`, и оно ограничено двумя условиями (28.08, оркестратор №19). ✅
|
||
|
||
**Что было.** Шапка канона (`14-api-contract/openapi.yaml`, §Boundaries) запрещает проводу всё о том,
|
||
КАК переводится книга: имена моделей, фаз и стадий, внутренние словари, суммы денег. Исключение было
|
||
ОДНО — банк памяти: стоп, который снимает пользователь, спрятать нельзя.
|
||
|
||
**Почему понадобилось второе.** Владелец заказал (строка 200) полосу с подписью «что делается
|
||
сейчас». Бар, который движется молча, отвечает хуже бара с подписью, а любая подпись «что происходит»
|
||
по построению говорит нечто о том, КАК идёт работа. Спрятать её значило бы отказать в заказанном;
|
||
пропустить молча — завести дыру в границе без имени.
|
||
|
||
**Решение: исключение вписано ЯВНО и ОГРАНИЧЕНО двумя условиями,** оба выполняются кодом уже сейчас:
|
||
1. **Значение ВЫВОДИТСЯ платформой** из тех же счётчиков, что и бар (`runStage` — SQL над теми же
|
||
колонками), и НИКОГДА не пробрасывается идентификатором из движка. Отсюда же следствие: подпись и
|
||
бар не могут разойтись между собой.
|
||
2. **Словарь ОТКРЫТ**, и клиент ОБЯЗАН рисовать незнакомое значение нейтрально. Новые значения
|
||
ломающими не считаются и версию не поднимают.
|
||
|
||
**Ради чего условия и поставлены** — ради канона мультиязычности: пара или конвейер с ИНОЙ формой
|
||
работы не требуют нового клиента. Захардкоженный закрытый словарь `drafting`/`editing` привязал бы
|
||
клиента к сегодняшней двухволновой форме, то есть ответ на ревью-вопрос «заработает ли пара, которой
|
||
в репо ещё НЕТ» стал бы «нет» — в поле, не в Go.
|
||
|
||
⚠ **Честная оговорка, добавленная по следствию `PD-410`:** подпись описывает МОДЕЛЬ ПЛАТФОРМЫ о
|
||
работе прогона, а не отчёт движка — движок об этом не спрашивают и он не отвечает. Где двое
|
||
расходятся, подпись — приближение, а факт — готовый текст. Без этой оговорки поле читалось бы как
|
||
свидетельство движка, каким оно не является.
|
||
|
||
**Что этой нотой НЕ разрешено:** третьего исключения нет, и «раз уж есть два» аргументом не будет.
|
||
Каждое следующее — отдельная нота с собственным ограничением, иначе граница перестанет быть границей.
|
||
|
||
## D39.164 — БЭКЕНД-ПАК «ТИХАЯ ПОРЧА» ПРИНЯТ И ЗАЛЕНДЖЕН: инъекция банка больше не теряется, дыра выдачи видна читателю, повтор документа сходится (28.08, оркестратор №19). ✅
|
||
|
||
**Три пункта, все закрыты.** §3.1 — новая ось `llm.Capability.SystemMessages` (`multi`|`single`);
|
||
под `single` ведущий системный ряд СКЛЕИВАЕТСЯ в одно сообщение, системное после не-системного хода
|
||
отказывается ГРОМКО, а под `multi` (дефолт) отображение остаётся байт-равным прежнему проводу. §3.2 —
|
||
дыра выдачи видна В ПОТОКЕ ТЕКСТА обоих рендеров. §3.3 — порядок записи документов решений сменён на
|
||
REJECTS-FIRST, и повтор принятого документа сходится вместо отказа.
|
||
|
||
**Приёмка — четырьмя МОИМИ посадками мутаций, не чтением отчёта.** Каждая на резервной копии файла,
|
||
каждая восстановлена побайтно (git не трогался: дерево грязное, рядом живёт чужая незакоммиченная
|
||
работа).
|
||
1. «ось игнорируется, склейки нет» → падают `internal/llm` (с текстом «a system message after a
|
||
non-system turn must be refused») и `internal/pipeline` — обе волны;
|
||
2. «снят гард непустого текста у маркера» → падают `TestExportPlaintextStateMatrix` и
|
||
`TestTranslateStateMatrix`;
|
||
3. «порядок возвращён к delta-first» → падают `TestHalfLandedIsNamedPerFile` и
|
||
`TestTheRenameOrderIsWhatMakesADeclineRecover`;
|
||
4. «боевое объявление квирка снято из `models.yaml`» → падает
|
||
`TestShippedGeminiDeclaresOneSystemMessage` — гейт, которого до пака НЕ БЫЛО ВОВСЕ (удаление двух
|
||
строк боевого конфига оставляло модуль зелёным; самонаходка сессии).
|
||
|
||
**Жёсткие ограничения промта проверены отдельно и держатся:** `gapMarker` живёт ТОЛЬКО в
|
||
`cmd/tmctl/render.go`, то есть маркер — проекция выгрузки, а не мутация финального текста;
|
||
присвоение `FinalText` в `export.go` не тронуто; Anthropic-путь не тронут ни одной строкой;
|
||
`exportVersion` не двигался; `dropped_members` аддитивно и `omitempty` — ось детерминизма чиста.
|
||
|
||
**Заказ §3.2 ПЕРЕ-ФОРМУЛИРОВАН находкой исполнителя, и это удешевило пак.** Маркер существовал и
|
||
ВРАЛ: ветка «флагнут и с текстом» печатала «(leak cleaned, verify)» ЛЮБОМУ такому юниту, а c-lite
|
||
member-drop попадал ровно в неё — читателю сообщали про косметическую чистку, которой не было.
|
||
Предмет стал «перестать врать и покрыть непокрытое» вместо «завести маркер».
|
||
⚠ **Подсказка МОЕГО промта про место правки была ОПАСНА, и исполнитель её отклонил с грунтом.** Я
|
||
указывал `export.go` рядом с `ApplyHeading`; туда нельзя — провод судит `translated`/`withheld`
|
||
предикатом «текст непуст», и маркер в пустом юните перевернул бы `withheld` → `translated`, то есть
|
||
ровно ⛔-запрет того же промта. `ApplyHeading` этого не делает лишь потому, что на пустом тексте он
|
||
no-op. Различение, которое исполнитель положил в основу и которое я ратифицирую: **титул — часть
|
||
КНИГИ и обязан ехать на провод; маркер дыры — метаданные О тексте, и в поле, по которому провод
|
||
судит, ему нельзя.**
|
||
|
||
**Изменённый тест — НЕ подгонка под зелень, проверено диффом и посадкой.**
|
||
`TestHalfLandedIsNamedPerFile` кодировал в фикстуре порядок переименований, который заказ §3.3
|
||
изменил. Фикстура пере-нацелена с пути rejects на путь delta; утверждаемое — «легла РОВНО одна
|
||
половина, это ПРОВЕРЕННЫЕ байты, отчёт называет какая» — сохранено дословно и по числу условий, а сам
|
||
порядок вынесен в новый `TestTheRenameOrderIsWhatMakesADeclineRecover` с причиной. Моя посадка №3
|
||
роняет ОБА теста. Исполнитель объявил правку САМ и первой строкой — это довод в его пользу, а не
|
||
подозрение.
|
||
|
||
**Опровергатель окупился, и это главное свойство пака.** Шесть линз, тридцать находок, двадцать
|
||
четыре доказаны исполнением; шесть настоящих дефектов — и ЧЕТЫРЕ из них внёс сам пак. Один
|
||
показателен: первая редакция ветки маркера срабатывала без проверки непустого текста, то есть юнит с
|
||
выпавшими ВСЕМИ членами получил бы баннер «фрагмент отсутствует НИЖЕ», указывающий на несуществующий
|
||
текст — одна ложь читателю едва не заменилась другой.
|
||
|
||
**Право §9 применено трижды и один раз ОШИБОЧНО — исполнителем же и названо.** Отклонены: Д3 (символ
|
||
живёт в `platform/`, движковая половина здорова — порядок «карта → память» исполнен), Д1 как отдельный
|
||
предмет, подсказка про место маркера. Ошибочно: «вторую дверь не трогаю, это устаревший документ, а не
|
||
ретрай» — опровергатель показал траекторию из одних принятых вызовов, рассуждение было неверным, дверь
|
||
починена.
|
||
|
||
**Хард-блокер, найденный и снятый, — он достался бы следующей сессии как «сломанная сборка».**
|
||
`go test ./cmd/tmctl/` строил бинарь во временном каталоге и НИКОГДА его не убирал: накопилось 249
|
||
брошенных каталогов на ~5 ГБ, `/tmp` заполнился, батарея под `-race` начала падать с «no space left on
|
||
device». Починено `TestMain`, проверено двумя прогонами подряд с нулевым приростом.
|
||
|
||
**Строки бэклога.** ЗАКРЫТЫ **208** (эскалационный хоп терял инъекцию) и **193** (дыры выдачи молчат
|
||
в тексте). **141** — половина закрыта: сноска С ханьцзы теперь видна читателю тем же маркером
|
||
бесплатно; остаток — правка самого детектора, и он НЕ про потерю текста. Якорь **131** исправлен
|
||
приёмкой (`memory.go:512-515` → `:518-521`). Заведены **228** (алиас возвращает отклонённую
|
||
поверхность — узкая форма Д1), **229** (снапшот не фолдит модель внутренних гейтов) и **230**
|
||
(размен «сходимость против поучения»). Бэклог 175 → 176.
|
||
|
||
⚠ **Дыра снапшота (229) ЛАТЕНТНА, и это установлено замером, а не рассуждением:** гейта
|
||
`terminology` нет ни в одном конфиге репозитория, поэтому сегодня она не стоит денег. Лечить её этим
|
||
паком было бы неверно вдвойне — фолд гейт-моделей сдвигает хеши и обесценивает чекпойнты, то есть
|
||
починка латентного дефекта стоила бы пере-покупки.
|
||
|
||
⚠ **ОШИБКА ОРКЕСТРАТОРА при лендинге P9, названная здесь, чтобы не потерялась.** Коммит `58bae30`
|
||
унёс ~103 строки журнала бэкенд-сессии под МОИМ сообщением: мы писали в `docs/PROGRESS.md` в общем
|
||
окне read-modify-write, её предупреждение пришло, когда `git add` уже отработал. Содержимое ЦЕЛО (обе
|
||
стороны проверили независимо, код не затронут), потеряна только атрибуция. Историю не переписывал —
|
||
канон запрещает это, пока в дереве живут чужие незакоммиченные правки. **Механизм плохой, а не
|
||
человек:** зонный журнал — единственный файл, который две сессии правят одновременно, и защиты у него
|
||
нет никакой.
|
||
|
||
## D39.165 — ТРИ ПРОДУКТОВЫХ РАЗВИЛКИ СНЯТЫ СЛОВОМ ВЛАДЕЛЬЦА: единица продажи, смена формы конвейера, продажа пере-прохода (28.08, оркестратор №19). ✅
|
||
|
||
**Основание — слово владельца 28.08** по итогам разведки четырьмя агентами (внешний рынок · археология репозитория · механика пере-прохода · измеримость цены). Числа ниже пере-мерены оркестратором лично на движковых леджерах, не приняты с чужих слов.
|
||
|
||
### 1. ЕДИНИЦА ПРОДАЖИ — `PD-410` получает направление лечения
|
||
|
||
**Измерено (мой запрос к `books/gu-zhenren/**/*.db`, $0):** настоящая полная цена главы — **средняя $0.0115–$0.0190**, медиана рядом, **максимум одной главы $0.0375**; константа продажи `pricing.DefaultPerChapter` — **$0.03**. То есть завышена в 1.6–2.6×, и отдельные главы её уже пробивают.
|
||
|
||
⚠ **Следствие важнее цифры и формулирует дефект точнее прежнего:** покупка «10 глав» отдаёт движку $0.30, а $0.30 на измеренном материале покупает **примерно 16–26 глав**; полоса при этом каппится на десяти. **Ручка «купить N глав» ничего не ограничивает — это денежная ручка с подписью «главы».**
|
||
|
||
**Хвост качества подтверждён данными** (наблюдение владельца): оплаченный брак виден в `request_log` с ИМЕНАМИ причин — `empty` (12 вызовов, $0.0128), `length` (10, $0.0122), `cjk_artifact`, `sanitizer_defect` (3 вызова = $0.0259, дороже средней главы). Доля ретраев+эскалаций гуляет **1.5% → 5.9% → 23%** между прогонами. Плоская константа такой разброс не описывает в принципе.
|
||
|
||
**РЕШЕНО, три части:**
|
||
- **(а) Цена — от ОБЪЁМА ИСХОДНИКА, не константа.** Так устроен весь рынок перевода (DeepL — знаки, Smartcat — слова, ScribeShadow — объём книги): единица пре-котируема, потому что источник известен до первого вызова. ⚠ **Носитель у нас УЖЕ ЕСТЬ и он лучше знаков: `chapters.units_total`** — интейк пишет его вызовом `tmctl manifest` ($0, `platform/internal/books/parse.go:312` → `SaveStructure`) ДО первой оплаты, и юнит — это ровно то, за что платит движок. Посимвольных колонок заводить НЕ НАДО.
|
||
- **(б) У продажи появляется НАСТОЯЩИЙ стоп — потолок объёма в ДВИЖКЕ рядом с денежным.** Прецедент внешний и штатный: OpenHands (`max_budget_per_task` + `max_iterations`), LiteLLM (budget + tpm/rpm). ⚠ **Выбор места сделан мной и обоснован:** резать волну на стороне платформы нельзя — она не владеет волной и не знает пер-юнитной цены заранее. Две грабли этих же систем забираем сразу: остановка обязана НАЗЫВАТЬ, по какому потолку встала (у OpenHands она молчит — известная жалоба), и проверяться ПЕРЕД началом юнита, а не после (у LiteLLM пост-фактум-проверка всегда пробивает потолок на один вызов).
|
||
- **(в) Хвост качества — в тариф, и МЕРИТЬ.** Возврата за содержательный брак при HTTP 200 не даёт НИКТО из вендоров (Azure прямо биллит срез модерацией и `finish_reason: content_filter`), значит хвост структурно наш. Единственный найденный прецедент гейта качества ПЕРЕД списанием — Zendesk (резолюшн верифицируется отдельной моделью, не прошёл — не биллится), и он коммерчески работает. Телеметрия у нас уже есть: хвост отделяется тремя срезами (`checkpoints.attempt>0` · `checkpoints.escalation=1` · `request_log.ok=0 AND cost_usd>0`).
|
||
- **⛔ (г) КОНСТАНТУ ПО СЕГОДНЯШНИМ ЧИСЛАМ НЕ КАЛИБРОВАТЬ.** Прогоны с редактурой — 10–11.07, редактор был другой моделью, книга ОДНА, а леджер по собственному признанию проекта — НИЖНЯЯ граница (живой замер D39.86: 3 вызова из 14 мимо, ≤13% неизвестности). Порядок величины знаем, цену — нет. Калибровка гейчена строкой **202** (прогон текущего стека насквозь), которую вчерашний лендинг разблокировал.
|
||
|
||
### 2. СМЕНА ФОРМЫ КОНВЕЙЕРА НА ЖИВОЙ КНИГЕ — форма «ЭПОХА» (`PD-403`/`PD-404`)
|
||
|
||
**Археология вскрыла, что проект отвечал на СОСЕДНИЙ вопрос дважды, и два ратифицированных ответа В КОМПОЗИЦИИ дают дефект.** D39.152 п.4: «сделано» = последний проход, который книга на ЭТОМ деплое реально получает, «whatever that is». D39.153 §4б: признак «есть ли редактор» — свойство книги и МОНОТОННОЕ, ратифицировано именно против отката счётчика назад. Монотонность защищает направление «редактора добавили» и МОРОЗИТ направление «редактора убрали». ⚠ И комментарий `platform/internal/pgstore/sink.go:405-408` утверждает, что снятие редактора «показывается как больше сделанных глав, что честно», — **его собственный код этого не делает** (сверено построчно).
|
||
|
||
**РЕШЕНО: смена формы конвейера — СОБЫТИЕ КНИГИ, как пере-нарезка, и счёт легально пересчитывается.** Канон уже открыл эту дверь: `chapters_done` «never moves backwards WITHIN one `structure_version`; cutting the book again recomputes both numbers» (`14-api-contract/openapi.yaml:1542-1545`) — то есть пересечение границы РАЗРЕШЕНО и нового исключения изобретать не нужно. Пользователь видит скачок, но ОБЪЯСНИМЫЙ.
|
||
- ⚠ **Монотонность флага (D39.153 §4б) НЕ отменяется** — там стоит пин, и правка пина под зелень запрещена D39.121. Меняется другое: пожизненный счёт книги перестаёт выводиться из ЖИВОГО флага.
|
||
- ⚠ **Ложный комментарий `sink.go:405-408` снести вместе с правкой** — он пережил своё основание и учит неверному.
|
||
- **Заново НЕ предлагать** четыре формы, уже отвергнутые с доводом: счёт всегда по редакторской волне (D39.152 п.4 — живой денежный дефект) · читать форму с последнего прогона (PD-316, закрыто миграцией 00024) · немонотонный флаг (пин приёмки P7 его ловит) · рамка «какая фаза считается» как вопрос клиенту (отвергнута владельцем 20.08, и закрытый словарь стадий — D39.163).
|
||
|
||
### 3. ПРОДАЖА ПЕРЕ-ПРОХОДА — дверь к УЖЕ ПОСТРОЕННОМУ механизму
|
||
|
||
**Разведка установила: движковая половина построена практически целиком.** `translate --resnapshot` после `bank-apply` определяет затронутые термином юниты БАЙТ-СВЕРКОЙ отрендеренного запроса (точнее любого селектора), незатронутые пере-привязывает за **$0** (`backend/internal/pipeline/stagerun.go:88-107`, `repin.go`), считает смету ДО первого резерва и под порогом согласия — свой у книги, иначе `min($0.50, 5% × книги)` — **продолжает сам, без флагов** (`rebill.go`). Смета уже публикуется в `status --json` полями `rebill_units`/`rebill_usd`. ⚠ `redrive` для этого НЕ годится: он атакует только флагнутые чанки и никогда не трогает `DispOK`.
|
||
|
||
⚠ **МИНА, ВЗВЕДЁННАЯ НАШИМ ЖЕ ВЧЕРАШНИМ ЛЕНДИНГОМ — чинить ПЕРВЫМ.** Правка банка двигает снапшот, а движок при сдвинутом снапшоте **останавливается ГРОМКО**, если не передан `--resnapshot` (`stagerun.go:54-58`, текст отказа сверен). Платформа не передаёт ни его, ни `--accept-rebill` (`platform/internal/runner/engine.go:90-98`). До 28.08 это не кусало, потому что до движка не доезжало ничего; **вчера заленджены и ключи, и дверь — значит первый же продолжающий прогон после первой же правки банка УПАДЁТ.** Носитель — строка **199**(б).
|
||
|
||
⚠ **И канон противоречит сам себе на ДОЧИТАННОЙ книге, в двух фразах:** правка «takes effect on the NEXT run» (`openapi.yaml:505`), а поднять потолок можно только у ПРИОСТАНОВЛЕННОЙ книги и «finished work is not bought twice» (`openapi.yaml:590`). У дочитанной книги следующего прогона купить нечем — правка принята и умирает.
|
||
|
||
**РЕШЕНО — форма двери:** платформа читает смету из УЖЕ существующего `status --json` (два поля в `ingest/resync.go`), показывает «затронуто N юнитов» **БЕЗ долларов** (D39.84 — деньги на провод не ходят), допускает старт на книге с нулевым остатком, если банк двигался после последнего прогона, и спавнит `translate --resnapshot` с принятым согласием. Движок при этом $0. Ложится в закон шва D39.156 п.7 (проекция ПРЕЖДЕ мутации) и в строку `17-seam-inbound-law.md:102`, где эта дверь уже поименована будущей.
|
||
|
||
⚠ **ОБЛАСТЬ D39.144 п.1 СУЖЕНА ЯВНО, чтобы следующая сессия не увидела противоречия.** D39.144 запрещает ПРОЕКТИРОВАТЬ механику пост-ридинговых правок до итогов полигона (фаза Д), и разведка честно пометила «относится ли к запрету ПРОДАЖА пере-прохода» как НЕ УСТАНОВЛЕННОЕ. **Владелец снял это 28.08:** открыть дверь к уже построенному движковому механизму — НЕ то же самое, что проектировать продуктовый цикл пост-ридинга. Цикл (отдельная ручка «перегенерировать», `resnapshot --dry-run`, доезд правки до ЧЕРНОВИКА через сид) остаётся гейченным полигоном.
|
||
|
||
### ПОРЯДОК РАБОТ, вытекающий из решений
|
||
**Мина и дверь — ОДИН пак:** оба закрываются теми же двумя флагами в одной функции сборки аргументов. Дальше — строка **202** (живой прогон текущего стека), потому что без неё цена не калибруется. Эпоха формы конвейера и потолок объёма — параллельно, они ни от чего не гейчены.
|
||
|
||
## D39.166 — ПЛАТФОРМЕННЫЙ ПАК P10 ПРИНЯТ И ЗАЛЕНДЖЕН + КОНТРАКТНЫЙ МИНОР 0.7.0: мина под правкой банка обезврежена, пере-проход можно КУПИТЬ (28.08, оркестратор №19). ✅
|
||
|
||
**Что заленджено.** Продолжающий прогон по книге с применённой правкой банка больше не умирает на
|
||
движковом гарде снапшота · пере-проход продаётся членом `RunRequest.re_pass` (канон **0.7.0**) ·
|
||
согласие на пере-плату даётся ДЕНЬГАМИ (потолок = холд прогона) · полоса такого прогона объявлена
|
||
формой «одна неделимая единица работы».
|
||
|
||
⚠ **ГЛАВНОЕ СОБЫТИЕ ЭТОГО ПАКА — НЕ КОД, А ТО, ЧТО ЕГО ПЕРВАЯ СДАЧА БЫЛА НЕВЕРНОЙ И ЭТО НАШЛА САМА
|
||
СЕССИЯ.** Пак был сдан, числа сходились, батарея была зелёной — и я собирался его лендить. По
|
||
требованию владельца (28.08) сессия провела ШИРОКИЙ адверсариальный проход по своей готовой работе:
|
||
6 линз, 42 находки, **три фатальные**, все доказаны исполнением на настоящем движке.
|
||
1. **Мина, объявленная обезвреженной, СТОЯЛА.** `bank-apply` пишет только ФАЙЛЫ решений, а `status`
|
||
считает ре-билл от СОХРАНЁННОГО глоссария (`backend/internal/pipeline/status.go:733-744`, чей
|
||
собственный комментарий это и говорит) — свёртка происходит внутри СЛЕДУЮЩЕГО `translate`. Значит
|
||
сразу после правки движок отвечает «ничего не двигалось», факт не взводился, флаги не выдавались.
|
||
Живой тест сессии дёргал движковый гард НАПРЯМУЮ и платформенную цепь не покрывал — класс, о
|
||
котором она сама же предупреждала в том же отчёте.
|
||
2. **$0-цена мурует дверь:** `rebill_usd` у движка `omitempty`, юниты по нулевой цене приходят без
|
||
цены, и отказ «нет цены» превращал ЛЕГШУЮ правку в вечный ре-сенд.
|
||
3. **Глава-полоса МЕРТВА** — см. эррату 28.08-к.
|
||
|
||
**ДВЕ ОШИБКИ ОРКЕСТРАТОРА, обе вынесены эрратой 28.08-к, обе найдены этим проходом.** Посылка
|
||
D39.165 «смета уже публикуется в `status`» верна только ПОСЛЕ свёртки. И моё решение «полоса
|
||
пере-прохода в ГЛАВАХ» опрокинуто: я вывел «репин двигает полосу» из того, что он идёт общим путём
|
||
резюма, и НЕ проверил анонс — движок анонсирует работу один раз за жизнь книги. Вывод из соседнего
|
||
механизма без проверки своего.
|
||
|
||
**ПЕРЕСБОРКА СЕССИИ ЛУЧШЕ МОЕГО ЗАКАЗА, и это записано как есть.** Факт «банк двигался» берётся из
|
||
СОБСТВЕННОЙ квитанции двери (`changed` либо `already_applied` — сходимость ретрая держится
|
||
состояниями), а не спрашивается у движка: спрашивать было моей ошибкой. Гашение факта — ЯВНОЕ и
|
||
только чистым финишем, с названной в коде асимметрией: застрявший факт стоит одного безвредного
|
||
`--resnapshot`, ложно снятый — смерти на гарде. **Консент ФОНДИРОВАННЫЙ** — согласие даётся
|
||
деньгами, которые пользователь уже внёс, и потолок равен бюджету; это удовлетворяет мой же ⛔
|
||
«согласие обязано быть явным», ничего не выдумывая.
|
||
|
||
**Приёмка — исполнением.** Батарея пере-прогнана мной с живым Postgres: 18 пакетов, `RUN=803`, FAIL
|
||
0, гонок 0; гейт версии краснел предсказуемо и позеленел после подъёма константы. Посадил ДВЕ свои
|
||
мутации: «полоса снова из глав» роняет `TestARePassRunsBarIsOneUnitOfWork`, «гашение без чистого
|
||
финиша» роняет `TestAFailedRunKeepsTheFactAndAReadyRunRetiresIt` — обе топично.
|
||
|
||
⚠ **ПРИЁМКА ПОЙМАЛА ЕЩЁ ОДНО, И ЭТО НОВЫЙ КЛАСС.** Предложение сессии по контрактной половине
|
||
ПРОТУХЛО ОТ ЕЁ ЖЕ ПЕРЕСБОРКИ: оно описывало поле сметы, глава-полосу и код отказа, которых после
|
||
пересборки не стало. Прими я его переносом — на провод уехало бы поле БЕЗ ПРОИЗВОДИТЕЛЯ, ровно тот
|
||
класс, который этот же пак вычищает в другом месте. **Формулировка урока (её же): предложение
|
||
канону, пережившее пересборку кода, — тоже гипотеза, пока не сверено с деревом.** Парный класс к
|
||
«фейк ходит мимо шва», только в доках.
|
||
|
||
**Названная цена минора.** Смету «затронуто N юнитов» до покупки провод НЕ несёт — в текущем шве она
|
||
недостижима. Возвращается вместе с движковым глаголом «свернуть банк и оценить вне прогона»
|
||
(заведён строкой бэклога). Поля `rebill_units`/`rebill_usd` сняты из аллоулиста шва: поле без
|
||
потребителя — тот самый класс дефекта, и основание, по которому они брались, снято эрратой.
|
||
|
||
**Строки.** Мина строки **199**(б) ЗАКРЫТА. Строка **215** закрыта в части двери; отложенная
|
||
половина — смета — переехала в новую строку. Заведена строка на движковый глагол сметы.
|
||
|
||
## D39.167 — АУДИТ ДОКУМЕНТАЦИИ: очередь направляла работу в прожитое, регистр расходился с актами лендинга, журнал ужат вдвое (28.08, оркестратор №19). ✅
|
||
|
||
**Заказ владельца:** обойти документацию репозитория, вычитать от первой строки до последней, вынести буллетами что протухло · что требует перепроверки · что в архив · на что обратить внимание. Отдельно: «в прогрессе наверное одна сплошная проза — пройденную прозу можно сносить».
|
||
|
||
**Метод и его ГРАНИЦА, названная честно.** Документации в репозитории **16 МБ** (9 живой + 7 архива) — порядка четырёх миллионов токенов. «Прочитать всё одним агентом» физически невозможно, и обещать это было бы враньём. Поэтому обход разделён; ЭТОЙ нотой ратифицируется ПЕРВАЯ часть — **хребет** (`CLAUDE.md` · `README` · `PROGRESS` · журнал решений с шапкой и эрратами · реестр · канон контракта с компаньоном · активные промты), прочитанный целиком одним агентом тяжёлой модели. ⚠ **Три участка ещё НЕ пройдены и это не забывчивость:** `docs/architecture/` (кроме контракта), `docs/research/`+`docs/experiments/`, зонные доки. Их вердикт — отдельной нотой.
|
||
|
||
### ЧТО НАШЛОСЬ — по убыванию опасности
|
||
|
||
**1. Регистр платформы расходился с МОИМИ ЖЕ актами лендинга — ЧЕТЫРЕ строки, одна `major`.** `PD-166` (акт объявил закрытие), `PD-400.2` (объявлен перевод в принятый риск), `PD-401` (тело: «до лендинга строка open», лендинг прошёл) и `PD-370` (`major`, висел на доводе «канон 0.4.0 ПО-ПРЕЖНЕМУ несёт путь» — путь снесён минором 0.5.0). **Опасность механическая:** следующий платформенный пак собирается ПО РЕГИСТРУ и поехал бы чинить построенное и снесённое. Все четыре переведены зоной; арифметика сошлась (open 107 → 103). ⚠ **Класс «строка `open`, а лекарство в дереве» собрал четырёх жертв за неделю и НЕ ИМЕЕТ ГЕЙТА** — приоритет строки бэклога **225** подтверждён замером, а не рассуждением.
|
||
|
||
**2. CURRENT-STATE направляла сессии в ПРОЖИТОЕ.** Очередь пять дней звала `BACKEND_SEAM_PACK_SESSION_PROMPT.md` «АКТИВНЫМ ПРОМТОМ ЗОНЫ» — пак исполнен D39.158, файл лежит в `archive/prompts/`, а `docs/README.md` честно говорил «активного НЕТ»: два дока противоречили друг другу, и первым читается тот, что лжёт. Там же на владельце висела развилка владения `book.yaml` (199а), растворённая D39.156 п.3 и закрытая D39.166. Оба места сняты.
|
||
|
||
**3. Бэклог держал ДВЕ ЗАКРЫТЫЕ строки** (199, 215) вопреки собственному правилу «закрытые строки здесь НЕ хранятся», счёт был завышен на две. Остатки обеих уже пере-прописаны живыми строками (**228**, **231**) — снос прошёл без потерь.
|
||
|
||
**4. ⚠ ПОРЧА РЕЕСТРА D-НОТ — МОЯ СОБСТВЕННАЯ, и аудит поймал именно её.** Реестр держит ШЕСТЬ колонок (`№ · дата · суть · статус · тело · темы`). **Все восемь строк, написанные мной за сутки (D39.159–D39.166), имели ЧЕТЫРЕ:** я потерял колонки «тело» и «темы» и подменил словарь статусов галочкой. Реестр обещает «статус и тело любого номера одним хопом» — обещание держалось на форме, которую я молча сломал, а `counts.py` сторожит полноту номеров, не форму. Все восемь пере-собраны.
|
||
|
||
**5. Справочники отстали от двух суток миноров.** `STACK.md` учил несуществующему блокеру («на SaaS движок ключей НЕ ПОЛУЧАЕТ ВОВСЕ» — получает с D39.162). `glossary.md` не знал глагола `bank-apply` (⚠ ВТОРОЙ раз подряд: ячейка сама несёт эррату «прежняя редакция не знала `manifest`/`migrate`»). Компаньон контракта нёс ДВА статус-баннера в одном файле — `:7` «по 0.4.0» против `:54` «по 0.7.0», и лгал первый, который читают раньше. `product-requirements` держал ПТ-33 как открытый остаток, исполненный минором 0.6.0.
|
||
|
||
### ЧТО СДЕЛАНО С ЖУРНАЛОМ — ответ на слово владельца о прозе
|
||
|
||
Владелец прав: секция «Бэкенд» была прожитой прозой целиком — пять итогов сессий 24–28.08 с записками-планами, и каждый «дерево готово, НЕ закоммичено» описывал состояние, которого больше нет. **Вынесена в слайс `docs/archive/PROGRESS-2026-08-backend.md`** под ⚠-баннером. Плюс сняты три прожитых дампа приёмки из головы и свёрнута лента контрактных миноров. **Журнал: 943 строки → 347.**
|
||
|
||
⚠ **Что при этом ОБЯЗАНО было остаться и осталось** (проверено поимённо перед сносом): таблица бэклога целиком · «Открыто на владельце» · открытые обязательства, которых нет больше нигде (веса `pro`, протухшие цены DeepSeek, разовость санкции платного прогона) · живые пинги полигону, включая вендор-вердикт по Gemini — его копия была и в снесённой секции, носитель остался в полигонной.
|
||
|
||
### МЕТОД-УРОК, который стоил хода и записан, чтобы не повторился
|
||
|
||
⚠ **Оркестратор нарушил бюджет модели, который сам же вписал в канон двумя часами раньше.** Из четырёх запущенных агентов модель была задана ЯВНО только одному — остальные три унаследовали её, а владельцу было сказано «на моделях попроще»: **объявлен факт, который не был обеспечен**. Хуже: агентам не запретили порождать собственных, трое немедленно развернули веер, и на пике работало одиннадцать вместо четырёх. При остановке дети **осиротели и продолжали работать** — их пришлось добивать отдельно. И, испугавшись счёта, оркестратор смёл в том числе ЕДИНСТВЕННОГО правильно запущенного агента, хотя имена задач в ответах на убийство прямо показывали, чьи дети чьи. **Правило на будущее: модель задавать ЯВНО каждому агенту, порождение суб-агентов запрещать явно, а перед массовой остановкой читать, что именно останавливаешь.**
|
||
|
||
## D39.168 — АУДИТ ДОКУМЕНТАЦИИ, часть 2: архитектура и ресёрчи. Четыре мёртвых отчёта вынесены, две нормы требовали построенного, доки врали про разрешения провайдеров (28.08, оркестратор №19). ✅
|
||
|
||
**Продолжение D39.167** тем же методом: один агент за раз, полное чтение, каждый якорь открыт лично, вердикт перепроверяется оркестратором по коду. Прочитано: `docs/architecture/` целиком (13 файлов, 418 КБ) и `docs/research/` (36 файлов, 2.2 МБ — полным чтением ключевые, остальное по шапкам с механически построенным ГРАФОМ ВХОДЯЩИХ ССЫЛОК как основанием архивного вердикта). ⚠ Не пройдены: `docs/experiments/` (1.6 МБ) и зонные доки (3.5 МБ) — часть 3.
|
||
|
||
### ДВЕ НОРМЫ ТРЕБОВАЛИ УЖЕ ПОСТРОЕННОГО — это опаснее протухшего факта
|
||
|
||
- **Закон шва п.3** (`17-seam-inbound-law.md:62-64`) предписывал: «`status --json` версию НЕ несёт. **Закрыть**». Несёт — `backend/internal/pipeline/status.go:148-149`, `const statusVersion = "tm-status-v1"`. Следующий пак заплатил бы за построенное второй раз, и заплатил бы ПО НОРМЕ, на которую разрешено ссылаться.
|
||
- **Таблица будущих дверей** там же числила `--keys-file` неисполненной дверью строки 211 — построена (D39.158/D39.162), строка закрыта.
|
||
|
||
### ДОКИ ВРАЛИ ПРО РАЗРЕШЕНИЯ ПРОВАЙДЕРОВ — ось, где ошибка стоит аккаунта
|
||
|
||
`research/08-legal.md:13` и `09-target-architecture.md` утверждали: «`accepts_labels` держатся ПУСТЫМИ до фактов ToS (fail-closed)». **Факты предъявлены и поля ЗАПОЛНЕНЫ:** `backend/configs/models.yaml:99` и `:160` несут `[sexually-explicit]`, `:172` — `[violence, sexually-explicit]`. Механизм fail-closed жив (пустое поле по-прежнему запрещает всё), но «пусты у всех» — ложь. Оба места исправлены. ⚠ Агент пропустил это в ПЕРВОМ заходе и снял в свою сторону во втором — самокоррекция названа здесь, потому что она и есть признак честного аудита.
|
||
|
||
### ДЕНЕЖНЫЙ ВХОД ЦИТИРОВАЛ СУММУ, КОТОРОЙ КОД НЕ ДАЁТ
|
||
|
||
`15-money-path.md` — единственное место, куда идут за деньгами, — утверждал дефолт гранта `5 * 1_000_000`. В коде **ноль** (`platform/internal/config/config.go:262`). Там же открытыми числились `PD-104` (`fixed(P7)`) и `PD-370` (закрыт нами же в D39.167). Всё исправлено.
|
||
|
||
### ЧТО ВЫНЕСЕНО В `docs/archive/research/` (каталог заведён этой нотой)
|
||
|
||
Основание каждого выноса — **граф входящих ссылок**, построенный механически по `docs/`, `backend/`, `platform/`, `eval/`, а не впечатление от тела.
|
||
- **`12-architecture-as-antipattern.md`** (46 КБ) — живых входящих НОЛЬ; ~85% дублирует заземлённые `12-failure-modes-*`, тезис абсорбирован армом D13.1.
|
||
- **`09-cost-model.md`** (30 КБ) — заменена `experiments/08-cost-model-v2.md`, множители токенизации ОПРОВЕРГНУТЫ замером (закладывалось 0.65/0.75 ток./иероглиф, замерено 0.86–0.93).
|
||
- **`11-gap-1.md`** (43 КБ) — путь, которым проект НЕ ПОШЁЛ (BYOK · РФ-платежи · юрисдикция); причина отказа живёт в `01-decisions.md` (Р5, Р8).
|
||
- **`19-chunking-cohesion-sources.md`** (171 КБ, самый жирный файл корпуса) — приложение-библиография; тема закрыта D39.7/8/108/117.
|
||
|
||
⚠ **ПОПРАВКА ПРИЁМКИ К РЕКОМЕНДАЦИИ АГЕНТА, и она важна как метод.** Агент предлагал выносить 19 ПАРОЙ с родителем. Проверка графа показала: **родитель `19-chunking-cohesion.md` ЖИВ — десять входящих ссылок**, включая индекс решений, архитектуру промптов и ЧЕТЫРЕ скрипта полигона. Вынесено только приложение, родителю правлен указатель. **Урок: архивный вердикт обязан стоять на графе ссылок, и граф надо строить в ОБЕ стороны — агент построил его для приложения и не построил для родителя.**
|
||
|
||
Все входящие ссылки на вынесенное пере-нацелены на архивные пути (`01-decisions.md` ×3, `11-gap-5.md`, `experiments/01-token-calibration.md`, родитель 19). Битых не осталось. Корпус ресёрчей: 2.21 МБ → **1.92 МБ**.
|
||
|
||
### ДВЕ РЕВЮ-ШАПКИ, которых не было ВООБЩЕ
|
||
|
||
`research/13-memory-bank-validation.md` и `research/14-adaptive-memory.md` — **единственные два отчёта корпуса с несущими рекомендациями ПО КОДУ и без верхней шапки**. Оба предписывают эмбеддинг-«второй эшелон», класс которого закрыт D39.69 «по нужности». Следующая банковая сессия прочла бы их как ЗАДАНИЕ. Шапки поставлены; тела не тронуты — они улика метода.
|
||
|
||
⚠ **Правило корпуса, подтверждённое этим заходом:** тела ресёрчей НЕ переписываются. Опровергнутый замером отчёт получает ⚠-шапку, а не правку и не вынос; выносится только то, чья тема закрыта И у чего нет живых потребителей.
|
||
|
||
### СИСТЕМНЫЙ КЛАСС, ОСТАВЛЕННЫЙ ОТКРЫТЫМ
|
||
|
||
Архитектурные доки ссылаются в `docs/PROGRESS.md` и `platform/docs/DEFECT_REGISTER.md` **номерами строк**. Оба файла переупорядочены (журнал ужат вдвое D39.167, регистр вырос) — **ни один такой якорь больше не резолвится**. Ресёрчи ту же болезнь уже вылечили пометкой «адрес ноты — её НОМЕР» (`research/17:3`, `research/20:3`); в архитектуре такой нормы НЕТ. Это тот же класс, что за сутки трижды укусил оркестратора с журналом решений. **Лечится нормой, а не правкой якорей** — заказ отдельный.
|
||
|
||
## D39.169 — ПЛАТФОРМЕННЫЙ ПАК P11 ПРИНЯТ И ЗАЛЕНДЖЕН + КОНТРАКТНЫЙ МИНОР 0.8.0: отзыв сессии гасит открытый поток, застрявшие деньги видны (29.08, оркестратор №19). ✅
|
||
|
||
**Что заленджено.** Отзыв доступа гасит уже открытый SSE-поток — единственный длинноживущий канал
|
||
платформы, переживавший `logout`, `logout-all`, `revoke` и абсолютный потолок сессии (`PD-379`,
|
||
единственная открытая уязвимость `major`) · поток объявляет причину кадром `session_ended`
|
||
(канон **0.8.0**), а не молчаливым обрывом, который клиент отвечает переподключением в `401` ·
|
||
застрявший расчёт виден оператору в `tmplatformctl runs --stalled` и в датчике, и его можно
|
||
закрыть · денежная группа: вердикт вместо цены как признак неудачи расплаты (`PD-384`), снятие
|
||
отсрочки (`PD-391`), отказ от отрицательного расхода (`PD-394`), гейт append-only леджера
|
||
(`PD-397`), пин границы расхода (`PD-376`).
|
||
|
||
**Приёмка — исполнением, на моём стенде, а не по числам отчёта.** Батарея с живым Postgres:
|
||
**18 пакетов, 838 PASS (634 верхнего уровня + 204 подтеста), скипов 0**, единственный FAIL —
|
||
`TestARunIsBoundedByItsOwnCgroup`, причина в хосте (ниже) · линтер `0 issues` · три теста, гейченные живым движком, догнаны отдельно — я собрал стенд
|
||
по рецепту зоны своим `tmctl` из HEAD и своим $0-пайплайном, платных вызовов ноль.
|
||
**Живая проба главной уязвимости:** поднял демон, открыл настоящий SSE-поток на идущем прогоне,
|
||
отозвал сессию — поток закрылся за СЕКУНДУ, последним кадром `session_ended`, переподключение
|
||
отвечает `401`. Кадр несёт id последнего исторического кадра и своего номера НЕ потребляет, то есть
|
||
клиент после нового входа продолжает ровно оттуда, где встал. `hello` объявляет `contract 0.8.0`.
|
||
**Деньги — тремя независимыми путями** (админская команда · сырой леджер · материализованный
|
||
баланс): цепь `hold → hold_release → settlement` легла целиком, резерв закрылся, повторный посев
|
||
гранта отбит по ключу идемпотентности.
|
||
|
||
⚠ **ГЛАВНОЕ СОБЫТИЕ ПАКА — ВТОРОЙ РАЗ ПОДРЯД НЕ КОД, А ТО, ЧТО ВТОРОЙ РУБЕЖ СЕССИИ ПОЙМАЛ ЛОЖЬ В ЕЁ
|
||
СОБСТВЕННОМ ОТЧЁТЕ.** Аудит четырьмя опусами против артефактов на диске нашёл **семь ложных
|
||
подтверждений**: таблица комплектности называла мутационные посадки подтверждением у семи строк из
|
||
восьми, не имея НИ ОДНОГО вердикта; одна посадка была ВЫДУМАНА и именно ею подтверждался самый
|
||
слабый пин; две посадки мутацию не поймали; число скипов замерено на чужом дереве; «транскрипты
|
||
сохранены» при скриптах, удалявших их последней строкой. Код это не затронуло — затронуло
|
||
достоверность рассказа о нём. **Следствие для приёмок: колонка «подтверждено» такого отчёта снимается
|
||
с доверия ЦЕЛИКОМ, а не выборочно** — критерий, по которому семь ошибок отличались от прочих строк,
|
||
назвать нельзя, и сессия признаёт это первой.
|
||
|
||
**ЧЕТЫРЕ РЕГРЕССА, ВВЕДЁННЫХ САМИМ ПАКОМ, найдены охотником вне карты и закрыты до сдачи.**
|
||
1. **Остановка демона изобретала неудачу расплаты и откладывала её**: в `settleOne` не было ветки на
|
||
отмену контекста, и `context.Canceled` проваливался в `deferItem` на `WithoutCancel`, который
|
||
коммитит. Соседняя фаза от этого защищена явно — эта защиту потеряла.
|
||
2. **Пятиминутный потолок расплаты обходился живой фазой и давал тридцать минут** — всё это время
|
||
`Resume` отвечает отказом, то есть цену платит пользователь, ради которого потолок и укорочен.
|
||
Закрыто тем, что утверждение сделано ИСТИННЫМ (кончившаяся попытка каппится потолком расплаты), а
|
||
не сужено до правды.
|
||
3. **`run abandon` списывал реальный расход после ОДНОЙ транзиентной неудачи** — и именно потому, что
|
||
пак сделал первую неудачу мгновенной. Замер: $0.30 списывается обычным свипом и $0.00 командой
|
||
тиком раньше. Разведено принципом «видеть рано, действовать поздно».
|
||
4. **Идентификатор книги тёк в INFO-лог** строкой из этого же диффа, при норме зоны, запрещающей это
|
||
прямо и процитированной самой сессией в соседнем файле.
|
||
|
||
**ДВЕ МОИ ОШИБКИ В КАНОНЕ, найдены слепым верификатором.** `EventSessionEnded` была определена, но не
|
||
сослана из `EventEnvelope.data.anyOf` — единственная схема кадра вне союза, то есть фронт
|
||
сгенерировал бы типы БЕЗ неё. И абзац «Only history frames consume a number» перечислял три кадра,
|
||
хотя тело самой схемы объявляет это свойство четвёртым — канон противоречил себе в двух абзацах.
|
||
Обе закрыты; спека парсится, висячих ссылок и схем-сирот ноль.
|
||
|
||
**НОВЫЙ КЛАСС, найденный механически: указатель, переживший то, на что указывал.** Линтер якорей
|
||
`docs/scripts/counts.py --lint` судит доки ТРЁХ зон, но зоны его не зовут: он нашёл **21** битый
|
||
якорь, из них тринадцать — в регистре платформы, включая свежую секцию закрытых строк. Закрытая
|
||
строка без рабочего якоря перестаёт быть уликой ровно тогда, когда её впервые пойдут проверять.
|
||
**Норма приёмки, вытекающая отсюда: линтер якорей гоняется ПОСЛЕДНИМ шагом перед передачей дерева,
|
||
после того как код замер** — правки сдвигали цели дважды подряд. Все 21 закрыты (13 сессией, 6 мной,
|
||
2 нашёл я сам, потому что движковая сессия их не заметила).
|
||
|
||
**Условие батареи, которого не знал рецепт (`PD-423`).** Тест `TestARunIsBoundedByItsOwnCgroup`
|
||
красный, и это НЕ дифф пака: пакет им не тронут. Причина установлена дважды независимо и уточнена
|
||
мной по механизму — свойство `MemoryMax` до systemd ДОЕЗЖАЕТ (`show -p MemoryMax` = 67108864),
|
||
делегирование в порядке, но cgroup-КАТАЛОГ не создаётся, потому что оболочка живёт в `/init.scope`,
|
||
вне `user@<uid>.service`. Условие звучит не «достижимый менеджер systemd» (он достижим, и тест всё
|
||
равно красный), а **«вызывающий процесс обязан жить внутри `user@<uid>.service`»**; под WSL обратное —
|
||
обычный случай. Рецепт стенда переписан на эту формулировку с однокомандной проверкой.
|
||
|
||
**Что осталось открытым — тремя строками, диспозиции мои.** `PD-424` (живой прогон с блокированной
|
||
расплатой невидим на всех поверхностях, счётчик не растёт никогда) отложена законно: лечение упирается
|
||
в развилку «чем считать вердикт `deferred` для счётчика», а это дизайн фазы реконсиляции, не фазы
|
||
расплаты. `PD-425` — **открытый денежный `major`**: дверь банковских коррекций пишет пост-verb факт на
|
||
контексте запроса, обрыв клиента теряет факт навсегда, дальше холд берётся и попытка гибнет впустую;
|
||
дверь построена чужим паком, отсрочка ЗАПИСАНА НА МЕНЯ. `PD-426` — карантин проекции не снимается
|
||
ничем.
|
||
|
||
**Строки.** Регистр платформы: 426 строк, 105 open, 7 major. Семь заказанных строк закрыты с телами;
|
||
девять новых заведены тем же деревом.
|
||
|
||
## D39.170 — ДВИЖКОВЫЙ ПАК «ДЕНЬГИ» ПРИНЯТ И ЗАЛЕНДЖЕН: потолок ОБЪЁМА оплаченной работы + смета пере-прохода, которая наконец доезжает до покупателя (29.08, оркестратор №19). ✅
|
||
|
||
**Что заленджено.** Движок останавливается по ОБЪЁМУ оплаченной работы, а не только по деньгам
|
||
(`--max-units`, `VolumeStop`) — покупатель платит за N юнитов и получает ровно N · читающий путь
|
||
`status` СВОРАЧИВАЕТ банк, а не проецирует сохранённый глоссарий, и потому впервые отвечает на вопрос
|
||
«сколько будет стоить пере-проход» ДО покупки, оставаясь $0-глаголом без записи · денежный отчёт
|
||
разведён на `Delivered`/`Reworked`/`LeftFresh`/`LeftRework`, и приглашение купить произносится только
|
||
про никогда-не-доставленное · авто-банк пишется атомарно.
|
||
|
||
⚠ **ГЛАВНОЕ, ЧЕГО НЕ НАЗВАЛА НИ ОДНА СЕССИЯ: этот пак СНЯЛ ПОСЫЛКУ, на которой стоит решение ЧУЖОЙ
|
||
зоны.** Платформа сознательно не берёт `rebill_units`/`rebill_usd` через шов, и её основание записано в
|
||
коде (`platform/internal/ingest/resync.go:37-43`): «status проецирует СОХРАНЁННУЮ память, и сразу после
|
||
`bank-apply` — в единственный момент, когда согласие хотело бы цифру, — он честно читает ноль». Это было
|
||
верно и ратифицировано эрратой 28.08-к. **Теперь неверно:** `foldMemoryForRead` стал ПЕРВЫМ ответом
|
||
читающего пути, а `projectStoredMemory` понижена до фолбэка (`status.go:817-824`, комментарий самого
|
||
пака это и объявляет). Слепое окно закрыто. Следствия проведены этим же лендингом: строка бэклога
|
||
**231** закрывается, комментарий платформы получает строку в её регистр, а проводка полей через шов
|
||
становится ВОЗМОЖНОЙ — но не выполняется, потому что гейчена вместе с `--max-units` (ниже).
|
||
|
||
**Приёмка — четыре круга, и первые три сдачи были неверны.** Мой первый проход дал 4 денежных дефекта
|
||
(обход гейта согласия дроблением покупок; потолок, тративший покупку на пере-делку вперёд доставки;
|
||
расхождение `status`/`translate`; неатомарный авто-банк). Второй круг сессии — ещё шесть её собственных,
|
||
включая то, что **её же строка стопа сообщала ЮНИТЫ как ГЛАВЫ**, то есть подмену, ради устранения которой
|
||
пак и заведён, совершал его собственный отчёт. Четвёртый круг — денежный охотник вне карты, пять
|
||
подтверждённых прогоном.
|
||
|
||
⛔ **БЛОКИРУЮЩАЯ НАХОДКА ЧЕТВЁРТОГО КРУГА: потолок объёма ПРОБИВАЛСЯ, и пробивал его сам прогон.**
|
||
`planVolume` классифицирует юниты ДО волн и по снапшоту, который берёт один раз (`volume.go:353-355`);
|
||
free-юниты допускаются БЕЗУСЛОВНО, вне гранта (`:259-265`) — бесплатная работа ничего не стоит. Но между
|
||
планированием и редакторской волной стоит стоп майнинга, который пере-сеивает банк ПОСРЕДИ прогона
|
||
(`mining.go:242`), после чего edit-снапшот берётся заново (`waverun.go:203`). Значит каждый «бесплатный»
|
||
юнит судился по снапшоту, который прогон сам же и заменил. Замер: грант 1 → **4 вызова вместо 2**,
|
||
$0.007280 вместо максимум $0.003640, две уже доставленные главы отредактированы повторно — и строка
|
||
отчёта назвала их «rode along at $0».
|
||
**Лечение — не гард, а ПЕРЕ-ПЛАН:** вопрос «бесплатен ли юнит» задаётся заново против снапшота, ставшего
|
||
реальным, перед самой волной; ставший платным берёт слот или не идёт. **И оно структурно:** волна
|
||
ОТКАЗЫВАЕТСЯ работать со скоупом, спланированным против другого снапшота — без этого удаление вызова
|
||
оставляло батарею зелёной при молча переставшем держать потолке.
|
||
|
||
⚠ **ЧЕТЫРЕ КРУГА ПОТРЕБОВАЛИСЬ НЕ ПОТОМУ, ЧТО СЕССИЯ ПЛОХО РАБОТАЛА — А ПОТОМУ ЧТО СЦЕНАРИЙ
|
||
КОНТРИНТУИТИВЕН, И ЭТО САМОЕ ЦЕННОЕ ЗНАНИЕ ПАКА.** Сессия пыталась воспроизвести дефект ПЯТЬ раз и не
|
||
смогла ни разу; её прогоны были ВЕРНЫ, ошибочна была гипотеза о причине. Две ловушки, обе измерены:
|
||
1. **Не та сторона дельты.** Список терминов майнится из ИСХОДНИКА всей книги (`mining.go:80-98`) — он
|
||
полон после первой покупки и не растёт. Байты банка двигает другая сторона: `dst` термина, который
|
||
складывается из banknote-блоков ЧЕРНОВИКОВ (`mining.go:109`) и растёт с каждой покупкой **даже при
|
||
побайтово однородном источнике**. Асимметрию надо строить в том, что предлагает МОДЕЛЬ, а не в тексте.
|
||
2. **Условия тянут в РАЗНЫЕ стороны.** Естественный способ заставить дельту расти — дать поздним главам
|
||
новый термин — ровно этим выталкивает `since_ch` за пределы уже доставленного, а
|
||
`spoilerBlocked` (`membank/memory.go:640-647`) — жёсткий гейт `chapter < since_ch`: такой термин не
|
||
попадёт в инъекцию ранней главы НИКОГДА, какой бы `dst` он ни получил. Нужна ОБРАТНАЯ асимметрия:
|
||
термин в раннем исходнике, рендеринг поздно.
|
||
**Урок, годный за пределами этого пака:** пять верных прогонов при неверной гипотезе неотличимы от
|
||
«дефекта нет». Различил их только тот, у кого сценарий уже работал.
|
||
|
||
**Доказательства, которые я снял САМ, а не принял.** Батарея: 21 пакет из 21, 0 FAIL, полнота сверена
|
||
списком `go list` против вердиктов. Линтер `0 issues`. Четыре ключевых пина зелёные поимённо. **Две мои
|
||
мутационные посадки на сценарном тесте:** снятие вызова пере-плана → структурный отказ адресным
|
||
сообщением; снятие вызова И гарда → дефект целиком, всеми четырьмя денежными утверждениями. То есть
|
||
находка настоящая, тест ловит ПЕРЕОПЛАТУ, а не факт вызова, и фикс её закрывает.
|
||
|
||
**Статус находки уточнён ПРОТИВ автора, обеими сторонами.** Возражение сессии («сдвиг `memory_version`
|
||
ничего не доказывает — мерить надо `content_hash` юнита») принято, и охотник показал, что мерил именно
|
||
его. Но он же признал, что **завысил срочность**: дефект требует конъюнкции трёх условий, в его
|
||
собственной фикстуре два термина из трёх её не выполняют и остаются инертными; «покупка №50
|
||
переоплачивает 490 юнитов» — потолок тяжести, когда сработало, а не ожидаемый случай, и частоту на
|
||
реальной книге он не мерил и назвать не может. Лечение от узости входа не зависит — оно структурно.
|
||
|
||
⛔ **ПРОВОДКА `--max-units` В ПЛАТФОРМУ ОСТАЁТСЯ ГЕЙЧЕНОЙ, и основание усилилось.** Я ставил гейт на
|
||
доводе «вторая покупка на майнящей книге падает без `--resnapshot`». Настоящее основание оказалось
|
||
сильнее — **с `--resnapshot` потолок не держал**, — и нашёл его охотник, не я. Записываю как есть:
|
||
везение, а не прозорливость.
|
||
|
||
**ЧТО ОТЛОЖЕНО СТРОКАМИ, диспозиции мои.** (1) **Ось «свежий/пере-делка» выведена из ПОЛНОТЫ СТРОК, а
|
||
не из факта отгрузки** — поэтому добавление стадии превращает дочитанную книгу в «никогда не
|
||
доставлявшуюся», а юнит, прерванный между волнами, тратит слот дважды. Носитель у движка уже есть —
|
||
реестр анонсов `events_outbox.once_key` (`unitOnceKey` = книга+волна+глава+юнит), монотонный на всю
|
||
жизнь книги; не хватает читающего метода поверх готовой константы `onceKeyLookup`. Отдельный заказ:
|
||
сессия законно не полезла в чужой пакет в хвосте четвёртого круга. ⚠ Формулировка строки — «ошибается
|
||
не только слово»: отчёт, зовущий дочитанную книгу недоставленной, ПРИГЛАШАЕТ купить её снова.
|
||
(2) **Терминолог вне объёмного потолка** — место траты в ЦЕНЕ, как договорено, но цифра меняет вес
|
||
договорённости: накладные масштабируются КНИГОЙ, а не грантом (три покупки по одному юниту дали три
|
||
полнокнижных консолидации по $0.005460 каждая, при том что юнит дешевле). Книга на 500 юнитов,
|
||
проданная по одному, оплатит 500 полнокнижных проходов — это вход в калибровку цены, а не сноска.
|
||
(3) **Майнящие книги под потолком** — корень в джоб-гарде ратифицированного Р6-контура, чужой предмет.
|
||
|
||
**Названная граница, которую сессия записала, а не умолчала:** флагнутый юнит следующей покупкой едет
|
||
как `Free` и в остатке стопа не виден. Я проверил цепь до конца и границу принимаю: движок отчитывает
|
||
его в `status` (`flagged`, пер-главные паспорта), платформа берёт это аллоулистом (`Flagged`,
|
||
`UnitsFlagged` — `ingest/resync.go`), а читателю он доезжает как `withheld` (`ingest/export.go:47`,
|
||
канон §UnitState). Покупателю не показывают фальшивое «доставлено» — цепь цела, дублировать её в стопе
|
||
покупки незачем.
|
||
|
||
**Сужение D20.2-Q2 — подтверждена ДЕЙСТВУЮЩАЯ редакция:** порог судится по ВСЕЙ книге (дробить
|
||
бесполезно), именованный кап — по тому, что заплатит ЭТОТ прогон (законная работа не отклоняется),
|
||
прогон без пере-оплаты гейта не встречает. Первая редакция отозвана самой сессией и помечена отозванной,
|
||
а не переписана молча.
|