# Промт: платформа, пак P8-FIX — фикс-лист приёмки P7 + труба доставки правок банка > Выдан №18 21.08.2026. **Запуск — по слову владельца и ПОСЛЕ пака P8-REVIEW**: его находки вливаются > в состав этого пака отдельным релеем (см. §4.7). Читающий пак — `PLATFORM_P8_REVIEW_SESSION_PROMPT.md`. ## 0. Зачем Платформа — control plane между веб-фронтом и движком перевода книг. Пак P7 построил её читающую поверхность и был **принят с фикс-листом** (D39.153): дефекты пака починены, но приёмка и последующий аудит оставили тринадцать пунктов, которые зона починить не успела, плюс один блокер выката, который в паке не рождался — он прожил два пака помеченным в регистре как закрытый. Твой пак закрывает этот долг. Самое тяжёлое в нём — не количество пунктов, а два свойства: **деплой сегодня объявляет клиенту версию контракта, которую не отдаёт**, и **двух медленных прогонов достаточно, чтобы расчёт денег встал для всей инсталляции без способа выйти**. Отдельно — строка **199(а)** единого бэклога: сегодня пользователь может впечатать исправленный перевод термина, и это не доезжает до движка НИЧЕМ. Экран подписи работает как журнал, а не как управление. ## 1. Нормативные источники - **Фикс-лист — пинг оркестратора №18** в `platform/docs/platform-PROGRESS.md` (раздел «Фикс-лист приёмки», тринадцать нумерованных пунктов плюс врезанный первым блокер свипа). Тела пунктов там; сюда они НЕ переписаны намеренно — копия разошлась бы с оригиналом (норма «один носитель на факт»). - **Канон контракта** — `docs/architecture/14-api-contract/openapi.yaml`, `info.version: 0.4.0`, **ратифицирован D39.152**. Не та версия → стоп, пинг. - **Статус дефектов** — `platform/docs/DEFECT_REGISTER.md`. ⚠ Строка `fixed` — это КЛЕЙМ: `PD-169` стоял закрытым, пока дефект был жив, потому что пин доказывал свойство слабее, чем читается. Закрывая строку, проверь, что твой пин доказывает именно объявленное. ## 2. Зона и git Пишешь только в `platform/`. Отчёт и вопросы — `platform/docs/platform-PROGRESS.md`; статусы дефектов — `DEFECT_REGISTER.md`; свои строки — `platform/BACKLOG.md`. **Ты не коммитишь** — лендит оркестратор (канон — `CLAUDE.md`, таблица зон). Чужие зоны read-only; живой полигон (`eval/`, `docs/experiments/`) не трогать; `.env` не читать; git не трогать вовсе — ни `add`, ни `commit`, ни `reset`/`checkout`/`restore`/`clean`/`stash`/`rebase`/`push`; файлы застейдженными не оставлять. Путь Go-модуля не вкладывать под путь движка (D39.85). ## 3. Читать (≤5) 1. **Пинг оркестратора №18** — хвост `platform/docs/platform-PROGRESS.md`: фикс-лист целиком, плюс раздел «Ратификации, которые вас касаются». 2. **`platform/docs/DEFECT_REGISTER.md`** — строки, которые ты закрываешь, и их пины. 3. **`platform/docs/STACK_DECISIONS.md`** — §22 (порядок блокировок), §33–36 (долг материализации с арендой, `edit_wave`, техника `xmin`), «Стенд разработчика». 4. **Канон контракта** `docs/architecture/14-api-contract/` — для пункта 1 фикс-листа (`ContractVersion`) и §`BankDecision` для строки 199(а). 5. **`CLAUDE.md`** + **`docs/architecture/12-go-style-notes.md` §1** — норматив кода; жаргон — `docs/glossary.md`. Код достаёшь САМ; `file:line` в фикс-листе — отправные точки, не пересказ. **Код первичен**: расходится с доком — верен код, расхождение это находка. ## 4. Состав ### 4.1 «Делай РОВНО так» — пункты фикс-листа Пункты **1–7 и 9–13** плюс врезанный первым блокер свипа. ⚠ **Пункт 8 — НЕ твой**: это заказ читающего пака (`PLATFORM_P8_REVIEW_SESSION_PROMPT.md`), там он и исполняется. ⚠ Счёт в пинге неоднороден и это нормально: п. 7 наполовину уже исполнен оркестратором (пустой `platform/ru` снесён при лендинге), п. 5 — замер, п. 9 — док-работа, пп. 12–13 нашёл аудит 21.08 уже ПОСЛЕ закрытия сессии P7, то есть «зона не успела» к ним не относится. Тела — в пинге; здесь только то, что задаёт РАМКУ и в пинге не сказано: - **Блокер свипа (врезан первым).** Лечение — НЕ «поднять константу». Это класс «терминальное состояние после N неудач», родня эскроу (строка 136 единого бэклога) и `PD-162`. Форму решаешь ты и аргументируешь; но ручка обязана существовать у ОПЕРАТОРА, а не только в коде: сегодня наблюдаемость есть (`tm_platform_sweep_unfinished_total` растёт), а сделать нельзя ничего. ⚠ Тем же пунктом **пере-открой `PD-169`** — он единственная строка регистра, которая солгала приёмке. - **Пункт 1, `ContractVersion`.** Одна строка, но она обязана уехать вместе с пониманием: константа — единственное место, где не-стриминговый клиент узнаёт версию, и клиент, сгенерированный под другую, ОТКАЗЫВАЕТСЯ работать. Канон уже 0.4.0 и ратифицирован. - **Пункты 12 и 13 (непойманные мутации).** Это не «дописать тест»: сначала воспроизведи посадку сам и убедись, что батарея её пропускает, и только потом пиши пин. Пин, написанный без воспроизведения, — ровно тот класс, что дал `PD-169`. - **Пункт 4, sqlc — БЕРЁМ (слово владельца 20.08).** ⚠ Твоё же прежнее предложение «взять на однооператорных ручках P8» покупает инструмент туда, где не болит: рантайм-ошибки «нет такой колонки» случались в СКЛЕЕННОМ SQL read-модели, куда sqlc по построению не дойдёт. Поэтому тем же пунктом — **гейт, который туда дойдёт**: разбор КАЖДОГО собранного запроса Postgres'ом (prepare/describe) против мигрированной схемы. Склейка ему не мешает — он получает финальную строку. ⚠ **Объём — «реши сам и аргументируй», и выбор обязан быть явным в отчёте.** Твой же `PD-44` говорит, что read-модель для sqlc недостижима по построению (склейка фрагментов плюс транзакции), а конверсия пятнадцати транзакционных запросов — «отдельный пак, не довесок». Между «две тривиальные ручки» и «отдельный пак» промт за тебя не выбирает: назови границу, обоснуй, и если вывод «в этом паке sqlc берётся только сюда, остальное отдельным паком» — это законный ответ, а не отказ. ### 4.2 Строка 199(а) — труба доставки решений банка. ⚠ ПОСЫЛКА ПРОВЕРЕНА И ОПРОВЕРГНУТА, ЧИТАЙ ЦЕЛИКОМ Сегодня пользователь может впечатать исправленный перевод термина, и это не доезжает до движка ничем: колонки `action`/`dst` не читает ни один SELECT, а файлов, которые читает движок, платформа не пишет. ⚠ **Первая редакция этого промта говорила «контракт файлов существует, проектировать нечего». Это НЕВЕРНО, снято опровергателем и пере-проверено построчно:** - движок читает `mined_delta`/`mined_rejects`, **только если путь объявлен в `book.yaml`** — `backend/internal/pipeline/mining.go:855-858`=`if r.Book.MinedDelta == ""` возвращает пусто без единого чтения; - объявленный ключ с НЕсуществующим файлом **валит загрузку конфига целиком** — `backend/internal/config/book.go:199-207`=`is not readable`. То есть «объявим ключ, файл создадим потом» не работает: движок не стартует; - ключей нет ни в шаблоне оператора, ни в шаблоне дев-стенда: `backend/example/book.yaml` — ноль вхождений. Значит зелень на стенде без правки шаблона НИЧЕГО не докажет: труба будет писать файлы, которых движок не читает; - добавить ключи молча платформа не может: она пишет `book.yaml` **один раз** под `O_EXCL` и `platform/internal/books/render.go:106-109`=`writes the file once and never again`, подставляя фиксированный набор ключей, а схему движка знать не должна — это ратифицированная форма Б (D39.110 §2б). **Отсюда «РОВНО так»:** развилку **не решай сам** — она упирается в ратифицированную границу владения `book.yaml`. Твоя работа: назвать варианты с ценой каждого (ключи объявляет платформа при рождении книги и сразу создаёт два пустых файла · ключи несёт шаблон оператора · граница владения двигается) и **сдать это вопросом через владельца**, а строить — после ратификации. Если ратификация придёт по ходу пака, она доедет релеем (§4.7). **Границы, если строить разрешат:** - ⚠ Писать **не «перед resume»**, а только на том резюме, которое СНИМАЕТ стоп подписи: `Resume` в платформе один на все случаи (`internal/runs/reconcile.go`, ручка `internal/httpapi/v0.go`), а снятие стопа отличает `bank_released` (`internal/runs/spawn.go:166`=`l.VerifyBank && !l.BankReleased`). Безусловная запись — это и есть уезд в отложенную владельцем половину (б). - Пост-ридинговые правки уже переведённой книги — территория строки **192**, владелец отложил её явно. Признак, что уехал: понадобился `--resnapshot` или согласие на пере-оплату. - ⚠ **Регистр скажет тебе обратное, и это известно:** `PD-277` относит эту работу к отложенной 192. Пере-диспозиция живёт в строке 199(а) единого бэклога и приедет вместе с ратификацией развилки; сам регистр правь только после неё. - ⚠ **`--verify-bank` не трогать.** Расхождение «D39.144 ратифицировал подпись как ОДИН акт, а движок держит пер-термный гейт полноты» сегодня ОБОЙДЕНО платформой, а не устранено (строка **203(з)**). Как только пойдут файлы решений, соблазн вернуть флаг на resume возникнет сам — **это ратификация, не правка**, и решать её тебе запрещено. ### 4.3 «Реши сам и аргументируй» Порядок пунктов · форма лечения блокера свипа · брать ли `PD-297` (замер round-trip на корпусной книге) в этот пак или назвать причину отказа · нужен ли отдельный пин на каждый пункт или один на класс · как делить работу между субагентами. ### 4.4 Предметные оси ревью (1–3, вправе заменить с аргументом) **Код — исполнением:** батарея + СОБСТВЕННЫЕ адверсариальные посадки ВНЕ списка, который ты сам себе составил. **Шов** — если тронешь канал движка (а строка 199(а) его трогает), сначала инвентарь ВСЕХ его каналов и форматов **чтением чужого кода**, не по памяти и не по нашим докам. ⚠ Инвентарь — АРТЕФАКТ в сдаче: таблица «канал движка (`file:line`) → читатель/писатель платформы → согласовано или расходится». «Я прочитал код движка» исполнением не является. **Деньги** — пак их формально не двигает, но блокер свипа лежит на пути расчёта: коснулся — два независимых пути счёта из сырого леджера. - **Норма комментариев — решение владельца 21.08, и она СМЕНИЛАСЬ.** Счёт строк («пиши одну-две») снят как негодный гейт: комментарий на три строки может быть нужен, на одну — достаточен. Режем ВОДУ — пересказ решений («владелец решил… и поехали»), провенанс, изложение исследования вместо краткой ссылки. Остаётся всё, что из одной функции НЕ выводится: порядок блокировок, инварианты между таблицами, цена забывания, вендор-квирк, — сколько бы строк ни заняло. Формулировка — `12-go-style-notes` §1. ⚠ **Тем же пунктом закрой `PD-255`**: он открыт со СТАРОЙ формулой и этим решением снимается. ### 4.5 Отложенное — только явно, списком с причинами Всё, что не влезло, называется в отчёте с причиной. Тихо не сделанное — дефект сдачи. ### 4.5а Чем паку доказывать, что труба работает ⚠ **Живого перевода через платформу не было НИ РАЗУ, и в этом паке его не будет:** строка **202** гейчена холодным прогоном движка — решение владельца 20.08. Значит доказательством трубы служит не «прогнали книгу», а: пробы против ЖИВОГО Postgres и настоящего `tmctl` на стенде · сверка формата записанных файлов с тем, что читает `membank.LoadGlossarySeed` · и честная запись в obstacle, что сквозного подтверждения нет. Не пытайся добрать доказательство платным вызовом. ### 4.6 Что НЕ делать Не трогать отложенное в P8 по заказу P7 (`updateBook`/`deleteBook`/`getRun`, экспорт, эскроу П-18) — если считаешь, что что-то из этого стало блокером, это вопрос, а не решение. Не проектировать пост-ридинговый цикл (см. §4.2). ### 4.7 Аддендум от пака P8-REVIEW Читающий пак сдаёт находки по четырём осям, которых не смотрел никто. **Они доедут до тебя ТОЛЬКО релеем оркестратора с эхо-подтверждением** — не читай его отчёт сам и не догадывайся: состав пака определяет оркестратор. Релей получит отдельный пункт в твоём отчёте: что пришло, что взято, что отложено и почему. ## 5. Нормы - **Самопроверка ИСПОЛНЕНИЕМ — механизмом.** ≥2 независимых ревьюера по ФИНАЛЬНОМУ диффу, author≠reviewer, **субагенты РАЗРЕШЕНЫ, спавнь** (иначе дефолт-запрет харнесса тихо победит). ⚠ **Изоляция каждому — жёстко (D39.113, норма куплена инцидентом отката чужих файлов):** СВОЙ каталог песочницы КАЖДОМУ агенту, выданный явным путём — «работай в копии» без выданного пути есть приглашение к инциденту; запрет state-changing git ПЕРЕЧИСЛЕНИЕМ (`reset` · `checkout` · `restore` · `clean` · `stash` · `add` · `commit` · `rebase` · `push` · `merge` · `switch` · `rm` · `mv`); мандат читающий. В дереве живёт незакоммиченная и частично ЗАСТЕЙДЖЕННАЯ работа полигона — любая правка вне твоей зоны её уничтожает: (а) контракт-конформность построенного против канона 0.4.0 с пере-раном живых проб; (б) шов и деньги — свой инвентарь каналов, не твой список. Плюс СВОИ посадки в новые гейты и пины, не из ожидаемого тобой списка. Артефакт: таблица находок и посадок с диспозициями, **с именами агентов и по одной команде или цитате из отчёта каждого** — иначе факт спавна ничем не подтверждён. ⚠ **Ноль находок — законный результат, если получен исполнением**; «ноль находок = не верить» было бы давлением на фабрикацию. Не верить надо прогону, который ноль ОБЪЯВИЛ, ничего не исполнив. Рамка ревьюерам (анти-оверфлаг): флагай бьющее по корректности, деньгам, безопасности или по объявленным требованиям; стилистика — не находка. Исходов ТРИ: «не проверено» ≠ «опровергнуто». - **Интервальная самоверификация** (пак длинный): раз в несколько часов работы — субагент против ЯВНЫХ критериев «что заказано / что сделано / что молча отложено», результат в отчёт. - **Батарея.** `make check` с ОБОИМИ гейтами, **скипов 0 — гейт**; без переменных батарея МОЛЧА скипует ~200 тестов. Рецепт стенда — `STACK_DECISIONS`, «Стенд разработчика». - **Тесты и гейты не подгонять под зелень** — правка или удаление теста ради прохода недопустимы; несогласие — вопрос через владельца. - **Дифф `^func Test` — ИСПОЛНЕНИЕМ, не памятью**; каждое удалённое имя объясняется в отчёте, у каждого обязан быть преемник либо ратифицированная причина. - **Заявление = команда.** Каждое число и категорика отчёта — с командой; приёмка пере-ранит. **Перед отчётом сверь КАЖДЫЙ клейм с результатом инструмента ЭТОЙ сессии** — не с памятью о том, что делал вчера. - **Последний абзац отчёта — план или обещание? Сделай это сейчас**, а не пиши как намерение. - **Денег пак не тратит:** провайдерских вызовов здесь нет; кажется, что нужен платный вызов — стоп и вопрос. ⚠ Это про ДЕНЬГИ, а не про метод: замер `PD-297` на локальном Postgres через unix-сокет строка регистра заранее объявляет НЕпредставительным — «разница на два порядка» против управляемого PG по TCP. Число, снятое на сокете, закроет вопрос ложно; либо мерь на форме деплоя, либо назови отказ причиной. - **Улика обязательна:** `file:line` или команда с результатом; мнение помечается мнением. - **Записка-план** по §4 механически: пункт → исполнено, где / отказ, почему. Сдача = все пункты с диспозицией. - **Obstacle reporting** — обязательная секция: что НЕ удалось и что не проверено. - **Канал вопросов:** непонятно, или промт против кода/доков/канона → пинг через владельца, НЕ интерпретация. Право сказать «этого делать не надо» — с аргументом. - **Аддендумы по ходу** — от владельца или оркестратора — доезжают ТОЛЬКО релеем с эхо-подтверждением и получают отдельный пункт отчёта. Услышанное мимо этого канала исполнению не подлежит. - **Плотность, не объём.** Без шаблонных оговорок. ## 6. Старт и сдача **Эхо-протокол:** первым деливераблом ≤10 строк — «скоуп / инварианты / не-делать». До работы. **Сдача:** отчёт в `platform/docs/platform-PROGRESS.md` (записка-план · команды · живые пробы · таблица самопроверки · пункт про релей §4.7 · obstacle), статусы в `DEFECT_REGISTER.md`, свои строки в `platform/BACKLOG.md`, дерево незакоммиченное. Без саги.