235 lines
41 KiB
Markdown
235 lines
41 KiB
Markdown
# Целевая архитектура и дорожная карта (арх-ресет 2026-07-13)
|
||
|
||
> **Статус:** проектный документ оркестратора, ратифицирован **D39** (`05-decisions-log.md`). Рождён из арх-ресета
|
||
> (`../archive/prompts/ORCHESTRATOR_ARCH_RESET_PROMPT_2026-07-13.md`, 5 концернов владельца) и синк-аудита «сломанного телефона»
|
||
> (`../archive/architecture/08-sync-audit-ledger.md`, 65 находок, адверсариально верифицированы; архивирован 25.07 как отработанный). Решения владельца по подходу:
|
||
> **фазовый** (build-now ∥ ресёрч, пере-прогон после) + **слой пар языков = сеам сейчас, контент только zh→ru**.
|
||
>
|
||
> Это карта «куда и почему», а не пошаговая спека. Спеки — в хендофф-промтах сессий; контракт — в D-логе.
|
||
|
||
> ⚠ **ОСВЕЖЁН 28.08 (D39.167, аудит доков). За сутки после прежней редакции залендено ДЕСЯТЬ нот, и шапка их не знала — а её читает КАЖДАЯ бэкенд-сессия при онбординге.**
|
||
> **Что построено с тех пор:** платформенная дверь правок банка `POST /books/{bookId}/bank/corrections` смонтирована синхронно (D39.162) · ключи деплоя доезжают до движка аргументом `--keys-file` — **строка 211 ЗАКРЫТА, блокером живого прогона она больше не является** · полоса прогресса стала СКВОЗНОЙ, с подписью стадии вторым исключением границы (D39.162/D39.163) · бэкенд-пак «тихая порча»: инъекция банка перестала теряться на провайдере с одним системным слотом, дыра выдачи видна читателю, повтор документа решений сходится (D39.164) · пере-проход можно КУПИТЬ (D39.166).
|
||
> ⚠ **Канон контракта — 0.7.0**, не 0.4.0: три минора за двое суток (0.5.0 — D39.161, 0.6.0 — D39.162/163, 0.7.0 — D39.166).
|
||
>
|
||
> **⟶ СТАТУС СТРОЙКИ (прежняя редакция, 27.08 оркестратором №19: **ВХОДНАЯ ДВЕРЬ ШВА ПОСТРОЕНА** — D39.158, четыре пака зоны бэкенда приняты и заленджены одним деревом; закон двери D39.156 тем самым исполнен, а не только ратифицирован. Онтология банка вынесена страницей `18-bank-ontology.md`. Прежняя редакция шапки от 23.08: **РАТИФИЦИРОВАН ЗАКОН ВХОДНОЙ ДВЕРИ ШВА** — D39.156, тело `17-seam-inbound-law.md`. Половина контракта движок↔платформа, которой не было: наружу поток богатый, внутрь не шло ничего, кроме запуска с флагами, поэтому данные ПОЛЬЗОВАТЕЛЯ движок принимать не умел. Ратифицирована ДИСЦИПЛИНА из семи пунктов, не каталог команд ⇒ двери встают паками без нового решения владельца. Развилка владения `book.yaml` (строка 199а) РАСТВОРЕНА: конвенционные дефолты путей + движковый глагол-писатель. Свип ВСЕЙ границы дал ОДНО гнилое место (строка 213) при шести ратифицированных каналах — широкого рефакторинга шва не требуется. Заведены строки 211 (движок на SaaS не получает провайдерских ключей — БЛОКЕР живого прогона 202), 212, 213; выдан движковый пак `BACKEND_SEAM_PACK_SESSION_PROMPT.md`. Ранее 22.08 оркестратором №18: **пак платформы P8-FIX ПРИНЯТ и ЗАЛЕНДЕН** — голодание свипа `PD-169` закрыто четырьмя механизмами (фазы прохода · отсрочка с бэкоффом · порог `StalledAfter` с гейджем и CLI · терминальный вердикт оператора `run abandon`), оба бюджета стали операторскими ручками, снят пер-термный write-путь банка по D39.144 — открытой осталась контрактная половина `PD-370` (строка 206). Ранее 20.08: **пак P7 платформы ПРИНЯТ и ЗАЛЕНДЕН** — читающая поверхность построена целиком (главы · юниты · замечания · проекция банка · SSE · модель ошибок · условные чтения · идемпотентность), D39.153; **канон контракта — 0.4.0**, ратифицирован D39.152; пак движка «честные числа и статусы» принят с фикс-листом, D39.149. Предыдущий срез — 16.08 оркестратором №17: контракт-ревью ПРИНЯТО (research/28, D39.138), ломающий батч 0.3.0 ИСПОЛНЕН и принят с дофиксом (D39.142–145: конвейер снят с провода, машинная модель ошибок, /capabilities, поток на книгу, подпись банка = один ОК D39.144; жанр из продукта ВЫКИНУТ — строка 184); P7 платформы ЗАПУЩЕН по финальному канону. Ранее 15.08: эмиттер шва ПОСТРОЕН И ПРИНЯТ — `events.jsonl` StreamVersion 1.1, exit 4/5 + полоса отказов 10–19 (D39.131); платформа P6 + дофикс приняты — потребительская половина шва, интейк формы Б, дев-стенд, PD-113/PD-196 закрыты (D39.132); `tmctl migrate` принят — exit 13 финализирован, деадлок деплоя v15 разорван (D39.134); фронт S4 принят — путь «файл → загрузка → запуск → прогресс» в мире моков, контракт **0.2.3** в каноне (D39.135). Ранее 14.08 №16: платформа достроена до интейка книг P5 — `POST /books` с сентинелом хранилища, стоп/резюм с намерением, Prometheus, Go-floor 1.26.6 (D39.130); фронт — S3.5–S3.7 приняты (оболочка · слой данных · i18n; D39.127/129). Ранее 09.08, пост-D39.125: шов движок↔платформа ратифицирован — транзиентный systemd-юнит на прогон + `events.jsonl`-outbox в каталоге книги, платформа НЕ родитель (D39.106); платформа достроена до раннера P4 (D39.109/114/123 — River-очередь, холд-до-спавна, реконсилятор; дефекты — `platform/docs/DEFECT_REGISTER.md`); фронт — слой данных S3, контракт 0.2.0→0.2.1 (D39.115/123); движок отдал блокеры контракта — `tm-manifest-v2`, `unit.id` с тегом разреза, пофазные счётчики на главу, `--ceiling-usd` (D39.122); слой 4 добит фикс-паком банка — семьи термов со-батчатся юнитами, bankdata-плоскость (D39.118). Ранее 04.08, пост-D39.105: слои 4/5 добраны паками банка/чекеров D39.69/78/82; репо на стандартах — `make battery`, tmvet/archguard, D39.96/97; контракт API v0 = `14-api-contract/` (D39.99), платформа = зона `platform/`, открыта D39.100. Баннер — не переписывание, тело ниже = замысел арх-ресета 13.07).** Карта «слой → статус → пак/D»:
|
||
> | Слой | Статус | Пак / D |
|
||
> |---|---|---|
|
||
> | 1 Сегментация | ✅ ПОСТРОЕН: бюджет в выходных токенах снапшот-folded (`chunk.SegBudget`), edit-единицы декаплены; когезия/carryover — НЕ строится (D39.7/8: эффекты под floor 0.126; кнобы `STMDepth`/`OverlapTokens` УДАЛЕНЫ, WS2 §2а), граница `logical` — не рычаг (exp15), greedy остался | пак-11 (D39.13 WS2 · D39.17 волны · D39.18 c-lite) |
|
||
> | 2 Пары | ✅ СЕАМ ПОСТРОЕН: `internal/lang`+langpacks (embedded · книго-overlay `langpack_extend`) · пар-агностичные чекеры · `configs/pairs/` · промпт-конвенция `prompts/<пара>/<роль>.md`; открыто: извлечение дискурс-норм/few-shot из ТЕЛА промтов (форсинг = ja→ru) | D39.16 · пак-14 · пак-15 (D39.23г) |
|
||
> | 3 Контракт t/e | ✅ ПОСТРОЕН ЗА `enabled:false`: `checks.RepairCandidates` (позиционная детекция) · read-only скан остатка · машинерия ремонта §15.2; **включение платного пути = решение владельца по замеру остатка**; ⚠ эмпирика контракта — экспы 19/20 (D39.108): гейт Q4b — диффы ОТЛОЖЕНЫ (D21.4/D21.10 закрыты); итог эксп-21 (D39.117): full-regen ПОДТВЕРЖДЁН (точечная починка как замена редактора отклонена; принята формой «механический пре-гейт ПЕРЕД редактором» — строка 142; строка 106 понижена) | пак-16 (D39.24), **D39.108**, **D39.117** |
|
||
> | 4 Память | ✅ ПОСТРОЕН + ДОСТРОЕН паком-20 ✅ **ВХОДНАЯ ДВЕРЬ ПОСТРОЕНА И ЗАЛЕНДЖЕНА 27.08 (D39.158, лендинг `d1eb8a9`)**: $0-глагол `tmctl bank-apply` (проекция `--dry-run`, всё-или-ничего, байтовый no-op идемпотентен), писатель решений `internal/membank/decisions.go`, стоп банка — ФЛАЖОК, который движок чтит сам (память предъявления `bank_stop_presented`, схема store v16), полоса отказов получила пол и класс 15 `write_incomplete`. Онтология слоя — `18-bank-ontology.md` — disposition-gated suppressor · **ТЕРМИНОЛОГ** (роль пар-пака: смердженный банк + KWIC → консолидированный dst, durable-деньги) · флаговый стоп `--verify-bank` (дефолт=авто) · ДВУХСЕКЦИОННАЯ редакторская инъекция (CONFIRMED + ⟨проверить⟩; все строки фолдятся в версию; ⚠ D39.104: схлопывается в ЕДИНЫЙ закон-блок, маркер с провода снимается — внесение = строка 134 ПОСЛЕ пробы 18) · точечная ре-редактура (bank-only → пере-пин $0) · банкнота отдельным шиппинг-файлом · языковой экран `target_script` · дисциплина банкноты (кавычки/агрегация); жанровый словарь ОТМЕНЁН (D39.47) | пак-1 · пак-11 · **пак-20 (D39.41–45/47/50–53)** |
|
||
> | 5 Качество | ✅ детерм. часть: `QualityReport` · число/omission-гард · DC/пак-13-чекеры · repair-остаток; семантический span-судья/полярность — НЕ строился (защита = editor-swap, D38.4) | D39.2 · D38.3 · пак-13 (`2f91b04`) · пак-16 |
|
||
> | 6 Export | ✅ ПОСТРОЕН: `checks.ExportNormalize` на каждом финале; санитайзер-классы strip+export | D39.2 · D38.3 |
|
||
> | 7 Гигиена | ✅ ПОСТРОЕН: реестр role→инъекция · вынос `foldModelWire` · снос сирот/`gatesEnabled` · **target-aware гейты ПО ДАННЫМ — П1 «цель-шов» (фаза 2, D39.64: `isRuTarget` удалён, `TargetActive`/`TargetScriptNonLatin`, токенизатор цели из `word_script`); остаток — ё-фолд/segmentation за подписью (бэклог-строка 14)** | D39.2 · паки 11–16 · **фаза 2 (D39.64)** |
|
||
>
|
||
> **Актуализация 01.08:** пак-19 «голос/состояние» построен (D39.54–56: схема голоса/обращений v13/v14 c условным фолдом · tu-vous- и спойлер-флаггеры). **Карта языковой привязки ВСЕГО движка — `../archive/reports/GENERALITY_RESEARCH_2026-07-31.md` (D39.60)**; **фаза 2 общности ИСПОЛНЕНА И ПРИНЯТА (D39.64, отчёт `../archive/reports/GENERALITY_PHASE2_2026-08-01.md`)**: П0 хеш эмбед-данных (`embedded_version` в снапшоте) · П1 цель-шов (слой 7) · П2 скрипт-шов источника (`lang-script.txt`, ko-баг закрыт) · П3 нарезка/оценка (話 · sourceAbbrevs · generic-главы · один дом `DenseScript`) · П4 манифест-по-каналам (обратно-совместим, `packAlgoVersion` не бампался); голден вердикт-нейтрален (0/172); П5 майнер гейтится второй книгой; пак-21 растворён; 9 флагов §5 — очередь владельца (бэклог-строка 14).
|
||
> §1 «как есть» читать как снимок ДО стройки (const-чанкер · glm-редактор · мёртвые `STMDepth`/`OverlapTokens` — всего этого больше нет). §4 отработан целиком: трек B исполнен (exp15/exp16 — программа ЗАВЕРШЕНА, D39.7/D39.10), гейт пере-прогона пройден фактом rerun2 (D39.20; планка ≤2 НЕ пройдена, эксп ЗАКРЫТ D39.22, редактор = deepseek-v4-pro интерим). Канал B — пак-17 **ЗАКРЫТ ЦЕЛИКОМ (дизайн D39.26 + стройка D39.27 + дельта D39.28: механизм лейблов живой, действия `route|allow|terminal` с одним инвариантом, golden байт-идентичен, `permissive`/`Stage.Channel`/D4.1-блок отставлены, `failover.go` удалён; вокабуляр = ПАРА `violence`/`sexually-explicit`; `accepts_labels` пусты до ФАКТОВ ToS — fail-closed)**; ⚠ **испр. 28.08 (D39.168): факты предъявлены, поля ЗАПОЛНЕНЫ у трёх эндпоинтов (`backend/configs/models.yaml:99,160,172`) — механизм fail-closed жив, но «пусты у всех» больше не факт;** дизайн РАТИФИЦИРОВАН D39.26 (лейблы вне хешей — назначенный слой D20.2-Q3 = резолвнутая модель стадии пер-стадийно/пер-волново · резолв ДО валидации, «достижимое» лейбл-зависимо · один хоп `chain[0]` · гранулярность = книга · `content_labels`(книга) ⊆ `accepts_labels`(модель) · `Stage.Channel`/`permissive`/D4.1-блок отставляются одним диффом), фаза 2 = стройка; инженерная форма переопределена **D39.25**: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities, refusal причино-агностичен; «18+ линия» в §6 читать как продукт-линию, не механизм движка.
|
||
|
||
---
|
||
|
||
## 0. Стратегический вывод аудита (почему ресет)
|
||
|
||
Потолок художественности сейчас — **в НАШЕЙ организации пайплайна, а не в моделях.** Эмпирика (exp12–14b) и
|
||
код-аудит сошлись: дефекты, которые владелец назвал «крайне слабо художественно» (рубленые абзацы + «непонимание
|
||
связей»), рождаются из **нарезки, структуры редакторских проходов, контракта переводчик/редактор и отсутствия
|
||
меж-чанковой когезии** — всё это архитектура, не выбор модели. Это подтверждает трек «дешёвые модели сейчас»
|
||
(D30.7) и переопределяет источник следующего прироста качества: **он архитектурный.**
|
||
|
||
Ключевое свойство проблемы: **рычаги сцеплены.** Редактор репараграфизует ВНУТРИ ~1500-токенного чанка → он
|
||
физически не может чинить когезию через границу чанка → нарезка (концерн 2) жёстко ограничивает потолок
|
||
дискурс-переверстки, которую мы требуем от редактора (концерн 1). Поэтому чинить их порознь = снова получить
|
||
локальный оптимум на неверно нарезанном тексте (ровно «слабый тест» exp14). **Концерны 1, 2, 4 проектируются
|
||
вместе.**
|
||
|
||
## 0.1 Инвариант общности (поправка владельца, 2026-07-13) — НЕСУЩИЙ
|
||
|
||
**Цель — перевод ЛЮБОЙ книги, ЛЮБОЙ пары языков, написанной ПО-РАЗНОМУ.** Ни один компонент не смеет предполагать
|
||
структуру конкретной книги (蛊真人) или конкретную пару (zh→ru). Из этого:
|
||
- **Чанкер = ОБЩИЙ адаптивный модуль:** характеризует структуру КАЖДОГО входа в рантайме (плоский CJK line-per-
|
||
sentence · сцен-маркированный · длинно-абзацный европейский роман · ja-ранобэ · смешанный) → выбирает стратегию
|
||
границы → фоллбек-лестница. Он обязан работать корректно на всём спектре, а не на одной форме.
|
||
- **Разница «продукт» vs «эксперимент»** (моя ошибка, которую поправил владелец): чтобы ИЗМЕРИТЬ рычаг эмпирикой,
|
||
нужен тест-текст, который его задействует — это ограничение ДИЗАЙНА ЭКСПЕРИМЕНТА (валидируй на разнообразном
|
||
корпусе), и оно **никогда** не переносится в scope продукта («книга плоская → урежем нарезку» — ЗАПРЕЩЕНО).
|
||
- **Пер-язык (слой 2)** — та же логика: строим ОБЩИЙ сеам, контент наполняем инкрементально (zh→ru сейчас); новая
|
||
книга/пара = данные (пакет конвенций), не переделка кода. «Бэкенд только под русский/под одну книгу» = антицель.
|
||
- **Эмпирика валидирует ОБЩНОСТЬ** (корректность+near-оптимум на структуро- и языко-разнообразном корпусе), не
|
||
оптимизирует под книгу на стенде.
|
||
|
||
---
|
||
|
||
## 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 слоёв с чистыми сеамами
|
||
|
||
> ⚠ **ЧИТАТЬ КАК ЗАМЫСЕЛ 13.07, А НЕ КАК ДЕЙСТВУЮЩЕЕ ПРЕДПИСАНИЕ** (баннер дописан 22.08 аудитом
|
||
> доков: у §1 и §4 такие оговорки были, у §2 не было — и его читали как норму). Что этот раздел
|
||
> предписывает, а стройка с тех пор отменила, видно из ШАПКИ-ТАБЛИЦЫ ЭТОГО ЖЕ ФАЙЛА: например
|
||
> меж-единичная когезия («оживить `STMDepth`/`OverlapTokens`») — эти кнобы УДАЛЕНЫ, эффекты замерены
|
||
> под флором и когезия НЕ строится (D39.7/D39.8, слой 1). **При расхождении раздела с шапкой первична
|
||
> шапка, при расхождении шапки с D-логом — D-лог.**
|
||
|
||
Вместо 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
|
||
|
||
> Консолидированная заметка по всей промпт-теме (инвентарь, статусы, открытое) — `10-prompt-architecture.md`.
|
||
- Версионируемый пакет, ключ `src→tgt[×genre]`, снапшот-folded (правка = громкий `--resnapshot`, как `chunkerVersion`).
|
||
- Держит: дискурс-правила, few-shot (в языке пары), транскрипцию/хонорифики, **и язык самого промпта** (свойство
|
||
пакета — не хардкод русского).
|
||
- Стадия резолвит промпт/правила из слоя по паре книги, а не из фикс-пути. `Book.LangPair()` оживает как ось выбора.
|
||
- **Высота сейчас (решение владельца):** построить СЕАМ, наполнить только zh→ru; другие пары — когда придёт книга.
|
||
Убирает латентный баг (ja-книга едет через «китайский паратаксис»-промпт) и разблокирует расширяемость дёшево.
|
||
- **⟶ Реализация (обновление 25.07):** данные-часть РЕАЛИЗОВАНА (D39.16: zh/Палладий-инвентари вынесены из
|
||
`pipeline/`-констант в `configs/langpacks/<lang|pair>/` через leaf-пакет `internal/lang`; граница компиль-enforced;
|
||
резолв по `Book.LangPair()`; байт-точно — парити EXACT, golden байт-идентичен) и ДОСТРОЕНА паками 14/15:
|
||
пар-агностичные чекеры + embedded-данные + книго-overlay `langpack_extend` (пак-14) · пар-калибровки
|
||
`configs/pairs/` + промпт-резолв конвенцией `prompts/<пара>/<роль>.md` (D39.23г). Извлечение правил из ТЕЛА
|
||
промтов (дискурс-нормы, few-shot) — ещё открыто (форсинг-функция = ja→ru-реплика). `x/text/language.Tag`
|
||
ОТВЕРГНУТ для гейт-предикатов (CLDR-инстабильность в снапшот-вердиктах); → исполнено иначе D39.64: `isRuTarget` удалён, гейт-предикаты = `TargetActive`/`TargetScriptNonLatin` из данных пары — отказ от `language.Tag` в силе.
|
||
|
||
### Слой 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. Карта находок → слои (полный ледджер — `../archive/architecture/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):
|
||
1. **Слой 4 память-корень** — disposition-gate на suppressor + громкий лог дропа. Мал, хирургичен, закрывает терм-дрейф
|
||
в коде (снимает вечную зависимость от сид-воркэраунда).
|
||
2. **Слой 5 (детерм. часть)** — per-run структурный quality-report + **inversion/omission-бэкстоп** (полярность/число/
|
||
ранг/пропуск, span). Измеряет всё остальное.
|
||
3. **Слой 6 export-contract** — нормализация каждого финала; санитайзер → детектор.
|
||
4. **Слой 7 гигиена** — реестр role→инъекция, target-aware гейты, де-размазка, снос сирот. (Разблокирует слой 2 сеам.)
|
||
5. **Слой 2 сеам** (после гигиены) — pair-keyed резолв промпта/правил; наполнить zh→ru; язык промпта = свойство пакета.
|
||
6. **Док-долг оркестратора:** формализовать/вычистить фантомный «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) — ТОЛЬКО про дизайн эксперимента, НЕ про продукт (инвариант общности §0.1):** exp14
|
||
«пробелы» по сцен-границе/кросс-границе/translate-стадии — не отрицательные результаты, а непротестированные
|
||
допущения, потому что **тест-срез (ранняя арка 蛊真人) плоский** (1 предл./строка, мало сцен-маркеров) и физически
|
||
не задействует эти рычаги. Это чисто **экспериментальное** ограничение: чтобы ИЗМЕРИТЬ рычаг границы/когезии, нужен
|
||
текст, который его задействует. → **эмпирика валидирует чанкер на РАЗНООБРАЗНОМ корпусе** (плоский CJK line-per-
|
||
sentence · сцен-маркированный · длинно-абзацный европейский · ja-ранобэ · …), а не на одной книге. Плоская книга —
|
||
ОДНА точка спектра, который общий чанкер обязан обрабатывать, **никогда не повод сузить продукт**. Реюз: кривая +
|
||
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, не переделка кода).
|