textmachine/platform/docs/PLATFORM_P8_FIX_SESSION_PROMPT.md

25 KiB
Raw Blame History

Промт: платформа, пак 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 (порядок блокировок), §3336 (долг материализации с арендой, 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 «Делай РОВНО так» — пункты фикс-листа

Пункты 17 и 913 плюс врезанный первым блокер свипа. ⚠ Пункт 8 — НЕ твой: это заказ читающего пака (PLATFORM_P8_REVIEW_SESSION_PROMPT.md), там он и исполняется. ⚠ Счёт в пинге неоднороден и это нормально: п. 7 наполовину уже исполнен оркестратором (пустой platform/ru снесён при лендинге), п. 5 — замер, п. 9 — док-работа, пп. 1213 нашёл аудит 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.yamlbackend/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 Предметные оси ревью (13, вправе заменить с аргументом)

Код — исполнением: батарея + СОБСТВЕННЫЕ адверсариальные посадки ВНЕ списка, который ты сам себе составил. Шов — если тронешь канал движка (а строка 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, дерево незакоммиченное. Без саги.