From 6dcd69f38b74349514dde965044bde90ce29ac2d Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 18 Sep 2026 06:04:42 +0300 Subject: [PATCH] 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 --- docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md | 475 +++++++++++++---------- 1 file changed, 272 insertions(+), 203 deletions(-) diff --git a/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md b/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md index 9c6f8a40..f60c8a70 100644 --- a/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md +++ b/docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md @@ -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 пп. 12–13 и §12 п. 5 как - инструкцию, а не как историю:** там перечислены дефекты ЕГО СОБСТВЕННОГО прибора. +1. `CLAUDE.md` — канон, цели, гардрейлы. Внутри него — ссылка на `docs/experiments/00-provider-quirks.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. `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` (строки 22–23). Арифметика: прогон 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 вопросы задавались - УЖЕ КОНЧИВШЕМУСЯ прогону, и «вторая проба дала не то» оказалось про прибор, а не про предмет. + уже КОНЧИВШЕМУСЯ прогону, и «вторая проба дала не то» оказалось про прибор, а не про предмет. + ⚠ Длительность: волны идут последовательно (число рабочих в боевом конфиге не задано, дефолт один). + Двадцать китайских глав линейно ≈ 2–3 часа, английский срез — больше. **Пре-регистрируй ожидаемую + длительность**, иначе «раз в час» окажется крупнее всего прогона. 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 — исход: сделано · не делаю с доводом · пинг. +- [ ] Круги СОШЛИСЬ: последний не дал НОВЫХ находок; прежние закрыты таблицей «находка → что сделано → **чем + предъявлено**». +- [ ] Обе книги дошли до ФАЙЛА, и файл прочитан. +- [ ] Отчёт называет **что, где и как в коде пошло не так** — с адресом. - [ ] Оба мониторинга предъявлены: что читалось, чем, и **где была слепая зона**. -- [ ] Деньги — двумя независимыми путями, с названием прибора и знаменателя у каждого числа. -- [ ] Оценка качества обеих книг получена и разделена на три класса ошибок. -- [ ] Все улики, которые прогон уничтожает сам, сняты копиями с хешами. -- [ ] Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ, а не просто названы. +- [ ] Деньги — двумя независимыми путями, по уникальному ключу, с названием прибора у каждого числа. +- [ ] Оценка обеих книг получена, разделена на три класса, **декой найден**, числа адъюдицированы, + доказательство дочитывания напечатано. +- [ ] Улики, которые прогон уничтожает сам, сняты копиями с хешами. +- [ ] **Каждое сработавшее стоп-правило и каждый упор в потолок ОБЪЯСНЕНЫ**, а не названы. - [ ] Явное **«работа завершена, править не планирую»**. -⛔ **И последнее.** Ценность этого прогона не в том, что он пройдёт. Она в том, что впервые сработают -механизмы, которые два прежних прогона не задели ни разу. **Сработавший стоп — это купленное знание. -Необъяснённый сработавший стоп — это выброшенные деньги.** +⛔ **И последнее.** Ценность прогона не в том, что он пройдёт. Она в том, что впервые сработают механизмы, +которые два прежних прогона не задели ни разу — и что английская половина впервые поедет на данных, а не на +коде. **Сработавший стоп — купленное знание. Необъяснённый сработавший стоп — выброшенные деньги.**