textmachine/docs/archive/reports/COLDRUN_REPORT_2026-07-31.md

33 KiB
Raw Blame History

Холодный мини-прогон: банк с нуля (пустой сид, отдельная БД)

Сессия: бэкенд, 31.07.2026. Промт: docs/BACKEND_COLDRUN_SESSION_PROMPT.md (оркестратор №9, санкция владельца). Релей 31.07: потолок расширен до $0.50; Q1 — мини-профили голоса в подписную таблицу; Q2 — сначала замер экспозиции, ноль ⇒ путь (ii) без бампа версий с доказательством диффом. Сессия НЕ коммитит.

Ревью-шапка (оркестратор №9, 31.07): ПРИНЯТО И ЗАЛЕНДЕНО, D39.58; прогон закрыт владельцем после банк-стопа (Р7: замер достаточен, edit-волна и авто-режим — со следующим живым прогоном). Короткая приёмка: сьют -race перегнан оркестратором — зелёный; golden/testdata неподвижны (дифф 0); repin.go не тронут; дифф snapshot.go +8/5 — только фолд-блок банкноты (разделение версий канала, ратифицировано Р2). Путь (ii) по S7 ратифицирован: экспозиция 0 на 1119 парах × 32 банках с рабочим позитивным контролем. Девиация от буквы промта («не трогать snapshot.go») ратифицирована постфактум: изменение и есть предмет Р2, поднято хендоффом открыто; процессный нит — пинг ДО правки был бы правильнее. Деньги: $0.126068, spend ≡ Σ checkpoints; брак+переработка $0.056 названы честно, из них принята норма «итерации промптов — на проекте-пробе 12 главы». Эхо-факт (П3) внесён в quirks строкой оркестратора.


§0. ПРЕ-РЕГИСТРАЦИЯ (написана ДО первой платной траты; ниже НЕ переписывается)

Причина, по которой это первый раздел: по переписи инцидентов проекта самоотчёт — доминирующий канал ошибок, а прогон, чей критерий успеха дописан после результата, не доказывает ничего (урок мини-прогона 25.07, хендофф §4.4: критерий, который потом приходится объяснять, даёт ложное спокойствие).

0.1 Конфигурация — заморожена

Ось Значение Почему так
Срез главы 110, 57 838 байт GB18030, sha256 0b5f9b02…c89f37 байт-копия среза тёплого мини-прогона 25.07, независимо пере-деривирована из книги (строки 93837) — три хеша совпали ⇒ разница «тёплый↔холодный» есть разница конфигураций
Сид ПУСТОГО ключа glossary_seed в book.yaml нет холодный старт; подписанный сид стенда — эталонный ключ офлайн-замера (бэклог 17), в БД не грузится
БД/каталог ~/books/gu-zhenren/coldrun-a/ (проект А), coldrun-b/ (проект Б) стендовые БД не трогаются; их хеши сняты ДО прогона (33 артефакта)
Каналы банкнота ON · терминолог ON (target_script: Cyrillic) · gates.voice ON · санитайзер ON · регресс-гард ON · coverage OFF · петля ремонта OFF первое живое включение трёх каналов вместе
Флаг проект А--verify-bank (стоп на подпись), проект Б — без флага (авто-провод) оба режима, бэклог 24
Потолки А: book/day $0.25 · Б: $0.08 сумма $0.33 при смете $0.154 — гейт способен выстрелить
Модели draft deepseek-v4-flash (thinking ON) · edit deepseek-v4-pro · терминолог deepseek-v4-flash шиппинговая форма D39.22/D39.42
Окно вне UTC 0104 / 0610 долины DeepSeek (промт)

0.2 Смета ДО трат (фриз; источник каждого числа назван)

