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

77 KiB
Raw Blame History

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 — 蛊真人 zh→ru, 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, 42→24), Δ=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×» из промта — в ТОКЕНАХ; в символах zh→ru ~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, accessed 2026-07-11), Phrase (Segments-TMS), MateCat (segment-status).

Ключ: статус (workflow: not-started/draft/translated/reviewed/approved/rejected) и MATCH-RATE/провенанс (TM/MT/термбаза/fuzzy%) — ДВА отдельных цветовых канала; match-rate ИНФОРМИРУЕТ, но НИКОГДА не гейтит сегмент (CONFIRMED across memoQ translation-results-list, Phrase CAT-Pane, 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; Custom.MT «0100 из learned QE моделей», custom.mt; ModelFront/ModernMT). QE по определению reference-free (WMT QE task). Trados/Language Weaver MTQE = per-segment светофор green/amber/red из обученной QE (CONFIRMED, Studio-2024 docs; прямой fetch 403, подтверждено сниппетами). Книго-широкая цветная СТАТУС-ПОЛОСА из QE-score — реальный UX (Custom.MT над Trados: зелёная при score≥порог; custom.mt) — валидирует концепт нижней полосы владельца.

Следствие для нас (жёсткое): у нас нет ни 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, 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).
  • 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) — ровно центральная раскладка владельца в shipped-инструменте. Engine классифицирует пузырь (standard/thought/scream/narration), детерминированно ПРЕДЛАГАЕТ шрифт/размер → человек валидирует (mantra.co.jp; бета 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). Прямой аналог нашего per-flag redrive.
  • SakuraLLM — CONFIRMED: дрейф числа строк — first-class задокументированный режим отказа: системный промпт запрещает менять \n, цель обучения — «понизить вероятность расхождения числа строк», а translate_epub.py СЛЕПО падит ''/усекает выход под число групп (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). ⟹ наш чанк = бед.
  • Все серьёзные инструменты якорят текстовый УЗЕЛ/сегмент, никогда рендер-страницу — 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). Точный прецедент YELLOW=«редактировать первым» и ко-локации спаренных якорей.

Уточнение гипотезы (PLAUSIBLE, частичный refute): гипотеза расщепляется. (а) «якорить узлы, страницы=артефакт» — из потребительских ридеров (bilingual_book_maker вставляет перевод как sibling-узел после <p>, epub_loader.py; Immersive Translate — абзац по умолчанию, old-docs); НО они пар­ят строго 1:1 по узлу, N:M-подвыравнивания НЕ делают. (б) «N:M split-diff, флаг не-1:1» — из выравнивателей/InterText. Не-дрейфующий синк достигается КО-ЛОКАЦИЕЙ спаренных якорей (интерлив или общий строка-грид), НЕ скролл-синком двух свободных панелей (Word/Acrobat sync привязан к offset/странице, дрейфует на N:M — try67).

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; aligner-eval). Ближайший внешний аналог нашей пробы.
  • CJK-механизм (Xue & Yang, ACL 2011) — CONFIRMED: китайский — comma-chained «run-on» предложения → 1:N в цель; только ~16.6% китайских запятых — границы предложений (даже обученная модель ~70% F1); необратимая исходная неоднозначность, не дефект пайплайна (P11-2111).
  • Пол не-1:1 даже в структурном тексте: Gale-Church ~89% 1:1 (Hansard), ~11% non-1:1 — пол; JRC-Acquis 85% АБЗАЦЕВ 1:1 (cs/0609058). Наши 58% для CJK-литературы — ниже 85%-потолка структурного текста, ровно как предсказывает жанровый разрыв.
  • Karpinska & Iyyer (WMT2023) — CONFIRMED, важнейший ограничитель: абзац-уровневый LLM-перевод БЬЁТ пофразовый (меньше ошибок), НО «критические ошибки остаются, включая эпизодические content omissions» (2023.wmt-1.41). ⟹ парность абзацев НИКОГДА не должна быть зелёным сигналом сама по себе; excision_suspect/length-флаги сохранять обязательно.

Оговорка верификатора: 58% (абзац) ≠ 60.2% (предложение) — кросс-гранулярность, направление а не эквивалентность; ни один источник не мерит zh→РУССКИЙ или вебновелл-регистр — всё внешнее подкрепление, не прямая валидация.

2.3 Русская репараграфизация — когда N:M легитимно ОБЯЗАТЕЛЬНА (2б)

