textmachine/docs/research/19-chunking-cohesion.md

854 lines
110 KiB
Markdown
Raw Permalink 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.

# research/19 — Логическая нарезка, меж-чанковая когезия, контракт t/e и дизайн эмпирики (трек B, D39)
> Сессия-ресёрчер, 2026-07-16. Промт: `docs/RESEARCHER_CHUNKING_COHESION_SESSION_PROMPT.md`.
> НЕ коммитится этой сессией — лендит оркестратор после верификации первоисточников.
>
> **Протокол независимости (анти-анкоринг, как research/18):** §A написан и заморожен sha256 ДО чтения
> стека проекта (код `backend/`, `docs/architecture/*`, `docs/experiments/*`, `docs/research/1-18`).
> Верификация заморозки (в команде `[ ]` = пробел — чтобы сама команда, процитированная здесь, не совпадала с маркером):
> `sed -n '/<!-- SECTION-A-FROZEN-BEGIN[ ]-->/,/<!-- SECTION-A-FROZEN-END[ ]-->/p' docs/research/19-chunking-cohesion.md | sed '1d;$d' | sha256sum`
> — хеш зафиксирован в примечании сразу после закрывающего маркера §A.
>
> **Поверхность заражения (декларация):** до заморозки §A сессия видела ТОЛЬКО (а) текст промта
> (он содержит сводку конфликта exp14 §2Б.4 vs research/18 §A Ось-4, факты полигон-синка, константу
> `targetChunkTokens=1500` и список ролей пайплайна) и (б) CLAUDE.md + MEMORY.md (онбординг-контекст).
> Ни один файл стека не открывался. Внешняя фактура §A добыта веб-ресёрчем этой сессии:
> 8 тем × fan-out + адверсариальная верификация несущих клеймов по первоисточникам (author≠reviewer:
> верификатор обязан был РЕФЬЮТИТЬ клейм по первоисточнику; вердикты CONFIRMED/OVERSTATED с коррекциями
> отмечены по тексту) + critic-раунд добора (CJK-примитивы, diff-контракт, методология, русские нормы).
<!-- SECTION-A-FROZEN-BEGIN -->
## §A — Независимое заключение (ЗАМОРОЖЕНО)
### A.0 Резюме в одно предложение
Конфликт «крупный чанк vs мелкий чанк» — ложная дихотомия, потому что слово «чанк» склеивает три
независимых параметра: **единицу эмиссии** (сколько модель порождает за вызов), **окно чтения**
(сколько она видит) и **единицу связности** (сцена/глава); правильный дизайн — детерминированная
нарезка по иерархии границ с оптимизационной упаковкой, мелкая-средняя эмиссия, широкое read-only
окно там, где проход этого требует, и когезия, подаваемая МЕХАНИЗМОМ (структурированный стейт +
замок терминов + carryover), а не размером единицы.
### A.1 Три размера вместо одного (разрешение центрального конфликта)
Внешняя эмпирика расщепляет конфликт по осям:
1. **Единица эмиссии — связывает раньше всего.** Качество длинной генерации падает задолго до
документированных лимитов output-токенов: у семи open-weight моделей — резкая деградация перевода
на 4k8k контекста с доминированием omission/under-translation (SEGALE, arXiv:2509.17249);
структурированная генерация: open-weight модели сыпятся уже на 2k output-токенов, GPT-4o заметно
деградирует на 8k (LongProc, arXiv:2501.05414); выровненные модели 2024 упирались в ~2000 слов
(LongWriter, arXiv:2408.07055); окно в 50 предложений теряло 10 предложений перевода при полном
исходнике на входе (DelTA, arXiv:2410.08143); paragraph-mode у Karpinska & Iyyer (WMT 2023,
aclanthology 2023.wmt-1.41) дал МЕНЬШЕ mistranslation/grammar/consistency-ошибок, чем sentence-mode,
но omission были ЗАМЕТНЕЕ (вердикт верификатора: в обоих режимах есть, в paragraph — чаще).
У doc-MT деградация концентрируется в ХВОСТЕ документа (position bias: поздние предложения
переводятся хуже; arXiv:2412.17592). → Выгода крупной единицы эмиссии съедается тихими потерями,
и потери смещены к концу чанка.
2. **Окно чтения — дешевле, чем кажется (кэш), но не бесплатно.** Все четыре провайдера пайплайна
кэшируют префикс запроса (официальные доки: Anthropic prompt-caching; OpenAI automatic caching;
DeepSeek context caching «hit» ~12% цены miss на live-странице июля 2026 — перепроверить перед
зашивкой в COGS; Gemini implicit caching), поэтому статичный префикс (система+глоссарий) почти
бесплатен при последовательной обработке. Но большое окно чтения не бесплатно по КАЧЕСТВУ:
на 2025-моделях деградация с ростом входа сохраняется (Context Rot, Chroma, 18 моделей, июль 2025),
и хуже всего — ассоциации с НИЗКИМ лексическим перекрытием (NoLiMa, arXiv:2502.05167: эффективная
длина GPT-4.1 ~16k при заявленном 1M), а кросс-язычный глоссарий/память — ровно этот режим.
→ Read-only контекст держать МАЛЫМ и СЕЛЕКТИВНЫМ, статику — в начало, чанк — в конец
(U-кривая Lost in the Middle, arXiv:2307.03172, скоуп — retrieval/QA, не генерация — не
овер-обобщать).
3. **Единица связности — не равна ни тому, ни другому.** 7% пар последовательных предложений,
хороших по отдельности, ломаются в контексте; из них дейксис 37%, эллипсис 29%, лекс. когезия 14%
(Voita et al., ACL 2019, P19-1116 — вердикт: CONFIRMED, ставка 7% от всех пар, не 8.5%).
Триггерящий контекст в тест-сетах — ≤3 предложения НАЗАД (дизайн-выбор сета, не природная
дистанция); наибольший прирост использования контекста даёт ПЕРВОЕ предыдущее предложение,
дальше — убывающая отдача, target-side контекст используется чуть сильнее source-side
(CXMI, Fernandes et al., ACL 2021 — вердикт OVERSTATED в части BLEU-дельт, направление
подтверждено). Катафора: ~16% местоимений в субтитрах — катафорические, ~37% из них разрешаются
СЛЕДУЮЩИМ предложением; +1 предложение вперёд давало измеримый прирост (Wong, Maruf & Haffari,
ACL 2020 — CONFIRMED). Длинные зависимости (имена/термины/титулы) закрываются не окном, а
ЗАМКОМ первого перевода: proper-noun record даёт +48.5пп консистентности имён на вебновелл-сете
(DelTA, GuoFeng) — а в вебновелл-домене именованные сущности + терминология = 62.5% document-level
ошибок (BWB, arXiv:2305.11142). → Когезию несут: carryover 13 предложения (билингвально,
target-side важнее), lookahead ~1 предложение вперёд, замок терминов, — а не рост единицы эмиссии.
**Следствие-развязка:** проходам, которым нужно «видеть много» (репараграфизация, сведение связей),
не обязательно «переписывать много»: они могут читать сцену/главу и эмитить компактные правки.
Наблюдение «крупнее чанк → лучше абзацы» объясняется шириной ОКНА ЧТЕНИЯ у reflow-решений, а
«держать чанк мелким» — рисками крупной ЭМИССИИ (ретрай-радиус, omission-хвост). Оба совместимы.
Это ПРОВЕРЯЕМОЕ утверждение, и эмпирика §D обязана его проверить, а не принять на веру.
### A.2 Что говорит внешняя фактура о САМОЙ нарезке
- **Семантик-чанкинг модель-вызовами не окупается.** Контролируемое сравнение fixed vs semantic:
преимущества нет на естественных документах, выигрыши только на искусственно склеенных корпусах
(arXiv:2410.13070 — CONFIRMED). LumberChunker (LLM-сегментация нарратива, arXiv:2406.17526 —
CONFIRMED) даёт +7.37% DCG@20, но retrieval-only и ценой LLM-вызовов на каждый документ. Вся эта
литература — RAG/retrieval; её метрики (recall/IoU) к последовательному полнопокрывающему переводу
неприменимы. → Ограничение владельца «границы без модель-вызовов» подтверждается как норма,
а не компромисс: индустрия сегментации (SRX, ICU-regex правила) сама детерминированная.
- **«Найти сцену» алгоритмически — нельзя рассчитывать.** Первый корпус сцен художки: BERT F1=24%
(Zehe et al., EACL 2021 — CONFIRMED); shared task STSS 2021: лучшие F1=37% in-domain / 26%
out-of-domain, у людей γ=0.7 (CEUR-WS Vol-3001 — CONFIRMED); NAACL 2025 follow-up: Llama-класс
задачу не решил. Вся линейка — одна research-группа (одна нога литературы). GraphSeg на
синтетике Pk 5.67.2, на естественных документах — ХУЖЕ рандома (Pk 63.56 vs 52.65; Koshorek
NAACL 2018 — CONFIRMED). → Дизайн, ЗАВИСЯЩИЙ от верной детекции сцен, построен на песке.
Правильная роль сигналов: поверхностные маркеры — высокоточные, когда есть; лексические долины —
только РАНЖИРУЮТ кандидатов возле бюджета; всё валидируется на СВОЁМ корпусе, не на Choi-бенчах.
- **Поверхностные конвенции доменов реальны и детектируемы.** en-фикшн: сцен-брейк = видимый токен
(#/***; Shunn manuscript format). ja-вебновеллы: пустые строки —ШУМ (просто читабельность каждые
510 строк), сцен-смена — выделенные разделители *◇◆■○ (Syosetu-гайды). zh-вебновеллы: главы
короткие (~25k иероглифов, «десять минут чтения»), конвенция 一句一段 (одно предложение — один
абзац) → абзацная граница ≈ границе предложения, слабый сигнал; 分割线-орнаменты встречаются.
Академической корпусной статистики по zh/ja вебновелл-форматированию НЕТ — только
практикумы/платформы (слабая нога; для нас это довод строить рантайм-ПРОФИЛЬ структуры, а не
зашивать конвенции). Для zh тема-сегментация работает на символьных биграммах БЕЗ словосегментации
и даже лучше словной (+8.84% F, TDT2 broadcast news; одна группа NWPU — одна нога) → Go-скорер
когезии на char-биграммах легитимен для zh/ja/ru единым кодом.
- **CJK-примитивы предложения — решённая задача с известными краями.** UAX #29: 。!? = STerm;
закрывающие 」』)" присоединяются к терминатору (SB9SB11: разрез ПОСЛЕ 「…。」, не после 。);
без терминальной пунктуации внутри абзаца дефолт НЕ даёт границы (SB998), граница абзаца/строки —
легальный последний рубеж (CONFIRMED по TR29 + UCD). Pure-Go база есть (clipperhouse/uax29,
Unicode 17, официальные тест-сьюты). Замер ja-сегментеров: у всех rule-based нулевые F1-классы
(эмодзи/каомодзи/переносы строк — ровно вебновелл-стиль) → сегментер обязан деградировать в
«абзац = граница», а не гадать. Оверсайз-предложение zh: запятая — документированная клаузная
граница, но классификация запятых даже с ML ~87% (SIGHAN 2004) → детерминированный разрез по
,、;: допустим только как soft-граница с флагом, не как «предложение».
- **Токен-бюджет считается оффлайн точно для 3 из 4 вендоров.** DeepSeek — официальный оффлайн-токенайзер
(+официальная эвристика zh≈0.6 tok/char); GLM — tiktoken-совместимый rank-формат (загружаем
pkoukk/tiktoken-go); OpenAI — tiktoken-go с вшитыми словарями. Gemini — SentencePiece, Go-пакет
качает модель в рантайме, покрытие 2.x/3.x не верифицировано; замер на одном тексте: Gemini тратит
в 22.8× больше токенов на CJK-символ, чем DeepSeek (один датапоинт, реселлер-блог) → для Gemini —
вендоренная модель или замеренный ratio с запасом ~2030%. Кросс-вендорный разброс chars/token
для zh — до ~70% (cl100k 2.08× → o200k 1.34× vs английский) → единая константа chars/token
НЕБЕЗОПАСНА; калибровка per-language × per-vendor, замеренная на СВОЁМ вебновелл-тексте.
Для русского ВЫХОДА опубликованных ratio нет — замерить локально оффлайн-токенайзерами.
### A.3 Дизайн-вывод: алгоритм нарезки (детерминированный Go, без модель-вызовов)
Инварианты: (i) никогда не резать внутри предложения; (ii) общность — алгоритм характеризует ЛЮБОЙ
вход в рантайме, никакого тюнинга под книгу; (iii) детерминизм — одинаковый вход → байт-идентичные
чанки со стабильными ID; (iv) при недоступности сильных сигналов поведение деградирует к
«не хуже жадной упаковки по абзацам», с телеметрией деградации.
**Шаг 0. Нормализация + структурный профиль (книга/глава).** Unicode-нормализация, унификация
переносов; профиль: распределение длин абзацев в токенах, медиана предложений на абзац
(line-per-sentence-детект), доля диалоговых строк (「」『』«»"—), плотность и словарь явных
разделителей (пустые строки ≥2, орнаменты ***//◇/◆/■/○/分割线, внутриглавные заголовки),
отношение размера главы к бюджету. Профиль — ВХОД детектора (какие сигналы в этой книге
информативны), не приговор книге.
**Шаг 1. Кандидаты границ с классами силы.**
- **B0 жёсткая структурная**: граница главы/части; явный разделитель (орнамент-строка, ≥2 пустые
строки там, где профиль говорит «пустая строка ≠ шум»).
- **B1 вероятная сцен-граница**: маркеры сдвига время/место/POV в начале абзаца (per-language
лексиконы: 次日/翌朝/三年后/一方/こうして/Наутро/…), переход диалоговый-блок→нарратив,
разделители, которые профиль отнёс к слабым.
- **B2 тема-сдвиг**: долина лексической когезии TextTiling-типа на скользящих окнах
(zh/ja — символьные биграммы; en/ru — стем-токены) + обрыв цепочек упоминаний сущностей
(имена из глоссария книги). Только z-score-глубокие долины; сигнал РАНЖИРУЕТ, не утверждает.
- **B3 граница абзаца** (в line-per-sentence-режиме — группы строк, склеенные диалоговым контекстом).
- **B4 граница предложения** (UAX #29 + CJK-tailoring: Close*-присоединение, 。!?…‼⁇, кавычко-осознанность,
аббревиатуры en/ru).
- **B5 внутри предложения — разрез запрещён.** Если предложение одно > hardMax: аварийный
клауза-сплит по ;:,、 с флагом `oversized_sentence` (телеметрия, деградация не молчит).
- **Диалог-констрейнт:** реплики одного обмена (turn-run) — связка; разрез внутри обмена штрафуется
сильнее, чем между обменами; реплика не отрывается от атрибуции (слов автора), идентифицирующей
говорящего. (Прецедент кодифицируемости таких запретов — Netflix TTSG: «не отрывать X от Y»
как конечный список правил.)
**Шаг 2. Упаковка — оптимизация, не жадность.** DP по кандидатам границ (аналог Кнута-Пласса):
`cost(chunk) = w_size·f(|tokenstarget|; недобор дешевле перебора; жёсткие min/hardMax)
+ w_bound·penalty(класс правой границы: B0=0 < B1 < B2 < B3 < B4)
+ w_dialog·(разрез внутри диалогового обмена)`.
Глобальный минимум суммарной стоимости по главе, O(N·W). Хвост < min перебалансировка последних
двух чанков, не огрызок. Выход: чанки со стабильными content-hash ID + классом правой границы
(доля разрезов по B0B2 vs B3B4 наблюдаемая метрика качества нарезки в телеметрии).
Бюджеты: target/min/hardMax в токенах ЦЕЛЕВОГО вендора (оффлайн-токенайзер, A.2), и отдельно
прогноз ВЫХОДНОГО размера (ru-ratio × source) против выходного лимита качества, потому что
связывает выход (A.1.1): практический стартовый ориентир эмиссия ~13k output-токенов у дешёвых
моделей, точное значение калибровать на полигоне (кривая уже частично есть).
**Шаг 3. Фоллбек-лестница (полный веер кейсов).**
| Кейс | Поведение |
|---|---|
| глава target | 1 чанк (тривиальный) |
| глава > target, есть B0/B1 | резать по ним; сцена > target → внутрь B2/B3 |
| плоский текст (профиль: line-per-sentence, сцен-маркеров нет) | B2-ранжирование возле бюджета; долины мельче порога → честный B3/B4 через DP (= не хуже жадности) + телеметрия «граница слабая» |
| мега-абзац > hardMax | B4 внутри абзаца |
| мега-предложение > hardMax | клауза-сплит + флаг |
| стихи/песни/письма (плотные короткие строки без терминаторов) | блок целиком, не резать |
| эпиграфы/авторские примечания/анонсы | отдельный класс чанка (не смешивать со сценой) |
| смешанные конвенции внутри книги | профиль пересчитывается по главе, не по книге целиком |
### A.4 Дизайн-вывод: меж-чанковая когезия
Пакет контекста на чанк — весь read-only, порядок от статичного к волатильному (закон всех четырёх
кэшей; брейкпоинт Anthropic — на последнем СТАБИЛЬНОМ блоке):
1. **Статика роли** (system, конвенции, мандаты) — кэшируется всегда.
2. **Книжная статика** (глоссарий с замком первого утверждённого перевода; версия = снапшот;
сортировка ключей детерминированная — пере-сортировка ломает кэш-префикс). Замок терминов —
самый измеренный механизм когезии (DelTA +48.5пп LTCR-1 на вебновеллах; победители WMT24 —
терминологические таблицы + editor/critic-агенты). ВАЖНО: LTCR-меряет «залочились на первом
переводе», не «первый перевод верен» → гейт draft→approved на первом вхождении — реальная
защита от отравления замка. Записи глоссария — кластеры алиасов на СУЩНОСТЬ (имя, курт. имя,
титул, А-/-эр-диминутивы), с полом персонажа как первоклассным полем (см. A.6).
3. **Структурированный стейт сцены — слоты, не свободная проза**: кто-на-сцене/где/когда/открытые
нити/регистр; билингвальные пары терминов сцены. Инкрементальный свободный running-summary —
измеренно худший носитель: удваивает omission-ошибки vs иерархическая сборка (BooookScore,
ICLR 2024 — CONFIRMED: entity omission 7.3% vs 3.71% и т.д.), слепое слияние без источника
амплифицирует галлюцинации, ре-граундинг чинит (Ou & Lapata 2025). → Стейт собирается
детерминированно из банка памяти/источника (перегрунтовка каждый чанк), НЕ LLM-пересказом
поверх LLM-пересказа.
4. **Carryover**: хвост предыдущего чанка — последние K предложений источника + их УТВЕРЖДЁННЫЙ
перевод (билингвально; target-side важнее source-side — Fernandes/DocRepair). K малое (13
предложения; DelTA STM k=3), адаптивно к классу границы (через B0 — можно меньше).
5. **Lookahead +1** (арм эмпирики): первые M предложений следующего чанка, только источник —
единственный механизм против катафоры/zh zero-anaphora вперёд (Wong 2020: next-sentence
помогает; в zh-диалогах опущено ~26% местоимений — survey arXiv:2305.10196).
6. **Сам чанк** — волатильная часть, всегда cache-miss, это нормально.
Деньги/детерминизм: пп.25 — производные источника и уже ПРИНЯТЫХ переводов (фолд в снапшот);
ретрай чанка не меняет вход соседей (carryover фиксируется порядком обработки); ретрай —
байт-идентичным телом (любая приписка «почему упало» — в конец, иначе ломает кэш-префикс);
параллельный фан-аут платит полный input N раз, пока кэш не прогрет → warm-then-fan
(первый вызов прогревает префикс, остальные стартуют после первого токена ответа) — это
прямой конфликт с идеей «параллелизм ради скорости» и обязан попасть в COGS-модель V4.
### A.5 Дизайн-вывод: контракт переводчик/редактор
- **Черновик — верный и СТРУКТУРНЫЙ**: 1:1 по предложениям/абзацам источника со стабильными ID
сегментов (иначе диффы редактора не адресуемы и omission не детектируем кодом). Paragraph-level
вход переводчику (не предложение): 71.1% предпочтения проф-переводчиков, в 12× меньше
consistency-ошибок (Karpinska & Iyyer) — но с omission-гардом, потому что paragraph-mode
роняет контент чаще sentence-mode.
- **Редактор — узкие мандаты, эмиссия = операции, не полный текст.** Ключевая внешняя опора:
на сильном черновике en→ru НИ ОДНА APE-система WMT19 не побила do-nothing (16.16 TER/76.20 BLEU;
W19-5402 — CONFIRMED), а овер-коррекция — именованная главная проблема APE; LLM-редакторы
правят даже заведомо корректный вход (Ki & Carpuat 2024). → (а) у редактора обязан быть
первоклассный выход «нет правок»; (б) каждый арм редактуры в эмпирике меряется ПРОТИВ
do-nothing-арма; (в) формат «сначала перечисли правки, потом применяй» режет объём правок
на ~¼–⅓ без потери качества (Raunak et al. 2023, с коррекциями верификатора).
- **Формат диффа — анchored search/replace, НЕ line numbers.** Search/replace-блоки — самый надёжно
ЭМИТИРУЕМЫЙ формат на всех размерах моделей (Diff-XYZ, JetBrains 2025: EM 0.680.95 generation);
mid-tier модели держат 9198% формат-комплаенса (aider polyglot; DeepSeek-класс 98.2%); оба вендора
тренируют модели на context-anchored форматах без номеров строк; применяет — детерминированный
Go-apply с ТОЛЕРАНТНЫМ поиском якоря (нормализация пробелов; у aider отключение fuzzy-apply
давало 9× больше ошибок) + validate-retry-reject на 29% малформед-правок. Слабые модели ниже
формат-пола → фоллбек full-regen с anti-omission гардами. Якоря должны быть уникальны в чанке —
ещё один довод держать чанк умеренным. Всё это измерено на КОДЕ; на русской прозе бенчмарка не
существует → это арм эмпирики, не пресуппозиция.
- **Reflow/репараграфизация — отдельный проход «широкое чтение / узкая эмиссия»**: читает сцену/главу,
эмитит план переверстки (какие сегменты сливать/делить), применяет код. Это прямой тест развязки
A.1: если выигрыш «крупного чанка» по абзацам воспроизводится крупным ОКНОМ при мелкой ЭМИССИИ —
конфликт снят. Перепараграфизация под целевые конвенции — легитимная переводческая работа
(сплошная практика для zh→en/ru; у русского абзаца — своя композиционная логика), и она
ТРЕБУЕТ, чтобы когезия/выравнивание не были прибиты к 1:1 абзацному соответствию.
- **Арм «сильный переводчик отдаёт структуру»** — единственное плечо без единого датапоинта
(полигон-синк, факт 1): черновик, уже несущий дискурс-решения, может сделать
редактора-переписывателя ненужным. Обязателен в §D.
### A.6 Дизайн-вывод: русская целевая сторона — детерминированные линты (дёшево)
Русская типографика диалога — замкнутая, регексуемая грамматика (Розенталь §§4752; ПАС Лопатина
§§154157 — верифицировано по old-rozental.ru/orthographia.ru, с одной коррекцией: двоеточие
лицензируется не только глаголами речи): «— » в начале реплики-абзаца; швы атрибуции «, —»/«? —»/
«! —»/«… —» с регистровыми констрейнтами; «?!» в этом порядке; «?..»/«!..» ровно с двумя точками;
запятая поглощается многоточием. → Санитайзер/линтер в Go без модель-вызовов, около-нулевые
ложные срабатывания. Дальше: пол персонажа — первоклассное детерминированное поле банка памяти
(«пошёл/пошла» — самый видимый класс дефектов МП в ru по двум независимым источникам:
wuxiaworld.ru-редактура и VseGPT-глоссарий-тул); транскрипция имён — Палладий (zh) / Поливанов (ja)
как машинные таблицы + детект англо-пивотных артефактов («ши/чи» из Хэпбёрна) с per-book
policy-флагом (фандомные конвенции бывают сильнее нормы); китайский бестенсовый → время/вид в ru —
изобретение переводчика, консистентность определена только ВНУТРИ сцены → линт тенс-флипов в
пределах сцены, ещё один довод резать по сцен-границам. Реплика+атрибуция — неделимая единица
и для ЧАНКЕРА (диалог-констрейнт A.3 получает независимое обоснование от целевой типографики).
### A.7 Принципы эмпирики (§D обязан их конкретизировать)
- **Пары, кластеры, мощность.** Анализ — на ПАРНЫХ по-главных разностях против общего якоря
(Miller, arXiv:2411.00640 — CONFIRMED: naive SE занижает до 3.05×); SE кластеризуются по книге;
мощность считается парной формулой (не «unpaired × (1ρ)» — ошибка ~2×); армы одного пайплайна —
«related systems» → K>1 повторов судьи на пару даёт до ~6× меньший детектируемый эффект почти
бесплатно (Wang, arXiv:2512.21326).
- **Судья.** Пары — в ОБОИХ порядках (position bias в одиночку переворачивал 66/80 вердиктов;
arXiv:2305.17926), температура 0, ~10 повторов с мажоритарным голосованием как стартовая норма
(arXiv:2606.13685), leave-one-out по судьям, катастроф-скрин к победителю тоже; агрегация
fidelity-first. Человеческое чтение — первичный эндпоинт когезии (WMT24 literary: людской и
автоматический рейтинги расходятся; протокол 05 × {general, discourse} × проф-оценщики,
κ=0.86 — прямой цитируемый образец).
- **Стоимость.** Эндпоинт — Cost-of-Pass-стиль: ожидаемая цена ПРИНЯТОЙ главы = вся потраченная
цена (включая ретраи и вызовы гейтов) / принятые главы (arXiv:2504.13359), ретраи и кэш-хиты
репортятся отдельно, per-call кап, каждый скрипт персистит usage/cost.
- **Трапы.** Маркированный набор КРОСС-ГРАНИЧНЫХ трапов, построенный ИЗ таксономии Voita +
zh-специфики: анафора назад через границу, катафора вперёд, эллипсис/zero-anaphora, смена
регистра, сущность-через-границу, тенс-консистентность сцены, пол персонажа. Каждый трап —
с ожидаемым поведением; код ПРОВЕРЯЕТ до прогона, что трап реально пересекает границу
тестируемой нарезки (иначе — снова неинформативный null).
- **Корпус.** Вне претрейна, СТРУКТУРНО РАЗНООБРАЗНЫЙ (плоский CJK line-per-sentence /
сцен-маркированный вебновелл / длинно-абзацный европейский / ja-ранобэ); плоская книга — одна
точка спектра, не повод сузить продукт.
- **Пре-регистрация.** Дизайн, армы, гипотезы, тесты, стоп-правило и мощность — заморожены
коммитом ДО первого платного вызова (OSF-поля как чек-лист; van Miltenburg NAACL 2021).
### A.8 Фальсификаторы этого заключения
1. Q2 покажет, что крупная эмиссия выигрывает и на retry-adjusted COGS, и без роста omission
(гарды молчат) → развязка A.1 не нужна, «edit=глава» легитимен для дешёвых моделей.
2. Diff-редактура на русской прозе систематически ломается (формат-комплаенс < ~90%, apply-reject
высокий, или правки-диффы проигрывают full-regen по качеству) → контракт A.5 откатывается к
full-regen + anti-omission гардам; остаётся do-nothing-гейт.
3. B2-сигнал (тема-долины) на реальных вебновеллах неотличим от шума → лестница живёт на
B0/B1/B3 + DP (всё ещё лучше жадности), «логическая нарезка» = сцен-маркеры + упаковка.
4. Carryover+стейт НЕ чинит трапы, которые чинит крупное окно (Q3-null при Q2-эффекте) → когезия
требует окна; правильная форма — «широкое чтение + узкая эмиссия» в одном вызове (дороже по
входу, но кэш-френдли), т.е. развязка сохраняется, меняется носитель.
5. Профиль-детектор структуры нестабилен между главами одной книги (флип-флоп режимов) →
профилирование поднять с главы на книгу/арку с гистерезисом.
<!-- SECTION-A-FROZEN-END -->
> **Заморозка §A:** sha256 строк строго между маркерами (команда — в шапке файла) =
> `1a46548aa75e7f35cc9efc451e9ae20c2ca040d718d0f3a8a686722a0a43f28b`, зафиксирован 2026-07-16, ДО открытия любого файла стека проекта.
> Всё ниже написано ПОСЛЕ чтения стека.
---
## §B — Дифф §A↔стек + реализуемый Go-дизайн нарезки и когезии
### B0. Дифф замороженного §A против стека (честно)
**Прочитано после заморозки:** `09-target-architecture.md` (§0.1/§2/§4), `08-sync-audit-ledger.md` (L1/L2 целиком),
`05-decisions-log.md` (D30D39), код (`chunker.go`, `chunkrun.go`, `config/pipeline.go`, фрагменты
`ingest.go`/`render.go`), `experiments/14-quality-empirics.md` (§2.32.7, §2Б), `research/18-quality-levers.md` §A.
**Сошлось (§A ⟂ стек, при декларированной общей ноге — промт нёс сводку конфликта):** развязка
draft-единицы/edit-единицы = ратифицированная цель слоя 1 (D39 §4, бывший фантом «D35.7»); бюджет в
выходных токенах как снапшот-folded кноб (09 §2 слой 1 ↔ §A.3 шаг 2); стратегия границы как first-class
ось greedy|logical с фоллбек-лестницей и «никогда не резать предложение» (09 §2 ↔ §A.3); оживление
`STMDepth`/`OverlapTokens` под carryover/summary (09 §2 ↔ §A.4); узкие мандаты + диффы у редактора
(research/07 через ледджер L1 ↔ §A.5); детерминированные структурные KPI + линты русской типографики
(09 слой 5 ↔ §A.6). Три размера из §A.1 (эмиссия/окно/связность) в стеке НЕ различались — там
двумерное «draft-единица vs edit-единица»; трёхмерная декомпозиция — вклад этого отчёта, она и
порождает недостающий арм Q2c (см. §D).
**Самопоправки §A после чтения кода (не меняют §A — фиксируются здесь):**
1. **B4-примитив уже построен и хорош.** `splitSourceSentences` (`chunker.go:219-294`) уже реализует
кавычко-осознанную сегментацию с поглощением закрывающих скобок (аналог UAX #29 SB9SB11 Close*),
depth-трекингом 「」『』“” и аббревиатурным гардом. §A.3-B4 = реюз этого кода, не переписывание.
Недостающее против ja-краёв (эмодзи/каомодзи/безпунктуационные строки — нулевые F1-классы
ja-senter-benchmark) закрывается фоллбеком B3 (граница строки/абзаца), уже совместимым с дизайном.
2. **Sticky-scene уже есть зачаток структурного стейта.** `memory.Select` ведёт exact-match entity ids
с пер-главным сбросом (`chunkrun.go:90`, bookrun) — слот «активные сущности сцены» из §A.4.3
надстраивается над этим, а не с нуля.
3. **Кривая exp14 мерила СКЛЕЕННУЮ величину.** В sizecurve рост «чанка» одновременно растил и окно
чтения, и единицу эмиссии — ячейка «широкое окно × узкая эмиссия» пуста (это и есть Q2c).
4. **НОВОЕ (несущее для §D): кривая exp14 §2Б.4 НЕ мерила omission по размерам.** «whole = 7782
out-ток vs 800c = 15159» на ch17 — из чего сколько: снятый дублирующий overhead? слитые абзацы?
или ТИХИЕ опущения? Внешняя эмпирика единодушно предсказывает рост опущений с размером эмиссии
(Karpinska & Iyyer: omission заметнее в paragraph-mode; SEGALE: omission-доминированная деградация
с длиной; DelTA: окно 50 предложений теряло 10 предложений перевода). Если часть «дешевизны»
крупного чанка = невыплаченный контент, конфликт exp14↔research/18 разрешается сам собой.
Q2 обязан прогнать omission-декомпозицию по размерам — но НЕ длинo-зависимыми гардами
(см. reflow-инвариантную метрику в §D3: `RegressionGuard`/coverage считают легитимный reflow
опущением — инструмент, смещённый в пользу этой же гипотезы, ею мерить нельзя).
5. **Упаковка в ВЫХОДНЫХ токенах — самопоправка, не «сошлось».** §A.3 шаг 2 держал первичный бюджет
в токенах целевого вендора с прогнозом выхода отдельной проверкой; §B1 переворачивает: первичный
бюджет = прогноз ru-выхода (fertility-оценка), оффлайн-токенайзеры уходят в одноразовую
калибровку. Это движение К 09 §2/`L2-budget-wrong-unit`, фиксирую как явную поправку.
**Поправки фактуры §A (вносятся здесь — §A заморожен и не редактируется):**
- **[несущая] Провайдер-сет кэша в §A.1.2/§A.4 назван неверно.** «Все четыре провайдера пайплайна» с
Anthropic в списке — ошибка: Anthropic в стеке НЕТ (ключей нет, D36.1), а **ZAI/GLM — фактический
editor-кандидат и самая дорогая стадия — в списке отсутствует, и его префикс-кэширование НЕ
верифицировано**. Верифицированы официальные доки DeepSeek/OpenAI/Gemini (+Anthropic как
индустриальный образец breakpoint-механики). Правило двух направлений: ДО опоры warm-then-fan/COGS
на editor-стадию — вендор-чек кэша ZAI/GLM (пункт §E.8-бис). Вся кэш-зависимая аргументация
(§B3-бис W1, §D-Q2c, §E.1) — условна на этом чеке.
- SEGALE: деградация 4k8k — «у БОЛЬШИНСТВА из семи open-weight моделей», Qwen2.5-72B — явное
исключение (стабилен до 4k); §A.1.1 переобобщил.
- Разброс chars/token «до ~70%»: несущие числа — КРОСС-вендорные (zh ≈1.0 chars/tok o200k vs
≈1.51.7 DeepSeek/Qwen vs 0.81.8 Gemini); пара «cl100k 2.08×→o200k 1.34×» — внутри-вендорный
генерационный пример (≈55%), в §A.2 они склеены.
- Raunak (§A.5): формат «сначала перечисли правки» сохраняет выигрыш над ЧЕРНОВИКОМ, но выигрыш
МЕНЬШЕ, чем у прямой полной правки (En-Zh CoT COMET 86.43 vs 87.53); «без потери качества» — сильнее
вердикта верификатора.
- Метки вердиктов в §A: Voita-клейм помечен CONFIRMED — фактический вердикт верификатора OVERSTATED
с коррекцией (8.5%→7%, ошибочная ячейка знаменателя; §A уже цитирует СКОРРЕКТИРОВАННЫЕ числа);
SB998-клейм — OVERSTATED (no-break только ВНУТРИ абзаца, SB4 рвёт на ParaSep; §A уже говорит
«внутри абзаца»). Метка «CONFIRMED по TR29+UCD» относится только к SB9SB11/STerm.
### B1. Целевой чанкер (слой 1) — спецификация для Go
Инварианты: чистая функция входа (никаких time/rand/map-order — контракт `chunker.go:15-22` цел);
общность §0.1 (профиль структуры — вход, не приговор); «никогда не резать предложение»; поведение
версионируется `chunkerVersion` + снапшот-folded конфиг по образцу `coverageSnap`.
**B1.1 Конфиг (снапшот-folded, вместо const):**
```yaml
chunker:
strategy: logical # greedy (текущее поведение, байт-совместимый фоллбек) | logical
target_output_tokens: 2200 # ЦЕЛЬ в выходных токенах цели (ru), не в символах источника
min_output_tokens: 700 # хвост меньше — перебалансировка двух последних чанков
hard_max_output_tokens: 3500 # непревышаемый потолок эмиссии (ниже зоны деградации дешёвых моделей)
fertility: {cjk_char: 0.75, other_char: 0.25} # src-символ → ru-out-токены; калибруется, см. B1.2
```
Точечные значения выше — placeholder до кривой §D-Q2 (hard_max=3500 сознательно ВЫШЕ зоны деградации
open-weight из §A.1.1 — потолок уточняет Q2, не пресуппозиция); несущее — СХЕМА и единица.
Legacy-режим: `strategy: greedy` + бюджет, эквивалентный 1500 src-ток, обязан воспроизводить текущую
нарезку байт-в-байт НА УРОВНЕ ЧАНКОВ (golden-инвариант №8 расширить чанкер-фикстурой). Честно про цену:
сам ввод chunker-секции в снапшот меняет snapshotID → лендинг = одноразовый `--resnapshot` (полная
переоплата in-flight книги, `snapshot.go` это документирует) + сознательный golden re-capture.
Примечание по именам: подсекции §B0§B4 ≠ классы границ B0B5 (классы — всегда без «§»).
**B1.2 Бюджет в выходных токенах — детерминированная оценка.** Упаковщик по-прежнему считает
классы символов источника (`tokenClassCounts` реюз), но конвертирует их в ПРОГНОЗ выходных ru-токенов:
`est_out = f_cjk·cjk + f_other·other`. Коэффициенты фертильности калибруются ОФФЛАЙН одним
eval-скриптом на уже существующих 25-глав rerun-данных (`records.json`: source/final пары):
оффлайн-токенайзеры уже ВЕНДОРЕНЫ в репо (`eval/tokenizers/*/tokenizer.json`, HuggingFace-формат,
грузятся Python-`tokenizers``eval/token_calc.py`; ⚠ `deepseek-v4/` пуст — добрать с оф. сайта);
tiktoken — только для OpenAI-энкодингов. «Pure-Go-загрузка» — НЕ обещается до вендор-верификации
форматов (правило двух направлений); Go-коду нужны только выкалиброванные КОЭФФИЦИЕНТЫ, не токенайзер.
Регрессия out-токенов финалов на (cjk, other) источника; коэффициенты — данные конфига
per-language-pair (слой 2), пересчёт = громкий resnapshot. Src-оценка остаётся второй величиной с
явным инвариантом: min-бюджет чанкера обязан держать чанки НАД `Gates.Coverage.MinChunkChars`
(иначе excision-гейт тихо выключается — документированная граница `chunker.go:42-46`); чанк под
флором — телеметрия-линт. (`L2-budget-wrong-unit` требует именно этой развязки двух величин.)
**B1.3 Структурный профиль (шаг 0, per-глава + агрегат книги).** Детерминированные счётчики:
медиана предложений/абзац (line-per-sentence детект: ≈1), доля диалоговых абзацев (открыватели
「『“«— и т.п.), инвентарь разделителей (строки из орнамент-символов *◇◆■○※*#—═一, ≥2 подряд пустые
строки — с поправкой: в ja-вебновелл-конвенции пустые строки = читабельность-шум, сигнал только если
их плотность НЕ фоновая), внутриглавные заголовки/номера, отношение размера главы к target.
Выход: `StructureProfile{LineSentRatio, DialogueShare, SeparatorLexicon, BlankLineBaseline, …}`
вход детектора границ. Гистерезис: профиль книги = медиана глав; глава отклоняется от книжного
режима только при сильном сигнале (анти-флип-флоп, §A.8.5).
**B1.4 Кандидаты границ (шаг 1).** Каждой позиции-кандидату — класс силы:
- **B0**: граница главы (уже есть через ingest); явный разделитель из профиля (орнамент-строка;
пустой блок, если blank-line не фоновый шум по профилю).
- **B1**: лексиконы сдвига время/место/POV в первых N символах абзаца (данные слоя 2, per-language:
次日/翌日/三年后/数日后/一方/却说/再说/こうして/翌朝/Наутро/Тем временем/…); переход диалог-ран → нарратив.
- **B2**: TextTiling-долина лексической когезии: скользящие окна по w предложений, косинус
мешков символьных биграмм (zh/ja; для en/ru — нижний регистр + лёгкий стем), depth-score долины
≥ порога в z-score (μ+kσ по главе). Плюс обрыв цепочки упоминаний сущностей (термы глоссария —
Aho-Corasick уже в памяти v2). B2 только РАНЖИРУЕТ кандидатов внутри бюджетного коридора —
никогда не «утверждает сцену» (STSS: F1≈37% — на детекцию сцен полагаться нельзя, §A.2).
- **B3**: граница абзаца (`splitParagraphs` реюз; в line-per-sentence режиме — границы диалог-ранов,
склеенных по профилю).
- **B4**: граница предложения (`splitSourceSentences` реюз).
- **B5**: внутри предложения — запрещено; предложение > hardMax → аварийный клауза-сплит по ;:,、
с флагом `oversized_sentence` в телеметрию.
Диалог-констрейнт: разрез между репликой и её атрибуцией и внутри обмена штрафуется надбавкой
(русская типографика делает пару «реплика+слова автора» неделимой — §A.6).
**B1.5 Упаковка (шаг 2) — DP вместо жадности.** Стоимость чанка `[i..j)`:
`w_size·sizePenalty(est_out; target, min, hardMax — асимметрично, перебор дороже)` +
`w_bound·penalty(класс правой границы: B0=0 < B1 < B2 < B3 < B4)` + `w_dialog·(разрез внутри обмена)`.
Кратчайший путь по кандидатам (Кнут-Пласс), O(N·W), W = кандидаты в окне hardMax.
**Детерминизм всерьёз:** все стоимости — в МАСШТАБИРОВАННЫХ ЦЕЛЫХ (никаких float в путевых суммах —
FMA-контракция Go даёт архитектурно-зависимые результаты, а текущий упаковщик чисто целочисленный);
B2-скоры (z-score/косинус) квантуются в целые ДО входа в DP; явный tie-break равных путей (раньший
разрез, затем сильнейший класс). Недобор хвоста — ЧЕРЕЗ саму DP-стоимость (undersize-штраф
последнего чанка), без отдельного пост-пасса ре-баланса (второй код-путь = второй источник
недетерминизма). Жадный `strategy: greedy` остаётся отдельной веткой (байт-совместимость + арм Q1).
Веса w_* — конфиг, folded.
**B1.6 Выход и телеметрия.** `Chunk` расширяется аддитивно (контракт Chapter/ChunkIdx/Text цел):
`BoundaryClass` (класс правой границы), `SceneID` (порядковый номер B0/B1-сегмента в главе),
`OversizedFlag`. Телеметрия в quality-report (слой 5): распределение классов разрезов
(доля B0B2 vs B3B4 = наблюдаемое качество нарезки), гистограмма est_out, число аварийных сплитов.
### B2. Фоллбек-лестница — полный веер (реализация §A.3 шаг 3)
| Кейс (детектится профилем/размером) | Поведение | Телеметрия |
|---|---|---|
| глава ≤ target | 1 чанк | — |
| глава > target, есть B0/B1 | DP по B0/B1, добор B2/B3 внутри крупных сцен | доля B0/B1-разрезов |
| плоский текст (line-per-sentence, сцен-маркеров нет — ранняя арка 蛊真人) | B2-ранжирование у бюджета; долины < порога DP по B3/B4 (= не хуже жадности) | `weak_boundary` |
| мега-абзац > hardMax | B4 внутри абзаца (уже есть: `packSentences`) | — |
| мега-предложение > hardMax | клауза-сплит ;:,、 | `oversized_sentence` |
| стихи/песни/письма (ран коротких строк без терминаторов, высокая доля B5-невозможных) | блок целиком, не резать; если > hardMax — B3 по строфам | `verse_block` |
| эпиграф/авторское примечание/анонс | отдельный класс чанка (не смешивать со сценой) | `paratext` |
| смешанные конвенции по главам | профиль per-глава с гистерезисом от книжного | `profile_flip` |
| пустые/навигационные главы | как сейчас: не потребляют номер главы (`chunker.go:59-61`) | — |
### B3. Меж-чанковая когезия — оживление `STMDepth`/`OverlapTokens` (слой 1, концерн claim-2)
Мёртвые кнобы (`config/pipeline.go:47-48`) замещаются НОВЫМИ явными (`carryover_sentences`,
`lookahead_sentences` — не переворачивать единицы старых имён: yaml документирует stm_depth в чанках
и overlap_tokens в токенах; старые поля снести — они dead-but-snapshot-live, любая правка и так
ре-пинит снапшот):
- **Carryover**: хвост предыдущего чанка ГЛАВЫ — последние K предложений ИСТОЧНИКА (реюз
`splitSourceSentences`) ∥ последние L предложений его финального ПЕРЕВОДА — **невыровненная**
билингвальная пара (⚠ выровненной пары src↔final НЕ существует: редактор легитимно
сливает/перестраивает предложения — `chunkrun.go:68-72`; выравнивание появляется только в
сегмент-ID-арме §C1). Для L нужен НОВЫЙ версионируемый ru-сегментер (оракульный сплиттер
coverage.go — Python-locked, «Do not couple», `chunker.go:24-29`). Target-side важнее src-side
(Fernandes/DocRepair, §A.1.3). Прод-значение K=23 (DelTA k=3); через B0-границу — 01.
Деградация: прев-чанк flagged/пуст → src-only carryover (детерминированное правило).
**Источник байтов** — сырой текст финального чекпоинта (НЕ `exportNormalize`-проекция: она
задекларирована ephemeral/no-wire-touch, `chunkrun.go:224`; потащить её на wire = невент-
версионированный трансформ начинает менять request_hash → тихая переоплата класса D5.2).
Любой трансформ на carryover-пути (хвосторез, сегментер) версионируется в снапшоте
(`carryoverVersion`, дисциплина coverageSnap).
- **Lookahead**: первые M предложений СЛЕДУЮЩЕГО чанка ТОЙ ЖЕ ГЛАВЫ (через границу главы M=0 —
глава = сцен-ресет, дисциплина sticky), только источник — статически известен чанкеру, не зависит
от выходов → параллелизм-безопасен. Закрывает катафору/zh zero-anaphora вперёд (единственный
механизм; exp14 A-ref-next не гонялся — Q3-арм). **Гард утечки:** модель может ПЕРЕВЕСТИ
lookahead (верхняя граница len_ratio у coverage-гейта не проверяется — `coverage.go` использует
только нижнюю) → детерминированный шов-дедуп-детектор в §D-метрики и в прод-телеметрию.
- **Структурный стейт сцены (не свободная проза!)**: слоты, собираемые ДЕТЕРМИНИРОВАННО:
активные сущности (sticky ids памяти v2 + их dst-формы + пол персонажа — новое поле сида),
класс/ID сцены от чанкера, открытый диалог-ран (кто говорил последним, если детектимо по
атрибуции). Свободный LLM-running-summary в прод НЕ закладывать: инкрементальный пересказ
удваивает omission (BooookScore) и дрейфует без перегрунтовки (§A.4.3); LLM-стейт = Ф2-аннотатор.
- **Порядок промта (кэш-закон верифицированных провайдеров — DeepSeek/OpenAI/Gemini; для ZAI/GLM
кэш НЕ верифицирован, см. §B0-поправку и §E.8-бис):** [система+мандаты] → [глоссарий, сорт-ключи
детерминированы] → [стейт сцены] → [carryover] → [lookahead] → [чанк]. Инъекция — сообщениями:
request_hash-довод ВЕРЕН (инъекция = сообщение, хешируется автоматически — resume-детерминизм),
но честно про объём работ: реестр `roleInjectionRenderers` сегодня принимает только
`[]pickedEntry` и предвычисляется из memSel ДО стадий, `MessagesWithInjection` несёт ОДИН
инъекционный слот, а prev-final/next-chunk в `translateChunk` не заводятся — это
сигнатурная проводка bookrun→translateChunk→runStage→render (контекст-структура + упорядоченный
список блоков), а не «данные + один рендерер».
- **Деньги/детерминизм:** в снапшот фолдятся ТОЛЬКО КНОБЫ (K/L/M/веса/версии трансформов —
contextSnap-паттерн); БАЙТЫ carryover в снапшот не фолдятся и не могут (снапшот считается ДО
цикла, `snapshot.go:190` прямо исключает STM: «пересобирается из чекпоинтов») — байты входят в
детерминизм через messages → request_hash и на resume пересобираются из чекпоинтов
(`chunk_status.FinalHash → GetCheckpoint`). Ретрай чанка байт-идентичен (постфактум-приписки
запрещены — ломают префикс-кэш); ретрай чанка N не меняет вход чанков ≠N+1.
- **⚠ Конфликт с параллелизмом (V4-п1/H9), фиксирую явно:** carryover со стороны ПЕРЕВОДА создаёт
последовательную цепочку внутри главы. Варианты: (а) параллелить ГЛАВЫ, чанки главы — конвейером
(кэш-warm бонус: warm-then-fan); (б) carryover src-only → полный параллелизм, слабее когезия;
(в) двухволновый прогон (волна 1 — черновики параллельно, волна 2 — редактура с carryover по
цепочке). Решение — владельцу после Q3 (сколько когезии реально покупает target-side carryover).
### B3-бис. Волновая архитектура — параллелизм без потери когезии (вводная владельца, 2026-07-16)
Владелец зафиксировал требование (V4-п1/H9 из открытой идеи стало вводной): черновики слать
ПАРАЛЛЕЛЬНО чанками; из черновика формировать единый банк памяти; затем редактор чинит термины и
точечно поднимает художественность. Разбор «чем жертвуем» показывает, что дихотомия
«последовательный vs параллельный» — ложная, как и «крупный vs мелкий чанк» (§A.1): по-настоящему
несёт качество последовательность ВОЛН, а не чанков. Ключ — расщепление контекста:
- **Source-side контекст параллелизм НЕ ограничивает:** исходник статичен и известен целиком до
первого вызова → src-carryover (хвост предыдущего чанка-источника), lookahead (катафора — даже
ЛУЧШЕ, чем в последовательном конвейере: вперёд смотреть можно всегда), сцен-стейт от чанкера и
глоссарий-сид вкладываются в каждый параллельный запрос волны 1 бесплатно. Анафору/дейксис модель
черновика разрешает по ИСХОДНИКУ (якорь в 13 предложениях — Voita/CXMI, §A.1.3).
- **Target-side контекст нужен РЕДАКТОРУ, не переводчику** (D30.2-сплит: дискурс — работа редактора),
а к волне редактуры черновики ВСЕЙ книги уже существуют → редактор получает соседей-черновиков
read-only В ОБЕ СТОРОНЫ без какой-либо последовательности.
**Волны:**
- **W0 (детерминированная, $0):** ingest → чанкер B1 (профиль, DP-границы) → src-контекст-пакеты.
- **W1 (черновики, полный параллелизм):** статичный префикс + src-carryover/lookahead + чанк;
кэш: warm-then-fan (первый запрос греет префикс, фан-аут после первого токена ответа — иначе
параллельные запросы платят full-price input; при DeepSeek-хите ~12% цены — копейки, но дисциплина).
- **W1.5 (консолидация банка, между волнами = снапшот-граница, НЕ mid-run-append):** глобальный
майнинг термин-кандидатов по ВСЕМ черновикам + реконсиляция алиас-кластеров/пола + подпись
владельца на спорных (дисциплина сида цела). Глобальная пост-хок консолидация КАЧЕСТВЕННО лучше
онлайн-замка первого перевода: замок награждает консистентность-с-первым, даже плохим
(LTCR-отравление, §A.4.2), а иерархическая сборка состояния измеренно бьёт инкрементальную
(BooookScore, §A.4.3). Это же — V4-п4 glossary-auto-build.
- **W2 (редактура, параллельна):** узкие мандаты §C + банк-enforce + draft-соседи как carryover.
- **W2.5 (опционально, по Q5):** «швейный» микро-пасс ТОЛЬКО по границам чанков — читает зону стыка
двух отредактированных чанков, эмитит диффы (blast-radius = шов); параллелен по швам.
- **W3 (reflow-план по сценам §C1.3):** параллелен по главам/сценам.
**Цена параллелизма (что реально теряем):** (а) термин-разнобой ВНУТРИ черновиков — чинится W1.5+W2
(в вебновелл-домене сущности/термины = 62.5% document-level ошибок, все банко-адресуемы — BWB);
(б) швы между независимо отредактированными чанками — W2.5/Q2c; (в) carryover от
уже-ОТРЕДАКТИРОВАННОГО соседа (последовательный конвейер) vs от ЧЕРНОВИКА соседа (волна) — дельта
неизвестна и ИЗМЕРИМА: расщеплённый Q3-арм (§D). **Что покупаем:** wall-clock (дни → часы на книгу
в тысячи чанков); **ретрай без каскада** — в последовательной схеме с target-carryover ретрай чанка
меняет вход всех последующих (каскадная переоплата, боль снапшота), в волновой ретрай изолирован;
глобальный банк vs локальный замок. Следствие для B3: carryover проектируется в ТРЁХ режимах
(src-only | draft-сосед | final-сосед), режим — конфиг волны; §E.1 снимается, вопрос владельцу
переформулирован (§E.1-новый).
### B4. Что сознательно НЕ строить (анти-скоуп, из верифицированной фактуры)
1. **Семантик-чанкинг модель-вызовами / LLM-сегментация (LumberChunker-класс)** — retrieval-only
выгоды, цена и недетерминизм; владелец это и запретил, литература подтверждает (§A.2).
2. **ML-классификатор сцен** — F1≈2437% на самом задокументированном корпусе; хуже честной
лестницы с DP (§A.2).
3. **Эмбеддинг-границы** — GraphSeg-урок (хуже рандома на естественных документах) + зависимость
от модели в детерминированном контуре.
4. **Свободный LLM-running-summary в прод-контуре** — см. B3; до Ф2 стейт только детерминированный.
5. **Симметричный RAG-оверлап (дублирование текста в двух чанках)** — недетерминированный дедуп на
склейке; вместо него carryover/lookahead read-only (перевод каждого предложения принадлежит ровно
одному чанку — лосслесс-тайлинг `chunker.go:123-124` цел).
---
## §C — Контракт переводчик/редактор (концерн 1; для эмпирики, не прод-приговор)
### C1. Целевой контракт ролей
- **Переводчик = верный СТРУКТУРНЫЙ подстрочник** (формализация текущего поведения, не смена):
1:1 к предложениям источника, зеркалит построчную структуру (это НЕ баг — это выравнивание:
делает omission детектируемым кодом и диффы адресуемыми), reflow НЕ делает. Инертный reflow-однострочник
из translator.md убрать / заменить явным «подстрочник, НЕ переверстывай» (ледджер
`L1-split-intended-not-accident`). Локус «reflow у переводчика» из Q4-вопроса промта закрыт так:
слабая форма (однострочник) эмпирически инертна (research/18 §A.2, exp14) — не арм; сильная форма
(дискурс-решения в черновике) тестируется Q4a «сильный переводчик». Опция «сегмент-маркеры»
(нумерация предложений в черновике) — суб-фактор арма Q4b (Q4b±маркеры), не пресуппозиция:
маркеры делают адресацию правок тривиальной, но меняют wire-формат (санитайзеру их снимать).
- **Редактор = узкие проходы вместо 4-мандатной full-regen:**
1. **Fidelity-проход (диффы):** src+draft → список операций «якорь→замена» ТОЛЬКО про смысл
(полярность/числа/ранги/опущения/термины). Первоклассный выход — «правок нет» (WMT19 en→ru:
ни одна APE-система не побила do-nothing на сильном черновике; LLM-редакторы правят даже
корректный вход — гейт снаружи обязателен).
2. **Стиль-проход (диффы или full-regen — арм):** де-кальки, живой русский; глоссарий-констрейнты
как сейчас.
3. **Reflow-проход = широкое чтение / узкая эмиссия:** видит СЦЕНУ/главу (все чанки read-only),
эмитит ПЛАН переверстки — группировку сегментов в абзацы + типографику диалога, применяет КОД.
План структурно omission-safe: валидатор требует «каждый сегмент использован ровно один раз» —
перестановка/слияние возможны, потеря НЕВОЗМОЖНА (в отличие от full-regen, где полнота
держится на честности модели). Это прямой тест развязки §A.1: выгода «крупного чанка» по
абзацам должна воспроизводиться крупным ОКНОМ при мелкой эмиссии.
- **Гейты между проходами** — уже построенное: coverage (переводчик), RegressionGuard
(длина/числа), санитайзер, glossary post-check; диспозиция D2 «первый флаг стопит чанк» цела.
### C2. Дифф-протокол (спека для эмпирики)
- **Формат: anchored search/replace-блоки** (самый надёжно эмитируемый: Diff-XYZ EM 0.680.95;
mid-tier 9198% комплаенса на aider; оба вендора тренируют на context-anchored форматах).
НИКАКИХ номеров строк/сегментов в якоре (если нет сегмент-маркеров арма Q4).
- **Go-apply толерантный:** якорь ищется с нормализацией пробелов/пунктуационных вариантов;
неоднозначный якорь (≥2 совпадений) → reject операции (не тихое применение первого); якорь не
найден → reject; reject-rate — телеметрия. (aider: отключение толерантного apply = 9× ошибок.)
- **Петля**: малформед/reject → 1 регенерация → далее операция ОТБРАСЫВАЕТСЯ (черновик остаётся) —
blast-radius одной правки, а не чанка. Формат-комплаенс per-model — метрика Q4; модель ниже
~90% комплаенса на русской прозе → full-regen-фоллбек с гардами (весь формат-корпус — код,
на прозе НЕ мерен: это гипотеза для эмпирики, не факт).
- **Cache-друг**: черновик в промте = стабильный префикс; правки — компактный суффикс-выход
(выходные токены — доминанта COGS: дифф-редактор радикально дешевле full-regen по out-токенам).
### C3. Порядок и do-nothing дисциплина
Порядок проходов: fidelity → style → reflow (reflow последним: он видит уже верный текст; его план
не трогает содержимое сегментов). Каждый редакторский арм в эмпирике меряется ПРОТИВ do-nothing
(экспорт черновика как есть). Уточнение: exp12 draft-only арм ($0) ставился и судился — не ставилось
другое: КАЖДЫЙ editor-арм против do-nothing на пре-регистрированных метриках (exp14 этого не имел);
APE-фактура говорит, что планка нетривиально высокая. «Сначала перечисли правки, потом применяй»
(Raunak: −¼–⅓ объёма правок с сохранением выигрыша над черновиком, но меньшим, чем у прямой полной
правки — коррекция верификатора) — дисциплина промта fidelity/style-проходов.
### C4. Арм «сильный переводчик» (Q4, чистое поле)
Единственная ячейка без датапоинтов (полигон-синк факт 1; ледджер
`L1-translator-structure-arm-never-tested`).
Гипотеза: черновик, уже несущий дискурс-решения (эксплицитация zh-нулевых местоимений, верная
полярность), сжимает мандат редактора до стиля+реflow → меньше инверсий (корень D34.3 — конкуренция
мандатов). Кандидаты арма: deepseek-v4-pro / mistral (оба чинят a1-класс как редакторы, exp14b) /
gpt-5.4 (диагностика потолка); слаги — live-фактчек `/models` перед прогоном (гардрейл).
---
## §D — ПРЕ-РЕГИСТРИРОВАННЫЙ дизайн полигон-эмпирики (исполняет полигон-сессия, отдельный промт)
> Этот §D — дизайн-оф-рекорд; полигон при исполнении фризит его коммитом ДО первого платного вызова
> и НЕ меняет пост-фактум. **Фриз пинит НЕ только слаги/цены/капы, но и: коммит-хеш бэкенда,
> хеш сида-снапшота, хеши промт-файлов (translator/editor v3), конфиги инъекции** — трек A
> параллельно мутирует pipeline-код (грязное дерево на 16.07), и «поплывший» A0 испортил бы все
> контрасты; любое изменение после первого платного вызова = новый experiment-ID. Мандат самопроверки
> (CLAUDE.md): ревью ИСПОЛНЕНИЕМ своего кода + сформированных запросов + результатов — в каждый скрипт.
### D0. Материал: структурно-разнообразный корпус (инвариант общности §0.1)
Срезы (билдеры в репо: `gu_corpus_build.py`, `ja_corpus_build.py`, `en_corpus_build.py`,
`jpm_corpus_build.py`, `webnovel_slice.py`):
- **S1 плоский CJK** — поздние главы 蛊真人 вне уже-юзанного раннего среза (line-per-sentence,
мало маркеров) — точка «фоллбек-режим».
- **S2 сцен-маркированный zh-вебновелл** — срез с реальными разделителями/сдвигами сцены (подбор
билдером по плотности маркеров; гейт «вне претрейна» — свежие главы) — точка, где Q1 вообще
может дифференцировать.
- **S3 ja-ранобэ** — line-per-utterance диалоги, безатрибуционные реплики (нагрузка на carryover
и пол/говорящего).
- **S4 длинно-абзацный европейский (en)** — контроль общности (профиль обязан переключить режим).
Объём: 812 глав на несущий срез (S1/S2), 34 на контрольные (S3/S4). **Скоуп per-срез (честно про
слой 2):** платные армы перевода — только S1/S2 (zh→ru — единственные прод-промты; D39: контент
слоя 2 = только zh→ru); S3/S4 — ЧАНКЕР-профилирование и нарезка ($0, детерминированная валидация
общности §0.1); платить за ja/en-переводы риг-промтами = мерить не прод-контракт, не делаем.
Претрейн-каветы: S1 (蛊真人) — широко скрейпленная книга, претрейн-гейт НЕ проходит — S1 валиден
для нарезки/структуры и внутрипарных контрастов, «вне претрейна» несёт S2. До прогона: структурный
профиль каждого среза печатается в отчёт (проверка, что срез РЕАЛЬНО задействует рычаг — иначе
снова неинформативный null, урок полигон-синка).
### D1. Маркированный трап-набор (закрывает §D-1 аудита «locus когезии не размечен»)
Типы (из верифицированной таксономии Voita + zh-специфика + русская целевая сторона):
| Тип | Что ловит | Пример конструкции | Кто должен чинить |
|---|---|---|---|
| T-ana | анафора назад через границу (zh zero-subject, антецедент в чанке i, реализация в i+1) | 他/она-эксплицитация | carryover (Q3) |
| T-cat | катафора вперёд (референт в i+1) | «Это был…» → имя в следующем чанке | lookahead (Q3) |
| T-ell | эллипсис/восстановление сказуемого через границу | zh-эллипсис глагола | carryover |
| T-ent | сущность-через-границу (термин/титул введён в i, повторён в i+1) | 四代族长-класс | глоссарий+carryover |
| T-gen | пол говорящего/деятеля через границу (ru прошедшее время) | «пошёл/пошла» | стейт (пол в сиде) |
| T-tense | тенс-консистентность внутри сцены через разрез | нарративное время | сцен-граница (Q1) |
| T-reg | смена регистра/голоса на сцене | вежливость/просторечие | стейт+carryover |
| T-inv (контроль) | внутри-чанк инверсии a1-класса (двойное отрицание, 没有一个不知道) | exp14b-батарея реюз | editor-модель (НЕ нарезка) |
**Дисциплина маркировки:**
- Кандидаты добываются LLM-майнингом + ручной отбор; **майнер-модель фиксируется в пре-реге и
ИСКЛЮЧАЕТСЯ из судейского пула** (и не совпадает семьёй с арм-моделями) — иначе трапы преднагружены.
- **Стратификация по дистанции антецедента** (публикуется per-трап): квота X трапов в пределах
K=3 предложений (зона carryover) и Y трапов ДАЛЬШЕ K (зона, которую чинит только окно/Ф2) —
без неё майнинг естественно наберёт короткие зависимости, и Q3a «выиграет» по построению,
а Q2c-специфичные длинные — недосэмплируются.
- **Минимальный N на несущий тип: ≥20** (T-ana/T-ent/T-tense; остальные ≥10); недобор → домайнить
главы до квоты, иначе тип помечается «Q недоказуем a priori» ДО платных вызовов (не после).
- **Общий знаменатель контраста (анти-null-игра):** трапы определяются как пересекающие границу
В ЯКОРЕ A0; в ОБОИХ армах контраста скорится ОДИН И ТОТ ЖЕ набор. Пересёк/не пересёк границу в
арме — записываемая КОВАРИАТА (она и раскладывает «починено сдвигом границы» vs «починено
механизмом»), НИКОГДА не фильтр включения: иначе Q1/Q2a-арм теряет кредит ровно за те трапы,
которые он чинит переносом границы (встроенный ложный null), а армы становятся несравнимы.
Исключаются только трапы, не пересекающие границу НИ в одном арме контраста.
- Ожидаемое поведение каждого трапа записано до прогона (span + правильный/неправильный исходы).
### D2. Армы — целевые 2-арм контрасты к общему якорю (НЕ факториал)
**Якорь A0:** прод-кандидат post-D38.5: flash `v1-reflow` → glm-5 `v3` (P1a-дискурс+чэнъюй),
greedy-1500, без когезии; RegressionGuard ON; сид reseed-промоутнутый. **На несущем срезе S2 якорь
генерится ДВАЖДЫ** (temp>0): само-расхождение A0↔A0 = floor шума генерации, и любой Q-эффект
меньше этого floor не интерпретируется. **Декларация анти-сходимости:** все контрасты делят один
якорь → их «победы» коррелированы и НЕ суммируются в нарратив «N сигналов сходятся» (D32.4);
повторы судей давят только судейский шум, НЕ шум генерации якоря.
| Q | Контраст (одна переменная) | Первичная метрика (ОДНА; остальное вторично) | Что разрешает |
|---|---|---|---|
| **Q1** | A0 vs **logical-граница** (§B1.4/B1.5-DP); **size-match:** DP-бюджет подгоняется так, чтобы распределение est_out совпало с фактическим A0 (±10% по среднему; оба распределения — в пре-ран профиль), иначе класс границы конфаундится размером | T-tense+T-ana точность на S2 (общий знаменатель) | чинит ли ЛОГИЧЕСКАЯ граница когезию (претензия-2), или граница ≪ когезии |
| **Q2a** | A0 vs **edit=глава**: draft-стадия ПРИКОЛОЧЕНА к A0-нарезке (greedy-1500), крупнеет ТОЛЬКО единица эмиссии редактора (⚠ exp14-sizecurve ресайзил draft+edit+окно вместе — реплицировать нельзя, атрибуция потеряется; суб-арм «draft тоже глава» — опционально при бюджете) | retry-adjusted cost-of-pass при reflow-инвариантном omission (см. §D3) не хуже A0 | сторону exp14: «дешевле и лучше» — выживает ли после omission/retry-поправки |
| **Q2b** | реюз sizecurve-артефактов (800/1600/3200/whole, ch17/13) + omission-скоринг существующих выходов ($0 генерации). **Скоуп: ТОЛЬКО ре-атрибуция кривой exp14** («сколько дешевизны = тихие потери») — промт там до-v3, 2 главы, greedy; сегменты с записанными err-фолбэками исключить (`sizecurve_costs.jsonl`). Ратифицировать/опровергать «edit=глава» для v3-пайплайна Q2b НЕ может — только Q2a | reflow-инвариантный omission per size | дешёвая проверка §B0.4 |
| **Q2c** | A0 vs **широкое-чтение/узкая-эмиссия** (эмиссия=чанк, окно=сцена/глава read-only). ⚠ Кэш-условность: editor=glm/ZAI, его префикс-кэш НЕ верифицирован (§B0) — пре-рег обязан вендор-чекнуть; стоимость репортить as-billed И cache-normalized, дисциплина вызовов warm-then-sequential | T-ana+T-tense точность (общий знаменатель с Q2a) при out-токенах ≈ A0 | РАЗВЯЗКА §A.1: воспроизводится ли выгода крупного «чанка» одним окном без крупной эмиссии |
| **Q3a** | A0 vs **+carryover (K=3)** — ТРИ режима: src-only / **draft-сосед** / final-сосед. Стейт сцены — ОТДЕЛЬНЫЙ суб-арм Q3a (carryover+стейт), атрибуция по типам: carryover не чинит T-gen, стейт не чинит T-ell | T-ana+T-ell точность per режим (Q3a: T-gen/T-reg) | клейм research/18 Ось-4 + **цена параллелизма** (дельта draft↔final = что теряет волновая модель B3-бис; дельта src↔draft = что даёт target-side) |
| **Q3b** | A0 vs **+lookahead M=2** (src-only, параллелизм-безопасен; шов-дедуп-гард включён) | T-cat точность (A-ref-next — пустая ячейка exp14) | нужна ли катафора-ветка |
| **Q5** | параллельно-отредактированные стыки vs те же стыки после **швейного микро-пасса** (W2.5, диффы по зоне шва) | шов-дефект-рейт (T-tense/T-reg на швах) | нужен ли W2.5 в волновой модели, или Q2c-окно закрывает швы дешевле |
| **Q4a** | A0 vs **сильный переводчик** (draft=deepseek-pro или mistral, editor тот же) + **суб-арм strong-draft+do-nothing** (иначе glm-редактор пере-ломает то, что черновик починил — T-inv по D-логу editor-модельное свойство, ложный null по построению) | fidelity-трапы ЧЕРНОВИКА до редактора (span) | чистое поле «структура у переводчика» |
| **Q4b** | A0 vs **diff-based fidelity+style редактор** (§C2; суб-фактор ±сегмент-маркеры) | trap-точность (T-inv) fidelity-first при формат-комплаенсе ≥90% (иначе арм признаётся неисполнимым) | жизнеспособность диффов на русской прозе |
| **Q4c** | A0 vs **reflow-план отдельным пассом** (§C1.3) | KPI абзацев (mean_spp) при omission-инварианте (=0 структурно — проверить валидатором) | где живёт reflow |
| **Q0** | A0 vs **do-nothing** (экспорт черновика) | эквивалентность-тест (TOST-стиль) с пре-рег маржой M на trap-точности и KPI: «A0do-nothing < M» НЕ «в пределах шума» (не-значимость эквивалентность) | нижняя планка редактуры (APE-урок); обязателен |
Порядок исполнения: Q2b (бесплатно, ре-атрибуция) Q1+Q3 (несущие, S2-срез) Q2a/Q2c Q4.
Каждый Q стоп-гейт: полигон вправе остановиться при исчерпании бюджета, пре-рег фиксирует
приоритет; НО стоп после Q2b НЕ закрывает центральный конфликт (Q2b ре-атрибуция, не вердикт).
### D3. Метрики и агрегация (methodology-guard D32.4 + внешняя методология)
- **Reflow-инвариантный omission (ГЛАВНЫЙ omission-инструмент, пре-регистрируется и валидируется
ДО скоринга армов):** длинo-зависимые гарды (`RegressionGuard` длина-коллапс, coverage-соотношения)
СМЕЩЕНЫ против крупных чанков editor.md явно разрешает слияние предложений/абзацев, и объём
reflow растёт с размером они считают легитимный reflow «опущением», фабрикуя гипотезу B0.4.
Вместо них: по КАЖДОМУ предложению источника присутствие его семантических атомов (числа,
сущности/глоссарий-хиты, полярность отрицания) ГДЕ УГОДНО в целевом чанке. Метрика один раз
валидируется на вручную вычитанном whole-chapter выходе, потом скорит армы.
- **Детерминированные (код, $0):** mean_spp / доля 1-предложенческих абзацев / диалог-тире /
CJK-утечка / glossary-консистентность (LTCR-стиль по сиду) / доля разрезов по классам границ /
шов-дедуп-детектор (lookahead-армы) / **позиционный градиент ВНУТРИ арма**: детерминированные
флаги (атом-omission, число-дрейф) по относительной позиции в чанке (кросс-арм сравнение хвостов
некорректно разные абсолютные позиции; «качество» головы/хвоста судейское, не $0).
- **Карта независимости сигналов (пропущенный D32.4-гард тот самый, на котором горели дважды):**
пре-регистрируется граф «метрикадрайвер»; метрики с общим драйвером (длина выхода: out-токены,
mean_spp, длино-гарды) считаются ОДНИМ сигналом в любом мульти-сигнальном выводе; вывод
«сигналы сходятся» требует 1 длинo-независимого сигнала (trap-точность, span-верность).
- **Trap-скоринг:** span-цитирующие судьи 2 кросс-семейных (не из семьи армовой модели И не
семья майнера трапов), temp 0, каждый пейр в ОБОИХ порядках; повторы: 6 голосов, при расколе
4:2 добор до 10 (пре-рег правило эскалации; ослабление против §A.7-нормы «~10» бюджетная
поправка, фиксируется явно), leave-one-judge-out, катастроф-скрин К ПОБЕДИТЕЛЮ тоже;
fidelity-first агрегация; никакого pooled-style-взвешивания.
- **Стоимость:** cost-of-pass = вся цена арма (ретраи+гейты+кэш-хиты раздельно в usage) / принятые
главы; ретраи и кэш-статистика репортятся отдельно; per-call predicted-cost кап ДО каждого вызова.
- **Агрегация:** ПАРНЫЕ по-главные разности армякорь ВНУТРИ среза; кластер-робастные SE по книге
НЕ считаются (несущий срез одна книга = 1 кластер, оценка не определена) вместо этого
генерализация на «любую книгу» честно декларируется ограничением, закрываемым S1S4-разнообразием;
K>1 судейских повторов = дешёвый множитель мощности (армы родственные); мощность честно: на 812
главах разрешимы только средние/крупные эффекты — потому первичны ТРАПЫ (высокосигнальные,
размеченные, N≥20 на несущий тип), не holistic-скаляры. Один первичный контраст на Q; остальное —
Holm-Bonferroni.
- **Слепота владельца:** финалисты — слепые пакеты (как exp14b h2h), метки перемешаны.
**Человеческий эндпоинт — гейтящий:** метрики НОМИНИРУЮТ арм в прод-кандидаты, финальное решение
— слепое чтение владельца (планка 2 претензий, D35); ни один арм не ратифицируется в дефолт
только по метрикам.
### D4. Бюджет и реюз
Реюз $0: sizecurve-выходы (`exp14/sizecurve/*`), A-ref-prev/both, `material.json→trap_chunks`,
exp14b-батарея a/b/c/d (T-inv), 25-глав rerun (`records.json`) для калибровки фертильности B1.2.
Новые траты: генерация армов на S1/S2 (дешёвые модели: ~$0.010.03/глава-арм) + судьи (доминанта;
бюджет судей ПЕРЕСЧИТЫВАЕТСЯ в пре-реге из trap-N × повторы × 2 порядка × ≥2 судей, не наоборот) —
грубая оценка всего пакета **$815** в рамках ключей D36.1 (~$9/ключ, **кроме Gemini ~€2.6**
аддитивный thinking-биллинг; судейские семьи выбирать с учётом этого); точные капы полигон фиксирует
в пре-реге с live-ценами. DeepSeek: кэш-hit ~12% цены miss — последовательный прогон чанков с общим
префиксом почти обнуляет input-COGS (проверить live-цены; для ZAI/GLM кэш не верифицирован — §E.8-бис).
### D5. Дерево решений (пре-рег)
Правило чтения: у каждого Q — ровно одна первичная метрика (таблица §D2), порог и направление
фиксируются в пре-реге числом; ниже — ветвление по первичным метрикам, вторичные только объясняют.
- **Q2a/Q2c:** Q2a-первичка (cost-of-pass при omission-инварианте) лучше A0 И Q2c НЕ воспроизводит
выгоду окном → edit=глава легитимен (§A.8.1). Q2c воспроизводит (его trap-первичка ≥ Q2a при
меньшей эмиссии) → развязка «мелкая эмиссия + широкое окно». Reflow-инвариантный omission растёт
с размером → exp14-кривая переатрибутируется, мелкая эмиссия + когезия механизмом.
- **Q1:** первичка (T-tense+T-ana на общем знаменателе, S2) сдвиг ≥ пре-рег порога → строить
§B1.4/B1.5-DP; null на S2 (не только на плоском S1!) → граница вторична, приоритет когезии (Q3).
- **Q3a/Q3b:** знаменатель = кросс-граничные трапы, которые A0 ПРОВАЛИВАЕТ; carryover чинит ≥50%
этого знаменателя → оживление carryover ратифицируется (режим — по дельте src/draft/final и
решению владельца §E.1); null при верифицированно пересекающих → когезия требует окна (Q2c-форма)
или Ф2.
- **Q4a:** суб-арм strong-draft+do-nothing судится по fidelity-трапам ЧЕРНОВИКА: сильный черновик
чинит ≥ пре-рег доли T-inv, которые flash-draft валит, при COGS ≤ пре-рег потолка → арм
«структура у переводчика» в прод-кандидаты (полный Q4a-пайплайн тогда меряет, не ломает ли
редактор починенное).
- **Q4b:** формат-комплаенс <90% ИЛИ fidelity-first trap-точность хуже full-regen диффы
откладываются (D-лог закрывает NEVER_CLOSED D21.4/D21.10 явно, не молча); 90% и атом-omission=0
дифф-редактор в прод-кандидаты.
- **Q4c:** mean_spp A0 И атом-omission=0 (валидатор плана) при COGS A0×1.3 reflow живёт
отдельным пассом; иначе reflow остаётся в editor-промпте (v3 как есть).
- **Q0:** эквивалентность (TOST, маржа M из пре-рега) A0do-nothing на первичках мандаты
редактора на этих осях пересматриваются (APE-урок в действии); НЕ-отвержение без эквивалентности
= «данных мало», не «редактор бесполезен».
- **Финал любой ветки:** прод-кандидат слепое чтение владельца (гейтящий эндпоинт, §D3).
---
## §E — Открытые вопросы (владельцу / бэкенду / оркестратору)
**Владельцу:**
1. **[переформулирован после вводной 16.07 волновая модель принята за рабочую]** Волновая
архитектура B3-бис отвечает на параллелизм; остаточный вопрос: если Q3a покажет заметную дельту
«final-сосед > draft-сосед» (цена параллелизма ненулевая) — готовы ли принять гибрид «чанки главы
конвейером, главы параллельно» для финального прохода, или скорость приоритетна безусловно?
Плюс: W1.5-консолидация банка предполагает вашу подпись на спорных термах МЕЖДУ волнами — ок ли
такой человеческий гейт в середине прогона книги (UX ридер-дерева)?
2. **Пол персонажа в сиде** — новое первоклассное поле схемы глоссария (T-gen-класс дефектов —
самый видимый в ru). Расширение схемы = ваша подпись (approved-инвариант).
3. **Транскрипция имён как per-book policy** (Палладий/Поливанов vs фандомные формы) — флаг книги,
детерминированно энфорсится; надо ли сейчас или в слой 2 позже?
4. **Бюджет пакета §D** (~$815 оценочно) — ок в рамках ключей?
**Бэкенду (трек A, к сведению — стройка гейтится §D):**
5. `Chunk` расширяется аддитивно (BoundaryClass/SceneID/OversizedFlag); контракт
Chapter/ChunkIdx/Text не трогается; golden — чанкер-фикстура на legacy-эквивалентность greedy.
⚠ Лендинг chunker-конфига в снапшот сам по себе = одноразовый `--resnapshot` (полная переоплата
in-flight книги) + сознательный golden re-capture — плановое событие, не сюрприз (§B1.1).
6. Кнобы когезии — НОВЫЕ имена `carryover_sentences`/`lookahead_sentences` (не переворачивать
единицы мёртвых `stm_depth`(чанки)/`overlap_tokens`(токены); те снести — они dead-but-snapshot-live).
7. Дифф-apply машинерия (§C2) — та самая парковка D21.4/D21.10; спека здесь, стройка после Q4b.
Плюс carryover-путь требует: новый версионируемый ru-сегментер (НЕ оракульный из coverage.go)
+ `carryoverVersion`-фолд + проводка prev-final/next-chunk через translateChunk (§B3).
8. **Проверить слаги DeepSeek до 2026-07-24:** официальная дока объявила deprecation legacy-имён
`deepseek-chat`/`deepseek-reasoner` 24.07 15:59 UTC (маппинг на v4-flash). Конфиг на
`deepseek-v4-flash/pro` — вероятно не задет; eval-скрипты проверить грепом (правило двух направлений).
8-бис. **Вендор-чек префикс-кэша ZAI/GLM (до опоры на warm-then-fan/COGS-выводы):** GLM — фактический
editor и самая дорогая стадия; его кэш-семантика/скидка НЕ верифицированы (официальная дока
z.ai/bigmodel.cn, правило двух направлений). Вся кэш-экономика §B3-бис/Q2c условна на этом чеке.
**Оркестратору:**
9. §D исполняется полигоном ПОСЛЕ вашей верификации этого отчёта (author≠reviewer соблюдён:
я не гоняю платную эмпирику). Приоритет: Q2b — бесплатный и бьёт прямо в центральный конфликт.
10. Веб-фактура отчёта: 65-агентный workflow; 52 клейма получили явный вердикт верификатора
(36 CONFIRMED / 16 OVERSTATED с коррекциями — коррекции внесены в текст или §B0). Полное
приложение (клеймы + URL + вердикты) — `docs/research/19-chunking-cohesion-sources.md`
(лендить вместе или отдельно — на ваше усмотрение). Пост-хок само-ревью отчёта: 5-линзовый
адверсариальный workflow (репо-грунтовка / верность цитат / методология §D / Go-реализуемость /
консистентность) — 8 MAJOR-находок исправлены в тексте до сдачи (общий знаменатель трапов,
Q2a-конфаунд, reflow-инвариантный omission, двойной якорь A0, карта независимости сигналов,
снапшот-механика carryover, невыровненный билингв-хвост, кэш ZAI не верифицирован).