@startuml pipeline title TextMachine — поток перевода книги (v3 2026-07-09, синхронизировано с D1–D17)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2] = планово skinparam wrapWidth 260 start :Импорт книги [OK]: txt / epub по spine, ruby-захват, spine-reconciliation fail-loud (тихая потеря главы невозможна); :Сегментация [OK]: главы -> чанки ~1-2k токенов (sentence-pack, quote-depth, lossless); :Сид глоссария [OK]: ручной YAML + ruby-кандидаты (ja-книга: kana-написания имён — aliases руками, D16.4) · автопопуляция G1 [Ф1*/Ф2]: спот=локаль / рендер=облако; :Analyst: book brief (map-reduce) [Ф2]; :Terminologist: глоссарий + style sheet до перевода [Ф2]; note right snapshotID [OK] пинит: brief, чанкер, план стадий, capability, память (content-hash), context-assembly. ЛЮБОЙ resnapshot = переоплата книги (D15) — до content-addressed reuse онгоинг не продаётся. end note while (Остались главы?) is (да) while (Остались чанки главы?) is (да) :Сборка контекста [OK]: кэш-префикс (system+brief) + селективная инъекция глоссария (Aho-Corasick, спойлер-hard-reject, disposition CONFIRMED/AMBIGUOUS/REJECT, sticky) + retrieval_state запись; :NSFW-классификатор 0-3 [Ф2 — требует спеки и метрики приёмки]; if (Уровень 3: несовершеннолетние?) then (да) :Чанк НЕ переводится: скип + флаг (книга продолжается); else (нет) if (Уровень 2: explicit?) then (да) :Канал B [интерим D14]: Grok 4.3 + локальная abliterated · Mistral — после пробы · DeepSeek ЗАПРЕЩЁН (ToS) · OpenAI/Gemini — нет; else (0-1) :Канал A [OK]: DeepSeek V4 Flash (thinking ON — эхо-мина); endif :Translator [OK]: черновик (C2 [Ф2]: N ГЕТЕРОГЕННЫХ кандидатов, D13.2); if (Ядро C2/C3: селекция? [Ф2]) then (да) :Judge-селектор: 11+ повторов со свапом позиций, Bradley-Terry (кандидаты разных семейств); else (C1) endif :Intrinsic classify [OK]: refusal-blacklist, CJK-echo, empty, loop — ДО length (усечённый отказ не ретраится платно); :Coverage-гейт [OK, opt-in]: sent_cov + len_ratio (только translator-роль); if (Вердикт чанка?) then (транзиентный: length/empty) :same-model retry, ось attempt, бОльший max_tokens (после loop-чека) [OK]; elseif (контент-провал: echo/excision/refusal) then (детерминированный) if (escalate_to задан И бюджет есть?) then (да) :Single-hop эскалация [OK]: на ДРУГУЮ модель (ровно 1 хоп, editor pinned); :РЕ-ГЕЙТ фолбэка [OK]: classify + coverage заново — не прошёл, значит флаг остаётся; else (нет) :Флаг чанка (skip+flag+continue, D2) [OK]; endif else (ok) endif :Editor [OK]: монолингвальная редактура D1 (вход = черновик + CONFIRMED dst-констрейнты, D17: оспорено внешним замером — решает пилот-арм); :Post-check финала [OK]: decl-aware, CONFIRMED-only — флаггер по умолчанию, жёсткий гейт opt-in за подписью владельца; :Чекпоинт [OK]: settle + checkpoint одной tx (в TM коммитится только прошедшее гейты); endif endwhile (нет) :Граница главы: телеметрия + паспорт качества [Ф1*] · батч-подтверждение терминов auto->approved — ЧЕЛОВЕК или судья чужого семейства [Ф2] — безлюдный авто-апрув = риск G1 · резюме главы/арки + гейт фактичности [Ф2]; note right Outage/системный класс (503-storm, потолок): circuit-breaker -> ПАУЗА + resume (D4/D12), НЕ mass-swap провайдера. end note endwhile (нет) :Очередь флагнутых чанков -> человек · redrive точечно [Ф1*] (сейчас только --resnapshot ценой всей книги — D15); :Книжный QA-проход [Ф2]: консистентность по всей книге, регрессия ты/вы, морфо-гейт рода; :Экспорт txt/epub + отчёт [Ф1*]: стоимость по стадиям, флаги, журнал творческого вклада; stop @enduml