стадия ожидание источник
А: черновая волна (банкнота ON) $0.0220.026 тёплый прогон того же среза: драфт ≈$0.022; проба банкноты draft-only $0.021688
А: терминолог, 2 раунда подписи $0.0040.010 D39.45 §8.5.2 ($0.0020.005 за проход; каждая итерация подписи покупает проход заново)
А: edit-волна $0.092 тёплый прогон: главный проход $0.114291 драфт
Б: 2 главы, авто-режим $0.026 1/5 объёма А
резерв на брак/ретраи $0.030 урок хендоффа §4.1 ($0.046668 сожжено на конфиге, собранном sed-ом по чужому book.yaml)
итого ≈$0.154 из $0.50

0.3 Что прогон обязан подтвердить СЫРЬЁМ (M1M9)

# Утверждение Артефакт-носитель
M1 Цена и покрытие ХОЛОДНОГО старта по стадиям (майнер / банкнота / терминолог / подпись) леджер + request_log + воронка эмиссии; деньги сверяются двумя независимыми путями
M2 Совместный recall майнер∪банкнота против ПОДПИСАННОГО сида стенда офлайн-скрипт по tmctl export + сид как ключ (в БД прогона его нет)
M3 Банкнота на нецензурированных черновиках: строки, parse_fail, воспроизводимость между сэмплами (А vs Б на общих главах) retrieval_state.banknote_detail, сырые ответы
M4 Язык ответа терминолога при ПУСТОМ якоре ⟦TM-CANON⟧ (холодный банк) — счётчик OffLanguage как прибор лог банк-стопа, счётчик
M5 Оба режима флага: стоп→подпись→продолжение (А) и авто-провод с ⟨проверить⟩ (Б) логи стопа, *.db.mined-signature.yaml, *.db.bank-stop.txt, тело запроса редактора
M6 allow_short на ЖИВОЙ подписи: 蛊/转 доезжают до модели инъекция в request_log/теле запроса
M7 Оси голос-флаггера AC + индикатор D + spoiler_leaks со ЗНАМЕНАТЕЛЯМИ retrieval_state.voice_detail
M8 Утечка алфавита (甲等→«категория A») — счёт живьём банк + подписная таблица
M9 Деньги durable: committed ≡ Σ checkpoints ≡ Σ(usage×price); потолок способен выстрелить spend, checkpoints, request_log

$0-замеры из чекпойнтов (не требуют отдельных трат): пере-замер P1 consistency на нецензурированной популяции (бэклог 21) · пере-мер весов консолидации §C2-3 при n=2 (бэклог 22) · покрытие WHAT→WHICH при непустом пересечении (бэклог 24).

0.4 ЧТО ЗАРАНЕЕ НАЗЫВАЕТСЯ ПРОВАЛОМ

# Провал (назван до трат)
П1 Главный проход проекта А > $0.30 (вдвое выше верха сметы) — модель денег неверна для холодного банка
П2 Пробит потолок ИЛИ committed ≠ Σ checkpoints вне ратифицированного исключения redrive
П3 Эхо-класс (cjk_artifact) на черновике > 0 — эхо-мина жива при thinking-ON
П4 Банкнота: n_banknote_lines = 0 по ВСЕМ чанкам, ИЛИ parse_fail > 0 без предъявленной СТРОКИ-виновника (после v2-правила parse_fail означает «модель написала src, которого в книге нет» — это факт о модели, и он обязан быть показан текстом, а не счётчиком)
П5 Банк-стоп не остановился под --verify-bank при непустой дельте ИЛИ проект Б остановился без флага
П6 Терминолог ответил не в целевом письме, а экран OffLanguage этого НЕ увидел (прибор слеп)
П7 Подписанный односимвольный терм (allow_short: true) не доехал до модели ни одним блоком
П8 Любой байт стендовых артефактов изменился (33 хеша сняты до прогона)
П9 Число отчитано без второго пути вывода там, где второй путь возможен (норма 30.07: «пере-мерь свой вывод другим способом, чем получил»)

