textmachine/docs/architecture/09-target-architecture.md

39 KiB
Raw Blame History

Целевая архитектура и дорожная карта (арх-ресет 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-логе.

КАК ЧИТАТЬ ШАПКУ (освежена 05.09 — оба пака 05.09 отражены в строках слоёв: 81a89e9 движковый «денежный стоп», акт D39.206; 7e2226a+3e84716 платформенный «пустить внутрь можно», акт D39.201). Таблица «слой → статус → пак/D» ниже — единственный статус-борд этого файла: она БЬЁТ тело документа, а D-лог бьёт её. Хроники лендингов паков здесь больше нет — кто что построил и когда живёт в журнале решений: 05-decisions-log.md + реестр 05-decisions-index.md + слайсы ../archive/architecture/ (эры D39.100D39.190 покрывают всю стройку платформы, шва, писателя книги и числа согласия). ⚠ ЗАКОН РАСКРЫТИЯ (D39.181) — норма зоны backend/, а не пункт одного пака: число, которое движок публикует, обязано ехать со СВОИМ БАЗИСОМ, а присутствие поля не может быть булевым признаком, если оно перестало им быть. Из него же — config_drift_basis в status --json и леджер доставки в кадре finished (StreamVersion 1.2, D39.182 §4). D39.182 («деньги и честность выдачи») добавил класс BANK в разложение денег и noteSourceVintage. ⚠ ПОСТРОЕНО, но в семь слоёв НЕ укладывается (движковые оси рядом со слоями — читать шапку как полную нельзя без них): объёмный потолок оплаченной работы --max-units/VolumeStop (backend/internal/pipeline/volume.go, D39.170; ратифицированная единица продажи — D39.165 §1) · гейт схемы движка (backend/internal/store/sqlgate_test.go, D39.173: каждый SQL-оператор компилируется против схемы, поднятой продовой цепью миграций) · дверь правок банка POST /books/{bookId}/bank/corrections смонтирована синхронно (D39.162) · ключи деплоя доезжают до движка аргументом --keys-file (строка 211 ЗАКРЫТА, блокером живого прогона больше не является) · полоса прогресса СКВОЗНАЯ, подпись стадии — второе исключение границы (D39.162/163) · пере-проход можно КУПИТЬ (D39.166) · инъекция банка не теряется на провайдере с одним системным слотом (D39.164) · ЧИСЛО СОГЛАСИЯ НА ПУТИ ВТОРОЙ ПОКУПКИ (03.09, D39.187): пере-покупка прайсится по модели, которую стадия резолвит СЕЙЧАС, с округлением ВВЕРХ и оговоркой в тексте согласия (D39.150 п.1) — а обещание точности снято с провода во всех пяти местах, где стояло: контракт механизма теперь «не точность, а НАПРАВЛЕНИЕ ошибки — никогда не занизить молча»; фигура едет с базисом двумя новыми полями status --json (rebill_historical_rows · rebill_model_moved_rows) · слот объёмного гранта (вторая половина строки 232): юнит, начатый прежним прогоном и не отгруженный по оси finalStageWave, дописывается ВНЕ гранта и слота повторно не тратит ⚠ следствие денежное и НЕ ратифицированное: грант --max-units N оплачивает ДО 2N выходных юнитов (замер приёмки: грант 2 → четыре юнита, шесть вызовов провайдера), слово владельца 03.09 — «подумаем на этот счёт», до его решения --max-units держит СЛОТЫ, а деньги держит только --ceiling-usd (эррата 03.09-а к D39.170). ⚠ Канон контракта — БЕРИ ЧИСЛО ИЗ ФАЙЛА, а не отсюда: docs/architecture/14-api-contract/openapi.yaml, поле info.version (на 17.09 там 0.17.0, минор D39.265Run.progress_lagging и Run.rebill_consent_micro_usd). Литерал здесь исправляется ЧЕТВЁРТЫЙ раз подряд, и это уже не про внимательность: статус-борд не гейтится ничем, а канон двигает каждый платформенный пак. ⇒ носитель числа — файл; здесь остаётся указатель и дата последней сверки. Прежняя редакция ниже, как история промаха. ⚠ Канон контракта — 0.16.0 (⚠ испр. 17.09: отстал на ТРИ минора — 0.14.0 D39.244, 0.15.0 D39.246 п.6, 0.16.0 D39.262; третье исправление этой строки подряд ⇒ число здесь стареет по построению, брать ФАЙЛОМgrep '^ version:' architecture/14-api-contract/openapi.yaml) (⚠ испр. 10.09: корректирующий минор D39.235 п.6; прежде 0.13.0 (⚠ испр. 08.09: стояло 0.12.0; версию брать ФАЙЛОМ — grep '^ version:' 14-api-contract/openapi.yaml)** (D39.211, лендинг 06.09: заказ по размеру перестал притворяться заказом в главах), не 0.11.0, не 0.10.0, не 0.9.0 и не 0.4.0. Носители — docs/architecture/14-api-contract/openapi.yaml и platform/internal/httpapi/capabilities.go, они сходятся гейтом.

ПЛАТФОРМЕННЫЙ ШОВ — что построено 03.09 (D39.188, пак P13). Оплаченный прогон продолжается на ТЕ деньги, за которые продан: reopen читает бюджет ИЗ ХОЛДА первой попытки, а прогон без холда отвечается ОШИБКОЙ, не цифрой (прежде бюджет пере-выводился по текущей ставке — PD-168) · владение потоком переживает проход свипа: чтение ОСТАНАВЛИВАЕТСЯ на чужом handshake'е (ErrForeignStreamAhead), потому что до этого чужие события ложились на оплаченную попытку — чужой ceiling ставил paused живому прогону, unit_done писал непокупленные главы (PD-438, major) · операторские ручки: run unquarantine и колонка QUARANTINE · условия хоста батареи ВЫВОДЯТСЯ из тестовых исходников (make conditions), а не держатся списком в прозе · два гейта в platform/internal/gates/: перечень условий против исходников и класс «тревожный ряд ушёл из счёта незамеченным». ⚠ Бамп формы манифеста безопасного порядка деплоя НЕ ИМЕЕТ ни в одну сторону (PD-436): гейт интейка — строгое равенство одной константе, окна двух форм нет ⇒ стоп-мир. Пока окно двух паков открыто, форма ЗАМОРОЖЕНА (D39.190 п.5).

АКТЫ 16.09, которых эта шапка не знала (найдено сквозным аудитом закрытости; строка «освежена 05.09» выше относится к пакам 05.09 и этих не покрывает): D39.253 — консилиум банка принят, итог ../research/35-bank-memory-consilium.md · D39.254 — пять решений владельца по банку · D39.255 — пак «КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО» · D39.256 — банк переезжает в КНИГУ-ПРОДОЛЖЕНИЕ подписанным плюс решённым движком (стройка двухзонная, ряд 461) · D39.257 — пак «БАНК ЗА $0»: в СЛОЙ 4 «Память» добавлены громкий отказ при цели без инъекционных текстов ДО первой траты, разведение отказа роли и мусора по корзинам и два предиката «спорный» без платного потребителя. ⚠ Эррата 16.09-б: «причина смен передачи — якорь» в D39.256/D39.257 сильнее замера, измерено отсутствие новой улики во ВХОДЕ.

ВХОДНАЯ ДВЕРЬ ШВА ПОСТРОЕНА (D39.158): закон двери — 17-seam-inbound-law.md, онтология банка, который она обслуживает, — 18-bank-ontology.md. Шапка — не переписывание: тело ниже = замысел арх-ресета 13.07, и при расхождении тела с шапкой первична шапка.

Слой Статус Пак / 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; включение платного пути = решение владельца по замеру остатка; эмпирика контракта: диффы ОТЛОЖЕНЫ (D39.108, экспы 19/20; D21.4/D21.10 закрыты), full-regen ПОДТВЕРЖДЁН, точечная починка как ЗАМЕНА редактора отклонена и принята формой «механический пре-гейт ПЕРЕД редактором» (D39.117; строка 142, строка 106 понижена) пак-16 (D39.24), D39.108, D39.117
4 Память ПОСТРОЕН + ДОСТРОЕН паком-20 + ВХОДНАЯ ДВЕРЬ ПОСТРОЕНА (D39.158): $0-глагол tmctl bank-apply (проекция --dry-run, всё-или-ничего, байтовый no-op идемпотентен), писатель решений internal/membank/decisions.go, стоп банка — ФЛАЖОК, который движок чтит сам (память предъявления bank_stop_presented, схема store v16), класс отказа 15 write_incomplete. Роли носителей и поток «источники → вид → проекции» — 18-bank-ontology.md; состав пака-20 (ТЕРМИНОЛОГ · флаговый стоп --verify-bank · двухсекционная редакторская инъекция · точечная ре-редактура · банкнота отдельным шиппинг-файлом · языковой экран target_script) — D39.4145/5053; ⚠ D39.104 п.2 ВНЕСЁН (испр. 05.09): инъекция схлопнута в ЕДИНЫЙ закон-блок, маркер ⟨проверить⟩ с провода СНЯТ — отработано вайр-батчем, пак принят D39.199 (74ffe4f), строка 134 закрыта; жанровый словарь ОТМЕНЁН (D39.47) пак-1 · пак-11 · пак-20 (D39.4145/47/5053)
5 Качество детерм. часть: QualityReport · число/omission-гард · DC/пак-13-чекеры · repair-остаток; семантический span-судья/полярность — НЕ строился (защита = editor-swap, D38.4) D39.2 · D38.3 · пак-13 (2f91b04) · пак-16
6 Export ПЛАТФОРМЕННАЯ половина ПОСТРОЕНА 06.09 — что именно и с какой ценой, ОДНИМ носителем: 15-money-path.md §3 (акт D39.208). Здесь только статус, механика не дублируется. ДВИЖКОВАЯ половина ПОСТРОЕНА: checks.ExportNormalize на каждом финале; санитайзер-классы strip+export · писатель книги: internal/bookfile + tmctl build (EPUB 3 + txt, D39.175); холодный прогон 31.08 предъявил собранный EPUB настоящего перевода, epubcheck 0/0/0/0. ПЛАТФОРМЕННАЯ половина ПОСТРОЕНА 04.09, ЦИКЛ ЗАМКНУТ ЖИВЬЁМ (adf5e53, D39.194): пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, epubcheck 5.3.0 на СКАЧАННОМ файле 0/0/0/0. Дверь — три адреса (createExport/getExport/downloadExport), 202+Location, поллинг с Retry-After, Range 206, TTL с уборкой, идемпотентность. Проверка вместо счёта: grep -rn 'createExport|getExport' platform/internal/ --include=*.goНЕ пусто; операций в каноне 21, смонтировано 19 (испр. 05.09: updateBook смонтирован платформенным паком 7e2226a). ⚠ СТЕНА ДЕСЯТИ ГЛАВ СНЯТА 05.09, НО ПОЛ ОСТАЛСЯ — ДОЧИТАТЬ ДО КОНЦА ПО-ПРЕЖНЕМУ НЕЛЬЗЯ. — движковый пак 81a89e9 (акт D39.206) снял стену: отказ резервации ЗАЩЁЛКИВАЕТ волну, а обязательный вызов ЖДЁТ settle; порог «короче десяти глав не переводится» СНЯТ, остаточный пол — одна резервация (~3 главы) и он ВЫВЕДЕН, не замерен. Разбор — 15-money-path.md, греп ЭРРАТА 05.09. ⚠ Испр. 10.09: здесь стоял -«инвариантный пол» (2 × $0.03 = $0.06 против редакторской резервации ~$0.07 ⇒ «последние ~2 главы любой книги не покупаются») — СНЯТ. Он цитировал ДО-ПАКОВУЮ АРХЕОЛОГИЮ: в 15-money-path.md этот абзац стоит ПОД баннером « ЭРРАТА 05.09 — всё ниже описывает движок ДО пака «денежный стоп»» (акт D39.206). И его арифметика стоит на ставке $0.03 за главу, которой в коде больше нет ни константой, ни ручкой (15-money-path.md, греп СТАВКИ ЗА ГЛАВУ БОЛЬШЕ НЕ СУЩЕСТВУЕТ). ⇒ пол, если он нужен, берётся из pricing.Hold, а не из удалённой константы. Защёлка тут не помогает — она делает стоп штатным, а не финансирует последний вызов. Снимается ПЛАТФОРМЕННОЙ половиной (потолок ДЕНЬГАМИ, D39.196, строка 280). ⚠ Испр. 10.09: она ПОСТРОЕНА, и прежний текст противоречил началу этой же ячейки. Та же команда сегодня: `git grep -lE "StepMax step_max" -- platform/→ **10 файлов** (контроль:git grep -lE "ceiling" -- platform/→ 119; зона отвечает). Поведение:platform/internal/pricing/pricing.go(грепfunc (m Model) Hold), боевой вызов platform/internal/runs/runs.go, колонка platform/internal/pgstore/migrations/00033_order_and_price.sql(грепstep_max_micro_usd). Строка **280** закрыта актом D39.208. ⚠ **Пол ВЫВЕДЕН, не замерен** (платного прогона не было — D39.206 п.6). ⇒ PD-440` жив в ЭТОЙ половине: его волновая часть починена движком, денежная — нет
7 Гигиена ПОСТРОЕН: реестр role→инъекция · вынос foldModelWire · снос сирот/gatesEnabled · target-aware гейты ПО ДАННЫМ — П1 «цель-шов» (фаза 2, D39.64: isRuTarget удалён, TargetActive/TargetScriptNonLatin, токенизатор цели из word_script); остаток — ё-фолд/segmentation за подписью (бэклог-строка 14) D39.2 · паки 1116 · фаза 2 (D39.64)

Общность (фаза 2) ИСПОЛНЕНА И ПРИНЯТА — D39.64, отчёт ../archive/reports/GENERALITY_PHASE2_2026-08-01.md: П0 хеш эмбед-данных (embedded_version в снапшоте) · П1 цель-шов (слой 7) · П2 скрипт-шов источника (lang-script.txt) · П3 нарезка/оценка (один дом DenseScript) · П4 манифест-по-каналам (packAlgoVersion не бампался); голден вердикт-нейтрален (0/172); П5 майнер гейтится второй книгой; 9 флагов §5 — очередь владельца (бэклог-строка 14). Карта языковой привязки ВСЕГО движка — ../archive/reports/GENERALITY_RESEARCH_2026-07-31.md (D39.60); пак-19 «голос/состояние» — D39.5456. Снято из тела как прожитое, адреса — здесь. §1 «как есть 13.07» (const-чанкер · glm-редактор · мёртвые STMDepth/OverlapTokens — ничего этого в коде больше нет): пофакторный разбор каждой находки — ../archive/architecture/08-sync-audit-ledger.md. §4 «дорожная карта» отработана целиком: трек A = слои таблицы выше, трек 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, permissive/Stage.Channel/D4.1-блок отставлены, failover.go удалён; вокабуляр = ПАРА violence/sexually-explicit; accepts_labels fail-closed); ⚠ испр. 28.08 (D39.168): факты ToS предъявлены, поля ЗАПОЛНЕНЫ у трёх эндпоинтов (backend/configs/models.yaml, греп accepts_labels) — механизм fail-closed жив, но «пусты у всех» больше не факт. Инженерная форма — D39.25: в движке НЕТ понятия «18+», есть generic content-labels × provider-capabilities, refusal причино-агностичен; «18+ линия» в §6 читать как продукт-линию, не механизм движка.


0. Стратегический вывод аудита (почему ресет)

Потолок художественности сейчас — в НАШЕЙ организации пайплайна, а не в моделях. Эмпирика (exp1214b) и код-аудит сошлись: дефекты, которые владелец назвал «крайне слабо художественно» (рубленые абзацы + «непонимание связей»), рождаются из нарезки, структуры редакторских проходов, контракта переводчик/редактор и отсутствия меж-чанковой когезии — всё это архитектура, не выбор модели. Это подтверждает трек «дешёвые модели сейчас» (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. Снимок «как есть» на 13.07 — СНЯТ

Раздел описывал состояние ДО стройки (const-бюджет чанкера 1500 в символах источника · билингв-редактор glm-5 с 4 мандатами одной перегенерацией · мёртвые config-кнобы STMDepth/OverlapTokens · zh→ru-промпты фикс-путём) — ничего этого в коде больше нет, статусы построенного см. в таблице шапки. Пофакторный разбор того состояния, находка за находкой (L1-*/L2-*/L3-*/L4-*), — ../archive/architecture/08-sync-audit-ledger.md, карта находок → слои — §3 ниже. Столпы, которые аудит велел НЕ ломать (деньги/durability, snapshot-дисциплина, эталонные сеамы config→stage-list и baseRequestLog, дословный перенос техник Ван Цуй, структурные few-shot, разделение переводчик/редактор), — §6.


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-книга едет через «китайский паратаксис»-промпт) и разблокирует расширяемость дёшево.
  • ⟶ Что из этого ПОСТРОЕНО (статусы и номера паков — таблица шапки): данные-часть вынесена в internal/lang+configs/langpacks/ с компиль-enforced границей и резолвом по Book.LangPair() (D39.16), пар-калибровки configs/pairs/ и промпт-конвенция prompts/<пара>/<роль>.md — паки 14/15 (D39.23г). Открытым остаётся извлечение правил из ТЕЛА промтов (дискурс-нормы, few-shot); форсинг-функция — ja→ru-реплика. x/text/language.Tag для гейт-предикатов ОТВЕРГНУТ (CLDR-инстабильность в снапшот-вердиктах) — исполнено иначе D39.64: TargetActive/TargetScriptNonLatin из данных пары.

Слой 3 — Контракт переводчик/редактор (роли = узкие проходы) · концерн 1

  • research/07 предписывает узкие мандаты + диффы, а не полную перегенерацию — сейчас ровно наоборот (4 мандата, full-regen), что и породило хвост инверсий.
  • Целевой контракт: переводчик отдаёт структурный ~верный черновик; редактор — узкая правка смысла+стиля, в идеале diff-based (search/replace-спаны + детерм. Go-apply → ограниченный blast-radius, дешевле, аудируемо, структурно omission-safe). Между проходами — гейт.
  • Арм «переводчик отдаёт структуру» ДО СИХ ПОР не тестировался — это Q4c (reflow отдельным проходом), единственное неизмеренное плечо; измерены только соседи: Q4a (верность на translate-стадии не покупается, D39.9) и Q4b (диффы ОТЛОЖЕНЫ, D39.108), топологию решил эксп-21 (D39.117). ⚠ испр. 02.09: «решает ресёрч-матрица §4» СНЯТО — §4 отработан, маршрут вопроса теперь 10-prompt-architecture.md §4 п.4 + experiments/19-editor-contract-q4b.md §«Границы».

Слои 47 — тело замысла СНЯТО, адреса здесь

Слой 4 «Память» · 5 «Измерение качества в контуре» · 6 «Export-contract» · 7 «Гигиена расширяемости» стояли здесь предписанием 13.07; всё предписанное построено либо отменено, действующие статусы с номерами паков — строки 47 шапки-таблицы, пофакторный разбор находок с диспозициями — ../archive/architecture/08-sync-audit-ledger.md, эталонные сеамы config→stage-list/baseRequestLog — §1 и §6. Единственный код-факт, которого шапка не несёт: редакторский блок памяти рендерится src→dst-мэппингом, CONFIRMED-only, форма зафолжена в снапшот — D1-моно-рационализация убрана, «давать ли билингв-редактору src→dst» больше не открытый вопрос (internal/membank/memory.go, греп RenderEditorConstraintBlock и RenderFormatVersion; D39.13, пак-11 WS2).


3. Карта находок → слои (полный ледджер — ../archive/architecture/08-sync-audit-ledger.md)

Пофамильный перечень L1-*L8-*/H1H5/H12/H14 по слоям 17 СНЯТ: все они закрыты стройкой (статусы — шапка-таблица), а тела находок с диспозициями живут в ледджере. Живой остаток — только процессная строка:

Слой Несущие находки (HIGH, CONFIRMED)
Процесс (к.5) H18-no-standing-findings-ledger-process + незакрытые владельческие: H6 running-summary, H7 input-size-limit, H8 abuse-prescreen, ⚠ испр. 10.09 — три из этого списка больше не «незакрытые»: H9 parallelism/speed ПОСТРОЕН (волна веером: backend/internal/pipeline/waverun.go, греп runWave fans; кноб workers в backend/internal/config/pipeline.go); H15 glossary-auto-build ПОСТРОЕН (пакет backend/internal/terminology/, греп func AttachKWIC; писатель решений backend/internal/membank/decisions.go; жанр-условие владелец отозвал, веб-фетч остаётся долгом ПТ-10); H10 user-stop — термин РАЗДВОИЛСЯ (D39.234 п.1): остановок ратифицировано ДВЕ, жёсткая ПОСТРОЕНА (backend/cmd/tmctl/main.go, греп signal.NotifyContext), мягкой НЕТ — это КОД отстаёт от ратификации, носители — строки 381 · 382 · 377, H16 self-improvement

4. Дорожная карта 13.07 — ОТРАБОТАНА (тело снято)

Статус обоих треков и гейта пере-прогона — в шапке; фантом «D35.7» формализован (D39 п.4, разбор ../archive/architecture/08-sync-audit-ledger.md). Что из трека B переживает статус: граница logicalне рычаг НА ЭТОМ МАТЕРИАЛЕ, когезия под флором (D39.7/D39.10), и скоуп замера — книги класса zh-вебновелла, а не весь спектр §0.1; конфликт exp14 ↔ research/18 §A решён этими же нотами; методика-guard замеров — D32.4 (fidelity-first · leave-one-out · катастроф-скрин: полигон трижды собирал ложную сходимость).

⚠ Ограничение дизайна эксперимента, которое НИКОГДА не переносится в продукт (§0.1): плоский тест-срез не задействует рычаги границы/когезии, поэтому «не сработало на нём» ≠ «не нужно в движке».

5. Процесс против «сломанного телефона» (концерн 5)

Постоянный findings-ledger — замысел ИСПОЛНЕН и повторяется: первый экземпляр ../archive/architecture/08-sync-audit-ledger.md (там же словарь диспозиций и правило «трекать до закрытия»), сегодня — ../DOC_CLEANUP_PLAN.md (⚠ испр. 05.09: DOC_REVISION_FINDINGS.md живым больше не существует, он в ../archive/reports/DOC_REVISION_FINDINGS_2026-09-02.md; живой findings-ledger сегодня — строки бэклога), backend/docs/SEAM_PACK_FINDINGS.md, реестр нот D39.126.

Живой остаток: вопросы «к бэкенду» из ресёрча маршрута обратно так и не получили (research/18 §D, п.7 помечен «вопрос бэкенду»).


6. Что НЕ демонтируется

Столпы (деньги/durability, snapshot-дисциплина, детерминированный банк памяти как ставка, echo-гейт, 18+ линия, дешёвый трек, конфиг-первое ядро) — целы. Целевая архитектура — это декомпозиция и до-стройка существующей машинерии по чистым сеамам, а не переписывание. Фронтир-тир остаётся «потом» (новый yaml, не переделка кода).