@startuml components title TextMachine — компоненты бэкенда (2026-07-25, синхронизировано с 05-decisions-log D1–D39.25, пост-пак-16)\nПометки: [OK] = построено · [FLAG] = построено за enabled:false · [Ф2]/[Ф3] = планово skinparam componentStyle rectangle skinparam wrapWidth 220 actor "Владелец\n(запуск; подпись майнинг-дельты (exit 3);\nрешение о включении repair-петли по замеру остатка (D39.24);\nподтверждение терминов; чтение отчётов/паспортов;\nарбитр слепых чтений)" as HUMAN package "CLI cmd/tmctl [OK]" { component "translate / report / status /\nexport (--pairs) / redrive / seed-lint\nexit-контракт: 0 чисто · 1 инфра ·\n2 completed-with-flags · 3 майнинг-подпись" as CLI } package "internal/pipeline — композит-корень (драйвер) [OK]" { component "Runner [OK]: конфиг-стек fail-fast\n(book+pair+pipeline+models, строгий KnownFields-декод),\nlangpack+книжный overlay, промпт-конвенция,\nCheckRunnable (C2/C3/judge отвергнуты в Ф0)" as RUNNER component "Волновой исполнитель [OK] (D39.17):\nдрафт ∥ → майнинг-стоп → редактура ∥ (по edit-единицам);\nредактор НИКОГДА не пере-рендерит драфт;\nc-lite: флагнутый member выбрасывается (D39.18)" as WAVES component "runStage [OK]: reserve → вызов → settle+чекпойнт\nОДНОЙ tx; RequestHash tm-request-v2; $0-резюм по чекпойнту\n(rerun2: доказан ×3 арма); classify ПОСЛЕ денег;\nbilled-decode кап (пак-12)" as STAGERUN component "Снапшоты per-wave [OK]:\ndraft = BASE-банк · edit = ENRICHED-банк\n(«переоплата ОДНА», D30.9/D39.12);\nlangpack Version() и промпт-SHA фолдятся;\nstale → громкий стоп без --resnapshot" as SNAP component "Эскалация single-hop + ре-гейт [OK] (D12);\nescalation.chains = конфиг-декларация,\nмульти-хоп по цепочке лейбла [Ф2/пак-17]" as ESC component "Майнинг-стоп [OK]: MineBank → signature map →\nexit 3 → подпись владельца → mined_delta / mined_rejects;\nре-ран: драфт $0-резюм, пустая дельта = авто-континью" as MINING component "Банкнота ⟦TM-BANK-v1⟧ [FLAG]\n(срез с RAW-драфта до classify; derived-чекпойнт)" as BANKNOTE component "Repair-петля [FLAG] (пак-16, D39.24):\nсуб-шаг финальной стадии; таргет-вызовы по span,\nпромпт per-класс; 6 гардов + позитивный ре-гейт\n+ анти-удаление; derived tm-repair-v1;\nвключение = решение владельца по замеру остатка" as REPAIR component "Вердикты disposition [OK]: intrinsic classify всегда\n(refusal причино-агностичен — детектим ФАКТ, D12/D39.25;\nэхо/loop/length/empty); flag+skip+continue (D2)" as DISP component "$0 read-модели [OK]: status · export\n(манифест-ре-чанк, ExportNormalize) · quality-report\n(+ residual-скан RepairCandidates = замер остатка)" as READMODELS } package "Подсистемы (сплит пака-15, D39.23) [OK]" { component "internal/chunk: ingest txt/epub\n(GB18030, ruby-захват) + чанкер по output-бюджету\n(SegBudget пары), edit-единицы" as P_CHUNK component "internal/checks: санитайзер D30.3 ·\ncheap-гейты v4 · DC-чекеры (пар-агностичные, данные) ·\ncoverage · regression guard · RepairCandidates ·\nExportNormalize; пакет сообщает ФАКТЫ,\nдиспозицию назначает драйвер" as P_CHECKS component "internal/miner: $0 банк-майнер\n(порт exp16 V-C, паритет EXACT) →\nсид-дельта YAML на подпись" as P_MINER component "internal/membank: Aho-Corasick Select ·\ntrust-gate (терм-дрейф закрыт, D39.2) · спойлер-окна ·\nsticky · post-check E1 · Version/BaseVersion" as P_MEMBANK component "internal/text: версионированный\nнормализационный субстрат (NFKC/trad2simp);\ninternal/seed: схема сид-YAML" as P_TEXT component "internal/lang: языковые ДАННЫЕ без поведения\n(langpack пары + embedded); Version() → снапшот" as P_LANG component "internal/config: book/pair/pipeline/models\nстрогий декод; CheckAdultChannel-линт" as P_CONFIG component "internal/llm: адаптеры openai/anthropic/local;\nтранспорт-ретраи/failover (пак-12);\ncapability-резолв в wire-форму" as P_LLM component "internal/store: SQLite на книгу\n(леджер reserve/settle BEGIN IMMEDIATE, чекпойнты,\nchunk_status, jobs, request_log, glossary, ruby)" as P_STORE } package "Конфиг-слои (ДАННЫЕ — движок общий, §0/D39.25)" { component "book.yaml: бриф+BriefHash;\nAdult bool = интерим до generic content-labels\n(D39.25, пак-17); langpack_extend (книжный overlay);\nmined_delta / mined_rejects" as C_BOOK component "configs/pairs/<пара>.yaml:\nфертильность, output-бюджеты, len_ratio" as C_PAIR component "configs/langpacks/<пара|язык>/:\nморфология источника, Палладий,\ndc-checkers, heading" as C_LP component "prompts/<пара>/<роль>.md +\nrepair/<класс>.md (конвенция, fail-loud)" as C_PROMPTS component "models.yaml: провайдеры/цены/capability\n(permissive = ТИП-изоляция канала B, эхо-гейт DeepSeek,\nфлоры min_max_tokens, rate_limit)" as C_MODELS component "pipeline-*.yaml: стадии/гейты/\nэскалация/волны/майнинг; строгий декод" as C_PIPE } cloud "LLM-провайдеры" { component "DeepSeek V4: -flash = draft (thinking ON — эхо-мина) ·\n-pro = РЕДАКТОР-ИНТЕРИМ (D39.22) + эскалация-хоп;\nadult-контент НЕ отправлять (ToS → capability-данные)" as P_DS component "GLM glm-5: редактор-РЕЗЕРВ (D39.22);\nMistral: переводчик adult-контента (D19);\nкак несущий редактор ИСКЛЮЧЁН (D39.20)" as P_GLM component "xAI grok-4.3: permissive, adult-цепочка,\nсудья 18+ фолбэк; ключ data-sharing, off перед продом (D27)" as P_XA component "gemini-3.1-pro-preview: апекс/премиум-эскалация;\nnative-судья [Ф2]; mandatory thinking, additive_total" as P_GM component "OpenAI gpt-5-mini · local/ollama (permissive)" as P_OTH } component "Ф2/Ф3 (планово): голос/состояние D21 ·\nnative-Gemini судья · C2/C3-селекция ·\ngeneric content-labels × provider-capabilities (пак-17, D39.25) ·\nja→ru §B5 (тест общности) · HTTP API (IDE) [Ф3]" as FUTURE HUMAN --> CLI : запуск / подпись / решения CLI --> RUNNER RUNNER --> WAVES WAVES --> STAGERUN WAVES --> MINING STAGERUN --> SNAP STAGERUN --> ESC STAGERUN --> BANKNOTE STAGERUN --> REPAIR STAGERUN --> DISP CLI --> READMODELS RUNNER --> P_CONFIG RUNNER --> P_LANG WAVES --> P_CHUNK STAGERUN --> P_LLM STAGERUN --> P_STORE DISP --> P_CHECKS REPAIR --> P_CHECKS MINING --> P_MINER WAVES --> P_MEMBANK P_MINER --> P_TEXT P_MEMBANK --> P_TEXT P_CHECKS --> P_LANG P_MINER --> P_LANG READMODELS --> P_STORE READMODELS --> P_CHECKS P_CONFIG --> C_BOOK P_CONFIG --> C_PAIR P_CONFIG --> C_MODELS P_CONFIG --> C_PIPE P_LANG --> C_LP RUNNER --> C_PROMPTS C_BOOK ..> C_LP : langpack_extend (overlay) P_LLM --> P_DS P_LLM --> P_GLM P_LLM --> P_XA P_LLM --> P_GM P_LLM --> P_OTH HUMAN <-- READMODELS : отчёты / паспорт / замер остатка HUMAN <-- MINING : signature map (exit 3) FUTURE -[hidden]-> P_OTH note bottom of HUMAN Петля человека — несущая опора safety: все защиты кончаются флагом (D2); майнинг-дельта и включение платного repair-пути — только за подписью. end note @enduml