textmachine/docs/PLATFORM_OPERATIONS_SESSION_PROMPT.md

200 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Промт сессии: ПЛАТФОРМА — «пустить внутрь можно»
> **Роль:** платформа. **Зона записи:** `platform/`. Чужие зоны читаешь, не правишь; пинги и итоги —
> ЗОННЫЙ журнал `platform/docs/platform-PROGRESS.md` (в `docs/PROGRESS.md` не пишешь). **Не коммитишь**
> и не трогаешь индекс и историю: `CLAUDE.md`, §«Git-координация мультисессий». Дерево передаёшь
> оркестратору. **Обязательное пре-чтение:** `platform/docs/ENGINEERING_STANDARDS.md` — отступление = пинг.
## 1. Какая проблема и что решит твой результат
04.09 цикл замкнулся живьём: пользователь получил EPUB настоящего платного перевода через API. После
этого стратегическая ревизия нашла, что **пускать внутрь живого человека сегодня нельзя**, и причины
не в переводе:
· **Бэкапов нет ни у оплаченной работы, ни у денежного реестра.** Одна потеря диска — весь купленный
перевод всех пользователей и весь баланс кредитов, без возможности восстановить или доказать, кто
сколько платил. Из всех находок дня это единственная **без частичного исхода**.
· **У продукта ноль дверей.** Контракт объявляет токен для не-браузерного клиента и сам признаёт, что
выдать его нечем; живой цикл прошёл через `/auth/dev-login`, который **прод отказывается запускать**;
фронт заморожен.
· **Рантбук деплоя, исполненный дословно, даёт инстанс, отказывающий каждому прогону.**
· **Имя книги в выданном файле — исходноязычное**, и починить его пользователь не может.
**Результат:** после твоего пака — **вместе с райдером Р1 движкового пака** (правки банка едут в
system-промпт дословно) — внешнего пользователя можно пускать, не рискуя его работой и деньгами.
⚠ Твой пак ОДИН этого не даёт, и итог писать так нельзя: дыра в промпт живёт в зоне движка и заказана
параллельно.
## 2. Зона записи и git
См. шапку. Канон `docs/architecture/14-api-contract/**` **своей рукой НЕ правишь** — состав минора
выносишь в отчёт на ратификацию (как было в паке «закрыть цикл», и это сработало).
## 3. Карта чтения — ПЯТЬ позиций
1. `platform/docs/platform-PROGRESS.md` — секция «⚠ ПИНГ ОРКЕСТРАТОРА №22 (04.09, вечер)» и твой же
«ОТВЕТ НА ПИНГ №22»: ⚠ читай ЗАГОЛОВОК ответа буквально: «ЧЕТЫРЕ ЕЁ ПУНКТА ОКАЗАЛИСЬ ЧАСТИЧНО НЕВЕРНЫ», один опровергнут целиком (`PD-439`); «одиннадцать» там — число НАХОДОК, а не пунктов.
2. `docs/PROGRESS.md`, строки бэклога **269 · 270 · 274** — состав; и **282** (ложная подпись «Знаков»).
3. `platform/deploy/README.md` целиком — предмет блокера, и он же операторский носитель.
4. `platform/docs/DEFECT_REGISTER.md` — открытые ряды по теме: `PD-410`, `PD-218`, `PD-448`.
5. `docs/architecture/17-seam-inbound-law.md` — закон входной двери шва, если тронешь интейк.
**Код первичен.** Отправные точки: `cmd/tmplatformd/runner.go` (греп `markerArgv`), `internal/login/`,
`internal/books/books.go` (греп `type counter`), `internal/httpapi/v0.go`.
## 4. Состав — что РОВНО так и что решаешь сам
**(1) ДЕЛАЙ РОВНО ТАК — БЭКАПЫ НА БОЕВОМ ПУТИ.** Бэкапится и оплаченная работа (проектные SQLite книг),
и денежный реестр (Postgres). Движковые `store.BackupSQLite` / `tmctl backup` СУЩЕСТВУЮТ и платформой не
зовутся ни разу — проверь сам и используй, если подходят. Восстановление обязано быть **предъявлено
исполнением**, а не описано: подними копию из бэкапа и покажи, что книга и баланс на месте. ⚠ Без
предъявленного восстановления бэкап — это вера, а не механизм.
**РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ:** куда складывать, с какой частотой, сколько поколений держать, чем
проверять целостность копии. Промт задаёт ТРЕБОВАНИЕ (переживаемость потери диска и предъявленное
восстановление), а не режим.
**(2) ДЕЛАЙ РОВНО ТАК — ПОЧИНИ РАНТБУК ДЕПЛОЯ.** Он ставит CLI в одно место и велит указать переменную
на другое, которого не создаёт ⇒ `MarkerArgv` пуст ⇒ **`503` на каждый старт и резюм**. ⚠ Без переменной
вовсе всё работало бы (сиблинг-дефолт). Там же объяснение отсутствия переменной описывает симптом,
которого в коде нет. **Условие приёмки: рецепт исполнен ДОСЛОВНО на чистой машине или в контейнере, и
прогон стартовал.** ⚠ **РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ, что из остатка ревизии брать в этот пак:** зона уже отработала её и закрыла бо́льшую часть своим лендингом `9e978d6`; здесь остаётся то, что она пометила как незакрытое. Возьми, назови поимённо взятое и подпиши пропущенное пропуском — «остальное» без списка промтом не заказывается.
**(3) РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ — ДВЕРЬ ДЛЯ НЕ-БРАУЗЕРНОГО КЛИЕНТА.** Развилка: выдавать
`bearerToken` (контракт его объявляет) ЛИБО признать, что до разморозки фронта единственный путь —
браузерный, и записать это решением, сняв обещание из канона. **Оба исхода законны, но «оставить как
есть» — нет:** сегодня канон обещает то, чего нет, и цикл доказан механизмом, которого в бою не бывает.
Выбор — твой, довод — в отчёт, канон правит оркестратор.
**(4) ДЕЛАЙ РОВНО ТАК — ИМЯ КНИГИ.** `updateBook` описан в каноне и не смонтирован (`PATCH` в роутере
ноль). Смонтировать. ⚠ **РЕШАЕШЬ САМ И АРГУМЕНТИРУЕШЬ:** как новое имя доезжает до `dc:title` (движок берёт
его из `book.yaml`, который платформа пишет с `O_EXCL` и никогда не перезаписывает) и что происходит с
уже собранными выдачами — пере-собирать, помечать или оставить.
**ГРАНИЦА, КОТОРУЮ НЕ ПЕРЕХОДИТЬ — и я едва не выдал пак без неё.** На листе владельца ОТКРЫТ вопрос
«лестница D25.1 — какая ступень даёт читателю копию БЕЗ пометки и **что печатать на титуле и в имени
файла**» (CURRENT-STATE, секция «Открыто на владельце»). ⇒ Ты строишь МЕХАНИЗМ переименования — ручку,
хранение, доставку в файл. **Ты НЕ решаешь, ЧТО там должно быть напечатано** (оригинальное имя,
перевод, пометка о неполноте, шаблон имени файла) — это продуктовый ответ владельца, и он не дан.
Механизм обязан пережить любой его ответ: значение приходит извне и не зашивается.
⚠ Рядом на том же листе — «лейбл главы без заголовка (сейчас цифры; словесный шаблон — одна строка
`reader.txt` после ратификации К-3)». Тот же класс: механизм можно, слово нельзя. ⚠ Это первое, что видит человек, открыв книгу в
читалке.
**(5) ДЕЛАЙ РОВНО ТАК — СНЯТЬ ЛОЖНУЮ ПОДПИСЬ «ЗНАКОВ».** Счётчик считает руны ПОТОКА ЗАПИСИ файла: для
UTF-8 txt это и есть знаки, для EPUB — руны zip-архива, для GB18030/UTF-16 приближение. ⛔ **ПРЕЖНЯЯ РЕДАКЦИЯ ЭТОГО ПУНКТА БЫЛА НЕВЕРНА И ОТОЗВАНА 05.09.** Она велела «просто не заполнять
поле там, где счёт лжёт». Так нельзя: в каноне `character_count` стоит в `required`, тип
`[integer, 'null']`, и `null` уже НЕСЁТ СМЫСЛ — «книга ещё загружается». Платформа `null` не шлёт
никогда, а фронт проверяет `=== undefined` и на `null` нарисует «0». ⇒ «не заполнять» ломает и смысл
контракта, и потребителя.
**ДЕЛАЙ РОВНО ТАК: вынеси состав минора в ОТЧЁТ** — либо признак точности рядом с числом, либо смена
семантики `null`. Канон правит оркестратор; своей рукой поле не трогай (§2). ⚠ Внутри зоны законно и
нужно другое: назвать в своём журнале, ЧТО именно считает счётчик, чтобы следующий не принял руны zip
за знаки.
**Ветку «взять число из манифеста движка» в ЭТОМ паке НЕ бери:** сегодня манифест несёт только
`source_bytes`, а знаки по юниту появятся ТОЛЬКО после движкового пака (его строка 278). Зависимость
названа, чтобы ты не начала с невозможного.
**Переименование ПОЛЯ КОНТРАКТА своей рукой не делай** — §2 это запрещает: состав минора выносишь в
отчёт. Своей рукой правится то, что живёт в зоне: источник числа и то, что уходит на провод. ⚠ Фронт заморожен — подпись правится при
разморозке, ЧИСЛО у тебя раньше.
**(6) ДЕЛАЙ РОВНО ТАК — РАЗВЁРТЫВАНИЕ БАНКОВОГО КОНТУРА В РАНТБУКЕ.** `mining.contrast_path`
единственный вход контура; артефакт крупный, генерируется из jieba, в git его нет и быть не должно, а
**рантбук о нём молчит** (`grep -c contrast platform/deploy/README.md` → 0). ⇒ Первая выкатка после
лендинга даст инстанс, который **ОТКАЖЕТ КАЖДОМУ ПРОГОНУ**: движок проверяет файл при загрузке конфига
и отказывает по имени пути (`backend/internal/config/pipeline.go`, греп `CheckMiningContrast`) — это не
«контур не работает», это конфиг не загружается. ⚠ Прежняя редакция промта описывала симптом мягче и
была неверна; исправлено 05.09 — два промта одной ночи описывали одну выкатку по-разному. Рантбук обязан сказать:
положить артефакт рядом с конфигом ПЕРЕД выкаткой, откуда его взять, и чем проверить. ⚠ Движковая
половина (отказ загрузки называет путь) уже стоит в `backend/configs/pipeline-c1.yaml` — не дублируй,
сошлись.
**(7) ЗНАЙ ПРО ШОВ, но НЕ строй его здесь:** параллельный движковый пак добавляет в событие `ceiling`
поле «сколько не хватило» и двигает минор потока. Твоя сторона читает поток и обязана пережить новое
поле, не сломавшись; строить его ЧТЕНИЕ — работа пака формы заказа, а не этого. Если твой парсер
падает на незнакомом поле — это дефект и его чинить здесь.
**(8) НЕ ДЕЛАЙ:** не трогай форму заказа (главы/знаки/деньги) — она ратифицирована `D39.196` и идёт
СВОИМ паком после движкового гейта; не двигай форму манифеста; не правь канон своей рукой; не гаси
общий Postgres на стенде (запрет и довод — в твоём же `UP.sh`).
## 5. Мандат самопроверки ИСПОЛНЕНИЕМ
Батарея зоны при всех условиях хоста + **живая проба каждой построенной поверхности, с командой и её
выводом В ОТЧЁТЕ**. Названо поимённо, чтобы букву не удовлетворяло «дёрнул и посмотрел»:
· бэкап — восстановление из копии, и книга с балансом предъявлены на восстановленном;
· рантбук — исполнен ДОСЛОВНО на чистой машине или в контейнере, прогон стартовал;
· дверь — вход в ПРОД-конфигурации (не `dev-login`) и один защищённый запрос под этим входом;
· имя книги — EPUB, скачанный через дверь, с новым `dc:title` внутри. **Субагенты
разрешены явно**, модель называй именем. ⚠ **Правка документации — изменение с побочными эффектами и
требует ревью исполнением ровно как код**: норма куплена твоим же замером — восемь агентов по СВОЕЙ
работе нашли больше, чем одиннадцать по чужой, и «якоря пере-нацелены» протухло от следующей же правки.
**Утверждение о проверке живёт ровно до следующей правки** — гоняй линтер ЦИКЛОМ до чистоты, а не
одним проходом.
## 5-бис. ЧТО В ПАК НЕ ВОШЛО — подписано пропуском
⚠ **Сверка состава против ЛИСТОВ ВЛАДЕЛЬЦА (реестр требований · его открытый лист · зонные журналы) —
сделана 05.09, и вот её результат.** Требования, которых пак КАСАЕТСЯ, но не закрывает: **ПТ-44**
(готовый перевод отдаётся файлом — читаемая книга) закрыт по букве, но **имя книги и структура глав
внутри файла** — строки 274 и 283, и вторая в пак не входит: без неё читатель не-CJK txt получает
книгу одним полотном. **ПТ-3** (книга ЦЕЛИКОМ) гейчена денежным паком, не этим. **ПТ-17** (лимит
размера входа) — строка 94, не взята.
⚠ Канон велит подписывать пропуск пропуском, а не умалчивать. Того же класса «можно ли пускать
человека», но НЕ здесь:
· **строка 271** (правки банка едут в system-промпт дословно) — ЗОНА ДВИЖКА, идёт райдером в
параллельном движковом паке. ⚠ **Пока она открыта, обещание «внешнего пользователя можно пускать»
неполно** — знай это, когда будешь писать итог.
· **строка 198** (апгрейд движка стирает замечания читателя) и **строка 254** (пустой файл → интейк
уничтожает загрузку) — та же природа, отложены сознательно: обе требуют согласования с движком.
· **`PD-424`** (живой прогон с намертво заблокированной расплатой невидим — деньги висят) и **`PD-438`**
(владение потоком не переживает свип) — открытые major твоей зоны. Не утверждаю, что они не первые;
утверждаю, что пропуск сознателен, и если ты считаешь иначе — скажи пингом ДО работы.
## 6. Предметные оси ревью
Восстановление из бэкапа (исполнением, не чтением) · рантбук на чистой машине · путь входа в
прод-конфигурации · побочные эффекты доковых правок.
## 6-бис. ОБЯЗАТЕЛЬНОЕ ДЛЯ КОДОВОГО ПРОМТА — пять строк канона
Этот пак пишет код (бэкап, монтирование ручки, вход), значит они действуют.
· **Перед отчётом сверь КАЖДЫЙ клейм с результатом инструмента ЭТОЙ сессии** — не с памятью и не с
тем, что было верно вчера. ⚠ У тебя есть свежий замер, зачем это: твои же восемь агентов по СВОЕЙ
работе нашли больше, чем одиннадцать по чужой.
· **Последний абзац отчёта — план или обещание? Сделай это СЕЙЧАС.**
· **Править или удалять тест/гейт ради зелени — НЕДОПУСТИМО.** Несогласие — пинг. ⚠ Запрет про МОТИВ
(`D39.183`): правка, вызванная ЗАКАЗАННОЙ этим промтом сменой поведения, — обслуживание, и она
ОБЪЯВЛЯЕТСЯ в отчёте.
· **Дифф `^func Test` — ИСПОЛНЕНИЕМ, не по памяти:** приложи вывод.
· **Интервальная самоверификация субагентом** против ЯВНЫХ критериев. ⚠ И твоя же норма, купленная
вчера: **утверждение о проверке живёт ровно до следующей правки** — линтер и гейты гонять ЦИКЛОМ до
чистоты, а не одним проходом.
## 7. Записка-план ДО работы
Комплектность против заказа таблицей: пункт → носитель → проба, которой предъявишь.
## 8. Заявление = команда
Числа и категорика — с командой получения. ⚠ Отрицание выводится ТОЛЬКО из названного грепа, и команда
приводится в тексте: за сутки трижды ловили отрицания из команд, которые не сработали (последний раз —
`grep` с `|` без `-E` у оркестратора).
## 9. Эхо-протокол старта
≤10 строк «скоуп / инварианты / не-делать» ДО работы, первым действием, в прямой канал.
## 10. Obstacle reporting
Обязательная секция: что не удалось, что не проверено. ⚠ **Отчитаться о баге не значит его сдать.**
## 11. Канал вопросов
Конфликт промта с кодом — пинг, не интерпретация. Право сказать «этого делать не надо» с аргументом —
есть: в прошлом паке ты опровергла пункт оркестратора, исполнение которого внесло бы в регистр ложь.
## 12. Прямой канал
`CLAUDE.md` §«Связь между сессиями». Свой блок — первым делом; адрес оркестратора оттуда же, сверять
`ListAgents` перед отправкой. Канала нет ⇒ **НЕ искать**, вопрос секцией в отчёт.