textmachine/docs/architecture/pipeline.puml

104 lines
5.3 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

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.

@startuml pipeline
title TextMachine — поток перевода книги (v3 2026-07-09, синхронизировано с D1D17)\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