textmachine/docs/architecture/components.puml

108 lines
8.5 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 components
title TextMachine — компоненты бэкенда (2026-07-25, синхронизировано с 05-decisions-log D1D39.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