25 KiB
Промт: платформа, пак 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)
- Пинг оркестратора №18 — хвост
platform/docs/platform-PROGRESS.md: фикс-лист целиком, плюс раздел «Ратификации, которые вас касаются». platform/docs/DEFECT_REGISTER.md— строки, которые ты закрываешь, и их пины.platform/docs/STACK_DECISIONS.md— §22 (порядок блокировок), §33–36 (долг материализации с арендой,edit_wave, техникаxmin), «Стенд разработчика».- Канон контракта
docs/architecture/14-api-contract/— для пункта 1 фикс-листа (ContractVersion) и §BankDecisionдля строки 199(а). 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, дерево незакоммиченное. Без саги.