0.5 Что заранее объявлено НЕ провалом

  • Большой лист подписи. Холодный банк обязан быть большим; это стоимость холодного старта, а не дефект.
  • Оси голоса B/C = 0, если владелец не подписывает профили (Q1): при пустых voices: реестр пуст ПО ПОСТРОЕНИЮ (voicerun.go:25-27, memvoice.go:343-360), и тогда честная запись — «не измерено», а не «чисто». То же для SourceReplies: zh-speech-cue.txt не шипнут (бэклог 13б) ⇒ знаменатель источника = «не измерено».
  • Эха не случилось — законный исход; эхо-метрика тогда «не измерена» (тёплый прогон закрыл её тестами, но не прогоном).
  • Терминолог предложил dst, который владелец отверг — это работа подписи, а не дефект роли.
  • Остаток дефектов на этом прогоне вторичен: банкнота включена в главный проход (в отличие от 25.07), значит черновик другой, и сравнивать остаток с тёплым прогоном напрямую нельзя.
  • dialogue_dash на 蛊真人 — загрязнён подгонкой (D39.37 п.4), его цифры аргументом не считаются.

0.6 Стройка, исполненная ДО первой траты (детали — §1)

Парсер банкноты v2 (пар-слепое правило) · секция редактора по провенансу (S7) · пин канала allow_short · мутации 7/7 красные · сьюта -race 14/14 зелёная · golden не тронут.


§1. Построено (всё — до первого платного вызова, кроме двух правок промптов, вызванных замером)

# Что Где Приёмка
1 Правило src банкноты: «встречается в книге» вместо ханьского диапазона (бэклог 19) pipeline/banknote.go:129-186 (bankSourceIndex, bankSrcAttested), индекс строится в композит-корне bookrun.go:141-144 TestParseBanknoteSrcMustBeAttested, TestBankSourceIndexParity; мутации M1M3 красные
2 Восстановление порядка колонок тем же инвариантом (находка прогона) banknote.go (switch по srcAttested) TestParseBanknoteRecoversColumnOrder; M9/M10 красные
3 Разделение версий канала: bankSliceVersion фолдится, bankParseVersion едет с прогоном banknote.go:46-64, snapshot.go:113-129 TestBanknoteSnapshotFold (пинит и отсутствие парс-версии в payload); M11 красная
4 Секция редактора по ПРОВЕНАНСУ, не по disposition (S7) membank/memory.go:786-815 TestEditorSectionFollowsProvenance; M4/M5 красные
5 Пин канала allow_short сквозь сид→банк→провод (бэклог 18) pipeline/allowshort_wire_test.go оба направления (с флагом доезжает, без — нет)
6 Линты пар-пакетов промптов (класс, не экземпляр) config/prompt_lint_test.go M12 красная (дефект возвращён в данные при целом линте)
7 Данные: формат банкноты и терминолога ПОКАЗАН настоящей табуляцией; правило «в первом поле — фрагмент исходника» prompts/zh-ru/translator-banknote.md, terminologist.md линт + замер (см. §2.2)
8 Закрыта дыра тестов: entryFiringKeys игнорировал allow_short membank/memseed_test.go M7 (выжила → закрыта → красная)

Мутации 12/12 красные. Сьюта -race 14/14, vet/gofmt чисты (llm.go — до-паковый нит, не тронут). Golden НЕ пере-капчен и НЕ покраснел.

Ответ на Q2 релея — экспозиция S7 = 0, доказано диффом, а не заявлением. Скан движковыми предикатами по 32 банкам (14 стендовых БД + 18 сид/дельта-файлов): 977 подписанных строк, 1119 пар (запись, срабатывающий ключ), EXPOSED=0, DIVERGENT=0 при рабочем позитивном контроле. Равенство старого и нового маршрута на КАЖДОЙ паре сильнее одного отрендеренного блока — оно держится при любой выборке бюджета. ⇒ путь (ii): версии matchVersion/RenderFormatVersion не бампались, поведение существующих книг байт-идентично.

§2. Замеры

2.1 Совместный recall холодного банка против ПОДПИСАННОГО сида (бэклог 17) — главный результат

Эталон: 49 подписанных термов сида, засвидетельствованных в срезе (4 из 53 в срезе не встречаются — исключены как недостижимые). Найдено холодным банком: 45 точно + 3 внутри составного = 48.

