textmachine/docs/POLYGON_COLD_RUN_A_SESSION_PROMPT.md

30 KiB
Raw Blame History

Промт: полигон-пак «ХОЛОДНЫЙ ПРОГОН A — от двери до ФАЙЛА, настоящая книга, настоящие деньги»

1. Какая проблема и что решит твой результат

Мы построили весь путь: гость заводит книгу → платформа берёт деньги в холд → движок переводит → человек подписывает банк терминов → редакторская волна → выгрузка → файл. Каждый кусок предъявлен по отдельности. Книги, прошедшей его ЦЕЛИКОМ до конца, не было ни разу. Это строка бэклога 16 дословно: «цена ДОВЕДЁННОЙ ДО КОНЦА книги не измерена». Ближайшая попытка — 04.09 — дошла до скачанного EPUB, но упёрлась в денежный потолок и до exports.complete = true не добралась.

Твой результат: одна настоящая книга (3 главы zh→ru) проведена от двери до файла, открытого человеком, и у каждого узла пути напечатано, ЧЕМ он предъявлен — по трём независимым следам, а не по самоотчёту движка. Плюс честный список того, что на этом пути сломано: прогон ничего не чинит, он только называет.

Зачем это сейчас: мы собираемся размораживать фронт и звать людей. Сегодня никто в проекте не может ответить, что именно увидит первый гость, — и ни один трекер этого не знает, потому что знание такого рода добывается только прохождением.

2. Зона записи и git

Зона: eval/ + docs/experiments/, пинг оркестратору — секция «Полигон» в docs/PROGRESS.md. Сессия НЕ коммитит — КРОМЕ пре-рег-фризов, и это единственное исключение во всём проекте (право полигона). Фриз-коммит объявляется оркестратору ВСЛУХ до коммита. Канон git — CLAUDE.md §«Git-координация мультисессий»: никаких git add -A, reset --hard, checkout поверх грязного дерева. backend/ и platform/ — ЧИТАТЬ, не править. Соблазн будет: чтобы прогон поехал, не хватает артефакта и, возможно, конфига. Класть их надо в worktree-копию (см. §4.2), а не в главное дерево — backend/.gitignore знает только /tmctl /tmvet /tmmutate, всё остальное там станет untracked-мусором и сломает фриз. .env не читать (гардрейл), путь к ключам передаётся переменной, см. §4.2. ⚠ Что должно пережить рестарт — в РЕПОЗИТОРИЙ, а не в скретчпад: скретчпад чистит не только твой процесс.

3. Карта чтения — ЗАКОН, дальше только по её ссылкам

  1. CLAUDE.md — цели владельца и гардрейлы.
  2. docs/experiments/09-pilot-protocol.md + eval/README.md — как устроена полигон-зона и пре-регистрация.
  3. docs/experiments/00-provider-quirks.mdоплаченные провайдерские факты; читать ДО первого платного вызова. Цены и окна — греп ПИК DEEPSEEK.
  4. platform/docs/STACK_DECISIONS.md §«Стенд разработчика» — рецепт подъёма стенда и инвентарь каналов шва.
  5. Строки бэклога 16 и 224 (docs/BACKLOG.md, греп ^| N |).

Ратифицированное и замеренное, что нужно для работы (в теле промта, не искать):

  • D39.144 — банк подписывается ВЕСЬ ОДНИМ ОК; резюм снимает стоп при ЛЮБОМ состоянии решений.
  • D39.178 — сборка выгрузки идёт --partial: книга с дырами всё равно соберётся и откроется. Это ратифицировано и правильно — и это же главный способ, которым твой прогон может соврать (§5.1).
  • D39.194 п.1 — цикл замкнут живьём 04.09, EPUB прошёл epubcheck 5.3.0; до complete=true не дошли.
  • Претрейн: 蛊真人 узнаётся моделями 4 из 5. ⇒ пак НЕ делает никаких утверждений о КАЧЕСТВЕ перевода. Узлы судятся механизмом — кадрами, флагами, леджером, — а не чтением текста. Это не осторожность, а условие осмысленности: на знакомом моделям тексте суждение о качестве стоит ноль.
  • Норма денег полигона: «не влезает в бюджет — СТОП и пинг, не резать молча». Подъём потолка просят при СРАБАТЫВАНИИ стопа, а не по проекции: прогнозный запрос оставляет ложный след «владелец согласился на пере-оплату», которой не было. ⚠ Носитель нормы — ролевой промт оркестратора; ссылку на D39.108 п.1 я снял 11.09, пере-проверив: в теле ноты этой формулировки НЕТ (нота — приёмка экспов 18/19/20). Норма действует, атрибуция была ложной.
  • Живость длинного платного прогона проверяется АКТИВНО: один вызов редактора законно идёт до ~21 минуты (attempt_max_s: 1240). Сторожи по РОСТУ events.jsonl и числу строк request_log, а не по ожиданию финального уведомления: зависшая задача от идущей неотличима по молчанию.

