110 KiB
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-контракт, методология, русские нормы).
§A — Независимое заключение (ЗАМОРОЖЕНО)
A.0 Резюме в одно предложение
Конфликт «крупный чанк vs мелкий чанк» — ложная дихотомия, потому что слово «чанк» склеивает три независимых параметра: единицу эмиссии (сколько модель порождает за вызов), окно чтения (сколько она видит) и единицу связности (сцена/глава); правильный дизайн — детерминированная нарезка по иерархии границ с оптимизационной упаковкой, мелкая-средняя эмиссия, широкое read-only окно там, где проход этого требует, и когезия, подаваемая МЕХАНИЗМОМ (структурированный стейт + замок терминов + carryover), а не размером единицы.
A.1 Три размера вместо одного (разрешение центрального конфликта)
Внешняя эмпирика расщепляет конфликт по осям:
- Единица эмиссии — связывает раньше всего. Качество длинной генерации падает задолго до документированных лимитов output-токенов: у семи open-weight моделей — резкая деградация перевода на 4k–8k контекста с доминированием 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). → Выгода крупной единицы эмиссии съедается тихими потерями, и потери смещены к концу чанка.
- Окно чтения — дешевле, чем кажется (кэш), но не бесплатно. Все четыре провайдера пайплайна кэшируют префикс запроса (официальные доки: Anthropic prompt-caching; OpenAI automatic caching; DeepSeek context caching «hit» ~1–2% цены 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, не генерация — не овер-обобщать).
- Единица связности — не равна ни тому, ни другому. 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 1–3 предложения (билингвально, 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.6–7.2, на естественных документах — ХУЖЕ рандома (Pk 63.56 vs 52.65; Koshorek NAACL 2018 — CONFIRMED). → Дизайн, ЗАВИСЯЩИЙ от верной детекции сцен, построен на песке. Правильная роль сигналов: поверхностные маркеры — высокоточные, когда есть; лексические долины — только РАНЖИРУЮТ кандидатов возле бюджета; всё валидируется на СВОЁМ корпусе, не на Choi-бенчах.
- Поверхностные конвенции доменов реальны и детектируемы. en-фикшн: сцен-брейк = видимый токен (#/***; Shunn manuscript format). ja-вебновеллы: пустые строки —ШУМ (просто читабельность каждые 5–10 строк), сцен-смена — выделенные разделители *◇◆■○ (Syosetu-гайды). zh-вебновеллы: главы короткие (~2–5k иероглифов, «десять минут чтения»), конвенция 一句一段 (одно предложение — один абзац) → абзацная граница ≈ границе предложения, слабый сигнал; 分割线-орнаменты встречаются. Академической корпусной статистики по zh/ja вебновелл-форматированию НЕТ — только практикумы/платформы (слабая нога; для нас это довод строить рантайм-ПРОФИЛЬ структуры, а не зашивать конвенции). Для zh тема-сегментация работает на символьных биграммах БЕЗ словосегментации и даже лучше словной (+8.84% F, TDT2 broadcast news; одна группа NWPU — одна нога) → Go-скорер когезии на char-биграммах легитимен для zh/ja/ru единым кодом.
- CJK-примитивы предложения — решённая задача с известными краями. UAX #29: 。!? = STerm; закрывающие 」』)" присоединяются к терминатору (SB9–SB11: разрез ПОСЛЕ 「…。」, не после 。); без терминальной пунктуации внутри абзаца дефолт НЕ даёт границы (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 тратит в 2–2.8× больше токенов на CJK-символ, чем DeepSeek (один датапоинт, реселлер-блог) → для Gemini — вендоренная модель или замеренный ratio с запасом ~20–30%. Кросс-вендорный разброс 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(|tokens−target|; недобор дешевле перебора; жёсткие min/hardMax)
- w_bound·penalty(класс правой границы: B0=0 < B1 < B2 < B3 < B4)
- w_dialog·(разрез внутри диалогового обмена)`. Глобальный минимум суммарной стоимости по главе, O(N·W). Хвост < min — перебалансировка последних двух чанков, не огрызок. Выход: чанки со стабильными content-hash ID + классом правой границы (доля разрезов по B0–B2 vs B3–B4 — наблюдаемая метрика качества нарезки в телеметрии). Бюджеты: target/min/hardMax в токенах ЦЕЛЕВОГО вендора (оффлайн-токенайзер, A.2), и отдельно — прогноз ВЫХОДНОГО размера (ru-ratio × source) против выходного лимита качества, потому что связывает выход (A.1.1): практический стартовый ориентир — эмиссия ~1–3k 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 — на последнем СТАБИЛЬНОМ блоке):
- Статика роли (system, конвенции, мандаты) — кэшируется всегда.
- Книжная статика (глоссарий с замком первого утверждённого перевода; версия = снапшот; сортировка ключей детерминированная — пере-сортировка ломает кэш-префикс). Замок терминов — самый измеренный механизм когезии (DelTA +48.5пп LTCR-1 на вебновеллах; победители WMT24 — терминологические таблицы + editor/critic-агенты). ВАЖНО: LTCR-меряет «залочились на первом переводе», не «первый перевод верен» → гейт draft→approved на первом вхождении — реальная защита от отравления замка. Записи глоссария — кластеры алиасов на СУЩНОСТЬ (имя, курт. имя, титул, А-/-эр-диминутивы), с полом персонажа как первоклассным полем (см. A.6).
- Структурированный стейт сцены — слоты, не свободная проза: кто-на-сцене/где/когда/открытые нити/регистр; билингвальные пары терминов сцены. Инкрементальный свободный running-summary — измеренно худший носитель: удваивает omission-ошибки vs иерархическая сборка (BooookScore, ICLR 2024 — CONFIRMED: entity omission 7.3% vs 3.71% и т.д.), слепое слияние без источника амплифицирует галлюцинации, ре-граундинг чинит (Ou & Lapata 2025). → Стейт собирается детерминированно из банка памяти/источника (перегрунтовка каждый чанк), НЕ LLM-пересказом поверх LLM-пересказа.
- Carryover: хвост предыдущего чанка — последние K предложений источника + их УТВЕРЖДЁННЫЙ перевод (билингвально; target-side важнее source-side — Fernandes/DocRepair). K малое (1–3 предложения; DelTA STM k=3), адаптивно к классу границы (через B0 — можно меньше).
- Lookahead +1 (арм эмпирики): первые M предложений следующего чанка, только источник — единственный механизм против катафоры/zh zero-anaphora вперёд (Wong 2020: next-sentence помогает; в zh-диалогах опущено ~26% местоимений — survey arXiv:2305.10196).
- Сам чанк — волатильная часть, всегда cache-miss, это нормально.
Деньги/детерминизм: пп.2–5 — производные источника и уже ПРИНЯТЫХ переводов (фолд в снапшот); ретрай чанка не меняет вход соседей (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.68–0.95 generation); mid-tier модели держат 91–98% формат-комплаенса (aider polyglot; DeepSeek-класс 98.2%); оба вендора тренируют модели на context-anchored форматах без номеров строк; применяет — детерминированный Go-apply с ТОЛЕРАНТНЫМ поиском якоря (нормализация пробелов; у aider отключение fuzzy-apply давало 9× больше ошибок) + validate-retry-reject на 2–9% малформед-правок. Слабые модели ниже формат-пола → фоллбек full-regen с anti-omission гардами. Якоря должны быть уникальны в чанке — ещё один довод держать чанк умеренным. Всё это измерено на КОДЕ; на русской прозе бенчмарка не существует → это арм эмпирики, не пресуппозиция.
- Reflow/репараграфизация — отдельный проход «широкое чтение / узкая эмиссия»: читает сцену/главу, эмитит план переверстки (какие сегменты сливать/делить), применяет код. Это прямой тест развязки A.1: если выигрыш «крупного чанка» по абзацам воспроизводится крупным ОКНОМ при мелкой ЭМИССИИ — конфликт снят. Перепараграфизация под целевые конвенции — легитимная переводческая работа (сплошная практика для zh→en/ru; у русского абзаца — своя композиционная логика), и она ТРЕБУЕТ, чтобы когезия/выравнивание не были прибиты к 1:1 абзацному соответствию.
- Арм «сильный переводчик отдаёт структуру» — единственное плечо без единого датапоинта (полигон-синк, факт 1): черновик, уже несущий дискурс-решения, может сделать редактора-переписывателя ненужным. Обязателен в §D.
A.6 Дизайн-вывод: русская целевая сторона — детерминированные линты (дёшево)
Русская типографика диалога — замкнутая, регексуемая грамматика (Розенталь §§47–52; ПАС Лопатина §§154–157 — верифицировано по 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: людской и автоматический рейтинги расходятся; протокол 0–5 × {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 Фальсификаторы этого заключения
- Q2 покажет, что крупная эмиссия выигрывает и на retry-adjusted COGS, и без роста omission (гарды молчат) → развязка A.1 не нужна, «edit=глава» легитимен для дешёвых моделей.
- Diff-редактура на русской прозе систематически ломается (формат-комплаенс < ~90%, apply-reject высокий, или правки-диффы проигрывают full-regen по качеству) → контракт A.5 откатывается к full-regen + anti-omission гардам; остаётся do-nothing-гейт.
- B2-сигнал (тема-долины) на реальных вебновеллах неотличим от шума → лестница живёт на B0/B1/B3 + DP (всё ещё лучше жадности), «логическая нарезка» = сцен-маркеры + упаковка.
- Carryover+стейт НЕ чинит трапы, которые чинит крупное окно (Q3-null при Q2-эффекте) → когезия требует окна; правильная форма — «широкое чтение + узкая эмиссия» в одном вызове (дороже по входу, но кэш-френдли), т.е. развязка сохраняется, меняется носитель.
- Профиль-детектор структуры нестабилен между главами одной книги (флип-флоп режимов) → профилирование поднять с главы на книгу/арку с гистерезисом.
Заморозка §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 (D30–D39), код (chunker.go, chunkrun.go, config/pipeline.go, фрагменты
ingest.go/render.go), experiments/14-quality-empirics.md (§2.3–2.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 — фиксируются здесь):
- B4-примитив уже построен и хорош.
splitSourceSentences(chunker.go:219-294) уже реализует кавычко-осознанную сегментацию с поглощением закрывающих скобок (аналог UAX #29 SB9–SB11 Close*), depth-трекингом 「」『』“” и аббревиатурным гардом. §A.3-B4 = реюз этого кода, не переписывание. Недостающее против ja-краёв (эмодзи/каомодзи/безпунктуационные строки — нулевые F1-классы ja-senter-benchmark) закрывается фоллбеком B3 (граница строки/абзаца), уже совместимым с дизайном. - Sticky-scene уже есть зачаток структурного стейта.
memory.Selectведёт exact-match entity ids с пер-главным сбросом (chunkrun.go:90, bookrun) — слот «активные сущности сцены» из §A.4.3 надстраивается над этим, а не с нуля. - Кривая exp14 мерила СКЛЕЕННУЮ величину. В sizecurve рост «чанка» одновременно растил и окно чтения, и единицу эмиссии — ячейка «широкое окно × узкая эмиссия» пуста (это и есть Q2c).
- ⚠ НОВОЕ (несущее для §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 опущением — инструмент, смещённый в пользу этой же гипотезы, ею мерить нельзя). - Упаковка в ВЫХОДНЫХ токенах — самопоправка, не «сошлось». §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: деградация 4k–8k — «у БОЛЬШИНСТВА из семи open-weight моделей», Qwen2.5-72B — явное исключение (стабилен до 4k); §A.1.1 переобобщил.
- Разброс chars/token «до ~70%»: несущие числа — КРОСС-вендорные (zh ≈1.0 chars/tok o200k vs ≈1.5–1.7 DeepSeek/Qwen vs 0.8–1.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» относится только к SB9–SB11/STerm.
B1. Целевой чанкер (слой 1) — спецификация для Go
Инварианты: чистая функция входа (никаких time/rand/map-order — контракт chunker.go:15-22 цел);
общность §0.1 (профиль структуры — вход, не приговор); «никогда не резать предложение»; поведение
версионируется chunkerVersion + снапшот-folded конфиг по образцу coverageSnap.
B1.1 Конфиг (снапшот-folded, вместо const):
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 ≠ классы границ B0–B5 (классы — всегда без «§»).
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): распределение классов разрезов
(доля B0–B2 vs B3–B4 = наблюдаемое качество нарезки), гистограмма 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=2–3 (DelTA k=3); через B0-границу — 0–1. Деградация: прев-чанк 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 бесплатно. Анафору/дейксис модель черновика разрешает по ИСХОДНИКУ (якорь в 1–3 предложениях — 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-хите ~1–2% цены — копейки, но дисциплина).
- 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. Что сознательно НЕ строить (анти-скоуп, из верифицированной фактуры)
- Семантик-чанкинг модель-вызовами / LLM-сегментация (LumberChunker-класс) — retrieval-only выгоды, цена и недетерминизм; владелец это и запретил, литература подтверждает (§A.2).
- ML-классификатор сцен — F1≈24–37% на самом задокументированном корпусе; хуже честной лестницы с DP (§A.2).
- Эмбеддинг-границы — GraphSeg-урок (хуже рандома на естественных документах) + зависимость от модели в детерминированном контуре.
- Свободный LLM-running-summary в прод-контуре — см. B3; до Ф2 стейт только детерминированный.
- Симметричный 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:
- Fidelity-проход (диффы): src+draft → список операций «якорь→замена» ТОЛЬКО про смысл (полярность/числа/ранги/опущения/термины). Первоклассный выход — «правок нет» (WMT19 en→ru: ни одна APE-система не побила do-nothing на сильном черновике; LLM-редакторы правят даже корректный вход — гейт снаружи обязателен).
- Стиль-проход (диффы или full-regen — арм): де-кальки, живой русский; глоссарий-констрейнты как сейчас.
- Reflow-проход = широкое чтение / узкая эмиссия: видит СЦЕНУ/главу (все чанки read-only), эмитит ПЛАН переверстки — группировку сегментов в абзацы + типографику диалога, применяет КОД. План структурно omission-safe: валидатор требует «каждый сегмент использован ровно один раз» — перестановка/слияние возможны, потеря НЕВОЗМОЖНА (в отличие от full-regen, где полнота держится на честности модели). Это прямой тест развязки §A.1: выгода «крупного чанка» по абзацам должна воспроизводиться крупным ОКНОМ при мелкой эмиссии.
- Гейты между проходами — уже построенное: coverage (переводчик), RegressionGuard (длина/числа), санитайзер, glossary post-check; диспозиция D2 «первый флаг стопит чанк» цела.
C2. Дифф-протокол (спека для эмпирики)
- Формат: anchored search/replace-блоки (самый надёжно эмитируемый: Diff-XYZ EM 0.68–0.95; mid-tier 91–98% комплаенса на 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) — контроль общности (профиль обязан переключить режим). Объём: 8–12 глав на несущий срез (S1/S2), 3–4 на контрольные (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: «A0−do-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 кластер, оценка не определена) — вместо этого генерализация на «любую книгу» честно декларируется ограничением, закрываемым S1–S4-разнообразием; K>1 судейских повторов = дешёвый множитель мощности (армы родственные); мощность честно: на 8–12 главах разрешимы только средние/крупные эффекты — потому первичны ТРАПЫ (высокосигнальные, размеченные, 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.01–0.03/глава-арм) + судьи (доминанта;
бюджет судей ПЕРЕСЧИТЫВАЕТСЯ в пре-реге из trap-N × повторы × 2 порядка × ≥2 судей, не наоборот) —
грубая оценка всего пакета $8–15 в рамках ключей D36.1 ($9/ключ, кроме Gemini ~€2.6 —
аддитивный thinking-биллинг; судейские семьи выбирать с учётом этого); точные капы полигон фиксирует
в пре-реге с live-ценами. DeepSeek: кэш-hit ~1–2% цены 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 из пре-рега) A0↔do-nothing на первичках → мандаты редактора на этих осях пересматриваются (APE-урок в действии); НЕ-отвержение без эквивалентности = «данных мало», не «редактор бесполезен».
- Финал любой ветки: прод-кандидат → слепое чтение владельца (гейтящий эндпоинт, §D3).
§E — Открытые вопросы (владельцу / бэкенду / оркестратору)
Владельцу:
- [переформулирован после вводной 16.07 — волновая модель принята за рабочую] Волновая архитектура B3-бис отвечает на параллелизм; остаточный вопрос: если Q3a покажет заметную дельту «final-сосед > draft-сосед» (цена параллелизма ненулевая) — готовы ли принять гибрид «чанки главы конвейером, главы параллельно» для финального прохода, или скорость приоритетна безусловно? Плюс: W1.5-консолидация банка предполагает вашу подпись на спорных термах МЕЖДУ волнами — ок ли такой человеческий гейт в середине прогона книги (UX ридер-дерева)?
- Пол персонажа в сиде — новое первоклассное поле схемы глоссария (T-gen-класс дефектов — самый видимый в ru). Расширение схемы = ваша подпись (approved-инвариант).
- Транскрипция имён как per-book policy (Палладий/Поливанов vs фандомные формы) — флаг книги, детерминированно энфорсится; надо ли сейчас или в слой 2 позже?
- Бюджет пакета §D (~$8–15 оценочно) — ок в рамках ключей? Бэкенду (трек A, к сведению — стройка гейтится §D):
Chunkрасширяется аддитивно (BoundaryClass/SceneID/OversizedFlag); контракт Chapter/ChunkIdx/Text не трогается; golden — чанкер-фикстура на legacy-эквивалентность greedy. ⚠ Лендинг chunker-конфига в снапшот сам по себе = одноразовый--resnapshot(полная переоплата in-flight книги) + сознательный golden re-capture — плановое событие, не сюрприз (§B1.1).- Кнобы когезии — НОВЫЕ имена
carryover_sentences/lookahead_sentences(не переворачивать единицы мёртвыхstm_depth(чанки)/overlap_tokens(токены); те снести — они dead-but-snapshot-live). - Дифф-apply машинерия (§C2) — та самая парковка D21.4/D21.10; спека здесь, стройка после Q4b.
Плюс carryover-путь требует: новый версионируемый ru-сегментер (НЕ оракульный из coverage.go)
carryoverVersion-фолд + проводка prev-final/next-chunk через translateChunk (§B3).
- Проверить слаги DeepSeek до 2026-07-24: официальная дока объявила deprecation legacy-имён
deepseek-chat/deepseek-reasoner24.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 условна на этом чеке. Оркестратору: - §D исполняется полигоном ПОСЛЕ вашей верификации этого отчёта (author≠reviewer соблюдён: я не гоняю платную эмпирику). Приоритет: Q2b — бесплатный и бьёт прямо в центральный конфликт.
- Веб-фактура отчёта: 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 не верифицирован).