textmachine/docs/PLATFORM_EXPORT_SESSION_PROMPT.md

197 lines
19 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`; отступление — пинг, не
> самовольство. Направление зоны — `platform/docs/PLATFORM_DIRECTION.md`.
## Какая проблема и что изменит твой результат
Цикл не замкнут: движок собирает книгу файлом с 30.08 (EPUB 3 + чистый txt), холодный прогон предъявил
это живьём — собранный EPUB настоящего перевода прошёл `epubcheck` 0/0/0/0. **Пользователь этот файл
получить не может:** канон обещает `createExport`/`getExport`, платформа их не монтирует. Долг числится
с P8, и ни один пак после P7 его не взял.
Вторая половина той же проблемы: **живой перевод книги насквозь через API не гонялся НИ РАЗУ.** Всё
после «прогон стартовал и остановился» покрыто батареей против живого Postgres, но с движком-заглушкой.
Настоящий манифест, сайдкар банка и карта причин флагов будут ПЕРВЫМИ данными, форму которых платформа
не сочинила сама.
После пака: книга доходит до пользователя файлом, и это предъявлено живым прогоном на настоящем
движке, а не фикстурой.
## Карта чтения — пять позиций
1. `platform/README.md` — устройство зоны · `platform/docs/ENGINEERING_STANDARDS.md` (обязателен).
2. `platform/docs/platform-PROGRESS.md` — зонный журнал: пинги оркестратора и отчёты паков P12/P13.
3. `docs/NEXT_PACKS_PLAN.md` §2 — состав этого пака, что намеренно не берётся, и разбор механизма
потолка. Читать целиком.
4. `docs/architecture/14-api-contract/` — канон; **зеркало фронта НЕ норматив**. Ряды регистра по
номеру: `PD-424` · `PD-418` · `PD-438` · `PD-217` · `PD-246`.
5. Журнал решений грепом: **D39.189** и **эррата 04.09-а к нему** (механизм потолка) · **D39.176** п.3
(возобновление явным действием) · **D39.178** (дверь всегда строит файл) · **D39.175** п.2
(`BuildReport` — оператору) · **D39.85** (закон шва: импорта чужого модуля нет).
⚠ Ратифицированное вложено сюда; код-факты добываешь САМ. Числа — с командой получения.
## ⚠ ПРЕДУСЛОВИЕ: четыре условия хоста + ключи
Условий батареи ЧЕТЫРЕ, и цель `make conditions` печатает их состояние сама — **начни с неё**, а не с
догадки. На этом хосте: `~/go/bin` существует и держит `sqlc` (без `export PATH=$HOME/go/bin:$PATH`
`make check` не стартует вовсе), сокет Postgres — `/tmp/.s.PGSQL.55433`, DSN — в
`platform/docs/STACK_DECISIONS.md`.
**Ключи провайдера для платного прогона.** Конвенционного `.env` нет ни у одной книги корпуса.
Платформе нужен `TM_PLATFORM_ENGINE_KEYS_PATH` **абсолютным путём** на уже заполненный файл
(`platform/internal/config/config.go`, греп `must be an absolute path`). ⛔ **Сам файл НЕ читать**
гардрейл `CLAUDE.md`. Проверять ПРОГОНОМ, а не чтением.
## Состав — четыре пункта
### 1. Строка 202 — живой сквозной прогон книги через API. ПЛАТНЫЙ
**Санкция владельца ДАНА** (`D39.189`, 03.09: «разрешаю платные прогоны с ключами для тестов»).
**ПОТОЛОК — ЭТО ГРАНТ, А НЕ ФЛАГ. Читай внимательно, здесь легко сделать хак.**
На пути через API `--ceiling-usd` руками не ставит никто: платформа выводит число сама —
`bookCap = committed + increment` (`internal/runs/spawn.go`, греп `func (m meter) bookCap`), а
`increment` считается по ставке `DefaultPerChapter = 30_000` ($0.03,
`internal/pricing/pricing.go`), которая занижена ×4.47 (`D39.179` п.1).
**Делай РОВНО так:** потолок пака = **грант тест-аккаунту ровно на $1.5**
(`tmplatformctl grant --user <id> --usd 1.5`) — холд делает перерасход невозможным по построению.
**`TM_PLATFORM_USD_PER_CHAPTER` НЕ КРУТИТЬ** — это подгонка окружения под тест, запрещённая
каноном. Ставка занижена, и это известный ряд, а не твоя задача.
**Путь до завершённой книги идёт цепочкой «покупка → пауза по потолку → пополнение → новый прогон»,
и это НЕ обход, а продуктовый путь** (`D39.176` п.3; `resume` прогона, остановленного потолком,
отбивается — `internal/runs/runs.go`, греп `ErrCeilingReached`, и `PD-217` называет лечение: «новый
прогон»). Тремя явными сценариями закрывается строка **216**: подпись банка · halt на потолке ·
резюм после пополнения.
**Стартовать в ДОЛИНУ:** у DeepSeek пиковые окна 0104 и 0610 UTC дают ×2 (строка 172а).
Операционное правило дешевле любой правки Go.
**Что сверить — то, что до сих пор не сверялось ни разу:** на шов реально вышло ОДНО значение
`flag_reason` из пятнадцати, а манифест против `internal/ingest/manifest.go` не сверялся вовсе.
⚠ Четырнадцать причин флагов прогоном не вызвать — **так и напиши**, не выдавай непроверенное за
проверенное.
**Решаешь сам:** книга и её объём, порядок сценариев, форма фиксации артефактов.
### 2. Дверь выдачи — `createExport` / `getExport`
Не построено: `grep -rn 'createExport\|getExport' platform/internal/ --include=*.go` → 0 (контроль:
`listBankTerms` → есть). Смонтировано 15 маршрутов при 20 `operationId` канона.
**Делай РОВНО так — слово владельца 30.08:** дверь **ВСЕГДА строит файл**. Отказ пользователю не
отдаётся; неполная книга уходит **с пометкой**, то есть дверь зовёт `tmctl build --partial`
(`D39.178`). Отказ по умолчанию остаётся операторской ручкой CLI. `BuildReport` — оператору в лог, не
читателю (`D39.175` п.2). Денег на проводе нет (`D39.84`).
**Четыре факта кода, каждый меняет работу:**
- `ExportFormats` захардкожен пустым (`cmd/tmplatformd/runner.go`, греп `ExportFormats`), а форматы
движок публикует только Go-переменной `bookfile.Formats`**импорт чужого модуля запрещён**
(`D39.85`). Значит нужен КАНАЛ: переменная деплоя либо движок публикует данными. Это вопрос закона
входной двери — **решаешь сам и аргументируешь, но если ответ требует правки движка — пинг, не правка**.
- Декодера `tm-build-v1` / `BuildReport` в платформе НЕТ (ноль хитов при живых `DecodeExport`, `DecodeBank`).
- `build` открывает стор read-only без flock ⇒ канонное «книгу можно экспортировать во время
перевода» исполнимо.
- `ExitBookIncomplete = 16` у платформы отсутствует (`internal/ingest/exit.go`).
**Минор канона — состав назвать в отчёте, правку согласовать:** `Export.failure_code` становится enum
с первым построенным форматом (`contract-10` строки 243, условие наступило) · механизм подписанной
ссылки и её TTL плюс GC файлов · строка **241** (канон противоречит себе на дочитанной книге).
⚠ Прецедент есть: миноры 0.6.0/0.7.0/0.9.0 приезжали с паками зоны через ратификацию оркестратора.
**Делай РОВНО так:** канон правится ТОЛЬКО через ратификацию, не своей рукой.
### 3. `PD-424` — терминальная ручка для живого прогона с заблокированной расплатой (`major`)
Половина «невидим» вылечена P12; половина «ручки нет» стоит. `run abandon` ветвится по
`runs.finished_at` (`internal/pgstore/runs.go`, греп `AbandonRun`) и на живом прогоне уходит в живую
ветку, а `AbandonRun` отказывает над попыткой, ещё называющей юнит.
⚠ Это **НОВАЯ разрушительная операторская поверхность над деньгами**. **Делай РОВНО так:** её дизайн
называется явно и целиком — кто вправе звать · чем доказывается отсутствие процесса · что происходит,
если процесс вернётся (двойная расплата). **Решаешь сам:** форма ручки и глубина.
⚠ Дописать `PD-418`: та же ветвь по `finished_at`, долговечное лечение — «ветвить по НАЛИЧИЮ
осиротевшей попытки». Либо входит в тот же дизайн, либо **явно объявляется вне его**.
### 4. Дофикс чужого пака + три райдера
**Почему это здесь.** По канону дофикс шёл бы той же сессии, но её больше нет (`ListAgents` 04.09).
**Это чужая недоделка, а не новый заказ** — в отчёте называть отдельно от своей работы.
- **Записка о предусловии хоста** (`platform-PROGRESS.md`) различает хосты **именем машины**, а имя у
этого хоста то же самое (`DESKTOP-IN1MCEA`) при противоположных условиях: `~/go/bin` существует и
держит `sqlc`, `make tools-check` на дефолтном PATH падает, сокет только 55433. Различает
пользователь и `$HOME`, а не хост. **Делай РОВНО так:** ключевать записку пользователем/`$HOME`.
- **Райдер `246`:** `internal/ingest/exit.go` обещает «nothing this process would have written was
written», а движок это прямо отрицает. Остаток — комментарий плюс константа 16, которую дверь и так
добавит. ⚠ Прежняя формулировка «разрушительно по полосе» ПЕРЕОЦЕНЕНА: интейк удаляет загрузку
только на классе 11.
- **Райдер `234`:** `internal/runs/bank.go` объясняет отказ снятой посылкой («status projects the
STORED memory…»), опровергнутой `D39.170`. Одна правка комментария.
- **Райдер `PD-438`-остаток:** лечение в дереве, но припаркованная попытка не видна ни в `runs`, ни
гейджем, ни колонкой. **Решаешь сам:** закрывать сейчас или назвать отложенным — но НАЗВАТЬ обязан.
## Границы — что НЕ делать
-Не трогать форму манифеста · схему хранилища движка · `docs/scripts/counts.py`.
-Не править канон своей рукой — только через ратификацию.
-Не крутить `TM_PLATFORM_USD_PER_CHAPTER` и не обходить холд.
-Не решать `PD-439` и не переносить ряды между секциями регистра — статус есть акт лендинга.
-Не брать `PD-410` · `PD-412`/`413` · `PD-386``392`: первый архитектурный и крупнее двери,
остальные — отдельный пак наблюдаемости.
-Не трогать бэкенд-половину, `.env`, соседний worktree.
## Свобода и её разметка
**«Делай РОВНО так»:** грант как потолок и запрет крутить ставку · цепочка покупка→пауза→пополнение→
новый прогон · дверь всегда строит, `--partial`, `BuildReport` оператору · канон только через
ратификацию · дизайн `PD-424` назван целиком · записка ключуется пользователем · все запреты границ.
**«Решаешь сам и аргументируешь»:** книга и объём прогона · порядок сценариев · канал форматов
(с пингом, если упирается в движок) · форма ручки `PD-424` · судьба `PD-438`-остатка · форма
подписанной ссылки и GC.
⚠ Чего нет ни в одном списке — пинг, а не усмотрение.
## Мандат самопроверки — исполнением
1. **Живая проба каждого пункта поимённо**, с пометкой, нужен ли DSN.
2. **Собственные адверсариальные посадки ВНЕ списка** — на копии дерева (`cp -a platform /tmp/<имя>/`),
каждая с командой и выходом; пережившие батарею — находки, и они объявляются.
3. **Отдельный проход по своей готовой работе** свежим контекстом. Субагенты разрешены явно, модель
ИМЕНЕМ, число знай.
4. ⚠ «Прошла, находок нет» отчётом не является.
### Предметные оси ревью — под предмет этого пака
1. **Идемпотентность третьего создающего вызова** (`internal/pgstore/idempotency.go`, греп
`beginIdempotent`): дверь — новая создающая поверхность.
2. **Жизнь и GC выданных файлов**: ссылка чеканится на ответ и владельца и истекает — что после.
3. **Экспорт ВО ВРЕМЯ живого прогона** (read-only без flock это разрешает — проверь, что не врёт).
4. **`PD-424`: возврат процесса после «признали отсутствующим»** — двойная расплата.
5. **Положительный контроль, без которого дверь не сдана:** `epubcheck` на ВЫДАННОМ файле и скачивание
по чеканенной ссылке ВТОРЫМ клиентом.
⚠ Запрет подгонки тестов — `CLAUDE.md` (`D39.183`); заказанная смена поведения объявляется в отчёте.
## Отчёт
**Записка-план ДО работы** (скоуп · инварианты · что НЕ делаю, ≤10 строк) — в
`platform/docs/platform-PROGRESS.md`, и тем же текстом первым действием по каналу.
**Пройди по четырём пунктам состава и таблице разметки и отчитайся ПО КАЖДОМУ.**
**Каждое число — с командой получения**; приёмка пере-ранит. Гейты гнать ПОСЛЕДНИМ действием.
**Обязательная секция «Что НЕ удалось и что НЕ проверено»** — третий исход законен; сюда обязательно
попадают четырнадцать причин флагов, которые прогоном не вызвать.
**Конфликт с кодом — пинг, не интерпретация.** Право сказать «этого делать не надо» с аргументом у
тебя есть, включая состав и границы.
## Прямой канал
Механизм — `CLAUDE.md`, «Связь между сессиями»: свой блок в `/tmp/textmachine-channel`, сверка с
`ListAgents`, канала нет — нормальный случай. Эхо-записку отправь ПЕРВЫМ действием по адресу
оркестратора — это и проверка канала.