textmachine/docs/COLD_RUN_B_SESSION_PROMPT.md

20 KiB
Raw Blame History

Промт: сквозной пак «ХОЛОДНЫЙ ПРОГОН 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 Платная фаза

Реши сам и аргументируй: какую книгу и сколько глав брать. Мой приор, опровергается замером: те же главы 13 той же книги, что и в 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. Предметные оси ревью

Выбери 13 и назови какие: деньги под гонкой · граница «холодности» (что в прогоне перестало быть первым разом) · провенанс каждого числа (чем снято, каким прибором, на какой клетке).

7. Записка-план ДО работы

Перед первой командой — записка: фазы, что чем предъявляется, где ждёшь осечки. Комплектность против заказа сверяй механически, а не памятью.

8. Заявление = команда

Каждое число и каждая категорика отчёта идут с командой, которой получены. Приёмка пере-снимает.

9. Эхо-протокол старта

Первым действием — ≤10 строк СВОИМИ словами: что понял · что считаешь опасным · что считаешь неверным. Дословный пересказ подтверждает канал, но не понимание, и ошибку промта повторяет вместе с ним. Отправь мне (textmachine-11) через /tmp/textmachine-channel.

10. Что НЕ удалось — обязательная секция отчёта

И вторая её половина, без которой она вырождена: «где прибор слеп и я это знаю» — что невидимо · почему не чинил · чем закрывается. Формулировка прошлой смены, идущая нормой: «в коде названо, в отчёте нет — значит для следующей смены НЕ названо».

11. Канал вопросов и право отказаться

Конфликт промта с кодом или доками — пинг мне, не интерпретация. И у тебя есть право сказать «этого делать не надо» с аргументом: прошлые три сессии возражали, и в двух случаях правы были они.

12. Прямой канал

Механизм — CLAUDE.md §«Связь между сессиями». Впиши свой блок в /tmp/textmachine-channel ПЕРВЫМ действием. Нужной роли нет ⇒ канала нет, и это нормально: НЕ опрашивай сессии подряд.

13. Критерий завершённости

У каждого пункта заказа — исход (сделано · не делаю с доводом · пинг) · круги СОШЛИСЬ (последний не дал НОВЫХ находок) · числа сняты ПОСЛЕ последней правки · всё живое в ДЕРЕВЕ или у меня, а не в письме · явное «работа завершена, править не планирую». Без последнего пак считается идущим.