textmachine/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md

32 KiB
Raw Blame History

Промт сессии: ХОЛОДНЫЙ ПРОГОН ДВУХ КНИГ — платформа → движок → файл, ПАРАЛЛЕЛЬНО

Выдан оркестратором очереди №23. Пак ПЛАТНЫЙ. Траты ратифицированы владельцем 18.09 дословно: «траты я ратифицирую, тратьте сколько нужно, сейчас на дипсике 4 доллара вам должно хватить. Тратьте, главное полученный прослеженный результат».

СТАРТ ГЕЙЧЕН. Прогон не начинается, пока оркестратор не ратифицирует готовность обеих зон АКТОМ. Ты можешь и должна делать всё, что до первого цента: подъём, дым по заглушке, фриз, мониторинги. Первый платный вызов — только по моему явному слову.


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

Проект переводит книги мультиагентным LLM-пайплайном: платформа принимает книгу и продаёт прогон, движок переводит, дверь выгрузки отдаёт файл. Сквозной путь пройден дважды — прогоны A и B, обе китайские книги по три главы. Ни разу не проверены три вещи: книга ДЛИННЕЕ трёх глав, ВТОРАЯ языковая пара, и ДВА прогона одновременно.

Твой результат: две книги — около 20 глав китайской «мастер гу» и книга Кристоффа сопоставимого объёма — проходят весь путь через API платформы, параллельно, и по итогу известно: что получилось, сколько стоило, где код повёл себя не так, и каково качество перевода на обеих парах.

Слово владельца 18.09 про наблюдение, дословно: «обозначь сессии чтоб она следила мониторингом за платформой и бэкендом чтоб смотрела на логи, события, метрики и так далее что выводится. И чтоб фиксировала проблемы и чтоб занесла это в отчет, пусть эта сессия холодного пака дергает все через апи платформы». ⇒ в отчёте должно быть сказано, ЧТО, ГДЕ и КАК в коде пошло не такс адресом, а не «были ошибки».

Это не стресс-тест и не демонстрация. Прогоны A и B ни разу не задели ни одного стоп-правила и ни одного потолка. На двадцати главах они, скорее всего, выстрелят впервые — и это и есть новое знание, ради которого прогон покупается. Сработавший стоп не есть провал прогона; необъяснённый сработавший стоп — есть.


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

Твоя зона — твой рабочий каталог прогона и docs/experiments/. Код backend/ и platform/ ты НЕ правишь: нашла дефект — фиксируешь с адресом и пингуешь оркестратора. Это жёстко: прогон, чинящий найденное на ходу, перестаёт быть прогоном и становится отладкой.

Коммитишь только пре-рег фризы — замороженный план замера ДО платных вызовов. Всё остальное лендит оркестратор.

НИКОГДА не читай .env и .env.* — там боевые ключи. Путь называть можно, содержимое нет. ⚠ Живость ключей проверяется ПЕРВЫМ платным вызовом и ничем иным. Отказ по авторизации — стоп и мой поход к владельцу, не твоя попытка починить.


3. Карта чтения — пять позиций, и она ЗАКОН

  1. CLAUDE.md — канон, цели, гардрейлы.
  2. docs/experiments/24-door-to-file.md — разбор прогона A. Читай §10 пп. 1213 и §12 п. 5 как инструкцию, а не как историю: там перечислены дефекты ЕГО СОБСТВЕННОГО прибора.
  3. docs/experiments/25-door-to-file-b.md — разбор прогона B.
  4. eval/cold_run_b/door.py — драйвер прогона B. Это твоя основа, см. §4.2.
  5. platform/deploy/README.md §«Дев-стенд» и §«Шаблон книги» — операторский рецепт.

docs/experiments/00-provider-quirks.md — ловушки провайдеров; читать ПЕРЕД первым платным вызовом.


4. Работа

4.1 ЧЕТЫРЕ ПРЕДСТАРТОВЫХ УСЛОВИЯ, каждое замерено мной и каждое сегодня НЕ выполнено

