textmachine/docs/archive/reports/COLDRUN_V16_REPORT_2026-08-31.md

66 KiB
Raw Permalink Blame History

ОТЧЁТ: холодный прогон движка на схеме 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 0104 и 0610 у 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=118 пакетов 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>011 строк, $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», lowlow; сноска «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 ручки нет» стояла на нём. ⚠ Безопасность: lowoff. Эхо-мина вооружается ВЫКЛЮЧЕНИЕМ 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 — <h1>Глава N</h1> в каждом из 10 документов и <a href="chN.xhtml">Глава N</a> в 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 без --partialexit 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.yamlmap_version: tm-signature-map-v1, map_id: c52c36ea035a809c… · bank.jsonbank_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): <db>.bank.json 15 340 Б · <db>.manifest.json 5 017 Б · <db>.mined-signature.yaml 34 684 Б · <db>.auto-bank.yaml 34 578 Б · <db>.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_strippedexport --json — 1 из 14 чанков; в events.jsonl unit_done.reason — 1 из 17). cjk_artifact (5) и length (1) остались в приватной колонке chunk_status.first_flag_reason, которой платформа по D39.85 не видит вовсе. ⇒ Честный вердикт: живая сверка канала причин флагов сделана на ОДНОМ значении из пятнадцати; остальные четырнадцать по-прежнему сверены только чтением кода. sanitizer_strippedmarkup_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 5571 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 говорит «пере-оплаты нет», а buildstale 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 --jsonconfig_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 пробы 12) я не трогала намеренно: она закрывает платную часть НАВСЕГДА, а решение владельца ещё может её открыть.

14. Форма следующего замера — ПЕРЕ-СПРОЕКТИРОВАНА

Моя первоначальная рекомендация («один и тот же чанк, один потолок, оба промпта») НЕВЕРНА, и я её снимаю. Опровержение принесла ресёрч-сессия (exp19), и оно бьёт ровно в мою слепую зону.

Что намерено там и чего в моих трёх осях НЕ БЫЛО:

  • размышление — 9596% цены дифф-вызова, то есть предмет замера это оно, а не «цена вызова»;
  • оно растёт с ОБЪЁМОМ ВХОДА (×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=34, на которых стояли и мой вывод, и отозванное звено D39.86 §3б, для этого распределения непригодны по построению.

И оговорка, которую замер обязан нести: lowoff. Эхо-мина вооружается ВЫКЛЮЧЕНИЕМ thinking; три уровня эффорта едут с thinking включённым, поэтому арм low мину не вооружает. Но эхо-ГЕЙТ обязан остаться включённым во всех руках — он последняя линия против тихого провала.

Чего замер НЕ должен делать: калибровать ставку платформы. Она гейчена строкой 202 и требует ЗАВЕРШЁННОЙ цепи; эта проба отвечает на вопрос «почему дорого», а не «сколько продавать».