From 25a55abf9e0dc3906592354ca65aafe6dddfae6f Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 9 Aug 2026 03:42:35 +0300 Subject: [PATCH] Extend research 27 with the two-model design panel convergence: thirteen shared load-bearing choices, template induction, money-structure decoupling, honest failure states --- docs/research/27-chapter-detection.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/research/27-chapter-detection.md b/docs/research/27-chapter-detection.md index a1bb7761..c3cc34f1 100644 --- a/docs/research/27-chapter-detection.md +++ b/docs/research/27-chapter-detection.md @@ -33,3 +33,25 @@ ## §4. Что НЕ брать Тематическая сегментация как основа (F1=0.453) — максимум tie-breaker · полная LLM-разметка (цена/недетерминизм) · вебновелльные скрейперы как образец детекта (у них глава = страница сайта, задачи нет) · универсальный код без языковых данных (ни один инструмент так не решил). + +## §5. Панель двух независимых дизайнеров (Fable-5 · Opus-5, 09.08) — конвергенция + +По заказу владельца обе модели независимо проектировали алгоритм с нуля: одинаковый промт без наводок (только задача и свойства движка), запрет на чтение репо (этот док им был недоступен), веб разрешён для фактов. Полные дизайны — журнал wf_640b4366-b81. **Сошлись на ~13 несущих решениях**, и все совместимы с §1–§3: + +1. Один общий движок + формато-адаптеры → единое IR (поток блоков с атрибутами); языковое — ТОЛЬКО данными (грамматика шаблонов `{marker}{numeral}{sep}{name}`, читатели числительных, лексиконы, ВСЕ пороги). +2. **Индукция шаблона вместо построчных порогов**: кандидаты кластеризуются по скелету шаблона, оценивается КЛАСТЕР (доминирующее семейство + возрастающий ряд номеров); одиночное «Глава» в диалоге не примыкает к кластеру из 300 — отсекается по построению. +3. EPUB: nav/NCX приоритетно с валидацией; FB2: секции с проверкой вырожденности; TXT: индуктор. Print-TOC: детект плотного региона → исключить из границ + использовать как ОРАКУЛ названий/количества (LCS-выравнивание с телом — сильнейший валидатор). +4. **Кросс-аудит всегда**: текстовый индуктор гоняется и на EPUB/FB2 как независимая $0-гипотеза против деклараций формата (битые TOC скрейпов — массовый случай); Opus: правило маржи между гипотезами, неоднозначность = первоклассный громкий исход с выбором пользователя. +5. Скоринг-вектор структуры: правдоподобие количества (коридор от объёма) · распределение длин (runt/whale) · монотонность нумерации · согласие источников · доминантность шаблона · headSpread (границы сгрудились в начале = TOC). Три вердикта OK / DEGRADED-с-badge / FAILED. +6. **Честный FAILED**: псевдо-главы не выдумываются никогда; дерево показывает «структура не распознана» + технические «Фрагменты» (визуально НЕ главы, серые, отдельная нумерация); перевод НЕ блокируется. Выходы: выбор из отвергнутых кластеров одним кликом · ручной редактор структуры (правки = слой в снапшоте) · opt-in LLM-классификатор кандидатов со сметой. +7. **Инвариант сохранения символов**: Σ длин глав+служебного == длине тела, точно; нарушение = баг движка, платные вызовы не стартуют. +8. **Развязка денег и структуры** (оба, независимо — несущее): оплата/память ключуются контент-хешами СЕГМЕНТОВ (абзац/группа), глава — группировка-вид; пере-нарезка = перегруппировка оплаченного, перекупка только сегментов, разрезанных новой границей. Structure freeze после старта перевода; ревизия — только явной миграцией с отчётом «что осиротеет, что перекупится, почём» ДО применения. +9. Якоря читателя — на хешах абзацев (переживают смену границ по построению); id главы — контент-производный (Opus: хеш первого окна тела+титула — правка в глубине главы id не двигает); миграционная карта same/moved/split/merged/gone/new, осиротевшее показывается, не выбрасывается. +10. LLM в детекте — только opt-in классификатор ПОВЕРХ намайненных кандидатов, ограниченные токены, результат замораживается в снапшоте (replay, не повторный вызов); свободное «LLM режет книгу» — запрещено обоими. +11. Названия: извлечение по лестнице источников с провенансом; отсутствующее — служебная метка `generated:true` на локали интерфейса, НЕ фабрикация; **номер не переводится, а перерендеривается** ($0, «第十二章»→«Глава 12»); перевод названий — ранний дешёвый батч (единицы тысяч токенов на книгу) как обычные сегменты с ролью title, провизорные до стабилизации глоссария, адресная ревизия диффом по термам; канон названия сверяется $0-гейтом с заголовком в переведённом теле. +12. Калибровочный корпус из УРОДЛИВЫХ реальных книг (скрейпы/самиздат/конверсии, все скрипты; хеши+смещения границ, не тексты) + CI-запрет регрессий + запрет подгонки порогов без добавления книги в корпус — оба дословно воспроизвели наш урок «валидировать на корпусе». +13. Детерминизм механики: целочисленные баллы, сортированные обходы, фиксированные тай-брейки, побайтовый golden на structure.json. + +**Расхождения — только в глубине**, не в направлении: Opus типизировал провалы (F1–F7, отдельно «гибрид: половина книги размечена» и «nav и NCX согласны, но оба неверны — agreement ≠ правота»), добавил детект бойлерплейта скрейпов и хрупкость content-hash id на шаблонных шапках; Fable — batch-LLM-ассист и пользовательский редактор структуры детальнее. НИ ОДИН не предложил in-band-разметку глав моделью в потоке перевода (идея владельца 09.08): оба заменили «модель-сейфгард» бесплатным кросс-аудитом. Синтез оркестратора: in-band-разметка остаётся ТРЕТЬИМ эшелоном для книг, где кандидатов нет вовсе (заголовков стилистически нет — оба дизайна честно отправляют такие в ручной редактор), и каналом переведённых названий; её выход обязан проходить тот же валидатор, что и статические гипотезы, и не двигать замороженную нарезку (вид-плоскость). + +**Интеграционный вывод для текущего движка** (вопрос владельца «код полагался на ранние точные границы»): оба дизайна требуют ровно того разделения, что названо в диалоге 09.08 — плоскость нарезки/оплаты (заморожена, ключи по контенту сегментов; сегодня это чанки+чекпойнты — уже близко) отделяется от плоскости структуры (версионируемый артефакт банковского типа со своим снапшотом, ревизиями, миграционными картами); полное принятие ревизии структуры в нарезку — только через существующий `--resnapshot`. Главные точки расклейки текущего кода: редакторские юниты группируются в пределах главы (граница формирует платные запросы) · id главы = хеш всего текста главы · банковские since/until по номерам глав. Это масштаб крупного пака; дизайн-ратификация — отдельным решением владельца.