33 KiB
Холодный мини-прогон: банк с нуля (пустой сид, отдельная БД)
Сессия: бэкенд, 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 названы честно, из них принята норма «итерации промптов — на проекте-пробе 1–2 главы». Эхо-факт (П3) внесён в quirks строкой оркестратора.
§0. ПРЕ-РЕГИСТРАЦИЯ (написана ДО первой платной траты; ниже НЕ переписывается)
Причина, по которой это первый раздел: по переписи инцидентов проекта самоотчёт — доминирующий канал ошибок, а прогон, чей критерий успеха дописан после результата, не доказывает ничего (урок мини-прогона 25.07, хендофф §4.4: критерий, который потом приходится объяснять, даёт ложное спокойствие).
0.1 Конфигурация — заморожена
| Ось | Значение | Почему так |
|---|---|---|
| Срез | главы 1–10, 57 838 байт GB18030, sha256 0b5f9b02…c89f37 |
байт-копия среза тёплого мини-прогона 25.07, независимо пере-деривирована из книги (строки 93–837) — три хеша совпали ⇒ разница «тёплый↔холодный» есть разница конфигураций |
| Сид | ПУСТОГО ключа 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 01–04 / 06–10 | долины DeepSeek (промт) |
0.2 Смета ДО трат (фриз; источник каждого числа назван)
| стадия | ожидание | источник |
|---|---|---|
| А: черновая волна (банкнота ON) | $0.022–0.026 | тёплый прогон того же среза: драфт ≈$0.022; проба банкноты draft-only $0.021688 |
| А: терминолог, 2 раунда подписи | $0.004–0.010 | D39.45 §8.5.2 ($0.002–0.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 Что прогон обязан подтвердить СЫРЬЁМ (M1–M9)
| # | Утверждение | Артефакт-носитель |
|---|---|---|
| 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 | Оси голос-флаггера A–C + индикатор 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; мутации M1–M3 красные |
| 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.069–0.103 (D39.43).
Пропущен ровно ОДИН терм: 长生 → бессмертие. Оговорки честности: эталон не независим (сид собран с знанием этой книги), сверка — точное вхождение и вхождение-в-составное, без движкового нормализатора (обе стороны — упрощённые ханьцы, расхождение маловероятно, но не исключено).
2.2 Цена и покрытие по стадиям (бэклог 16, частично — edit-волна не гонялась)
| стадия | факт | ожидание §0.2 |
|---|---|---|
| черновая волна, 20 чанков (одна волна) | $0.024740 | $0.022–0.026 ✓ |
| терминолог, один проход по холодному банку | $0.006211 → $0.013045 (растёт с числом кандидатов: 75 → 150) | $0.002–0.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. Найдено и НЕ починено (с ценой решения)
- Банк переводит ОДНА дешёвая модель одним проходом, без второго мнения. Текст главы получает две РАЗНЫЕ модели (flash → pro) плюс гейты; банк, который потом связывает каждую главу, — один проход
deepseek-v4-flash. Отложенный судья-с-декоем (D39.51 п.4, строка 5 бэклога) ждал замера холодного старта — замер есть. - Ветку «транслитерировать или переводить» решает НЕПРОВЕРЕННОЕ поле
type— третья колонка от черновой модели.元石(«первородный камень», предмет) пришёл типомname⇒ получил и ветку транскрипции, и бонус соответствия Палладию ⇒ «юаньши». Промпт роли и типизация формулы (terminologist.go:165-171— конформность только для name/place) написаны верно; обе стоят на непроверенном типе. Это механизм жалобы владельца «слишком китаизированно». - Консистентность серий не обеспечена ничем:
甲等 → класс Цзя, но乙等/丙等/丁等 → ранг И/Бин/Дин— одна серия, два родовых слова, потому что термы попали в разные батчи роли, а роль не видит серии. - Проводной формат каналов пересказан прозой в промптах каждой пары, парсер живёт в Go, связи нет. Дефект
<TAB>— прямое следствие; линты закрывают класс, но не устраняют дублирование контракта. Предложение: формат — переменная шаблона от движка ({{banknote_format}}), пар-пакет несёт только язык и обёртку. Цена:RenderVars+ строка в каждом пар-промпте,PromptSHA256двигается один раз (сегодня не перекупает никого — гейта нет ни в одном шиппинг-конфиге). - Квадратичность правила src (строка × длина книги при промахе чанк-пути): на 10 главах не видна, на 2284 разделах — риск; рядом со строкой 37 (квадратичность
AttachKWIC). - Дефект
<TAB>был латентен и во втором промпте (terminologist.md) — не стрелял только потому, что рядом стоял пример с настоящей табуляцией (0 из 75 строк роли). Несущее правило — «формат надо ПОКАЗАТЬ», оно и запинено.
§6. Предложения (в порядке, в котором я бы их делал)
- Валидация типа — дешевле и важнее второго мнения: сверка с классификатором майнера там, где терм нашли оба канала; детерминированный экран «
name, чей dst — многословная строчная фраза»; требование к роли обосновывать тип. Центы или ноль, а управляет главной развилкой качества банка. - Второе мнение по архитектуре глав: другая модель ревьюит сведённый банк, её несогласия — ОТДЕЛЬНОЙ колонкой в подписной таблице, а не автоматическим решением. Это отложенный судья в роли рецензента; ограничение D39.46 («слепой судья годен как экран, не как ранжировщик») не бьёт, потому что решает владелец. Цена: порядок первого прохода ($0.013) на дешёвой модели.
- Показать владельцу ось решения для термов с расхождением (75 из 150): два полюса — транскрипция против смысла — рядом.
- Эксперимент «язык промптов» (гипотеза владельца 31.07, строка 30в бэклога): арм A ru / арм B en при НЕИЗМЕННЫХ инъекциях (иначе меряются два фактора), метрика — детерминированные счётчики следования формату (
parse_fail,off_language,bad_lines, битый разделитель), судья не нужен. Двусторонний риск: английский промпт на zh→ru может тянуть выход в английский — прибор есть (off_language, базлайн 0 из этого прогона). Зона полигона, ≈$0.02–0.05. - Рефакторинг формата в шаблон (§5 п.4) — вместе с любой следующей правкой промптов, одной оплатой.
§7. Что прогон НЕ ответил
- Полная цена холодного старта до конца — edit-волна не гонялась (сессия закрыта решением владельца). Измерены все стадии ДО редактуры.
- Авто-режим флага — проект Б не запускался.
- Оси голоса A–D —
gates.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 чанках предъявлен строками, но я не проверял, воспроизводится ли класс «таблица целиком на целевом языке» на другой книге/паре.- Не проверено адверсариально: моё же утверждение «чанк-путь есть строгое подмножество книжного» держится тестом на двух чанках, а не доказательством на реальном разбиении.