Какие полигонные нормы здесь НЕ действуют и почему. «Арм без фактора · дедуп + декой · пороги различимости · запрет судьи-родственника» — это нормы СРАВНИТЕЛЬНОГО замера. Твой пак сравнением не является: в нём одна рука, нет судейской линзы и нет слепого чтения. Поэтому вместо них действует пре-регистрация ОЖИДАЕМЫХ ИСХОДОВ (§4.3) — она играет ту же роль: не даёт прочитать «ноль ошибок» как успех. Не согласен — скажи с доводом, это законный ход.

4. Состав: четыре фазы. Порядок ЖЁСТКИЙ, содержимое — по разметке внутри

4.0 Фаза 0 — $0-ДЫМ ПО ЗАГЛУШКЕ. Делай РОВНО так, и это первая работа пака

Ни одного платного вызова, пока дым не прошёл целиком. Дым гоняет ТОТ ЖЕ драйвер и ТЕ ЖЕ сборщики следов, что и платная фаза, но на заглушке провайдера (~/tm-p9-work/fake_provider.py; Go-порт — backend/internal/pipeline/translate_resnapshot_live_test.go, греп fake; рецепт пайплайна на local-qwen3-8bplatform/docs/STACK_DECISIONS.md §«Стенд разработчика»).

Что дым обязан доказать ДО денег: стенд поднят и порт отвечает ТВОЕМУ pid · гость заведён · книга принята · прогон стартовал · кадры доехали · узел подписи ответил · резюм прошёл · выгрузка собралась и файл скачался · все три сборщика следов печатают то, что обещали. Дым идёт на ОТДЕЛЬНОЙ книге и отдельной базе — платная книга обязана быть первой в своей.

⚠ Дым на заглушке вырождает сами узлы (майнинг, гейты, банк): на заглушечной прозе банку неоткуда взяться. Это ожидаемо. Дым проверяет ТРУБУ, а не содержимое; содержимое проверяет фаза 2.

4.1 Предусловия стенда — делай РОВНО так; список замерен 11.09, пере-проверь каждое

Каждое из них СЕГОДНЯ не выполнено, и каждое способно сжечь «холодность» платной книги:

  1. Артефакта контраста майнинга нет ни одного на файловой системе. CheckMiningContrast откажет на старте translate — это $0, но останется failed-прогон, а следующий старт той же книги пойдёт уже как ПРОДОЛЖЕНИЕ, и книга перестанет быть холодной. Рецепт и пин — docs/experiments/16-bank-mining.md:183: jieba 0.42.1 dict.txt, sha256 7197c3211ddd98962b036cdf40324d1ea2bfaa12bd028e68faa70111a88e12a8 (вне git по построению, воспроизводим; строка бэклога 251 — живое подтверждение, что на этой машине его нет). ⚠ Ловушка имени: в конфигах путь называется mining-contrast.zh.txt (backend/configs/pipeline-c1.yaml:139) и резолвится ОТ КАТАЛОГА pipeline.yaml, а источник артефакта зовётся jieba_dict_general_zh.txt — это один файл под двумя именами, и греп по слову contrast в доке его не находит: там он по-русски. Сверяй sha, а не имя.
  2. eval/.venv не существует, jieba не установлен.
  3. Кластер Postgres опущен (~/.local/pgsql/bin/pg_ctl, данные в ~/.local/share/tmstand/pgdata, порт 55433). Кластер НЕ сносить и чужие базы не трогать: в нём лежат данные платного прогона 04.09. Заводи СВОЮ базу.
  4. epubcheck/java на хосте нет — а валидатор скачанного файла нужен. Поставь ДО фриза и назови в пре-реге (версию — числом).
  5. Порт может отвечать ЧУЖИМ процессом (PD-447): опознавай стенд по pid-на-порту, а не по ответу.
  6. На диске есть СТАРЫЕ стендовые копии tmctl (PD-432) — годится только бинарь из §4.2.