Кодифицированная норма (Лопатин ПАС §138 orthographia; Розенталь §5253 old-rozental; Правила-1956 §51 orfogrammka) — стабильна 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); ранг независимо подтверждён (Nature 2023, EN-SK, 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); лучшие тулзы лишь «reduce» десинки, не устраняют (llm-subtrans).
  • Индустрия конвергировала на detect-and-recover/флаг слой (GalTransl, SakuraLLM, рекурсивная ре-сегментация 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).
  • Alert fatigue — CONFIRMED: клиницисты игнорят 4996% drug-safety алертов из-за шума (JAMIA); утомлённые игнорят И шум, И критику; фикс — тир по severity, только высшие — interruptive (AHRQ). 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). Поля:

{
  "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).
  • 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).

Пересечения с нашим пайплайном (опасная часть): пайплайн 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; Copilot inline chat code.visualstudio.com); сложное — из 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). Митигация: передавать соседние чанки + глоссарий/passport read-only контекстом.
  3. Overcorrection (APE): правка уже-хорошего текста ДЕГРАДИРУЕТ его (2020.emnlp-main.217). ⟹ предлагать chat-edit только на YELLOW/RED, не на GREEN — цвет-статус драйвит доступность фичи (синергия с «редактировать первым»).
  4. Галлюцинации: LLM-MT выше риск; митигация — detect-then-retranslate (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 (референсы прошлых томов) дёшево, БЕЗ прод-выравнивания. Гейт: zh→ru spot-check bertalign до доверия (нет измеренных zh→ru).

Идеи «перестроить бэкенд под фронт» — нет: экспорт-артефактов из 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 select→instruct→diff→accept; риски: 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 на стенде; НЕТ измеренных zh→ru Bertalign для GOLD-пар пилота (SILVER→ручная сверка); не в прод eval-tool 2.5 (пилот-подготовка)

Честные слабые места

  1. Внешняя валидность: НИ ОДИН источник не мерит zh→РУССКИЙ или вебновелл-регистр. Парность-литература (Bertalign 60.2%, JRC 85%, Gale-Church) — zh→en / европейские; русские нормы — монолингвальны; 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-литературе; zh→ru не мерено — до доверия нужен 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) — слияние опирается только на редакторскую дискрецию «нет макс-длины»; проба нашла оба. Мэппинг zh→ru-норм — прикладное рассуждение, не 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 → метрика «тихо-потерян=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 zh→ru → Ф2.5 (пилот-подготовка).

Источники (несущие)

CAT/HITL: memoQ grid/results/lock/x-translate/pre-translate/AGT · Phrase segments/QPS/context · Trados MTQE/PerfectMatch/pre-translate-API/AI · MateCat status · Custom.MT QE. PE-исследования: QE4PE 2503.03044 · Shenoy EMNLP2021 · Liu&Dai MTSummit2025 · Green UIST2014. Издательские/фан: Mantra pixivision/typeset/AAAI2021 · XL8 MediaCAT · GalTransl README/Prompts · SakuraLLM epub · AiNiee. Якорение/парность: Moore beads AMTA2002 · InterText LREC2014 · bilingual_book_maker epub_loader · Immersive Translate docs · Bertalign DSH/repo/eval · Xue&Yang ACL2011 · Gale-Church CL1993 · JRC-Acquis cs/0609058 · Karpinska WMT2023 · Nature EN-SK 2023 · LaBSE 2007.01852. Русские нормы: Лопатин ПАС §138 orthographia · Розенталь §52-53 old-rozental · Правила-1956 §51 orfogrammka. Forced-structure: SubtitleEdit #8868 · llm-subtrans · Cerlancism · Karpinska WMT2023 · Let-Me-Speak-Freely 2408.02442/dottxt rebuttal. Trust-viz: Google Tricorder SWE-book ch20 · JAMIA alert-fatigue PMC1447540 · AHRQ alert-fatigue · SonarQube quality-gates · VS Code #46999/UI. Inline-edit/override: Cursor inline-edit/apply-forum · Copilot inline-chat · Herold&Ney 2306.05183 · APE overcorrection EMNLP2020 · hallucination 2501.17295 · Copier docs · codegen 1509.04498.

Полный дайджест находок + верификаций (13 тем, 8 верифицированных клеймов/тему, weak-spots) — рабочий артефакт сессии, не в git.