Rewrite the cold run pack after thirteen majors: size the English slice by tokens, add the seven stop rules, one stand for two books, and correct a blind zone closed a month ago

This commit is contained in:
heaven 2026-09-18 06:04:42 +03:00
parent 0108cada05
commit 6dcd69f38b

View file

@ -4,286 +4,349 @@
> «траты я ратифицирую, тратьте сколько нужно, сейчас на дипсике 4 доллара вам должно хватить. Тратьте,
> главное полученный прослеженный результат».
>
> ⛔ **СТАРТ ГЕЙЧЕН.** Прогон не начинается, пока оркестратор не ратифицирует готовность обеих зон АКТОМ.
> Ты можешь и должна делать всё, что до первого цента: подъём, дым по заглушке, фриз, мониторинги. Первый
> платный вызов — только по моему явному слову.
> ⛔ **СТАРТ ГЕЙЧЕН АКТОМ ГОТОВНОСТИ.** Делай всё, что до первого цента: подъём, дым по заглушке, фриз,
> мониторинги, пре-регистрация. Первый платный вызов — только по моему явному слову.
>
> ⚠ **Редакция 2.** Первая переписана после опровергателя: **тринадцать мажоров**, из них бюджет, который
> не сходился вдвое, отсутствующий список стоп-правил и протухшая слепая зона. Числа помечены прибором.
---
## 1. Какая проблема и что решит твой результат
Проект переводит книги мультиагентным LLM-пайплайном: платформа принимает книгу и продаёт прогон, движок
переводит, дверь выгрузки отдаёт файл. Сквозной путь пройден дважды — прогоны A и B, обе китайские книги по
три главы. **Ни разу не проверены три вещи:** книга ДЛИННЕЕ трёх глав, ВТОРАЯ языковая пара, и ДВА прогона
одновременно.
Платформа принимает книгу и продаёт прогон, движок переводит, дверь выгрузки отдаёт файл. Сквозной путь
пройден дважды — прогоны A и B, обе китайские книги по три главы. **Ни разу не проверены три вещи:** книга
длиннее трёх глав, ВТОРАЯ языковая пара, и ДВА прогона одновременно.
**Твой результат:** две книги — около 20 глав китайской «мастер гу» и книга Кристоффа сопоставимого объёма —
проходят весь путь **через API платформы**, параллельно, и по итогу известно: что получилось, сколько
стоило, где код повёл себя не так, и каково качество перевода на обеих парах.
**Твой результат:** две книги — около 20 глав китайской «мастер гу» и срез книги Кристоффа **равного объёма
в токенах** — проходят весь путь через API платформы, параллельно, и по итогу известно: что получилось,
сколько стоило, где код повёл себя не так, и каково качество перевода на обеих парах.
**Слово владельца 18.09 про наблюдение, дословно:** «обозначь сессии чтоб она следила мониторингом за
платформой и бэкендом чтоб смотрела на логи, события, метрики и так далее что выводится. И чтоб фиксировала
проблемы и чтоб занесла это в отчет, пусть эта сессия холодного пака дергает все через апи платформы».
**в отчёте должно быть сказано, ЧТО, ГДЕ и КАК в коде пошло не так**с адресом, а не «были ошибки».
**Слово владельца про наблюдение, дословно:** «обозначь сессии чтоб она следила мониторингом за платформой
и бэкендом чтоб смотрела на логи, события, метрики и так далее что выводится. И чтоб фиксировала проблемы и
чтоб занесла это в отчет, пусть эта сессия холодного пака дергает все через апи платформы». ⇒ **в отчёте
должно быть сказано, ЧТО, ГДЕ и КАК в коде пошло не так** — с адресом, а не «были ошибки».
**Это не стресс-тест и не демонстрация.** Прогоны A и B ни разу не задели ни одного стоп-правила и ни
одного потолка. На двадцати главах они, скорее всего, **выстрелят впервые** — и это и есть новое знание,
ради которого прогон покупается. Сработавший стоп не есть провал прогона; необъяснённый сработавший стоп —
есть.
**Это не демонстрация.** Прогоны A и B не задели ни одного стоп-правила и ни одного потолка. На двадцати
главах они, скорее всего, **выстрелят впервые**, и это новое знание, ради которого прогон покупается.
**Сработавший стоп — купленное знание. Необъяснённый сработавший стоп — выброшенные деньги.**
---
## 2. Зона записи и git
**Твоя зона — твой рабочий каталог прогона и `docs/experiments/`.** Код `backend/` и `platform/` ты **НЕ
правишь**: нашла дефект — фиксируешь с адресом и пингуешь оркестратора. Это жёстко: прогон, чинящий
найденное на ходу, перестаёт быть прогоном и становится отладкой.
правишь**: нашла дефект — фиксируешь с адресом и пингуешь. Прогон, чинящий найденное на ходу, перестаёт быть
прогоном.
Коммитишь **только пре-рег фризы** — замороженный план замера ДО платных вызовов. Всё остальное лендит
оркестратор.
**Разрешение, снимающее противоречие первой редакции:** инструменты прежних прогонов (`eval/cold_run_b/`)
ты берёшь **КОПИЕЙ в свой рабочий каталог** и правишь копию сколько нужно. Репозиторный `eval/` — зона
полигона, его не трогай; свои улучшения назови в отчёте, лендить буду я.
**НИКОГДА не читай `.env` и `.env.*`** — там боевые ключи. Путь называть можно, содержимое нет.
⚠ Живость ключей проверяется ПЕРВЫМ платным вызовом и ничем иным. Отказ по авторизации — стоп и мой поход
к владельцу, не твоя попытка починить.
Коммитишь **только пре-рег фризы** — замороженный план ДО платных вызовов.
**НИКОГДА не читай `.env` и `.env.*`.** Путь называть можно, содержимое нет. Живость ключей проверяется
ПЕРВЫМ платным вызовом и ничем иным.
---
## 3. Карта чтения — пять позиций, и она ЗАКОН
1. `CLAUDE.md` — канон, цели, гардрейлы.
2. `docs/experiments/24-door-to-file.md` — разбор прогона A. ⛔ **Читай §10 пп. 1213 и §12 п. 5 как
инструкцию, а не как историю:** там перечислены дефекты ЕГО СОБСТВЕННОГО прибора.
1. `CLAUDE.md` — канон, цели, гардрейлы. Внутри него — ссылка на `docs/experiments/00-provider-quirks.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. `eval/cold_run_b/` — драйвер `door.py` и прибор денег `measure.py`. **Это твоя основа.**
5. `platform/deploy/README.md` — операторский рецепт: §«Дев-стенд», §«Шаблон книги», §«Артефакт контраста».
---
## 4. Работа
### 4.1 ⛔ ЧЕТЫРЕ ПРЕДСТАРТОВЫХ УСЛОВИЯ, каждое замерено мной и каждое сегодня НЕ выполнено
### 4.1 ⛔ ШЕСТЬ ПРЕДСТАРТОВЫХ УСЛОВИЙ, каждое замерено, ни одно не выполнено само
**(1) Рабочие окружения обоих прежних стендов СЛОМАНЫ.** Замер 18.09: `/home/ubuntu-26` **не существует**
(дом переименован), а `stand/env.sh` прогона A несёт одно упоминание этого пути, прогона B — пять. ⇒ все
пути к бинарям, книгам, состоянию и ключам в них указывают в никуда. **Скопировать env.sh и запустить —
первая грабля.** Пере-собери окружение, и КАЖДЫЙ путь проверь существованием, а не глазом.
**(1) ВХОД ПАКА — АКТ ГОТОВНОСТИ, а не моё слово в переписке.** До него английская книга на боевом конфиге
отказывала до первого цента. Пак, снимающий это, сдан и принимается сейчас; **английская рука не поднимается,
пока я не пришлю номер акта.** Проверить сама: пишущим глаголом на заведённой английской книге, а не
читающим — читающий проходит и тогда, когда пишущий отказывает.
**(2) ⛔ ДНЕВНОЙ ПОТОЛОК В ШАБЛОНЕ КНИГИ — САМАЯ ДОРОГАЯ МИНА ЭТОГО ПРОГОНА.** Шаблон прежнего стенда несёт
`book_usd: 1.25` и `day_usd: 2.50` (строки 2223). Арифметика: прогон A стоил $0.419424 за три главы ⇒
≈$0.14 за главу ⇒ **двадцать глав ≈ $2.8**, что выше обоих. Книжный потолок платформа перебивает аргументом
прогона. **Дневной — НЕ перебивается ничем.** А упершийся в него прогон встаёт в `paused`, и `resume`
отвечает отказом: лечение — НОВЫЙ заказ, а не продолжение. Официальный операторский рецепт прямо велит
дневной потолок в шаблон не класть (решение владельца 15.08). ⇒ **шаблон книги этого прогона обязан НЕ нести
дневного потолка**, и это проверяется ДО интейка: платформа пишет конфиг книги ОДИН раз и больше его не
читает.
**(2) ⛔ АРТЕФАКТ КОНТРАСТА МАЙНИНГА — БЕЗ НЕГО ОТКАЗАН КАЖДЫЙ ПЕРЕВОД И КАЖДЫЙ РЕЗЮМ.** Инстанс поднимется
здоровым, книги примет — и откажет на каждой работе классом конфигурации. Файл кладётся **рядом с конфигом
пайплайна**, не с книгой. В git его нет; на машине он лежит в зеркалах прежних стендов. ⚠ Проверка делается
**$0-глаголом и судится по СООБЩЕНИЮ, а не по коду выхода** — оба исхода дают один код. ⚠ И проверяющий
глагол берёт эксклюзивную блокировку: на книге с идущим прогоном его запускать нельзя. ⚠ Сам гейт делает
только `stat` и удовлетворился бы подделкой — sha сверяется руками.
**(2б) ⛔ ШАБЛОН КНИГИ НЕ НЕСЁТ ПАР-СВЯЗАННЫХ КЛЮЧЕЙ — условие найдено 18.09 запиской бэкенд-сессии, не мной.**
Шаблон прежнего стенда кладёт в КАЖДУЮ книгу систему транскрипции («палладий» — систему для китайского) и
род обращения. Пока движок принимал это свободной строкой, английская книга молча получала китайскую
инструкцию. Пак готовности строит **громкий отказ** на имени политики, которого пара не знает, — и это
правильно. ⇒ **но твой шаблон обязан этих ключей не нести вовсе**, иначе английская книга будет отказана
на загрузке, и отказ будет верным.
⚠ Почему это не блокер и не чужая зона: **шаблон книги есть артефакт ОПЕРАТОРА**, отдельный файл по
абсолютному пути из переменной окружения (`platform/deploy/README.md:201` так и озаглавлен), платформа
подставляет ровно пять ключей и схемы движка не знает (`platform/internal/books/render.go:189`), а в её
зоне шаблонов нет ни одного (контроль: файлов yaml в `platform/deploy/` — 0). Шаблон создаёшь ты, вместе со
стендом, и кладёшь в него ровно то, что нужно. Это тот же файл, в котором не должно быть дневного потолка.
**(3) ⛔ ФАЙЛ КЛЮЧЕЙ ЛЕЖИТ НЕ ТАМ, ГДЕ ЕСТЕСТВЕННО ИСКАТЬ.** Замер 18.09: в рабочем дереве прогона
(`textmachine-main/backend/`) файла `.env` **НЕТ** — есть только пример. Настоящий лежит в **СОСЕДНЕМ
чекауте** `textmachine/backend/`. Прежние стенды это знали и несли путь явно. ⇒ подставишь свой — получишь на
буте **только предупреждение**, демон объявит себя здоровым, книгу примет и **возьмёт холд денег**, а упадёт
первый платный вызов, уже после резервирования. Проверка — существованием файла по названному пути.
**(3) Демон не стартует без объявленных пар.** Инстанс, принимающий загрузки без доступной пары, не
поднимается вовсе. Для двух книг нужны **обе** пары. Проверяется ответом ручки возможностей, а не
переменной окружения.
**(4) ⛔ ШАБЛОН КНИГИ: чего в нём НЕ должно быть и что обязано остаться.** Шаблон есть **артефакт ОПЕРАТОРА**
— отдельный файл по абсолютному пути из переменной окружения; платформа подставляет ровно пять ключей и схемы
движка не знает. Ты создаёшь его сама, и в нём:
- **НЕ должно быть дневного потолка.** Он **не перебивается ничем**, упершийся в него прогон встаёт, а
продолжить его нельзя — только заказать заново. Официальный рецепт прямо велит его не класть;
- **ОБЯЗАН быть книжный потолок** — валидатор требует хотя бы один из двух, иначе загрузка откажет;
- **НЕ должно быть пар-связанных ключей** (система транскрипции, род обращения). Принятый пак строит
**громкий отказ** на имени политики, которого пара не знает, и это правильно: он ловит ошибку оператора.
Твой шаблон просто их не несёт.
**И развилка, которую надо решить до интейка: шаблон ОДИН, а книги две и конфиги им нужны разные.** Либо
правишь `book.yaml` каждой книги после интейка и до старта (платформа его больше не читает), либо доказываешь,
что один шаблон обеим годится. Что бы ни выбрала — объяви девиацией и скажи, что именно правила.
**(4) Неверный путь к ключам провайдера даёт на буте только ПРЕДУПРЕЖДЕНИЕ.** Демон объявит себя здоровым,
книгу примет и **возьмёт холд денег**а упадёт первый платный вызов, уже после резервирования. ⇒ путь
проверяется существованием файла, а не отсутствием ошибки в логе.
**(5) Демон не стартует без объявленных пар, и формат — ловушка шелла.** Разделитель — «больше», а не дефис,
и он же символ перенаправления: **значение обязано быть в кавычках**, иначе шелл создаст файл вместо
переменной. Нужны обе пары. Проверяется ответом ручки возможностей, а не переменной.
**Пятое условие снято мною сегодня:** английский пакет промтов был НЕ закоммичен, и фриз-клон его бы не
унёс. Теперь он в истории (8 файлов). Проверь это сама на своём фризе — `git ls-files`, а не `ls`.
**(6) Базы прежних прогонов УДАЛЕНЫ, а окружения их стендов сломаны.** Каталоги стендов живы, но все пути в
их файлах окружения указывают на домашний каталог, которого больше нет (переименован). Кластер базы данных
жив. ⇒ окружение собираешь заново, и **каждый путь проверяешь существованием, а не глазом**.
### 4.2 Драйвер: бери прогон B, НЕ бери прогон A
### 4.2 ⛔ ОДИН СТЕНД, ДВЕ КНИГИ — и это РОВНО ТАК
**РОВНО ТАК.** Разбор прогона A назвал четыре дефекта своего харнесса. **В драйвере A не починен ни
один; в драйвере B починены три.** Замер: гейт бинарей у A судит три бинаря, у B — пять.
Первая редакция говорила «две книги = два рабочих каталога», и под этим можно построить **два демона, две
базы, два порта, две учётки** — и отчитаться «две книги прошли параллельно», не проверив ни очередь, ни общий
леджер, ни конкуренцию за память, то есть ровно то, ради чего владелец заказывал параллель.
| дефект прибора A | в A | в B |
|---|---|---|
| ни одно HTTP-тело платного прогона не сохранено — печаталось на экран | **жив** | **починен**: каждый запрос и ответ пишется в файл ДО возврата вызывающему |
| ложная живость: печатался максимум по попыткам, и во время второй число выглядело замершим | **жив** | **починен**: строка НА КАЖДУЮ попытку |
| гейт фриза судит три бинаря из пяти — два инструмента собраны не из фриза и не проверены | **жив** | **починен**: все пять |
| сборщик денег суммирует леджер по ВСЕМ учёткам сразу | **жив** | **починен**: фильтр по учётке плюс контроль «по всем» |
**РОВНО ТАК: один демон, одна база, одна очередь, две книги.** Очередь тянет четыре задания одновременно —
места хватает. Разделять можно и нужно **только состояние ДРАЙВЕРА** (его файл состояния и каталог улик);
разделять стенд — нельзя.
⭐ И сохранение тел спасло прогон B от ЛОЖНОЙ находки: греп по ключам показал одно, а в сохранённом ТЕЛЕ
**Учётка: одна или две — решаешь ты, но цену назови.** Две дают чистые леджеры, но убивают общий леджер как
предмет наблюдения. Одна требует гранта не меньше суммы холдов. **Холд — не трата:** это ожидание, умноженное
на коэффициент, плюс шаг и книжный бонд; два прогона держат два холда одновременно.
**И мина, которая на этом прогоне впервые достижима: при нехватке баланса старт НЕ отказывают.** Замер
прогона B: ответ успешный, вердикт тот же, цена та же — но холд падает, а **консолидация терминов молча
выключается**, то есть покупается урезанный продукт по той же цене. У A и B была одна книга и один холд;
у тебя вторая книга стартует под уже висящим холдом первой. ⇒ это **стоп-правило**, см. §4.5.
### 4.3 Драйвер: бери прогон B, НЕ бери прогон A
Разбор прогона A назвал четыре дефекта своего харнесса. **В драйвере A не починен ни один; в драйвере B
починены три** (сохранение всех HTTP-тел до возврата вызывающему · строка на КАЖДУЮ попытку вместо максимума ·
гейт фриза на всех пяти бинарях вместо трёх). Четвёртый — счёт денег по всем учёткам сразу — починен в
**приборе денег** `eval/cold_run_b/measure.py`.
⭐ И сохранение тел спасло прогон B от ЛОЖНОЙ находки: греп по ключам показал одно, а в сохранённом теле
первым полем стояло другое. **«Грепу верила, файлу проверила.»**
**Но у драйвера B есть два дефекта, которых не назвал никто, и оба твои:**
- ⛔ **он ОДНОКНИЖНЫЙ.** Рабочий каталог, файл состояния и каталог улик берутся из окружения без
переопределения. **Две книги = два разных рабочих каталога**, иначе вторая перетрёт состояние первой и обе
улики уедут в одну кучу. **РЕШИ САМА**, как разделить, но предъяви, что разделение работает, ДО первого
цента;
- ⛔ **разбивка движковых чисел по попыткам считается по ПОСЛЕДНЕМУ СИМВОЛУ идентификатора трассы**
(`eval/cold_run_b/door.py:339`=`select substr(trace_id,-1)`). На попытке десять и дальше это уже не номер
попытки. Предел попыток на прогон — двадцать, и на двадцатиглавой книге с паузами десять достижимы. ⇒
**почини, прежде чем считать.** Различитель лежит в той же строке: номер попытки несёт сам идентификатор.
**ДЕФЕКТ ДРАЙВЕРА B, КОТОРЫЙ ЧИНИТЬ ТЕБЕ — и лекарство лежит рядом.** Разбивка чисел по попыткам считается
в драйвере по **последнему символу** идентификатора трассы (`eval/cold_run_b/door.py:339`). На попытке десять
и дальше это уже не номер попытки, а предел попыток — двадцать. **Прибор денег это уже делает верно**
(`eval/cold_run_b/measure.py:34`=`def attempt_of(row)`, и его докстрока прямо говорит, что номер НАЗВАН в
строке). ⇒ возьми форму оттуда, а не изобретай. Правь **свою копию**, не репозиторий.
### 4.3 Два мониторинга — что именно наблюдать
### 4.4 Два мониторинга — что наблюдать, и где прибор слеп
**РОВНО ТАК: наблюдение строится ДО старта, а не по ходу.** Требование владельца.
**РОВНО ТАК: наблюдение строится ДО старта, а не по ходу.**
**Движок** (его база прогона и журнал процесса): строка на КАЖДЫЙ вызов с моделью, токенами, ценой,
задержкой, причиной завершения; строка на (глава, чанк, стадия) с диспозицией и числом попыток; таблица
трат — носитель обоих потолков; поток событий с семью типами кадров, где кадр потолка несёт **недостачу**, а
финальный — деньги и объём. Плюс `tmctl status`/`report` — они читают базу ЖИВОГО прогона за $0.
**Движок:** строка на каждый вызов (модель, токены, цена, задержка, причина завершения); строка на (глава,
чанк, стадия) с диспозицией и числом попыток; таблица трат — носитель обоих потолков; поток событий с семью
типами кадров, где кадр потолка несёт **недостачу**, а финальный — деньги и объём. Плюс читающие глаголы
движка: они работают на живом прогоне за $0.
**КАК ЧИТАТЬ ЖИВУЮ БАЗУ.** Она в режиме журнала опережающей записи. Флаг «файл неизменен» на ЖИВОЙ базе
**ставить НЕЛЬЗЯ**: он велит читателю игнорировать журнал, и тот молча получает устаревший снимок — ложный
низкий ноль. На живой — только режим чтения; флаг неизменности — для КОПИЙ и законченных баз.
**ставить НЕЛЬЗЯ**: он велит игнорировать журнал, и читатель молча получает устаревший снимок. На живой —
только режим чтения; флаг неизменности — для копий и законченных баз.
**Платформа:** прогоны и их статусы с причиной паузы; **строка на каждую попытку** с накопленной тратой и
кодом выхода; леджер кредитов; открытые холды; состояние юнитов; буфер событий, читаемый запросом без
подписки; выгрузки. Плюс метрики (глубина очереди, живые прогоны, отставание чтения, застрявшие прогоны) и
админ-команда списка прогонов — **это лучшая одноэкранная сводка для вахты на две книги**.
**Платформа:** прогоны со статусом и причиной паузы; **строка на каждую попытку** с накопленной тратой;
леджер кредитов; открытые холды; состояние юнитов; буфер событий, читаемый запросом без подписки; выгрузки.
Плюс метрики и админ-команда списка прогонов — **лучшая одноэкранная сводка для вахты на две книги**.
**ОС, вне цепочки платформы:** маркеры выхода в каталоге состояния и состояние транзиентных юнитов. Это
единственные по-настоящему НЕЗАВИСИМЫЕ свидетели: база платформы **материализуется** из потока событий
движка, поэтому «платформа, диск и отчёт согласны» — это один свидетель, а не три.
**ОС:** маркеры выхода и состояние транзиентных юнитов. Это единственные по-настоящему НЕЗАВИСИМЫЕ свидетели:
база платформы **материализуется** из потока событий движка, поэтому «платформа, диск и отчёт согласны» —
один свидетель, а не три.
⛔ **СЛЕПЫЕ ЗОНЫ — назови их в отчёте, даже если ничего не случится:**
- **пустой ответ и обрыв по длине в телеметрии неразличимы**оба приходят одной причиной завершения;
различает только журнал процесса;
- **поле ошибки пусто на ВСЕХ строках, включая провальные** — на двух прогонах 33 из 33 и 35 из 35. **Любой
аудит отказов, написанный через это поле, прочтёт прогон как идеально чистый;**
- **токены размышления не несли числа ни разу** за историю проекта;
- **доли ответов классификатора банка не считает ни один счётчик**; итоговая строка стадии печатает ноль о
другом проходе;
- **биллинга провайдера у нас нет вовсе:** провайдер сообщает токены, доллары умножены нашим пином. Пин
завышает примерно на шесть процентов, а пиковая цена против внепиковой даёт расхождение примерно вдвое. ⇒
**любое число в долларах в отчёте называется «по нашему пину», а не «мы заплатили».**
⛔ **СЛЕПЫЕ ЗОНЫ — назови в отчёте, даже если ничего не случится:**
- **пустой ответ и обрыв по длине в телеметрии неразличимы**; различает только журнал процесса;
- **поле ошибки пусто на ВСЕХ строках, включая провальные** — 33 из 33 и 35 из 35 на двух прогонах. Любой
аудит отказов через это поле прочтёт прогон как идеально чистый;
- **доли ответов классификатора банка не считает ни один счётчик**;
- **биллинга провайдера у нас нет:** провайдер сообщает токены, доллары умножены нашим пином. ⇒ любое число
в долларах называется «по нашему пину», а не «мы заплатили». ⚠ Поправка на завышение пина — величина
ОДНОЙ смеси прогона A; на твою смесь она не переносится, назови популяцию.
- ⚠ **А ВОТ ЭТО УЖЕ НЕ СЛЕПАЯ ЗОНА, и первая редакция врала:** размышление **измеримо** — прогон B закрыл
это числом, колонка живёт в схеме и читается. ⇒ требуй ТРЁХЗНАЧНОГО отчёта (пусто / ноль / больше нуля)
с контролем «сумма равна числу строк» на ОБЕИХ книгах. На английской это ещё и первый замер размышления
на латинице.
**ОТДЕЛЬНО, и это ряд 502: упор в баланс ПРОВАЙДЕРА.** Транспорт классифицирует его верно — терминально,
без пустых ретраев. Но типизированная ошибка не покидает пакет транспорта, и исхода, отличимого от обычного
терминального падения стадии, у неё НЕТ. ⇒ **держи журнал процесса обеих книг под наблюдением и лови в нём
код 402 и слова про исчерпанные средства.** Иначе упор в баланс провайдера будет прочитан как поломка движка
на середине оплаченной книги. Событие не гипотетическое: на одной оси замеров проекта 44 записи об ошибке из
52 — ровно такой отказ.
**ОТДЕЛЬНО: упор в баланс ПРОВАЙДЕРА.** Принятый пак дал ему **имя для человека** — оно печатается
в последней строке прогона и в записи об ошибке. **Программного исхода у него по-прежнему НЕТ**: словарь
кадров — замороженный шов, и расширять его отдельное решение. ⇒ **держи журнал процесса обеих книг под
наблюдением и лови в нём это имя.** Событие не гипотетическое: на одной оси замеров проекта 44 записи об
ошибке из 52 — ровно такой отказ.
### 4.4 Улики, которые прогон уничтожает сам
### 4.5 ⛔ СТОП-ПРАВИЛА — их семь, и без них можно потратить всё и быть построчно правым
Первая редакция не несла ни одного, а §13 требовал объяснить «каждое сработавшее». Это и есть «отчитаться,
не сделав» на денежном пути.
1. **Суммарная трата двух книг достигла потолка, который я назову перед стартом** → СТОП и пинг. Не резать
молча, не продолжать «чуть-чуть».
2. **`term_consistency_funded: false` в ответе старта** → СТОП **ДО ОПЛАТЫ**. Это урезанный продукт по полной
цене, и на двух холдах он достижим штатно.
3. **Непустая причина паузы у любого прогона** → СТОП обеих книг, разбор, пинг. Причина называется, а не
пере-запускается.
4. **Срез не совпал с пре-регистрированным** (число глав, юнитов, чанков) → СТОП: прогон отвечает на другой
вопрос.
5. **Любой бинарь не из фриза** → СТОП. Три условия штампа, не одно.
6. **Кто-то слушает порт локальной модели в платной фазе** → СТОП: провод может уйти не туда.
7. **Имя исчерпания средств провайдера в журнале** → СТОП немедленно, пинг мне: дальше деньги не тратятся,
а прогон стои́т наполовину купленным.
⚠ И правило про потолки: **их правка НЕ требует пере-фриза** — фриз-гейт смотрит на покупающий файл, а не на
кассу. Не пере-фризь зря и не объявляй правку потолка девиацией.
### 4.6 Деньги: размер среза, две книги, и чего стоит смета
**«Сопоставимо по главам» — грубая ошибка, и первая редакция её несла.** Замер 18.09: китайская глава
медианой **3 383 знака**, двадцать глав — **59 257 знаков ≈ 40 900 токенов**. Английская книга — 1.6 млн
знаков на 126 документов, то есть её глава плотнее китайской **в семь с половиной раз**. Двадцать английских
глав стоили бы впятеро дороже задуманного.
**РОВНО ТАК: английский срез задаётся ПО ТОКЕНАМ, равным двадцати китайским главам.** Замер: одиннадцать
первых документов книги — **175 358 знаков ≈ 48 200 токенов**, перелёт **+17.9 %** против цели, и мельче
нарезать нечем. ⚠ Проверь это своим прибором на манифесте движка, а не поверь моему счёту по тексту.
**Цена, двумя независимыми путями:**
- китайская половина по факту прогона A — **≈$2.80** за 20 глав;
- английская по собственной смете движка с поправкой на множитель «смета→факт» — **$1.44 … $3.59**.
**итого $4.2 … $6.4** против ратифицированных $4. ⚠ Множитель ×4.99 снят на КИТАЙСКОЙ книге; английского
множителя в проекте нет ни одного, и это перенос из чужой клетки — используй как порядок величины, не как
прогноз.
**Отсюда механика, которая защищает нас от упора в провайдера:** книжные потолки обеих книг ставятся так,
чтобы **их сумма была заведомо ниже остатка на счету**. Тогда при нехватке денег прогон встанет на НАШЕМ
потолке — штатная остановка с понятной причиной, лечится пополнением и новым заказом, — а не упрётся в
провайдера, у которого программного исхода нет. Числа потолков я назову перед стартом.
**Планируй прогон во ВНЕПИКОВОЕ окно провайдера.** Разница около двух раз на счёте; окна — в квирках,
выходные целиком внепиковые. На бюджете в четыре доллара это половина.
**РОВНО ТАК:** деньги в отчёте — из сырого леджера **двумя независимыми путями**, и считаются по
**уникальному ключу**, а не обходом файлов: свод обходом диска завышал трату **в 10.88 раза** на 449 базах.
Рядом печатается, сколько файлов прибор обошёл и сколько из них копии.
**Денежные ловушки, на которых уже наступали:** накопленная трата попытки — величина НАКОПЛЕННАЯ, а не
приращение (сумма по попыткам завысила на 38 %) · четверть денег прогона A купила пустоту, и лечение
удвоением потолка сработало четыре раза из четырёх — **путь не рвётся, он дорожает** · согласие на
пере-оплату выдаётся на весь бюджет прогона, разрыв с фактом был семьдесят восемь крат.
### 4.7 Оценка качества — два агента, и у каждого есть контроль
**РОВНО ТАК по форме:** по одному агенту на перевод, каждый получает **весь оригинал и весь перевод одной
книги в одном запросе** плюс контекст репозитория. Отчёт различает три класса: ошибки смысла · ошибки
консистентности · ошибки голоса и ритма.
⛔ **ТРИ ТРЕБОВАНИЯ, без которых §4.7 закрывается отчётом, которого никто не проверял:**
- **доказательство дочитывания** — агент печатает число знаков оригинала и перевода и ПОСЛЕДНЕЕ предложение
обоих. Не напечатал — отчёт не принимается. Так делал пре-рег прогона B, и это его узел;
- **контрольная подмена (декой)** — в материал оценки вкладывается фрагмент заведомо испорченного перевода.
Не нашёл — оценщик не различает качество, и его вердикт о хорошем ничего не стоит;
- **адъюдикация числовых утверждений**у прогона B **три числовых утверждения читателя из 26 оказались
неверны**, тогда как цитаты были верны 10 из 10. ⇒ каждое ЧИСЛО агента пере-проверяется, цитаты можно на
доверии.
**Асимметрия двух половин обязана быть пре-регистрирована ДО прогона, а не обнаружена после.** Если у
английской книги какого-то механизма не будет (банк, заголовки, что-то ещё) — это записывается заранее как
ОТСУТСТВИЕ МЕХАНИЗМА. Иначе оценщик припишет отсутствие консистентности переводу, паре или модели.
⭐ И отдельный предмет для английского читателя: принятый пак довёз до модели **курсив** — около 4 842
носителей, крупнейший класс которых есть ГОЛОС. **Цепь «исходник → маркер → чанк → экспорт» измерена, а
поведение МОДЕЛИ на маркерах — нет.** Первую главу английского перевода прочитай глазами именно на это.
### 4.8 Улики, которые прогон уничтожает сам
Проекция банка перезаписывается атомарно в начале следующей попытки ⇒ предложения, на которых открывали
экран подписи, выживают **только копией, снятой на стопе**. Замер прогона A: хеш файла до резюма и после —
разные. Файл банк-стопа пишется НЕ атомарно, поэтому снимается только когда прогон стои́т.
экран подписи, выживают **только копией, снятой на стопе**; хеши на прогоне A до и после резюма разные. Файл
банк-стопа пишется не атомарно и снимается только когда прогон стои́т.
**РОВНО ТАК:** снимай копии на каждой границе и печатай их хеши.
### 4.5 Деньги — что известно и на чём уже наступали
### 4.9 Фриз
- **Накопленная трата попытки — величина НАКОПЛЕННАЯ, а не приращение.** Сумма по попыткам на прогоне A
дала завышение на 38 %.
- **Четверть денег прогона A купила пустоту:** 4 вызова из 27 не дали пригодного текста и стоили 25.4 %
цены книги; самый дорогой одиночный вызов книги не дал ничего и молчал четыре минуты. Лечение в движке
есть и сработало четыре раза из четырёх — **путь не рвётся, он дорожает**.
- **Согласие на пере-оплату выдаётся на ВЕСЬ бюджет прогона** — на A разрыв с фактической пере-покупкой был
семьдесят восемь крат.
- **Смета против факта: ×4.99** на A. Две точки — разброс, не закон.
- **Терминологический контур оплачивается дважды**, если прогон останавливался на подпись и продолжился.
**РОВНО ТАК:** деньги в отчёте — из сырого леджера **ДВУМЯ независимыми путями**, и рядом печатается,
сколько файлов прибор обошёл и сколько из них оказались копиями. Свод обходом диска завышает трату кратно
числу копий базы — замерено, было десятикратное завышение.
### 4.6 Оценка качества — два агента-опуса, по одному на перевод
**РОВНО ТАК по форме:** каждый получает **весь оригинал и весь перевод одной книги в одном запросе** и
контекст репозитория; окна в миллион токенов на это хватает с запасом. **РЕШИ САМА**, что именно спросить,
но отчёт агента обязан различать три вещи: ошибки смысла (переведено неверно), ошибки консистентности (один
термин передан по-разному), ошибки голоса и ритма (translationese, сплавленные абзацы, потерянные акценты).
**Что уже известно и с чем сравнивать:** единственный человек, читавший выход прогона B целиком, назвал
его «приличным любительским, на верхней границе» и указал три системные слабости — ритм (230 абзацев
оригинала сплавлены в 158), идиомы и несведённая терминология. Это одна оценка одной книги одним читателем,
и в таком виде она и приводится.
⛔ **И то, что делает английскую оценку особенной: у английской книги 4842 носителя курсива, и до правки
ингеста они до модели НЕ ДОЕЗЖАЮТ вовсе.** Если пак готовности их довёз — оценщик обязан сказать, видно ли
это в тексте. Если не довёз — потеря **пре-регистрируется по классам ДО прогона**, чтобы оценщик не
приписал её паре, промту или модели.
### 4.7 Фриз
**РОВНО ТАК: фриз-дерево — локальный КЛОН, а не связанное рабочее дерево.** Бинарь, собранный в связанном
воркри, не несёт штампа системы контроля версий ВООБЩЕ, и правило «отказывать при изменённом дереве» на нём
выполняется всегда, то есть не проверяет ничего. Проверено по исходникам инструментария: поиск корня
пропускает воркри, потому что там служебный путь — файл, а не каталог.
**три условия отказа, не одно:** ревизия совпадает с фризом · дерево не изменено · **строк штампа больше
нуля**.
**РОВНО ТАК: фриз-дерево — локальный КЛОН, а не связанное рабочее дерево.** Бинарь из связанного воркри не
несёт штампа версии ВООБЩЕ, и правило «отказывать при изменённом дереве» на нём выполняется всегда, то есть
не проверяет ничего. ⇒ **три условия отказа: ревизия совпала · дерево не изменено · строк штампа больше
нуля.** Собирай **все пять** бинарей из клона, а не три.
У фриза несколько разных чисел — чем собраны бинари, чем заморожен план, чем заморожены инструменты. **У
каждого в отчёте пиши, на какой вопрос он отвечает.** На прогоне A один из файлов до конца смены нёс
ревизию брошенного дерева, из которого не собрано ничего.
каждого пиши, на какой вопрос он отвечает.** На прогоне A один файл до конца смены нёс ревизию брошенного
дерева, из которого не собрано ничего.
---
## 5. Самопроверка исполнением — и где у ЭТОГО пака мягко
Мандат обязателен: ревью исполнением своего кода, своих запросов и полученных результатов. **Субагенты
разрешены.** Fable 5 — **ОДИН** советчик на сессию, с постоянным контекстом.
Мандат обязателен: ревью исполнением своего кода, своих запросов и результатов. **Субагенты разрешены.**
**Fable 5 — ОДИН советчик на сессию**, с постоянным контекстом.
⛔ **Нормы платного замера, каждая исполнима без открытия ноты:**
- **пре-рег ДО денег:** фриз-коммит замороженного плана — единственный твой коммит, объявляется мне вслух
ДО того, как сделан; девиации — НОВЫМ коммитом и явно в отчёте;
- **не влезает в бюджет — СТОП и пинг, не резать молча;**
- **подъём потолков просить при СРАБАТЫВАНИИ стопа, а не по проекции:** прогнозный запрос оставляет ложный
след «владелец согласился на пере-оплату», которой не было;
- ⛔ **живость длинного платного прогона проверяется АКТИВНО:** не ждать финального уведомления, а раз в
пару часов сверять рост числа вызовов и трат ДВУМЯ чтениями и докладывать «жив». **Зависшая задача от
идущей по сигналу завершения неотличима.**
**Нормы платного замера:** пре-рег ДО денег, фриз-коммит объявляется мне вслух ДО того, как сделан ·
девиации НОВЫМ коммитом и явно в отчёте · не влезает в бюджет — стоп и пинг, не резать молча · подъём
потолков просить при СРАБАТЫВАНИИ стопа, а не по проекции · **живость длинного прогона проверяется АКТИВНО**:
раз в час сверять рост числа вызовов и трат двумя чтениями и докладывать «жив». Зависшая задача от идущей по
сигналу завершения неотличима.
**Критик полноты — на КАЖДУЮ фазу, а не на пакет.** У прогона A два таких критика сняли две формулировки
и дали девять находок; у B приёмка нашла деление на ноль в приборе денег ровно на той ветви, которую его же
вывод объявлял непроверенной.
**ЧЕТЫРЕ МЕСТА, ГДЕ ЭТОТ ПАК МЯГОК ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:**
**ПЯТЬ МЕСТ, ГДЕ ЭТОТ ПАК МЯГОК:**
1. ⛔ **Два прогона рядом портят числа друг друга, и порча выглядит свойством предмета.** Каждый прогон
живёт в своём юните с собственным потолком памяти (по умолчанию четыре гигабайта), а на машине
одиннадцать и часть занята. Убийство по нехватке памяти в юните **неотличимо от падения движка**: у
первого нет строки-итога и уведомление приходит как убийство, у второго есть код возврата и имена
упавших тестов. **Различай прибором, а не впечатлением.**
1. ⛔ **Два прогона рядом портят числа друг друга, и порча выглядит свойством предмета.** Каждый живёт в
своём юните с потолком памяти по умолчанию четыре гигабайта, на машине одиннадцать и часть занята.
Убийство по нехватке памяти **неотличимо от падения движка**: у первого нет строки-итога и уведомление
приходит как убийство, у второго есть код возврата и имена. Замерь доступную память ПЕРЕД стартом и
реши, не снизить ли потолок.
2. ⛔ **«Прогон идёт» и «прогон завис» неразличимы без активного опроса.** На прогоне B вопросы задавались
УЖЕ КОНЧИВШЕМУСЯ прогону, и «вторая проба дала не то» оказалось про прибор, а не про предмет.
уже КОНЧИВШЕМУСЯ прогону, и «вторая проба дала не то» оказалось про прибор, а не про предмет.
⚠ Длительность: волны идут последовательно (число рабочих в боевом конфиге не задано, дефолт один).
Двадцать китайских глав линейно ≈ 23 часа, английский срез — больше. **Пре-регистрируй ожидаемую
длительность**, иначе «раз в час» окажется крупнее всего прогона.
3. ⛔ **Инструмент, который пере-матчит, докладывает книгу консистентной по терму, который он ни разу не
нашёл.** На прогоне B поиск по префиксу дал 27 «попаданий» вместо 10. **Каждую строку прибора
консистентности проверяй руками ПРЕЖДЕ, чем нести её в отчёт.**
консистентности проверяй руками ПРЕЖДЕ, чем нести в отчёт.**
4. ⛔ **Сессия потеряет оба платных прогона, если потеряет сессию.** Задержка пользовательских юнитов
выключена: они живут в менеджере твоей сессии. Это не чинится тобой это называется в отчёте и
выключена они живут в менеджере твоей сессии. Это не чинится тобой, это называется в отчёте и
учитывается в плане.
5. ⛔ **Английская половина едет на механизмах, которым несколько часов от роду.** Пар-пак, маркер разметки,
пар-скоупный лейбл промта, четвёртый ключ сайзинга — всё принято сегодня и ни разу не видело живой
модели. ⇒ первые отказы английской книги вероятнее относятся к НИМ, чем к платформе, и разбирать их надо
с этой стороны. Адреса правил английской пары — `backend/docs/EN_RU_PAIR_BASIS.md` §4§5.
---
## 6. Оси ревью
- **Замеры:** пере-вывод чисел из СЫРЬЯ; у каждого фактора — арм без него; катастроф-скрин к победителю;
вывод на агрегате до вскрытия единиц запрещён.
- **Швы:** приёмка узла по ТРЁМ независимым следам, и помни, что платформа и движок — **один** свидетель,
а не два.
- **Деньги:** два независимых пути, знаменатель печатается.
- **Замеры:** пере-вывод чисел из СЫРЬЯ; у каждого фактора — арм без него; вывод на агрегате до вскрытия
единиц запрещён.
- **Швы:** приёмка узла по трём независимым следам, и помни, что платформа и движок — **один** свидетель.
- **Деньги:** два независимых пути, знаменатель печатается, счёт по уникальному ключу.
---
## 7. Пре-регистрация вместо записки-плана
До первого цента — **замороженный план**: что покупается, сколько ожидается, какой машинный потолок, что
считается успехом каждого шага, и **какой знаменатель** у каждого числа, которое будет предъявлено.
⛔ Знаменатель пре-регистрируется ДО прогона: иначе прогон ответит числом на другой вопрос.
До первого цента — **замороженный план**: что покупается · сколько ожидается · какой машинный потолок · что
считается успехом каждого шага · **какой знаменатель** у каждого числа · ожидаемая длительность · и
**асимметрия двух половин**. ⛔ Знаменатель пре-регистрируется ДО прогона: иначе прогон ответит числом на
другой вопрос.
---
## 8. Заявление есть команда
Каждое число и каждая категоричная фразас командой. У каждого НУЛЯ печатается контрольная величина.
Каждое число — с командой. У каждого НУЛЯ печатается контрольная величина.
**Ловушки среды, каждая даёт тихий ложный ноль:**
- обёртка `grep` чтит игнор-файлы и не видит каталог книг — по корню бери `command grep`;
- `find` здесь **bfs**: относительное время только `-mmin`, и он **тоже** чтит игнор-файлы, поэтому книги им
не находятся вовсе;
- `find` здесь **bfs**: относительное время только `-mmin`, и он тоже чтит игнор-файлы, поэтому книги им не
находятся вовсе;
- командной утилиты для баз нет; читать `python3`, только на чтение;
- ⚠ **знаки и байты — разные популяции** (кириллица весит два), «строк» и «вхождений» — тоже. **Оба прибора
честны, и именно поэтому расхождение читается как порча данных, а не как разные вопросы.**
- счётчик процессов по имени ловит **собственную командную строку**, если слово стои́т в тексте твоего же
скрипта: спрашивай процессорное время и рабочий каталог, а не имя;
- ⚠ **знаки и байты — разные популяции** (кириллица весит два), «строк» и «вхождений» — тоже. ⭐ **Оба
прибора честны, и именно поэтому расхождение читается как порча данных, а не как разные вопросы.**
---
@ -303,7 +366,9 @@
## 11. Канал вопросов и право отказаться
Конфликт промта с деревом — **пинг, а не интерпретация**. Право сказать «этого делать не надо» с аргументом
есть, и оно поощряется. ⚠ Прогону **запрещено чинить найденное** — только фиксировать и пинговать.
есть и поощряется. ⚠ Прогону **запрещено чинить найденное** в `backend/` и `platform/` — только фиксировать.
⚠ Эта редакция родилась из тринадцати мажоров опровергателя к первой: бюджет не сходился вдвое, списка
стоп-правил не было вовсе, а одна «слепая зона» была закрыта числом ещё месяц назад. **Нашла ещё — говори.**
---
@ -316,15 +381,19 @@
## 13. Когда пак считается завершённым
- [ ] Обе книги дошли до ФАЙЛА, и файл прочитан человеком либо агентом-оценщиком.
- [ ] Отчёт называет **что, где и как в коде пошло не так**с адресом, а не «были ошибки».
- [ ] У каждого пункта §4 — исход: сделано · не делаю с доводом · пинг.
- [ ] Круги СОШЛИСЬ: последний не дал НОВЫХ находок; прежние закрыты таблицей «находка → что сделано → **чем
предъявлено**».
- [ ] Обе книги дошли до ФАЙЛА, и файл прочитан.
- [ ] Отчёт называет **что, где и как в коде пошло не так**с адресом.
- [ ] Оба мониторинга предъявлены: что читалось, чем, и **где была слепая зона**.
- [ ] Деньги — двумя независимыми путями, с названием прибора и знаменателя у каждого числа.
- [ ] Оценка качества обеих книг получена и разделена на три класса ошибок.
- [ ] Все улики, которые прогон уничтожает сам, сняты копиями с хешами.
- [ ] Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ, а не просто названы.
- [ ] Деньги — двумя независимыми путями, по уникальному ключу, с названием прибора у каждого числа.
- [ ] Оценка обеих книг получена, разделена на три класса, **декой найден**, числа адъюдицированы,
доказательство дочитывания напечатано.
- [ ] Улики, которые прогон уничтожает сам, сняты копиями с хешами.
- [ ] **Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ**, а не названы.
- [ ] Явное **«работа завершена, править не планирую»**.
**И последнее.** Ценность этого прогона не в том, что он пройдёт. Она в том, что впервые сработают
механизмы, которые два прежних прогона не задели ни разу. **Сработавший стоп — это купленное знание.
Необъяснённый сработавший стоп — это выброшенные деньги.**
**И последнее.** Ценность прогона не в том, что он пройдёт. Она в том, что впервые сработают механизмы,
которые два прежних прогона не задели ни разу — и что английская половина впервые поедет на данных, а не на
коде. **Сработавший стоп — купленное знание. Необъяснённый сработавший стоп — выброшенные деньги.**