# Промт: сквозной пак «ХОЛОДНЫЙ ПРОГОН B — платформа → бэкенд → ФАЙЛ, ВТОРОЙ раз» > Выдан оркестратором №23 (сессия `textmachine-11`) 11.09. Пак **ПЛАТНЫЙ**, санкция владельца получена > дословно («разрешаю») на прямой вопрос с числами: **ждём ≈$0.42, машинный кап ≈$2.5 холда**. Носитель > санкции — `docs/NEAR_TERM_PLAN.md` §«Решения владельца, уже полученные». ## 1. Какая проблема и что решит твой результат Месяц назад движок умел переводить, но никто не видел, как платформа ведёт настоящую книгу от двери до файла. 11.09 это увидели один раз — **прогон A**: три главы `蛊真人`, 27 платных вызовов, **$0.419423**, книга дошла до EPUB. Один прогон дал знак, но не величину. **Твой прогон B покупает четыре вещи, которых нет ни у кого, и каждая — не «ещё раз то же самое»:** 1. **ДВЕ миграции схемы ни разу не шли на живом прогоне** — только в тестах. `v17` (`wave_selection`: что каждая волна ВИДЕЛА в банке — ось, которой у `retrieval_state` нет) и `v18` (`reasoning_tokens` получили смысл: «размышление, оплаченное СВЕРХ completion», на DeepSeek это 0 по определению, и колонка всю жизнь проекта несла ноль, выглядящий замером). Первое живое исполнение обеих — твоё. 2. **Прибор консистентности впервые даст числа С ЖИВОГО ПРОГОНА.** Сегодня все `I1`/`I2` получены ПОВТОРНЫМ чтением одной и той же сохранённой базы прогона A. Пере-скан не то же, что прогон: он не проходит через запись. 3. **Платформенный пак (идемпотентный резюм, терминальное состояние) проверяется СКВОЗЬ,** а не юнитами. 4. ⛔ **Вторая точка по денежной дыре — и она нужна по НОРМЕ, а не для красоты.** Весь довод «четверть денег купила пустоту» стоит на ОДНОМ прогоне, а квирки §3д прямо говорят: смета DeepSeek с одиночного вызова ошибается на порядок, сметы строятся на ПОВТОРАХ. ⇒ у числа есть знак и нет величины. ⛔ **И вот чего твой прогон НЕ покупает, чтобы ты не потратил на это ни цента:** он **НЕ** отвечает на вопрос «безопасно ли редактору думать меньше» (ряд 433). Это парный дизайн на повторах с армом без фактора, он стоит отдельных денег и отдельного заказа. Твой прогон идёт на БОЕВЫХ настройках как есть. ## 2. Зона записи и git ⛔ **ЭТОТ ПАК НЕ ПРАВИТ КОД НИ ОДНОЙ ЗОНЫ.** Ни `backend/`, ни `platform/`, ни `frontend/`. Найдёшь дефект — **пингом мне, а не правкой**: прогон, чинящий найденное, перестаёт быть холодным и теряет право сравниваться с A. - **Ты не коммитишь вообще ничего.** Пре-рег и улики передаёшь мне, я лендлю. Порядок жёсткий: пре-рег готов → пинг мне → **я коммичу фриз** → и только после этого первый платный вызов. - Рабочее дерево прогона живёт **вне репозитория и вне общего скретчпада** (его чистит не только твой процесс). Предлагаю `~/tm-coldrun-b`. - ⚠ `books/` версионируются ОТДЕЛЬНЫМ репозиторием; в клоне их нет. Исходник читается из главного дерева как ФАЙЛ, read-only. ## 3. Карта чтения — ЗАКОН, дальше только по её ссылкам 1. `CLAUDE.md` — целиком (ты его уже прочёл, если попал сюда правильно). 2. `docs/experiments/00-provider-quirks.md` — **перед первым платным вызовом**, §3д особенно. 3. `docs/architecture/05-decisions-log.md` — **только тела `D39.247`** (акт прогона A: чем он предъявлен и где остался слеп) и **`D39.251`** (что именно построено в наблюдаемости денег и почему лекарство выключено). 4. `platform/README.md` — как поднимается стенд. 5. Архивный промт прогона A — `docs/archive/prompts/POLYGON_COLD_RUN_A_SESSION_PROMPT.md`. ⛔ **Инструкции оттуда НЕ ИСПОЛНЯЮТСЯ** (архив), но §4.1 и §4.2 несут ПЕРЕ-СНЯТЫЕ предусловия стенда и механику фриза, и переписывать их сюда значило бы завести копию, которая стареет молча. Читай как СПРАВКУ и проверяй каждое утверждение своим прибором: часть из них снята исправлениями ПОСЛЕ выдачи. Код-факты добывай сам. `file:line` ниже — отправные точки, а не истина: **код первичен**. ## 4. Состав. Порядок фаз ЖЁСТКИЙ ### 4.0 Фаза 0 — $0-ДЫМ. **Делай РОВНО так, и это первая работа пака** ⛔ **Ни одного платного вызова, пока дым не прошёл целиком.** Довод не гигиенический: первая же инфраструктурная осечка на платной руке сожжёт «холодность» книги — прогон уйдёт в `failed`, и следующий старт той же книги пойдёт как ПРОДОЛЖЕНИЕ, а не как холодный. Дым обязан доказать: стенд поднят и порт отвечает ТВОЕМУ pid · гость заведён · деньги начислены · книга принята · прогон стартовал · кадры доехали · узел подписи ответил · резюм прошёл · **выгрузка собралась и файл скачался**. Инструмент заглушки — ШТАТНЫЙ провайдер `kind: local`; образцы рендера $0-конфига лежат в репо (`platform/internal/runner/bankapply_live_test.go`, греп `zeroCostPipeline`). ⛔ **Пин фазы 0, без которого дым вырожден:** после рендера **напечатай счёт платных слагов в получившемся конфиге — ноль**, при контрольном счёте тех же слагов в `backend/configs/pipeline-c1.yaml` — **не ноль**. Молчащий греп и чистый конфиг иначе неотличимы. ### 4.1 Предусловия — **проверь КАЖДОЕ своим прибором, список от прогона A мог устареть** Известное на 11.09 (справка, не истина): локальной модели на машине НЕТ (ни `ollama`, ни слушателя на 11434) ⇒ настоящие узлы проходятся только платно · кластер Postgres поднят на `-h /tmp -p 55433 -U postgres`, ОС-роль `ubuntu-26` в нём НЕ заведена · артефакт контраста майнинга нужен `CheckMiningContrast` и сверяется **по sha256, а не по имени** (рядом на диске лежит фальшивый кандидат) · четыре переменные окружения решают, существует ли путь вообще (`TM_PLATFORM_EXPORT_FORMATS` пуст по умолчанию ⇒ ручки выгрузки не монтируются, и последней трети пути для тебя нет) · `epubcheck`/`java` на хосте нет и поставить их нельзя. ⛔ **Ключи провайдера.** Значение `TM_PLATFORM_ENGINE_KEYS_PATH` даю я по твоему пингу. **Нет значения ⇒ СТОП ДО фриза.** `.env` читать запрещено гардрейлом. ### 4.2 Фриз — **делай РОВНО так** **Фриз = sha коммита ПЛЮС бинари, собранные из ЛОКАЛЬНОГО КЛОНА** (`git clone <репо> <путь>`). Довод — главное дерево движут параллельные сессии. ⛔ **Не `git worktree`.** Бинарь из ЛИНКОВАННОГО воркри не несёт VCS-штампа **ВООБЩЕ** (замер: 24 строки `go version -m`, из них `vcs.*` — 0), потому что `.git` воркри — ФАЙЛ и поиск корня VCS в Go его пропускает. ⇒ правило «отказывать при `vcs.modified=true`» на таком бинаре выполняется ВСЕГДА и не проверяет ничего. У клона `.git` — настоящий каталог, и штамп живой. **Третье условие отказа обязательно: отсутствие строк `vcs.*`.** Перед сборкой — `test ! -e /tmp/.git`; `GOFLAGS=-buildvcs=false` в фриз-сборке **ЗАПРЕЩЁН**. ⚠ Штамп снимается **на КАЖДУЮ попытку**, а не один раз: резюм может сменить бинарь под тем же прогоном — сверяй по `run_attempts`, а не по тому, что лежит на PATH в конце. ### 4.3 Пре-регистрация — **главный рубеж пака, и он дороже самого прогона** ⛔ **ЗНАМЕНАТЕЛЬ ПРЕ-РЕГИСТРИРУЕТСЯ ДО ДЕНЕГ, иначе B ответит числом на другой вопрос.** B — ЕЩЁ ОДИН одиночный прогон, и две точки распределением не станут. Настоящая ценность B не «вторая точка к 25.4 %», а `request_log` ВСЕХ единиц прогона ⇒ **доля выброшенных первых попыток ПО ЕДИНИЦАМ, а не по вызовам.** **Мера задана мной, делай РОВНО так** (я снял её на прогоне A своим прибором, числа ниже — твой базис сравнения): - **единица** = `(chapter, chunk_idx, stage, role)`; - **знаменатель** = единицы, за которые заплачено хоть раз (`sum(cost_usd) > 0`); - **числитель** = единицы, где есть хоть одна оплаченная и НЕ принятая попытка (`ok = 0 AND cost_usd > 0`); - **прогон A: 4 из 17 = 23.5 %**, тогда как по ВЫЗОВАМ то же событие даёт 4 из 27 = **14.8 %**. Две меры расходятся в полтора раза — вот почему мера объявляется заранее. ⚠ **Второй путь к тому же числу обязателен и считается НЕЗАВИСИМО** (без колонки `degraded`): у меня оба пути на A дали ровно $0.106472 = 25.4 % цены книги. Сойдутся у тебя — число крепкое; разойдутся — это находка, а не помеха. В пре-рег идут также: **ожидаемый исход КАЖДОГО шага, написанный ДО прогона** · sha256 исходника · sha256 ФАКТИЧЕСКОГО pipeline-YAML (платформа берёт файл ЦЕЛИКОМ, пер-полевого оверрайда нет ⇒ «прогон на c1» без sha — утверждение без носителя) · список глав с `units_total` · грант, TTL выгрузки. ⛔ **Претрейн:** `蛊真人` узнаётся моделями 4 из 5 ⇒ пре-рег объявляет, что клеймов О КАЧЕСТВЕ пак не делает вовсе. Узлы судятся механизмом (кадры, флаги, леджер), а не чтением текста. ### 4.4 Платная фаза **Реши сам и аргументируй:** какую книгу и сколько глав брать. Мой приор, опровергается замером: те же главы 1–3 той же книги, что и в A (`books/gu-zhenren/coldrun-v16/guzhenren-ch1-10.gb18030.txt`) — тогда числа сравнимы поединично. Возьмёшь другое — сравнение A↔B становится слабее, и это надо назвать. ⛔ **Приёмка каждого узла — по ТРЁМ независимым следам** (Postgres · диск и systemd · HTTP), не по самоотчёту движка. ⛔ **Живость длинного прогона проверяется АКТИВНО:** не жди финального уведомления — раз в пару часов сверяй рост числа вызовов и трат по леджеру ДВУМЯ чтениями. **Зависшая задача от идущей по сигналу завершения неотличима, и у зависания нет цвета.** ⛔ **Деньги: ждём ≈$0.42, кап ≈$2.5 холда.** Упёрся в потолок — **СТОП и пинг мне**, не режь молча и не проси подъёма «по проекции»: прогнозный запрос оставляет ложный след «владелец согласился на пере-оплату», которой не было. ### 4.5 Фаза 3 — $0 после прогона Прибор консистентности по ОТГРУЖЕННОМУ тексту (`I1`/`I2` с печатаемыми знаменателями), выгрузка, структурное чтение EPUB (zip + `container.xml` + `nav`), и **обе новые миграции предъявлены данными**: `wave_selection` несёт строки обеих волн, `reasoning_tokens` — то, что провайдер прислал, а не ноль. ## 5. Где этот пак мягкий — четыре места, назвал я, веер выбираешь ты Мандат самопроверки — **исполнением**, субагенты разрешены явно. Направление: 1. **Сборщик, который молчит, и сборщик, который прочитал ноль, — неотличимы.** Засей в стендовую БД заведомо ненулевой банк и заведомо удержанный юнит и потребуй, чтобы сборщики стали КРАСНЫМИ. Не покрасневший на подсадке сборщик в платную фазу НЕ ДОПУСКАЕТСЯ. 2. **Дым меняет ТРИ фактора разом** (провайдер + книга + база) ⇒ при провале платной руки он не разделяет причину. Где дёшево — меняй по одному. 3. **Отрицательный замер обязан доказать, что спросил существующее.** Рядом с каждым нулём ПЕЧАТАЙ контрольную величину. И помни две ловушки среды: `grep` здесь — обёртка над ugrep, чтит `.gitignore` и **не видит `books/`**; `sqlite3` как CLI на машине НЕТ — только `python3` + `mode=ro`. 4. **Число, выведенное из соседнего поля, не краснеет нигде.** Если в строке есть поле, прямо отвечающее на вопрос (номер попытки живёт в `trace_id`), любой ВЫВОД ответа — по времени, по порядку, по соседству — уже дефект метода, даже когда сходится. ## 6. Предметные оси ревью Выбери 1–3 и назови какие: **деньги под гонкой** · **граница «холодности»** (что в прогоне перестало быть первым разом) · **провенанс каждого числа** (чем снято, каким прибором, на какой клетке). ## 7. Записка-план ДО работы Перед первой командой — записка: фазы, что чем предъявляется, где ждёшь осечки. Комплектность против заказа сверяй механически, а не памятью. ## 8. Заявление = команда Каждое число и каждая категорика отчёта идут **с командой, которой получены**. Приёмка пере-снимает. ## 9. Эхо-протокол старта **Первым действием** — ≤10 строк СВОИМИ словами: что понял · что считаешь опасным · что считаешь неверным. Дословный пересказ подтверждает канал, но не понимание, и ошибку промта повторяет вместе с ним. Отправь мне (`textmachine-11`) через `/tmp/textmachine-channel`. ## 10. Что НЕ удалось — обязательная секция отчёта И вторая её половина, без которой она вырождена: **«где прибор слеп и я это знаю»** — что невидимо · почему не чинил · чем закрывается. ⭐ Формулировка прошлой смены, идущая нормой: **«в коде названо, в отчёте нет — значит для следующей смены НЕ названо».** ## 11. Канал вопросов и право отказаться Конфликт промта с кодом или доками — **пинг мне, не интерпретация**. И у тебя есть право сказать «этого делать не надо» с аргументом: прошлые три сессии возражали, и в двух случаях правы были они. ## 12. Прямой канал Механизм — `CLAUDE.md` §«Связь между сессиями». Впиши свой блок в `/tmp/textmachine-channel` ПЕРВЫМ действием. Нужной роли нет ⇒ канала нет, и это нормально: НЕ опрашивай сессии подряд. ## 13. Критерий завершённости У каждого пункта заказа — исход (сделано · не делаю с доводом · пинг) · круги СОШЛИСЬ (последний не дал НОВЫХ находок) · числа сняты ПОСЛЕ последней правки · всё живое в ДЕРЕВЕ или у меня, а не в письме · явное **«работа завершена, править не планирую»**. Без последнего пак считается идущим.