RECALL совместный = 0.918 строгий / 0.980 с составными. Против recall одного майнера 0.0690.103 (D39.43).

Пропущен ровно ОДИН терм: 长生 → бессмертие. Оговорки честности: эталон не независим (сид собран с знанием этой книги), сверка — точное вхождение и вхождение-в-составное, без движкового нормализатора (обе стороны — упрощённые ханьцы, расхождение маловероятно, но не исключено).

2.2 Цена и покрытие по стадиям (бэклог 16, частично — edit-волна не гонялась)

стадия факт ожидание §0.2
черновая волна, 20 чанков (одна волна) $0.024740 $0.0220.026 ✓
терминолог, один проход по холодному банку $0.006211 → $0.013045 (растёт с числом кандидатов: 75 → 150) $0.0020.005 ✗ занижено
эскалация 2 хопа на dspro $0.014670 не планировалось

Покрытие канала WHAT по сэмплам (все перепарсены ОДНИМ текущим правилом ⇒ разница = промпт):

сэмпл промпт чанков со строками различных src отвергнуто строк (новое/старое правило)
1 старый (<TAB> словом) 10/20 74 4 / 28
3 таб показан 13/20 95 3 / 21
4 + «в первом поле — исходник» 18/20 96 3 / 5

Новое правило внутри одного сэмпла: теряет 4 поверхности (выдуманные ханьские компаунды 主仆身份, 四更天 — их в книге нет) и возвращает 51 строку, которую старое правило выбрасывало. Точность и полнота выросли по разным причинам.

2.3 Свод банка

150 кандидатов (128 только банкнота · 14 оба канала · 8 алиасы кластера); на подпись — 142 (=128+14). 149 из 150 несут перевод, одна отклонена ролью (⟦TM-NO-DST⟧ отработал). 75 из 150 (50%) имеют расхождение между черновиками — 方源 имеет 11 чтений, включая шесть раз имя ДРУГОГО персонажа («Фан Чжэн»); консолидация выбрала верное. Типы: term 95 · name 22 · place 18 · title 13 · nickname 2.

2.4 Экраны и прочие строки бэклога

  • Язык ответа при ПУСТОМ якоре ⟦TM-CANON⟧ (бэклог 20): off_language=0 на 149 консолидациях. Экран как прибор работает, срыва языка на холодном банке нет.
  • Утечка алфавита (бэклог 23): 0 из 150 — латиницы в предложенных dst нет вовсе. Роль ушла в транслитерацию (甲等 → класс Цзя), а не в латинскую букву.
  • allow_short (бэклог 18): пришло само (freq 62, «ранг»); не приходит НИКОГДА — модель объявляет составные (蛊师/蛊虫/月光蛊), но не голову, майнер режет по длине ≥2. Центральное понятие книги в холодный банк без ручной строки не попадает. Механизм доставки подписанного односимвольного терма до провода проверен $0-пином.
  • Эхо-метрика на живом эхо (бэклог 24): закрыта фактом — echo draft=2 (10.0%, 2 recovered by escalation).
  • Оба режима флага (бэклог 24): стоп-режим отработан четырежды; авто-режим НЕ гонялся (сессия закрыта до проекта Б).
  • Гейт согласия на пере-оплату: проекция $0.024740 совпала со списанным ДО ЦЕНТА; при кэпе ниже проекции отказал, не тронув ни строки, ничего не зарезервировав.

§3. Сработавшие критерии провала (названы в §0.4 ДО трат)

П3 сработал: эхо-мина DeepSeek ЖИВА при thinking-ON. Два черновика вернулись чистым исходником (han_share=0.999, кириллицы ноль; ch5/chunk0, ch9/chunk1 сэмпла 3). Конфиг соответствовал инварианту №3 (reasoning:"off" — no-op у deepseek, thinking включён). Механизм отработал как задуман: гейт cjk_artifact → эскалация на dspro → корректный перевод, метрика показала оба случая. Читать как: thinking-ON снижает частоту эха, но НЕ исключает его; «echo 0» пере-прогона 23.07 (D39.20) был свойством выборки, а не гарантией.