4.2 Фриз — делай РОВНО так

Фриз = sha коммита ПЛЮС бинари, собранные из git worktree add <путь> <sha>. Замер 11.09: сборка из главного дерева даёт vcs.modified=true от ОДНОГО untracked-файла — то есть главное дерево негодный источник. Драйвер перед каждым платным шагом печатает go version -m обоих бинарей и ОТКАЗЫВАЕТ, если vcs.modified=true или revision ≠ фриз-sha. Артефакты (контраст, шаблоны) класть в worktree ПОСЛЕ сборки.

В фриз-коммит идут: docs/experiments/24-<имя>.md — пре-рег с таблицей ожидаемых исходов (§4.3), sha256 среза книги, список глав с units_total (снято $0 до фриза), провайдер и пайплайн; eval/<каталог>/ — драйвер, обход HTTP, три сборщика следов и сверка; шаблон book.yaml с абсолютными путями в worktree. Без пере-фриза (но печатается в отчёт): величина гранта, TM_PLATFORM_HOLD_FACTOR_PERCENT, TTL выгрузки. Граница: меняется ЧТО покупается или чем судится — новый фриз-коммит и строка девиации в отчёте; меняется СКОЛЬКО можно потратить — объявление в отчёте. ⚠ Правка собственного драйвера ПОСЛЕ фриза — тоже новый фриз, а не «поправил и поехал».

Ключи провайдера — не читая .env: путь передаётся переменной TM_PLATFORM_ENGINE_KEYS_PATH, платформа отдаёт его движку аргументом --keys-file, мимо своего процесса.

4.3 Пре-регистрация ожидаемых исходов — делай РОВНО так; это главный рубеж пака

До первого платного вызова в фриз-коммите лежит таблица: узел → что ДОЛЖНО произойти, числом или строкой → чем это будет предъявлено (три следа) → что будет считаться ПРОВАЛОМ узла. Без неё ноль ошибок читается как успех, а любой исход — как ожидаемый.

Три следа — это три РАЗНЫХ носителя, и они названы поимённо (приор, снят разбором 11.09; пере-снимай адреса командой): (1) Postgres стендаbooks · chapters · units · runs · run_attempts · reservations · credit_ledger · book_events · exports; (2) диск движка и systemdevents.jsonl в каталоге книги (кадры hello/progress/unit_done/bank_stop/ceiling/spend/finished), маркер выхода юнита, project.db/request_log (читать mode=ro ПОСЛЕ выхода процесса), сайдкары .bank.json и mined-signature.yaml, journalctl --user -u tm-run-<run>-<n>; (3) HTTP и файл — ответы ручек, SSE, скачанные байты и их sha256.

Деньги сходятся ЧЕТЫРЬМЯ числами, и они печатаются: Σ request_log.cost_usd = spend.committed_usd из кадра = Σ credit_ledger settlement = (грант баланс). Открытых резерваций на конце — 0.

4.4 Фаза 2 — платный прогон. Книга задана, объём задан; всё остальное — твоё решение с доводом

Книга: books/gu-zhenren/coldrun-v16/guzhenren-ch1-10.gb18030.txt, главы 13 (≈4 юнита; глава 1 двухъединичная — пере-проверь манифестом ДО фриза, и если многоединичной главы в срезе нет, СТОП и пинг: без неё редакторская волна не покажет своего худшего случая, а ради него прогон и затевается). ⚠ Имя эксперимента выбери НЕ coldrun-a: каталог books/gu-zhenren/coldrun-a/ уже занят прогоном 24.08.

Узел подписи банка — самое ценное место прогона, и у него известная дыра. Платформа на стопе показывает total 0, signed 0 (строка 224): у её секции предложений читателя нет. Узел засчитывается пройденным ТОЛЬКО если движковый сайдкар показал предложения (.bank.json proposed[] ≥ 1 либо mined-signature.yaml), А платформа показала ноль — тогда это измеренная дыра с уликой. Если предложений нет и у движка — это ДРУГОЙ факт, и его надо назвать отдельно. Решение, которое принимаешь ты: провести через дверь ОДНО настоящее решение по банку (рекомендация: approve, подготовленный из сайдкара движка — единственный способ провести дверь правок по пути) либо резюмить неподписанным (D39.144 это разрешает). Выбор объяви в пре-реге ДО прогона, не после.