(1) Рабочие окружения обоих прежних стендов СЛОМАНЫ. Замер 18.09: /home/ubuntu-26 не существует (дом переименован), а stand/env.sh прогона A несёт одно упоминание этого пути, прогона B — пять. ⇒ все пути к бинарям, книгам, состоянию и ключам в них указывают в никуда. Скопировать env.sh и запустить — первая грабля. Пере-собери окружение, и КАЖДЫЙ путь проверь существованием, а не глазом.

(2) ДНЕВНОЙ ПОТОЛОК В ШАБЛОНЕ КНИГИ — САМАЯ ДОРОГАЯ МИНА ЭТОГО ПРОГОНА. Шаблон прежнего стенда несёт book_usd: 1.25 и day_usd: 2.50 (строки 2223). Арифметика: прогон A стоил $0.419424 за три главы ⇒ ≈$0.14 за главу ⇒ двадцать глав ≈ $2.8, что выше обоих. Книжный потолок платформа перебивает аргументом прогона. Дневной — НЕ перебивается ничем. А упершийся в него прогон встаёт в paused, и resume отвечает отказом: лечение — НОВЫЙ заказ, а не продолжение. Официальный операторский рецепт прямо велит дневной потолок в шаблон не класть (решение владельца 15.08). ⇒ шаблон книги этого прогона обязан НЕ нести дневного потолка, и это проверяется ДО интейка: платформа пишет конфиг книги ОДИН раз и больше его не читает.

(3) Демон не стартует без объявленных пар. Инстанс, принимающий загрузки без доступной пары, не поднимается вовсе. Для двух книг нужны обе пары. Проверяется ответом ручки возможностей, а не переменной окружения.

(4) Неверный путь к ключам провайдера даёт на буте только ПРЕДУПРЕЖДЕНИЕ. Демон объявит себя здоровым, книгу примет и возьмёт холд денега упадёт первый платный вызов, уже после резервирования. ⇒ путь проверяется существованием файла, а не отсутствием ошибки в логе.

Пятое условие снято мною сегодня: английский пакет промтов был НЕ закоммичен, и фриз-клон его бы не унёс. Теперь он в истории (8 файлов). Проверь это сама на своём фризе — git ls-files, а не ls.

4.2 Драйвер: бери прогон B, НЕ бери прогон A

РОВНО ТАК. Разбор прогона A назвал четыре дефекта своего харнесса. В драйвере A не починен ни один; в драйвере B починены три. Замер: гейт бинарей у A судит три бинаря, у B — пять.

дефект прибора A в A в B
ни одно HTTP-тело платного прогона не сохранено — печаталось на экран жив починен: каждый запрос и ответ пишется в файл ДО возврата вызывающему
ложная живость: печатался максимум по попыткам, и во время второй число выглядело замершим жив починен: строка НА КАЖДУЮ попытку
гейт фриза судит три бинаря из пяти — два инструмента собраны не из фриза и не проверены жив починен: все пять
сборщик денег суммирует леджер по ВСЕМ учёткам сразу жив починен: фильтр по учётке плюс контроль «по всем»

И сохранение тел спасло прогон B от ЛОЖНОЙ находки: греп по ключам показал одно, а в сохранённом ТЕЛЕ первым полем стояло другое. «Грепу верила, файлу проверила.»

Но у драйвера B есть два дефекта, которых не назвал никто, и оба твои:

  • он ОДНОКНИЖНЫЙ. Рабочий каталог, файл состояния и каталог улик берутся из окружения без переопределения. Две книги = два разных рабочих каталога, иначе вторая перетрёт состояние первой и обе улики уедут в одну кучу. РЕШИ САМА, как разделить, но предъяви, что разделение работает, ДО первого цента;
  • разбивка движковых чисел по попыткам считается по ПОСЛЕДНЕМУ СИМВОЛУ идентификатора трассы (eval/cold_run_b/door.py:339=select substr(trace_id,-1)). На попытке десять и дальше это уже не номер попытки. Предел попыток на прогон — двадцать, и на двадцатиглавой книге с паузами десять достижимы. ⇒ почини, прежде чем считать. Различитель лежит в той же строке: номер попытки несёт сам идентификатор.

4.3 Два мониторинга — что именно наблюдать

