21 KiB
Целевая архитектура и дорожная карта (арх-ресет 2026-07-13)
Статус: проектный документ оркестратора, ратифицирован D39 (
05-decisions-log.md). Рождён из арх-ресета (ORCHESTRATOR_ARCH_RESET_PROMPT.md, 5 концернов владельца) и синк-аудита «сломанного телефона» (08-sync-audit-ledger.md, 65 находок, адверсариально верифицированы). Решения владельца по подходу: фазовый (build-now ∥ ресёрч, пере-прогон после) + слой пар языков = сеам сейчас, контент только zh→ru.Это карта «куда и почему», а не пошаговая спека. Спеки — в хендофф-промтах сессий; контракт — в D-логе.
0. Стратегический вывод аудита (почему ресет)
Потолок художественности сейчас — в НАШЕЙ организации пайплайна, а не в моделях. Эмпирика (exp12–14b) и код-аудит сошлись: дефекты, которые владелец назвал «крайне слабо художественно» (рубленые абзацы + «непонимание связей»), рождаются из нарезки, структуры редакторских проходов, контракта переводчик/редактор и отсутствия меж-чанковой когезии — всё это архитектура, не выбор модели. Это подтверждает трек «дешёвые модели сейчас» (D30.7) и переопределяет источник следующего прироста качества: он архитектурный.
Ключевое свойство проблемы: рычаги сцеплены. Редактор репараграфизует ВНУТРИ ~1500-токенного чанка → он физически не может чинить когезию через границу чанка → нарезка (концерн 2) жёстко ограничивает потолок дискурс-переверстки, которую мы требуем от редактора (концерн 1). Поэтому чинить их порознь = снова получить локальный оптимум на неверно нарезанном тексте (ровно «слабый тест» exp14). Концерны 1, 2, 4 проектируются вместе.
1. Текущая архитектура (как есть, grounded)
Пайплайн = линейный проход по плоскому списку чанков; на каждый чанк — стадии по порядку из pipeline-*.yaml:
книга → ingest (главы) → SplitChunks (чанкер) → [ по чанку: translator(draft) → editor(edit) ] → export
↑ память v2 (Select→inject) + детерм. гейты
- Нарезка (
chunker.go): жадная упаковка целых абзацев в бюджетtargetChunkTokens=1500(const, в единице «оценка символов исходника», не выходные токены), спуск до предложений при оверсайзе. Граница — там, где накопление пересекло бюджет; логической/сценовой границы нет. Единица одна и для черновика, и для редактуры. - Переводчик (
translator.md, deepseek-v4-flash): подстрочник + слабая однострочка про вёрстку; на верности валидирован (exp13), на художественность/структуру — не мерен никогда (D30.6). - Редактор (
editor.md, glm-5, БИЛИНГВ): ОДНА полная перегенерация чанка с 4 мандатами сразу — верность, стиль, глоссарий, дискурс-reflow (техники Ван Цуй + few-shot). - Память v2 (
memory.go): Aho-Corasick матч → disposition → инъекция per-role (переводчику src→dst, редактору CONFIRMED-dst-констрейнты) → детерм. post-check. Единственная меж-чанковая память. Меж-чанковой когезии (summary/carryover) НЕТ — есть мёртвые config-заглушкиSTMDepth/OverlapTokens, которые код не читает. - Гейты (детерминированные): intrinsic-классификатор (echo/empty/refusal/length), coverage/excision (только translator), output-санитайзер (только final), glossary post-check (флаггер), cheap style-флаггеры, regression-guard. Семантического/качественного сигнала в контуре нет.
- Промты: единые zh→ru-файлы, выбор по фикс-пути из yaml;
{{source_lang}}— поверхностный шаблон; правила захардкожены; язык промпта всегда русский.Book.LangPair()— мёртвый код.
Хорошее, что подтвердил аудит (не ломать): деньги/durability (reserve→settle+checkpoint, committed==SUM, kill-9),
snapshot-дисциплина, эталонные сеамы config→stage-list и baseRequestLog, дословный перенос техник Ван Цуй,
структурные (не «правильно-переводные») few-shot, осознанность разделения переводчик/редактор.
2. Целевая архитектура — 7 слоёв с чистыми сеамами
Вместо 65 заплаток — слои, каждый первоклассный, независимо конфигурируемый и снапшот-folded. Ровно они закрывают 5 концернов.
Слой 1 — Сегментация (чанкер-модуль) · концерны 1+2
- Размер бюджета — снапшот-folded config-кноб в ВЫХОДНЫХ токенах (не const, не в símволах исходника), чтобы
пре-регистрированная кривая полигона могла приземлиться как настройка. Механизм fold уже есть (
coverageSnap). - Стратегия границы — first-class ось:
greedy(как сейчас) |logical(сцена/диалог/тема) — с фоллбек-лестницей и инвариантом «никогда не резать предложение». Наполнение стратегииlogical— по интернет-best-practices + ресёрч. - Декаплинг edit-единицы от draft-единицы (бывший фантомный «D35.7»): черновик — мелкий чанк (COGS/coverage/ выравнивание); reflow/edit — крупная дискурс-единица (глава/сцена), где антецеденты со-встречаются.
- Меж-единичная когезия: оживить
STMDepth/OverlapTokens— running bilingual summary + carryover соседних единиц как read-only контекст. (⚠ exp14 «крупнее лучше» и research/18 §A «мелкий чанк + carryover» конфликтуют — решает ресёрч-матрица, см. §4.)
Слой 2 — Конвенции пары языков (pair-keyed pack) · концерн 4
- Версионируемый пакет, ключ
src→tgt[×genre], снапшот-folded (правка = громкий--resnapshot, какchunkerVersion). - Держит: дискурс-правила, few-shot (в языке пары), транскрипцию/хонорифики, и язык самого промпта (свойство пакета — не хардкод русского).
- Стадия резолвит промпт/правила из слоя по паре книги, а не из фикс-пути.
Book.LangPair()оживает как ось выбора. - Высота сейчас (решение владельца): построить СЕАМ, наполнить только zh→ru; другие пары — когда придёт книга. Убирает латентный баг (ja-книга едет через «китайский паратаксис»-промпт) и разблокирует расширяемость дёшево.
Слой 3 — Контракт переводчик/редактор (роли = узкие проходы) · концерн 1
- research/07 предписывает узкие мандаты + диффы, а не полную перегенерацию — сейчас ровно наоборот (4 мандата, full-regen), что и породило хвост инверсий.
- Целевой контракт: переводчик отдаёт структурный ~верный черновик; редактор — узкая правка смысла+стиля, в идеале diff-based (search/replace-спаны + детерм. Go-apply → ограниченный blast-radius, дешевле, аудируемо, структурно omission-safe). Между проходами — гейт.
- ⚠ Арм «переводчик отдаёт структуру» никогда не тестировался — решает ресёрч-матрица (§4), а не догадка.
Слой 4 — Память (код-корень) · концерн 3
- Починить disposition-слепой
suppressContained: более длинный НИЗКО-доверенный ключ (draft/ambiguous) не должен подавлять вложенный ВЫСОКО-доверенный (approved/confirmed). Это закрывает терм-дрейф в КОДЕ (сейчас — сид-воркэраунд). - Тихие дропы → в громкие: подавленный approved-термин обязан попадать в retrieval-state (обещание research/13).
- Убрать устаревшую D1-моно-рационализацию из
renderEditorConstraintBlock(редактор теперь БИЛИНГВ, D30.1); открытый вопрос — давать ли билингв-редактору src→dst-мэппинг, а не голые dst-формы.
Слой 5 — Измерение качества в контуре · главная цель + концерн 5
- Per-run/per-segment авто-сигнал: детерминированный структурный KPI (предл./абзац, диалог-тире, CJK-утечка, глоссарий-консистентность) — дёшево, build-now — + дешёвая span-проверка смысла (полярность/число/ранг/пропуск → тот самый inversion/omission-бэкстоп; семантический span-судья — ресёрч-зависим, позже).
- Даёт то, что владелец просил (телеметрия качества с 1-го дня, п.25/п.31) и делает КАЖДУЮ правку ниже измеримой; предпосылка самоулучшения.
Слой 6 — Export-contract (нормализация) · концерн 3
- Единая нормализация КАЖДОГО финального текста (NFKC-fold + пробелы/CJK-пунктуация/U+3000) — тот самый D29.1a-слой, который D-лог откладывает. Санитайзер сводится к чистому детектору (флагует только по-настоящему невосстановимое).
- Убирает: дефект чинится на флагнутом чанке, но уезжает сырым на чистом; дубль NFKC; churn регексов v1→v4.
Слой 7 — Гигиена расширяемости · концерн 3 п4
- Реестр
role→инъекция(map/стратегия из конфига) вместо рукоправимого switch — чтобы Ф2-annotator/voice добавлялся данными, не хирургией. - Target-aware гейты: readability-набор за
TargetLang(сейчас слеп — любой не-ru target даст ложные флаги). - Де-размазать strip-and-export (5 файлов → один resolver
classification→(disposition, exportText)). - Снести сироты-промпты (
analyst.md/terminologist.md/дубльeditor-mono.md), мёртвыйgatesEnabled(); вынестиfoldModelWire()(tripwire на 3-ю модель-ось уже стоит). - Эталоны для копирования:
config→stage-list,baseRequestLog.
3. Карта находок → слои (полный ледджер — 08-sync-audit-ledger.md)
| Слой | Несущие находки (HIGH, CONFIRMED) |
|---|---|
| 1 Сегментация | L2-1500-untested-apriori, L2-budget-wrong-unit, L2-token-budget-not-semantic, L2-edit-unit-equals-chunk, L2-cross-chunk-only-glossary, L2-d357-phantom-decision, H1-smart-chunking-never-formalized, L2-no-boundary-algo-research |
| 2 Слой пар | L4-prompts-not-per-pair-zh-baked, L4-convention-pack-layer-never-built, L4-prompt-language-always-russian, H2, L4-adding-a-pair-is-a-rewrite-not-config |
| 3 Контракт t/e | L1-editor-four-mandates-one-fullregen-pass, L1-fidelity-has-no-owner-in-cheap-path, L1-diff-editing-never-built, H3/H4, L1-translator-structure-arm-never-tested |
| 4 Память | L3-seed-workaround-not-code-root, L3-recurrence-draft-longer-eats-approved-shorter, L3-suppressor-disposition-blind-right-fix, L3-editor-block-stale-monolingual-D1 |
| 5 Качество | H5-no-in-loop-quality-signal, H14-inversion-guard (D37 §2г), H12-cross-boundary-coherence-untested |
| 6 Export | L5-normalization-fused-to-flag-path, L5-broken-word-class-*, L5-diacritics-class-lost, L5-legit-cjk-gloss-stripped, L6-technique-not-norm-overclaim |
| 7 Гигиена | L8-* (target-blind gates, role-switch, strip-smear, prompt-orphans, dead gatesEnabled, foldModelWire) |
| Процесс (к.5) | H18-no-standing-findings-ledger-process + незакрытые владельческие: H6 running-summary, H7 input-size-limit, H8 abuse-prescreen, H9 parallelism/speed (V4-п1), H15 glossary-auto-build (V4-п4), H10 user-stop, H16 self-improvement |
4. Дорожная карта — две параллельные фазы (решение владельца: фазово)
Трек A — Build-now (бэкенд, ресёрч НЕ нужен, высокий ROI, низкий риск)
Порядок ≈ по ROI/риску; всё под мандат самопроверки исполнением (CLAUDE.md):
- Слой 4 память-корень — disposition-gate на suppressor + громкий лог дропа. Мал, хирургичен, закрывает терм-дрейф в коде (снимает вечную зависимость от сид-воркэраунда).
- Слой 5 (детерм. часть) — per-run структурный quality-report + inversion/omission-бэкстоп (полярность/число/ ранг/пропуск, span). Измеряет всё остальное.
- Слой 6 export-contract — нормализация каждого финала; санитайзер → детектор.
- Слой 7 гигиена — реестр role→инъекция, target-aware гейты, де-размазка, снос сирот. (Разблокирует слой 2 сеам.)
- Слой 2 сеам (после гигиены) — pair-keyed резолв промпта/правил; наполнить zh→ru; язык промпта = свойство пакета.
- Док-долг оркестратора: формализовать/вычистить фантомный «D35.7»; ратифицировать диспозиции незакрытых владельческих идей (input-limit / abuse-prescreen / parallelism / glossary-auto-build — явное решение, даже если «Ф2/Ф3»).
Трек B — Ресёрч ПЕРЕД постройкой (концерны 1+2+4 — сцеплены)
- Единая полигон-матрица:
{граница: greedy|logical} × {edit-единица: чанк|глава} × {когезия: нет|summary/carryover} × {где reflow: переводчик|редактор|отдельный-пасс}на реальном вебновелл-срезе. ⚠ exp14 vs research/18 §A прямо конфликтуют по размеру чанка — это ключевой вопрос, который матрица решает эмпирически, не догадкой. - Полигон-синк (13.07): exp14 «пробелы» по сцен-границе/кросс-границе/translate-стадии — не отрицательные
результаты, а непротестированные допущения на неподходящем домене (ранняя арка 蛊真人 плоская: 1 предл./строка,
мало сцен-маркеров). → Домен-пригодность = первый шаг эмпирики: характеризовать структуру целевой книги; если
плоская — логическая/сцен-граница малополезна ДЛЯ НЕЁ (доминанта = внутри-чанк верность + размер edit-единицы),
и это сама по себе находка. Трапы Q1/Q3/Q4 — на срезе С сцен-структурой + кросс-граничными зависимостями. Реюз:
кривая + A-ref-prev/both как есть; дозаказать
A-ref-next+ translate-плечо. - Интернет-best-practices по логической/семантической нарезке крупных текстов (владелец просил явно) + фоллбеки.
- Дизайн слоя 2 (форма pair-pack, язык промпта) — под данные матрицы (§D-3 research/18: форма не разрешена).
- Методика-guard D32.4 (fidelity-first, leave-one-out, катастроф-скрин — полигон трижды собирал ложную сходимость).
Гейт пере-прогона
Пере-прогон 3–10 глав — только после трека B (иначе снова слабый тест на голом конфиге) и приёмки ключевых build-now (память-корень + quality-сигнал + export-contract). Планка — 2 претензии владельца (интерим, не пилот Ф2.5).
5. Процесс против «сломанного телефона» (концерн 5)
Постоянный findings-ledger как повторяющийся шаг оркестратора (этот аудит — первый экземпляр, 08-*):
- Каждая находка полигона/ресёрча/аудита получает явную диспозицию (FAITHFUL/DISTORTED/LOST/WORKAROUND_NOT_ROOT/ UNTESTED_ASSUMPTION/NEVER_CLOSED/CODE_SMELL) и трекается до закрытия (fixed / ratified-deferred / retracted).
- Вопросы «к бэкенду» из ресёрча (research/18 §D) обязаны получать ответ, маршрутизируемый обратно (сейчас висят).
- Периодический completeness-critic прогон (как этот) на границе фаз — не разовый.
6. Что НЕ демонтируется
Столпы (деньги/durability, snapshot-дисциплина, детерминированный банк памяти как ставка, echo-гейт, 18+ линия, дешёвый трек, конфиг-первое ядро) — целы. Целевая архитектура — это декомпозиция и до-стройка существующей машинерии по чистым сеамам, а не переписывание. Фронтир-тир остаётся «потом» (новый yaml, не переделка кода).