П4 частично: parse_fail держится на 3 чанках из 20 и после всех правок — но это НЕ дефект парсера. Строки предъявлены: модель выдаёт таблицу целиком на целевом языке (обе колонки по-русски) — исходной поверхности в строке нет вообще, банковать нечего.

Остальные (П1, П2, П5П9) не сработали. Стендовые артефакты: 33 хеша сняты до прогона, ни один не изменился.

§4. Деньги — $0.126068 из потолка $0.50 (потолок проекта $0.25, использовано 50.4%)

spend ≡ Σ checkpoints, сверено tmctl report/status. Разбивка: черновые волны (4 запуска) $0.081145 flash + $0.014670 pro (эскалации) · терминолог (3 прохода) $0.030253.

Мой брак — $0.010064 (оборванная волна: запустил пере-драфт со старым промптом и остановил его через 10 вызовов, когда пришло правило владельца «не закрывать баги воркэраундами»). Переработка — $0.046341 (волны 3 и 4): она купила разложение «промпт против парсера» и четыре сэмпла, но её причина — моя ошибка последовательности: разделение версий канала (§1 п.3) надо было спроектировать ДО первой платной волны, а не после неё. Норма прогона на этом срезе — одна волна $0.0247; мы заплатили четыре.

§5. Найдено и НЕ починено (с ценой решения)

  1. Банк переводит ОДНА дешёвая модель одним проходом, без второго мнения. Текст главы получает две РАЗНЫЕ модели (flash → pro) плюс гейты; банк, который потом связывает каждую главу, — один проход deepseek-v4-flash. Отложенный судья-с-декоем (D39.51 п.4, строка 5 бэклога) ждал замера холодного старта — замер есть.
  2. Ветку «транслитерировать или переводить» решает НЕПРОВЕРЕННОЕ поле type — третья колонка от черновой модели. 元石 («первородный камень», предмет) пришёл типом name ⇒ получил и ветку транскрипции, и бонус соответствия Палладию ⇒ «юаньши». Промпт роли и типизация формулы (terminologist.go:165-171 — конформность только для name/place) написаны верно; обе стоят на непроверенном типе. Это механизм жалобы владельца «слишком китаизированно».
  3. Консистентность серий не обеспечена ничем: 甲等 → класс Цзя, но 乙等/丙等/丁等 → ранг И/Бин/Дин — одна серия, два родовых слова, потому что термы попали в разные батчи роли, а роль не видит серии.
  4. Проводной формат каналов пересказан прозой в промптах каждой пары, парсер живёт в Go, связи нет. Дефект <TAB> — прямое следствие; линты закрывают класс, но не устраняют дублирование контракта. Предложение: формат — переменная шаблона от движка ({{banknote_format}}), пар-пакет несёт только язык и обёртку. Цена: RenderVars + строка в каждом пар-промпте, PromptSHA256 двигается один раз (сегодня не перекупает никого — гейта нет ни в одном шиппинг-конфиге).
  5. Квадратичность правила src (строка × длина книги при промахе чанк-пути): на 10 главах не видна, на 2284 разделах — риск; рядом со строкой 37 (квадратичность AttachKWIC).
  6. Дефект <TAB> был латентен и во втором промпте (terminologist.md) — не стрелял только потому, что рядом стоял пример с настоящей табуляцией (0 из 75 строк роли). Несущее правило — «формат надо ПОКАЗАТЬ», оно и запинено.