Чего делать НЕЛЬЗЯ: чинить найденное · править backend//platform/ · менять срез или пайплайн после фриза без нового фриза · тихо пополнять баланс при срабатывании потолка · интерпретировать провайдерскую аномалию без вендор-доки (CLAUDE.md: идём в официальную доку, НЕ гадаем).

4.5 Фаза 3 — $0 после прогона. Состав делай РОВНО так, глубину выбирай сам

  1. Сверка каждой строки пре-рег-таблицы с фактом: ожидание → факт → сошлось/нет → чем предъявлено.
  2. Механический счёт расхождения форм по ОТГРУЖЕННОМУ тексту (не по черновику): сколько канонических терминов отданы более чем одной передачей и в каких главах. ⚠ Это МЕХАНИЧЕСКИЙ счёт, а не суждение о качестве (§3, претрейн). Он нужен, потому что сегодня такой меры по финальному тексту не существует вовсе: движок считает разброс форм по ЧЕРНОВИКУ на стопе майнинга.
  3. Список сломанного — каждая находка строкой: что · где (file:line или таблица) · чем предъявлена · насколько уверен (замерено / прочитано / подозрение). Это будущие ряды бэклога; заводить их буду я.

5. Чем прогон вырождается — восемь способов, и их снятие. Адверсариальный проход веди по ним

Самое дорогое здесь — прогон, прошедший «зелено» и не измеривший ничего. Способы названы, снятия заданы:

  1. Дверь выгрузки ВСЕГДА строит. --partial ратифицирован: книга с дырами соберётся и откроется, и файл на диске будет выглядеть успехом. Снятие: узел «выгрузка» пройден только при exports.complete = true и нулевых счётчиках отчёта сборки (pending/withheld/incomplete/stale/ghost) и finished.outcome = clean и delivered = units_total и всех units.state='translated'.
  2. Многоединичной главы фактически нет (нарезка могла сдвинуться). Снятие: $0-манифест ДО фриза, пин «≥1 глава с units_total ≥ 2», сверка после интейка; расхождение — стоп ДО оплаты.
  3. Пустота узла подписи прочтётся как «нечего подписывать» — см. §4.4.
  4. Деньги мимо сверки. Оплаченный 2xx с оборванным телом выглядит таймаутом; обрыв ДО заголовков не стоит ничего и не оставляет следа. Снятие: четырёхстороннее равенство §4.3 печатается числами; строки request_log с непустым err или finish_reason ≠ stop перечисляются поимённо.
  5. Потолок посреди редактуры. Проекция цены — НИЖНЯЯ граница (на 08.09 факт был ×3.6 от неё). Прогон встанет paused credit_exhausted — это законное состояние, и экспорт после него соберёт частичную книгу (см. п.1). Снятие: ожидаемый исход — ready и пустой paused_reason; paused = СТОП и пинг оркестратору, без тихого пополнения.
  6. Чужой стенд и ложная зелень: порт отвечает чужим процессом · ничьи базы в кластере · старый стендовый tmctl · vcs.modified=true. Снятие: pid-на-порту · своя база · оба go version -m в отчёте · контрольное число «прогонов по этой книге = 1».
  7. Отказ на старте не бесплатен для ЭКСПЕРИМЕНТА (артефакт контраста, §4.1 п.1): $0 по деньгам, но книга после failed уже не холодная. Снятие: дым и предусловия — ДО загрузки платной книги; платная книга получает свежий id.
  8. Претрейн (§3): никаких суждений о качестве. Снятие: пре-рег объявляет это прямо.

И общий мандат самопроверки ИСПОЛНЕНИЕМ: ревью СВОЕГО кода драйвера, СВОИХ запросов и ПОЛУЧЕННЫХ результатов. Самоотчёт «проверено» без исполнения регулярно оказывается ложным и здесь стоит денег. Субагентов спавнить РАЗРЕШЕНО и требуется (иначе дефолт-запрет харнесса тихо победит), модель задавай ЯВНО. Отрицательный замер печатает КОНТРОЛЬНУЮ ВЕЛИЧИНУ рядом с нулём: «строк с ошибкой 0, строк прибор прочёл 47». Не «проверено с контрольной строкой» — само число. Критик полноты — на КАЖДУЮ фазу, а не на пакет в конце.