РОВНО ТАК: наблюдение строится ДО старта, а не по ходу. Требование владельца.

Движок (его база прогона и журнал процесса): строка на КАЖДЫЙ вызов с моделью, токенами, ценой, задержкой, причиной завершения; строка на (глава, чанк, стадия) с диспозицией и числом попыток; таблица трат — носитель обоих потолков; поток событий с семью типами кадров, где кадр потолка несёт недостачу, а финальный — деньги и объём. Плюс tmctl status/report — они читают базу ЖИВОГО прогона за $0.

КАК ЧИТАТЬ ЖИВУЮ БАЗУ. Она в режиме журнала опережающей записи. Флаг «файл неизменен» на ЖИВОЙ базе ставить НЕЛЬЗЯ: он велит читателю игнорировать журнал, и тот молча получает устаревший снимок — ложный низкий ноль. На живой — только режим чтения; флаг неизменности — для КОПИЙ и законченных баз.

Платформа: прогоны и их статусы с причиной паузы; строка на каждую попытку с накопленной тратой и кодом выхода; леджер кредитов; открытые холды; состояние юнитов; буфер событий, читаемый запросом без подписки; выгрузки. Плюс метрики (глубина очереди, живые прогоны, отставание чтения, застрявшие прогоны) и админ-команда списка прогонов — это лучшая одноэкранная сводка для вахты на две книги.

ОС, вне цепочки платформы: маркеры выхода в каталоге состояния и состояние транзиентных юнитов. Это единственные по-настоящему НЕЗАВИСИМЫЕ свидетели: база платформы материализуется из потока событий движка, поэтому «платформа, диск и отчёт согласны» — это один свидетель, а не три.

СЛЕПЫЕ ЗОНЫ — назови их в отчёте, даже если ничего не случится:

  • пустой ответ и обрыв по длине в телеметрии неразличимыоба приходят одной причиной завершения; различает только журнал процесса;
  • поле ошибки пусто на ВСЕХ строках, включая провальные — на двух прогонах 33 из 33 и 35 из 35. Любой аудит отказов, написанный через это поле, прочтёт прогон как идеально чистый;
  • токены размышления не несли числа ни разу за историю проекта;
  • доли ответов классификатора банка не считает ни один счётчик; итоговая строка стадии печатает ноль о другом проходе;
  • биллинга провайдера у нас нет вовсе: провайдер сообщает токены, доллары умножены нашим пином. Пин завышает примерно на шесть процентов, а пиковая цена против внепиковой даёт расхождение примерно вдвое. ⇒ любое число в долларах в отчёте называется «по нашему пину», а не «мы заплатили».

ОТДЕЛЬНО, и это ряд 502: упор в баланс ПРОВАЙДЕРА. Транспорт классифицирует его верно — терминально, без пустых ретраев. Но типизированная ошибка не покидает пакет транспорта, и исхода, отличимого от обычного терминального падения стадии, у неё НЕТ. ⇒ держи журнал процесса обеих книг под наблюдением и лови в нём код 402 и слова про исчерпанные средства. Иначе упор в баланс провайдера будет прочитан как поломка движка на середине оплаченной книги. Событие не гипотетическое: на одной оси замеров проекта 44 записи об ошибке из 52 — ровно такой отказ.

4.4 Улики, которые прогон уничтожает сам

Проекция банка перезаписывается атомарно в начале следующей попытки ⇒ предложения, на которых открывали экран подписи, выживают только копией, снятой на стопе. Замер прогона A: хеш файла до резюма и после — разные. Файл банк-стопа пишется НЕ атомарно, поэтому снимается только когда прогон стои́т. ⇒ РОВНО ТАК: снимай копии на каждой границе и печатай их хеши.

