diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index ada29a79..5592cfc2 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-31, голова D39.182 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №21** (единственный носитель — здесь; роль передана 31.08, №20 закрыт нотой передачи D39.177; ⚠ **пак P12 ПРИНЯТ И ЗАЛЕНДЖЕН 31.08 — D39.180**, вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же): **(1) РАЗРЫВ ЦИКЛА: книга не отдаётся файлом — ни одной стороной.** Канон обещает `createExport`/`getExport`, платформа их НЕ монтирует (смонтировано 15 операций из 20; нет также `getRun`, `updateBook`, `deleteBook`), а движок писателя не имеет вовсе — `tmctl export` пишет только в stdout (JSON `tm-export-v1` либо текст с аудит-баннерами). ⚠ Прежняя редакция обосновывала это грепом `epub|fb2|docx` («21 хит, все на стороне ингеста») — довод СНЯТ 30.08: он и был хрупким (сырой счёт хитов), и стал ложным после лендинга. Долг числится с P8 (`platform/BACKLOG.md` П-17), с тех пор легло пять паков и ни один его не взял. **Слово «отдаёт результат» сегодня ложно по букве** — ⚠ 30.08: ДВИЖКОВАЯ половина ЗАКРЫТА паком «писатель книги» (D39.175, `8adcb86`): `tmctl build` отдаёт EPUB 3 + чистый txt с шестью состояниями честности; открытой остаётся дверь платформы (п.4) · **(2) холодный прогон движка на текущем HEAD — ПРОМТ ВЫДАН 31.08** (`BACKEND_COLDRUN_V16_SESSION_PROMPT.md`, D39.179), прогон НЕ НАЧАТ. Гейт строк 16/154/157/160/198/202/216, слово владельца 20.08: с 27.08 легло ~15 нот (шов, стоп банка флажком, схема v16, класс отказа 15, объёмный потолок, гейт схемы) и НИ ОДНА не проверена деньгами. ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** Прежняя «≈$0.05» СНЯТА как протухшая: пере-пин DeepSeek 16.08 даёт множитель 4.47 на том же заходе (D39.179 п.1). ⚠ **ГЕЙТ КЛЮЧЕЙ СНЯТ словом владельца 30.08** (D39.176 п.6), но конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса — прогон обязан передавать `--keys-file` абсолютным путём; заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`. Для п.3 нужен ДРУГОЙ файл (путь платформы `TM_PLATFORM_ENGINE_KEYS_PATH`) — вопрос владельцу открыт · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО и первыми настоящими данными движка не проверялись · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на ШЕСТЬ миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.8.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 20; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ** (`13-tech-debt-anchors.md` §Б-108): `go.work` — у платформы свой модуль есть, файла в корне НЕТ; вендор-сверка маппинга эффорта `deepseek-v4-pro` — сработала 13.08, носители противоречат, закрывается ТОЛЬКО вендор-докой. ⚠ **ЧТО В ПРЕЖНЕЙ ОЧЕРЕДИ БЫЛО НЕВЕРНО, проверено деревом 30.08:** пункт про `sqlc` отдельной сессией ИСПОЛНЕН (D39.172, `63fcee5`); «работа полигона в дереве НЕЗАКОММИЧЕНА, читать `git status -- eval/`» ОПРОВЕРГНУТО — она лежит коммитом `28c2d0f` на ветке `polygon`, запушена, в `main` не влита, а названная команда возвращает пустоту и уводит в вывод «работы нет»; «развязка git с origin» ОПРОВЕРГНУТА — `main` и `origin/main` на одном коммите. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-31, голова D39.182 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №21** (единственный носитель — здесь; роль передана 31.08, №20 закрыт нотой передачи D39.177; ⚠ **пак P12 ПРИНЯТ И ЗАЛЕНДЖЕН 31.08 — D39.180**, вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же): **(1) РАЗРЫВ ЦИКЛА: книга не отдаётся файлом — ни одной стороной.** Канон обещает `createExport`/`getExport`, платформа их НЕ монтирует (смонтировано 15 операций из 20; нет также `getRun`, `updateBook`, `deleteBook`), а движок писателя не имеет вовсе — `tmctl export` пишет только в stdout (JSON `tm-export-v1` либо текст с аудит-баннерами). ⚠ Прежняя редакция обосновывала это грепом `epub|fb2|docx` («21 хит, все на стороне ингеста») — довод СНЯТ 30.08: он и был хрупким (сырой счёт хитов), и стал ложным после лендинга. Долг числится с P8 (`platform/BACKLOG.md` П-17), с тех пор легло пять паков и ни один его не взял. **Слово «отдаёт результат» сегодня ложно по букве** — ⚠ 30.08: ДВИЖКОВАЯ половина ЗАКРЫТА паком «писатель книги» (D39.175, `8adcb86`): `tmctl build` отдаёт EPUB 3 + чистый txt с шестью состояниями честности; открытой остаётся дверь платформы (п.4) · **(2) ~~холодный прогон движка~~ ОТРАБОТАЛ 31.08, закрыт РЕШЕНИЕМ ВЛАДЕЛЬЦА «не доводить»** (отчёт — `archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, числа относятся к `065d8ac`). Потрачено **$0.436110** из санкции $0.80. ПРЕДЪЯВЛЕНО живьём: объёмный потолок · D39.158 ОБЕИМИ половинами (стоп и не-стоп) · exit 16 · epubcheck 0/0/0/0 · строки 154/198/239/240. ⚠ **Причина, по которой редактор съел 73% захода, НЕ УСТАНОВЛЕНА** — три каузальные истории построены и две сняты; следующий шаг — контролируемая проба по ЧЕТЫРЁМ осям (§14 отчёта): трудность чанка БЛОКИРОВАТЬ, длину входа КОНТРОЛИРОВАТЬ, промпт по SHA, эффорт `off` против `low`. Ось `stale` НЕДОСТИЖИМА (под дрейфом `staleUnits` возвращает UNKNOWN немедленно). Прежняя редакция пункта — ПРОМТ ВЫДАН 31.08** (`BACKEND_COLDRUN_V16_SESSION_PROMPT.md`, D39.179), прогон НЕ НАЧАТ. Гейт строк 16/154/157/160/198/202/216, слово владельца 20.08: с 27.08 легло ~15 нот (шов, стоп банка флажком, схема v16, класс отказа 15, объёмный потолок, гейт схемы) и НИ ОДНА не проверена деньгами. ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** Прежняя «≈$0.05» СНЯТА как протухшая: пере-пин DeepSeek 16.08 даёт множитель 4.47 на том же заходе (D39.179 п.1). ⚠ **ГЕЙТ КЛЮЧЕЙ СНЯТ словом владельца 30.08** (D39.176 п.6), но конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса — прогон обязан передавать `--keys-file` абсолютным путём; заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`. Для п.3 нужен ДРУГОЙ файл (путь платформы `TM_PLATFORM_ENGINE_KEYS_PATH`) — вопрос владельцу открыт · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО и первыми настоящими данными движка не проверялись · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на ШЕСТЬ миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.8.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 20; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ** (`13-tech-debt-anchors.md` §Б-108): `go.work` — у платформы свой модуль есть, файла в корне НЕТ; вендор-сверка маппинга эффорта `deepseek-v4-pro` — сработала 13.08, носители противоречат, закрывается ТОЛЬКО вендор-докой. ⚠ **ЧТО В ПРЕЖНЕЙ ОЧЕРЕДИ БЫЛО НЕВЕРНО, проверено деревом 30.08:** пункт про `sqlc` отдельной сессией ИСПОЛНЕН (D39.172, `63fcee5`); «работа полигона в дереве НЕЗАКОММИЧЕНА, читать `git status -- eval/`» ОПРОВЕРГНУТО — она лежит коммитом `28c2d0f` на ветке `polygon`, запушена, в `main` не влита, а названная команда возвращает пустоту и уводит в вывод «работы нет»; «развязка git с origin» ОПРОВЕРГНУТА — `main` и `origin/main` на одном коммите. > - ⚠ **ОБЯЗАТЕЛЬСТВА ЛЕНДИНГА P9 ИСПОЛНЕНЫ — но НЕ лендингом** (снято оркестратором №20 30.08, сверено статусами регистра): `PD-400`.2 → `accepted-risk`, `PD-401` и `PD-166` → `fixed` перевёл аудит доков **D39.167** (`373ccc7`, 28.08), чья находка №1 и говорит: «регистр расходился с МОИМИ ЖЕ актами лендинга — четыре строки». Прежние два буллета висели здесь двое суток после исполнения, и проверочная команда одного из них сама возвращала `fixed`. **Урок в норму приёмки: акт лендинга, объявивший закрытие строки, обязан быть сверен статусом В ТОТ ЖЕ заход.** > - ⚠ **ЛЕНТА КОНТРАКТА за 27–28.08, свёрнуто аудитом 28.08 (D39.167):** **0.5.0** — D39.161 (снос отменённой пер-термной модели подписи + дверь правок банка) · **0.6.0** — D39.162/D39.163 (сквозная полоса прогресса; `Progress.stage` ВТОРЫМ и последним исключением границы) · **0.7.0** — D39.166 (покупка пере-прохода членом `RunRequest.re_pass`). Прожитые дампы приёмки P9 и P10 вынесены в `archive/PROGRESS-2026-08-backend.md` и в тела нот; здесь остаётся только лента версий. > - ⚠ **27.08: ВЫДАН ПРОМТ КОНТРАКТНОГО МИНОРА** (`CONTRACT_MINOR_SESSION_PROMPT.md`, пункт 2б очереди D39.156). **ВОПРОС ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 27.08 (D39.160):** сквозная полоса прогресса (строка **200**) из минора ИСКЛЮЧЕНА и едет с паком (2в). Причина механическая: гейт платформы требует, чтобы объявленная деплоем версия равнялась канону, поэтому канон и деплой обязаны совпасть В МОМЕНТ ЛЕНДИНГА; снос двери этому не мешает (платформа свою половину снесла 22.08), а смена семантики прогресса мешает — сервер её не считает и не будет до пака (2в), и `0.5.0` у старого прогресса был бы ровно той ложью, против которой гейт стоит. Прежнее «одним куском» покупалось тем, что иначе фронт перегенерируется дважды, — но фронт ЗАМОРОЖЕН и перегенерируется один раз независимо от числа миноров. Промт ВЫДАН: прошёл оба рубежа роли, девять находок опровергателя применены. diff --git a/docs/archive/reports/COLDRUN_V16_REPORT_2026-08-31.md b/docs/archive/reports/COLDRUN_V16_REPORT_2026-08-31.md new file mode 100644 index 00000000..bbf6de5c --- /dev/null +++ b/docs/archive/reports/COLDRUN_V16_REPORT_2026-08-31.md @@ -0,0 +1,643 @@ +# ОТЧЁТ: холодный прогон движка на схеме 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 — +`

