30 KiB
Промт: полигон-пак «ХОЛОДНЫЙ ПРОГОН 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. Карта чтения — ЗАКОН, дальше только по её ссылкам
CLAUDE.md— цели владельца и гардрейлы.docs/experiments/09-pilot-protocol.md+eval/README.md— как устроена полигон-зона и пре-регистрация.docs/experiments/00-provider-quirks.md— оплаченные провайдерские факты; читать ДО первого платного вызова. Цены и окна — грепПИК DEEPSEEK.platform/docs/STACK_DECISIONS.md§«Стенд разработчика» — рецепт подъёма стенда и инвентарь каналов шва.- Строки бэклога 16 и 224 (
docs/BACKLOG.md, греп^| N |).
Ратифицированное и замеренное, что нужно для работы (в теле промта, не искать):
D39.144— банк подписывается ВЕСЬ ОДНИМ ОК; резюм снимает стоп при ЛЮБОМ состоянии решений.D39.178— сборка выгрузки идёт--partial: книга с дырами всё равно соберётся и откроется. Это ратифицировано и правильно — и это же главный способ, которым твой прогон может соврать (§5.1).D39.194п.1 — цикл замкнут живьём 04.09, EPUB прошёлepubcheck5.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-8b — platform/docs/STACK_DECISIONS.md §«Стенд разработчика»).
Что дым обязан доказать ДО денег: стенд поднят и порт отвечает ТВОЕМУ pid · гость заведён · книга принята · прогон стартовал · кадры доехали · узел подписи ответил · резюм прошёл · выгрузка собралась и файл скачался · все три сборщика следов печатают то, что обещали. Дым идёт на ОТДЕЛЬНОЙ книге и отдельной базе — платная книга обязана быть первой в своей.
⚠ Дым на заглушке вырождает сами узлы (майнинг, гейты, банк): на заглушечной прозе банку неоткуда взяться. Это ожидаемо. Дым проверяет ТРУБУ, а не содержимое; содержимое проверяет фаза 2.
4.1 Предусловия стенда — делай РОВНО так; список замерен 11.09, пере-проверь каждое
Каждое из них СЕГОДНЯ не выполнено, и каждое способно сжечь «холодность» платной книги:
- ⛔ Артефакта контраста майнинга нет ни одного на файловой системе.
CheckMiningContrastоткажет на стартеtranslate— это $0, но останетсяfailed-прогон, а следующий старт той же книги пойдёт уже как ПРОДОЛЖЕНИЕ, и книга перестанет быть холодной. Рецепт и пин —docs/experiments/16-bank-mining.md:183: jieba 0.42.1dict.txt, sha2567197c3211ddd98962b036cdf40324d1ea2bfaa12bd028e68faa70111a88e12a8(вне git по построению, воспроизводим; строка бэклога 251 — живое подтверждение, что на этой машине его нет). ⚠ Ловушка имени: в конфигах путь называетсяmining-contrast.zh.txt(backend/configs/pipeline-c1.yaml:139) и резолвится ОТ КАТАЛОГАpipeline.yaml, а источник артефакта зовётсяjieba_dict_general_zh.txt— это один файл под двумя именами, и греп по словуcontrastв доке его не находит: там он по-русски. Сверяй sha, а не имя. eval/.venvне существует, jieba не установлен.- Кластер Postgres опущен (
~/.local/pgsql/bin/pg_ctl, данные в~/.local/share/tmstand/pgdata, порт 55433). ⛔ Кластер НЕ сносить и чужие базы не трогать: в нём лежат данные платного прогона 04.09. Заводи СВОЮ базу. epubcheck/javaна хосте нет — а валидатор скачанного файла нужен. Поставь ДО фриза и назови в пре-реге (версию — числом).- Порт может отвечать ЧУЖИМ процессом (
PD-447): опознавай стенд по pid-на-порту, а не по ответу. - На диске есть СТАРЫЕ стендовые копии
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) диск движка и systemd — events.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, главы 1–3 (≈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 после прогона. Состав делай РОВНО так, глубину выбирай сам
- Сверка каждой строки пре-рег-таблицы с фактом: ожидание → факт → сошлось/нет → чем предъявлено.
- Механический счёт расхождения форм по ОТГРУЖЕННОМУ тексту (не по черновику): сколько канонических терминов отданы более чем одной передачей и в каких главах. ⚠ Это МЕХАНИЧЕСКИЙ счёт, а не суждение о качестве (§3, претрейн). Он нужен, потому что сегодня такой меры по финальному тексту не существует вовсе: движок считает разброс форм по ЧЕРНОВИКУ на стопе майнинга.
- Список сломанного — каждая находка строкой: что · где (
file:lineили таблица) · чем предъявлена · насколько уверен (замерено / прочитано / подозрение). Это будущие ряды бэклога; заводить их буду я.
5. Чем прогон вырождается — восемь способов, и их снятие. Адверсариальный проход веди по ним
Самое дорогое здесь — прогон, прошедший «зелено» и не измеривший ничего. Способы названы, снятия заданы:
- ⛔ Дверь выгрузки ВСЕГДА строит.
--partialратифицирован: книга с дырами соберётся и откроется, и файл на диске будет выглядеть успехом. Снятие: узел «выгрузка» пройден только приexports.complete = trueи нулевых счётчиках отчёта сборки (pending/withheld/incomplete/stale/ghost) иfinished.outcome = cleanиdelivered = units_totalи всехunits.state='translated'. - Многоединичной главы фактически нет (нарезка могла сдвинуться). Снятие: $0-манифест ДО фриза, пин
«≥1 глава с
units_total ≥ 2», сверка после интейка; расхождение — стоп ДО оплаты. - Пустота узла подписи прочтётся как «нечего подписывать» — см. §4.4.
- Деньги мимо сверки. Оплаченный
2xxс оборванным телом выглядит таймаутом; обрыв ДО заголовков не стоит ничего и не оставляет следа. Снятие: четырёхстороннее равенство §4.3 печатается числами; строкиrequest_logс непустымerrилиfinish_reason ≠ stopперечисляются поимённо. - Потолок посреди редактуры. Проекция цены — НИЖНЯЯ граница (на 08.09 факт был ×3.6 от неё). Прогон
встанет
paused credit_exhausted— это законное состояние, и экспорт после него соберёт частичную книгу (см. п.1). Снятие: ожидаемый исход —readyи пустойpaused_reason;paused= СТОП и пинг оркестратору, без тихого пополнения. - Чужой стенд и ложная зелень: порт отвечает чужим процессом · ничьи базы в кластере · старый стендовый
tmctl·vcs.modified=true. Снятие: pid-на-порту · своя база · обаgo version -mв отчёте · контрольное число «прогонов по этой книге = 1». - Отказ на старте не бесплатен для ЭКСПЕРИМЕНТА (артефакт контраста, §4.1 п.1): $0 по деньгам, но
книга после
failedуже не холодная. Снятие: дым и предусловия — ДО загрузки платной книги; платная книга получает свежий id. - Претрейн (§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.3–2.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 · что ты сам считаешь слабым местом прогона.
⛔ Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.