§6. Предложения (в порядке, в котором я бы их делал)

  1. Валидация типа — дешевле и важнее второго мнения: сверка с классификатором майнера там, где терм нашли оба канала; детерминированный экран «name, чей dst — многословная строчная фраза»; требование к роли обосновывать тип. Центы или ноль, а управляет главной развилкой качества банка.
  2. Второе мнение по архитектуре глав: другая модель ревьюит сведённый банк, её несогласия — ОТДЕЛЬНОЙ колонкой в подписной таблице, а не автоматическим решением. Это отложенный судья в роли рецензента; ограничение D39.46 («слепой судья годен как экран, не как ранжировщик») не бьёт, потому что решает владелец. Цена: порядок первого прохода ($0.013) на дешёвой модели.
  3. Показать владельцу ось решения для термов с расхождением (75 из 150): два полюса — транскрипция против смысла — рядом.
  4. Эксперимент «язык промптов» (гипотеза владельца 31.07, строка 30в бэклога): арм A ru / арм B en при НЕИЗМЕННЫХ инъекциях (иначе меряются два фактора), метрика — детерминированные счётчики следования формату (parse_fail, off_language, bad_lines, битый разделитель), судья не нужен. Двусторонний риск: английский промпт на zh→ru может тянуть выход в английский — прибор есть (off_language, базлайн 0 из этого прогона). Зона полигона, ≈$0.020.05.
  5. Рефакторинг формата в шаблон (§5 п.4) — вместе с любой следующей правкой промптов, одной оплатой.

§7. Что прогон НЕ ответил

  • Полная цена холодного старта до конца — edit-волна не гонялась (сессия закрыта решением владельца). Измерены все стадии ДО редактуры.
  • Авто-режим флага — проект Б не запускался.
  • Оси голоса ADgates.voice был включён, но реестр флаггера пуст ПО ПОСТРОЕНИЮ: он собирается только из voices:/addresses: сида (voicerun.go:25-27, memvoice.go:343-360), а владелец не подписывал профили (черновик подготовлен, coldrun-a/SIGN-PACKAGE.md §3). Отчитывается как «не измерено», не как «чисто». Строка 13б (speech-cue.txt) остаётся открытой: SourceReplies = 0 по той же причине.
  • Пере-замер P1 consistency (21) и весов §C2-3 (22) — сырьё есть (4 сэмпла, разброс по 150 термам), метод — полигонский, не исполнялся.
  • Точечная ре-редактура по ключу после поздней подписи — не проверялась (подписи не было).

§8. Состояние

Сессия не коммитила. Дерево: 11 файлов бэкенда изменено, 3 новых (config/prompt_lint_test.go, pipeline/allowshort_wire_test.go, этот отчёт). В дереве есть и правки параллельной полигон-сессии (docs/archive/reports/TOS_RECHECK_2026-07-31.md, docs/experiments/00-provider-quirks.md) — не мои, не тронуты. Временные измерительные харнессы удалены.

Артефакты прогона (вне git): ~/books/gu-zhenren/coldrun-a/ — БД, 4 лога волн, подписная карта (142 терма), полная таблица банка (150), плоский свод BANK-FULL.tsv, подписной пакет владельцу SIGN-PACKAGE.md. Стендовые БД и снапшоты не тронуты (33 хеша сверены).

§9. Критик полноты (обязательная секция)

  • Recall 0.918 льстит по построению: эталон — сид, собранный с знанием этой книги и частично из прошлых майнинг-прогонов; независимого золотого набора нет. Число говорит «холодный банк находит то, что владелец уже подписал», а не «находит всё, что нужно».
  • Четыре сэмпла — не четыре независимых замера: три из них на одном и том же чанк-разбиении одной книги одной моделью; разброс между сэмплами смешан с разбросом между промптами.
  • «Утечка алфавита = 0» — свойство ЭТОГО прогона, а не доказательство отсутствия класса: полигон ловил её на другой сборке и другой выборке.
  • Эхо 2/20 — событие редкое, и разница с прошлым прогоном (0/20) статистически неотличима от шума; причинную связь с правкой промпта я НЕ утверждаю.
  • Оценка «слишком китаизированно» принадлежит владельцу, я её не мерил; §5 п.2 предъявляет механизм, а не подтверждение оценки.
  • parse_fail на 3 чанках предъявлен строками, но я не проверял, воспроизводится ли класс «таблица целиком на целевом языке» на другой книге/паре.
  • Не проверено адверсариально: моё же утверждение «чанк-путь есть строгое подмножество книжного» держится тестом на двух чанках, а не доказательством на реальном разбиении.