4.5 Деньги — что известно и на чём уже наступали

  • Накопленная трата попытки — величина НАКОПЛЕННАЯ, а не приращение. Сумма по попыткам на прогоне A дала завышение на 38 %.
  • Четверть денег прогона A купила пустоту: 4 вызова из 27 не дали пригодного текста и стоили 25.4 % цены книги; самый дорогой одиночный вызов книги не дал ничего и молчал четыре минуты. Лечение в движке есть и сработало четыре раза из четырёх — путь не рвётся, он дорожает.
  • Согласие на пере-оплату выдаётся на ВЕСЬ бюджет прогона — на A разрыв с фактической пере-покупкой был семьдесят восемь крат.
  • Смета против факта: ×4.99 на A. Две точки — разброс, не закон.
  • Терминологический контур оплачивается дважды, если прогон останавливался на подпись и продолжился.

РОВНО ТАК: деньги в отчёте — из сырого леджера ДВУМЯ независимыми путями, и рядом печатается, сколько файлов прибор обошёл и сколько из них оказались копиями. Свод обходом диска завышает трату кратно числу копий базы — замерено, было десятикратное завышение.

4.6 Оценка качества — два агента-опуса, по одному на перевод

РОВНО ТАК по форме: каждый получает весь оригинал и весь перевод одной книги в одном запросе и контекст репозитория; окна в миллион токенов на это хватает с запасом. РЕШИ САМА, что именно спросить, но отчёт агента обязан различать три вещи: ошибки смысла (переведено неверно), ошибки консистентности (один термин передан по-разному), ошибки голоса и ритма (translationese, сплавленные абзацы, потерянные акценты).

Что уже известно и с чем сравнивать: единственный человек, читавший выход прогона B целиком, назвал его «приличным любительским, на верхней границе» и указал три системные слабости — ритм (230 абзацев оригинала сплавлены в 158), идиомы и несведённая терминология. Это одна оценка одной книги одним читателем, и в таком виде она и приводится.

И то, что делает английскую оценку особенной: у английской книги 4842 носителя курсива, и до правки ингеста они до модели НЕ ДОЕЗЖАЮТ вовсе. Если пак готовности их довёз — оценщик обязан сказать, видно ли это в тексте. Если не довёз — потеря пре-регистрируется по классам ДО прогона, чтобы оценщик не приписал её паре, промту или модели.

4.7 Фриз

РОВНО ТАК: фриз-дерево — локальный КЛОН, а не связанное рабочее дерево. Бинарь, собранный в связанном воркри, не несёт штампа системы контроля версий ВООБЩЕ, и правило «отказывать при изменённом дереве» на нём выполняется всегда, то есть не проверяет ничего. Проверено по исходникам инструментария: поиск корня пропускает воркри, потому что там служебный путь — файл, а не каталог. ⇒ три условия отказа, не одно: ревизия совпадает с фризом · дерево не изменено · строк штампа больше нуля. ⚠ У фриза несколько разных чисел — чем собраны бинари, чем заморожен план, чем заморожены инструменты. У каждого в отчёте пиши, на какой вопрос он отвечает. На прогоне A один из файлов до конца смены нёс ревизию брошенного дерева, из которого не собрано ничего.


5. Самопроверка исполнением — и где у ЭТОГО пака мягко

Мандат обязателен: ревью исполнением своего кода, своих запросов и полученных результатов. Субагенты разрешены. Fable 5 — ОДИН советчик на сессию, с постоянным контекстом.

Нормы платного замера, каждая исполнима без открытия ноты:

  • пре-рег ДО денег: фриз-коммит замороженного плана — единственный твой коммит, объявляется мне вслух ДО того, как сделан; девиации — НОВЫМ коммитом и явно в отчёте;
  • не влезает в бюджет — СТОП и пинг, не резать молча;
  • подъём потолков просить при СРАБАТЫВАНИИ стопа, а не по проекции: прогнозный запрос оставляет ложный след «владелец согласился на пере-оплату», которой не было;
  • живость длинного платного прогона проверяется АКТИВНО: не ждать финального уведомления, а раз в пару часов сверять рост числа вызовов и трат ДВУМЯ чтениями и докладывать «жив». Зависшая задача от идущей по сигналу завершения неотличима.

