textmachine/docs/experiments/14-quality-empirics.md

243 lines
46 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Эксперимент 14. Эмпирика рычагов качества zh→ru (нарезка × ПРОМПТ + фронтир-диагностика + кривая нарезки)
> **Статус:** полигон-сессия exp14 (D36, приоритет №1). Мандат — `docs/POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md` + D35/D36. Пре-скрин планки «2 претензии владельца» (ИНТЕРИМ, D35 — НЕ пилот Ф2.5). Смену дефолта ратифицирует ОРКЕСТРАТОР (D-блоком) — не эта сессия.
> **Зона:** `eval/` + этот файл + секция PROGRESS «Полигон» + курация глоссария (вне git). Бэкенд не трогаю (2 живые сессии; `git status` перед касанием дерева; стейджинг не нужен — не коммичу код).
> **Артефакты:** сэмплы/выходы/сырьё судей — `/home/ubuntu/books/gu-zhenren/exp14/` (ВНЕ git; в доке — только числа и цитаты ≤15 слов). Каждый платный скрипт персистит usage/cost (D30.10). Полигонное Python-зеркало ↔ Go: при расхождении верить Go.
---
## 0. Онбординг-факты (контракт, на которых стоит дизайн)
- **Триггер (D35):** пере-прогон 25 глав связкой (draft `deepseek-v4-flash` `v1-reflow` → editor `glm-5` `v2-bilingual-reflow` + сид v2 + reflow + санитайзер) → вердикт владельца **«лучше (из-за сида), но крайне слабо художественно»**: (1) нет логической редактуры абзацев / конвенций РЯ; (2) места, где модель не понимает связей/смысла. Диагноз «Ф2-недострой + near-term рычаги, НЕ баг» верифицирован исполнением.
- **Ключевая невыжатая ось (D35.3):** exp04/12/13 крутили только МОДЕЛЬ в фикс-нарезке с уже-вшитым reflow-промптом. **exp14 крутит нарезку × ПРОМПТ.**
- **Вход-ресёрч (D36):** `research/18-quality-levers.md` (Claude, ACCEPT_WITH_FIXES) + `research/18-quality-levers-chatgpt.md` (ACCEPT). Скелет протокола — из ChatGPT §C; содержание дискурс-reflow-промпта (5 техник Ван Цуй) + COGS-модель — из Claude §C. §A обоих заморожены до чтения стека; вывод «потолок скорее в ОРГАНИЗАЦИИ (нарезка/промпт/контекст), не в сырой дешёвой модели» — гипотеза к ЗАМЕРУ, не факт.
- **Механизм-как-есть** (`backend/prompts/{translator,editor}.md`, `chunker.go`): по-чанково draft → по-чанково bilingual edit; каждый чанк в ИЗОЛЯЦИИ; единственная кросс-чанк-память — глоссарий. Обе reflow-инструкции ПРИСУТСТВУЮТ в промптах и практически ИНЕРТНЫ (замер: медиана 1 предл./нарратив-абзац, ниже §1.3).
- **Провайдер-квирки (`experiments/00-provider-quirks.md`, обязательно):** deepseek thinking ON ВСЕГДА (эхо-мина; `disabled`→эхо на плотном CJK); gemini слаг ТОЛЬКО `gemini-3.1-pro-preview`, mandatory thinking, `additive_total`-биллинг, `PROHIBITED_CONTENT` неконфигурируем; grok reasoning-ON = аддитивный биллинг, **grok на архаичной ch1 — эхо-риск D22.5 (исключён из ch1-армов)**; glm thinking `{type:disabled}`; gpt-5 — `max_completion_tokens`, без `temperature`, `reasoning_effort`.
- **Уроки судейского слоя (exp12/13, мемо `eval-aggregation-no-manufactured-convergence`):** ложная «сходимость» ловилась ДВАЖДЫ. Судьи span-цитирующие, reasoning-ON, стиль/верность РАЗДЕЛЬНО, кросс-семейно (author≠reviewer, self-family exclusion), ≥3 повтора со свапом, leave-one-judge-out, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, per-call кап (НЕ group-level — exp13 переоврал +10%). НИКОГДА не гейтить художественность на BLEU/COMET (zh→ru инверсия WMT24).
- **Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — гоню ПАРАЛЛЕЛЬНО, независимо** (§3 ниже). Пере-прогон НЕ засчитан до пройденного re-gate.
- **Харнес-факты (реплика eval/):** call-ядро — `refusal_bench.call_provider` (`eval/refusal_bench.py:151`); usage→$ с тремя reasoning-режимами `subset`/`additive`/`additive_total` (`exp13_translate.py:106`, ветвление по `models.yaml reasoning:`); цены — `backend/configs/models.yaml` (единственный источник, `prices_checked 2026-07-10`); токенайзеры — `tokenizers.Tokenizer.from_file` (`glm-4.6`, `deepseek-v3.2` присутствуют; `deepseek-v4`/`kimi-k2` — БЕЗ `tokenizer.json`, использую `deepseek-v3.2` как прокси BPE-семейства); реконструкция инъекции — `retrieval_state.injected_ids` + `exp12_blocks.py` (боевой блок не персистится, детерминированно пересчитывается); блайнд — seeded-shuffle + отдельный ключ-файл (`exp13_monitor.py`).
---
## 1. ПРЕ-РЕГИСТРАЦИЯ (заморожена коммитом ДО первого платного вызова — D30.10)
Всё в §1 зафиксировано до генерации армов и оценки. Промпты армов ЗАМОРОЖЕНЫ — никакого промпт-инжиниринга по ходу (урок exp04: сломанная слепота однажды уже дала дефолт-редактора). Path-scoped коммит: только этот файл.
### 1.0. Материал
**Срез:** те же 25 глав пере-прогона (`rerun/records.json`, 57 чанков; `source`/`draft`/`final`/`disposition`/флаги). Char-длины (замер): `source` min/медиана/max = **8 / 1639 / 1812**; `final` = **0 / 5015 / 6184** (0 = 2 обнулённых чанка).
**Исключено (экспорт-баг D35.4a):** **ch5.0 и ch20.0** — единственные `edit_flag='sanitizer_defect'`, `final`-длина = 0 (финалы пусты, спутают оценку). Если нужен их текст — edit-выход из checkpoints store (тело цело, дефект = ведущий `###`). ch16 — единственный `escalated=1` (эхо-эскалация flash→pro, RESCUED).
**1.0.1. Trap-набор (Ступень I — ЛОВУШКИ, размечены ДО генерации).** Поля `тип`/`chapter.chunk`/`supporting_span`(zh)/опустимый_смысл`/`P0-наблюдение`/`гейт`. Обязательны 2 места владельца (T1/T2, воспроизведены оркестратором фактически; входят и в fidelity re-gate).
| ID | Тип | ch.chunk | supporting_span (zh, ≤15 слов) | допустимый_смысл | P0-наблюдение (пере-прогон) | Гейт-класс |
|---|---|---|---|---|---|---|
| **T1** | (c) внутри-чанк, **КАТАСТРОФА** | 7.0 | `古月族人没有一个不知道的` | все/каждый в роду Гуюэ ЗНАЛИ это предание (двойное отрицание = «нет ни одного, кто не знал») | «не знал в роду Гуюэ **ни один человек**» = НИКТО не знал — **инверсия полярности** (дефект в черновике, редактор НЕ починил) | любая инверсия участника/действия = дисквалиф. независимо от ранга |
| **T2** | (c) внутри-чанк + глава, chengyu | 8.0 (заглавие) + 8.1 | `物是人非` | контраст «вещи/места прежние — люди уже не те» (物是 «вещи те же» + 人非 «люди иные») | заглавие гл.8 и тело → «**Всё изменилось**» — сплющено, потерян контраст 物是 | потеря смыслового атома (половина идиомы) |
| **T3** | (a) абзацы (нарратив-слияние) | 10.0 | прогон подряд идущих однопредложенческих нарратив-строк (один непрерывный ход) | слить в ≤2 многопредложенческих русских абзаца | ~1:1 строка→абзац (43 строки → 43 абзаца; reflow добавил разделители, НЕ слил) | нельзя «побеждать» только МЕНЬШИМ числом абзацев |
| **T4** | (b) диалог-конвенция (**КОНТРОЛЬ/регресс-гард**) | 9.0 | обмен репликами 1:N (слова автора + реплики дядя/тётя/Фан Чжэн) | реплики с «—», слова автора в своём абзаце (Розенталь) | P0 в целом **КОРРЕКТНО** (диалог-тире работает; атрибуция на месте) | арм НЕ должен СЛОМАТЬ то, что P0 сделал верно |
| **T5** | (d) кросс-граница, **prev-supported** | 24.0→24.1 | 24.1 откр.: `这当然不是他的肌肤本色,而是一种铜皮蛊的效果` | «это [бронзовый цвет кожи наставника, описан в 24.0] — не природный, а эффект гу медной кожи» | chunk-изолированный редактор 24.1 не видит антецедент «这/他的» (в 24.0) | perturbation: correct-prev vs shuffled-prev не должен совпасть |
| **T6** | (d) кросс-граница, **prev-supported #2** | 11.0→11.1 | 11.1 откр.: `那隐藏在暗处的人马,见到沈翠这般出来` | «те, кто прятался в засаде [люди舅父/舅母, введены в 11.0], увидев так вышедшую Шэнь Цуй…» | «那…人马» без введения в изолированном 11.1 | perturbation (как T5); prev-support робастность |
**Оговорка (честная):** чистого **next-supported / катафора**-трапа в раннем срезе (гл.225, ранняя арка деревни) не нашлось дёшево — кросс-граница здесь prev-доминирована (T5/T6). Next/chapter-support факторизуется частично: T2 несёт chapter-supported измерение (полный вес 物是人非 раскрывается сменой отношений братьев по главе), gl.7-легенда (T1) полно рассказана в гл.13. Ограничение логирую; ±1-абляция next-плеча всё равно гонится (может не дать лифта на этих трапах — это валидный результат).
**1.0.2. Главы для Ступени II (слепое чтение владельца — 3 чистые главы разной диалого-плотности).** Отбор детерминированной формулой (как exp12 §1.1: `D` = доля символов внутри «“…”» от не-пробельных; high/mid/low), из **чистых** глав (все чанки `disposition=ok`, `postcheck_miss=0`, `style_flags=0`, 0 flagged/escalated), исключая **ch1 (архаика), ch5, ch20**. Заморожены:
| Регистр | Глава | `D` (замер) | реализованный характер | чанков |
|---|---|---|---|---|
| нарратив/низкий диалог | **гл. 19** | 0.061 | почти без прямой речи | 2 |
| смешанный (медиана) | **гл. 17** | 0.246 | нарратив + диалог | 2 |
| диалого-плотный (high) | **гл. 18** | 0.440 | самая чистая высоко-диалоговая глава | 3 |
`D` — детерминированно (`exp14_material.py dialogue_D`, доля символов в «“…”»), $0 до генерации; при равенстве — меньший номер главы. Гл.9/12 плотнее по диалогу, но несут по 1 минорному `postcheck_miss`/`style_flag` → взяты чистые.
**1.0.3. Trap-чанки (Ступень I — все армы гоняются на этом объединении):** {7.0, 8.0, 8.1, 9.0, 10.0, 11.0, 11.1, 24.0, 24.1} = **9 чанков** (T5/T6 требуют обоих чанков главы для кросс-граничной опоры).
**1.0.4. Реконструкция глоссарий-инъекции (rig-фиделити, как exp12 A1).** Боевой блок инъекции НЕ персистится — детерминированная функция (сид v2 + нормализованный чанк). Воспроизвожу из `retrieval_state.injected_ids` (JSON-массив композит-ключей `src\x1fsense\x1fsince\x1funtil`) приёмочного store + `guzhenren-seed-v2.yaml` (57 терминов, 47 approved/10 draft, `status` гейтит):
- **Editor-блок** (`renderEditorConstraintBlock`): заголовок «КАНОНИЧЕСКИЕ ПЕРЕВОДЫ имён и терминов (…приводи к ним любые расхождения, склоняя по контексту…):», далее `- «dst»` (dst-only, CONFIRMED/approved-only, dedup по dst).
- **Translator-блок** (`renderGlossaryBlock`): заголовок «ГЛОССАРИЙ (…):», далее `src → dst`, ambiguous → суффикс `⟨проверить⟩`.
- Layout: `system(стабильный префикс, CacheBoundary) → system(инъекция) → user` (`render.go:174 MessagesWithInjection`). Верификация: реконструированный `injected_ids` побайтно = store per-chunk. Sticky-инерция (n_sticky) — union chunk0chunk1 внутри главы (как exp12).
### 1.1. Армы — ось НАРЕЗКА × ПРОМПТ (полный 2×2 — мандат D36) + аблации
Прямые вызовы, ручная упаковка (НЕ через прод-пайплайн). Дешёвый прод-микс (draft `deepseek-v4-flash` thinking-ON @temp 0.3 → editor `glm-5` билингв @temp 0.4, thinking-disabled) — якорь. Brief-vars из `rerun/book.yaml`: source_lang=zh, target_lang=ru, genre=вебновелла, audience=взрослые читатели вебновелл, title=蛊真人, honorifics=keep, transcription=palladius, **venuti=0.6**, footnotes=minimal. floor `max_tokens`=8000 (D24.3). Черновик держу общим для editor-армов (варьируем editor-стадию), кроме армов, где нарезка/промпт меняет и черновик.
| Арм | Нарезка | Промпт (editor) | Черновик | Смысл | Источник/цена |
|---|---|---|---|---|---|
| **P0 baseline** | чанк (прод 1.5k) | ТЕКУЩИЙ прод `v2-bilingual-reflow` | flash `v1-reflow` | Нулевая точка обеих претензий (= пере-прогон на trap-наборе) | **`records.json` reuse, $0** (rig-фиделити A1) |
| **P1a** | чанк | **сильный дискурс-reflow** (§1.2) | тот же flash-draft | Промпт-рычаг при фикс-нарезке | glm-5 live |
| **P1b** | **глава целиком** | ТЕКУЩИЙ прод | flash-draft главы (склеен) | ⚠ ячейка, которую НИ ОДИН отчёт не крутил — «бо́льшая единица САМА помогает без нового промпта?» | glm-5 live |
| **P1c** | глава целиком | сильный дискурс-reflow | flash-draft главы | Верхняя near-term точка нарезка+промпт | glm-5 live |
Аблации (на базе P1a, чанк-нарезка; ChatGPT §C2):
- **A-layout — draft-layout ablation:** перед editor заменить пустые строки/построчную разбивку draft на нейтральные сепараторы ИЛИ пронумерованные смысловые атомы (финал удаляет ID) → изолирует ЯКОРЕНИЕ редактора на форме черновика. Победа = дешёвый ПРОД-МИНОР (не менять нарезку).
- **A-2pass — semantic-first vs combined:** один combined-editor (=P1a) против двух узких пассов (билингв семантика-репэйр → target-only литературный reflow) под ОДНИМ coverage-гейтом → снимает конкуренцию мандатов; замерить реальный output-множитель (≤~2× editor-output).
- **A-ref-prev / A-ref-next / A-ref-both — ±1 reference-контекст:** пред-source+пред-target хвост / след-source-абзац до границы сцены / оба, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`. **Три РАЗДЕЛЬНЫЕ абляции** (не сливать). Цель — кросс-граница (T5/T6), нулевые подлежащие, катафора. Только на чанках с кросс-граничными трапами (11.*, 24.*).
### 1.2. Сильный дискурс-reflow промпт — ЭТО АРМ ДЛЯ ЗАМЕРА (не «оптимальный промпт»)
Ядро (Claude §C1#1 + ChatGPT §C3; содержание zh→ru — из Ван Цуй, Вестник МГУ Сер.22, прескрипция ТЕХНИКИ; норму держат Розенталь/Правила-1956). Добавляется к editor.md-мандату (не заменяет сверку смысла/полноту/глоссарий):
1. Молча определи смысловые ходы: единый фокал/наблюдатель; действие + непосредственная реакция; одна тема рассуждения; смена говорящего/времени/места/фокала.
2. Один повествовательный ход — обычно один русский абзац, ДАЖЕ если китайский разбит на однофразовые строки (паратаксис→гипотаксис). Инструмент слияния — **причастные/деепричастные обороты + подчинительные союзы/связки** (5 техник Ван Цуй: иерархия → сегментация по смыслу → маркировка вида/времени предиката → варьирование лексики → добавление связок). Не сливать ТОЛЬКО ради длины.
3. Каждая реплика — с нового абзаца через тире; слова автора при той же реплике — в её абзаце (Розенталь).
4. Разрешено объединять/делить русские предложения; ЗАПРЕЩЕНО терять смысловые атомы (число предложений/абзацев совпадать не обязано).
5. `REFERENCE`-блоки — только для разрешения связей; не переводить/не пересказывать в выходе.
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь, ≤3). **Для DeepSeek-thinking (если гоню его переводчиком/редактором с дискурс-промптом) — сначала zero-shot против few-shot** (модель-специфика research/15; не переносить между моделями); ручной verbose CoT reasoning-модели НЕ добавлять. Точный текст промпта и few-shot — в `eval/exp14_prompts.py`, sha256 фиксируется в §2 при заморозке армов.
### 1.3. Фронтир-арм — ДИАГНОСТИКА потолка (capability-vs-activation)
**2×2 (первичный):** держу ЧЕРНОВИК константным (дешёвый flash-draft, общий), варьирую EDITOR × промпт:
| | baseline-промпт | дискурс-промпт |
|---|---|---|
| **дешёвая** (glm-5) | = P0 (reuse $0) | = P1a |
| **фронтир** (gpt-5.4) | F-base | F-disc |
Разводит: фронтир верстает/чинит, дешёвая нет → **gap способности**; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → **активация**. Плюс **спот-чек фронтир-как-ПЕРЕВОДЧИК** на T1/T2 (2 fidelity-трапа): избегает ли сильный ЧЕРНОВИК инверсии gl.7 в принципе (потолок на translate-стадии vs edit-стадии).
**Фронтир (слаги live-фактчекнуты 2026-07-11, /models):** **gpt-5.4** — ОСНОВНОЙ (OpenAI ~$9; standard-тир, не pro); **gemini-3.1-pro-preview** — ЭКОНОМНО, преим. кросс-семейный мета-ревьюер (остаток €2.6, output $12/M+thinking = быстро сгорит); **grok-4.3** — доп, но **НЕ на архаичной ch1** (D22.5, эхо-риск) — в exp14 ch1 и так исключена; **НЕ Claude/Opus** (нет ключа). Мета-ревьюер — **self-family exclusion** (если Gemini переводил/редактировал — мета-ревьюер GPT, и наоборот; span-цитаты: где ломается смысл + какой механизм чинит).
**Гарды:** эхо/refusal-скрин на ВСЕХ выходах; **per-call predicted-cost кап ДО вызова** (НЕ group-level); пре-регистрация армов заморожена коммитом.
### 1.4. Кривая размер-чанка ↔ качество ↔ биллинг ↔ ретраи
- Размеры **0.75k / 1.5k / 3k / глава** × **две политики границ** (жадная упаковка | сцен/дискурс-граница) при сопоставимом бюджете (иначе размер спутается с качеством границ).
- **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе** (кириллица-фертильность ~22.5×, Petrov NeurIPS 2023; `glm-4.6`/`deepseek-v3.2` токенайзеры). Оптимизировать на **retry-adjusted output-cost**; связность давать кэшированным carryover, НЕ размером единицы.
- **Cache-ordering:** статику (system+glossary) ПЕРВОЙ, volatile (running summary/reference) ПОСЛЕ — иначе кэш бьётся.
- Снимать (пре-рег): in/out/**reasoning**-токены, латентность, **retry-rate ПО ПРИЧИНАМ** (timeout/refusal/length/echo/sanitizer/decode — РАЗДЕЛЬНО), **доля ПОВТОРНО ОПЛАЧЕННЫХ токенов** (не только retry-rate — урон одного крупного сбоя), coverage, слепое предпочтение, KPI-абзацы, trap-теги.
### 1.5. Метрики и гейты — ПРЕ-РЕГИСТРИРОВАНЫ (C4 ChatGPT + §C10 Claude)
| Ось | Первичный показатель | Аварийный гейт |
|---|---|---|
| Претензия 1 (абзацы) | **детерминированный структурный KPI БЕЗ судьи**: распределение предложений/нарратив-абзац (P0-baseline замер `exp14_material.py`: **медиана 1.0, среднее 1.701, доля 1-предл. абзацев 0.579**, n=1378 нарратив-абзацев/55 чанков) + слепое чтение | нельзя «побеждать» только МЕНЬШИМ числом абзацев (парно с atom-coverage) |
| Претензия 2 внутри-чанк | билингв span-цитирующая trap-accuracy (обязательный `supporting_span`) на T1/T2 | любая инверсия действия/участника (T1) = КАТАСТРОФА независимо от среднего ранга |
| Претензия 2 кросс-граница | accuracy РАЗДЕЛЬНО prev-/next-/chapter-supported (T5/T6 prev) | **perturbation:** correct-context vs random/shuffled НЕ должен дать тот же результат (иначе контекст не используется — Mohammed&Niculae) |
| Полнота | покрытие смысловых АТОМОВ (не совпадение числа предложений) | пропуск заголовка/события дисквалифицирует арм на фрагменте |
| Операционность | `$`, in/out/reasoning-токены, латентность, retry-по-причинам, **повторно-оплаченные токены** | per-call predicted-cost кап; НЕ group-level |
| Робастность | leave-one-judge-out + отдельный катастроф-скрин | коррелированные колонки одного судьи ≠ независимые сигналы |
**НИКОГДА не гейтить художественность/связность на BLEU/COMET** (zh→ru инверсия WMT24). Судьи: span-цитирующие, reasoning-ON, верность/стиль РАЗДЕЛЬНО, кросс-семейно (self-family exclusion), ≥3 повтора со свапом, parse-чек полноты ранжирования. Судьи-модели: `gemini-3.1-pro-preview`, `gpt-5-mini`, `kimi-k2.6` (кросс-семейно к переводившим glm-5/deepseek/gpt-5.4/mistral — семья судьи ≠ семья арма для каждого трапа).
### 1.6. Заморожённая таблица моделей/цен (единый источник `models.yaml`; фронтир — live-фактчек 2026-07-11)
| модель | in $/1M | out $/1M | cached-in | reasoning-режим | роль в exp14 |
|---|---|---|---|---|---|
| deepseek-v4-flash | 0.14 | 0.28 | 0.0028 | subset (thinking ON) | черновик (общий) |
| deepseek-v4-pro | 0.435 | 0.87 | 0.003625 | subset | эскалация черновика |
| glm-5 | 1.0 | 3.2 | 0.2 | subset (thinking disabled) | editor (дешёвый прод-якорь) |
| grok-4.3 | 1.25 | 2.50 | 1.25 | additive (reasoning-ON) | доп-фронтир (НЕ ch1) |
| gemini-3.1-pro-preview | 2.0 | 12.0 | 0.20 | additive_total (mandatory) | судья / кросс-семейный мета-ревьюер (экономно) |
| gpt-5-mini | 0.25 | 2.0 | 0.025 | subset | судья (second-opinion) |
| **gpt-5.4** | **2.50** | **15.0** | **0.25** | subset (reasoning⊆completion) | **ОСНОВНОЙ фронтир** (live 2026-07-11: `gpt-5.4-2026-03-05`; pricing developers.openai.com — gpt-5.5/5.6=$5/$30, 5.5-pro=$30/$180 → дорого, взят 5.4) |
| kimi-k2.6 | 0.95 | 4.0 | 0.16 | subset (temp=1, floor 16k) | судья |
| mistral-large-2512 | 0.5 | 1.5 | 0.5 | subset (не reasoning) | доп-фронтир/канал-B справка |
usage→$: `(in·pin + (comp + reason)·pout)/1e6`; `reason`= из `completion` (subset), отдельного поля (additive/grok), либо `totalpromptcompletion` (additive_total/gemini). Fallback-якорь неизвестной модели — цена `deepseek-v4-flash` (никогда $0).
### 1.7. Бюджет по ключам + per-call кап (обязателен ДО каждого платного вызова — exp13 +10%)
Бюджеты владельца (D36.1): OpenAI ~$9, Gemini ~€2.6 (крошечный — беречь), DeepSeek/ZAI/Kimi/xAI/Mistral ~$9 каждый. Отдельный owner-`ceiling` не нужен — работаю в остатках. Заканчивается ключ → останавливаюсь на нём, не блокирую остальные армы. Near-term дешёвые армы — ПЕРВЫМИ; фронтир GPT — основная фронтир-статья; Gemini — точечно.
**Оценка трат (замерю точно; предельные, не group-cap):**
- ZAI (glm-5 editor-армы): P1a/P1b/P1c + 5 аблаций + Stage-II + кривая ≈ ~$0.0150.02/чанк-edit; ~$1.52.5 суммарно (кап на вызов **$0.08**).
- DeepSeek (flash re-drafts для нарезки/главы): ~$0.001/чанк; <$0.3 (кап **$0.03**).
- OpenAI (gpt-5.4 фронтир 2×2 + translate-спот-чек): ~11 чанков × 2 cells + 4 спот ≈ ~$2 (кап на вызов **$0.40**).
- Gemini (судья/мета-ревьюер, output $12/M): держать <$1 экв. (кап **$0.30**); ре-джадж на gpt-5-mini/kimi если жжётся.
- Kimi/OpenAI-mini/… (судьи): ~$12 суммарно (кап **$0.20**).
- xAI (grok доп-фронтир, опц.): ≤$1 (кап **$0.40**), НЕ ch1.
- **Итог-цель ≈ $58 суммарно, глубоко в остатках.** Финальная сумма по ключам — в §2.
`predict_cost(model, in_est, max_out)` = `in_est·pin + max_out·pout` (in_est из токенайзера/char-эвристики; max_out = потолок `max_tokens`); отказ ДО вызова, если > кап модели. Каждый вызов персистит usage/cost в append-only JSONL немедленно (не батчить), running `spent` per-key.
### 1.8. Дерево решений (пре-рег, ChatGPT §C5)
- **P1a закрывает абзацы БЕЗ падения fidelity** → катить дискурс-промпт, размер НЕ менять.
- **Помогает только A-layout** → строить deformat/atom-rendering, не chapter-editor.
- **±1 reference (A-ref-*) закрывает большинство кросс-граничных traps** → строить малое context-window до Ф2-памяти.
- **Нужна chapter-card, но whole-chapter НЕ лучше** → Ф2 state-extraction.
- **Whole-chapter (P1b/c) выигрывает по fidelity И абзацам И retry-adjusted COGS** → проектировать per-stage гранулярность (повторить на длинной главе).
- **Фронтир выигрывает ОБЕ ячейки 2×2, организация почти не помогает** → **model floor** (не строить сложную память ради слабой модели).
- **Организация помогает ОБЕИМ, фронтир+организация даёт доп-лифт** → развести near-term context-fix и премиум-тир.
### 1.9. Гарды сессии
Слепота свята; пре-рег заморожен после коммита (промпты армов — sha256 в §2); аномалии провайдеров → вендор-дока + `/models` (не гадать); `.env` не читать; тексты книги в git-доки не тащить (≤15 слов); 18+ регистров в раннем срезе нет (перенос на 18+ — отдельная проба D22/exp10-11). Методика-guard (мемо `eval-aggregation`): fidelity-first агрегация, leave-one-out по судьям, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, независимость сигналов до агрегации, ось решения (near-term-достаточность vs потолок-моделей). Git-координация: `git status` + опознание чужого перед касанием дерева; чужое не трогать; никаких reset/rebase/checkpoint-перезаписей.
---
## 2. Результаты (пост-freeze; ПАРТИЯ 1 — near-term армы + фронтир 2×2, на trap-наборе)
> **Статус партии 1:** прогнаны P0/P1a/P1b/P1c + аблации (A-layout/A-2pass/A-ref-prev/A-ref-both) + фронтир 2×2 (F-base/F-disc, gpt-5.4) на 9 trap-чанках. **0 ошибок на 64 арм-вызовах.** Трата: ARM ZAI $0.43 + OpenAI $1.34 = **$1.77**; trap-судьи (gpt-5-mini+kimi) ~$0.14; итого ≈ **$1.91** (глубоко в остатках). Медиана латентности: glm-5 35с, gpt-5.4 37с.
> **ПАРТИЯ 2 (не в этой партии):** кривая нарезки, слепые пакеты Ступени II владельцу, полная ранжирующая панель ≥3 повтора + leave-one-out, fidelity re-gate, 3 финалиста, хендофф оркестратору.
> **Заморожённые промпты армов (sha256[:16]):** editor_baseline `ca03a921df5db728` · editor_discourse `b3b4f6042e8c5673` · discourse_core `ec86a5623e3c6f02` · fewshot `d8f204cc4550ee99` · translator `a8298f725a3b2844`. **Stage-II `D`:** гл.19=0.061 / гл.17=0.246 / гл.18=0.440.
### 2.1. Претензия 1 (абзацы) — детерминированный структурный KPI (trap-набор, 9 чанков)
| Арм | нарезка×промпт | mean предл./нарратив-абзац | доля 1-предл. | CJK-утечка | len/P0 | gloss |
|---|---|---|---|---|---|---|
| **P0** | чанк × прод-baseline (glm-5) | 1.91 | 0.472 | 2 | 1.00 | 0.94 |
| **P1a** | чанк × дискурс (glm-5) | 2.61 | 0.318 | 2 | 0.99 | 0.93 |
| **A-2pass** | чанк × семантика→target-reflow (glm-5) | **3.33** | **0.187** | 2 | 0.99 | 0.93 |
| **A-layout** | чанк × дискурс + deformat-draft (glm-5) | 3.13 | 0.215 | **39 ⚠** | 1.00 | 0.93 |
| **A-ref-prev** | чанк × дискурс + ±1 prev (glm-5, 2 чанка) | 2.75 | 0.196 | 0 | 1.00 | 0.85 |
| **F-base** | чанк × прод-baseline (**gpt-5.4**) | **1.58** | **0.584** | 0 | 1.03 | 0.93 |
| **F-disc** | чанк × дискурс (**gpt-5.4**) | 2.45 | 0.369 | 0 | 1.02 | 0.93 |
**Вывод П1 — абзацы = ПРОМПТ/ПАЙПЛАЙН-рычаг, МОДЕЛЬ-агностичный:**
- Дискурс-промпт двигает распределение к русской норме на ОБЕИХ моделях (P1a 2.61, F-disc 2.45 vs baseline ~1.61.9). **Фронтир с ТЕКУЩИМ промптом (F-base 1.58) — ХУЖЕ дешёвого baseline (P0 1.91):** сильная модель зеркалит построчность черновика ещё вернее — «сильнее модель» само по себе абзацы НЕ чинит.
- **Сильнейший near-term рычаг П1 — A-2pass** (билингв семантика → отдельный target-only литературный reflow-пасс): mean 3.33, доля-1-предл. 0.187, БЕЗ коллапса длины (len/P0 0.99) и БЕЗ CJK-утечки. Подтверждает DocRepair-класс (отдельный монолингв. RU reflow-пасс) на дешёвой модели. Цена — ~2× editor-output (замерено: 18 вызовов на 9 чанков).
- **A-layout (deformat черновика) — НЕ чистая победа:** улучшает абзацы (3.13), но **CJK-утечка 39 симв. (×20 vs baseline)** — снятие построчной формы у glm-5 провоцирует эхо-осколки исходника. Регресс-гард сработал (детерм. KPI поймал). Deformat на дешёвой модели требует CJK-пост-гарда — не катить as-is.
### 2.2. Претензия 2 внутри-чанк (T1/T2) — capability floor
**T1 (gl.7 `古月族人没有一个不知道的`, двойное отрицание = «все знали») — КАТАСТРОФА-класс, детерм. читаемо:**
| Арм | рендер | вердикт |
|---|---|---|
| P0 (glm base) | «не знал в роду Гуюэ ни один человек» | ✗ ИНВЕРСИЯ (никто) |
| P1a (glm disc) | «в роду Гуюэ не знал ни один человек» | ✗ ИНВЕРСИЯ (промпт НЕ починил) |
| F-base (gpt-5.4 base) | «не знал разве что мёртвый» | ✓ ВЕРНО (все знали) |
| F-disc (gpt-5.4 disc) | «не было ни одного, кто бы его не знал» | ✓ ВЕРНО |
**Дешёвая модель инвертирует полярность НЕЗАВИСИМО от промпта; фронтир чинит НЕЗАВИСИМО от промпта → это МОДЕЛЬ-потолок, не активация.** T2 (`物是人非` chengyu): P0/P1a сплющивают («всё изменилось»); F-base улучшает («стало совсем не тем, что прежде» — восстанавливает 人非-контраст). Тот же знак: фронтир-редактор ловит смысловой дефект черновика, дешёвый — нет.
### 2.3. Претензия 2 кросс-граница (T5/T6) — слабые трапы в этом срезе
- **T5 (ch24.1 `这…铜皮蛊`): все армы рендерят локально-когерентно** («это не природный цвет кожи, а эффект гу Медной кожи») — предложение самодостаточно, chunk-изоляция его НЕ ломает. **A-ref-prev дал БАЙТ-идентичный P1a выход** (prev-контекст ничего не изменил — чинить было нечего).
- **P1c (глава целиком) на T5 — единственный, кто ЯВНО связал антецедент:** «Как у этого наставника: вся его кожа бронзового цвета» — склеив 24.0+24.1, редактор соединил «этого наставника» ↔ бронзовую кожу (chunk-изолированные оставляют висячее «его»). Один датапоинт: **whole-chapter даёт кросс-граничный лифт связывания**, но на этом срезе кросс-граница — НЕ доминирующий сбой (в отличие от within-chunk T1).
- Честно (пре-рег-оговорка): next-supported/катафора-трапа в раннем срезе нет; вывод по кросс-границе — предварительный (2 prev-трапа, локально самодостаточные).
### 2.4. Capability-vs-activation — прямой ответ на вопрос владельца
**Потолок РАСЩЕПЛЁН по двум претензиям — не «модели ИЛИ организация», а «каждая претензия — своё»:**
| Претензия владельца | Где потолок | Доказательство (партия 1) | Near-term ход |
|---|---|---|---|
| **(1) абзацы / конвенции РЯ** | **наша ПРОМПТ/ПАЙПЛАЙН** (активация) | дискурс-промпт двигает KPI на обеих моделях; F-base (фронтир+старый промпт) ХУЖЕ P0; A-2pass (дешёвый 2-пасс) — лучший (3.33) | катить дискурс-промпт + отдельный target-only reflow-пасс на ДЕШЁВОЙ модели |
| **(2) понимание связей внутри-чанк** | **дешёвая МОДЕЛЬ** (capability) | T1 инверсия: glm-5 фейлит обе промпт-версии, gpt-5.4 чинит обе; T2 то же | селективная фронтир-эскалация редактора на смысл-риск ИЛИ фронтир-редактор; промпт НЕ закрывает |
| **(2) связи кросс-граница** | не доминирует в срезе; whole-chapter даёт лифт | A-ref null (локально самодостаточно); P1c связал антецедент | НЕ строить сложную Ф2-память под слабый сигнал; whole-chapter/edit=глава — кандидат под ROI |
### 2.5. Судейская корроборация (trap-accuracy, кросс-семейно — ПАРТИЯ 1, идёт)
*(панель gpt-5-mini + kimi, self-family exclusion, span-цитаты; идёт на момент записи — свод фолдится сюда. Детерм. ридинг T1/T2 (§2.2) — объективная полярность/атом, судьи корроборируют. Методика-guard: НЕ собирать ложную сходимость; T1-катастрофа держится на детерм. полярности, не на среднем ранге.)*
### 2.6. Дерево решений — резолюция партии 1
- **P1a закрывает абзацы БЕЗ падения длины/атомов** ✓ → **катить дискурс-промпт, размер НЕ менять** (ветка 1 подтверждена). **Сильнее — A-2pass** (target-only reflow-пасс) — рекомендация near-term №1 по П1.
- **A-layout (deformat) улучшает абзацы, НО CJK-утечка** → deformat/atom-rendering строить ТОЛЬКО с CJK-пост-гардом (иначе регресс).
- **±1 reference НЕ дал лифта** (трапы локально самодостаточны) → малое context-window до Ф2 под этот срез НЕ обосновано; пере-проверить, когда/если появятся next-supported/катафора-кейсы.
- **Whole-chapter (P1c) дал кросс-граничный лифт связывания (1 датапоинт) но НЕ выиграл абзацы у A-2pass** → chapter state-extraction — кандидат под ROI, НЕ near-term приоритет.
- **Фронтир чинит within-chunk смысл, организация — нет (T1)** → **model floor на претензии 2-внутри-чанк**: дешёвый трек её НЕ дотянет промптом; ход — селективная фронтир-эскалация редактора по смысл-риску (не тотальный фронтир — F-base абзацы даже портит).
### 2.7. Предварительная near-term рекомендация (на ратификацию оркестратора — НЕ смена дефолта этой сессией)
1. **Претензия 1 (абзацы):** внедрить **дискурс-reflow-контент (Ван Цуй 5 техник + Розенталь) в editor-промпт** — дёшево, модель-агностично, доказанный лифт (P1a); рассмотреть **отдельный target-only reflow-пасс** (A-2pass, лучший KPI) под COGS-замер (~2× editor-output — оценить на полной книге).
2. **Претензия 2 (смысл внутри-чанк):** промпт НЕ закрывает на дешёвой модели → **селективная фронтир-эскалация редактора по смысл-риску** (двойное отрицание/chengyu/инверсия черновика) — точечно, не тотально (тотальный фронтир портит абзацы и жжёт COGS). Квантификация — fidelity re-gate (§3) + партия 2.
3. **CJK-гард обязателен** при любом deformat-черновике (A-layout урок).
4. **НЕ строить** сложную Ф2-кросс-чанк-память под этот срез (сигнал слабый); whole-chapter/edit=глава — держать кандидатом под доказанный ROI.
**Оговорки (методика-guard):** trap-набор мал (6 трапов, prev-boundary, без катафоры); фронтир = 1 модель (gpt-5.4), Gemini/grok переводчиками не гонялись (бюджет/эхо); T1-вывод — 1 катастроф-датапоинт (но детерм.-чистый); срез — PD-смежная ранняя арка (без 18+); это ИНТЕРИМ пре-скрин (D35), НЕ вердикт пилота Ф2.5.
## 3. Fidelity re-gate (ПАРАЛЛЕЛЬНО, D34.3 — независим от §1-§2)
Span-цитирующий, reasoning-ON, раздельно стиль/верность, охота на КЛАСС ИНВЕРСИЙ редактуры (ch11/0 аутлайер: editor расширил 3009→4631, sim 0.064), катастроф-скрин терминов у победителя, author≠reviewer (не glm-5/deepseek), leave-one-out. Вход — `rerun/rerun-parallel.txt` (57 чанков, выровнено ОРИГ|ПЕРЕВОД) + `records.json`. **Пере-прогон НЕ засчитан до пройденного re-gate.** *(результаты — ниже, после прогона.)*