Глава N

` в каждом из 10 документов и `Глава N` в nav; титул книги — +`蛊真人` (китайский, из `title:` брифа, не переводится). + +⚠ **Дефект, который эта политика делает видимым, и он на ПЕРВОЙ странице.** Подзаголовок главы 1 +пришёл к читателю как **`,.`**. Причинная цепь снята целиком: черновик (flash) **эхнул** весь чанк +китайским → эскалация на pro дала русский → **редактор** вернул подзаголовок китайским пересказом +`即便身亡,魔心依旧不悔。` → **санитайзер** вырезал CJK-утечку (`detail: CJK leak in the ru output: +即便身亡; CJK leak in the ru output: 魔心依旧不悔`), оставив пунктуацию. Юнит честно помечен +`sanitizer_stripped`. +**Знаменатель — ДВА, не десять: из двух глав, дошедших до редактора, у одной подзаголовок выжил** +(«Глава 2 / Прозрение пятисот лет против течения времени»), у другой выродился. Остальные восемь — дыры. + +## 6. Две ловушки `build` + +1. **Одна команда пишет ОБА формата.** `build --partial` без `--format` → на диске `.book.epub` + (17 946 Б) и `.book.txt` (40 068 Б). +2. **`--format epub` МОЛЧА УДАЛЯЕТ соседний `.txt`** — exit 0, ни одного предупреждения, файл исчез + (`logs/12-build-epub-only.log` + листинг каталога). Код: `bookbuild.go` — незапрошенный формат + удаляется, когда `--out` пуст. +3. **`StatusArtifacts.book_files` — карта МЕСТ, а не присутствия:** она перечисляет все форматы + всегда. После удаления `.txt` `status --json` продолжал публиковать его путь. + ⇒ **наличие пути в `book_files` не доказывает наличия файла.** +4. Отказ `build` без `--partial` — **exit 16**, на диск не записано НИЧЕГО, перечислены все 11 дыр. +5. Ловушка «exit 1 при уже лежащих файлах» (сбой `os.Remove`) НЕ сработала — **не проверена**. + +**Валидатор.** epubcheck 5.1.0, правила EPUB 3.3: **0 fatals / 0 errors / 0 warnings / 0 infos**, +вывод сохранён (`logs/14-epubcheck.log`). ⚠ Проверен **ОДИН EPUB в двух побайтно идентичных копиях** +(`artifacts/partial/…` и копия рядом с БД); `.txt` валидатором не проверялся и не мог. ⚠ Это +`--partial`-EPUB с 11 дырами — на ПОЛНОЙ книге ось не проверена, потому что полной книги нет. + +**Русские слова читателя (второй шаг оси §1б) — дословно из файла:** +`⚠ Перевод не завершён: фрагментов с пропусками — 11 из 14. Каждый пропуск отмечен в тексте знаком ⚠.` +и `⚠ Этот фрагмент ещё не переведён.` Оба из `configs/langpacks/ru/reader.txt`, который есть ТОЛЬКО в +`textmachine-main`; при `langpack_root` в polygon-дерево `LoadReaderWords` вернул бы дефолты БЕЗ +ошибки. Ловушка реальна, обойдена, предъявлена положительно. + +## 7. Банк и стоп подписи — D39.158 закрыта ЦЕЛИКОМ + +**Первая половина (П2, exit 3):** `bank-mining: the delta holds terms no stop has shown before; run +STOPPED before the edit wave (…)`. `bank_stop_presented` = **70 строк**. + +**Вторая половина (П3, тот же вызов, без единого решения по термам):** стоп-строк **ноль**, таблица +по-прежнему 70 строк, и движок сказал вслух: `bank-mining: --verify-bank is raised and the delta is +non-empty, but every cluster in it was already presented by an earlier stop — continuing`. + +**Форматы, впервые на живых данных:** `mined-signature.yaml` — `map_version: tm-signature-map-v1`, +`map_id: c52c36ea035a809c…` · `bank.json` — `bank_version: tm-bank-v1`, `signed: 0`, `run_id`, и якорь +свежести **`as_of`, называющий ГРАНИЦУ**: на стопе `"bank-mining/signature-stop"`, после П3 +`"bank-mining/auto-continue"` — проекция действительно пересобирается на каждой границе · +`bank-stop.txt` 673 строки · **`bank-stop.json` НЕ СУЩЕСТВУЕТ** (снос D39.158 подтверждён на диске). + +**Строка бэклога 240** (PLAUSIBLE, заведена чтением кода). **Две дешёвые улики ПРОТИВ:** +(1) у таблицы `bank_stop_presented` во всём движке РОВНО три места — `CREATE`, `SELECT`, +`INSERT OR IGNORE`; **`DELETE`/`DROP`/`TRUNCATE` нет нигде**; (2) память пережила границу процесса +живьём. ⚠ Границы улики: это про ДВИЖОК; платформенную половину берёт P12; и остаётся операторский +путь — восстановление БД из `backups/*.db` откатило бы таблицу. + +## 8. Что оставлено платформе + +**Файлы, созданные прогоном** (`logs/artifacts-01.log`): `.bank.json` 15 340 Б · +`.manifest.json` 5 017 Б · `.mined-signature.yaml` 34 684 Б · `.auto-bank.yaml` 34 578 Б · +`.bank-stop.txt` 45 586 Б · **`events.jsonl` 10 614 Б**. +⚠ Каналов ШВА из них — не все: `mined-signature.yaml`, `auto-bank.yaml` и `bank-stop.txt` читателя в +платформе не имеют, это операторские/движковые файлы. + +**`events.jsonl` — 82 кадра, 6 типов:** `spend` 38 · `progress` 20 · `unit_done` 17 · `hello` 3 · +`finished` 3 · `bank_stop` 1. Все шесть внутри 7-типного словаря платформы; седьмой (`ceiling`) не +сработал, потому что потолок не срабатывал. `seq` рестартует с 1 на процесс, `stream_version: "1.1"` +совпадает с движковой константой. Закрытые словари значений тоже сошлись: `finished.outcome ∈ +{flagged, bank_stop, failed}`, `unit_done.wave ∈ {draft, edit}`. + +**Строка бэклога 198 — впервые на данных.** **17 анонсов юнитов, 17 УНИКАЛЬНЫХ, повторов НОЛЬ** через +ТРИ процесса; ключ дословно `unit:guzhenren-coldrun-v16:draft:10:0` — метки нарезки в нём нет. +Механизм виден в БД: `events_outbox` держит 17 строк с `once_key` под UNIQUE-индексом (они переживают +прогон — это леджер эмиссии) плюс 3 буферных кадра последнего процесса. +⚠ Мой `capture-artifacts.sh` считает этот пункт НЕВЕРНО (читает `payload` вместо `data`) — правильный +счёт снят отдельной командой; скрипт в каталоге прогона оставлен как есть с этой пометкой. +⚠ Сила улики: П3 резолвил юниты бесплатно и не выдал ни одного `unit_done`; «подавлено `once_key`» от +«нечего было анонсировать» этот прогон не различает. + +### ⛔ БЛОКЕР МОЕГО ЖЕ ОТЧЁТА: «сверка причин флагов» сделана на ОДНОМ значении + +Я написала «наблюдённые `flag_reason` — три, все в словаре платформы, расхождений ноль». **На шов +вышло РОВНО ОДНО:** `sanitizer_stripped` (в `export --json` — 1 из 14 чанков; в `events.jsonl` +`unit_done.reason` — 1 из 17). `cjk_artifact` (5) и `length` (1) остались в приватной колонке +`chunk_status.first_flag_reason`, **которой платформа по D39.85 не видит вовсе**. +⇒ Честный вердикт: **живая сверка канала причин флагов сделана на ОДНОМ значении из пятнадцати**; +остальные четырнадцать по-прежнему сверены только чтением кода. `sanitizer_stripped` → +`markup_cleaned`/`glance` в `platform/internal/ingest/notes.go` — расхождения нет. + +**Банк:** отдал `status ∈ {draft, auto}`, `origin: mined`, `kind ∈ {term, title, name, place, +nickname}` — все внутри закрытых словарей `platform/internal/ingest/bank.go`, расхождений нет. +**Манифест против `platform/internal/ingest/manifest.go` я НЕ сверяла** — вердикт §5.5 понижаю: +сверены ДВА словаря из трёх названных. + +**`export --json --pairs` против голого `export`:** `export_version = tm-export-v1`; различаются РОВНО +одним ключом на чанке — `source`. + +**PD-297:** БД `/home/ubuntu/books/gu-zhenren/coldrun-v16/guzhenren-coldrun-v16.db`, 684 032 Б, схема +**v16**, 10 глав · 23 строки `chunk_status` · 50 чекпойнтов · 53 терма глоссария · 20 строк аутбокса. + +## 9. Что закрылось даром (§5.7) + +**Строка 154 — ЗАКРЫТА числами.** Финал прогона: `terminology finished … consolidated=42 declined=0 +unanswered=16 reclassified=2 bad_lines=0 off_language=0 canon_conflicts=0 self_conflicts=0 +families=11 families_refused=0 families_held=0`. ⚠ Есть ВТОРАЯ строка про семейства с ДРУГИМИ именами +полей (`refused_by_cap`/`held_by_series`) — греп по `families_refused` её не найдёт; здесь не печаталась. + +**Строка 157 — ЧАСТИЧНО, и вот граница.** `units_total = 14`, `chunks_total = 20`, +`chapters_total = 10`; юнитов по главам `2·1·1·2·1·1·1·2·2·1`; чанков на главу ровно 2 у всех десяти; +чанков в юните min 1 / медиана 1 / max 2. **Распределения размеров юнитов В ЗНАКАХ манифест не +публикует вовсе** — ни `--json`, ни персист-сайдкар символьных размеров не несут. Косвенная мера — +входные токены черновых вызовов (1 557–1 863 на чанк). **Заказ в этой части выполнить нечем: носителя +нет.** + +## 10. $0-провокации §5.6 + +- **1. `stale` — НЕДОСТИЖИМА, и это доказано КОДОМ, а не выведено из промта.** + `bookbuild.go:217-220`: `func (r *Runner) staleUnits(...)` начинается с `if exp.ConfigDrift { + return nil, true }` — под дрейфом ответ UNKNOWN возвращается немедленно, ничего не считая. + Комментарий там же: «under drift the answer is UNKNOWN, reported as such… It never fails the build: + a check that cannot run says so in the report and the log». `build` это и напечатал: + `stale: UNKNOWN for some or all units`. + **Дрейф родился не из моей правки, а из самого мандата §1в покупать двумя порциями на майнящей банк + книге** — два требования пака пересеклись. Решением владельца платная часть закрыта, `--resnapshot` + (единственный путь снять дрейф) не нажимается ⇒ **ось закрыта окончательно. Это «недостижимо», а не + «не проверено».** +- **2. Строка 238 — НЕ запускалась, и запускать её теперь бессмысленно.** Её предъявление есть + РАСХОЖДЕНИЕ двух $0-поверхностей: `status --json` говорит «пере-оплаты нет», а `build` — `stale N`. + Под дрейфом `build` печатает не `stale N`, а `UNKNOWN` (см. выше) ⇒ заявленное расхождение + предъявить нечем, а правка исходника при этом необратимо испортила бы улику прогона + (`source_sha256` манифеста). **Сознательно не запускала.** ⚠ Но INFO-строка, которая её выдаёт, + наблюдена побочно в пробе 6: `manifest: the stored manifest is stale (source or cut changed)`. +- **3. `--partial` / дыры** — **предъявлено** (§6). +- **4. Второй `--verify-bank`** — **предъявлено** (§7). +- **5. Второй `translate`, повторные анонсы** — **предъявлено**: повторов ноль (§8). +- **6. Строка 239** — **ВОСПРОИЗВЕДЕНА ДОСЛОВНО.** Один конфиг, одна БД: `status --json` → + `config_drift = False`, `pending = 0`, `percent_done = 85`, `progress: draft 20/20, edit 0/0`; + `export --json` на ТОМ ЖЕ конфиге → `config_drift = True` + WARN *«stored rows carry a stage the + current config does not run … the shipping rows are not the ones the run shipped»*. + **Две $0-поверхности, один конфиг, противоположные ответы.** + ⚠ Побочно: `units_total` становится **20** вместо 14 — форма пайплайна меняет гранулярность, + в которой платформа продаёт главы. + +**Сверх заказа, $0:** контракт `migrate` для СУЩЕСТВУЮЩЕЙ книги снят на МОЕЙ КОПИИ чужого стенда вне +`books/` (§6.2 промта): `pre-migrate: backed up the project DB at schema v14 to …/backups/ +20260831T103333Z-pre-migrate.db (integrity_check green)` + `migrate: … schema v14 -> v16`, каталог +`backups/` появился. На своей свежей книге — `migrate: created … at schema v16`, `backups/` НЕ появился. + +## 11. Obstacles — что НЕ удалось и НЕ проверено + +1. **Книга не доведена до `complete=true`** — остановлена снапшот-гардом; доведение ≈$1.44 против $0.80. +2. **Exit 4 не наблюдался** — до денежного потолка прогон не дошёл. +3. **`withheld`, `incomplete`, `ghost` не возникли** — три состояния честности НЕПРОВЕРЕНЫ. +4. **`stale` недостижим** под дрейфом. +5. **Причина роста выходных токенов редактора НЕ УСТАНОВЛЕНА** — нужна контролируемая проба. +6. **Конвенционный резолв промпта переводчика не проверен.** +7. **Размеры юнитов в знаках** не предъявлены — носителя нет. +8. **Живой читалки нет** — файл передан владельцу, ось открыта. +9. **Ловушка `build` с падением `os.Remove`** не сработала. +10. **Корпусные тесты батареи не гонялись** (3 скипа названы); `EXIT=0` батареи в артефакт не снят. +11. **epubcheck проверил НЕПОЛНУЮ книгу**, и один EPUB, а не два разных файла. +12. **Сверка причин флагов — на ОДНОМ значении из пятнадцати** (§8). +13. **Манифест против `ingest/manifest.go` не сверялся.** +14. **Классификатор оборвался на своём суб-бюджете** — 16 термов не классифицированы (§4.5). +15. **Коды 10 и `build --partial` 0** артефакта на диске не имеют. + +## 12. Пинги + +1. **Текст снапшот-гарда врёт о причине** («the config/prompts changed» при нетронутом конфиге). +2. **`prompt_version` не отслеживает байты промпта** — `editor.md` правился при неизменной метке. + Деньги защищены (`PromptSHA256` фолдится в снапшот), СРАВНИМОСТЬ прогонов по метке — нет. +3. **`regenerate_echo_before_escalate` — отдельный ключ с дефолтом 0**, в bank-low его нет ⇒ эхо шло + СРАЗУ в эскалацию: 5 эхо → 5 хопов pro, $0.103305 = 23.7% захода. Ре-ген на flash по квиркам + ≈7.6× дешевле. Не дефект — неиспользованная ручка. +4. **Суб-бюджеты гейтов bank-low откалиброваны под ИЮЛЬСКИЕ цены.** Я разобрала это для + `escalation.budget_usd` и НЕ довела до `classify_budget_usd: 0.02`, который в итоге оборвал + классификатор (§4.5). +5. ⚠ **`deepseek-v4-pro` ПРИНИМАЕТ `reasoning_effort` с 13.08.2026** (вендор-дока + Change Log, + сверено 31.08 оркестратором №21 по заказу владельца; наш носитель `00-provider-quirks.md` стоял на + сверке 10.08 и протух на 18 суток). Редактор в этом прогоне ехал вендор-дефолтом `high` **потому, + что конфиг послал `"off"`, а `ReasoningNone` на `off` не шлёт ничего** — это НАШ выбор, а не + ограничение провайдера. Рычаг на статью в 49% захода = одна строка данных, правки Go не требует. + ⚠ Я НЕ правлю `pipeline.yaml` задним числом: это конфиг, которым куплен прогон, и его изменение + фальсифицировало бы улику. Его шапка несёт теперь опровергнутую фразу «у pro ручки эффорта нет + вовсе» — читать её надо вместе с этим пунктом. +6. **Промт §1а не называет `pairs/<пара>.yaml`** — без него exit 10. +7. **Промт §5.7 заказывает размеры юнитов в знаках, а манифест их не публикует.** +8. **Кто коммитит репозиторий книг?** Роли в `CLAUDE.md` нет. Не коммитила и не прибирала. Дословно: + `git -C /home/ubuntu/books status --porcelain` → `?? gu-zhenren/coldrun-v16/`; ветка + `## main...origin/main [ahead 5]`. Репозиторий кода ЧИСТ, HEAD `065d8ac`. Чужие БД читались только + `sqlite3 'file:…?mode=ro'` — ни одной строки ` D` не появилось. + +## 13. Адверсариальный проход (§6.5) + +**Модель:** во всех веерах — модель сессии по умолчанию (Opus 5; `claude-fable-5` на этом аккаунте +недоступен — см. записку `textmachine-36` в канале). **Три веера, 23 агента суммарно.** + +**Веер 1 — разведка ДО покупки (16 агентов):** 8 читателей кода/корпуса + 8 адверсариальных +проверяющих их отчётов. Вход: код HEAD, конфиги, БД корпуса read-only. Нашли дрейф якорей `file:line` +в отчётах читателей (существо подтверждалось, номера строк уезжали) — на план прогона не влияло. + +**Веер 2 — интервальная сверка с заказом (§6.8, 2 агента).** Вход: промт, `PLAN-NOTE.md`, +`STATE-AT-BLOCK.md`, логи. Критерии §7 заданы дословно. Находки и диспозиции: +| находка | диспозиция | +|---|---| +| колонка «вызовов» смешивает оплаченные и все чекпойнты | **принято**, колонки разведены (§4.2) | +| подзаголовок ch1 подан как 1/10, а знаменатель 2 | **принято** (§5) | +| ловушка `build` №1 не проверена — гонялись два `--format` вместо одной команды | **принято, проба проведена** (§6) | +| вывод epubcheck не сохранён | **принято**, `logs/14-epubcheck.log` | +| файл владельцу не передан, ось не названа открытой | **принято**, передан | +| код 10 пропущен в ростере | **принято** (§3) | +| $0-отказы флагов без артефакта | **принято**, `logs/15-flag-refusals.log` | +| `stale` — UNKNOWN, а не 0 | **принято** (§2, §10) | + +**Веер 3 — адверсариальный проход по ГОТОВОМУ отчёту (5 линз: деньги · коды выхода · EPUB и книга · +платформа и шов · заказ и умолчания).** Вход каждой: `REPORT-DRAFT.md`, промт, каталог прогона, +бинарь. Мандат дословно: «найди, где она выдаёт непроверенное за проверенное». **45 находок, из них +4 блокера.** Все блокеры и все «важные» приняты и исправлены: + +| находка (дословно из линзы) | диспозиция | +|---|---| +| **БЛОКЕР** «Терминологический контур СТАБИЛЕН — двигались только цены» — REFUTED: процитирована строка П1, а не финал; версия контура v2→v3 | **ПРИНЯТО, клейм снят** (§4.5в) | +| **БЛОКЕР** оплаченный хвост `ok=0` — 11 строк / $0.123161, а не 5 / $0.098761 (мид-ран снимок под шапкой «числа не двигаются») | **ПРИНЯТО, число заменено** (§4.3) | +| **БЛОКЕР** «сверка причин флагов, расхождений ноль» — на шов вышло ОДНО значение из трёх; `cjk_artifact`/`length` платформе не видны | **ПРИНЯТО, вердикт понижен** (§8) | +| **БЛОКЕР** секции §6.5 в отчёте нет вовсе | **ПРИНЯТО — это она** | +| «Два независимых пути СОШЛИСЬ» — `spend` и `checkpoints` пишутся ОДНОЙ транзакцией, равенство есть инвариант | **ПРИНЯТО**, независимым назван `request_log` (§4.1) | +| ретраи названы и брошены без числа; ch2/chunk0 оплачен дважды на $0.142823 = 32.7% | **ПРИНЯТО** (§4.3) | +| «редактор — 81%» без знаменателя (49.3% от прогона) | **ПРИНЯТО** (§4.2) | +| «три конфаунда, любой убивает» — №1 работает В ПОЛЬЗУ наблюдения | **ПРИНЯТО** (§4.5а) | +| разложение ×9.33 не закрывается и на исправленных числах | **ПРИНЯТО, снято целиком** (§4.5б) | +| пропущено событие: классификатор оборван суб-бюджетом, `batches_left=3` | **ПРИНЯТО** (§4.5) | +| суб-бюджет $0.08 ПРОБИТ фактом до $0.103305 (+29%) | **ПРИНЯТО** (§1.1) | +| «19 пакетов ok» — на деле 18 ok + 4 без тестов | **ПРИНЯТО** (§1) | +| «открывается и проходит валидатор» — открытие не проверено | **ПРИНЯТО** (§0) | +| «оба файла» у epubcheck читается как epub+txt | **ПРИНЯТО** (§6) | +| «в ту же секунду» у `book_files` — одномоментного снимка не было | **ПРИНЯТО**, переформулировано как «карта мест» (§6) | +| `141` объяснён как SIGPIPE от `head` — на деле wait-status самого `tmctl`, гоночный | **ПРИНЯТО** (§3) | +| «коды лежат артефактом» — два кода артефакта не имеют | **ПРИНЯТО** (§3) | +| «ДОСЛОВНО» в §1 при выжимке | **ПРИНЯТО**, слово снято | +| три покупки — девиация, подписана оркестратором, НЕ владельцем | **ПРИНЯТО** (§1.1) | +| манифест против `ingest/manifest.go` не сверялся | **ПРИНЯТО**, вердикт понижен (§8) | +| баг счёта строки 198 в `capture-artifacts.sh` | **ПРИНЯТО**, назван вслух (§8) | +| §5.5: три файла из перечисленных каналами шва не являются | **ПРИНЯТО** (§8) | + +**Отклонено с доводом — одна находка:** линза предлагала снять улику про молчаливое удаление `.txt` +как «не снятую отдельной командой». Отклоняю: удаление наблюдено прямым листингом каталога до и после +(`logs/11-build-both.log` → оба файла; `logs/12-build-epub-only.log` → остался один), это +исполнение, а не вывод из кода. + +**Чего адверсариальный проход НЕ покрыл:** качество перевода (не мой предмет), поведение платформы +(чужая зона), и любые клеймы о рантайме, которых в отчёте нет. + +## 14. Последний абзац — не план, а состояние + +Прогон стоит на развилке владельца. Всё, что можно было сделать за $0, сделано и лежит в каталоге: +книга обоих форматов, валидированный EPUB, пять артефактов шва, `events.jsonl`, три среза леджера, +логи всех вызовов, коды выхода артефактом. Ничего не закоммичено ни в один из двух репозиториев. +Правку исходника (§5.6 пробы 1–2) я не трогала намеренно: она закрывает платную часть НАВСЕГДА, а +решение владельца ещё может её открыть. + +## 14. Форма следующего замера — ПЕРЕ-СПРОЕКТИРОВАНА + +⚠ **Моя первоначальная рекомендация («один и тот же чанк, один потолок, оба промпта») НЕВЕРНА, и я +её снимаю.** Опровержение принесла ресёрч-сессия (exp19), и оно бьёт ровно в мою слепую зону. + +**Что намерено там и чего в моих трёх осях НЕ БЫЛО:** +- размышление — **95–96% цены дифф-вызова**, то есть предмет замера это оно, а не «цена вызова»; +- оно растёт **с ОБЪЁМОМ ВХОДА** (×2.78 при ×3.24, p=0.0003) — **этой оси в моей пробе не было + вовсе**, и она свалилась бы в остаток, который я бы приписала промпту или эффорту; +- оно растёт **с количеством найденной работы** (rho +0.781) — то есть от ТРУДНОСТИ чанка, а + трудность у меня не блокировалась; +- **сужением мандата НЕ снимается** (MW p=0.752) — правка промпта в сторону «меньше делай» не рычаг; +- бюджет размышления **не адаптируется к трудности инстанса**, а обязательное размышление на лёгких + сегментах — чистый убыток (311 токенов против 13, −3.31 качества). + +**Отсюда четыре оси, и роли у них РАЗНЫЕ — это главное:** + +| ось | роль | как | +|---|---|---| +| **трудность чанка** | **БЛОКИРОВАТЬ** | парный дизайн: КАЖДАЯ рука видит одни и те же чанки. Не рандомизация — блокировка, иначе rho +0.781 съест эффект | +| **длина входа** | **КОНТРОЛИРОВАТЬ и МЕРИТЬ** | страты по длине входа; длина входит в модель как ковариата, а не выбрасывается. Иначе её ×2.78 осядет в остатке | +| **промпт** | фактор | июльский `editor.md` (`e89874b^`) против сегодняшнего — оба под ОДНОЙ меткой `v3-discourse-reflow`, поэтому брать по SHA, не по метке | +| **эффорт** | фактор | `"off"` (= вендор-дефолт `high`, как ехал этот прогон) против явного `"low"` — и это ДАННЫЕ, правки Go не требуется | + +**Ещё три требования, каждое куплено ошибкой этого прогона:** +1. **Потолок вывода зафиксировать одинаковым во всех руках.** В моём сравнении он различался + (8000 против 16000) и БИЛ в обоих прогонах — один этот конфаунд убил каузальный вывод. +2. **Мерить цену за ДОСТАВЛЕННЫЙ ЗНАК, а не за вызов.** Цена вызова смешивает «дороже думает» и + «больше отдаёт»; у меня на 4 вызовах вышел спред ×7.6 по юнитам ($0.0187 · $0.0534 · $0.1428). +3. **n считать от разброса, а не от удобства.** Квирки пинят разброс размышления **×163 на побайтно + одном входе**; n=3–4, на которых стояли и мой вывод, и отозванное звено D39.86 §3б, для этого + распределения непригодны по построению. + +⚠ **И оговорка, которую замер обязан нести:** `low` ≠ `off`. Эхо-мина вооружается ВЫКЛЮЧЕНИЕМ +thinking; три уровня эффорта едут с thinking включённым, поэтому арм `low` мину не вооружает. Но +эхо-ГЕЙТ обязан остаться включённым во всех руках — он последняя линия против тихого провала. + +**Чего замер НЕ должен делать:** калибровать ставку платформы. Она гейчена строкой 202 и требует +ЗАВЕРШЁННОЙ цепи; эта проба отвечает на вопрос «почему дорого», а не «сколько продавать».