6. Предметные оси ревью

Полигон/замеры: пере-вывод чисел из СЫРЬЯ (не из чужой сводки); независимость сигналов — три следа обязаны быть разными носителями, а не тремя проекциями одного; вывод на агрегате до вскрытия единиц запрещён. Деньги: из сырого леджера ДВУМЯ независимыми путями; леджер — нижняя граница.

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

До первой команды пришли оркестратору ≤15 строк: как ведёшь фазы · где ждёшь сопротивления · что считаешь спорным в самом заказе. Пре-рег-таблица §4.3 присылается ОТДЕЛЬНО и до фриза — я её читаю.

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

Каждое число и каждая категорика — с командой, которой получены, и её выводом. Число называет ДЕРЕВО (sha либо «рабочее дерево + что незакоммичено») и ПОПУЛЯЦИЮ (что именно посчитано).

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

ДО первой команды пришли оркестратору первым действием, по адресу из /tmp/textmachine-channel (SendMessage, роль ОРКЕСТРАТОР) ≤10 строк: скоуп · инварианты · не-делать — СВОИМИ словами. Дословный пересказ промта подтверждает канал, но не понимание. Канала нет — эхо первой секцией отчёта.

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

Что не проверено · что не воспроизвелось · где данных не хватило · какой узел пришлось объявить непройденным. «Не измерено» вместо догадки. «Не проверено» ≠ «опровергнуто».

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

Конфликт промта с кодом или доками — пинг оркестратору, НЕ интерпретация. Право сказать «этого делать не надо» с аргументом — есть, и такие развилки поощряются. Всё, что касается денег сверх названного потолка, — через меня.

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

CLAUDE.md §«Связь между сессиями»: /tmp/textmachine-channel, свой блок дописать первым делом, живость адресата — ListAgents. Роли в файле нет или имя не отвечает ⇒ КАНАЛА НЕТ, и это НОРМАЛЬНЫЙ случай: сессии подряд НЕ опрашивать, вопрос — секцией в отчёт.

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

Работа завершена, когда: каждая строка пре-рег-таблицы имеет исход (сошлось · не сошлось с уликой · не проверено с причиной) · файл скачан и ОТКРЫТ, и это сказано отдельно · деньги сведены четырьмя числами · все находки перечислены с разметкой «замерено / прочитано / подозрение» · фриз-коммиты и девиации названы · артефакты в ДЕРЕВЕ, а не в письме · явное «работа завершена, править не планирую». Пак доводится до конца САМОЙ сессией (слово владельца 11.09): владельца не беспокоить, меня не тегать «просто так» — приёмка идёт последней и вторым кругом тебе не служит.

Деньги — ДВА числа, и они разные

Ожидаемая трата ≈ $0.30 (замер 08.09: 10 глав за committed = $1.259217 ⇒ ≈$0.13/глава; ⚠ вниз это не масштабируется линейно — майнинг платится раз на книгу). Машинный КАП ≈ $2.32.5 — это ХОЛД, а не ожидание: книжный бонд на c1 равен $2.00 (budget_usd + classify_budget_usd), и грант обязан быть не меньше холда, иначе допуск откажет. Владелец санкционировал платный прогон, зная оба числа.

Стоп-правила, каждое — остановка и пинг, а не решение сессии:

  • фактическая трата дошла до $0.80 — стоп, пинг, ждёшь моего слова;
  • прогон встал paused credit_exhausted — стоп и пинг (тихо не пополнять);
  • срез оказался без многоединичной главы — стоп ДО оплаты;
  • бинарь не из фриза (vcs.modified=true или чужой revision) — стоп до устранения.

Отчёт

docs/experiments/24-<имя>.md (пре-рег + результаты) + eval/<каталог>/ (драйвер и сборщики) + секция «Полигон» в docs/PROGRESS.md + сообщение мне: таблица «узел → ожидание → факт → чем предъявлено» · четыре числа денег · список сломанного с разметкой уверенности · что сказал твой критик полноты по каждой фазе · секция §10 · что ты сам считаешь слабым местом прогона. Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.