# Эксперимент 25. Холодный прогон B — «от двери до ФАЙЛА» во ВТОРОЙ раз, и впервые с вычиткой > **Пре-регистрация.** Всё, что ниже строки «ГРАНИЦА ФРИЗА», написано ДО первого платного вызова и > закоммичено фриз-коммитом. Результаты дописываются ПОСЛЕ прогона отдельной секцией и ничего в > пре-реге не правят: расхождение НАЗЫВАЕТСЯ, а не подгоняется. **Зона:** сквозной прогон · **Пак:** `docs/COLD_RUN_B_SESSION_PROMPT.md` (редакция `3fce077`) · **Дата:** 11.09.2026 **Предмет:** четыре вещи, которых нет ни у кого, плюс заказ владельца на ВЫЧИТКУ боевого текста. ## 0. Что именно покупается, и чего этот прогон НЕ покупает **Покупается:** (1) первое исполнение двух миграций схемы НА ПЛАТНОМ ПРОГОНЕ · (2) числа консистентности С ПРОГОНА, а не пере-сканом сохранённой базы A · (3) платформенный пак СКВОЗЬ · (4) пре-регистрированный ЗНАМЕНАТЕЛЬ денежной дыры и проверка её ЗНАКА · (5) ⭐ вычитка ВСЕГО перевода против ВСЕГО оригинала отдельным опус-читателем и сверка ПРИБОРОВ движка с тем, что он увидел. ⛔ **НЕ покупается и не оплачивается ни центом:** ответ на «безопасно ли редактору думать меньше» (ряд 433) — это парный дизайн, отдельные деньги, отдельный заказ. B идёт на боевых настройках как есть. ⛔ **НЕ покупается ВЕЛИЧИНА доли выброшенного.** B — ЕЩЁ ОДИН одиночный прогон. Квирки §3д: при sd логарифма 0.82 парный дизайн ловит эффект ×2.5 за **13 пар**, ×2.0 за 22, ×1.4 за 93. **n = 2 этой нормы не выполняет и выполнить не может.** Писать «25.4 % подтверждено» по двум розыгрышам — ошибка. ## 1. ГРАНИЦА ФРИЗА — что зафиксировано до первого цента | Предмет | Значение | |---|---| | Фриз-sha (КОД, которым собраны бинари) | `baa06cef7b2b30b8f7cbe031f3d0fabc03a01a55` | | Фриз-дерево | локальный **клон** `~/tm-coldrun-b/freeze` (0 грязных строк; контроль — главное дерево в тот же момент 1) | | Бинари | `tmctl` · `tmplatformd` · `tmplatformctl` · `stub` · `zeropipe` — **все пять** из клона, у каждого `vcs.revision=baa06ce…`, `vcs.modified=false`, строк `vcs.*` = 3. Негативный контроль: та же сборка из ГЛАВНОГО дерева даёт `vcs.modified=true`. ⚠ Прогон A объявил девиацией, что два его инструмента собраны НЕ из фриза (§12.5) — здесь эта девиация закрыта построением | | Исходник (оригинал) | `books/gu-zhenren/coldrun-v16/guzhenren-ch1-10.gb18030.txt`, 57838 байт, sha256 `0b5f9b0266d8c32ac717a41211d2ed15d4f2a07f37a701fb686e255ab6c89f37` | | Исходник (СРЕЗ, что покупается) | главы 1–3, **17564 байта**, sha256 `ed870ba6065ce3eb4eec12e80238efbc2be8511f38334ab1d92d5693f4ef4df9`. Нарезан МНОЙ из оригинала (`head -c`), байт-в-байт равен срезу прогона A (`cmp`). **Граница чистая:** декодируется целиком в **9021 знак**, кончается на границе абзаца, несёт **ровно 3** заголовка `第…节` при **10** в целом файле (контроль напечатан рядом) | | Фактический pipeline-YAML | `~/tm-coldrun-b/mirror/cfg/pipeline-c1.yaml`, sha256 **`a46b33ee65b7713b4fbf86f64c788ba6b11eb0a219170c145a6205088156ad49`**, байт-в-байт равен `backend/configs/pipeline-c1.yaml` фриза (`cmp`) | | Реестр моделей | `~/tm-coldrun-b/mirror/cfg/models.yaml`, sha256 `835af7b2d8830e6058b650ab742603d228febbd663978d88e0fe496ff78b5c1c` | | Артефакт контраста | `mining-contrast.zh.txt` = jieba 0.42.1 `dict.txt`, sha256 `7197c3211ddd98962b036cdf40324d1ea2bfaa12bd028e68faa70111a88e12a8`, 349 046 строк. ⚠ `CheckMiningContrast` делает ТОЛЬКО `os.Stat` и удовлетворился бы фальшивым кандидатом — sha сверена руками | | Шаблон книги | `~/tm-coldrun-b/book-template-c1.yaml`, sha256 `4118a43059dba64a45290db73252a1306af341ff4c429100314256c95ca2f24d` | | Потолки книги (ДВИЖКОВЫЕ, в шаблоне) | `book_usd: 1.25` · `day_usd: 2.50` — те же, что у A, ради сравнимости | | Потолок ПЛАТФОРМЫ | холд ≈$2.24 (формула ниже), грант учётки **$2.50** | | Стоп-правило СЕССИИ | факт **$1.00** — раньше обоих потолков; достигнут ⇒ СТОП и пинг, не решение сессии | ### 1.1 ⭐ ДВЕ КАРТЫ СРАВНИМОСТИ A↔B, которых у прогона A не было 1. **ПОКУПАЮЩИЙ файл тождествен.** sha `a46b33ee…` — та же, что в пре-реге прогона A. Что именно покупается, между прогонами не изменилось ни на байт. 2. **ЦЕНОВАЯ МОДЕЛЬ тождественна.** `models.yaml` фриза A и фриза B различаются **ровно на 10 строк, и все десять — КОММЕНТАРИИ** (не-комментарных изменённых строк: **0**). ⇒ долларовые числа A и B считаны одним прайсом и сравнимы напрямую. 3. ⛔ **А КОД — НЕТ, и это записывается ОГРАНИЧЕНИЕМ, а не замалчивается.** Между `b0f5d89` (фриз A) и `baa06ce`: **118 коммитов**, `backend/` **52 файла** (+7678/−85), `platform/` **30 файлов** (+3945/−158), включая денежный путь. **B меряет ДРУГОЙ движок.** Прямой строкой: **двойная оплата могла измениться из-за НАШИХ правок, а не из-за провайдера.** ### 1.2 Срез по $0-манифесту (`tmctl manifest --json`, бинарь фриза B) | Глава | `units_total` | `chunks_total` | `expected_usd` | знаков | |---|---|---|---|---| | 1 `第一节:纵身亡魔心仍不悔` | 2 | 2 | 0.032424 | 3287 | | 2 `第二节:逆光阴五百年觉悟` | 1 | 2 | 0.028459 | 3051 | | 3 `第三节:请一边玩蛋去` | 1 | 2 | 0.023237 | 2421 | | **книга** | **4** | **6** | `expected_usd 2.08412008` · `book_once_usd 2.00` · `step_max_usd 0.13647876` | 8759 | Смета ТЕКСТА — сумма глав, **$0.084120**; `book_once_usd` $2.00 это ПОТОЛКИ контура банка (`gates.terminology.budget_usd 1.00` + `classify_budget_usd 1.00`), а не смета. ⭐ **Все семь чисел этой таблицы совпали с манифестом прогона A до последнего знака** — при другом бинаре, другом каталоге и другом `book_id`. Это сильная улика тождества покупаемого. ## 2. ⛔ МЕРА ДЕНЕЖНОЙ ДЫРЫ — пре-регистрируется ЗДЕСЬ, до первого цента **Прибор ПРОВЕРЕН ДО ПРИМЕНЕНИЯ:** те же запросы, прогнанные по сохранённой базе прогона A, дают его числа. Это не «похоже», а пере-снято: 33 строки · 33 уникальных `id` · 2 трейса · $0.419423. * **единица** = `(chapter, chunk_idx, stage, role)`. Номера попытки в ключе НЕТ намеренно: единица ОХВАТЫВАЕТ попытки. ⚠ У стадии `terminology` все строки несут `chapter = 0`, то есть `chunk_idx` там — индекс майнинг-батча, а не чанк главы. Одно слово покрывает ДВА предмета; в каждом числе называется, какой именно. * **знаменатель** = единицы, за которые заплачено хоть раз (`sum(cost_usd) > 0`). **Печатаются ОБА счёта.** На A фильтр не отсеял ничего (17 и 17) ⇒ его поведение не проверялось ни разу. * **ЧИСЛИТЕЛЬ ПЕРВЫЙ — выброшенная покупка:** единицы, где есть хоть одна оплаченная и НЕ принятая попытка (`ok = 0 AND cost_usd > 0`). **База A: 4 из 17 = 23.5 % ЕДИНИЦ**, тогда как по ВЫЗОВАМ то же событие даёт 4 из 27 = **14.8 %**. Две меры расходятся в полтора раза — потому мера и объявлена. * **ЧИСЛИТЕЛЬ ВТОРОЙ — ПЕРЕ-МАЙНИНГ БАНКА, и он НЕ называется «пере-оплатой».** Единицы, за ПРИНЯТЫЙ результат которых заплачено больше одного раза (`ok = 1`). На A это вся стадия терминологии. **Главное число — «все платежи КРОМЕ ПЕРВОГО» = $0.028742 (6.9 %), нижняя граница; рядом печатается «все КРОМЕ ПОСЛЕДНЕГО» = $0.035723 (8.5 %).** Разница 24 %, и обе ориентации получены ПОРЯДКОМ — тем самым методом, на котором прошлая смена получила ложные 54.9 %. Поля, называющего вызов-источник, у строк банка НЕТ (`glossary` 21 колонка, вызова среди них нет; `glossary_revisions` 0 строк), поэтому ориентация выбирается явно и объявляется. ⛔ **И почему это НЕ «деньги за пустоту»** (замерено мной на артефактах A ДО прогона B): второй заход терминологии ИЗМЕНИЛ передачу у **12 термов из 69**, и **11 из 12 уехали читателю именно в ФИНАЛЬНОЙ форме** (стоп-форма — 0 из 12; один терм не встретился ни в какой). Это ЦЕНА ПЕРЕ-МАЙНИНГА БАНКА ПОСЛЕ ЧЕЛОВЕЧЕСКОЙ ПОДПИСИ, а не выброшенная покупка. * **ДВА ПУТИ К ДЕНЕЖНОМУ ЧИСЛУ.** Путь 1 — по колонке `degraded`; путь 2 — по `ok = 0 AND cost_usd > 0`, колонки `degraded` не касаясь. На A оба дали **$0.106472 = 25.4 %**, но совпадают они ПО ПОСТРОЕНИЮ. ⇒ совпадение на B — слабая улика; **РАСХОЖДЕНИЕ — сильная находка**: классификатор и признак приёмки разъехались. ⚠ **25.4 % — доля ДЕНЕГ, 23.5 % — доля ЕДИНИЦ**, подменять нельзя. ## 3. ⛔ ДВЕ СЛЕПЫЕ ПОВЕРХНОСТИ ПРИБОРА КОНСИСТЕНТНОСТИ, НАЗВАННЫЕ ДО ПРОГОНА Обе найдены на артефактах прогона A, обе меняют то, как прибор B строится. **(а) ГРАНИЦА БАНКА.** Прибор A сверял отгруженный текст со СТОП-ПРЕДЛОЖЕНИЕМ банка (`project.db.bank.json`, снят в момент подписи), а читатель получил текст, сделанный под ФИНАЛЬНЫМ банком: терминология пере-майнится ПОСЛЕ подписи, и редакторская волна идёт после неё (по `request_log` прогона A: терминология-2 кончается 01:42:10, редактор идёт 01:43:54 → 01:54:44). ⇒ **прибор B читает ФИНАЛЬНЫЙ банк и ПЕЧАТАЕТ, какую версию он прочёл.** Класс — `D39.228` п.5. **(б) ЗНАМЕНАТЕЛЬ САМОГО ПРИБОРА.** На A он нашёл передачу у **40 термов из 69**, а у **29** вернул пусто — и записал их в «консистентные». Его итог «отдано более чем одной формой: 0» посчитан по 40, а читается как утверждение о книге. ⇒ **прибор B печатает всегда: термов всего N · передачу нашёл у M · пусто у K, и K проверяется ТЕКСТОМ**, а не принимается за консистентность. ## 4. Пре-рег-таблица: узел → что ДОЛЖНО произойти → чем предъявлено → что считается провалом | # | Узел | Ожидание (числом или строкой) | Чем предъявлено | Провал | |---|---|---|---|---| | 1 | Стенд — мой | слушатель `127.0.0.1:8098` принадлежит МОЕМУ pid; на `11434` в платной фазе НЕ слушает НИКТО | `ss -ltnp` + pid-файл | чужой процесс на порту ⇒ СТОП | | 2 | Код — из фриза | у ПЯТИ бинарей `vcs.revision=baa06ce…`, `modified=false`, строк `vcs.*` > 0 | `go version -m` | любое из трёх не так ⇒ СТОП | | 3 | Гость и деньги | ОТДЕЛЬНАЯ платная учётка; грант $2.50 одной строкой `credit_ledger.kind='grant'` | `tmplatformctl balance` + строка леджера, ФИЛЬТРОВАННАЯ по учётке | дымовые деньги попали в счёт ⇒ число недействительно | | 4 | Интейк | `201`, `chapter_count = 3`; ⚠ `character_count` ≈ 9677 (счёт интейка по потоку, ПРИБЛИЗИТЕЛЬНЫЙ), точный — `source_chars = 8759` | тело 201 + строка `books` | не 3 главы ⇒ СТОП до оплаты | | 5 | Срез совпал | `units_total = 4`, по главам **2/1/1**, `chunks_total = 6` | `chapters`+`units` в Postgres против §1.2 | расхождение ⇒ СТОП до оплаты | | 6 | Цена и бонд | `term_consistency_funded: true`, `verdict: covers_all`, `affordable_chapters: 3`, холд **2 241 631 µUSD** = ⌈84 121 × 1.25⌉ + 136 479 + 2 000 000 | `GET /v0/books/{id}/run-options`, тело в файле | `false` ⇒ СТОП до оплаты | | 7 | Старт | `202`, `status: translating`, `ordered_chapters: 3`, `runs.bond_funded = t`. ⚠ **Ожидается, что ответ старта скажет `term_consistency_funded: false`** при уже выставленном `bond_funded = t` — находка 7 прогона A; ВОСПРОИЗВЕДЕНА мной на $0-руке | ответ + строка `runs` | отказ старта ⇒ СТОП и пинг | | 8 | Ключи живы | первый платный вызов не отказан по авторизации | `request_log.err` на первой строке | отказ провайдера ⇒ СТОП и пинг (не наша поломка) | | 9 | Кадры | `events.jsonl` несёт `hello · progress · unit_done · spend · bank_stop · finished`; `run_attempts.last_seq` растёт **ПО ПОПЫТКАМ** | счёт кадров по типам, per-attempt | кадров нет при живом юните ⇒ дефект | | 10 | Банк-стоп | `runs.status = awaiting_bank`, exit **3**, `.bank.json` несёт непустой `proposed[]` и `terms: []` | статус + exit + КОПИЯ сайдкара (резюм её уничтожает) | стоп не наступил ⇒ исход «узел не наступил», не провал | | 11 | Проекция банка | `bank_terms` = **0** ПОКА прогон не закрыт и **> 0** ПОСЛЕ | `GET …/bank` дважды + `select count(*)` | ноль ПОСЛЕ закрытия ⇒ дефект | | 12 | Дверь правок | `preview:true` → `changed:true`, на диске НИЧЕГО; `preview:false` → `state: applied` + `mined-delta.yaml` | тела обоих ответов В ФАЙЛАХ + sha файла до/после | преview написал на диск ⇒ дефект | | 13 | Резюм (**РОВНО ОДИН**) | `202`, вторая строка `run_attempts`, `exit_code = 0` | `run_attempts` | не возобновился ⇒ дефект | | 14 | Книга переведена | `units.state = translated` у всех **4** юнитов | `select state, count(*)` + контрольный счёт юнитов книги | любой не `translated` ⇒ книга не доведена | | 15 | Сборка | `complete: true`, `pending/withheld/incomplete/stale/ghost = 0`, `stale_unknown: false`, `config_drift: false` | stdout `tmctl build` (на API этих полей НЕТ) | любое не так ⇒ книга не целая | | 16 | Выгрузка | `exports.state = ready`, `exports.complete = t`, `size_bytes` = числу скачанных байт, ОБА формата | строка `exports` + длина скачанного | `complete` не `t` ⇒ дверь отдала книгу с дырой | | 17 | ФАЙЛ | байты скачаны, sha256 напечатан; EPUB читается структурно (zip + `container.xml` + `nav` + spine = 3) | sha256 + разбор zip | не открывается ⇒ провал | | 18 | Человек прочитал | первый абзац — связный русский текст | цитата в отчёте | не текст ⇒ провал | | 19 | Деньги сошлись | Σ `request_log.cost_usd` ≈ кадр `spend` ≈ Σ `settlement` ЭТОЙ учётки ≈ (грант − баланс); открытых резерваций **0** | четыре счёта в µUSD рядом, ВСЕ фильтрованы по учётке | расхождение — НАЗВАТЬ, не подгонять | | 20 | Ничего не реплеено | `tm_hit = 1` печатается С РАЗБИВКОЙ ПО ПОПЫТКАМ **по `trace_id`** (он несёт номер попытки), `distinct model_actual` не содержит `local-*` | запросы к `project.db` | есть `local-*` ⇒ прогон измерил заглушку | | 21 | **v17 `wave_selection`** | **10 строк = 6 `draft` + 4 `edit`**, и волны стоят над РАЗНЫМИ снапшотами (черновик — базовый банк, редактор — обогащённый) | `select wave, count(*)` + `snapshot_id` + `injected_srcs` | строк нет ⇒ **пинг, а не ноль в отчёте**: писатель гейтится `r.memory != nil` | | 22 | **v18 `reasoning_in_completion`** | **ТРЁХЗНАЧНО**: сколько `NULL`, сколько `0`, сколько `>0`, сумма = числу строк. Ожидание: на DeepSeek `>0` преобладает | три счёта + контроль суммы | «не ноль» вместо трёхзначности ⇒ вопрос не задан | | 23 | Консистентность | `I1`/`I2` С ПЕЧАТАЕМЫМИ знаменателями + «термов N · передачу нашёл у M · пусто у K» + **какую версию банка прочёл прибор** | `QualityReport().Consistency` + свой счёт по отгруженному тексту | число без знаменателя в этом паке не принимается | | 24 | ⭐ Вычитка | опус-читатель получает ВЕСЬ перевод и ВЕСЬ оригинал; печатает знаков оригинала (**контроль: 9021**), знаков перевода, ПОСЛЕДНЕЕ предложение обоих | его отчёт | не напечатал доказательство дочитывания ⇒ отчёт не принимается | | 25 | ⭐ Сверка приборов | таблица 2×2 заполнена ИМЕНАМИ находок; левая нижняя клетка («прибор смолчал, читатель нашёл») названа поимённо | §4.6 отчёта | клетка пуста без довода ⇒ сверка не сделана | ## 5. Стоп-правила (остановка и пинг, не решение сессии) 1. фактическая трата дошла до **$1.00** (1 000 000 µUSD); 2. `runs.paused_reason` НЕПУСТО — любое из четырёх (`run_limit_reached · credit_exhausted · daily_ceiling · ceiling_unknown`); 3. срез не совпал с §1.2 — стоп ДО оплаты; 4. `term_consistency_funded: false` в `run-options` — стоп ДО оплаты; 5. бинарь не из фриза — стоп до устранения; 6. что-либо слушает `127.0.0.1:11434` в платной фазе — стоп: прогон измерял бы заглушку. ## 6. ⛔ ОГРАНИЧЕНИЯ, ОБЪЯВЛЕННЫЕ ДО ПРОГОНА 1. **ЭСКАЛАЦИЯ В B НЕ ИСПОЛНЯЕТСЯ.** `pipeline-c1.yaml:223` несёт `escalation.budget_usd: 0`, а комментарий строкой `:221` гласит: «Приёмочная сессия 蛊真人 ОБЯЗАНА выставить budget_usd>0». Решение оркестратора: **не трогать**, потому что тождество покупающего файла и ценовой модели (§1.1) стоит дороже одного непроверенного пути. ⇒ B, как и A, о работе эскалации не говорит НИЧЕГО. Сам этот факт идёт находкой вне заказа: механизм построен, ратифицирован и не может исполниться ни на одном боевом конфиге без ручного оверрайда, которого никто ни разу не сделал. 2. **Судьи на пути нет** (`role: judge` живёт только в `c2`), **гейт `coverage` выключен** ⇒ из пяти гейтов работают четыре. Проверяемый путь: черновик → редактор → четыре $0-гейта → выгрузка. 3. **`epubcheck` не гоняется** — `java` на хосте нет и поставить нельзя. EPUB судится структурно. 4. **ТРИ следа — не три свидетеля.** Postgres платформы МАТЕРИАЛИЗУЕТСЯ из `events.jsonl` движка, а текст и файл платформа берёт теми же вербами `tmctl`. По-настоящему независимы только скачанные байты и их sha256, плюс systemd-маркеры выхода. Биллинга провайдера у нас нет вовсе. 5. **Доллары — НАША модель поверх токенов провайдера.** Провайдер сообщает ТОКЕНЫ; цену умножаем мы, по пину `models.yaml`. На 11.09 пин flash был ВЫШЕ вендорской страницы на 13 % (D39.247 п.3). 6. **Пик/офф-пик.** Прогон A шёл 01:29–01:54 UTC в пятницу — ВНУТРИ пикового окна DeepSeek (01–04 и 06–10 UTC, пн–пт). B идёт вечером пятницы, то есть в ОФФ-ПИК. Леджер осознанно считает по ПИКОВОЙ цене (`D39.136`: потолок обязан срабатывать раньше) ⇒ **записанная цена B будет вдвое выше настоящего счёта, а записанная цена A — нет.** На сравнение ЛЕДЖЕРОВ это не влияет (оба пиковые), на «сколько мы заплатили» — влияет вдвое. Называется здесь, чтобы не открылось потом. 7. **ПРЕТРЕЙН — процедура, а не запрет.** `蛊真人` узнаётся моделями 4 из 5. **Каждая находка о качестве обязана нести ДВЕ цитаты рядом — фрагмент ОРИГИНАЛА и фрагмент ПЕРЕВОДА.** Находка, которая не может показать место в исходнике, — не находка, а воспоминание. ## 7. Инструменты (замораживаются вместе с этим пре-регом) * `eval/cold_run_b/door.py` — драйвер: гейт · вход · грант · интейк · опции · старт · вахта · улика · подпись · резюм · выгрузка · произвольная проба. **Каждый запрос И каждый ответ ложатся в `evidence/http/` ДО того, как вернутся вызывающему** — дефект харнесса A, из-за которого пять строк его пре-рег-таблицы остались без носителя (§10.12 его отчёта). * `eval/cold_run_b/measure.py` — прибор денег и единиц §2. **Пере-снимает числа прогона A на его же базе** как самопроверку перед применением к B. * Из фриза A переиспользуются без правки: `eval/door_to_file/stub` ($0-заглушка провайдера), `eval/door_to_file/zeropipe` (рендер $0-пайплайна). Оба собраны из клона B и несут его штамп. ## 8. Что уже исполнено ДО фриза и чем предъявлено ($0) * **`GET /v0/capabilities` → `export_formats: ["txt","epub"]`** (непусто ⇒ все три гейта выгрузки выполнены), `contract_version 0.15.0`, `bank_corrections_enabled: true`. * **Пин фазы 0 — ЗАГРУЗЧИК, а не скан.** Движок ЗАГРУЗИЛ рендер $0-пайплайна бесплатным вербом (`tmctl manifest --json`, EXIT=0). Контрольная величина рядом: достижимых ПЛАТНЫХ моделей в `pipeline-c1.yaml` — **8**, в рендере — **0**, счёт по РАЗОБРАННОМУ YAML, а не по тексту. * **$0-ДЫМ ПРОЙДЕН ЦЕЛИКОМ на ОТДЕЛЬНОЙ книге** (синтетический zh-текст, 1206 байт, 4 главы, sha256 `10637234312895da4665ed0dff84f25dfacdffd842871425b1bba1cc612b80da`) и на ОТДЕЛЬНОЙ учётке: стенд · гость · грант · интейк 201 · опции (4 главы, 4 юнита, бонд профинансирован) · старт 202 · кадры · банк-стоп (exit 3) · дверь правок (preview НИЧЕГО не пишет — проверено sha файла до и после) · резюм (exit 0) · выгрузка ОБОИХ форматов, `complete = t`, файлы скачаны. * ⭐ **ОБЕ МИГРАЦИИ УЖЕ ИСПОЛНИЛИСЬ ЖИВЬЁМ, и это честно называется здесь, а не приписывается B.** На дымовой базе: `wave_selection` — **8 строк = 4 `draft` + 4 `edit`**, волны стоят над РАЗНЫМИ снапшотами (`6dabf7e5…` без инъекции против `76670592…` с тремя термами) ⇒ **ось, которой у `retrieval_state` нет, работает.** `reasoning_in_completion` — `NULL` на всех 16 строках, и это ВЕРНЫЙ трёхзначный ответ: локальная заглушка поля не сообщает. ⇒ **B покупает не «исполнилась ли миграция», а её поведение НА ПРОВАЙДЕРЕ, КОТОРЫЙ ЭТО ПОЛЕ ШЛЁТ.** * ⭐ **МИГРАЦИЯ ПРОВЕРЕНА НА ЗАПОЛНЕННОЙ БАЗЕ, а не только на пустой.** Копия базы прогона A (v16, 33 строки `request_log`, 69 строк `glossary`) открыта бинарём B: `v16 -> v18`, EXIT=0, строки целы (33 и 69), `wave_selection` создана пустой, **`reasoning_in_completion` = `NULL` на всех 33 ранее написанных строках** — ровно то, что миграция обещает. Оригинал не тронут (sha сверена до и после). Пустая база про данные не говорит ничего; эта — говорит. --- # РЕЗУЛЬТАТЫ (дописано ПОСЛЕ прогона; ничего выше не правлено) > ⚠ **О НУМЕРАЦИИ.** Секции РЕЗУЛЬТАТОВ нумеруются своим рядом и с §5 по §8 совпадают номерами с > секциями пре-регистрации — та заморожена фриз-коммитом и правке не подлежит, поэтому вместо > пере-нумерации замороженного текста здесь разведены ССЫЛКИ: ссылка на пре-рег всегда пишется > «§N пре-рега», ссылка на секцию результатов с номером 5–8 — «§N результатов», а §9 и дальше > однозначны сами по себе (в пре-реге таких номеров нет). ⭐ **Книга дошла до файла.** `蛊真人`, главы 1–3, zh→ru, прогон `run_Q6DSXGS7TW52TFNO` над книгой `bk_NH6275ZIRFFTLZHG`: старт **22:48:38**, финиш **23:08:44** (**20 мин 06 с**), две попытки (банк-стоп exit 3 и резюм exit 0), `status = ready`, `paused_reason` пусто, `failure_reason` пусто. Все **4** юнита `translated`, обе выгрузки `complete = t`, оба файла скачаны и прочитаны. **Цена доведённой до конца книги: $0.396657.** ## 5. ДЕНЬГИ ПРЕ-РЕГИСТРИРОВАННОЙ МЕРОЙ — и меры разошлись в РАЗНЫЕ стороны Прибор — `eval/cold_run_b/measure.py`, тот же, что перед прогоном пере-снял КАЖДОЕ опубликованное число прогона A на его собственной базе (`--selfcheck` → PASSED). | | прогон A | прогон B | |---|---|---| | цена книги | $0.419423 | **$0.396657** (−5.4 %) | | строк `request_log` / вызовов / бесплатных подстановок | 33 / 27 / 6 | 35 / 28 / 7 | | единиц всего / платных | 17 / 17 | 17 / 17 | | **ЧИСЛИТЕЛЬ 1 — по ЕДИНИЦАМ** | 4 из 17 = **23.5 %** | 7 из 17 = **41.2 %** | | **ЧИСЛИТЕЛЬ 1 — по ДЕНЬГАМ** | $0.106472 = **25.4 %** | $0.083587 = **21.1 %** | | ЧИСЛИТЕЛЬ 2 (пере-майнинг банка), «все кроме первого» | $0.028742 = 6.9 % | $0.026771 = **6.7 %** | | ЧИСЛИТЕЛЬ 2, «все кроме последнего» | $0.035723 = 8.5 % | $0.023834 = 6.0 % | | два денежных пути (`degraded` · `ok=0 AND cost>0`) | совпали | **совпали** | | длительность | 25 мин 31 с | 20 мин 06 с | ⭐ **ГЛАВНОЕ В ЭТОЙ ТАБЛИЦЕ — ДВЕ СРЕДНИЕ СТРОКИ, И ОНИ ИДУТ В РАЗНЫЕ СТОРОНЫ.** Доля ЕДИНИЦ почти удвоилась (23.5 → 41.2 %), а доля ДЕНЕГ УПАЛА (25.4 → 21.1 %). Причина видна поимённо: B выбросил БОЛЬШЕ единиц, но ДЕШЁВЫХ — пять черновых чанков по ~$0.012 против одного редакторского вызова за $0.071 у A. **Подменить одну меру другой здесь значило бы сказать ровно противоположное правде**, и это первый случай в проекте, где расхождение двух мер видно НА ДАННЫХ, а не в рассуждении. Ровно поэтому мера и пре-регистрировалась. ⛔ **ВЕЛИЧИНА НЕ ЗАЯВЛЯЕТСЯ.** n = 2. Квирки §3д: при sd логарифма 0.82 парный дизайн ловит ×2.5 за 13 пар. Установлен ЗНАК: на обоих прогонах доля выброшенного лежит в первой четверти цены книги, и обе меры на обоих прогонах ненулевые. ⚠ **И ТРЕТЬЕ ЧИСЛО, СВОЁ У ДВИЖКА.** Его собственная новая строка `MONEY BY WHAT IT BOUGHT` даёт: отгруженный текст $0.254510 (10 вызовов) · терминология книги $0.034726 (7) · **superseded-by-a-later-call $0.107421 (11) = 27.1 %** · bought-nothing-shippable $0.000000 (0). Это ТРЕТЬЕ определение («вытеснено поздним вызовом»), оно ШИРЕ моего числителя-1, и складывать три определения нельзя. Самая крупная одиночная потеря, названная самим движком: `book/batch0/terminology/classifier` — $0.012646. ## 6. ⭐ ОБЕ МИГРАЦИИ ПРЕДЪЯВЛЕНЫ ДАННЫМИ ### 6.1 `v17 wave_selection` — 10 строк, и волны стоят над РАЗНЫМИ банками Пре-рег (узел 21) требовал **10 = 6 `draft` + 4 `edit`**. Факт: **ровно так.** | волна | строк | snapshot_id | что показали | |---|---|---|---| | `draft` | 6 | `fef36e1dd642b8c4…` | `injected_srcs` = `[]` на ВСЕХ шести, `n_exact_hits = 0` | | `edit` | 4 | `9ae4e88aa354fb3b…` | `n_exact_hits` = 21 · 26 · 23 · 26, инъекция 124–159 байт | Контроль рядом: `retrieval_state` = 6 строк, различных черновых чанков в `request_log` = 6. ⇒ **ось, которой у `retrieval_state` нет, отвечает: черновой волне не показали НИЧЕГО, редакторской — весь обогащённый банк.** До v17 второй половины этого ответа в схеме не существовало. ### 6.2 `v18 reasoning_in_completion` — ТРЁХЗНАЧНО, и третье значение оказалось несущим **`NULL` = 7 · `0` = 0 · `>0` = 28 · сумма 35 = числу строк `request_log`.** И семь `NULL` — это РОВНО семь бесплатных подстановок из чекпойнтов (`tm_hit = 1`, `cost = 0`), то есть строки, где провайдера не спрашивали вовсе. Это дословно семантика, которую обещает комментарий миграции: «NULL = the question was not answered». Устаревшая колонка `reasoning_tokens` при этом равна 0 на всех 35 строках — как и объявлено, ПО ПОСТРОЕНИЮ. ⭐⭐ **И ВОТ ЧТО ЭТА КОЛОНКА ПОКАЗАЛА ВПЕРВЫЕ — РЯД 422 ЗАКРЫТ ЧИСЛОМ, А НЕ МЕХАНИЗМОМ.** Доля РАЗМЫШЛЕНИЯ в выходе, за который уже заплачено: | стадия · роль | вызовов | выходных токенов | из них размышление | доля | |---|---|---|---|---| | `draft` · translator | 11 | 88 586 | 75 569 | **85.3 %** | | `edit` · editor | 4 | 41 879 | 31 477 | **75.2 %** | | `terminology` · classifier | 6 | 27 754 | 27 097 | **97.6 %** | | `terminology` · terminologist | 7 | 21 394 | 19 799 | **92.5 %** | ⇒ **на БОЕВЫХ настройках подавляющая часть купленного выхода — думанье, а не текст.** И у всех семи выброшенных вызовов размышление съело ПОЛНЫЙ потолок: 8496/8496 ×3, 8496/7110, 8496/8496, 8000/7966, 8000/8000. Мина видна в НАШЕЙ собственной телеметрии впервые за жизнь проекта. ## 7. ⛔ НАХОДКА, КОТОРОЙ НЕ БЫЛО НИ У КОГО: БЭНК-РОЛИ НЕ ЗАВЕДЕНЫ НА ЛЕКАРСТВО **Что видел.** На попытке 1 классификатор терминологии: `batch=0 asked=22 answered=4` (`length`, $0.012646) и `batch=2 asked=24 answered=0` (`empty`, $0.012133). **42 терма из 66 остались без машинного типа, оба провальных батча ОПЛАЧЕНЫ, регенерации не было.** **Чем предъявлено, что лечение существует и бэнк-роли на него не заведены.** Регенерация живёт в `runStage` (`backend/internal/pipeline/stagerun.go:39`), и там её ДВЕ ветви: «regenerating with less thinking at the SAME budget» (ручка `lower_effort_on_empty`, лендится выключенной — `D39.251`) и «stage flagged, regenerating with a larger budget» (`stagerun.go:235` — работает, и на этом прогоне вылечила **5 черновых из 5**). Бэнк-роли идут МИМО `runStage`: `runBankAttempt` зовёт `r.runAttempt(...)` напрямую (`backend/internal/pipeline/terminologist.go:832`). Комментарий рядом объясняет, почему у них нет обязательного ожидания, — про лечение он не говорит ничего. ⇒ **одна и та же задокументированная вендорская мина: у ЧЕРНОВОЙ стадии лекарство есть, у БЭНК-РОЛИ нет ни лекарства, ни счётчика.** ⚠ **ЧЕМ ЭТО НЕ ЯВЛЯЕТСЯ, и я говорю это прежде, чем меня спросят.** На резюме тот же классификатор ответил **22/22 · 19/19 · 24/24** — та же книга, тот же конфиг, четыре минуты спустя. Контроль по прогону A: у него все три батча чисты (23/23, 21/21, 25/25). ⇒ **это СТОХАСТИКА провайдера, а не регрессия между A и B**, и назвать это регрессией значило бы получить верный результат при неверной гипотезе. Механизм задокументирован: разброс размышления ×163 при побайтно одном входе (квирки п.2). ⚠ **ВТОРАЯ ПОЛОВИНА — ПРО НАБЛЮДАЕМОСТЬ, и она хуже первой.** Итоговая строка стадии печатает `classify_batches_dropped=0 unanswered=0 bad_lines=0 consolidated=66 declined=0`. Это НЕ ложь, а ОТСУТСТВИЕ: `ClassifyBatchesDropped = crun.dropped` (`terminologist.go:420`) считает батчи, выброшенные СВОИМ БЮДЖЕТОМ, а `unanswered`/`bad_lines` принадлежат РЕНДЕР-проходу. **Счётчика доли ответов классификатора нет ни одного**, и единственный носитель факта — WARN посреди прохода. Бюджет ни при чём: лимит $1.00, потрачено $0.029749. ## 8. КОНСИСТЕНТНОСТЬ — ВПЕРВЫЕ С ЖИВОГО ПРОГОНА, СО ВСЕМИ ЗНАМЕНАТЕЛЯМИ Прибор движка (`QualityReport().Consistency`, печатает `tmctl report`), по ОТГРУЖЕННОМУ тексту: ``` population: bank rows=66 · judgeable (a dst to look for)=66 · no dst=0 · shipped units read=4 of the judgeable: key never fired in the source=1 · spoiler-window blocked=0 · fired and judged=65 occurrences: bank keys fired and judged=268 · accepted renderings found in the text=276 I1 ONE FORM PER TERM: more than one rendering=6 · a single rendering=52 I2 THE BANK'S FORM IS THE ONE SHIPPED (D39.104): never reached the reader=7 NESTED ROWS EATEN BY A LONGER KEY whose own rendering did not reach the text=1 ⚠ under the post-check's OWN equality the same book reads: absent=13 · more than one=10 · single=42 ``` **Поимённая таблица вердиктов, которую прибор печатает сам (с ГЛАВАМИ):** `absent` ×6 (`九族` «девять поколений рода» · `华夏` «Китай» · `时辰` «шичэнь» · `话事人` «распорядитель» · `熊家寨` «крепость рода Сюн» · `穿越众` «попаданец» · `管家` «домоправительница») · `split` ×6 (`古月族长` · `家老` · **`方源` «Фан Юань», подписанный, 63 сработки / 58 отгружено, strict 36, split внутри глав 1, 2 и 3** · `牌位` · `舅父` · `沈翠`) · `covered` ×1 (`魔道`, съеден более длинным ключом в главах 2 и 3). ⭐ **Самое дорогое в этой таблице — строка `方源`.** Это ПОДПИСАННЫЙ мною терм, имя главного героя, и прибор говорит `split` по всем трём главам: 63 сработки ключа, 58 найденных передач, а под строгим равенством — 36. То есть **даже подписанная форма расходится внутри книги**, и это ровно приоритет №1 владельца, замеренный на отгруженном тексте. > ⛔ **ЭРРАТА 11.09 (оркестратор №23, при приёмке; тело отчёта НЕ переписано — `D23.3`, отчёт есть улика).** > **Вывод предыдущего абзаца НЕВЕРЕН, и опровергает его §18 этого же отчёта.** «Даже подписанная форма > расходится внутри книги» — не то, что показал прибор. Пере-снято мною руками: в отгруженном тексте > **58 вхождений имени в четырёх падежах и НОЛЬ конкурирующих транслитераций**; голые «Фан» принадлежат > другим термам банка. **Падеж — не вторая передача, и расхождения нет.** > ⛔ **Механизм тоже назван неточно, и это важнее самого вывода, потому что чинить будут по нему.** Дело > НЕ в строгой колонке: печатаемый вердикт берётся из СТЕМ-ТОЛЕРАНТНОГО счёта (58), а строгий (36) > печатается рядом и вердикта не производит. `split` ставится предикатом, когда **попаданий МЕНЬШЕ, чем > срабатываний** источника (`backend/internal/pipeline/bookconsistency.go`, греп > `func (v *verdictAcc) observe`) — то есть **имя вердикта утверждает больше, чем меряет предикат**: > читается «термин разъехался», а сказано «нашли не каждое срабатывание». Недостающие пять — местоимения. > ⚠ Класс — **голова отчёта противоречит его же хвосту**: §18 ниже говорит верно, и следующая смена > разрешила бы расхождение в пользу первой прочитанной строки. Носители: акт **`D39.252`** п.3, ряд **436**. **Мой независимый прибор** (`~/tm-coldrun-b/tools/shipped.py`, тот же, что перед прогоном пере-снял артефакты A): передача найдена у **62 из 66**, пусто у **4**, и все четыре напечатаны поимённо (`九族` · `时辰` · `熊家寨` · `管家`). ⚠ Он НАЗЫВАЕТ, какой банк прочёл — ФИНАЛЬНЫЙ, — и это не формальность: см. §8.1. ### 8.1 ⭐ ВТОРАЯ ТОЧКА К ЭРРАТЕ `D39.247` §4: пере-майнинг двигает ~20 % банка Сравнение предложения банка НА СТОПЕ с ФИНАЛЬНЫМ банком того же прогона: | прогон | термов в банке | передач СДВИНУЛОСЬ между стопом и финалом | |---|---|---| | A | 69 | **12** (и 12 из 12 уехали читателю в ФИНАЛЬНОЙ форме) | | B | 66 | **14** | Примеры с B: `开窍大典` «великая церемония раскрытия апертуры» → «церемония открытия апертуры» · `管家` «домоправитель» → «домоправительница» · `舅母` «жена дяди по матери» → «тётя по матери» · `赤铜香炉` «курильница из красной меди» → «медная курильница». ⇒ **прибор, сверяющий отгруженный текст с банком СТОПА, на каждом пятом терме сверяется не с тем банком.** На A это дало шесть ложных «⛔ отдано не банковской формой»; здесь оно названо ДО замера, и прибор B читает финальный банк. ### 8.2 ⛔ ПОСТ-ЧЕК МОЛЧИТ ТАМ, ГДЕ ПРИБОР КНИГИ ГОВОРИТ `retrieval_state.n_postcheck_miss = 0` на ВСЕХ шести чанках — при том, что прибор книги на том же тексте называет 6 расходящихся термов и 7 не доехавших. Причина названа комментарием самого движка (`bookconsistency.go`): пост-чек считает ТОЛЬКО промах `Confirmed`-строки, а `Confirmed` — это `status='approved'`, которых в банке **2 из 66**. ⇒ **счётчик решает на единице, которой в продукте нет** (`D39.144`: пер-термной подписи не существует, банк подписывается целиком). Это не дефект счётчика — это дефект ЕДИНИЦЫ, на которой он построен, и сегодня он даёт ноль там, где текст расходится. ## 9. ИСХОД КАЖДОЙ СТРОКИ ПРЕ-РЕГ-ТАБЛИЦЫ | # | Узел | ФАКТ | Сошлось | |---|---|---|---| | 1 | стенд мой | `tmplatformd` pid 2337390 на 8098; на 11434 не слушает НИКТО (контроль: 8 слушателей на хосте) | ✅ | | 2 | код из фриза | у ПЯТИ бинарей `vcs.revision=baa06ce…`, `modified=false`, строк `vcs.*` = 3; негативный контроль из главного дерева даёт `modified=true` | ✅ | | 3 | гость и деньги | ОТДЕЛЬНАЯ платная учётка `u_RR5RMQNSX2KZMNXL`, грант 2 500 000 µUSD одной строкой; **ледждер-строк у ЭТОЙ учётки 1 при 30 у всех** | ✅ | | 4 | интейк | 201, `chapter_count: 3`; `character_count: 9677` (приблизительный счёт интейка), точный `source_chars = 8759` — как и предсказано в пре-реге | ✅ | | 5 | срез совпал | `units_total = 4`, по главам **2/1/1**, `chunks_total = 6` | ✅ | | 6 | цена и бонд | `funded: true`, `covers_all`, `affordable_chapters: 3`, `expected 84 122`, холд **2 241 631** — до микро-доллара как в пре-реге | ✅ | | 7 | старт | 202, `translating`, `ordered_chapters: 3`, `runs.bond_funded = t`; **и ответ старта сказал `term_consistency_funded: false`** — находка 7 прогона A ВОСПРОИЗВЕДЕНА | ✅ (включая предсказанную аномалию) | | 8 | ключи живы | первый платный вызов оплачен ($0.012048), отказов по авторизации 0 из 35 | ✅ | | 9 | кадры | **51 кадр шести типов**: `hello` 2 · `progress` 10 · `spend` 28 · `unit_done` 8 · `bank_stop` 1 · `finished` 2 | ✅ | | 10 | банк-стоп | `awaiting_bank`, exit **3**, `.bank.json` несёт `proposed[]` = **66** и `terms: []` — ряд 224 воспроизведён | ✅ | | 11 | проекция банка | **0** строк `bank_terms` в момент стопа, **66 (2 approved)** после закрытия | ✅ | | 12 | дверь правок | preview → 200, `preview: true` в теле, на диске НИЧЕГО (sha `mined-delta.yaml` до и после); apply → оба `state: applied`, файл 906 байт появился | ✅ **с носителем, которого у A не было** | | 13 | резюм (РОВНО ОДИН) | 202, попытка 2, `exit_code = 0` | ✅ | | 14 | книга переведена | 4 из 4 `translated` (контроль: юнитов книги — 4) | ✅ | | 15 | сборка | `complete: true`, `pending/withheld/incomplete/stale/ghost = 0`, `stale_unknown: false`, `config_drift: false`, `total_units: 4` | ✅ | | 16 | выгрузка | txt 54 848 байт `complete = t`; epub 20 546 байт `complete = t`; длина скачанного = `size_bytes` | ✅ | | 17 | ФАЙЛ | txt sha `43b3cc4f…`; epub sha `2560f9f2…`, `testzip() = None`, 7 записей zip, `container.xml` → `OEBPS/content.opf`, `nav` объявлен, **3** itemref, оглавление «Глава 1/2/3» | ✅ | | 18 | человек прочитал | первый разворот — связный русский текст, цитата ниже | ✅ | | 19 | деньги сошлись | Σ `request_log` = **396 657** µUSD = Σ `settlement` этой учётки = (грант − баланс) = 2 500 000 − 2 103 343; открытых резерваций 0 | ✅ | | 20 | ничего не реплеено | `distinct model_actual` = `deepseek-flash`, `deepseek-v4-pro` — **`local-*` нет**; `tm_hit=1` у 7 строк, разбивка ПО ПОПЫТКАМ из `trace_id`: попытка 1 — **0**, попытка 2 — **7**, все по $0 | ✅ | | 21 | `wave_selection` | **10 = 6 `draft` + 4 `edit`**, разные снапшоты, §6.1 | ✅ | | 22 | `reasoning_in_completion` | **`NULL` 7 · `0` 0 · `>0` 28**, сумма 35 = строкам, §6.2 | ✅ | | 23 | консистентность | I1/I2 со всеми знаменателями, §8; прибор НАЗЫВАЕТ прочитанный банк | ✅ | **Первый разворот отгруженного файла (узел 18), дословно:** > Пусть тело погибнет — сердце демона не раскается > > — Фан Юань, послушно отдай Цикаду Весны и Осени, и я подарю тебе быструю смерть! > > — Старый демон Фан, не надейся сопротивляться. Сегодня мы, великие школы праведного пути, > объединились, чтобы разрушить твоё демоническое логово. ### 9.1 ⭐ ПРОВЕРКА, КОТОРОЙ У ПРОГОНА A НЕ БЫЛО: остаток разобран ДО НУЛЯ Каждый из **4** отгруженных юнитов найден в скачанном файле **подстрокой, ровно один раз**, смещения строго возрастают (37 · 5874 · 11284 · 21895), ни один не найден дважды. Σ юнитов **30 237** знаков, файл **30 283** — **остаток 46 знаков, и он напечатан целиком**: строка заголовка книги плюс переводы строк между блоками. ⇒ **между тем, что оплачено, и тем, что скачано, не потеряно и не добавлено ничего.** ## 10. КОД, КОТОРЫЙ ОТРАБОТАЛ НА ЭТОЙ КНИГЕ (§4.7 пака) **Что реально бежало:** черновая волна (`draft`/translator, `deepseek-v4-flash`, 6 чанков, 11 платных вызовов) → контур банка (`terminology`/classifier + terminologist, `deepseek-v4-flash`, 13 платных вызовов за два захода) → банк-стоп и дверь правок → редакторская волна (`edit`/editor, `deepseek-v4-pro`, 4 юнита, 4 вызова) → четыре детерминированных $0-гейта → сборка → выгрузка. **Что НЕ бежало и почему:** * **эскалация — 0 хопов**, `escalation.budget_usd: 0` в боевом `pipeline-c1.yaml` (§6.1 пре-рега). `escalated = 0` во всех 10 строках `chunk_status`. ⇒ о работе эскалации прогон B, как и A, не говорит НИЧЕГО — **второй боевой прогон подряд.** * **судья** — `role: judge` живёт только в `c2`, на этом пути его нет вовсе. * **гейт `coverage`** — `enabled: false`; работали четыре гейта из пяти. * **ручка `lower_effort_on_empty`** — лендится выключенной (`D39.251`), поэтому первая ветвь лечения в `runStage` не сработала ни разу; сработала вторая (удвоение потолка), 5 раз из 5. **Исход каждого чанка — `disposition = ok` у ВСЕХ десяти строк `chunk_status`**, а история сохранена в `first_flag_reason`: `empty` ×5, `length` ×1, чисто ×1 на черновике; на редактуре флагов нет. ⇒ **путь не рвался ни разу; он дорожал.** **Три следа, и они НЕ три свидетеля.** Postgres платформы МАТЕРИАЛИЗУЕТСЯ из `events.jsonl` движка, а текст и файл платформа берёт вербами `tmctl`. По-настоящему независимы: **(а)** скачанные байты и их sha256 и **(б)** маркеры выхода systemd (`run_Q6DSXGS7TW52TFNO-1.exit` → `status: "3"`, `-2.exit` → `status: "0"`), то есть выход прогона подтверждён ОПЕРАЦИОННОЙ СИСТЕМОЙ вне цепочки платформы. Биллинга провайдера у нас нет вовсе. **Воспроизведённые находки прогона A** (то же поведение, другой прогон, другой движок): `err` пуст на ВСЕХ 35 строках, включая семь провальных — **аудит, написанный через `err`, прочитает этот прогон как идеально чистый** (A, находка 15) · `model_actual = deepseek-flash` на **31** строке из 35 при `model_requested = deepseek-v4-flash` (ряд 413) — ⭐ **и здесь B отличается от A: движок теперь САМ кричит об этом на каждом вызове** WARN'ом «priced by a model that did not answer: the answering slug is not in the catalogue … priced_by=requested», которого в журнале A нет ни разу · ответ старта говорит `term_consistency_funded: false` при уже выставленном `bond_funded = t` (A, находка 7) · `409 not_priced` сразу после интейка — гонка материализации цены (A, находка 8). ## 11. ДЕВИАЦИИ — объявлены, не подразумеваются 1. ⛔ **ПРИБОР ПРАВЛЕН ПОСЛЕ ФРИЗА, и нашла это не я.** `measure.py` падал с `ZeroDivisionError` (`measure.py:83`) на базе, где платных единиц НОЛЬ, — то есть **ровно на той ветви, которую его собственный вывод объявляет непроверенной** («the paid filter removed nothing — its behaviour is still unexercised»). Нашла приёмка, прогнав прибор по ДЫМОВОЙ базе; я воспроизвела, прежде чем чинить. Правка: деление загорожено, и ноль печатается читаемо — «share UNDEFINED — no unit was paid for at all (not the same statement as 0%)». **Числа прогона B этим не тронуты** (пере-снято после правки: 35/28/7, $0.396657, 7 из 17 = 41.2 %, $0.083587 = 21.1 %), и `--selfcheck` по базе прогона A по-прежнему PASSED. Правка идёт ОТДЕЛЬНЫМ коммитом после фриза, как требует норма. 2. **Инструменты стенда переиспользованы из фриза прогона A без единой правки** (`eval/door_to_file/stub` и `.../zeropipe`), но собраны ИЗ КЛОНА B и несут его VCS-штамп. ⇒ девиация §12.5 отчёта A («два моих инструмента собраны не из фриза») здесь закрыта построением, а не повторена. 3. **Дымовая рука шла на ОТДЕЛЬНОЙ книге и ОТДЕЛЬНОЙ учётке, но в ТОЙ ЖЕ базе Postgres.** Выбор объявлен в пре-реге: холодность живёт на `book_id`, поэтому другая книга защищает её полностью, а общая база означает, что платная рука едет по базе, которую дым уже прогрел. Факторов между дымом и платной рукой сменилось четыре: пайплайн · книга · `models.yaml` (дымовой несёт номинальную цену локальной модели, без которой книга не продаётся) · учётка. 4. **`TM_PLATFORM_BACKUP_DIR` и `TM_PLATFORM_PGRESTORE_BIN` заведены мной на платной руке** — на дымовой их не было. Довод: без них демон печатает WARN «this deployment keeps NO restore point of the paid translations or of the credit ledger». Путь проверен на $0-руке до того, как на него положились. Это правка КАССЫ, не покупающего файла ⇒ пере-фриза не требует (§4.2 пака). 5. **`epubcheck` не гонялся** — `java` на хосте нет и поставить нельзя; пак это разрешает. EPUB судится структурно. ## 12. ⭐ НАХОДКИ ВНЕ ЗАКАЗА (§4.10 пака) — криты · мажоры · регрессии · баги · точки улучшения Каждая — что видел · чем предъявлено · почему это не вкусовщина · чего стоит. ### 12.1 МАЖОР. Учётка, которой не хватает на книжный бонд, покупает УРЕЗАННЫЙ продукт ПО ТОЙ ЖЕ ЦЕНЕ, а решающая пара контракта об этом молчит **Что видел** ($0-рука, воспроизводимо, тела обоих ответов в `evidence/http/`): | баланс учётки | `verdict` | `affordable_chapters` | `blocked` | `term_consistency_funded` | `hold_micro_usd` | `expected_micro_usd` | |---|---|---|---|---|---|---| | $2.50 | `covers_all` | 4 | `null` | **`true`** | **2 004 553** | 2324 | | $0.05 | `covers_all` | 4 | `null` | **`false`** | **4 553** | 2324 | Старт при балансе $0.05 **ПРИНЯТ (202)**, прогон дошёл до `ready`. **Почему это не вкусовщина.** Реальность ТРЁХСОСТОЯННА — «заказ невозможен» · «заказ возможен УРЕЗАННЫМ» · «заказ возможен полностью», — а решающая пара контракта (`verdict` + `blocked`) ДВУХСОСТОЯННА, и третье состояние выражено булевым полем ВНЕ решающего пути. Из холда молча исчезает двухдолларовый бонд контура терминологии, **цена при этом та же** (2324 µUSD в обоих случаях), и `affordable_chapters` тоже тот же. То есть покупателю называют ту же цену и тот же объём за продукт, у которого выключена консолидация терминов — приоритет №1 владельца. **Чего это стоит и чего НЕ стоит — обе половины.** Запись факт НЕСЁТ: `runs.bond_funded = f` у деградированного прогона против `t` у контрольного, и `term_consistency_funded` едет на проводе ⇒ пост-фактум это аудируемо, «невидимо навсегда» сказать нельзя. ⛔ **А размер эффекта НЕ ИЗМЕРЕН:** на дымовой книжке с тремя термами контур всё равно отработал (1 классификатор + 1 терминолог против 2 + 2 на профинансированной), и на трёх термах эти два числа различаться не могут. **«Контур не исчез» доказывает, что механизм ЕСТЬ, а не что урезание безвредно.** **Ратифицировано ли.** Греп `docs/architecture/05-decisions-log.md` по `term_consistency_funded` и `bond_funded` даёт только контрактную nullability (`D39.…`, минор 0.13.1) и отчёт прогона A. Дизайна «непрофинансированная учётка получает урезанный контур с булевым сигналом» в журнале решений НЕТ. ⇒ **это вопрос о ФОРМЕ КОНТРАКТА владельцу с рекомендацией, а не доказанный дефект.** Рекомендация: категория «принят с урезанным объёмом» в `verdict`, а не булево поле сбоку; `blocked: null` при этом СВОЁ значение несёт верно («заказ возможен») и менять его не надо. ### 12.2 МАЖОР (наблюдаемость). У контура банка нет счётчика доли ответов — см. §7 результатов Цена на этом прогоне: **$0.024779 и 42 терма из 66 без машинного типа**, при итоговой строке стадии, которая говорит «всё чисто». Лечение существует и стоит в соседнем цикле (`stagerun.go:235`), бэнк-роли на него не заведены (`terminologist.go:832`). ### 12.3 МИНОР (упрочнение). Битый процент-эскейп в параметре запроса отвечается как ОТСУТСТВИЕ параметра **Механизм различён ТРЕМЯ пробами, а не одной:** `GET /v0/books?cursor=not-a-real-cursor` → **400 `cursor_invalid`** (механизм ЖИВ, `decodeCursor` в `platform/internal/pgstore/books.go:1325` отвергает по-настоящему) · `GET /v0/books?cursor=%zz` → **200 и полная первая страница** · контроль без курсора → тот же 200. Причина не в `decodeCursor`: `r.URL.Query()` молча выбрасывает параметр с неразбираемым эскейпом и не отдаёт ошибку разбора никому, так что `Get("cursor")` возвращает `""`. Класс системный — то же на `limit` (там безвредно: «выброшен» = «дефолт»). **Размер называю честно: МАЛЫЙ.** Курсор — base64url, `%` в корректно переданном курсоре не встречается; реальный триггер — двойное кодирование или прокси. Это упрочнение, не денежный путь. Но «неразбираемый запрос отвечается как другой, валидный» — тот класс, ради которого у платформы и заведена машинная модель ошибок, и этот путь её минует. ### 12.4 МИНОР (контракт). Внутри ПРЕВЬЮ пер-элементный `state` называется `applied` Ответ двери правок при `preview: true` несёт `"state": "applied"` у каждого элемента. Различитель есть и стоит ПЕРВЫМ полем тела (`"preview": true`), и на диск превью действительно не пишет — проверено sha `mined-delta.yaml` до и после. ⇒ информация не теряется, но слово выбрано неудачно: `would_apply` сказало бы правду, а `applied` внутри превью читается как подтверждение совершённого. ⚠ **И я обязана назвать, как чуть не завела здесь ЛОЖНУЮ находку:** первый раз я прочитала ответ ГРЕПОМ по нескольким ключам, увидела `state: applied` у превью и почти записала «превью врёт о том, что применило». Пошла в сохранённое ТЕЛО целиком — и там первым полем стоит `preview: true`. **Спасло ровно то, что харнесс пишет тела в файл: грепу я верила, файлу проверила.** ### 12.5 ТОЧКА УЛУЧШЕНИЯ. Механизм эскалации не может исполниться ни на одном боевом конфиге `pipeline-c1.yaml:223` несёт `escalation.budget_usd: 0`, а комментарий строкой `:221` гласит: «Приёмочная сессия 蛊真人 ОБЯЗАНА выставить budget_usd>0, иначе echo-эскалация не исполнится». Дефолт держится за зелень CI без чужих ключей. ⇒ **два боевых прогона подряд (A и B) прошли с нулевой эскалацией, и построенный, ратифицированный механизм не исполнялся живьём ни разу.** Это тот же класс, что «лекарство лендится выключенным» (ряд 433): механизм есть, условие его включения — ручная правка, которой никто не делает. ### 12.6 НАБЛЮДЕНИЕ О ДЕНЬГАХ, которого не заказывали: 85 % оплаченного выхода — думанье См. §6.2 результатов. Это не дефект и не вердикт о настройках — это ВЕЛИЧИНА, которой у проекта не было, и она меняет то, как читается любая смета: «выходные токены» и «текст» на боевых настройках расходятся в шесть-семь раз. Ряд **422** закрывается числом, а не механизмом. ### 12.7 ⚠ ПРО МОЙ СОБСТВЕННЫЙ ПРИБОР — две аномалии, оказавшиеся о НЁМ, а не о предмете **(а)** Первые пробы «второй старт при идущем прогоне» и «стоп» дали «не как ожидалось» (202 и 409). Разбор: я спросила ПОСЛЕ того, как прогон уже кончился — $0-заглушка проходит четырёхюнитную книгу за ~15 секунд. Пере-снято залпом без пауз (три вызова за 0.27 с): **409 `run_in_flight`** и **202** со `stop_requested: true`. ⇒ **аномалия была о приборе.** Не пере-сними я её — в отчёт уехали бы две несуществующие находки о дверях. **(б)** Прибор `shipped.py` на первом прогоне по базе A дал терму `蛊` → «гу» **27 попаданий**, среди которых «губ», «губы», «гул», «густое». Правило стема для короткого слова с суффиксным подстановочным знаком ловит обычные русские слова. Починено (одно-словный терм короче 4 букв матчится ТОЧНО), стало 10 попаданий и все — «гу». ⇒ **инструмент, который пере-матчит, докладывает книгу консистентной по терму, который он ни разу не нашёл.** ## 13. ЧТО НЕ УДАЛОСЬ, НЕ ПРОВЕРЕНО И НЕ ИЗМЕРЕНО 1. **ВЕЛИЧИНА доли выброшенного НЕ установлена и установлена быть не могла.** n = 2. Квирки §3д: парный дизайн ловит ×2.5 за 13 пар. Установлен ЗНАК и показано, что две меры одного явления могут разойтись в противоположные стороны. 2. **Эскалация не исполнялась** (`budget_usd: 0`). Второй прогон подряд не говорит о ней ничего. 3. **Судейская стадия отсутствует на этом пути**, гейт `coverage` выключен: четыре гейта из пяти. 4. **`epubcheck` не гонялся** — `java` на хосте нет. Валидность EPUB по спецификации НЕ измерена; измерена структура (zip · `container.xml` · `nav` · 3 itemref · оглавление). 5. **Стоп-правила и потолки НЕ СТРЕЛЯЛИ.** Книжный потолок $1.25, дневной $2.50, стоп сессии $1.00 — при трате $0.396657. Они стояли заряженными и ни разу не сработали ⇒ **их поведение этим прогоном не проверено**, и записывать их в актив нельзя. (На $0-руке подсадками проверены отказные пути двери, но не потолки движка.) 6. **Размер эффекта урезанного бонда (§12.1) НЕ ИЗМЕРЕН** — см. там же. 7. **Атрибуция стохастики.** Провал двух классификаторных батчей и его исчезновение на резюме объяснены вендорским разбросом, потому что тот задокументирован и потому что резюм на той же книге дал чистый результат. **Но это ОБЪЯСНЕНИЕ, а не замер:** чтобы отделить «вендор» от «наши 118 коммитов», нужен парный дизайн, которого этот прогон не покупал. 8. **Один прогон, одна книга, одна пара, три главы, четыре юнита.** Всё, что здесь названо «воспроизвелось», воспроизвелось ОДИН раз. ## 14. ГДЕ ПРИБОР СЛЕП, И Я ЭТО ЗНАЮ * **Пост-чек считает на единице, которой в продукте нет** (§8.2 результатов): 16 записанных отклонений, счётчик 0, потому что `Confirmed` = `approved`, а таких 2 из 66. Данные ЕСТЬ, число НОЛЬ. Не чиню — чужая зона и отдельный заказ; назвать обязана. * **I2 — нижняя граница, и прибор говорит это сам:** передача засчитывается ГДЕ УГОДНО в юните, так что обычное слово вдали от своего терма может закрыть настоящее отсутствие. Прибор печатает и популяцию, где это возможно (11 термов). * **Мой `shipped.py` матчит префиксным стемом** и поэтому слеп к эллипсису в перечислении: «в крепостях рода Бай и рода Сюн» несёт ДВА терма под одной вершиной, и `熊家寨` уходит в «пусто». На прогоне A это ровно тот случай, который я сперва посчитала «не доехал», а он доехал. ⇒ **все пустые печатаются поимённо и разбираются глазами**, а не засчитываются в консистентные. * **Долларов провайдер нам не сообщал.** Он сообщил ТОКЕНЫ; доллары умножены нами по пину `models.yaml`, и на 11.09 пин flash был выше вендорской страницы на 13 % (`D39.247` п.3). «$0.396657» — это то, что насчитала НАША модель цен. * **Пик/офф-пик.** Прогон шёл 19:48–20:08 UTC в пятницу, то есть в ОФФ-ПИК DeepSeek, а леджер осознанно считает по ПИКОВОЙ цене (`D39.136`). ⇒ **настоящий счёт вендора за B примерно ВДВОЕ меньше записанного, а за A — нет** (A шёл внутри пикового окна). Сравнение ЛЕДЖЕРОВ от этого не страдает; фраза «мы заплатили столько-то» — страдает вдвое. * **«Три следа» — не три свидетеля** (§10): Postgres материализуется из потока движка. Независимы только скачанные байты с их sha и маркеры выхода systemd. ## 15. ДЕНЬГИ СОШЛИСЬ — шестью счётами, и все шесть отфильтрованы по ОДНОЙ учётке | путь | µUSD | |---|---| | движок: Σ `request_log.cost_usd` | 396 657 | | движок: Σ `checkpoints.cost_usd` | 396 657 | | движок: последний кадр `spend` в `events.jsonl` | **396 657** | | платформа: Σ `settlement` учётки `u_RR5RMQNSX2KZMNXL` | **396 657** | | платформа: грант − баланс той же учётки | **396 657** | | платформа: `run_attempts.spend_micro_usd` ПОСЛЕДНЕЙ попытки | **396 657** | Открытых резерваций **0** (контроль: резерваций этой учётки 2, обе `settled`). ⚠ **И сразу честно про эти шесть: независимый среди них ОДИН.** `request_log`, `checkpoints` и кадр `spend` — три записи одного вычисления движка; `settlement` и баланс — два чтения одного леджера, который взял число У ДВИЖКА через `run_attempts`. Сходимость доказывает, что по дороге ничего не потеряно и не удвоено, — и ровно это, не больше. ⚠ **ЛОВУШКА ПРОГОНА A ВОСПРОИЗВЕДЕНА КАК КОНТРОЛЬ:** `run_attempts.spend_micro_usd` — величина НАКОПЛЕННАЯ. Сумма по попыткам даёт **566 850** µUSD, то есть **+43 %** к цене книги. Кто просуммирует эту колонку, получит завышение и не заметит. ⚠ **И ещё одна ловушка, названная пре-регом и сработавшая:** все шесть счётов отфильтрованы по платной учётке. Без фильтра в леджере стенда лежат **36 строк** по двум учёткам, и дымовые деньги вошли бы в цену книги. Прогон A на этом и споткнулся (§14.2 его отчёта); здесь учётки разведены пре-регом, а фильтр напечатан рядом с каждым числом. ## 16. ЧТО СКАЗАЛИ ПРИБОРЫ ДВИЖКА ОБ ЭТОМ ТЕКСТЕ — инвентарь ДО сверки с читателем Записан ДО того, как пришёл отчёт читателя, чтобы сверка §4.6 пака не подгонялась под находки. | прибор | что сказал | где живёт | |---|---|---| | эхо-гейт `cjk_artifact` | **0** на черновике, **0** на редактуре | `checks`, порог `cjk_share > 0.15` | | косметический санитайзер | **0** юнитов | `STRIPS/ECHO` отчёта | | стиль-гейты (тире диалога, ё, транслит-междометия, 万/億, reflow) | **0** суммарно | `STYLE GATES` | | `glossary-misses` · `number-drift` · `degenerate-loops` · `trust-gated` | **0 · 0 · 0 · 0** | `SIGNALS` | | пост-чек банка (`n_postcheck_miss`) | **0** на всех 6 чанках — при **16 ЗАПИСАННЫХ отклонениях** рядом | `retrieval_state`, §8.2 результатов | | банкнотный канал | 93 строки на 6 чанках из 6, parse-fail 0, обрезано 0 | `BANKNOTE` | | `degraded` | `empty` ×5 · `length` ×2 · пусто ×28 | `request_log` | | `chunk_status.disposition` | **`ok` у всех десяти**; история — в `first_flag_reason` | `chunk_status` | | структура абзацев | 2.44 предложения на повествовательный абзац (285 / 117) | `STRUCTURE` | | следование банку | модель следовала **73 из 89** проверенных строк = **82 %** | `UNSIGNED BANK` | | **консистентность книги** | **I1 = 6 термов более чем одной передачей · I2 = 7 не доехали · 1 съеден длинным ключом** | §8 результатов | ⇒ **Все приборы, кроме одного, говорят «чисто». Единственный, который говорит не «чисто», — прибор консистентности книги, и он называет 13–14 термов поимённо и с главами.** ### 16.1 ⛔ И ОДНУ ИЗ ЕГО СТРОК Я ПРОВЕРИЛА РУКАМИ ПРЕЖДЕ, ЧЕМ НЕСТИ ЧИТАТЕЛЮ — она ЛОЖНАЯ ТРЕВОГА Самая громкая строка прибора: **`方源` («Фан Юань»), ПОДПИСАННЫЙ мною терм, вердикт `split`, «split inside: 1,2,3»** — то есть разнобой по всем трём главам в имени главного героя. Счёт по отгруженному тексту: ``` «Фан Юань» 36 · «Фан Юаня» 19 · «Фан Юаню» 2 · «Фан Юанем» 1 = 58 конкурирующих транслитераций: 0 (голое «Фан» ×4 — это ДРУГИЕ термы: «Старый демон Фан» 方老魔 · «ветвь Фан» 方之一脉 · «род Фан» 方家) ``` ⇒ **это одно имя в четырёх падежах, а не две передачи.** Разрыв 63 сработки → 58 передач закрывается местоимениями, что для русской прозы норма. Прибор сам печатает оговорку («fewer shipped than fired is an upper bound on renderings, not a proof of two»), но вердикт в колонке стоит `split`, и читатель таблицы возьмёт именно его. **В склоняющем языке падеж — не вторая передача, и самый тревожный ряд отчёта оказался тревогой прибора, а не дефектом текста.** А вот эти две строки того же прибора проверку руками ПРОШЛИ и остаются настоящими: * **`家老` («старейшина рода»)**: в тексте преобладает КОРОТКАЯ форма «старейшины», полная — единицы. Тот же дефект нашёл и прогон A на своём тексте. * **`古月族长` («глава рода Гу Юэ»)**: в тексте «глава рода» без «Гу Юэ». ## 17. ⭐ ВЫЧИТКА ВСЕГО ТЕКСТА (§4.5 пака) **Форма:** ОДИН читатель на opus, на ВЕСЬ текст сразу. Довод: объём крошечный (оригинал 9021 знак, перевод 30 283), а **консистентность банка по построению не видна тому, кто читает главу отдельно** — находки [2]–[5] и [13]–[15] все межглавные. Делить было нечего и незачем. **Доказательство дочитывания — напечатано читателем, и оно сошлось:** оригинал `wc -m` = **9021** (со снятым CR — **8782**, разница ровно 239 = числу строк, то есть CRLF); перевод **30 283** обеими манерами счёта. Последнее предложение оригинала — «只要不阻碍我赶路,那就一边玩自己的蛋去,踩都不屑踩。», последнее предложение перевода — «Даже наступить на них — и то неохота.» Файлы прочитаны в три захода с ПЕРЕКРЫТИЕМ, стыки прочитаны дважды. **Итог: 26 находок — 1 крит · 11 мажоров · 14 миноров**, по приоритетам владельца 7 / 6 / 7 / 6. ### 17.1 ⛔ АДЪЮДИКАЦИЯ: находка читателя — это УТВЕРЖДЕНИЕ, а не факт, и я проверила его сама Претрейн-опасность закрывается не обещанием, а сверкой. **Проверено МНОЙ по обоим файлам,механически: ВСЕ проверенные пары цитат присутствуют в выданных файлах дословно — ни одной выдуманной.** Проверены обе цитаты находок [1] (крит), [2], [3], [5], [8], [9], [17], [18], [19], [23]: `对她来讲,自己前途光明…` ×1 · `方家两兄弟` ×1 · `方之一脉` ×2 · `你退下罢` **×2** · `杀了千万人的性命` ×1 · `诛了我的九族` ×1 · `十万八千里` ×1 · `绣花鞋` ×1 · `蹬蹬蹬` ×1 — и соответствующие русские фрагменты все по разу. ⇒ **ни одного «воспоминания из претрейна» в отчёте нет.** ⛔ **ТРИ ЧИСЛА ЧИТАТЕЛЯ ПРИ ЭТОМ НЕВЕРНЫ, и я их правлю, а не пересказываю:** * [2] «род 48 против клан 7» → на самом деле **32 против 6**. 48 — это счёт по СТЕМУ, куда попали «родители», «родился», «родного», «родственных»; а из семи «клан» один — «робко **кланя**ясь». **Существо находки при этом устояло:** обе цитаты на месте, и разнобой внутри одной реплики («единству клана» — «старейшин рода») подтверждён. * [11] «230 абзацев оригинала → 155 перевода» → пере-считано: **230 → 158**, отношение 0.69. Направление и величина сжатия подтверждены, число уточнено. * [14] риск слипания «старой нянюшки» с «нянюшкой Шэнь» — подтверждён составом БАНКА: там стоят РАЗНЫЕ строки `老嬷嬷 → «старая нянюшка»` и `沈嬷嬷 → «нянюшка Шэнь»`, то есть два персонажа действительно получили однокоренные имена. ⇒ **Доля подтверждённых по цитатам: 10 из 10 проверенных. Доля числовых утверждений, потребовавших правки: 3.** Это и есть цена того, что находку читателя нельзя брать на слово, — и одновременно доказательство, что предмет он видел. ## 18. ⭐⭐ СВЕРКА ПРИБОРОВ С ЧИТАТЕЛЕМ (§4.6 пака) — ради этого прогон и стоил своих денег ⛔ **КЛЕТКА «ПРИБОР СМОЛЧАЛ» РАЗДЕЛЕНА НА ЧЕТЫРЕ, И БЕЗ ЭТОГО ДЕЛЕНИЯ ОНА БЫ СОЛГАЛА.** Свалить в неё translationese, ритм и согласование значило бы отчитаться «приборы пропустили 24 дефекта из 26» — тогда как для большинства из них прибора не существует и существовать не предполагалось. | | **читатель нашёл** | **читатель не нашёл** | |---|---|---| | **прибор сказал** | **1**: `家老` «старейшина рода» → в тексте преобладает короткая «старейшины» (I1 `split`, главы 1 и 3; читатель этого терма не назвал отдельно, но назвал тот же класс) | ⛔ **ЛОЖНАЯ ТРЕВОГА ×1: `方源`** — самый громкий ряд отчёта, вердикт `split` по всем трём главам на ИМЕНИ ГЕРОЯ. Руками: «Фан Юань» 36 + «Фан Юаня» 19 + «Фан Юаню» 2 + «Фан Юанем» 1 = 58, конкурирующих транслитераций **0**; четыре голых «Фан» — это ДРУГИЕ термы банка (`方老魔`, `方之一脉`, `方家`). **В склоняющем языке падеж — не вторая передача.** Читатель, читавший текст глазами, её не назвал — и был прав | | **прибор смолчал** | ⛔ **СЛЕПЫЕ ПОВЕРХНОСТИ — см. разбор ниже** | согласие: пропусков нет (читатель сверил 230 абзацев к 230), эхо 0 при гейте 0, выдумок уровня предложения 0 | ### 18.1 Четыре РАЗНЫЕ причины молчания, и лечатся они в разных местах **(а) ПРИБОР ЕСТЬ, ТЕРМ В ЕГО ПОПУЛЯЦИЮ НЕ ПОПАЛ — молчал МАЙНЕР, а не энфорсер.** Прибор консистентности судит СТРОКИ БАНКА. Проверено по банку прогона: из терминов, на которых читатель поймал разнобой, **в банке НЕТ восьми**: `家族/族` (род↔клан — самая крупная находка приоритета №1) · `炼制`/`炼成` (создать↔выплавить) · `楼阁`/`阁楼` (башня↔павильон) · `老妈子` · `先机` (преимущество первого хода↔первому) · `丫头片子` · `怀璧之罪`. ⇒ **энфорсер не молчал — ему не о чем было говорить.** Это дефект ПОЛНОТЫ МАЙНИНГА, и лечится он там, а не в гейте. **(б) ПРИБОР ЕСТЬ, ТЕРМ В БАНКЕ, ФОРМА БАНКА ДОЕХАЛА — А ДЕФЕКТ В САМОМ БАНКЕ.** `方家 → «род Фан»` и `方之一脉 → «ветвь Фан»` ОБА в банке, обе формы отгружены, прибор доволен. Но «род» в этой книге занят кланом (`род Гу Юэ`, `род Бай`, `род Сюн`), и «братья из рода Фан» делают ветвь четвёртым самостоятельным родом — находка [3]. То же у `九族 → «девять поколений рода»` (находка [19]: 九族 — девять степеней родства, а не девять поколений). ⇒ **прибор спрашивает «доехала ли форма банка», и по построению НЕ МОЖЕТ спросить «а верна ли сама форма».** Содержание банка не судит ничто. **(в) ПРИБОР ЕСТЬ, КОНСТРУКЦИЮ ЗНАЕТ ПОИМЁННО — И ПО РАТИФИЦИРОВАННОМУ РЕШЕНИЮ ЕЁ НЕ СУДИТ.** Находка [17]: `杀了千万人` → «десятки миллионов» (千万 = десять миллионов). У движка есть чекер ровно на эту конструкцию — `DC2 千万`, — и его собственный комментарий говорит дословно (`backend/internal/checks/cheapgates.go:90-93`): > «DC2 千万: the live hit (杀了千万人 → «тысячи и тысячи людей») is shape-identical to the ratified TRUE > positive (千万生灵 → «тысячи жизней»). Hyperbole and magnitude are not separable offline here — the > rule's header says so (§5-A4) — so the hit is the class's accepted ambiguity, not an implementation bug.» ⇒ **прибор встретил ЭТУ ЖЕ конструкцию, признал её неразрешимой ОФФЛАЙН и по решению оставил в покое — а читатель с оригиналом в руках решил её одной строкой.** Это не дыра в реализации; это точная граница того, что детерминированный гейт умеет, и цена этой границы теперь названа в тексте. **(г) ПРИБОРА ДЛЯ КЛАССА НЕТ ВОВСЕ — и это БОЛЬШИНСТВО находок.** Ни один $0-гейт не судит: подмену референта (крит [1]: 自己 отдано служанке, и мотивировка сцены рухнула) · согласование рода ([8] «Наделила … небо», [9] «нашлось бы не одна сотня» — две настоящие грамматические ошибки) · кальку идиом ([7] «жёлтые цветы уже остынут», [12] «сила девяти быков и двух тигров», [16] «преступление владения яшмой», [25]) · регистр ([20] «девчонка-маломерка», [22] «апертура» в молитве предкам, [26] «молвил» + «рассеянно») · утрату эха реплики ([5] `你退下罢` дважды в оригинале, две разные реплики в переводе) · дописанный образ ([6] «очки с глаз упали», [23] «каблучками» при вышитых туфельках). **Это 20 находок из 26.** ⚠ **И ОДИН ПРИБОР ИЗМЕРИЛ ПРЕДМЕТ, НО НЕ ИМЕЕТ ПОРОГА.** Находка [11] — сжатие абзацев 230 → 158. Движок это ЧИСЛО печатает: `STRUCTURE … sentences/narrative-paragraph = 2.44 (285 / 117)`. Но это наблюдаемость без порога и без сравнения с ИСХОДНИКОМ: прибор знает, сколько абзацев в ПЕРЕВОДЕ, и не знает, сколько их было в оригинале. ⇒ **самая крупная художественная потеря прогона измерима одним вычитанием, которого никто не делает.** ## 19. ЧТО ЧИТАТЕЛЬ СКАЗАЛ О КАЧЕСТВЕ ТЕКСТА — и это ответ на вопрос владельца **Оценка читателя: «приличный любительский, на верхней его границе».** Довод, который он привёл сам: издательское качество не допускает ни одной ошибки согласования и ни одного места, где абзац теряет смысл, — здесь их три, и все три ловятся обычной редакторской вычиткой БЕЗ сверки с оригиналом. Машинным текст назвать нельзя: «машина не выбирает „попаданец“, не строит „в отблесках заката вдруг приобрело чарующий оттенок“ и не держит одиннадцать вхождений термина без сбоя». **Что он назвал сильным:** сцена жертвоприношения в родовом храме, утренняя сцена с Шэнь Цуй, пересуды сверстников по дороге — «читается как нормальная русская проза, без запинок»; диалог старейшин звучит как разговор пожилых интриганов, а не как подстрочник. **Три системные слабости, названные им:** (1) **ритм** — 230 абзацев оригинала сплавлены в 158, в главе 2 почти вдвое, и фирменные однофразовые удары автора («大局已定,今日必死无疑», «简而言之,就是重生», «恨吗?») стали придаточными внутри потока; (2) **идиомы** — там, где китайский оборот стёрт до служебного значения, перевод его РИСУЕТ, и читатель спотыкается там, где автор не просил останавливаться; (3) **терминология не сведена** — «род/клан, ветвь Фан/род Фан, создать/выплавить, „Ступай“/„Можешь идти“ — следы текста, который никто не вычитывал единым проходом с глоссарием». **Его три первоочередные правки:** абзац про Шэнь Цуй (крит) · свести глоссарий одним проходом (закрывает почти весь приоритет №1) · вернуть абзацную разбивку и переписать четыре кальки по смыслу. ⚠ **И честная рамка вокруг этой оценки.** Она снята ОДНИМ читателем на ОДНОЙ книге из трёх глав, без второго независимого суждения о качестве (адъюдикация §17.1 проверяла ЦИТАТЫ и ЧИСЛА, а не вкус). Шкала «издательское / приличное любительское / машинное» — его, не наша ратифицированная. ## 20. СОСТОЯНИЕ СДАЧИ **Сделано и предъявлено:** книга проведена от двери до файла и прочитана ($0.396657, 20 мин 06 с) · исход есть у каждой из 23 машинных строк пре-рег-таблицы (§9 результатов), а две последние её строки — 24 «вычитка» и 25 «сверка приборов» — закрыты §17 и §18 · деньги сведены шестью счётами с названной оговоркой про независимость (§15 результатов) · обе миграции предъявлены ДАННЫМИ, и v18 дала числу ряда 422 первое значение (§6 результатов) · денежная мера пре-регистрирована, прибор само-проверен на прогоне A до применения, и две меры одного явления разошлись в разные стороны (§5 результатов) · вычитка всего текста опус-читателем с доказательством дочитывания и адъюдикацией цитат (§17) · сверка приборов с читателем разделена на четыре РАЗНЫЕ причины молчания (§18) · находки вне заказа с носителями (§12 результатов) · девиации объявлены, включая правку моего прибора после фриза (§11 результатов) · что не удалось и где прибор слеп (§13–14 результатов). **Где артефакты:** | Что | Где | В git | |---|---|---| | Инструменты (драйвер, прибор денег, прибор отгруженного текста, пакет читателя) | `eval/cold_run_b/` | фриз `4ee7f03` + правка `measure.py` отдельным коммитом | | Пре-регистрация и этот разбор | `docs/experiments/25-door-to-file-b.md` | пре-рег — `4ee7f03`; результаты лендит оркестратор | | Стенд, следы, 54 сохранённых HTTP-тела, копии БД, отгруженные файлы | `~/tm-coldrun-b/` (вне git, вне `/tmp`) | нет | | Живой журнал прогона («время · что увидел · чего ожидал · что это значит») | `~/tm-coldrun-b/evidence/live-journal.md` | нет | | Ожидания §4.8, написанные ДО проб, и исход каждой | `~/tm-coldrun-b/evidence/checks/api-expectations.md` | нет | **Что оставлено включённым:** стенд жив (`tmplatformd` на `127.0.0.1:8098`, pid в `~/tm-coldrun-b/stand/daemon.pid`, база `tm_coldrun_b` в кластере `/tmp:55433`, клон фриза в `~/tm-coldrun-b/freeze`) — чтобы любое число этого отчёта можно было пере-снять теми же командами. Гасить по слову оркестратора и **только по pid**. **Чего я не делала и не буду:** не чинила ничего из найденного — ни в движке, ни в платформе, ни в банке. Пак запрещает прогону чинить, и это правильно: прогон, чинящий найденное, перестаёт быть холодным и теряет право сравниваться с A. Единственная правка кода за пак — мой СОБСТВЕННЫЙ прибор после фриза, и она объявлена девиацией (§11 п.1 результатов). **Работа завершена, править не планирую.** --- # ДОПИСКА 12.09 — по прямому вопросу «что ты знаешь и не сказала» > ⚠ Дописка, а не правка: ничего выше не тронуто. Поводом послужил вопрос оркестратора №23 после > закрытия пака (норма: «в коде названо, в отчёте нет — значит для следующей смены НЕ названо»). ## Д1. ⭐⭐ БАНК КНИГИ НЕДЕТЕРМИНИРОВАН ПО ПОСТРОЕНИЮ — замерено, а не предположено В §18.1(а) сказано, что восьми термов читателя «нет в банке», и причина названа только для части. Пере-снято по обеим базам, два разных механизма: **(а) ЧТО ОТСЕКАЕТ КОНТРАСТ — и это НЕ порог.** Греп по `mining-contrast.zh.txt` (jieba 0.42.1, **349 046 строк** — контроль): `家族` · `族` · `炼制` · `楼阁` · `先机` · `老妈子` — **ВСЕ в словаре общекитайского**, а `方源` · `古月山寨` · `丫头片子` · `怀璧之罪` — нет. ⇒ **шесть из восьми термов читателя отсечены потому, что они ОБЫЧНЫЕ КИТАЙСКИЕ СЛОВА.** Контраст спрашивает «характерно ли слово для ЭТОГО текста на фоне китайского вообще»; продукт спрашивает «нужна ли слову ОДНА закреплённая русская передача на всю книгу». **Для `家族` первый ответ „нет“, второй „да“** — и крупнейшая находка приоритета №1 (род↔клан, 9 + 29 вхождений в исходнике) не отсеяна порогом, а исключена ПО ПОСТРОЕНИЮ. **(б) А РАСХОЖДЕНИЕ БАНКОВ A И B — СОВСЕМ ДРУГОЕ, и оно глубже.** Банки: общих **53**, только в A — **16**, только в B — **13**, на побайтно одном исходнике и тождественном покупающем конфиге (sha `a46b33ee…` у обоих). Granularity-парами объясняются лишь **4** (`丙等资质`↔`资质` · `四更时`↔`四更` · `族长家老`↔`族长` · `贴身丫鬟`↔`丫鬟`). И частотой это не объясняется: **`舅父舅母` встречается в исходнике 14 раз, есть в банке A и отсутствует в банке B.** ⭐ **МЕХАНИЗМ ЗАКРЫТ ЗАМЕРОМ, $0.** Кандидатов банка предлагает ЧЕРНОВИК — канал `banknote` draft-side (`bank-mining: draft-side proposals folded`). Сверено `retrieval_state.banknote_detail` двух прогонов НА ОДНИХ И ТЕХ ЖЕ шести чанках: | чанк | поверхностей A | B | общих | только A | только B | |---|---|---|---|---|---| | ch1/0 | 16 | 19 | 15 | `天罗地网` | `牌位` `祭祀大典` `赤铜香炉` `魔头` | | ch1/1 | 19 | 18 | 17 | `三转蛊师` `古月族长` | `将敬酒` | | ch2/0 | 19 | **11** | 11 | `三转` `仙师` `孪生弟弟` `开窍` `怀璧之罪` `舅母` `舅父` `魔道巨擘` | — | | ch2/1 | 15 | 12 | 11 | `唐诗宋词` `正派` `甲等资质` `邪魔` | `甲等` | | ch3/0 | 17 | 20 | 13 | `四更时` `舅父舅母` `贴身丫鬟` `雪盐` | `丫鬟` `四更` `嬷嬷` `少爷` `时辰` `舅母` `舅父` | | ch3/1 | 12 | 13 | 7 | `丙等资质` `丫头片子` `后宫` `族长家老` `舅父舅母` | `丙等` `家老` `族长` `舅母` `舅父` `资质` | | **итого** | **98** | **93** | **74** | | | **Жаккар по книге = 0.63.** ⇒ **банк книги — функция ЧЕРНОВИКА, а черновик есть стохастический выход модели. Значит и СОСТАВ банка, и ГРАНУЛЯРНОСТЬ его ключей недетерминированы от прогона к прогону на одном входе.** Видно и род различия: на ch3/1 прогон A предлагает СОСТАВНЫЕ ключи (`丙等资质`, `族长家老`, `舅父舅母`), а B — их СОСТАВЛЯЮЩИЕ (`丙等`, `族长`, `舅母`, `舅父`, `资质`, `家老`); на ch2/0 предложение B — строгое подмножество A, беднее на восемь. ⛔ **Следствие для чисел этого прогона, и оно жёстче уже записанного:** консистентность мерится ПО СТРОКАМ БАНКА, а сами строки между прогонами разные. **Двигается не только вердикт (ряд 436) — двигается ПОПУЛЯЦИЯ, на которой он считается.** Числа `I1`/`I2` двух прогонов сравнивать нельзя не потому, что прибор плох, а потому, что у них разные знаменатели по построению. ## Д2. ТРИ НАХОДКИ ЧИТАТЕЛЯ, ВЫПАВШИЕ ИЗ ОТЧЁТА — и почему это хуже отброса В отчёт вошли **22 из 26**. [4] присутствует по содержанию (в §18.1(а) термы перечислены иероглифами). **Три отсутствуют полностью, и я их НЕ отбрасывала по доводу — они выпали при сведении находок в КЛАССЫ:** в §18.1(г) перечислены представители класса, и перечень не сверен с полным списком. **У отброса есть аргумент, который можно проверить; у выпадения из выжимки его нет.** * **[10] МАЖОР, приоритет 4, `калька`.** `舅父舅母` — одно двусложное слово — отдано шестисловной конструкцией «дядя по матери и тётя по матери», **11 раз полной парой** (плюс «тётя по матери» отдельно ещё 6). ОРИГИНАЛ: «明天就是开窍大典,哥哥你这么晚还不休息,舅父舅母知道了,恐怕会担心的。» ПЕРЕВОД: «Завтра ведь церемония открытия апертуры, а ты так поздно не отдыхаешь. Если дядя по матери и тётя по матери узнают, боюсь, они будут волноваться.» В живой реплике подростка брату это канцелярская справка о родстве. * **[21] МИНОР, приоритет 3, `типографика`.** Два вида многоточия («…» ×10 и «...» ×2, строки 217 и 227) и одна пара ПРЯМЫХ ASCII-кавычек внутри ёлочек при 24 парах ёлочек: «…на пути демонов нет слова "компромисс"». Правки корректора, которых не сделали. * **[24] МИНОР, приоритет 4, `калька`.** ОРИГИНАЛ: «弟弟如卧龙升天,哥哥似凤雏落地。» ПЕРЕВОД: «Младший — словно Лежащий дракон, вознёсшийся в небо; старший — словно Птенец феникса, павший на землю.» `卧龙` и `凤雏` — прозвища Чжугэ Ляна и Пан Туна, для китайского читателя мгновенно узнаваемая пара равновеликих гениев; по-русски антитеза не срабатывает, читатель видит двух произвольных зверей. ## Д3. ЧЕТЫРЕ КОДОВЫХ НАБЛЮДЕНИЯ, НЕ ЗАВЕДЁННЫЕ НАХОДКАМИ В ОСНОВНОМ ОТЧЁТЕ 1. ⚠ **`bank_decisions` пуста при трёх `approved`.** После ДВУХ прогонов, применивших правки через дверь, в таблице **0 строк**, при `bank_terms` с **3** `approved` (оба числа сняты запросом). Эффект решений есть, платформенной записи «кто что решил» нет. Видела на дымовой руке и не чесала; в код за причиной НЕ ходила, поэтому дефект это или таблица другого назначения — не установлено. 2. **ДВА флора `min_max_tokens`, и какой выигрывает — выяснила только по вопросу.** `pipeline-c1.yaml:18` несёт `2048`, `models.yaml` — `8000` (flash) и `16000` (pro). На проводе: черновик 8496 (= 8000 + 496 банк-бюджета), редактор 16000, бэнк-роли 8000 ⇒ выигрывает пер-модельный, пайплайновый инертен. 3. **`TM_PLATFORM_SIGNUP_GRANT_USD` печатается на буте** как «(an amount; not logged)», то есть настройка фри-тир-гранта в деплое существует — при ратифицированном «продуктовых квот и фри-тира нет и не проектируется». 4. **`waves.workers` — РЕАЛЬНЫЙ ключ** (`internal/config/pipeline.go:98`), дефолт **1** при ≤ 0 (`:939-940`), **в боевом `pipeline-c1.yaml` не задан вовсе.** ⇒ последовательность прогона — дефолт, а не записанное решение. Внутренний пер-модельный кап — `RateLimit.MaxConcurrency` (`models.yaml`), выставлен только у `mistral-large-2512`. ⛔ **О поведении при `workers > 1` этот прогон не говорит НИЧЕГО:** гонки, порядок записи, снапшот и леджер под конкуренцией НЕ СМОТРЕЛА. ## Д4. ДВА СВОЙСТВА ХОСТА, КОТОРЫХ НЕТ В ОСНОВНОМ ОТЧЁТЕ * **`/tmp` занят на 96 % на входе и 97 % на выходе** (5.7 ГБ из 5.9, tmpfs; 4.9 ГБ — скретчпады ЧУЖИХ сессий). Меня не задело только потому, что `TMPDIR`/`GOTMPDIR` всех сборок и движка уведены на диск. Забитый tmpfs маскируется под сломанную сборку. * **`TM_PLATFORM_RUN_MEMORY_MAX` = `4G` по умолчанию** — прогон исполняется в транзиентном юните systemd С ПОТОЛКОМ ПАМЯТИ. На трёх главах не сработало; на книге в 2283 главы это первый подозреваемый при убийстве по `CONSTRAINT_MEMCG`. * **`loginctl show-user … Linger=no`**, хотя `platform/README.md` говорит «установка требует `enable-linger`, иначе не стартует ни один прогон». Прогон прошёл целиком ⇒ на этом хосте утверждение README буквально НЕ выполняется (пользовательский менеджер systemd жив сам по себе). ## Д5. ЧЕГО Я НЕ СМОТРЕЛА ВООБЩЕ SSE-поток `/v0/books/{id}/stream` не дёргала ни разу · `tmctl backup` как канал не проверяла, хотя `TM_PLATFORM_BACKUP_DIR` включила · `--max-units` не трогала · несмонтированные ручки (`getRun`/`updateBook`/`deleteBook`) не проверяла · метрики на `127.0.0.1:9468` не читала · `regenerate_before_escalate` — не проверяла, срабатывал ли.