textmachine/docs/research/16-reader-ide-alignment.md

321 lines
77 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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

# research/16 — Ридер-IDE: выравнивание, статусы доверия, HITL-редактура (2026-07-11)
> **⚠ Ревью-шапка оркестратора (12.07, D29; тело ниже не редактировалось).** Вердикт адверсариального ревью (4 оси: 2 источник-батча по первоисточникам, независимая реплика $0-пробы, red-team контракта против кода/D15.2-спеки): **ACCEPT_WITH_FIXES — абсорбция через D29**. Ядро выводов (чанк=несущий якорь; калибровка YELLOW важнее покрытия; детект-флаггер вместо форс-структуры; «не вырезание» — подтверждено и усилено) — выживает. Поправки чтения:
> 1. **Числа §0 — верхний край метрик-диапазона, база устарела.** Проба считана по stale-экспорту (ch1/4 показан красным при redriven-OK в store; сама проба напечатала `<<MISMATCH`-варнинг — проигнорирован) и с багом выбора draft-попытки («самый длинный ответ» вместо `final_hash` — length-обрезок бывает длиннее). По DB-истине: **57.4% точно / 70.4% ±1 / агрегат 0.9695; редактор 49/54=90.7%** (не 93%); чистый драфт 59.3%. Хуже: адаптивная метрика абзаца схлопывает смешанную вёрстку 13/54 финалов — line-based определение даёт **44.4%**, т.е. «58%» = верх диапазона **4458%, зависящего от определения абзаца**; сравнение с внешними 60.2% (предложения!) — только направление. Полоса arity-паспорта обязана пиновать определение. Из «двух худших» чанков только ch14/1 — настоящее слияние; ch19/1/ch1/4 — артефакты вёрстки.
> 2. **Новое требование к экспорту (находка реплики): 8/54 финалов содержат markdown-заголовки `###`** — финалы пайплайна не чистый plain text; нормализация выхода — в экспорт-контракт.
> 3. **«Контракт полностью из read-model» — оверклейм.** Существует/деривабельно $0: state, flag_reason, escalated+model, postcheck [{src,dst}], cost, цвет. **Net-new машинерия**: `src_range/dst_range` (у Chunk нет офсетов; канонического ассемблера/экспорт-команды в tmctl нет), `source_file_hash` (нигде не считается), спаны style-флагов (не персистятся), `paragraph_anchors`. Для annot-v1: paragraph_anchors — ТОЛЬКО детерминированная позиционная пара при равном числе абзацев (иначе absent); aligner-based — Ф3 после zh→ru spot-check (§4.1 противоречил собственному §2.4 «выравниватели не прод»). dst_range — nullable/эфемерный (сдвигается на redrive/экспорте).
> 4. **Passport-клейм неверен при gate-on**: glossary_miss УЖЕ катится в attention/fail через ChunksFlagged (status.go:238-282) — 3-тир rollup = явный амендмент вердикт-правила D12/exp07 (ратифицировать, сохранив консистентность с exit-кодом translate), не «доделка». RED определять ДОПОЛНЕНИЕМ (flagged && reason≠glossary_miss), не перечислением (в перечне §3.1 нет coverage_fail; энум — 13, не 12).
> 5. **human_override: две ловушки пингов.** «Ключ по content_hash чанка» — в кодовой базе content_hash = хеш ОТРЕНДЕРЕННЫХ msgs (с инъекцией/STM) → ложные re-review при любой правке глоссария; ключ = **хеш сырого src-текста** (нового поля сегодня нет). «Verdict-нейтрален как post-check» — неверно: override обязан подавлять redrive и менять эффективный цвет = новое provenance-состояние, консультируемое redrive/status/export. Четыре interaction-клейма (redrive-клоббер/resume-безопасность/resnapshot-переоплата/отсутствие override в D15.2-спеке) — подтверждены кодом/grep. «Не кормить в TM» — верный вывод через несуществующий механизм: чекпоинт-кэш ключится bookID+chapter+chunk (утечь в другие чанки НЕ может по построению); реальный вектор утечки — глоссарий/память книги.
> 6. **Диалог-аварный флаггер — не «$0 сейчас»**: новый cheap-gate класс = bump cheapGateVersion → снапшот/golden (до D15.2); заводить с пакетом D15.2 (verdict-side) и калибровать на конфиге-победителе exp12 — stage-A вёрстка (построчные абзацы от промптов, exp12 §2.5-S) будет снесена reflow-фиксом, её парность-числа устареют by design.
> 7. **exp12-совмещение precision-замера — только post-hoc** против УЖЕ существующих заметок владельца (пре-регистрация exp12 заморожена; фрейм из 3 чистых глав не мерит RED и мал для <10%-гейта — тот требует отдельного прохода по 25 главам и гейтит только показ цветов Ф3).
> 8. Источник-ниты: QE4PE «>2× редактор-уровень» — только en→it (en→nl 33%), спан-диапазон 1.84.6×; VS Code rollup «worst-child+счёт» — наш синтез (у VS Code бейдж только на файлах, 9+); Liu&Dai N=31 — студенты MTI, preliminary; **Bertalign — GPL-3.0, не «MIT-ish»**; 89% Gale-Church — корпус UBS, не Hansard; нумерация «пакет №4» устарела → целевой пакет = D15.2.
**Мандат:** `docs/READER_IDE_RESEARCH_SESSION_PROMPT.md` (владелец 10.07). Спроектировать бэкенд-выхлоп под фронт Ф3 (VS Code-подобный ридер: дерево глав слева · оригинал|перевод в центре · панель команд справа · цветная полоса статуса книги снизу с ползунком). Рамка: **выхлоп = экспорт-артефакты (annotations/anchors/сборка), НЕ веб-сервер** (API/SSE — Ф3). Цвета — из ДЕТЕРМИНИРОВАННЫХ вердиктов пайплайна, не из LLM-самооценки (logprobs недоступны у половины стека — research/14).
**Метод** (research/1315): мультиагентный веб-ресёрч (13 сборщиков по 5 кластерам) → адверсариальная верификация несущих клеймов по первоисточникам (13 refute-by-default верификаторов; вендор-клейм ≠ замер; доки/скриншоты CAT-тулзов — источник поведения) → completeness-критик. 26 агентов, 0 ошибок, ~1.23M токенов, 652 веб-обращения. Плюс **$0-проба парности абзацев** на реальном прогоне этапа A (read-only). Живых LLM/перевод-вызовов: **$0** (только чтение веба и сохранённых выходов). Каждый несущий факт — URL+дата, вердикт CONFIRMED / PLAUSIBLE / REFUTED.
**Зона записи:** этот файл + секция `## Ридер-IDE` в `PROGRESS.md`. `architecture/*`, `backend/`, `eval/` — read-only; расхождения — пингами. Ничего не коммичено (примет оркестратор).
---
## TL;DR — вердикт
1. **Гипотеза оркестратора подтверждена, но расщепляется на две линии доказательств.** «Страница — артефакт рендера; якорить узлы/абзацы, не страницы» — **CONFIRMED** всеми серьёзными инструментами (Gale-Church «беды», InterText, bilingual_book_maker, Immersive Translate — ни один не якорит страницу). Но «синхронизация двух панелей скроллом по ближайшему якорю с N:M split-diff» и «якорь-абзац» — из РАЗНЫХ источников: потребительские ридеры якорят строго 1:1 по узлу (без N:M), а N:M-беды и «флагать не-1:1 первыми» — из выравнивателей/редакторов (InterText). Ни один shipped-ридер не делает оба сразу. **Правильный паттерн — не свободный скролл-синк двух панелей (он дрейфует на N:M), а КО-ЛОКАЦИЯ спаренных якорей** (интерлив ИЛИ общая строка-грид, как InterText).
2. **Наш козырь реален: атом соответствия рождается в пайплайне.** Академический атом выравнивания — «бед» (минимальный N:M-сегмент Gale-Church), а не предложение и не страница; наш **чанк = именно бед** (src_range↔dst_range по построению, чанкер lossless, версионирован). Пост-хок выравниватели (bertalign) нужны только для КАНОНИЧЕСКИХ переводов в eval/пилоте, не в проде.
3. **$0-проба (наш прогон этапа A): парность абзацев src↔перевод = 58% точно / 72% в ±1**, агрегатное отношение абзацев 0.987 (структура сохранена в объёме). **Расхождение рождается на ДРАФТЕ (редактор glm-5 сохранил число абзацев в 93% чанков), и это ЛЕГИТИМНОЕ слияние/дробление абзацев, не тихое вырезание** (границы двух худших чанков целы, объём нормальный). Внешняя литература это ровно предсказывает: китайско-английский литературный перевод — **60.2% 1:1 на уровне предложений** (Bertalign/MAC), структурный текст — 85% абзацев 1:1 (JRC-Acquis). Наши 58% для CJK-литературы — норма жанра, не поломка.
4. **Самая консеквентная находка для продукта — не про якорь, а про КАЛИБРОВКУ жёлтого.** Лучший замер (QE4PE, TACL 2025, 42 профредактора): подсветка ошибок — даже точная модельная QE — НЕ ускоряет пост-редактуру и раздражает, когда «часто это не настоящие ошибки». Подсветка **якорит усилие**: подсвеченные места правят в 24.6× чаще независимо от точности подсветки. Индустрия (Google Tricorder <10% ложных на чекер; alert-fatigue: клиницисты игнорят 4996% алертов, а потом и критические) сходится в один закон: **преимущественно-жёлтая полоса бросается целиком, утягивая красное.** Для нашей полосы **точность (precision) каждого флага важнее покрытия**; калибровка YELLOW гейт перед показом цветов, не косметика.
5. **Контракт под фронт полностью выводится из УЖЕ существующего read-model** (`status.go`): цвета = проекция полей disposition/passport/retrieval_state ($0, как `status --json`, который D12 строил «для CI/IDE»). Единственные net-new вещи `annotations.json`-схема, политика красных, **human_override** (в D15.2 не спроектирован самый контрактно-опасный кусок; аналог CAT «locked segment» + PerfectMatch/X-Translate content-keyed carry-over) и chat-edit фрагмента.
---
## 0. $0-проба парности абзацев (главный технический вопрос владельца, направление 2а)
**Данные (read-only):** `acceptance/guzhenren-25ch-parallel.txt` (srcФИНАЛ-пары по чанкам с флагами) + `acceptance/guzhenren-acc-a.db` checkpoints (draft vs edit по стадиям). Это **боевой прогон этапа A** 蛊真人 zhru, 25 глав, draft `deepseek-v4-flash` моно-редактор `glm-5` тот самый конфиг, который владелец прочитал и назвал нечитаемым (D26). Метрика абзаца адаптивная (пустая строка, иначе одиночный \n). Скрипт: `scratchpad/parity_probe.py`; полный вывод: `scratchpad/parity_results.txt`.
**57 чанков: 53 переведённых (ОК) + 4 красных (2 cjk_artifact, 2 length).**
| Метрика | Значение |
|---|---|
| Парность абзацев srcфинал: **точно (Δ=0)** | **31/53 = 58%** |
| в пределах **±1 абзаца** | 38/53 = 72% |
| dst БОЛЬШЕ абзацев (Δ>0, дробление) | 10/53 = 19% |
| dst МЕНЬШЕ абзацев (Δ<0, слияние) | 12/53 = 23% |
| агрегатное число абзацев src / dst | 1823 / 1799 = **0.987** |
| худшие: Δ=18 (гл14/1, 4224), Δ=10 (гл19/1), Δ=+8 (гл12/0) | |
| объём ru/zh (видимые символы) mean/med | **3.00 / 2.99** (диапазон 2.563.62) |
**Где ломается парность:** редактор glm-5 **сохранил число абзацев в 50/54 = 93% чанков** (Δ med 0, mean 0.19); драфт deepseek vs источник 56% точно. **расхождение рождается на стадии ДРАФТА/переводчика, не редактора.**
**Слияние vs вырезание (адверсариальная проверка):** ни один чанк с потерей абзацев не имел аномально низкого объёма (гл14/1 объём 2.73, гл19/1 3.13, выше среднего). Ручной осмотр двух худших: открывающая и закрывающая фразы ЦЕЛЫ, слиты внутренние короткие описательные/диалоговые строки в плавные русские абзацы. **это легитимная репараграфизация (слияние/дробление), а не тихое вырезание.** Гейт покрытия (отношение длин) и дельта абзацев согласны контента не потеряно.
**Оговорки пробы:** (а) 58% уровень абзацев, внешние 60.2% уровень предложений; направление совпадает, но это НЕ эквивалентность (кросс-гранулярность); (б) одна книга / 25 глав / один конфиг предварительно до вебновелл-среза других книг; (в) «draft==src 56 включает 4 эхо/length-чанка (их драфт китайский эхо), так что чуть занижает истинную парность драфта. **Робастные заголовки: editor-93%, end-to-end 58%/72%, объём 3.0×.** (NB: «~1.9×» из промта в ТОКЕНАХ; в символах zhru ~3× из-за плотности ханьцев. Оба верны.)
**Интерпретация → иерархия якорей.** Чанк единственный lossless, пайплайн-нативный якорь (всегда точный). Абзац best-effort (58% точно). Предложение самое N:M. **Иерархия деградации: глава → чанк (нативный, точный) → абзац (~58% точно) → предложение.** Панели скроллятся по границе ЧАНКА; парность абзацев внутри чанка мягкий оверлей (подсветка при наведении), никогда не «страница=страница».
---
## 1. Прайор-арт HITL-редактуры машинного перевода (направление 1, центр мандата)
### 1.1 CAT-инструменты: единица, статусы, цвета — два ОРТОГОНАЛЬНЫХ канала
Единица выравнивания у всех **сегмент (≈предложение), одна строка грида: src-ячейка | dst-ячейка | статус**; но каждый явно моделирует не-1:1 абзацную структуру (Trados «paragraph unit» + кросс-абзацный merge выкл. по умолчанию; Align даёт Split/Merge/Insert). CONFIRMED: memoQ ([the-grid](https://docs.memoq.com/current/en/Workspace/the-grid.html), accessed 2026-07-11), Phrase ([Segments-TMS](https://support.phrase.com/hc/en-us/articles/5709678012828-Segments-TMS)), MateCat ([segment-status](https://guides.matecat.com/segment-status)).
Ключ: **статус (workflow: not-started/draft/translated/reviewed/approved/rejected) и MATCH-RATE/провенанс (TM/MT/термбаза/fuzzy%) — ДВА отдельных цветовых канала; match-rate ИНФОРМИРУЕТ, но НИКОГДА не гейтит сегмент** (CONFIRMED across memoQ [translation-results-list](https://docs.memoq.com/current/en/Workspace/translation-results-list.html), Phrase [CAT-Pane](https://support.phrase.com/hc/en-us/articles/5709683926812-CAT-Pane-TMS), Trados). Конкретные оттенки НЕ канон (memoQ Help Center сам расходится: Edited=pink vs brown; всё перекрашиваемо) **переносим МАППИНГ цвет→смысл, не оттенок.**
**Конвенция, которую надо решить осознанно (weak-spot верификатора):** во всех CAT **непереведённое = серый/белый (memoQ «Not started»=grey, MateCat NEW=white), а RED = человеком ОТКЛОНЁННОЕ** (memoQ Rejected, Trados Rejected, Phrase unconfirmed red-X). Владельческая схема «RED=провал/не переведено» СТАЛКИВАЕТСЯ с этой конвенцией. И: **ни один CAT не использует «жёлтый=редактировать-первым» как СТАТУС** машинно-заполненное-но-непроверенное получает СВОЙ цвет (memoQ blue/orange, Trados blue Draft, MateCat blue), отличный от красного «проблема». см. §3 калибровку и рекомендацию по grey/4-му тиру.
### 1.2 QE/confidence-подсветка — на чём основана
**Любой продукт, показывающий ЧИСЛОВОЙ per-segment score, берёт его из ОБУЧЕННОЙ reference-free QE-модели, а не из агрегата детерминированных правил** (CONFIRMED: Phrase QPS = обученный MQM-предиктор 0100, [QPS-Overview](https://support.phrase.com/hc/en-us/articles/5709672289180-Phrase-QPS-Overview); Custom.MT «0100 из learned QE моделей», [custom.mt](https://custom.mt/machine-translation-quality-estimation/); ModelFront/ModernMT). QE по определению reference-free ([WMT QE task](https://www.statmt.org/wmt19/qe-task.html)). Trados/Language Weaver **MTQE = per-segment светофор green/amber/red из обученной QE** (CONFIRMED, [Studio-2024 docs](https://docs.rws.com/en-US/trados-studio-2024-1145319/support-for-machine-translation-quality-estimation-mtqe--1147923); прямой fetch 403, подтверждено сниппетами). **Книго-широкая цветная СТАТУС-ПОЛОСА из QE-score — реальный UX** (Custom.MT над Trados: зелёная при scoreпорог; [custom.mt](https://custom.mt/machine-translation-quality-estimation/)) валидирует концепт нижней полосы владельца.
**Следствие для нас (жёсткое):** у нас нет ни QE-модели, ни logprobs на половине стека **любое число было бы выдумкой**, ложно намекающей на существование оценщика. **НЕ показывать числовой confidence. Показывать НАЗВАННЫЕ детерминированные флаги** (наши ~12 flag_reasons доменный экземпляр стандартной QA-таксономии: числа/теги/терминология/длина/непереведённость, как memoQ QA / Xbench / Verifika). Опционально: offline-прогон COMETKiwi как ОТДЕЛЬНАЯ метка (eval-tool, не $0-гейт) для проверки, коррелирует ли детерминированный YELLOW с низким learned-QE.
### 1.3 Post-editing исследования: подсветка ПОМОГАЕТ или МЕШАЕТ? (несущий вопрос)
Refute-by-default; замеры, не вендор-клеймы:
- **QE4PE (TACL 2025, 42 профессиональных пост-редактора) CONFIRMED, сильнейший источник:** пословная подсветка ошибок даже точная модельная QE **НЕ ускоряет пост-редактуру систематически** и не даёт разницы в качестве; supervised (XCOMET-XXL) vs unsupervised (MC-dropout) без значимой разницы; редакторы: подсветки «часто не были настоящими ошибками», «раздражают». Подсветка **ЯКОРИТ усилие**: подсвеченные места правят в 24.6× чаще, подсвеченные редакторы правят >2× независимо от точности подсветки, а точность автоматической QE — только ~0.200.28. ([arxiv 2503.03044v2](https://arxiv.org/html/2503.03044v2), 2025-03).
- **Shenoy et al. (EMNLP 2021) — CONFIRMED (N=17 finder-reported):** QE должна достичь **>80% F1, прежде чем вообще помогать**; градиентная/uncertainty-визуализация предпочтительнее жёсткого бинарного red/green.
- **Liu, Dai & Li (MT Summit 2025, N=31) — CONFIRMED:** СЕГМЕНТ-уровневая (грубая, приоритизирующая) QE значимо снизила время PE (p=0.02), но интервью: неточная QE МЕШАЕТ. ([2025.mtsummit-1.38](https://aclanthology.org/2025.mtsummit-1.38/)).
- **Green et al. (UIST 2014) — CONFIRMED:** интерактивный MT на 1922% МЕДЛЕННЕЕ, но чуть выше качества; Lilt «substantial productivity gains» — маркетинг без контролируемого замера (REFUTED как измерение).
**Вывод (курс-задающий):** план владельца — цвета из ДЕТЕРМИНИРОВАННЫХ вердиктов + YELLOW=«редактировать первым» — согласуется с данными. НО та же литература — предупреждение: **неточный флаггер пере-якорит редактора на ложные срабатывания и читается как помеха. Precision/калибровка YELLOW важнее покрытия; предпочтителен градуированный, а не жёсткий бинарный цвет.**
### 1.4 Издательские MT-пайплайны с UI
- **Mantra Engine (ближайший аналог) — CONFIRMED:** редактор **страница-оригинал СЛЕВА / AI-перевод СПРАВА + правая панель управления**, атом = речевой пузырь, правки в edit-box отражаются в баллоне в реальном времени ([pixivision](https://www.pixivision.net/en/a/7427)) — ровно центральная раскладка владельца в shipped-инструменте. Engine классифицирует пузырь (standard/thought/scream/narration), детерминированно ПРЕДЛАГАЕТ шрифт/размер → человек валидирует ([mantra.co.jp](https://mantra.co.jp/en/news/mantra-an-ai-manga-translation-startup-jointly-develops-manga-typesetting-specification-engine); бета 1516 стр., 73% удовл. — self-reported). Модель выравнивания опубликована (AAAI 2021, «Towards Fully Automated Manga Translation»); коммерческий confidence/flag-слой — НЕ опубликован.
- **XL8 MediaCAT — PLAUSIBLE (маркетинг):** флагает сегменты **warning-иконками** для ревью + «детектирует неопределённости выше порога» (механизм не раскрыт) — концептуально наш YELLOW, но на уровне сегмента, не книго-полосы.
- **НОВИЗНА (PLAUSIBLE, absence-of-evidence):** ни один найденный продукт (Mantra/XL8/Nuanxed/CAT/дашборды) не показывает **книго-широкую цветную полосу с ползунком ВНУТРИ ридера, из детерминированных per-chunk вердиктов**. Прецеденты покрывают куски (per-segment цвета, warning-иконки, %-прогресс, QE-хитмапы), не эту сборку. Наш синтез — новый (при скрининге, не FTO).
### 1.5 Фан-стек — прайор-арт «alignment born in pipeline» + forced structure
- **GalTransl — CONFIRMED:** атом = name-message JSON (одна реплика на объект), src↔dst держится строгим 1:1 index-мэппингом кэша (`pre_jp/post_jp/pre_zh/proofread_zh`); ships детерминированный (no-LLM) **error-finder из 8 категорий, почти 1:1 совпадающих с нашими flag_reasons** (残留日文≈cjk_artifact, 丢失/多加换行≈парность строк, 词频过高≈loop_degenerate, 比日文长≈length, 字典使用≈glossary_miss) + per-категорийный redrive через `retranslKey` ([README](https://github.com/GalTransl/GalTransl/blob/main/README.md?plain=1)). Прямой аналог нашего per-flag redrive.
- **SakuraLLM — CONFIRMED:** дрейф числа строк — first-class задокументированный режим отказа: системный промпт запрещает менять `\n`, цель обучения — «понизить вероятность расхождения числа строк», а `translate_epub.py` СЛЕПО падит `''`/усекает выход под число групп ([translate_epub.py](https://github.com/SakuraLLM/SakuraLLM/blob/main/translate_epub.py)). Даже спец-модель под сохранение строк не устраняет дрейф.
- **Синтез (CONFIRMED):** каждый LLM-batch-инструмент ФОРСИРУЕТ фикс-число строк и потом компенсирует поломку (sentinel-замена \n в AiNiee — «не 100% сохраняется»; pad/truncate в SakuraLLM/bilingual_book_maker; post-hoc флаги в LinguaGacha/GalTransl). **Никто не заявляет надёжного сохранения.** Валидирует наш выбор lossless-чанкера над forced line-by-line и рамкует 58%/72% как согласованное с прайор-артом, не дефект чанкера.
- Коррекция верификатора: не заявлять output-side CJK-детект как наш дифференциатор (GalTransl/LinguaGacha его делают); дифференциатор — chunk-disposition/passport-поверхность. LinguaGacha 3-классный ResponseChecker — только deepwiki (AI-gen), НЕ primary-sourced.
---
## 2. Якорение оригинал↔перевод (направление 2)
### 2.1 Атом соответствия — «бед», не страница и не предложение
- **Gale-Church «беды» (Moore, AMTA 2002; Brown) — CONFIRMED:** любой параллельный корпус выравнивается последовательностью МИНИМАЛЬНЫХ сегментов-«бедов», где предложения идут 1:1, 1:2, 2:1, 1:0, 0:1 (изредка 2:2/3:1). **Бед — не предложение и не страница — атом выравнивания, и он явно N:M** ([sent-align2](https://www.microsoft.com/en-us/research/wp-content/uploads/2002/10/sent-align2-amta-final.pdf)). ⟹ наш **чанк = бед**.
- **Все серьёзные инструменты якорят текстовый УЗЕЛ/сегмент, никогда рендер-страницу — CONFIRMED** (InterText строки=сегменты; bilingual_book_maker вставляет per-`<p>`; Immersive Translate «абзац — минимальная единица»; практики зовут page-alignment «page-aligned, if that» — грубым полом). Прямо подтверждает «страницы — артефакт рендера».
- **InterText (LREC 2014) — CONFIRMED:** параллельный редактор = **двухколоночная таблица, строка = бед, ячейка держит ЛЮБОЕ число предложений** (N:M в одной строке); колонки залочены на общий строка-грид — не могут дрейфовать; **подсвечивает не-1:1 строки как «содержащие большинство ошибок» — для ревью первыми** ([LREC-2014-Vondricka](https://mt-archive.net/10/LREC-2014-Vondricka.pdf)). Точный прецедент YELLOW=«редактировать первым» и ко-локации спаренных якорей.
**Уточнение гипотезы (PLAUSIBLE, частичный refute):** гипотеза расщепляется. (а) «якорить узлы, страницы=артефакт» — из потребительских ридеров (bilingual_book_maker вставляет перевод как sibling-узел после `<p>`, [epub_loader.py](https://raw.githubusercontent.com/yihong0618/bilingual_book_maker/main/book_maker/loader/epub_loader.py); Immersive Translate — абзац по умолчанию, [old-docs](https://github.com/immersive-translate/old-docs/blob/main/README_english.md)); НО они пар­ят строго 1:1 по узлу, N:M-подвыравнивания НЕ делают. (б) «N:M split-diff, флаг не-1:1» — из выравнивателей/InterText. **Не-дрейфующий синк достигается КО-ЛОКАЦИЕЙ спаренных якорей (интерлив или общий строка-грид), НЕ скролл-синком двух свободных панелей** (Word/Acrobat sync привязан к offset/странице, дрейфует на N:M — [try67](https://www.try67.com/tool/acrobat-reader-synchronized-scrolling-two-or-more-pdf-documents)).
### 2.2 Парность LLM-перевода — что известно (валидирует пробу)
- **Bertalign/MAC — CONFIRMED:** китайско-английский ЛИТЕРАТУРНЫЙ перевод — **60.2% 1:1 на уровне предложений** (vs web-crawled 83.1%, biomedical 94.6%); MAC-корпус 59.8% 1:1 ([DSH 38(2):621](https://academic.oup.com/dsh/article-abstract/38/2/621/6965034); [aligner-eval](https://github.com/bfsujason/aligner-eval)). Ближайший внешний аналог нашей пробы.
- **CJK-механизм (Xue & Yang, ACL 2011) — CONFIRMED:** китайский — comma-chained «run-on» предложения → 1:N в цель; только **~16.6% китайских запятых — границы предложений** (даже обученная модель ~70% F1); необратимая исходная неоднозначность, не дефект пайплайна ([P11-2111](https://aclanthology.org/P11-2111.pdf)).
- **Пол не-1:1 даже в структурном тексте:** Gale-Church ~89% 1:1 (Hansard), ~11% non-1:1 — пол; **JRC-Acquis 85% АБЗАЦЕВ 1:1** ([cs/0609058](https://arxiv.org/pdf/cs/0609058)). Наши 58% для CJK-литературы — ниже 85%-потолка структурного текста, ровно как предсказывает жанровый разрыв.
- **Karpinska & Iyyer (WMT2023) — CONFIRMED, важнейший ограничитель:** абзац-уровневый LLM-перевод БЬЁТ пофразовый (меньше ошибок), НО «критические ошибки остаются, включая эпизодические content omissions» ([2023.wmt-1.41](https://aclanthology.org/2023.wmt-1.41/)). ⟹ **парность абзацев НИКОГДА не должна быть зелёным сигналом сама по себе; excision_suspect/length-флаги сохранять обязательно.**
**Оговорка верификатора:** 58% (абзац) ≠ 60.2% (предложение) — кросс-гранулярность, направление а не эквивалентность; ни один источник не мерит zh→РУССКИЙ или вебновелл-регистр — всё внешнее подкрепление, не прямая валидация.
### 2.3 Русская репараграфизация — когда N:M легитимно ОБЯЗАТЕЛЬНА (2б)
Кодифицированная норма (Лопатин ПАС §138 [orthographia](http://orthographia.ru/punctuatio.php?sid=137); Розенталь §5253 [old-rozental](http://old-rozental.ru/punctuatio.php?sid=160); Правила-1956 §51 [orfogrammka](https://orfogrammka.ru/OGL05/71827535.html)) — стабильна 1956→2006, все **CONFIRMED**:
- **Реплики диалога с абзаца — каждая с тире.** ⟹ китайская строка, паковавшая несколько реплик, ДОЛЖНА стать несколькими тире-абзацами (1:N).
- **Реплика + слова автора — остаётся 1:1** (одним абзацем). Давление 1:N — именно «несколько реплик на одной исходной строке», не диалог вообще.
- **Нет кодифицированного МАКСИМУМА длины абзаца** ([Мильчин]) → дробление длинного описательного абзаца — дискреционный стиль, НЕ норма-форсированное N:M.
- **Нюанс (upgraded CONFIRMED):** «в подбор» (run-in, в кавычках) — кодифицированная альтернатива → 1:N-дробление СИЛЬНО-конвенционально, но не типографски неизбежно. ⟹ **флаггер парности должен трактовать mismatch на диалоге как ОЖИДАЕМЫЙ, не считать пайплайн неправым.**
Асимметрия (weak-spot): нормы подкрепляют ДРОБЛЕНИЕ (1:N) сильно, СЛИЯНИЕ (N:1) — только редакторской дискрецией. Проба нашла оба. ⟹ диалог-аварный флаггер: 1:N на диалоге = ожидаемо (не флагать); описательное слияние — слабее вес. (Все источники — русско-монолингвальная типографика; мэппинг zh→ru — прикладное рассуждение, не sourced-факт.)
### 2.4 Пост-хок выравниватели — инструмент eval/пилота (2в), НЕ прод
**BERTALIGN — рекомендация для сборки zh↔канонический-русский GOLD-пар пилота** (CONFIRMED): LaBSE-эмбеддинги + двухшаговый DP (top-k 1:1 якоря → N:M внутри якорной полосы), поддерживает zh И ru, MIT-ish, крутится на GTX 1070 8GB/CPU = $0. Лучший на CJK-литературе (MAC strict-F1 **0.909** > Vecalign 0.873 > Bleualign 0.676 > Hunalign 0.607 > Gale-Church 0.455 [aligner-eval](https://github.com/bfsujason/aligner-eval)); ранг независимо подтверждён (Nature 2023, EN-SK, [s41598-023-47479-w](https://www.nature.com/articles/s41598-023-47479-w)). **Алгоритм = ровно паттерн оркестратора: найти 1:1 якоря, затем N:M между ними.**
Оговорки: (1) провенанс single-author (Liu&Zhu = и MAC-корпус, и бенчмарк, и статья) — нет независимой репликации ранга на литературе; (2) **НОЛЬ измеренных zh→ru** (всё zh→en) — трактовать выход как SILVER, не-1:1 верить руками; (3) **REFUTED: не цитировать «0.936»** — это German-French Text+Berg, не CJK; верное CJK-число = 0.909. Fallback: Vecalign (без MT). Избегать: Bleualign (нужен MT одной стороны = $, непригоден для $0), Gale-Church/Hunalign (валятся на литературе). Align на уровне предложений → агрегировать к абзацам/чанкам.
### 2.5 Форсировать структуру промптом? (2г) — НЕТ, флаггер лучше
**Вердикт: предпочесть (б) дешёвый детерминированный флаггер парности над (а) жёстким констрейнтом на переводчика.** Основания (все CONFIRMED):
- Инструкция сохранять структуру НЕ работает: даже явное «do not merge/split» — gpt-4o-mini всё равно сливает ([subtitleedit#8868](https://github.com/SubtitleEdit/subtitleedit/discussions/8868)); лучшие тулзы лишь «reduce» десинки, не устраняют ([llm-subtrans](https://github.com/machinewrapped/llm-subtrans)).
- Индустрия конвергировала на **detect-and-recover/флаг слой** (GalTransl, SakuraLLM, рекурсивная ре-сегментация [chatgpt-subtitle-translator](https://github.com/Cerlancism/chatgpt-subtitle-translator)).
- Более мелкая жёсткая единица ДЕГРАДИРУЕТ литкачество: пофразово vs абзац — +29.5% mistranslations, +65.4% грам-ошибок, ×12 inconsistency, ×3 register (Karpinska). Жёсткая парность дралась бы с корректным переводческим поведением.
- «Format-constraints-hurt-reasoning» (Let Me Speak Freely, EMNLP24) существует, но оспорено (dottxt rebuttal — структура ≥ неструктура при matched-промптах) и без MT-задачи → **не решает вопрос**. Мягкий nudge допустим; жёсткий гейт — нет.
---
## 3. Визуализация доверия — цветная полоса (направление 3)
### 3.1 Детерминированный цвет-мап — проекция УЖЕ существующего read-model ($0)
`status.go` уже считает всё сырьё: `ChunkState` (done/flagged/in_progress/pending), per-chunk `escalated`, `postcheck_misses`, `style_flags`, 12-энумный `FlagReason`, `GlossaryMissFlagged` (post-check гейт пометил ИНАЧЕ-готовый чанк — перевод ЕСТЬ, термин отсутствует; подмножество flagged, НЕ re-drivable), passport-вердикт (0/1/≥2 flagged = pass/attention/fail). Критично: под skip+flag (D2) флагнутый чанк НЕ коммитит перевод → в экспорте zh-плейсхолдер.
| Цвет | Условие (детерминированное, из полей status.go) | Смысл |
|---|---|---|
| **RED** | flagged без годного dst: cjk_artifact / excision_suspect / hard·soft_refusal / content_filter / length / empty / loop_degenerate / decode_error / hard_block / upstream_not_ok (и эскалация НЕ починила ре-гейтом) | НЕ переведено — читатель видит помеченный плейсхолдер |
| **YELLOW** | переведено (done), но сработало сомнение: `escalated=true` (починено фолбэком) ИЛИ glossary_miss ИЛИ postcheck_misses>0 (наблюдаемость, гейт off) ИЛИ style_flags>0 (тире-диалог / ё / транслит-междометие / 万億) | «редактировать первым» — переведено, но под сомнением |
| **GREEN** | done, escalated=false, postcheck_misses=0, style_flags=0 | чисто |
Приоритет YELLOW уже есть: `flagReasonSeverity()` ранжирует refusal(0) > cjk/excision/coverage(1) > loop(2) > decode(3) > glossary_miss(4) > length/empty(5); style-флаги — мягчайший YELLOW. Никакой LLM-самооценки.
**Рекомендации по конвенции (§1.1 + §3.2):** (1) **добавить GREY = pending/не-прогнано** (CAT-конвенция: непереведённое=серое, красное — жёсткий ПРОВАЛ; наш «flagged без перевода после эскалации» — истинный провал, ок как красный, но «ещё не дошли руки» ≠ красный); (2) 3-х-тир для читателя (green/yellow/red = готово/проверь/сломано) хорош, но **бэкенд-требование: расширить passport-rollup до 3-тир, считающий done+escalated / glossary_miss / style как YELLOW** — сегодня passport «attention» триггерит только на RED-чанк, YELLOW не катится наверх.
### 3.2 Калибровка «не всё жёлтое» — самый консеквентный раздел (CONFIRMED)
Индустрия и наука сходятся в один закон: **преимущественно-жёлтый сигнал бросается ЦЕЛИКОМ, утягивая красный.**
- **Google Tricorder — CONFIRMED:** жёсткий кап **<10% ложных на чекер** (находка реальная проблема 90%), реализованный агрегат <5%; чекеры выше бара УДАЛЯЮТСЯ; низкий FP-rate (не FN) критичный драйвер принятия; per-finding кнопка «Not useful» демоут чекера ([SWE-book ch20](https://abseil.io/resources/swe-book/html/ch20.html)).
- **Alert fatigue CONFIRMED:** клиницисты игнорят 4996% drug-safety алертов из-за шума ([JAMIA](https://pmc.ncbi.nlm.nih.gov/articles/PMC1447540/)); утомлённые игнорят И шум, И критику; фикс тир по severity, только высшие interruptive ([AHRQ](https://psnet.ahrq.gov/primer/alert-fatigue)). SRE (Ewaschuk): каждый page обязан быть actionable, «err toward removing noisy alerts». Cry-wolf: ложные тревоги вредят доверию БОЛЬШЕ пропусков YELLOW тюнить на высокий PPV.
- **SonarQube Clean-as-You-Code CONFIRMED:** гейт только на НОВОМ/изменённом коде (whole-corpus-гейты «fail forever and get disabled»), condition-set маленький.
- **VS Code CONFIRMED:** 4-уровневая severity (Error/Warning/Info/Hint), но вес только у Error+Warning; **overview ruler = whole-file полоса** (= наша книго-полоса) с задокументированным отказом «too crowded by warnings to see errors» (жёлтое топит красное); file-tree rollup = worst-descendant цвет + count-badge (плотность сохранена).
**Дизайн-закон для полосы:** конфигурируемая таблица severity per-flag-reason (тюнимость общий паттерн VS Code/Trados/memoQ/MQM minor·major·critical); **гейт YELLOW на бюджет ложных <10% per flag reason** (демоут/скрытие превышающих); rollup **worst-child + СЧЁТ** (1 red 50 red); флагать по дельтам ТЕКУЩЕГО прогона. **Калибровочный инструмент (замер precision каждого флага) — ГЕЙТ перед тем как цветам можно верить.** Цвет пара­ить с иконой/формой (colorblind, coverage-gutters #330).
---
## 4. Контракт бэкенд→фронт (направление 4, выход в пакет №4)
Рамка: `tmctl` сегодня имеет translate/report/status/redrive; параллельный экспорт этапа A был ad-hoc. Всё ниже экспорт-артефакты (проекция read-model), НЕ веб-сервер.
### 4.1 Схема `annotations.json` (4а) — версионированный контракт
Per-chunk проекция из `chunk_status`+`retrieval_state`+`request_log` ($0, как `status --json`). Поля:
```jsonc
{
"schema_version": "annot-v1",
"book_id": "...", "snapshot_id": "<wire-снапшот строк>",
"source_file_hash": "...", "chunker_version": "...", // FE детектит устаревшие якоря (дисциплина ConfigDrift/SnapshotDrift status.go)
"chunks": [{
"chapter": 14, "chunk_idx": 1,
"src_range": {"char_start": .., "char_end": ..}, // в нормализованный источник — точно (чанкер lossless)
"dst_range": {"char_start": .., "char_end": ..}, // в собранный перевод
"state": "done|flagged|in_progress|pending",
"color": "green|yellow|red|grey", // производное (§3.1)
"reasons": ["escalated","glossary_miss","style:dialogue_dash"], // причины yellow/red, человекочитаемо
"flag_reason": "cjk_artifact|...",
"escalated": true, "escalation_model": "deepseek-v4-pro",
"postcheck_misses": [{"src":"古月","dst":"Гуюэ"}],
"style_flags": [{"kind":"dialogue_dash","span":[..]}],
"cost_usd": 0.0123,
"paragraph_anchors": [{"src_para":[s,e],"dst_para":[s,e]}] // BEST-EFFORT мягкий оверлей, может быть N:M/отсутствовать
}]
}
```
`src_range/dst_range` несущий якорь (чанк-уровень, точный). `paragraph_anchors` мягкий оверлей, вычисляется дешёвым выравнивателем на экспорте, явно допускается N:M/частичный. Версионирование (`schema_version` + хеши) FE знает, когда якоря устарели.
### 4.2 Политика красных чанков (4б) — сборка перевода
Экспорт этапа A уже демонстрирует ответ: флагнутый чанк = помеченный zh-плейсхолдер (`[ФЛАГ: cjk_artifact]` + источник). Варианты:
- **(A) Помеченный плейсхолдер «[не переведено: reason + источник встык** (текущее). PRO: редактор видит что и почему отсутствует; якорь цел; честно (D25.1 «run complete publishable» демонстрировано). CON: нечитаемо для читателя (но экспорт editor-facing).
- (B) Пропуск. CON: тихая дыра, ломает якорь.
- (C) Источник встык без маркера. CON: смесь языков (жалоба F6 худшее для читателя, выглядит багом).
- **РЕК: (A) для editor-facing экспорта; reader-facing (D25.1 release-state лестница) обязан fail-closed на красных** (structurally_complete требует 0 красных). `color=red`+`flag_reason` в annotations.json позволяет FE рендерить плейсхолдер как угодно (свёрнуто, «перевести сейчас»-кнопкой). Прямая привязка к **D25.1**: красные блокируют `structurally_complete` детерминированный fail-closed экспорт структурных дыр.
### 4.3 human_override (4в) — скоуп и риски (самый контрактно-опасный; думать с D15.2)
**В D15.2 human_override НЕ спроектирован** (спека про content-addressed resume: wire/verdict/guard-хеши). Это net-new. Прайор-арт (CAT/codegen) даёт готовые механизмы:
- **memoQ safe-by-default (CONFIRMED):** pre-translate НЕ меняет edited/confirmed сегменты; Lock = жёсткая иммутабельность, не авто-пропагируется ([lock-segments](https://docs.memoq.com/current/en/Workspace/lock-segments.html)).
- **Trados статус НЕ гарантия (PLAUSIBLE):** дефолт overwrite-if-better на API-уровне НЕ защищает по статусу; задокументирован случай перезаписи confirmed-сегмента NMT-ом **жёсткая гарантия только явный LOCK / context-keyed carry-over**, статус advisory.
- **ICE/101%-матч (Phrase) CONFIRMED:** переиспользование, не перезапись, требует КОНТЕКСТНОГО ключа (src-идентичность + контекст = пред/след сегменты или segment-ID). 100%=src совпал, контекст иной.
- **Trados PerfectMatch / memoQ X-Translate CONFIRMED:** content/context-addressed carry-over ПРЕДЫДУЩЕГО человеческого выхода на обновлённый источник (против прошлых bilingual-файлов, не TM); PerfectMatch терпит сегментационный дрейф, сливая до 3 сегментов, юниты залочены; X-Translate требует version history, выбор provenance-тира.
- **Codegen (Copier 3-way merge, protected regions) CONFIRMED:** protected-regions любая непомеченная правка тихо перезаписывается; merge конфликты руками; Copier хранит provenance (`.copier-answers.yml`), конфликты маркерами, не тихой потерей ([1509.04498](https://arxiv.org/pdf/1509.04498)).
**Пересечения с нашим пайплайном (опасная часть):** пайплайн content-addressed по `RequestHash` (складывает wireSnapshotID); override НЕ-модельный текст без RequestHash.
1. **redrive** переrun-ит модель на флагнутых КЛОББЕР override, если override не ПИНИТ чанк (как CAT locked segment).
2. **resume** безопасно (заполняет только не-прогнанные).
3. **--resnapshot** (смена конфига) переоплачивает книгу вкл. override-чанк: (а) не-пиннутый потерян; (б) пиннутый человеческий текст поверх ИНОГО окружающего перевода (override писался под старый драфт) дрейф консистентности. Показать стоимость + WARN.
4. **TM/глоссарий:** override чанк-локальная формулировка, НЕ терминное решение. Авто-запись в TM утекла бы формулировку в другие чанки (и TM ключится src-чанк+model_id+prompt_version у override нет model_id). **НЕ авто-кормить override в TM;** термин-везде = правка глоссария (отдельно, осознанно, --resnapshot).
**РЕК-скоуп (не дизайн) — два слоя:**
- **Слой 1 provenance LOCK safe-by-default** (memoQ-модель): per-chunk `human_override` флаг; redrive/resume/re-pre-translate трактуют override как ИММУТАБЕЛЬНЫЙ по умолчанию (никогда Trados-дефолт «overwrite-if-better»). Тест: redrive НЕ мутирует ни один override-чанк. Ложится сейчас как passport/export-contract-добавка.
- **Слой 2 content/context-keyed carry-over** через переоплаченный re-run (PerfectMatch/X-Translate/Copier-модель): ключить override к (content_hash src-чанка + соседний контекст), пере-инжектить на совпавший чанк нового прогона; терпеть измеренный дрейф парности (58%/72%) окном merge N чанков; **когда src/контекст ИЗМЕНИЛИСЬ — НЕ тихо хранить и НЕ тихо клоббить, а поднять ТРЕТЬЕ состояние «override needs re-review» (YELLOW-конфликт)**. Предусловие (честный гэп): хранить прошлый override-текст+контекст durable-снапшотом. Метрика на 25-гл: overrides {сохранён / re-review / тихо-потерян}, цель тихо-потерян=0. Полный дизайн с реализацией D15.2 v3.1 (wire/verdict-split та же машинерия, что нужна override-слою; синергия D26.4).
### 4.4 Chat-edit фрагмента через провайдера (4г) — скоуп/цена/риск
Канонический UX (CONFIRMED): **выделить спан → NL-инструкция → ДИФФ-превью → явный accept/reject** (Cursor Cmd+K [cursor.com/docs](https://cursor.com/docs/inline-edit/overview); Copilot inline chat [code.visualstudio.com](https://code.visualstudio.com/docs/copilot/chat/inline-chat)); сложное из inline-полосы в agent-режим. CAT-аналог: Trados AI / memoQ AGT ре-генерят сегмент по инструкции с обязательным человеческим accept (никогда авто-коммит), AGT грунтует RAG-ом по TM/термбазе.
Задокументированные риски (все CONFIRMED):
1. **«apply»-шаг главный слабый узел:** Cursor построил спец-apply-модель, т.к. LLM плохи в диффах (репорты удалённых функций). **пере-вставлять правку через НАШ детерминированный chunk/sentence span-map, НЕ LLM-apply.**
2. **Потеря окружающей консистентности:** ре-генерация изолированного фрагмента без документного контекста противоречия глоссарию/сущностям (Herold&Ney [2306.05183](https://arxiv.org/abs/2306.05183)). Митигация: передавать соседние чанки + глоссарий/passport read-only контекстом.
3. **Overcorrection (APE):** правка уже-хорошего текста ДЕГРАДИРУЕТ его ([2020.emnlp-main.217](https://aclanthology.org/2020.emnlp-main.217/)). **предлагать chat-edit только на YELLOW/RED, не на GREEN** цвет-статус драйвит доступность фичи (синергия с «редактировать первым»).
4. **Галлюцинации:** LLM-MT выше риск; митигация detect-then-retranslate ([2501.17295](https://arxiv.org/abs/2501.17295)) = **прогнать ре-генерённый фрагмент через ТОТ ЖЕ флаггер, не доверять**.
5. **Цена:** каждый edit метрируемый draft/editor-вызов; вендоры не публикуют per-edit цену мерить самим, в per-chapter COGS (vs ~$0.69/новелла).
---
## 5. Креатив (🧪 гипотезы, каждая — со слотом)
- 🧪 **Диалог-аварный флаггер парности** (слот: флаггер/style-класс, $0). Классифицировать чанк как диалоговый (regex по CJK-кавычкам 「」『』“”《》 / несколько реплик на строке) vs описательный; на dst детектить тире-абзацы. Правило: 1:N на диалоге = ОЖИДАЕМО (не флагать, §2.3 норма); описательное слияние = слабее вес; диалог, НЕ раскрывшийся в тире-абзацы = кандидат YELLOW. **Фальсифицируемо:** пере-нарезать 58%/72% пробы по диалог-vs-описание; если расхождение концентрируется в (i) легитимно-развернувшихся диалогах и (ii) легит-слияниях норма-гипотеза верна и «расхождение БЕЗ диалог-маркера И без компенсирующего слияния» малая high-value популяция флагов. Полигону (eval-tool refine пробы).
- 🧪 **Passport несёт arity-распределение абзацев** (слот: passport/export, $0): per-глава доля 1:1/1:N/N:1 против ожидаемой полосы (~60% CJK-литература 85% структурный) чтобы 58% читалось как норма жанра, а не урон. GREEN если в полосе; ревью только если ДАЛЕКО ниже ~60% ИЛИ слияния коррелируют с excision/length.
- 🧪 **«Not useful»-петля обратной связи на флаг** (слот: passport/eval-tool, Tricorder-модель): редактор в ридере жмёт «не полезно» на YELLOW накапливается precision per-flag-reason авто-демоут флага ниже порога в свёрнутый «слабые сигналы». Превращает калибровку §3.2 в живой контур.
- 🧪 **Cost-of-fix ранжирование «что править первым»** (слот: F3-brief): сортировать YELLOW не только severity, но и (severity × стоимость-починки): glossary_miss = 1 правка терма чинит N чанков (дёшево, высокий эффект); style-флаг = локальная косметика. Показывать редактору порядок.
- 🧪 **Bertalign-мост «прошлый том»** (слот: eval-tool/пилот): выровнять канонический русский перевод прошлого тома к его zh-источнику bertalign-ом извлечь термины/имена как seed-кандидаты (AMBIGUOUS, ждут approve) для нового тома закрывает START_PROMT п.14 (референсы прошлых томов) дёшево, БЕЗ прод-выравнивания. Гейт: zhru spot-check bertalign до доверия (нет измеренных zhru).
Идеи «перестроить бэкенд под фронт» нет: экспорт-артефактов из read-model хватает 4.1 доказывает).
---
## Таблица: вопрос владельца → ответ → рекомендация → слот → фаза
| Вопрос | Ответ (вердикт) | Рекомендация | Слот | Фаза |
|---|---|---|---|---|
| «Страница в страницу»? | НЕТ страница = артефакт рендера (CONFIRMED все инструменты) | Якорить ЧАНК (=бед); абзац мягкий оверлей; ко-локация спаренных якорей, не свободный скролл-синк | F3-brief | 3 |
| Как якорить оригиналперевод при расхождении объёма? | Иерархия: главачанк(точно)→абзац(58%)→предложение; наш чанк рождается атомом в пайплайне | src_range/dst_range в annotations.json (несущий); paragraph_anchors best-effort | export-contract | 1 (контракт), 3 (UI) |
| Парность абзацев сколько? | 58% точно / 72% ±1 (наша проба); норма CJK-литературы (внешн. 60.2% предл.) | Не гнать к 100%; флаггер парности как YELLOW-наблюдаемость, не hard-fail | флаггер | 1 |
| Форсировать структуру промптом? | НЕТ инструкция ненадёжна (CONFIRMED), жёсткость деградирует качество | Дешёвый детерминированный флаггер; мягкий nudge макс, не гейт | флаггер | 1 |
| Удобно ли редакторам? Что доказанно помогает? | Подсветка НЕ ускоряет и мешает при неточности (QE4PE); **precision > покрытие** | Калибровать YELLOW (<10% ложных/флаг), градуировать, не бинар | флаггер/eval-tool | 1 (замер), 3 (UI) |
| Как красить green/yellow/red? | Проекция существующего read-model; NO числовой confidence (нет QE/logprobs) | Цвет-мап §3.1 + GREY pending; passport-rollup до 3-тир | export-contract/passport | 1 |
| «Не всё жёлтое»? | Преимущественно-жёлтое бросается целиком (Tricorder/alert-fatigue) | severity-таблица per-flag, гейт на FP-бюджет, worst-child+счёт, дельты | флаггер/passport | 1 |
| Красные чанки в сборке? | Помеченный плейсхолдер (текущее) честно (D25.1) | (A) editor-facing; reader-facing fail-closed на красных (structurally_complete) | export-contract | 1 |
| human_override vs redrive/resume/TM? | Не спроектирован (net-new); аналог CAT lock + PerfectMatch | 2 слоя: provenance LOCK safe-by-default + context-keyed carry-over с YELLOW-конфликтом; НЕ авто-TM | export-contract (с D15.2) | 1.5 |
| Chat-edit фрагмента? | UX selectinstructdiffaccept; риски: apply/консистентность/overcorrect/галлюц/цена | Re-insert через наш span-map; только на YELLOW/RED; re-flag выход; метрить COGS | F3-brief | 3 |
| Как это делают конкуренты? | Никто не сочетает reader-embedded книго-полосу из детерм. вердиктов + ru + серия | Наш синтез новый (скрининг); ко UX: Mantra layout, InterText flag-non-1:1 | | |
| Выравниватели для канона (eval)? | Bertalign (MAC F1 0.909), $0 на стенде; НЕТ измеренных zhru | Bertalign для GOLD-пар пилота (SILVERручная сверка); не в прод | eval-tool | 2.5 (пилот-подготовка) |
---
## Честные слабые места
1. **Внешняя валидность:** НИ ОДИН источник не мерит zhРУССКИЙ или вебновелл-регистр. Парность-литература (Bertalign 60.2%, JRC 85%, Gale-Church) zhen / европейские; русские нормы монолингвальны; PE-исследования en-центричны. Всё внешнее подкрепление, не прямая валидация (совпадает с оговоркой CLAUDE.md «претрейн-классика = предварительно до вебновелл-среза»).
2. **Проба — один конфиг/книга/25 глав.** 58%/72% на этапе A (deepseek+glm-5); выигравший конфиг exp12/этапа B может дать иную парность. Кросс-гранулярность: 58% (абзац) 60.2% (предложение) направление, не эквивалентность. «draft==src 56 включает 4 эхо-чанка (занижает).
3. **Bertalign — single-author провенанс** (Liu&Zhu = корпус MAC + бенчмарк + статья); нет независимой репликации ранга на CJK-литературе; zhru не мерено до доверия нужен in-house spot-check.
4. **CAT/вендор-источники — описание ПОВЕДЕНИЯ, не замеры.** Mantra 73%-числа self-reported; XL8 «uncertainty threshold» нераскрытый маркетинг; Lilt «productivity gains» REFUTED как измерение. Несколько цитат верификаторы пометили как требующие переуказания URL (memoQ warnings-цвета, Translated heatmap, Cursor design.dev-шорткаты, «40% apply-fail» вторичный): факты верны, точные URL/квоты переуказать перед публикацией (детали в `scratchpad/digest.txt`).
5. **Trados-докам не удался чистый fetch** (403 на docs.rws.com/gateway.rws.com throughout) MTQE-светофор, PerfectMatch, семь статусов, overwrite-случай подтверждены сниппетами + корроборацией, не verbatim-первоисточником.
6. **QE4PE — сильнейший, но это ПРЕДУПРЕЖДЕНИЕ, не одобрение флаггера:** доказывает, что польза подсветки НЕ гарантирована и решает precision; наш детерминированный флаг оправдан ЛИШЬ при высокой точности которую надо ЗАМЕРИТЬ (гейт §3.2), а не предположить.
7. **Reader-embedded книго-полоса — без внешнего прецедента как целого** (компоненты есть, сборка новая PLAUSIBLE absence). Нельзя доказать универсальное отсутствие.
8. **Русские нормы подкрепляют ДРОБЛЕНИЕ (1:N) сильнее СЛИЯНИЯ (N:1)** слияние опирается только на редакторскую дискрецию «нет макс-длины»; проба нашла оба. Мэппинг zhru-норм прикладное рассуждение, не sourced-факт. Claim о «нет макс длины» мис-атрибутирован (Издательский словарь-справочник, не Справочник издателя) суть верна.
9. **LinguaGacha 3-классный ResponseChecker — только deepwiki (AI-gen)**; живой код подтверждает лишь 1 из 3 + glossary-miss. Не цитировать как primary. Output-side CJK-детект НЕ наш дифференциатор (GalTransl/LinguaGacha делают).
10. **«format-constraints-hurt-reasoning» не решён** оспорен (dottxt), без MT-задачи; обе стороны с ограничениями. Не опирать на него.
---
## БАР-рекомендации (сводка: механизм → слот → цена → как мерить → фаза)
Все COGS $0 (read-only проекция + фронт/дизайн).
1. **Цвет-мап из read-model + GREY-тир + 3-тир passport-rollup** export-contract/passport $0 аудит: каждый цвет трассируется к flag_reason **Ф1 (контракт), Ф3 (UI)**.
2. **Калибровка YELLOW: severity-таблица per-flag, FP-бюджет <10%/флаг, «Not useful»-петля** флаггер/eval-tool $0 precision каждого флага против blind-чтения владельца/редактора; ГЕЙТ перед показом цветов **exp12/полигон СЕЙЧАС** (go/no-go цветной полосы = «достаточно ли точны флаги, чтобы редактор доверял»).
3. **annotations.json (src_range/dst_range несущий, paragraph_anchors best-effort) + version-хеши** export-contract $0 FE детектит устаревшие якоря **Ф1**.
4. **Политика красных: (A) editor-facing плейсхолдер, reader-facing fail-closed** (D25.1 structurally_complete) export-contract $0 **Ф1**.
5. **human_override 2 слоя (LOCK safe-by-default + context-keyed carry-over с YELLOW-конфликтом, НЕ авто-TM)** export-contract с D15.2 v3.1 $0 метрика «тихо-потерян= на 25-гл **Ф1.5**.
6. **Диалог-аварный флаггер парности (наблюдаемость, не hard-fail)** флаггер $0 пере-нарезка пробы диалог/описание **Ф1/Ф2**.
7. **Chat-edit: span-map re-insert (не LLM-apply), только YELLOW/RED, re-flag выход, метрить COGS** F3-brief метрируемый draft/editor-вызов accept-rate/re-flag-rate/$-per-edit **Ф3**.
8. **Bertalign для GOLD-пар канона (eval), SILVER→ручная сверка не-1:1** eval-tool $0 (GTX 1070/CPU) strict-F1 против held-out zhru **Ф2.5 (пилот-подготовка)**.
---
## Источники (несущие)
**CAT/HITL:** memoQ [grid](https://docs.memoq.com/current/en/Workspace/the-grid.html)/[results](https://docs.memoq.com/current/en/Workspace/translation-results-list.html)/[lock](https://docs.memoq.com/current/en/Workspace/lock-segments.html)/[x-translate](https://docs.memoq.com/current/en/Workspace/x-translate.html)/[pre-translate](https://docs.memoq.com/current/en/Workspace/pre-translate-and-statistics.html)/[AGT](https://www.memoq.com/product/memoq-agt/) · Phrase [segments](https://support.phrase.com/hc/en-us/articles/5709678012828-Segments-TMS)/[QPS](https://support.phrase.com/hc/en-us/articles/5709672289180-Phrase-QPS-Overview)/[context](https://support.phrase.com/hc/en-us/articles/9386879839900-Translation-Memory-Match-Context-TMS) · Trados [MTQE](https://docs.rws.com/en-US/trados-studio-2024-1145319/support-for-machine-translation-quality-estimation-mtqe--1147923)/[PerfectMatch](https://docs.rws.com/en-US/sdl-trados-studio-783545/perfectmatch-341156)/[pre-translate-API](https://developers.rws.com/studio-api-docs/apiconcepts/projectautomation/pre_translate_settings.html)/[AI](https://www.trados.com/blog/new-generative-translation-capabilities-in-trados-studio/) · MateCat [status](https://guides.matecat.com/segment-status) · Custom.MT [QE](https://custom.mt/machine-translation-quality-estimation/).
**PE-исследования:** QE4PE [2503.03044](https://arxiv.org/html/2503.03044v2) · Shenoy EMNLP2021 · Liu&Dai [MTSummit2025](https://aclanthology.org/2025.mtsummit-1.38/) · Green UIST2014.
**Издательские/фан:** Mantra [pixivision](https://www.pixivision.net/en/a/7427)/[typeset](https://mantra.co.jp/en/news/mantra-an-ai-manga-translation-startup-jointly-develops-manga-typesetting-specification-engine)/[AAAI2021](https://aaai.org/papers/12998-towards-fully-automated-manga-translation/) · XL8 [MediaCAT](https://www.xl8.ai/blog/boost-your-localization-qc-productivity-5-key-mediacat-features) · GalTransl [README](https://github.com/GalTransl/GalTransl/blob/main/README.md?plain=1)/[Prompts](https://github.com/GalTransl/GalTransl/blob/main/GalTransl/Backend/Prompts.py) · SakuraLLM [epub](https://github.com/SakuraLLM/SakuraLLM/blob/main/translate_epub.py) · AiNiee.
**Якорение/парность:** Moore beads [AMTA2002](https://www.microsoft.com/en-us/research/wp-content/uploads/2002/10/sent-align2-amta-final.pdf) · InterText [LREC2014](https://mt-archive.net/10/LREC-2014-Vondricka.pdf) · bilingual_book_maker [epub_loader](https://raw.githubusercontent.com/yihong0618/bilingual_book_maker/main/book_maker/loader/epub_loader.py) · Immersive Translate [docs](https://github.com/immersive-translate/old-docs/blob/main/README_english.md) · Bertalign [DSH](https://academic.oup.com/dsh/article-abstract/38/2/621/6965034)/[repo](https://github.com/bfsujason/bertalign)/[eval](https://github.com/bfsujason/aligner-eval) · Xue&Yang [ACL2011](https://aclanthology.org/P11-2111.pdf) · Gale-Church [CL1993](https://aclanthology.org/J93-1004.pdf) · JRC-Acquis [cs/0609058](https://arxiv.org/pdf/cs/0609058) · Karpinska [WMT2023](https://aclanthology.org/2023.wmt-1.41/) · Nature EN-SK [2023](https://www.nature.com/articles/s41598-023-47479-w) · LaBSE [2007.01852](https://arxiv.org/abs/2007.01852).
**Русские нормы:** Лопатин ПАС §138 [orthographia](http://orthographia.ru/punctuatio.php?sid=137) · Розенталь §52-53 [old-rozental](http://old-rozental.ru/punctuatio.php?sid=160) · Правила-1956 §51 [orfogrammka](https://orfogrammka.ru/OGL05/71827535.html).
**Forced-structure:** SubtitleEdit [#8868](https://github.com/SubtitleEdit/subtitleedit/discussions/8868) · llm-subtrans · Cerlancism · Karpinska WMT2023 · Let-Me-Speak-Freely [2408.02442](https://arxiv.org/html/2408.02442v1)/dottxt rebuttal.
**Trust-viz:** Google Tricorder [SWE-book ch20](https://abseil.io/resources/swe-book/html/ch20.html) · JAMIA alert-fatigue [PMC1447540](https://pmc.ncbi.nlm.nih.gov/articles/PMC1447540/) · AHRQ [alert-fatigue](https://psnet.ahrq.gov/primer/alert-fatigue) · SonarQube [quality-gates](https://docs.sonarsource.com/sonarqube-server/quality-standards-administration/managing-quality-gates/introduction-to-quality-gates) · VS Code [#46999](https://github.com/microsoft/vscode/issues/46999)/[UI](https://code.visualstudio.com/docs/getstarted/userinterface).
**Inline-edit/override:** Cursor [inline-edit](https://cursor.com/docs/inline-edit/overview)/[apply-forum](https://forum.cursor.com/t/thoughts-on-the-apply-model/61511) · Copilot [inline-chat](https://code.visualstudio.com/docs/copilot/chat/inline-chat) · Herold&Ney [2306.05183](https://arxiv.org/abs/2306.05183) · APE overcorrection [EMNLP2020](https://aclanthology.org/2020.emnlp-main.217/) · hallucination [2501.17295](https://arxiv.org/abs/2501.17295) · Copier [docs](https://copier.readthedocs.io/en/stable/updating/) · codegen [1509.04498](https://arxiv.org/pdf/1509.04498).
*Полный дайджест находок + верификаций (13 тем, 8 верифицированных клеймов/тему, weak-spots) — рабочий артефакт сессии, не в git.*