ЧЕТЫРЕ МЕСТА, ГДЕ ЭТОТ ПАК МЯГОК ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:

  1. Два прогона рядом портят числа друг друга, и порча выглядит свойством предмета. Каждый прогон живёт в своём юните с собственным потолком памяти (по умолчанию четыре гигабайта), а на машине одиннадцать и часть занята. Убийство по нехватке памяти в юните неотличимо от падения движка: у первого нет строки-итога и уведомление приходит как убийство, у второго есть код возврата и имена упавших тестов. Различай прибором, а не впечатлением.
  2. «Прогон идёт» и «прогон завис» неразличимы без активного опроса. На прогоне B вопросы задавались УЖЕ КОНЧИВШЕМУСЯ прогону, и «вторая проба дала не то» оказалось про прибор, а не про предмет.
  3. Инструмент, который пере-матчит, докладывает книгу консистентной по терму, который он ни разу не нашёл. На прогоне B поиск по префиксу дал 27 «попаданий» вместо 10. Каждую строку прибора консистентности проверяй руками ПРЕЖДЕ, чем нести её в отчёт.
  4. Сессия потеряет оба платных прогона, если потеряет сессию. Задержка пользовательских юнитов выключена: они живут в менеджере твоей сессии. Это не чинится тобой — это называется в отчёте и учитывается в плане.

6. Оси ревью

  • Замеры: пере-вывод чисел из СЫРЬЯ; у каждого фактора — арм без него; катастроф-скрин к победителю; вывод на агрегате до вскрытия единиц запрещён.
  • Швы: приёмка узла по ТРЁМ независимым следам, и помни, что платформа и движок — один свидетель, а не два.
  • Деньги: два независимых пути, знаменатель печатается.

7. Пре-регистрация вместо записки-плана

До первого цента — замороженный план: что покупается, сколько ожидается, какой машинный потолок, что считается успехом каждого шага, и какой знаменатель у каждого числа, которое будет предъявлено. Знаменатель пре-регистрируется ДО прогона: иначе прогон ответит числом на другой вопрос.


8. Заявление есть команда

Каждое число и каждая категоричная фраза — с командой. У каждого НУЛЯ печатается контрольная величина.

Ловушки среды, каждая даёт тихий ложный ноль:

  • обёртка grep чтит игнор-файлы и не видит каталог книг — по корню бери command grep;
  • find здесь bfs: относительное время только -mmin, и он тоже чтит игнор-файлы, поэтому книги им не находятся вовсе;
  • командной утилиты для баз нет; читать python3, только на чтение;
  • знаки и байты — разные популяции (кириллица весит два), «строк» и «вхождений» — тоже. Оба прибора честны, и именно поэтому расхождение читается как порча данных, а не как разные вопросы.

9. Эхо старта

До работы — ≤10 строк СВОИМИ словами: скоуп · инварианты · чего не делаешь. Шли мне первым действием.


10. Что НЕ удалось и где прибор слеп

Обязательная секция, две половины: «что не получилось» и «что ты знаешь и не сказала» — что невидимо · почему не чинила · чем закрывается.


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

Конфликт промта с деревом — пинг, а не интерпретация. Право сказать «этого делать не надо» с аргументом есть, и оно поощряется. ⚠ Прогону запрещено чинить найденное — только фиксировать и пинговать.


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

/tmp/textmachine-channel — впиши свой блок первым делом. ⚠ Адрес из файла не доказывает, что сессия жива: сверься с ListAgents.


13. Когда пак считается завершённым

  • Обе книги дошли до ФАЙЛА, и файл прочитан человеком либо агентом-оценщиком.
  • Отчёт называет что, где и как в коде пошло не такс адресом, а не «были ошибки».
  • Оба мониторинга предъявлены: что читалось, чем, и где была слепая зона.
  • Деньги — двумя независимыми путями, с названием прибора и знаменателя у каждого числа.
  • Оценка качества обеих книг получена и разделена на три класса ошибок.
  • Все улики, которые прогон уничтожает сам, сняты копиями с хешами.
  • Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ, а не просто названы.
  • Явное «работа завершена, править не планирую».

И последнее. Ценность этого прогона не в том, что он пройдёт. Она в том, что впервые сработают механизмы, которые два прежних прогона не задели ни разу. Сработавший стоп — это купленное знание. Необъяснённый сработавший стоп — это выброшенные деньги.