# ОТЧЁТ: холодный прогон движка на схеме v16 (ПЛАТНАЯ бэкенд-сессия) > ## РЕВЬЮ-ШАПКА — читать ДО тела > > **Пак ЗАКРЫТ решением ВЛАДЕЛЬЦА 31.08: прогон НЕ доводить.** Остановлено на потраченных > **$0.436110** из санкции $0.80; `--resnapshot` не нажимался, вторая порция не покупалась, > дополнительных трат НОЛЬ. Довод владельца: причина, по которой редактор съел половину захода, НЕ > УСТАНОВЛЕНА — ещё доллар купил бы то же число с той же неизвестностью внутри. Сначала > контролируемая проба (§14), потом разговор о цене. > > **Книга остаётся `--partial` с одиннадцатью помеченными дырами, ось `stale` остаётся закрытой > дрейфом. Это честный исход, а не недоделка.** > > ### Статус выводов > > **ДОКАЗАНО ИСПОЛНЕНИЕМ** (каждое — с командой и артефактом в теле): > движок переводит книгу насквозь за настоящие деньги и отдаёт файл, проходящий epubcheck 5.1.0 > (0/0/0/0) · объёмный потолок `--max-units` · нота D39.158 ОБЕИМИ половинами (стоп и не-стоп, > 70 строк `bank_stop_presented`) · `build` exit 16 с нулевой записью на диск · обе ловушки `build` > (`--format epub` МОЛЧА удаляет соседний `.txt` при exit 0; `book_files` публикует путь > несуществующего файла) · русские пометки читателя на дыре · строка бэклога 198 (17 анонсов, > 17 уникальных, повторов ноль через ТРИ процесса) · строка 239 дословно · строка 240 (у > `bank_stop_presented` нет ни одного `DELETE` во всём движке) · строка 154 числами · контракт > `migrate` для существующей книги · **уточнение контракта: остановка по объёму по КОДУ ВЫХОДА > неотличима от обычного завершения (0 или 2)** · деньги сходятся тремя путями, из которых независим > только `request_log`. > > **СНЯТО МНОЙ ЖЕ — не считать результатом пака** (подробно §4.5): > «редактор эмитит вдвое больше токенов ⇒ виновато неуправляемое размышление» · разложение > «×9.33 = ×4.55 × ×2.07» · «терминологический контур стабилен, двигались только цены» · > «у `deepseek-v4-pro` ручки эффорта нет» (опровергнуто ВЛАДЕЛЬЦЕМ через вендор-доку; §4.5-4). > > **НЕ ПРОВЕРЕНО** (полный список — §11): книга до `complete=true` не доведена · exit 4 не наблюдался · > `withheld`/`incomplete`/`ghost` не возникли · `stale` недостижим · причина роста выходных токенов > редактора · конвенционный резолв промпта переводчика · размеры юнитов в знаках (носителя нет) · > живая читалка · сверка причин флагов сделана на ОДНОМ значении из пятнадцати · манифест против > `ingest/manifest.go` не сверялся. > > ⚠ **Клеймы о рантайме без живого прогона в этом отчёте помечены как таковые.** Каталог прогона > (`/home/ubuntu/books/gu-zhenren/coldrun-v16/`) в репозиторий НЕ уезжает — всё, что должно пережить > рестарт, воспроизведено в теле: команды, числа с отметками момента, дословные строки движка, коды > выхода. > > ⚠ **HEAD с тех пор ушёл.** Прогон куплен на `065d8ac` бинарём sha256 > `e6f872df5b9c031f558ca2cc8a900b3822d2fc38d208453269ebd6dc3f78f9d1`; после сдачи лёг пак > «деньги и честность» (**D39.182**), починивший часть найденного здесь — разложение оплаченного > хвоста, ложную причину снапшот-гарда, расхождение `config_drift` между `status` и `export`, > слепоту денег к правке исходника на месте. **Числа этого отчёта относятся к `065d8ac` и > пере-проверяются только на нём.** Работу D39.182 я не пере-проверяла — она принята. Сессия `textmachine-main-a2`. Промт `docs/BACKEND_COLDRUN_V16_SESSION_PROMPT.md` (оркестратор №21). Платная часть 2026-08-31, **10:00:35 – 10:22:41 UTC**, в ДОЛИНЕ (пики UTC 01–04 и 06–10 у DeepSeek вдвое дороже; цены в `models.yaml` пинованы ПИКОВЫЕ ⇒ леджер завышает — в безопасную сторону). Каталог прогона: `/home/ubuntu/books/gu-zhenren/coldrun-v16/` — остаётся на диске целиком. ⚠ **Каждое денежное число — С ОТМЕТКОЙ МОМЕНТА.** Оси разделения прогонов в денежных таблицах нет: `checkpoints`/`spend` пожизненные по книге, единственная ось — `checkpoints.created_at`; ось прогона живёт только в `request_log.trace_id`. Оркестратор, читавший БД во время прогона, получил другие суммы — это движение живого прогона, а не дефект. --- ## 0. Результат **Движок переводит книгу насквозь на настоящих деньгах и отдаёт файл, который ПРОХОДИТ ВАЛИДАТОР** (epubcheck 5.1.0, EPUB 3.3, 0 fatals / 0 errors / 0 warnings / 0 infos). ⚠ **Открытие в живой читалке НЕ проверено** — читалки на машине нет ни одной; файл передан владельцу, ось открыта до его ответа. Полная цепь на десяти главах в СЕГОДНЯШНИХ ценах стоит **≈$1.14 по собственной оценке движка** (`projected_book_usd = 1.1377277707`) против приора ≈$0.58 и санкции $0.80. Прогон остановлен **не потолком, а снапшот-гардом**, потребовавшим `--resnapshot` после покупки двумя порциями. Куплено **$0.436110**, доставлено **3 юнита из 14** (черновая волна 14/14, редакторская 3/14). Отдан `--partial`-файл с 11 помеченными дырами. **Решение о продолжении — за владельцем. Я его не подменяла и потолок по проекции поднять не просила.** ## 1. Записка-план (§6.1) — выжимка ⚠ Слово «дословно» снимаю: полный текст — `coldrun-v16/PLAN-NOTE.md`, и каталог прогона в репозиторий НЕ уедет. Ниже выжимка; записка написана ДО первой покупки и с тех пор не правилась. **Личность прогона.** HEAD `065d8ac` · последний коммит в `backend/` — `8adcb86` · `tmctl` собран из HEAD, sha256 **`e6f872df5b9c031f558ca2cc8a900b3822d2fc38d208453269ebd6dc3f78f9d1`** — сошёлся ТРЕМЯ независимыми путями (моя сборка · стендовый `~/.local/bin/tmctl` · независимая сборка оркестратора, сообщённая ДО моей). Go 1.26.7. Схема БД **v16**. **Батарея ДО первой покупки.** `make battery` в `backend/`: build · vet (оба тег-набора + архитектурные анализаторы `tmvet`) · gofmt · `golangci-lint` **0 issues** · `go test ./... -race -count=1` — **18 пакетов `ok`, 4 без тестов**, 0 падений. **СКИПЫ ВСЛУХ, их три:** `TestMinerFullBookParity`, `TestHelperEventsRun`, `TestHelperKillLoop`; батарея сама печатает `--- did NOT run (no stand data; see battery-stand) ---`. Корпусные измерения (`TM_MINER_PARITY=1`, `TM_CHECKER_LABELS=1`) НЕ гонялись. ⚠ `EXIT=0` батареи в артефакт НЕ снят — это «со слов сессии». **Три ручки денег, все выставлены до первого платного вызова:** `--ceiling-usd 0.80` на каждом `translate` · `ceilings: {book_usd: 0.80, day_usd: 1.00}` в `book.yaml` (дневной поднят выше книжного сознательно — несущим предохранителем обязан быть книжный) · `--max-units` порциями, **N названы числом: П1 = 3, П2/П3 = 14** (`units_total` из `manifest --json`). **Конфиг — отличия от копии bank-low.** (A) пути: `prompt_override`, `models`, `langpack_root` переведены в `textmachine-main`; `mining.contrast_path` ОСТАВЛЕН в polygon-дереве (санкционированное исключение §1б). (B) `mined_delta:`/`mined_rejects:` СНЯТЫ — retired-ключи, иначе exit 10; потолки 0.10/0.10 → 0.80/1.00. (C) **единственная смысловая правка: `escalation.budget_usd: 0.015 → 0.08`**. (D) пар-слой `pairs/zh-ru.yaml` скопирован (без него exit 10, см. §7). (E) сид не подключён. **Цена копии, названная вслух ДО покупки:** черновая половина едет БАНКНОТНЫМ промптом `translator-banknote.md`, а не конвенционным боевым `translator.md`. Резолв по ролям: translator — через `prompt_override`; editor · terminologist · classifier — конвенцией. ⇒ **Конвенционный резолв промпта переводчика этим прогоном НЕ ПРОВЕРЕН.** ### 1.1 Две девиации — обе подписаны ОРКЕСТРАТОРОМ, не владельцем ⚠ Называю прямо, потому что это разные полномочия. 1. **`escalation.budget_usd` 0.015 → 0.08.** Довод: 0.015 — не значение конфига, а объявленная девиация самой bank-low под её книжный потолок $0.10 («суб-бюджет ПОНИЖЕН СОЗНАТЕЛЬНО … ⚠ Это делает наблюдение эскалаций НЕПОЛНЫМ»); прецедент полной цепи minirun держал 0.30 при потолке $1.00 (30%), мои 0.08 — 10%. Суб-бюджет есть ПОДМНОЖЕСТВО книжного потолка и вывести прогон за санкционированные $0.80 не может. ⚠ **И он был ПРОБИТ фактом: эскалации стоили $0.103305 против бюджета $0.08 — перелёт +29.1%.** Это документированный overshoot пре-хоп-гейта (`escalation.go`: read-then-act над `EscalationSpentUSD`), **впервые наблюдённый на настоящих деньгах**, и он — прямое следствие моей же правки. При 0.015 перелёт был бы тот же по механике, но 4 из 5 эхнутых чанков остались бы флагнутыми. 2. **Покупок фактически ТРИ (П1/П2/П3), а §1в говорит «двумя порциями».** `--max-units` в П2 и П3 одинаков (14), уже оплаченное не пере-оплачивается — по объёму порций по-прежнему две, стоп подписи это пауза внутри второй. Только так §5.4 закрывается ОБЕИМИ половинами. Подпись оркестратора №21 получена ДО покупки, дословно: «расхождением не считаю; свёртывать до двух вызовов не надо». ⚠ Обе развилки несены ПИНГОМ до денег. Артефакта подписи вне контекста сессии нет — при приёмке она восстанавливается только из журнала оркестратора. ## 2. Оси §5 — вердикты §7 (предъявлено / не предъявлено / опровергнуто) | Ось | Вердикт | Где | |---|---|---| | §5.1 сквозной путь семи глаголов | **предъявлено** | §3, `logs/` | | §5.1 шесть состояний честности D39.175 | **частично** | ВОЗНИКЛИ два: `pending` (11) и `drift`. `withheld`/`incomplete`/`ghost` = 0 — **НЕ возникли, остаются непроверенными**. `stale` — не «0», а **UNKNOWN**: под дрейфом счётчик не считает | | §5.1 честное `config_drift=false` | **предъявлено с оговоркой** | снято на свежей книге ДО первого платного вызова; на строках прогона вышло «да» — причина в §4.4 | | §5.1 структура глав (строка 160) | **предъявлено** | §5 | | §5.1 две ловушки `build` | **предъявлено** | §6 | | §5.1 издательский результат (epubcheck) | **предъявлено на НЕПОЛНОЙ книге** | §6 | | §5.1 живая читалка | **ось ОТКРЫТА** | файл передан владельцу | | §5.2 коды выхода | **предъявлено** | ШЕСТЬ кодов фактически: 0·1·2·3·10·16 (§3) | | §5.3 деньги, оба базлайна | **предъявлено; ДВА моих вывода СНЯТЫ мной же** | §4 | | §5.4 стоп подписи, обе половины D39.158 | **предъявлено** | §7 | | §5.5 каналы шва и словари | **предъявлено ЧАСТИЧНО — см. блокер §8** | §8 | | §5.6 $0-провокации | **4 из 6** | §10 | | §5.7 строки 154 / 157 | **154 закрыта числами; 157 частично — носителя нет** | §9 | ## 3. Коды выхода — фактические `$?` | Код | Где | Артефакт | |---|---|---| | **2** | **П1** `translate --max-units 3` — остановка по ОБЪЁМУ И один флагнутый чанк | `logs/16-exit-codes.log` | | **3** | П2 `translate --max-units 14 --verify-bank` — стоп подписи банка | `logs/16-exit-codes.log` | | **1** | П3 — снапшот-гард; и 5 раз на $0-отказах флагов | `logs/16-exit-codes.log`, `logs/15-flag-refusals.log` | | **2** | `status --json` на книге с флагами | `logs/16-exit-codes.log` | | **0** | `report` · `export` · `manifest` · `migrate` | `logs/16-exit-codes.log` | | **16** | `build` без `--partial` на книге с дырами | `logs/16-exit-codes.log` | | **10** | первый `manifest` без пар-слоя | ⚠ **артефакта нет** — держится прозой `PLAN-NOTE.md`, лог упавшего вызова не сохранён | | **0** | `build --partial` | ⚠ для форм, писавших рядом с БД, `$?` НЕ записан — 0 выведен из того, что напечатан `BuildReport` и файлы легли | ⚠ **УТОЧНЕНИЕ КОНТРАКТА, найденное собственной ошибкой.** Таблица §5.2 промта говорит `0 | чисто (в т.ч. остановка по --max-units — это ЗАВЕРШЕНИЕ)`. **Это верно только когда ничего не флагнуто.** П1 остановилась по объёму И имела флагнутый чанк ⇒ сработала ветка `errors.As(err, &flagged) → return 2` (`cmd/tmctl/main.go:133-134`), стоящая РАНЬШЕ «чисто». Объёмный стоп кода себе не присваивает вовсе — он едет на РЕЗУЛЬТАТЕ, а не на ошибке (`waverun.go:172`: «it must not reach the exit-code mapper at all»). ⇒ **Остановка по объёму по коду выхода НЕ ОПОЗНАЁТСЯ: она приходит и как 0, и как 2, и различает её только строка `VOLUME CEILING:` в выводе.** Для платформы это значимо. ⚠ Я сама сообщила оркестратору «П1 — exit 0», прочитав `[exited with code 0]` фоновой ОБЁРТКИ вместо строки `P1 EXIT=2`; поправка отправлена. ⛔ **Кода 4 (halt по денежному потолку) я НЕ ВИДЕЛА и не называю.** Коды 5·11·12·13·14·15·19 тоже. ⚠ О форме: `tmctl … --no-such-flag | head -2` под `pipefail` даёт `141` — это **wait-status самого `tmctl`, убитого SIGPIPE** (не код контракта и не код `head`), исход гоночный. Без пайпа — **1**. ## 4. Деньги — момент 10:29:19Z, прогон стоит ### 4.1 Сверка путей ⚠ **Поправка к моей же формулировке.** `spend` и `checkpoints` пишутся ОДНОЙ транзакцией из одного значения (`store/ledger.go:178` `SettleWithCheckpoint`), поэтому их равенство — **инвариант, а не проверка**. Настоящий третий, независимый писатель — `request_log` (вне settle-транзакции). Все три: ``` request_log SUM(cost_usd) = 0.436109664 spend.committed = 0.436109664 SUM(checkpoints) = 0.436109664 ``` Одна $0-команда `tmctl report` печатает две фигуры: `Book ledger: committed=$0.436110 reserved=$0.000000` и `ROUTING/MONEY: escalation hops=5 · spend by model: deepseek-v4-flash=$0.117940 · deepseek-v4-pro=$0.318169` (сумма 0.436109 — расхождение 1e-6 = округление до шести знаков). ### 4.2 Разложение | стадия / роль / модель | оплаченных чекпойнтов | всего чекпойнтов | $ | |---|---|---|---| | edit / editor / deepseek-v4-pro | 4 | 5 | **0.214865** | | draft / translator / pro (эскалации) | 5 | 7 | 0.103305 | | draft / translator / flash | 20 | 29 | 0.068135 | | terminology / terminologist / flash | 6 | 6 | 0.040617 | | terminology / classifier / flash | 3 | 3 | 0.009188 | ⚠ Колонки разные не по описке: `checkpoints` хранит и производные строки с нулевой ценой (`banknote_export`, `sanitized_export`). Всего 50, оплаченных 38. **По покупкам** (`created_at`): П1 $0.264362 · П2 $0.171747 · **П3 $0.00**. **Доля редактора — со знаменателем, потому что их два:** **49.3%** от всего прогона ($0.214865 из $0.436110) и **81.3%** внутри П1, куда целиком уместилась редакторская волна. Для сравнения: у minirun редактор — 80.6% его захода. ### 4.3 Оплаченный хвост — обе таблицы, финальные числа - по `checkpoints`: эскалации (`escalation=1`) — **5 хопов, $0.103305**; ретраи (`attempt>0`) — **ровно один, $0.070294**. Итого хвост по этой таблице **6 строк / $0.173599 = 39.8% захода**; - по `request_log`: `ok=0 AND cost_usd>0` — **11 строк, $0.123161 (28.2%)**. ⚠ Мой прежний «5 строк / $0.098761» — снимок 10:11Z, середина прогона; я держала его под шапкой «числа больше не двигаются». Снято. ⚠ И эти две величины НЕ обязаны совпадать: 5 успешных хопов pro и 11 оплаченных неудач — непересекающиеся множества; соседство двух «пятёрок» было случайным; - `estimated = 0` — **биллящихся decode-fail'ов не было ни одного**; - **крупнейшая единичная потеря прогона: ch2/chunk0 оплачен ДВАЖДЫ.** Попытка 0 — `finish=length`, 16 000 выходных токенов, **$0.072529 выброшено**; попытка 1 на удвоенном потолке — `finish=stop`, $0.070294. Один edit-юнит = **$0.142823 = 32.7% всего захода**; - ровно один полностью пустой оплаченный ответ: батч терминолога, `finish=length`, 0 знаков, **$0.012082**. ### 4.4 Оба базлайна (июль, пере-сняты read-only) | контур | bank-low | minirun | этот прогон | |---|---|---|---| | draft flash | $0.021289 / 23 | $0.018834 / 20 | $0.068135 / 20 | | draft pro (эскалации) | $0.010350 / 2 | $0.003371 / 1 | $0.103305 / 5 | | терминолог | $0.005750 / 5 | — | $0.040617 / 6 | | классификатор | $0.007706 / 16 | — | $0.009188 / 3 | | **edit editor pro** | — | **$0.092086 / 16** | **$0.214865 / 4** | | весь заход | $0.045095 | $0.114291 | $0.436110 (неполный) | Цены (`76049bb`, 15.08, вендорские с 16.08 16:00 UTC): flash `0.14→0.44` вход / `0.28→1.32` выход; pro `0.435→1.32` / `0.87→3.96` (×3.03 вход, ×4.55 выход). ### 4.5 ⛔ ДВА МОИХ ВЫВОДА, КОТОРЫЕ Я СНИМАЮ САМА **(а) «Редактор эмитит вдвое больше токенов, значит дело в неуправляемом размышлении» — СНЯТ.** Три конфаунда, и роли у них РАЗНЫЕ (прежняя формулировка «любой из которых его убивает» неверна): 1. *фантомная строка* — в `request_log` со `stage='edit'` пять строк, но пятая (id=68, `err='context canceled'`, все нули) — прерванная попытка П3, не вызов. Реальных вызовов **четыре**, средний выход **12 203**, отношение к июлю **2.59**, а не 2.07. ⚠ Это исправление работает В ПОЛЬЗУ наблюдения, а не против: оно убивает мою АРИФМЕТИКУ, а не сам факт роста; 2. *потолок вывода удвоился и БИЛ в обоих прогонах* — июль `max_tokens` 8000 (2 из 16 вернули `length` ровно на 8000), сегодня 16000 и 32000 на ретрае (1 из 4 упёрся). `models.yaml` несёт `min_max_tokens: 16000` с комментарием «8000 → 16000 ПО ЗАМЕРУ мини-прогона 25.07»; 3. *промпт редактора сменился при неизменной метке* — minirun гонялся 2026-07-25, `prompts/zh-ru/editor.md` правился 2026-08-01 (`e89874b`, одна строка про авторский рефрен), `prompt_version` в обоих — `v3-discourse-reflow`. 4. *⚠ ЧЕТВЁРТЫЙ, ДОБАВЛЕН 31.08 ПОСЛЕ СДАЧИ — и он самый действенный: рычаг у редактора БЫЛ, и не дёрнули его МЫ.* Мой `pipeline.yaml` объявил `stages[edit].reasoning: "off"`, а `backend/internal/llm/capability.go:52-53` говорит дословно: «ReasoningNone is the OpenAI-compat baseline: **low|medium|high go out as reasoning_effort; off and "" emit nothing**, leaving the provider's OWN default». ⇒ на провод для редактора НЕ УШЛО НИЧЕГО, и он поехал вендор-дефолтом. Там же, абзацем ниже, стоит ровно то различение, которое я схлопнула: «⚠ "Never turned off" is NOT "never configured" (D39.87)… riding the provider default is a choice whose owner is the vendor, not an absence of one». Черновик и терминолог свои `low` получили — редактор нет. **Вендор-факт, с датой и способом** (снято оркестратором №21 по заказу ВЛАДЕЛЬЦА, `curl` по `api-docs.deepseek.com/guides/thinking_mode` + Change Log, сверено 31.08.2026): таблица маппинга теперь несёт оговорку «identical for `deepseek-v4-flash` and `deepseek-v4-pro`», `low`→**low**; сноска «We will update the actual mapped effort of deepseek-v4-pro in early August 2026» СО СТРАНИЦЫ ИСЧЕЗЛА; запись Change Log **13.08.2026**: «The thinking modes of V4-Pro and V4-Flash now support three thinking effort levels: low / high / max». Наша последняя сверка была 10.08 — **носитель протух на 18 суток**, и вся моя рамка «у pro ручки нет» стояла на нём. ⚠ Безопасность: `low` ≠ `off`. Эхо-мина вооружается ВЫКЛЮЧЕНИЕМ thinking; три уровня эффорта едут с thinking ВКЛЮЧЁННЫМ, поэтому `low` у редактора мину не вооружает. ⚠ Честная граница этой строки: она **код-обоснована, а не снята с провода** — стадийный лог эффорт не печатает (его печатает только гейт терминолога: `reasoning=low`, дважды). Проводного подтверждения, что для редактора не ушло ничего, у этого прогона НЕТ. **Каузальную часть убивают только (2) и (3); (4) не объясняет рост токенов, но СНИМАЕТ вывод «рычага не существует» и делает статью в 49% захода управляемой одной строкой ДАННЫХ, без правки Go.** **(б) Разложение «×9.33 = ×4.55 × ×2.07» — СНЯТО целиком, и на исправленных числах тоже.** 4.55 × 2.59 = 11.78 ≠ 9.33. Форма неверна структурно: она применяет множитель ВЫХОДНОЙ статьи ко всей цене вызова, выбрасывая вход (цена входа ×3.03 при росте входных токенов лишь ×1.14) и кэш-хит. **Что остаётся ДОКАЗАННЫМ:** цена одного edit-вызова выросла **×9.33** (июль $0.005755 → сегодня $0.053716); выходных токенов на вызов стало **×2.59**; вендорская цена выхода pro выросла ×4.55. **Причина роста токенов НЕ УСТАНОВЛЕНА** — разделить её может только контролируемая проба, и её форма задана в §14. ⚠ Та форма, которую я предлагала изначально («один чанк, один потолок, оба промпта»), СПРОЕКТИРОВАНА НЕВЕРНО — см. §14. **И независимо от всей этой арифметики:** движок сам печатает **`projected_book_usd = 1.1377277707`** при `book_ceiling_usd = 0.8`. **(в) «Терминологический контур СТАБИЛЕН — двигались только цены» — СНЯТ.** Я процитировала строку П1, а не финал. Финал прогона: `consolidated=42 unanswered=16 reclassified=2 families=11`; bank-low: `consolidated=72 unanswered=18 reclassified=14`. Плюс сменилась версия контура (`terminology-v2-…` → `terminology-v3-…+families+formfold`) — сравнение конфаундировано. Держится ровно один факт: **пустой батч терминолога стоил ×4.40 при почти тех же токенах** — чистый ценовой множитель на одном вызове. **⚠ И СОБЫТИЕ, КОТОРОЕ Я ПРЕДСКАЗАЛА ДО ПОКУПКИ И ПОТОМ НЕ УВИДЕЛА В ЛОГАХ:** ``` WARN terminology classify: budget would be exceeded by the next batch; the remaining terms are left unchanged role=classifier spent_usd=0.009188 next_batch_usd=0.012500 budget_usd=0.02 batches_left=3 ``` **Классификатор ДВАЖДЫ остановлен собственным денежным суб-бюджетом $0.02; 3 батча из 4 не куплены, 16 термов остались неклассифицированными.** Суб-бюджеты bank-low были откалиброваны под ИЮЛЬСКИЕ цены, и `classify_budget_usd: 0.02` сегодня мал — ровно тот класс, который я разобрала для `escalation.budget_usd` и не довела до конца по остальным гейтам. ### 4.6 Цена мандата «двумя порциями» `rebill_units = 3`, **`rebill_usd = 0.214864848`** — цена согласия `--resnapshot`, и **одна покупка её бы не понесла**: снапшот edit-волны сдвинул выросший АВТО-БАНК, а вырос он потому, что вторая порция дочерновила остаток книги. Движок предупреждал WARN'ом ещё в П1 (живое основание `PD-422`): > `a VOLUME ceiling on a book that MINES its bank: … the next purchase moves the edit-wave snapshot … > Expect that run to need --resnapshot` ⚠ **Текст самого гарда ВВОДИТ В ЗАБЛУЖДЕНИЕ:** `… the config/prompts changed; already-paid checkpoints become invalid …`. Конфиг и промпты после первой покупки не тронуты ни байтом. Гард называет причиной то, чего не было. **Арифметика доведения до конца:** потрачено $0.436110 · `--resnapshot` пере-оплачивает $0.214865 · 11 неотредактированных юнитов по наблюдённой цене edit-юнита ($0.214865/3 = $0.0716) ≈ $0.79 ⇒ полный отток кассы **≈$1.44**. Движковая проекция $1.1377 меньше, потому что считает книгу целиком по средней цене юнита и НЕ включает пере-оплату уже сделанного. ## 5. Структура глав — строка бэклога 160 (В-4/Ф-30) **В исходнике 10 из 10 глав открыты структурным заголовком** (`第一节:纵身亡魔心仍不悔` … `第十节:天有不测风云,炼蛊别具艰辛`). **В манифесте `heading` у всех десяти — `Глава 1`…`Глава 10`, цифровой рендер движка.** Это намеренная политика пак-13, записанная в ДАННЫХ пары (`configs/langpacks/zh-ru/heading.txt`: `marker 第` · `units 章节節回` · `template Глава {n}`): маркер+номер+единица вырезаются из того, что видит модель, номер рендерится детерминированно, подзаголовок остаётся телом и переводится. Дословно из кода: *«The model is not trusted with a chapter title (it rendered «Раздел 2», «Первая глава», an orphaned « :» and dropped titles across models)»*. Движок сам предупреждает потребителя (`manifest.go`): *«It is NOT a label carried by the book's own data, and a consumer must not present it as one»*. **Дословные метки собранной книги.** txt — голая строка `Глава 1` … `Глава 10`; EPUB — `