Sync architecture diagrams to the D1-D38.1 head: bilingual editor flip, output-sanitizer and quality-diagnostics nodes, channel-B v2, seed v2, and provider role restatements
This commit is contained in:
parent
6f12fc0244
commit
5d24ba401c
2 changed files with 47 additions and 31 deletions
|
|
@ -1,9 +1,9 @@
|
||||||
@startuml components
|
@startuml components
|
||||||
title TextMachine — компоненты бэкенда (v3 2026-07-09, синхронизировано с 05-decisions-log D1–D17)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2]/[Ф3] = планово
|
title TextMachine — компоненты бэкенда (2026-07-12, синхронизировано с 05-decisions-log D1–D38.1)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2]/[Ф3] = планово
|
||||||
skinparam componentStyle rectangle
|
skinparam componentStyle rectangle
|
||||||
skinparam wrapWidth 200
|
skinparam wrapWidth 200
|
||||||
|
|
||||||
actor "Владелец / редактор\n(очередь флагов, подтверждение\nтерминов, BWS-оценка пилота)" as HUMAN
|
actor "Владелец / редактор\n(очередь флагов, подтверждение терминов,\nподпись сида v2 = approved-инвариант (D34),\nарбитр читаемости слепых прогонов [2 претензии, D35],\nBWS-оценка пилота)" as HUMAN
|
||||||
|
|
||||||
package "Интерфейсы" {
|
package "Интерфейсы" {
|
||||||
component "CLI tmctl: translate / report [OK]\n+ status / redrive [Ф1*]" as CLI
|
component "CLI tmctl: translate / report [OK]\n+ status / redrive [Ф1*]" as CLI
|
||||||
|
|
@ -20,7 +20,7 @@ package "Оркестратор" {
|
||||||
|
|
||||||
package "Агентные роли (промпт-конфиги)" {
|
package "Агентные роли (промпт-конфиги)" {
|
||||||
component "Translator: черновик [OK]\n(C2: N ГЕТЕРОГЕННЫХ кандидатов [Ф2])" as ROLE_TR
|
component "Translator: черновик [OK]\n(C2: N ГЕТЕРОГЕННЫХ кандидатов [Ф2])" as ROLE_TR
|
||||||
component "Stylist/Editor [OK]\nмонолингвальный D1 (оспорен — пилот-арм D13.1),\ndst-констрейнты CONFIRMED" as ROLE_ED
|
component "Editor [OK] БИЛИНГВАЛЬНЫЙ (флип D1→D30.1)\n(вход = черновик + ИСХОДНИК + CONFIRMED dst-констрейнты);\nдискурс-reflow-промпт (Ван Цуй) + репараграфизация 1:N;\nкандидат glm-5, свап→mistral/deepseek-pro (D38.1);\nomission/inversion-гард (D34.3); пилот-арм D13.1 = ПОДТВЕРЖДАЮЩИЙ" as ROLE_ED
|
||||||
component "Analyst: book brief [Ф2]" as ROLE_AN
|
component "Analyst: book brief [Ф2]" as ROLE_AN
|
||||||
component "Terminologist / автопопуляция\nглоссария [Ф1*/Ф2]\n(спот=локаль, рендер=облако — exp06)" as ROLE_TERM
|
component "Terminologist / автопопуляция\nглоссария [Ф1*/Ф2]\n(спот=локаль, рендер=облако — exp06)" as ROLE_TERM
|
||||||
component "Annotator: пре-пасс [Ф2]\n(speaker-ID, регистр, чэнъюй-маски)" as ROLE_ANN
|
component "Annotator: пре-пасс [Ф2]\n(speaker-ID, регистр, чэнъюй-маски)" as ROLE_ANN
|
||||||
|
|
@ -32,23 +32,24 @@ package "QA-гейты (без LLM)" {
|
||||||
component "Intrinsic classify [OK]\n(refusal/CJK-echo ДО length, loop-детект)" as QA_CJK
|
component "Intrinsic classify [OK]\n(refusal/CJK-echo ДО length, loop-детект)" as QA_CJK
|
||||||
component "Coverage / excision [OK, opt-in]\n(sent_cov + len_ratio, порт оракула)" as QA_COV
|
component "Coverage / excision [OK, opt-in]\n(sent_cov + len_ratio, порт оракула)" as QA_COV
|
||||||
component "Глоссарный post-check [OK]\n(decl-aware, CONFIRMED-only;\nфлаггер по умолчанию, гейт opt-in)" as QA_GLOS
|
component "Глоссарный post-check [OK]\n(decl-aware, CONFIRMED-only;\nфлаггер по умолчанию, гейт opt-in)" as QA_GLOS
|
||||||
component "Дешёвые гейты Ф1 [Ф1*]:\nтире-линтер, ёфикатор,\nтранслит-междометия, число-гейт" as QA_CHEAP
|
component "Output-санитайзер [OK, opt-in c1] (D30.3/D33)\n(ведущие преамбулы / хвостовые «Основные правки» —\ngemini-утечка 6/6 / латиница-врезки / markdown-###;\nCJK-Han-в-выходе — в стройке D38.1); flag+skip D2" as QA_SANITIZE
|
||||||
|
component "Дешёвые гейты Ф1 [Ф1*]:\nтире-линтер, ёфикатор,\nтранслит-междометия, число-гейт\n+ диалог-парность-флаггер (D29.1д) + omission-гард (D38)" as QA_CHEAP
|
||||||
component "Морфо-гейт рода + канцелярит\n+ T-index [Ф2] (Python-сайдкар)" as QA_MORPH
|
component "Морфо-гейт рода + канцелярит\n+ T-index [Ф2] (Python-сайдкар)" as QA_MORPH
|
||||||
component "Валидатор Палладия/Поливанова B6 [Ф2]\n(ruby-reading = ground truth)" as QA_TRANSLIT
|
component "Валидатор Палладия/Поливанова B6 [Ф2]\n(ruby-reading = ground truth)" as QA_TRANSLIT
|
||||||
}
|
}
|
||||||
|
|
||||||
package "pkg/llm" {
|
package "pkg/llm" {
|
||||||
component "Роутер роль -> модель [OK]" as LLM_RT
|
component "Роутер роль -> модель [OK]" as LLM_RT
|
||||||
component "Capability-слой [OK]\n(budget_field/temperature/reasoning;\nэхо-мина DeepSeek fail-fast)" as LLM_CAP
|
component "Capability-слой [OK]\n(budget_field/temperature/reasoning;\nэхо-мина DeepSeek fail-fast;\nper-model флор min_max_tokens 8000/kimi 16000, D24.3;\ngpt-5.4 reasoning=low в редакторе — medium режет вывод, D38.6)" as LLM_CAP
|
||||||
component "NSFW-классификатор 0-3 [Ф2]\n(НЕ специфицирован — нужна метрика приёмки;\nуровень 3 = скип чанка + флаг)" as LLM_NSFW
|
component "NSFW-классификатор 0-3 [Ф2]\n(НЕ специфицирован — нужна метрика приёмки;\nуровень 3 = скип чанка + флаг)" as LLM_NSFW
|
||||||
component "Failover [OK, НЕ подключён]\nтолько local->cloud для local-ролей (D4);\nоблачные draft/edit: пауза+resume, НЕ своп" as LLM_FO
|
component "Failover [OK, НЕ подключён]\nтолько local->cloud для local-ролей (D4);\nоблачные draft/edit: пауза+resume, НЕ своп" as LLM_FO
|
||||||
component "Адаптеры OpenAI-совместимые [OK]:\nDeepSeek / GLM / Kimi / xAI / OpenAI /\nllama-server; нативный Gemini [Ф2]" as LLM_AD
|
component "Адаптеры OpenAI-совместимые [OK]:\nDeepSeek / GLM / Kimi / xAI / OpenAI / Mistral /\nllama-server; нативный Gemini [Ф2]" as LLM_AD
|
||||||
component "Кэш-раскладка префикса [OK]\n+ Batch (только Gemini-судья/QA) [Ф2]" as LLM_BC
|
component "Кэш-раскладка префикса [OK]\n+ Batch (только Gemini-судья/QA) [Ф2]" as LLM_BC
|
||||||
}
|
}
|
||||||
|
|
||||||
package "Банк памяти книги (SQLite на книгу) [OK: v2]" {
|
package "Банк памяти книги (SQLite на книгу) [OK: v2]" {
|
||||||
component "Глоссарий v2 [OK]\n(sense, alias-граф, decl, gender=hidden,\ntranslit_policy, ревизии)" as MEM_GLOS
|
component "Глоссарий v2 [OK]\n(sense, alias-граф, decl, gender=hidden,\ntranslit_policy, ревизии);\nсид v2 ПОДПИСАН владельцем (57 терминов, D34);\nstatus:draft НЕ инъектится в editor-констрейнт\n(CONFIRMED-only) — reseed промоут грейдов (корень терм-дрейфа, D38)" as MEM_GLOS
|
||||||
component "Горячий путь [OK]: Aho-Corasick,\nнормализация NFKC/trad2simp/kana/ignorables,\nспойлер-окна since/until (hard-reject),\ndisposition CONFIRMED/AMBIGUOUS/REJECT,\nsticky; фиксы границ D16 [Ф1*]" as MEM_HOT
|
component "Горячий путь [OK]: Aho-Corasick,\nнормализация NFKC/trad2simp/kana/ignorables,\nспойлер-окна since/until (hard-reject),\ndisposition CONFIRMED/AMBIGUOUS/REJECT,\nsticky; фиксы границ D16 [OK]" as MEM_HOT
|
||||||
component "Ruby-захват [OK] -> сид auto-кандидатов;\nreading как матч-поверхность [Ф1*, D16.4]" as MEM_RUBY
|
component "Ruby-захват [OK] -> сид auto-кандидатов;\nreading как матч-поверхность [Ф1*, D16.4]" as MEM_RUBY
|
||||||
component "retrieval_state per-chunk [OK]\n(наблюдаемость инъекции/вытеснений)" as MEM_RS
|
component "retrieval_state per-chunk [OK]\n(наблюдаемость инъекции/вытеснений)" as MEM_RS
|
||||||
component "Резюме глава->арка->книга [Ф2]\n+ гейт фактичности резюме (реестр D1)" as MEM_SUM
|
component "Резюме глава->арка->книга [Ф2]\n+ гейт фактичности резюме (реестр D1)" as MEM_SUM
|
||||||
|
|
@ -63,16 +64,17 @@ package "Деньги и наблюдаемость [OK]" {
|
||||||
}
|
}
|
||||||
|
|
||||||
package "Eval / Полигон (зона eval/)" {
|
package "Eval / Полигон (зона eval/)" {
|
||||||
component "Пилот-харнесс Ф2.5\n(BWS, memory-eval M0-M3, судья-панель;\nчинится до прогона — D13.5)" as EV_PILOT
|
component "Пилот-харнесс Ф2.5\n(BWS, memory-eval M0-M3, судья-панель;\nчинится до прогона — D13.5;\nблокеры: корпус вне претрейна, аннотаторы ≥3,\nбилингв-якорь, судья-дублёр 18+ — чистый ключ снят D27)" as EV_PILOT
|
||||||
component "Refusal/excision-бенчмарк\n(18+ часть ждёт explicit-корпус — critical)" as EV_RB
|
component "Refusal/excision-бенчмарк [OK]\n(18+ эмпирика ПОЛНА: violence exp10 + erotica exp11;\nканал B v2 собран, D14.4 закрыт)" as EV_RB
|
||||||
|
component "Диагностик-харнесс качества\n(exp12→14b: нарезка×промпт, слепые читки,\nfidelity re-gate; трек «мерить→строить» D26–D38.1)" as EV_DIAG
|
||||||
}
|
}
|
||||||
|
|
||||||
cloud "LLM-провайдеры" {
|
cloud "LLM-провайдеры" {
|
||||||
component "DeepSeek V4 (draft; thinking ON —\nэхо-мина; для explicit ЗАПРЕЩЁН ToS, D14.1)" as P_DS
|
component "DeepSeek V4: -flash = draft (thinking ON —\nэхо-мина; сохранён exp13/D32) · -pro = escalate-хоп\n(флор min_max_tokens 8000, D24.3);\nexplicit ЗАПРЕЩЁН ToS, violence OK (D14.1)" as P_DS
|
||||||
component "xAI Grok 4.3 (редактор SFW, канал B,\nсудья 18+; AUP без запрета adult-текста)" as P_XA
|
component "xAI Grok 4.3: эскалация канала B (reasoning-ON),\nпервичный судья эротики; НЕ редактор\n(reasoning-off из редакторских ролей снят = no-op, D30.1);\nключ единый С data-sharing, off перед продом (D27)" as P_XA
|
||||||
component "Gemini 3.1 Pro (апекс/судья [Ф2])" as P_GM
|
component "gemini-3.1-pro-preview (голый слаг→404):\nсудья SFW/violence, но fail-closed на эротике\n(PROHIBITED_CONTENT); премиум-эскалация редактора\nТОЛЬКО за санитайзером (D30.1); billing additive_total (D22.3)" as P_GM
|
||||||
component "GLM / Kimi / OpenAI\n(альтернативы/эскалация)" as P_OTH
|
component "GLM (glm-5 = ДЕФОЛТ билингв-редактор, D30.1) /\nKimi (НЕПРИГОДЕН как редактор — обрезки/таймауты) /\nOpenAI (GPT-5 фронтир-арм — в дефолт НЕ нужен, D38)" as P_OTH
|
||||||
component "Mistral — кандидат-фолбэк\nканала B [проба, D14.2]" as P_MI
|
component "Mistral — переводчик-ДЕФОЛТ канала B (18/18, D19.1);\nкандидат СМЕНЫ дефолт-редактора (чинит инверсии,\nкоторые glm валит, дешевле) — бейк-офф прозы (D38.1)" as P_MI
|
||||||
component "llama-server (GPU 8GB: скрининг,\nabliterated канала B, эмбеддинги,\nСПОТ-экстракция)" as P_LL
|
component "llama-server (GPU 8GB: скрининг,\nabliterated канала B, эмбеддинги,\nСПОТ-экстракция)" as P_LL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,6 +96,7 @@ RUNNER --> ROLE_LE
|
||||||
RUNNER --> QA_CJK
|
RUNNER --> QA_CJK
|
||||||
RUNNER --> QA_COV
|
RUNNER --> QA_COV
|
||||||
RUNNER --> QA_GLOS
|
RUNNER --> QA_GLOS
|
||||||
|
RUNNER --> QA_SANITIZE
|
||||||
RUNNER --> QA_CHEAP
|
RUNNER --> QA_CHEAP
|
||||||
RUNNER --> QA_MORPH
|
RUNNER --> QA_MORPH
|
||||||
RUNNER --> QA_TRANSLIT
|
RUNNER --> QA_TRANSLIT
|
||||||
|
|
@ -130,6 +133,7 @@ HUMAN --> CLI : запуск, флип гейтов (за подписью)
|
||||||
HUMAN <-- EXP : отчёт, паспорт качества, флаги
|
HUMAN <-- EXP : отчёт, паспорт качества, флаги
|
||||||
HUMAN --> MEM_GLOS : подтверждение терминов auto->approved\n(безлюдный режим = осознанный риск G1/G2)
|
HUMAN --> MEM_GLOS : подтверждение терминов auto->approved\n(безлюдный режим = осознанный риск G1/G2)
|
||||||
HUMAN <.. EV_PILOT : BWS-оценка (пилот Ф2.5)
|
HUMAN <.. EV_PILOT : BWS-оценка (пилот Ф2.5)
|
||||||
|
HUMAN <.. EV_DIAG : слепая читка-арбитраж (2 претензии, интерим)
|
||||||
|
|
||||||
LLM_RT --> OBS_LG
|
LLM_RT --> OBS_LG
|
||||||
OBS_LG --> OBS_QB
|
OBS_LG --> OBS_QB
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,19 @@
|
||||||
@startuml pipeline
|
@startuml pipeline
|
||||||
title TextMachine — поток перевода книги (v3 2026-07-09, синхронизировано с D1–D17)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2] = планово
|
title TextMachine — поток перевода книги (2026-07-12, синхронизировано с D1–D38.1)\nПометки: [OK] = построено · [Ф1*] = остаток Фазы 1 · [Ф2] = планово
|
||||||
skinparam wrapWidth 260
|
skinparam wrapWidth 260
|
||||||
|
|
||||||
start
|
start
|
||||||
:Импорт книги [OK]: txt / epub по spine,
|
:Импорт книги [OK]: txt / epub по spine,
|
||||||
ruby-захват, spine-reconciliation fail-loud
|
ruby-захват, spine-reconciliation fail-loud,
|
||||||
|
GB18030-детект/конверсия (реальные zh .txt — не UTF-8, D18/D20)
|
||||||
(тихая потеря главы невозможна);
|
(тихая потеря главы невозможна);
|
||||||
:Сегментация [OK]: главы -> чанки ~1-2k токенов
|
:Сегментация [OK]: главы -> чанки ~1-2k токенов
|
||||||
(sentence-pack, quote-depth, lossless);
|
(sentence-pack, quote-depth, lossless);
|
||||||
:Сид глоссария [OK]: ручной YAML + ruby-кандидаты
|
:Сид глоссария [OK]: ручной YAML + ruby-кандидаты
|
||||||
(ja-книга: kana-написания имён — aliases руками, D16.4)
|
(ja-книга: kana-написания имён — aliases руками, D16.4)
|
||||||
· автопопуляция G1 [Ф1*/Ф2]:
|
· сид v2 ПОДПИСАН владельцем (57 терминов, D34)
|
||||||
спот=локаль / рендер=облако;
|
· status:draft НЕ инъектится в editor-констрейнт — reseed промоут грейдов (D38)
|
||||||
|
· автопопуляция G1 [Ф1*/Ф2]: спот=локаль / рендер=облако;
|
||||||
:Analyst: book brief (map-reduce) [Ф2];
|
:Analyst: book brief (map-reduce) [Ф2];
|
||||||
:Terminologist: глоссарий + style sheet до перевода [Ф2];
|
:Terminologist: глоссарий + style sheet до перевода [Ф2];
|
||||||
note right
|
note right
|
||||||
|
|
@ -35,11 +37,11 @@ while (Остались главы?) is (да)
|
||||||
(книга продолжается);
|
(книга продолжается);
|
||||||
else (нет)
|
else (нет)
|
||||||
if (Уровень 2: explicit?) then (да)
|
if (Уровень 2: explicit?) then (да)
|
||||||
:Канал B [интерим D14]: Grok 4.3
|
:Канал B v2 [D19.1/D22.1]: переводчик-ДЕФОЛТ Mistral (18/18)
|
||||||
+ локальная abliterated
|
→ эскалация Grok 4.3 (reasoning-ON)
|
||||||
· Mistral — после пробы
|
→ локальная abliterated 8b (скрин/фолбэк)
|
||||||
· DeepSeek ЗАПРЕЩЁН (ToS)
|
· DeepSeek explicit ЗАПРЕЩЁН (ToS), violence OK
|
||||||
· OpenAI/Gemini — нет;
|
· судьи 18+ Grok+Gemini (эротика→Grok primary, Gemini fail-closed);
|
||||||
else (0-1)
|
else (0-1)
|
||||||
:Канал A [OK]: DeepSeek V4 Flash
|
:Канал A [OK]: DeepSeek V4 Flash
|
||||||
(thinking ON — эхо-мина);
|
(thinking ON — эхо-мина);
|
||||||
|
|
@ -63,7 +65,8 @@ while (Остались главы?) is (да)
|
||||||
elseif (контент-провал: echo/excision/refusal) then (детерминированный)
|
elseif (контент-провал: echo/excision/refusal) then (детерминированный)
|
||||||
if (escalate_to задан И бюджет есть?) then (да)
|
if (escalate_to задан И бюджет есть?) then (да)
|
||||||
:Single-hop эскалация [OK]: на ДРУГУЮ модель
|
:Single-hop эскалация [OK]: на ДРУГУЮ модель
|
||||||
(ровно 1 хоп, editor pinned);
|
(ровно 1 хоп, editor pinned) — хоп ограничен
|
||||||
|
per-model флором min_max_tokens 8000 (D24.3);
|
||||||
:РЕ-ГЕЙТ фолбэка [OK]: classify + coverage
|
:РЕ-ГЕЙТ фолбэка [OK]: classify + coverage
|
||||||
заново — не прошёл, значит флаг остаётся;
|
заново — не прошёл, значит флаг остаётся;
|
||||||
else (нет)
|
else (нет)
|
||||||
|
|
@ -71,11 +74,18 @@ while (Остались главы?) is (да)
|
||||||
endif
|
endif
|
||||||
else (ok)
|
else (ok)
|
||||||
endif
|
endif
|
||||||
:Editor [OK]: монолингвальная редактура D1
|
:Editor [OK]: БИЛИНГВАЛЬНАЯ редактура (флип D1→D30.1) —
|
||||||
(вход = черновик + CONFIRMED dst-констрейнты,
|
вход = черновик + ИСХОДНИК + CONFIRMED dst-констрейнты ·
|
||||||
D17: оспорено внешним замером — решает пилот-арм);
|
дискурс-reflow-промпт (Ван Цуй) + репараграфизация 1:N ·
|
||||||
|
кандидат glm-5, свап→mistral/deepseek-pro (D38.1) ·
|
||||||
|
omission/inversion-гард (D34.3);
|
||||||
|
:Output-санитайзер [OK, opt-in c1] (D30.3/D33) —
|
||||||
|
ведущие преамбулы / хвостовые «Основные правки» (gemini-утечка 6/6) /
|
||||||
|
латиница-врезки / markdown-### / CJK-Han-в-выходе [в стройке D38.1] —
|
||||||
|
flag+skip (D2), вердикт-ось;
|
||||||
:Post-check финала [OK]: decl-aware,
|
:Post-check финала [OK]: decl-aware,
|
||||||
CONFIRMED-only — флаггер по умолчанию,
|
CONFIRMED-only (union: базовый dst ВСЕГДА в проверяемых формах,
|
||||||
|
D24.4 — закрывает nominative_gap) — флаггер по умолчанию,
|
||||||
жёсткий гейт opt-in за подписью владельца;
|
жёсткий гейт opt-in за подписью владельца;
|
||||||
:Чекпоинт [OK]: settle + checkpoint одной tx
|
:Чекпоинт [OK]: settle + checkpoint одной tx
|
||||||
(в TM коммитится только прошедшее гейты);
|
(в TM коммитится только прошедшее гейты);
|
||||||
|
|
@ -98,7 +108,9 @@ endwhile (нет)
|
||||||
--resnapshot ценой всей книги — D15);
|
--resnapshot ценой всей книги — D15);
|
||||||
:Книжный QA-проход [Ф2]: консистентность по всей
|
:Книжный QA-проход [Ф2]: консистентность по всей
|
||||||
книге, регрессия ты/вы, морфо-гейт рода;
|
книге, регрессия ты/вы, морфо-гейт рода;
|
||||||
:Экспорт txt/epub + отчёт [Ф1*]: стоимость по стадиям,
|
:Экспорт txt/epub/TMX + отчёт [Ф1*]: tmctl export (канон. ассемблер)
|
||||||
флаги, журнал творческого вклада;
|
+ annotations.json · нормализация выхода (strip ведущий ###)
|
||||||
|
· флагнутый чанк НЕ дропать в пусто (export-фикс D35.4a)
|
||||||
|
· стоимость по стадиям, флаги, журнал творческого вклада;
|
||||||
stop
|
stop
|
||||||
@enduml
|
@enduml
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue