diff --git a/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md b/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md new file mode 100644 index 00000000..f2f198ed --- /dev/null +++ b/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md @@ -0,0 +1,318 @@ +# Промт сессии: ХОЛОДНЫЙ ПРОГОН ДВУХ КНИГ — платформа → движок → файл, ПАРАЛЛЕЛЬНО + +> Выдан оркестратором очереди №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 пп. 12–13 и §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` (строки 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 — **ОДИН** советчик на сессию, с постоянным контекстом. + +⛔ **Нормы платного замера, каждая исполнима без открытия ноты:** +- **пре-рег ДО денег:** фриз-коммит замороженного плана — единственный твой коммит, объявляется мне вслух + ДО того, как сделан; девиации — НОВЫМ коммитом и явно в отчёте; +- **не влезает в бюджет — СТОП и пинг, не резать молча;** +- **подъём потолков просить при СРАБАТЫВАНИИ стопа, а не по проекции:** прогнозный запрос оставляет ложный + след «владелец согласился на пере-оплату», которой не было; +- ⛔ **живость длинного платного прогона проверяется АКТИВНО:** не ждать финального уведомления, а раз в + пару часов сверять рост числа вызовов и трат ДВУМЯ чтениями и докладывать «жив». **Зависшая задача от + идущей по сигналу завершения неотличима.** + +**ЧЕТЫРЕ МЕСТА, ГДЕ ЭТОТ ПАК МЯГОК ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:** + +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. Когда пак считается завершённым + +- [ ] Обе книги дошли до ФАЙЛА, и файл прочитан человеком либо агентом-оценщиком. +- [ ] Отчёт называет **что, где и как в коде пошло не так** — с адресом, а не «были ошибки». +- [ ] Оба мониторинга предъявлены: что читалось, чем, и **где была слепая зона**. +- [ ] Деньги — двумя независимыми путями, с названием прибора и знаменателя у каждого числа. +- [ ] Оценка качества обеих книг получена и разделена на три класса ошибок. +- [ ] Все улики, которые прогон уничтожает сам, сняты копиями с хешами. +- [ ] Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ, а не просто названы. +- [ ] Явное **«работа завершена, править не планирую»**. + +⛔ **И последнее.** Ценность этого прогона не в том, что он пройдёт. Она в том, что впервые сработают +механизмы, которые два прежних прогона не задели ни разу. **Сработавший стоп — это купленное знание. +Необъяснённый сработавший стоп — это выброшенные деньги.**