32 KiB
Промт сессии: ХОЛОДНЫЙ ПРОГОН ДВУХ КНИГ — платформа → движок → файл, ПАРАЛЛЕЛЬНО
Выдан оркестратором очереди №23. Пак ПЛАТНЫЙ. Траты ратифицированы владельцем 18.09 дословно: «траты я ратифицирую, тратьте сколько нужно, сейчас на дипсике 4 доллара вам должно хватить. Тратьте, главное полученный прослеженный результат».
⛔ СТАРТ ГЕЙЧЕН. Прогон не начинается, пока оркестратор не ратифицирует готовность обеих зон АКТОМ. Ты можешь и должна делать всё, что до первого цента: подъём, дым по заглушке, фриз, мониторинги. Первый платный вызов — только по моему явному слову.
1. Какая проблема и что решит твой результат
Проект переводит книги мультиагентным LLM-пайплайном: платформа принимает книгу и продаёт прогон, движок переводит, дверь выгрузки отдаёт файл. Сквозной путь пройден дважды — прогоны A и B, обе китайские книги по три главы. Ни разу не проверены три вещи: книга ДЛИННЕЕ трёх глав, ВТОРАЯ языковая пара, и ДВА прогона одновременно.
Твой результат: две книги — около 20 глав китайской «мастер гу» и книга Кристоффа сопоставимого объёма — проходят весь путь через API платформы, параллельно, и по итогу известно: что получилось, сколько стоило, где код повёл себя не так, и каково качество перевода на обеих парах.
⛔ Слово владельца 18.09 про наблюдение, дословно: «обозначь сессии чтоб она следила мониторингом за платформой и бэкендом чтоб смотрела на логи, события, метрики и так далее что выводится. И чтоб фиксировала проблемы и чтоб занесла это в отчет, пусть эта сессия холодного пака дергает все через апи платформы». ⇒ в отчёте должно быть сказано, ЧТО, ГДЕ и КАК в коде пошло не так — с адресом, а не «были ошибки».
⚠ Это не стресс-тест и не демонстрация. Прогоны A и B ни разу не задели ни одного стоп-правила и ни одного потолка. На двадцати главах они, скорее всего, выстрелят впервые — и это и есть новое знание, ради которого прогон покупается. Сработавший стоп не есть провал прогона; необъяснённый сработавший стоп — есть.
2. Зона записи и git
Твоя зона — твой рабочий каталог прогона и docs/experiments/. Код backend/ и platform/ ты НЕ
правишь: нашла дефект — фиксируешь с адресом и пингуешь оркестратора. Это жёстко: прогон, чинящий
найденное на ходу, перестаёт быть прогоном и становится отладкой.
Коммитишь только пре-рег фризы — замороженный план замера ДО платных вызовов. Всё остальное лендит оркестратор.
⛔ НИКОГДА не читай .env и .env.* — там боевые ключи. Путь называть можно, содержимое нет.
⚠ Живость ключей проверяется ПЕРВЫМ платным вызовом и ничем иным. Отказ по авторизации — стоп и мой поход
к владельцу, не твоя попытка починить.
3. Карта чтения — пять позиций, и она ЗАКОН
CLAUDE.md— канон, цели, гардрейлы.docs/experiments/24-door-to-file.md— разбор прогона A. ⛔ Читай §10 пп. 12–13 и §12 п. 5 как инструкцию, а не как историю: там перечислены дефекты ЕГО СОБСТВЕННОГО прибора.docs/experiments/25-door-to-file-b.md— разбор прогона B.eval/cold_run_b/door.py— драйвер прогона B. Это твоя основа, см. §4.2.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 (строки 22–23). Арифметика: прогон 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 — ОДИН советчик на сессию, с постоянным контекстом.
⛔ Нормы платного замера, каждая исполнима без открытия ноты:
- пре-рег ДО денег: фриз-коммит замороженного плана — единственный твой коммит, объявляется мне вслух ДО того, как сделан; девиации — НОВЫМ коммитом и явно в отчёте;
- не влезает в бюджет — СТОП и пинг, не резать молча;
- подъём потолков просить при СРАБАТЫВАНИИ стопа, а не по проекции: прогнозный запрос оставляет ложный след «владелец согласился на пере-оплату», которой не было;
- ⛔ живость длинного платного прогона проверяется АКТИВНО: не ждать финального уведомления, а раз в пару часов сверять рост числа вызовов и трат ДВУМЯ чтениями и докладывать «жив». Зависшая задача от идущей по сигналу завершения неотличима.
ЧЕТЫРЕ МЕСТА, ГДЕ ЭТОТ ПАК МЯГОК ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:
- ⛔ Два прогона рядом портят числа друг друга, и порча выглядит свойством предмета. Каждый прогон живёт в своём юните с собственным потолком памяти (по умолчанию четыре гигабайта), а на машине одиннадцать и часть занята. Убийство по нехватке памяти в юните неотличимо от падения движка: у первого нет строки-итога и уведомление приходит как убийство, у второго есть код возврата и имена упавших тестов. Различай прибором, а не впечатлением.
- ⛔ «Прогон идёт» и «прогон завис» неразличимы без активного опроса. На прогоне B вопросы задавались УЖЕ КОНЧИВШЕМУСЯ прогону, и «вторая проба дала не то» оказалось про прибор, а не про предмет.
- ⛔ Инструмент, который пере-матчит, докладывает книгу консистентной по терму, который он ни разу не нашёл. На прогоне B поиск по префиксу дал 27 «попаданий» вместо 10. Каждую строку прибора консистентности проверяй руками ПРЕЖДЕ, чем нести её в отчёт.
- ⛔ Сессия потеряет оба платных прогона, если потеряет сессию. Задержка пользовательских юнитов выключена: они живут в менеджере твоей сессии. Это не чинится тобой — это называется в отчёте и учитывается в плане.
6. Оси ревью
- Замеры: пере-вывод чисел из СЫРЬЯ; у каждого фактора — арм без него; катастроф-скрин к победителю; вывод на агрегате до вскрытия единиц запрещён.
- Швы: приёмка узла по ТРЁМ независимым следам, и помни, что платформа и движок — один свидетель, а не два.
- Деньги: два независимых пути, знаменатель печатается.
7. Пре-регистрация вместо записки-плана
До первого цента — замороженный план: что покупается, сколько ожидается, какой машинный потолок, что считается успехом каждого шага, и какой знаменатель у каждого числа, которое будет предъявлено. ⛔ Знаменатель пре-регистрируется ДО прогона: иначе прогон ответит числом на другой вопрос.
8. Заявление есть команда
Каждое число и каждая категоричная фраза — с командой. У каждого НУЛЯ печатается контрольная величина.
Ловушки среды, каждая даёт тихий ложный ноль:
- обёртка
grepчтит игнор-файлы и не видит каталог книг — по корню бериcommand grep; findздесь bfs: относительное время только-mmin, и он тоже чтит игнор-файлы, поэтому книги им не находятся вовсе;- командной утилиты для баз нет; читать
python3, только на чтение; - ⚠ знаки и байты — разные популяции (кириллица весит два), «строк» и «вхождений» — тоже. Оба прибора честны, и именно поэтому расхождение читается как порча данных, а не как разные вопросы.
9. Эхо старта
До работы — ≤10 строк СВОИМИ словами: скоуп · инварианты · чего не делаешь. Шли мне первым действием.
10. Что НЕ удалось и где прибор слеп
Обязательная секция, две половины: «что не получилось» и «что ты знаешь и не сказала» — что невидимо · почему не чинила · чем закрывается.
11. Канал вопросов и право отказаться
Конфликт промта с деревом — пинг, а не интерпретация. Право сказать «этого делать не надо» с аргументом есть, и оно поощряется. ⚠ Прогону запрещено чинить найденное — только фиксировать и пинговать.
12. Прямой канал
/tmp/textmachine-channel — впиши свой блок первым делом. ⚠ Адрес из файла не доказывает, что сессия жива:
сверься с ListAgents.
13. Когда пак считается завершённым
- Обе книги дошли до ФАЙЛА, и файл прочитан человеком либо агентом-оценщиком.
- Отчёт называет что, где и как в коде пошло не так — с адресом, а не «были ошибки».
- Оба мониторинга предъявлены: что читалось, чем, и где была слепая зона.
- Деньги — двумя независимыми путями, с названием прибора и знаменателя у каждого числа.
- Оценка качества обеих книг получена и разделена на три класса ошибок.
- Все улики, которые прогон уничтожает сам, сняты копиями с хешами.
- Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ, а не просто названы.
- Явное «работа завершена, править не планирую».
⛔ И последнее. Ценность этого прогона не в том, что он пройдёт. Она в том, что впервые сработают механизмы, которые два прежних прогона не задели ни разу. Сработавший стоп — это купленное знание. Необъяснённый сработавший стоп — это выброшенные деньги.