@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
