854 lines
110 KiB
Markdown
854 lines
110 KiB
Markdown
# 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 моделей — резкая деградация перевода
|
||
на 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). → Выгода крупной единицы эмиссии съедается тихими потерями,
|
||
и потери смещены к концу чанка.
|
||
2. **Окно чтения — дешевле, чем кажется (кэш), но не бесплатно.** Все четыре провайдера пайплайна
|
||
кэшируют префикс запроса (официальные доки: 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, не генерация — не
|
||
овер-обобщать).
|
||
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 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 — на последнем СТАБИЛЬНОМ блоке):
|
||
|
||
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 малое (1–3
|
||
предложения; 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, это нормально.
|
||
|
||
Деньги/детерминизм: пп.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 Фальсификаторы этого заключения
|
||
|
||
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` (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 — фиксируются здесь):**
|
||
1. **B4-примитив уже построен и хорош.** `splitSourceSentences` (`chunker.go:219-294`) уже реализует
|
||
кавычко-осознанную сегментацию с поглощением закрывающих скобок (аналог UAX #29 SB9–SB11 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: деградация 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):**
|
||
```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 ≠ классы границ 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. Что сознательно НЕ строить (анти-скоуп, из верифицированной фактуры)
|
||
|
||
1. **Семантик-чанкинг модель-вызовами / LLM-сегментация (LumberChunker-класс)** — retrieval-only
|
||
выгоды, цена и недетерминизм; владелец это и запретил, литература подтверждает (§A.2).
|
||
2. **ML-классификатор сцен** — F1≈24–37% на самом задокументированном корпусе; хуже честной
|
||
лестницы с 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.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 — Открытые вопросы (владельцу / бэкенду / оркестратору)
|
||
|
||
**Владельцу:**
|
||
1. **[переформулирован после вводной 16.07 — волновая модель принята за рабочую]** Волновая
|
||
архитектура B3-бис отвечает на параллелизм; остаточный вопрос: если Q3a покажет заметную дельту
|
||
«final-сосед > draft-сосед» (цена параллелизма ненулевая) — готовы ли принять гибрид «чанки главы
|
||
конвейером, главы параллельно» для финального прохода, или скорость приоритетна безусловно?
|
||
Плюс: W1.5-консолидация банка предполагает вашу подпись на спорных термах МЕЖДУ волнами — ок ли
|
||
такой человеческий гейт в середине прогона книги (UX ридер-дерева)?
|
||
2. **Пол персонажа в сиде** — новое первоклассное поле схемы глоссария (T-gen-класс дефектов —
|
||
самый видимый в ru). Расширение схемы = ваша подпись (approved-инвариант).
|
||
3. **Транскрипция имён как per-book policy** (Палладий/Поливанов vs фандомные формы) — флаг книги,
|
||
детерминированно энфорсится; надо ли сейчас или в слой 2 позже?
|
||
4. **Бюджет пакета §D** (~$8–15 оценочно) — ок в рамках ключей?
|
||
**Бэкенду (трек 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 не верифицирован).
|