diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index e737e6b1..33d231f0 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-07-25, пак-17 закрыт, право по ToS подписано, пак-18 принят — долгов контракта нет, D39.26–D39.31). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D39.40); этот файл — ЖУРНАЛ.** +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-07-25, пак-17 закрыт, право по ToS подписано, пак-18 принят — долгов контракта нет, D39.26–D39.31). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1–D39.41); этот файл — ЖУРНАЛ.** > - **Фазы/курс:** Ф0 ✅ · Ф1-инфра ✅ (D20–D28; golden = инвариант №8) · арка «качество-первым» D26→D38.5 закрыта · **арх-ресет D39 исполнен ЦЕЛИКОМ** (7 слоёв → программа D39.1–D39.10 → паки 11–16, D39.13–D39.24; статус слоёв — шапка-таблица `architecture/09-target-architecture.md`) · пере-прогон rerun2 прочитан (D39.20: операционка живьём, $0-резюм ×3 арма, $6.63<$15; планка ≤2 НЕ пройдена; анти-корреляция гладкость↔верность ×3 → mistral-редактор вон) · эксп ЗАКРЫТ (D39.22), итерация №2 отложена · **курс = разработка бэкенда: пак-17 «канал B вживую» ЗАКРЫТ ЦЕЛИКОМ (дизайн D39.26 · стройка D39.27 · дельта `allow` D39.28, 25.07); вокабуляр = ПАРА `violence`/`sexually-explicit`, остаток — ФАКТЫ ToS в зоне полигона (fail-closed до них)** (D39.25: в движке НЕТ понятия «18+» — generic content-labels × provider-capabilities; лейблы вне хешей · резолв до валидации · один хоп `chain[0]` · гранулярность = книга) → **КУРС АМЕНДИРОВАН ВЛАДЕЛЬЦЕМ 25.07 (D39.33): МАСШТАБ — ПОСЛЕДНИМ, после достройки алгоритмического идеала; доказательство эффективности крупных изменений — МИНИ-ПРОГОНЫ ~10 глав (детерминированные чекеры и скан остатка первыми, судья — только когда от него зависит решение).** **ОЧЕРЕДЬ ИСПРАВЛЕНА ЗАМЕРОМ (D39.35): $0-резюм драфта на стенде УЖЕ МЁРТВ** (снапшот разошёлся по трём осям — cheapgate v3→v4, renderfmt v2→v3, langpack 09974d6→a7d4be2), поэтому срочности «гнать, пока жив» НЕТ, а ниты перестали быть условными: **(1) микро-пак «предпрогонная гигиена» ($0-код): два нита общности + ОБЯЗАТЕЛЬНЫЙ флип `Gates.RegressionGuard.Enabled` (невыполненное обязательство D38.4 п.5) + опц. проекция пере-оплаты в `tmctl status`** · **(2) мини-прогон-замер ~10 глав** (драфт ≈$0.02, редактура ≈$0.08–0.15/арм, судья НЕ зовётся ⇒ один арм ≈$0.10–0.17, два ≈$0.20–0.32; перед прогоном бэкап `rerun2/*.db`, БД на схеме v9 против v10 бинаря) · **(3) параллельно $0 — сид/банк-дельта** (元 · 赤城 · 学堂家老 · 春秋蝉; два терма ждут подписи владельца) · **(4) пак-19 в урезанном скоупе** · (4) далее слой-2 извлечение из тел промтов · ru-target · native-Gemini судья. Затем — сид-дельта (元 · 赤城 · 学堂家老 · 春秋蝉), МАСШТАБ целой книги (7,78 млн символов, ~2284 раздела) и пилот Ф2.5. Хроника треков A/B, exp15/16 и стройки паков — архивы ниже + D-лог. > - **Стек:** draft deepseek-v4-flash (thinking ON) → **editor deepseek-v4-pro БИЛИНГВ ИНТЕРИМ (D39.22; glm-5 резерв, mistral вон D39.20)**, промпт v3-discourse (P1a+чэнъюй+few_shot-тумблер) → судья gemini-3.1-pro-preview; канал B Mistral+grok; 7 ключей; ~$0.85/ранобэ (D30.4). > - **ОТКРЫТЫЕ ПЕТЛИ (норма 25.07, перепись 180 инцидентов: класс NEVER_CLOSED больше не копим — каждая петля обязана получить диспозицию решено/отложено-с-записью/отклонено; ведёт оркестратор).** *Владелец:* ~~вокабуляр content-лейблов~~ **РЕШЕНО 25.07: ПАРА `violence`/`sexually-explicit`** (D39.27 п.5 — сохраняет D14 п.1 и dspro-редактора на violence) ⇒ следствие в работе: assert-only `action` (дельта пака-17) · ~~Q2 редактор под лейблом~~ **ОТЛОЖЕН С ЗАПИСЬЮ** (D39.27 п.7: при паре связывает только `sexually-explicit`-книги, которых нет; возвращается вместе с предусловием D22.7 перед первой explicit-книгой; кандидаты — grok-4.3 интерим, glm-5 только после сверки ToS Z.AI по первоисточнику, mistral отвергнут D39.20) · ~~ToS-факты + три решения по ним~~ **ЗАКРЫТЫ 25.07 (D39.29 факты + D39.30 подписи владельца):** лейбл `violence` НЕ заводится, интерпретация «нейтральное изображение ≠ пропаганда» зафиксирована письменно · риск Z.AI (плоский запрет «violent content»; экспозиция состоялась в rerun2 через glm-арм) ПРИНЯТ сознательно с условиями пересмотра · две строки `accepts_labels: [sexually-explicit]` (`xai`, `mistral`) ПОДПИСАНЫ и ПРИМЕНЕНЫ в `models.yaml`. **Остаток ToS-вопросов ЗАКРЫТ владельцем 25.07 (D39.32):** local = «политик нет, переводим всё» ⇒ строка применена · Gemini-оговорка читается СУЖЕНИЕМ ⇒ вердикт `FORBIDDEN`→`UNCLEAR`, но по доктрине это НЕ разрешение: строку Gemini не получает, **ждёт одного слова, если владелец хочет подписать интерпретацию как разрешение** · причину пустоты в конфиг НЕ выносим (живёт в quirks-доке) · **ре-чек политик стал ПРАВИЛОМ** (триггеры: Google ToS 30.07.2026 · квартал 25.10.2026 · любая правка `accepts_labels`) · дата аккаунта OpenAI — открыта, приоритет низкий (OpenAI вне цепочки). **Продуктовое (Ф3):** Gemini API Additional ToS запрещает клиентов, «likely to be accessed by individuals under 18» — обязательство на конечный продукт, независимо от лейблов · **промпт-слой под лейблом (НОВОЕ, вскрыто вопросом владельца): лейбл сегодня НЕ доезжает до промпта** (чистые данные маршрутизации + load-time гарантия); нужно ли, чтобы переводчик/редактор ЗНАЛИ о свойстве контента — отдельное решение промпт-слоя · ~~мини-каноны сид-дельты~~ ЗАКРЫТО 26.07: все четыре пункта решены, правок сида ноль; книжные канон-решения живут С КНИГОЙ (`books/gu-zhenren/CANON-NOTES.md`), НЕ в D-логе — урок владельца: движок не строится вокруг одной книги · ~~включение платной петли ремонта~~ **РЕШЕНО 26.07 (D39.38): НЕ включается** — замер 0 в её классах; вернуться при расширении классов и ненулевом остатке; **уточнение D39.39: «0» = ноль в охвате детекторов с измеренным теперь recall (латиница 0.50 боевой, битые формы 0.10) — решение в силе (петля видит теми же детекторами), но читать как «финал чист» нельзя** · **вопросы разметки Р1–Р4 (НОВОЕ, D39.39, пакет-6 §5, 21 спорная строка):** гипербола 千万 (довод: тот же автор в гл.2 даёт 数十万 о том же деянии) · что есть дефект в классе 成 — форма или значение (от ответа precision K5c 1.000 или 0.167) · сокращённая форма термина («гу» при dst «гу-тварь») · принципиально неразрешимая офлайн речь/мысль (если да — потолок recall K4b < 1.0 by construction, вписать в контракт правила) · ~~место фикс-пака «чекеры» в очереди~~ **РЕШЕНО 26.07 (D39.40): это ПАК-21, а перед ним мини-прогон ~10 глав на полном бэкенде (после лендинга 20 и 19)**; ответы Р1–Р4 нужны к дизайну пака-21 · ja→ru-реплика §B5 (тайминг) · старые Ф2.5-блокеры (билингв-якорь — D25 п.9 Q1 · контаминация корпуса — D27 п.4 · судья-дублёр D22.6 · планка запуска · publishable/waiver — D25 п.1 · FN-bound L3 — D25 п.4 · юр-пакет · провенанс 12-*-доков · xAI-ключ off перед продом D27 · residual-тачпойнты exp16, не влитые в сид-дельту: мини-голд алиасов · precision@30, `books/gu-zhenren/exp16/`). *Оркестратор:* ~~ратификация дизайна пака-16~~ РЕШЕНО D39.24 (25.07) · фантом-гард D-ссылок в чек-листе лендинга (действует) · ~~doc-sync pass~~ **ИСПОЛНЕН 25.07** (запись ниже: оба puml перерисованы под пост-пак-16 · баннеры на 01/02/03/04/06/07/08/09 · ресёрч-свип 18/18c/19/20/21/22 · README/POLYGON_PACKAGE4 освежены; residual — пинги полигону в его зоне) · ~~приёмка пака-17 фаза 1~~ **РЕШЕНО D39.26 (25.07: принято в редакции §14, три добора приёмки, фаза 2 размечена)** · **`escalation_model` = ОТВЕТИВШАЯ модель (НОВОЕ, вынесено из пака-17): вердикт-изменение** — golden пинит `esc_model` на ОТКАЗАВШЕМ хопе, маскировка не скрывает ⇒ отдельная ратификация с санкционированным пере-капчером · **`--accept-rebill[=usd]` с порогом `min($0.50, 5%×ProjectedBookUSD)` РАТИФИЦИРОВАН D20.2-Q2, но в коде/CLI ОТСУТСТВУЕТ (НОВОЕ)** — живёт только в спеке `backend/docs/D15.2-*.md`; `--resnapshot` пере-пиннит без суммы · **D22.7 (пер-чанковый L3-скрин) — предусловие первой erotica-книги в проде НЕ снято паком-17 (НОВОЕ, держать отдельным гейтом)** · фантом-гард D-ссылок в чек-листе лендинга (действует). *Бэкенд:* **ХВОСТЫ МИНИ-ПРОГОНА (D39.37, 26.07, по убыванию веса):** ~~(1) размеченный набор для чекеров~~ **ЗАКРЫТ 26.07 (полигон-пакет-6, D39.39)** ⇒ породил вход нового фикс-пака «чекеры»: 12 дефектов с file:line (супрессор K5c гасит юнит целиком · атрибуция K4b (23 безатрибутивных + 12 с `!?…`) · `inner_marker` на тире-строки · предохранитель K5a отсекает все реальные магнитуды · заглавные/гомоглифы K2 · 两 в `cheng_re` · U+0301 рвёт `TokenizeCyrillic` · мн.число в `decl.forms`-тулинге · однознаковые ключи пост-чека) — приёмка против набора за $0; **место РЕШЕНО (D39.40): ПАК-21, после мини-прогона на полном бэкенде; + переезд `translitInterjections` в данные (улов владельца)** · (2) **тест-пин джойна WHAT↔WHICH** (мутация оркестратора выжила — фикс-лист №1 следующего касания) · (3) покрытие WHAT↔WHICH (0/2 и 1/2) + флаговый майнинг-стоп (семантика владельца озвучена, D39.36 п.2; стоп очищается РАУНДАМИ) · (4) `dialogue_dash` мерить только на невиданном тексте (подогнан под 蛊真人) · (5) генеральность нарезки: кана/ханьцзи один класс ⇒ ja `est_out` ~1.7× завышен МОЛЧА; `EstimateTokens` недосчитывает кириллицу (резервации занижены) · (6) golden второй фикстурой С langpack · (7) `prompt_override` — честная формулировка гарантии слоя-2 · (8) майнер/банк не-CJK (едет с ja→ru) · (9) `request_log` скоуп/ретеншен + `first_flag_reason` третье представление истории · (10) флор-16000 без модели · (11) `max_tokens`-упоры вернутся на en · ~~пак-17 (фазы 1–2 + дельта)~~ **ЗАКРЫТ ЦЕЛИКОМ 25.07 (D39.26/27/28)** · ~~ПАК-18 «долги контракта»~~ **ПРИНЯТ И ЗАЛЕНДЕН 25.07 (D39.31) — долгов контракта не осталось**; выдавался (`BACKEND_PACK18_DEBTS_SESSION_PROMPT.md`: `--accept-rebill` на снапшотной гранулярности — `guard_hash` в коде нет и не строим · `escalation_model` = авторитетная модель с САНКЦИОНИРОВАННЫМ пере-капчером golden под этот дифф · два нита общности условно-байт-нейтрально) · **ru-target долг (слой 7, `isRuTarget`×11 прод-сайтов · `TokenizeCyrillic`×6 · ключ «ru» в санитайзере) — ЖДЁТ СВОЕГО ДИЗАЙН-ПАКА** (связывает только не-русский таргет, по текущей карте zh/ja/en→ru не срочен) · **ПАК-19 «голос и состояние» ВЫДАН 25.07** (`BACKEND_PACK19_VOICE_STATE_SESSION_PROMPT.md`, двухфазный; ниты общности едут ЕГО лендингом — D39.31 п.5) · **проекция пере-оплаты в `tmctl status` (НОВОЕ, из отчёта пака-18): спека §9 предлагает заменить булев `ConfigDrift` числом «N чанков, ~$X» — дёшево, `omitempty`, не сделано сознательно** · **не-долги, следующие несущие:** масштаб целой книги (волны/каденс/потолки/ETA на сотнях глав — гоняли максимум 5) · Ф2-механизмы (голос/состояние D21 · native-Gemini судья) · извлечение дискурс-норм/few-shot из ТЕЛ промтов (слой 2, форсинг = ja→ru) · ~~пак-16 ф.2~~ ЗАЛЕНДЕНА 25.07 · per-class исходы ремонта — схемное решение (класс не durable), принимается ВМЕСТЕ с включением петли · ниты общности (владелец 25.07) — **ОТЛОЖЕНЫ ПО ЗАМЕРУ (D39.31 п.5): едут на ближайший ПОЛНЫЙ `--resnapshot`**; для Detail-строк байт-нейтральной формы не существует определительно (дефолт шаблона обязан рендерить текущую строку). Прежняя формулировка: только в байт-нейтральной форме с доказательством исполнением (иначе `CheapGateVersion`/`pack.Version()` двигают снапшот стендовых книг и убивают $0-резюм драфта под замер остатка пака-16): Detail-строки чекеров → шаблоны/цитаты из данных (статический 时辰-текст в generic-файле соврёт второй паре) · множитель ×2 `lintTimeUnits` (`checkers.go:174`) → ключ данных. *Полигон:* ~~пакет-6 (размеченный набор чекеров)~~ **ОТРАБОТАН И ПРИНЯТ 26.07 (D39.39): 3015 позиций, 6 прогонов, $0; metrics.json воспроизведён побайтно; набор на стенде `books/gu-zhenren/labels/` = постоянный измерительный стенд чекеров; полигон-очереди НЕТ** (кандидаты следующего пакета: ёфикатор/санитайзер-классы не размечены — §6.5 отчёта; `dialogue_dash` на невиданном тексте) · ~~пакет 5 (факты ToS + 8 пингов)~~ **ОТРАБОТАН ЦЕЛИКОМ И ПРИНЯТ 25.07 (D39.29); все восемь пингов закрыты.** Исторический список закрытых пингов: (1) `00-provider-quirks.md:13,73` — катовер deepseek-chat 24.07 ПРОШЁЛ, пост-катовер факт (жив ли алиас, цены) не внесён — live-проба `/models` + вендор-дока; (2) `00-provider-quirks.md:69` — оговорка «mistral-editor-арм до guard» superseded D39.20 (mistral вон из редакторов; rate-limit-цифры оставить — нужны переводчику канала B пака-17); (3) `09-pilot-protocol.md:3` — ⚠-указатель застрял на D31/glm-5: продлить до пост-D39.22 (dspro-интерим · планка ≤2 не пройдена rerun2 · авто-QA слепыми метками D39.20 · стайл-каноны D39.21), тело не трогать; (4) `15-segmentation-empirics.md:6-7` — шапка до сих пор «НИ ОДНОГО платного вызова», а эксп залендён REV.2 (D39.7/D39.8, $12.79) — перевернуть статус-блок; (5) `16-bank-mining.md:3` — дописать финал «ИСПОЛНЕН И ЗАЛЕНДЁН (D39.10); gender-тачпойнт §7 закрыт (D39.19); продолжение — Go-майнер парити EXACT»; (6) `experiments/README.md` — индекс без строк exp15/16 (сверка застряла на D38.2); (7) `eval/README.md` — не тронут с 19.07 (пре-rerun2): освежить статус под пост-D39.22 (эксп закрыт · судейский риг-стандарт D39.7 · экстракция только `tmctl export`). diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index e7f14c92..1259d4ad 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1074,3 +1074,9 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу **Мини-прогон — по норме D39.33 (именованные вопросы):** покрытие WHAT→WHICH живьём при непустом пересечении (обязательство D39.37) · оба режима флага (стоп с таблицей / auto→Ambiguous от начала до конца) · срабатывания голос-флаггера пака-19 · эхо-метрика на живом эхо. Ограничение: `dialogue_dash` на 蛊真人 загрязнён подгонкой (D39.37 п.4) — его цифры мини-прогона аргументом не считаются. Скан остатка пойдёт по линейкам с ИЗВЕСТНЫМИ слепыми зонами (D39.39) — приемлемо: зоны документированы, чтение «тишина ≠ чисто» уже в силе. **Пак-21 «чекеры» (вход зафиксирован):** 12 дефектов D39.39 с file:line + переезд `translitInterjections` из Go в данные цели (улов владельца 26.07: захардкоженный словарь в `cheapgates.go:367` против нормы §0) + починки по ответам владельца на Р1–Р4 (дизайн пака пишется ПОСЛЕ этих ответов). Приёмка = ре-ран против размеченного набора пакета-6: recall вверх, precision не ниже текущей, `metrics.json` — сравнение с базлайном D39.39. + +## D39.41 — Пак-20 ФАЗА 1 ПРИНЯТА: синк вскрыл 18 расхождений «доктрина↔код» и 4 структурных тупика; корпус доков УЖЕ содержит непостроенные ратифицированные ответы (двухрежимная эмиссия §C2-7 · M2 · журнал ревизий); вердикт сессии «P1–P5 в предъявленном виде не строятся» подтверждён верификацией 39 CONFIRMED / 7 PARTIAL / 0 REFUTED (26.07, оркестратор №8). ✅ + +**Приёмка исполнением (7 верификаторов, 46 клеймов, $0):** все несущие S-строки синка подтверждены кодом и исполнением (S1 — тест `TestRenderGlossaryBlock` PASS на `status:auto` + ⟨проверить⟩; S2 — вырез `Source:mined` из baseMemory + confirmed-only редактор = инертность на обоих проводах; S5 — срез банкноты не выполняется при выключенном гейте, ключа нет ни в одном конфиге; S8 — `contrast_path` не задан ни в одном тесте, тело майнинг-стопа `mining.go:40-102` не исполняется ни разу за сьюту, доказано подсчётом логов с позитивным контролем). Доктринальные цитаты Д1–Д8 сверены с первоисточниками; деньги пересчитаны из БД стенда тремя способами (verify $0.0161 / verify2 $0.0328, +104%); теорема FOI и Следствие B выдержали атаку (девятый путь не найден). PARTIAL-поправки — в ревью-шапке отчёта `docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md`; весомые: цитата-парафраз в Д5 (овер-атрибуция), блокер 7 не грунтован текстом, посылка блокера 3 не предъявлена в отчёте. **Новая находка приёмки: бюджет банкноты `bankTokenBudget=144` по честной формуле движка впритык/отрицателен (худший блок пробы 142.6/147.2 est-токенов) — фазе 2 пере-считать.** + +**Статус: фаза 2 НЕ стартует** до решений владельца по блокирующим развилкам (следующий D-блок). Ключевое уточнение семантики от владельца (26.07, дословно по смыслу): флаг = ОПЦИОНАЛЬНАЯ ПОДПИСЬ — «можно запустить перевод так, чтоб сессия не останавливалась и не запрашивала верификацию банка, а просто как намайнит и закончит — шла в редактуру». Семантика D39.36 не пересматривается; сложность пака — не в стопе, а в том, ЧТО едет в провод, когда подпись пропущена (у большинства намайненных терминов нет dst — разъезд каналов 3% по построению; путь записи не существует; строки в проводе двигают хеши оплаченного). diff --git a/docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md b/docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md new file mode 100644 index 00000000..35d12afd --- /dev/null +++ b/docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md @@ -0,0 +1,638 @@ +# ПАК-20, ФАЗА 1 — дизайн «банк: флаговый стоп + покрытие WHAT→WHICH» + +**Сессия бэкенда, 2026-07-26.** Исполнение `docs/BACKEND_PACK20_BANK_TRUST_SESSION_PROMPT.md` (санкция D39.38). +**Кода не трогал** — дерево чисто (`git status --porcelain` пуст до и после). Сессия не коммитит. +**СТОП НА РАТИФИКАЦИЮ** — ниже 11 развилок владельца, из них 4 блокирующие фазу 2. + +**Аддендумы:** подтверждаю получение — релеем на 26.07 доехало только тело промта; иных аддендумов не поступало. + +> **Ревью-шапка (оркестратор №8, 26.07): ФАЗА 1 ПРИНЯТА, D39.41.** Адверсариальная верификация +> исполнением (7 параллельных верификаторов, 46 несущих клеймов): **39 CONFIRMED · 7 PARTIAL · 0 REFUTED**. +> PARTIAL-поправки: (1) полей снапшот-payload **20**, не 21 (суть S18 верна); (2) «ничего неподписанного +> не становится Confirmed» подано в кавычках как цитата D39.36 — такой фразы в D-логе НЕТ, это парафраз +> (овер-атрибуция; доктринальный смысл верен: D-лог:1030,1049); (3) «+104% при байт-идентичном конфиге» — +> суммы подтверждены тремя независимыми пересчётами, но `mined-delta`/`mined-rejects` двух срезов +> РАЗЛИЧАЮТСЯ — сужать до «pipeline+prompts+seed идентичны»; (4) **блокер 7 (P2⊥P5) не грунтован текстом +> отчёта** — «P5.2» нигде в документе не определён; (5) **посылка блокера 3 («дефолт lane:fwd на +> approved-строке») в отчёте отсутствует** — механика опасности подтверждена кодом, но атакуемая +> рекомендация не предъявлена; (6) в иллюстративном списке 12-строчного блока 少年 не из того блока +> (2/9=22% верно); (7) «максимальный блок пробы 116.7 est-токенов» невоспроизводим — честная формула +> движка (TokenClassCounts × zh-ru фертильности) даёт **142.6 без сепаратора / 147.2 с ним** против +> бюджета 144 ⇒ **«хватает с запасом» не обеспечено расчётом** (практикой не пробито: truncated=0); +> фазе 2 — пере-считать бюджет. Вердикт «P1–P5 в предъявленном виде не строятся» ПОДТВЕРЖДЁН. + +## Эхо-блок + +``` +СКОУП: только ФАЗА 1 — дизайн. Шаг 0 (синк источник↔код↔вердикт) + B1 форма флага · + B2 покрытие WHAT→WHICH (ядро, со сметой) · B3 банкнота в shipping-промпт · + B4 авто-режим на книге · B5 тест-пин джойна. Выход — этот отчёт → СТОП. +ИНВАРИАНТЫ: флаг бинарный, операторский, НЕ ось wire/снапшота · dst только из контекста + (exp16/D39.10) · ничего неподписанного ≠ Confirmed · провенанс + reject-set в обоих + режимах · общность движка (новая пара без правки Go) · расхождение = пинг, не интерпретация. +НЕ ДЕЛАТЬ: код фазы 2 · D21 · судья · веб-фетч · L3 · авто-подпись порогом · платные прогоны · + книжный канон в код/D-лог · коммиты. +``` + +--- + +## §0. Как эта работа сделана и чего её числа НЕ доказывают + +Норму D39.37 («пере-мерь свой вывод ДРУГИМ способом, чем получил») я исполнял механически, а не декларативно: +каждая несущая ось прочитана **дважды независимо** — один проход по коду, второй по сырью прогонов +(`immutable`-SQL к БД в `/home/ubuntu/books/gu-zhenren/`) или по артефактам полигона. Затем весь дизайн прошёл +**три адверсариальные линзы** (author≠reviewer): соответствие коду · контракт и семантика владельца · +деньги и измеримость. Линзы опровергли **шесть** несущих клеймов моего же дизайна — они исправлены ниже, +а не спрятаны (см. §7). + +**Чего эти числа НЕ доказывают** (дисциплина, ратифицированная D39.37 п.3): + +- **Смета книги ($30.7 центр, вилка $19.7…$47.3) держится на n=3 срезах по 14 главам одной книги.** + Разброс между двумя соседними двухглавыми срезами одной книги при **байт-идентичном конфиге** — **+104%** + (`verify` $0.016091 против `verify2` $0.032764, мой SQL). Это дисперсия содержания, а не конфига. + Любая цифра «на книгу» ниже — порядок величины, не оценка. +- **Покрытие вариантов (а)/(б) НЕ ИЗМЕРЕНО.** Замерено только сегодняшнее: **0 из 2** на единственном прогоне, + где включены оба канала. Все проценты будущего покрытия — оценки; способ проверить их за $0 назван в B2. +- **Качество доставленного dst измерить нечем.** `canon-recovery` в бэкенде не существует + (единственное совпадение грепа — комментарий `miner_substrate.go:24`). Любой вариант доставки dst + вводится **вслепую** относительно ратифицированного порога ≥70%. +- **Насыщение майнинга я измерил ($0), но ДРУГИМ детектором,** чем майнер (кривая первого появления + Han-биграмм/триграмм с книжной частотой ≥5 — тот же пол, что `emitMinFreq`). Это прокси, не реплей `MineBank`. + +--- + +## §1. ШАГ 0 — СИНК: источник ↔ код ↔ вердикт + +Полная таблица — 138 строк по 6 осям; здесь **расхождения и не-построенное** (совпадения перечислены сводкой). +Каждая строка проверена исполнением или чтением по `file:line`. + +### 1.1. Совпадает (сводкой, без разворота) + +`research/20 §B3` интеграционные точки 1–8 построены и местами строже спеки: срез до `classifyOutput` +(`stagerun.go:588→591`), coverage/echo по очищенному тексту, `+144` токена к `max_tokens` только для +роли translator при включённом гейте (`stagerun.go:112-113`), derived-чекпоинт и ре-поинт `final_hash` +на OK-пути (`stagerun.go:215-221`), резюм пере-доказывает срез из сырого чекпоинта за $0 +(`stagerun.go:397`). Майнер **никогда не пишет `approved`** — литерал `"auto"` (`miner_emit.go:193`), +инвариант держится. Майнер пар-агностичен: все языковые данные приходят пакетом `*lang.Pack`, +ru-стороны в нём физически нет (`mining.go:54` кладёт только `NSource`). Палладий-подканал +**выключен** в default-B (`miner.go:52`) — со-встречаемость в коде отсутствует, запрет exp16 на HEAD +структурно соблюдён. + +### 1.2. Расходится / не построено + +| # | Источник | Код | Вердикт | Суть | +|---|---|---|---|---| +| S1 | D39.36: «сегодня в инъекцию идёт ТОЛЬКО CONFIRMED» | `memory.go:570-575` | **расходится** | Неверно для блока **переводчика**: `RenderGlossaryBlock` рендерит не-Confirmed, приписывая `tx.UnverifiedMarker` («⟨проверить⟩»). CONFIRMED-only — свойство **только** редакторского блока (`memory.go:633`). Проверено исполнением: `go test ./internal/membank/ -run TestRenderGlossaryBlock` PASS на ассерте `小D → Малыш Дэ ⟨проверить⟩` для `status:"auto"`. | +| S2 | Семантика владельца: «auto → инжектируются как Ambiguous» | `seeding.go:94` + `memory.go:633` | **не построено, СТРУКТУРНЫЙ ТУПИК** | Драфт-волна селектит над `baseMemory`, откуда `Source:"mined"` **вырезан целиком**; редактор видит строку, но его блок confirmed-only. ⇒ `mined`+`auto` инертна на **обоих** проводах. Авто-режим не сводится к «убрать `return stopped`». **Развилка №1.** | +| S3 | Семантика владельца: «предложения входят в банк как auto» | `mining.go:36-104` | **не построено** | `runBankMiningStop` только **читает** стор и пишет YAML. Ни одной строки в `glossary` он не добавляет. Пути записи не существует. | +| S4 | Семантика владельца: «стоп **с таблицей** (src · dst · частота · разброс · улики)» | `cmd/tmctl/render.go:79-84` | **расходится** | CLI печатает 6 строк: число термов + путь к файлу. Таблицы нет. `Term.Freq` вычислен (`miner_emit.go:42`), но **в артефакт не попадает**; KWIC и счётчики пола не строятся. «Разброс» доступен только как число чанков на вариант. | +| S5 | ПАК-20 B3: «перенос блока в `translator.md`» | `banknote.go:187` + `grep banknote: configs/` = 0 | **БЛОКЕР** | При `Gates.Banknote.Enabled=false` `applyBanknote` возвращает **сырой текст, не заходя в `splitBanknote`**. Ключа `banknote:` нет ни в одном шиппинг-конфиге. ⇒ буквальное исполнение B3 даст неотрезанную таблицу `⟦TM-BANK-v1⟧` в черновике → редакторе → **экспорте**; санитайзер не перехватит (он `isFinal`-only, `chunkrun.go:51`). **Развилка №2.** | +| S6 | ПАК-20 B2(а): кандидаты майнера в промпт | `render.go:176` | **не построено, и через промпт невозможно** | Набор плейсхолдеров **закрыт**; неизвестный `{{…}}` — жёсткая ошибка рендера. `{{mining_candidates}}` без правки Go не заводится. Единственный законный шов — code-assembled инъекционное system-сообщение (`render.go:220-225`). | +| S7 | Гардрейл общности (владелец 24.07) | `banknote.go:92-99,143` | **расходится** | `hasBankSrcHan` вызывается **безусловно**, диапазон U+3400–U+9FFF зашит в Go; пар-гейта в `banknote.go` нет (grep по `SourceLang`/`LangPair` пуст). На en — все строки `bad++`; на ja — кандзи пройдут случайно, чисто-кановые имена (ровно целевой класс) отбросятся **молча**: `ParseFail` уходит только в телеметрию, в `FlagReason` не участвует. Ответ на контрольный вопрос: **нет, без правки Go не заработает.** **Развилка №3.** | +| S8 | D39.37 фикс-лист №1: «мутация джойна выживает сьюту» | `mining.go:37` | **хуже, чем записано** | Диагноз неполон. `grep -rn contrast_path --include=*_test.go --include=*.yaml internal/` = **0** ⇒ гард `mining.go:37` всегда возвращает `false` на `:38`, и строки **40–102 не исполняются ни разу за всю сьюту**. Исполнительное доказательство: `go test ./internal/pipeline/ ./internal/miner/ -v \| grep -ci "bank-mining"` = 0 при зелёном прогоне, при позитивном контроле (логи того же логгера в вывод попадают). **Немая не строка 94, а весь диапазон.** | +| S9 | `memseed.go:20-24` (замысел «auto/draft churn») | `memseed.go:283` | **не построено** | `rubyToCandidates` — единственный автогенератор `status:auto` — **не вызывается нигде**, кроме своего теста. D8-обоснование опирается на путь, которого в проде нет. | +| S10 | research/20 §C2: «канон по ВСЕМ вхождениям × Палладий-конформность, НЕ мажоритарность» | `banknote.go:242-281` | **расходится** | `bankProposalsByKey` сортирует по числу чанков и `DeltaYAML` берёт `props[0]` — это **ровно мажоритарность**. Палладий-конформности в джойне нет. Смягчение: альтернативы едут в `note` с числами, и `status:auto` не даёт им стать каноном без подписи. | +| S11 | research/20 §B3 (артефакт кандидатов) | `chunkrun.go:112` | **расходится** | Кандидаты пишутся **в стор** (`retrieval_state.banknote_detail`), а не в отдельный evidence-файл, как требует §B3. Расхождение осознанное (джойн D39.37 читает стор), но спека не амендирована. | +| S12 | §B3 п.1 «первый рубеж — `banknote_parse_fail` до редактуры» | `banknote.go:192` | **не построено** | Именно тот случай, ради которого п.1 писался («модель написала "Примечание:" вместо разделителя»), не покрыт: без сепаратора парсер не вызывается и `ParseFail` остаётся `false`. | +| S13 | `mempostcheck.go` / слова владельца «принудительный пост-чек» | `waverun.go:365` | **расходится** | В штатном двухстадийном пайплайне `isFinalWave` для драфт-волны = `false` ⇒ пост-чек над выходом **переводчика не запускается вообще**. Ambiguous-промах — наблюдаемость в JSON-детали, в счётчик не входит **по ратифицированному основанию** (`mempostcheck.go:45-48`, external-review major #1: обратное «наказывало бы модель, верно отвергшую непроверенное предложение»). Формулировка владельца конфликтует с этим решением. **Развилка №4.** | +| S14 | Диагностика при непроверенном dst | `memory.go:953`, `memseed.go:173` | **расходится** | `InjectivityCollisions` и `ApprovedSharedKeyCollisions` — **approved-only**. Пара «approved 族长→глава клана» + «auto 族长→старейшина» не будет поймана, а в `Select` оба попадут в `matchedVia` ⇒ модель получит **две противоречивые строки на одну поверхность**. Самый вероятный источник тихой деградации авто-режима. | +| S15 | `memseed.go:146` (текст fail-loud) | `memseed.go:133` | **расходится** | Проверка полисемии D16.1 итерирует весь набор без фильтра по статусу ⇒ лекарство, предлагаемое её же сообщением («mark one `status: auto`»), проблему **не снимает**. Для пака-20 это ограничение: auto-строки проходят те же fail-loud, что approved. | +| S16 | `waverun.go:79-84` («STOPS before the edit wave») | `waverun.go:126` против `:135` | **расходится** | Стоп стоит **выше** ветки draft-only ⇒ срабатывает и в пайплайне без редактора, где волны, «перед которой» он останавливается, не существует. Собранный `BookResult` при этом теряется. | +| S17 | ПАК-20 B1 «как ложится на translate/redrive» | `main.go:114`, `:218-221` | **расходится** | На стопе `translate` возвращает `err` **до** `renderTranslate` ⇒ оператор не видит ни строки по уже оплаченной драфт-волне. В `redrive` баннер стопа не печатается вовсе, при том что деструктивный ресет (`status.go:713-717`) уже выполнен. | +| S18 | ПАК-20: «флаг — операторский режим, не ось снапшота» | `snapshot.go:370-437` | **совпадает (доказано)** | В payload входят 21 поле; ни `Mining.ContrastPath`, ни какой-либо режим стопа туда не входят (grep = 0). `Book`-поле тоже невидимо снапшоту — `book.go:256-291` «FROZEN LAYOUT», единственное касание `snapshot.go:413`. Оба места нового флага доказуемо вне хешей. | + +**Открытые вопросы синка, требующие решения оркестратора/владельца, а не сессии:** S2, S5, S7, S13 +(развилки 1–4), плюс расхождение §C2-спеки с построенным (S10, S11) — амендировать research/20 или код. + +--- + +## §2. B1 — форма флага + +**Рекомендация: `--verify-bank`, CLI-only bool на `translate` + `redrive`.** + +| | вариант | цена механики | вердикт | +|---|---|---|---| +| O1 | `--verify-bank`, CLI-only, карта пишется **до** ветвления, fail-loud при невозможном майнинге | $0 | **рекомендую** | +| O2 | O1 + книжный пол `verify_bank: true` в `book.yaml` | $0 | развилка владельцу | +| O3 | имя `--stop-for-signature` | $0 | развилка владельцу | +| O4 | сохранить дефолт=стоп, ввести обратный `--continue-unsigned` | $0 | отклоняю: пере-открывает решение владельца (D39.36 п.2, D39.38) | +| O5 | переменная окружения | $0 | отклоняю: режим невоспроизводим из истории команд | + +**Обоснование места.** Прецедент в коде однозначен: операторские **режимы** живут в CLI→Runner +(`Resnapshot` `runner.go:50`, `AcceptRebill` `runner.go:55` — оба вне снапшота), книжные **пороги и пути** — +в `book.yaml` (`RebillConsentUSD` `book.go:106` «WIRING, not brief»; `MinedRejects` `book.go:98`). +«Останавливаться ли сейчас» — режим. + +**ДЕНЬГИ — здесь мой дизайн был опровергнут собственной линзой, привожу исправленное.** +Первоначально B1 утверждал «Δ(книга) между режимами = $0, флаг не двигает ни один край». **Это неверно.** +Подпись после авто-прогона двигает `enrichedVersion` (`memory.go:305`) → edit-волновой снапшот +(`snapshot.go:216-217`) → `stagerun.go:52-55` требует `--resnapshot`, `rebill.go:233` — `--accept-rebill` +⇒ **вся редактура заново, ≈$21–25 на книге.** Это и есть **единственный денежный аргумент ЗА флаг**, +и он был вычеркнут в одном разделе, пока другой его считал. Итог: механика флага $0, **Δ поздней +подписи +$21…25** — обе строки обязаны стоять рядом. + +**Риски (все грунтованы):** +1. **Молчаливая регрессия дефолта.** Смена stop→auto не делает красным **ничего** (S8). Обязателен тест + до правки — тот же класс, что находка рубежа-2 D39.37. +2. **Экзит-код 3 тихо исчезает** из обычного прогона. Скрипты `if [ $? -eq 3 ]` перестанут срабатывать молча. +3. **Redrive: стоп после деструктивного ресета и без вывода** (S17). +4. **Redrive оценивает майнинг по всей книге** — подписной раунд может вытеснить точечную переатаку. +5. **Draft-only пайплайн теряет результат** (S16). +6. **Таблица может быть огромной:** `emitRankCap = 200` (`miner_emit.go:33`). Кап stdout (~20) + сайдкар обязательны. + +**Владельцу (развилки 5–8):** имя флага · нужен ли книжный пол O2 (защита от «забыл флаг» ценой отказа +от половины формулировки «операторский режим») · поведение redrive (honor / forbid / honor+баннер) · +громкость отказа при невозможном майнинге. + +--- + +## §3. B2 — покрытие WHAT→WHICH (ядро пака) + +### 3.1. ДИАГНОЗ (пере-мерен тремя способами, до всякого дизайна) + +**Замер, который реально существует:** `minirun-verify2/run-01-draft.log:13` — `terms=2 terms_with_proposed_dst=0`. +Это **единственный** прогон, где включены оба канала (`pipeline.yaml:28` + `:33-34`). Я воспроизвёл его +из сырья независимо: + +- подписная карта: `花海` (evidence `[surname:花 topo_suffix:海]`), `陈博` (`[surname:陈]`) — оба `dst: ""`; +- `banknote_detail`: `古月方源`→«Гуюэ Фан Юань», `学堂家老`→«старейшина школы», `开窍大典`→«Церемония + открытия апертуры», `力量蛊`→«гу Силы», `智慧蛊`→«гу Мудрости», `灵泉`→«духовный родник»; +- пересечение **0**. + +**«1/2» — не замер.** В `minirun/pipeline.yaml` `grep banknote` = 0: в главном 10-главном прогоне канал был +**выключен** (`config/pipeline.go:296` «Opt-in, default false»), а его БД осталась на схеме v10 без колонки +`banknote_detail`. Это кросс-проектное сопоставление двух раундов главного прогона с предложениями +**отдельной** пробы. Вес числа надо назвать честно. + +**ПРИЧИНА — арифметическая, а не выборочный шум.** Каналы разъезжаются **по построению**: + +- фильтр эмиссии майнера `emissionEligible` (`miner_emit.go:241`): тип ∈ {name, place, title} (`:242`) + **И** `Freq ≥ emitMinFreq = 5` (`:245`, константа `:27`); +- банкнота просит «новые имена собственные и термины **этого фрагмента**», тип — свободное поле с дефолтом `term`. + +На живой пробе (67 уникальных src, реплика парсера `banknote.go:104-147`): тип ∈ {name,place,title} — **12 из 67**; +`freq ≥ 5` — **12 из 67**; **оба одновременно — 3 из 67 = 4.5%**. Минус сид (`古月方源` — алиас сидового `方源`; +поверхность вырезается на `miner_emit.go:129`, кластер, касающийся сида, — на `:134`) ⇒ **2 из 67 ≈ 3%**. Плюс **45% предложений банкноты встречаются +в 10 главах ровно ОДИН раз** — они не могут пройти пол частоты в принципе. + +⇒ **Расширение банкноты «вообще» на прецизионный набор майнера не сойдётся.** Сходимость даёт только +**адресация** банкноты на список кандидатов. + +**Позитивная улика за канал:** когда наборы пересеклись, предложение было **точным** — `学堂家老` → +«старейшина школы» в `banknote_detail` буквально совпало со строкой, которую владелец подписал вручную +(`minirun/mined-delta.yaml`). + +### 3.2. Варианты + +| | вариант | покрытие (оценка) | рекуррентно $/книга | одноразово | +|---|---|---|---|---| +| **(г)** | **$0-двусторонний джойн**: alias/containment-резолвер ключа + обратная секция карты («что банкнота предложила, но майнер не нашёл») | 4.7%→9.4% (замерено на exp16-выборке n=64) | **$0** | $0 | +| **(а)** | **направленная банкнота**: майнер бежит до драфта, его кандидаты (N≤12 на главу) едут code-assembled инъекцией, модель отвечает по ним | не измерено; потолок = доля кандидатов, присутствующих в главе | $0.09 (потолок; с учётом насыщения — в разы меньше) | **≈$30.7** | +| **(б)** | **точечный до-спрос на границе стопа** с реальными вхождениями из исходника, батч 50 | 100% остатка по построению | $0.015 (flash, R=5) … $0.061 (R=20) | $0 | +| **(в)** | **гибрид**: (г) безусловно → (а) основной канал → (б) только остаток под флагом | — | $0.105…$0.151 | ≈$30.7 | + +**Рекомендация — (в) с жёсткой очерёдностью, но с одним честным понижением:** + +1. **(г) — безусловно и немедленно.** $0, не двигает ни одного хеша, покрытие **замерено**, применим + независимо от судьбы B3. Норма D39.24 ($0-решения первыми) не оставляет выбора. Обратная секция + немедленно снимает жалобу «на стопе почти голые термины»: 66 из 67 предложений банкноты **уже оплачены** + и лежат в `banknote_detail` — их просто никто не показывает. **Но потолок (г) арифметически ~10%**: + несущая причина — разъезд классов, а не строк. Продавать (г) как решение B2 нельзя. +2. **(а) — основной канал, N≤12.** Единственный вариант, бьющий по несущей причине: отнимает у модели + право самой решать, что достойно строки банкноты, и оставляет ей ратифицированную роль — WHAT из контекста. + Почти бесплатен рекуррентно (перераспределяет уже оплаченный бюджет: **2 блока из 9 упёрлись ровно в 12 строк**, + потратив их на `无/少年/三成/六块/雨声/停息/乏闷`). +3. **(б) — страховка на остатке, только под флагом.** В деньгах бесплатен, в структуре дорог. + +**ЧЕСТНОЕ ПОНИЖЕНИЕ ИНВАРИАНТА (находка контрактной линзы, принимаю).** Ратифицированный механизм D39.10 — +dst как **побочный продукт акта рендеринга чанка**. В (б) акта рендеринга нет вовсе; в (а) директивный +список принуждает отвечать по кандидатам, которые модель сама эмитить отказалась. Со-встречаемость +структурно невозможна в обоих (ru-стороны в майнере нет), но **«dst только из контекста» перестаёт быть +гарантией конструкции и становится просьбой в тексте промпта, статически непроверяемой.** Заявлять +«держится» нельзя. **Развилка №9 владельцу.** + +**Блокирующая развилка №10 — durable-заморозка списка кандидатов.** Без неё дописывание глав в +`source_file` меняет ранжирование → меняет инъекционный блок **во всех ранее переведённых главах** → +`msgsContentHash` каждого драфт-чанка (`render.go:209-212`) → пере-перевод. Для книги, которую переводят +инкрементально, это приговор. **Если владелец не санкционирует заморозку (новая durable-колонка + правило +инвалидации) — вариант (а) снимается, и рекомендация вырождается в (г)+(б) с честным признанием, что +покрытие остаётся ~10% плюс платная затычка.** + +**Насыщение — я его измерил за $0** (первоначально дизайн объявил «НЕ ВЫВОДИМО»; это был необеспеченный +отказ мерить). По 2284 секциям: разделы 1–228 → **128 774** новых кандидата; 229–456 → 46 939; +1825–2052 → **2 089**; падение скорости открытия **62×**, **51% всего запаса — в первых 10% книги.** +⇒ линейная смета (а) — **потолок, а не оценка**. + +**Как проверить покрытие за $0 до платного прогона:** реплей `MineBank` + `banknote_detail` по существующим +БД (`minirun-banknote/`, `minirun-verify2/`) — для (г) это прямой замер, для (а) — оценка доли кандидатов, +присутствующих в главе. + +--- + +## §4. B3 — банкнота в шиппинг-промпт + +**Текст пробы найден** (`/home/ubuntu/books/gu-zhenren/minirun-banknote/prompts/zh-ru/translator.md`, +дифф против шиппинга — ровно 8 строк после строки 18): + +``` +БАНКНОТА (служебный канал, ТОЛЬКО для этой пробы). ПОСЛЕ полного текста перевода добавь строку-разделитель +⟦TM-BANK-v1⟧ +и под ней — таблицу НОВЫХ имён собственных и терминов этого фрагмента, которых НЕТ в приложенном глоссарии. +Формат строки: исходный_терминпредлагаемый_переводтип +Тип — одно из: name, place, title, term, nickname. +Не более 12 строк. Если новых терминов нет — не добавляй ни разделитель, ни таблицу. +Разделитель и таблица идут ПОСЛЕ перевода и никогда внутри него. +``` + +**Рекомендация: вариант C — отдельный `prompts/zh-ru/translator-banknote.md` + `prompt_override`, НЕ буквальный +перенос в `translator.md`.** Это **отклонение от буквы промта пака** (он говорит «перенос в `translator.md`»), +поэтому выношу развилкой, а не исполняю тихо. + +Три причины: + +1. **БЕЗОПАСНОСТЬ (блокер S5).** Голый перенос лендить нельзя: при выключенном гейте срез не выполняется, + а гейт выключен во всех пяти конфигах ⇒ таблица `⟦TM-BANK-v1⟧` уедет в экспорт. В варианте C класс + невозможен: файл с инструкцией видит только конфиг, который ставит гейт. + Условной вставки на уровне шаблона не существует и не может появиться без Go (S6). +2. **ДЕНЬГИ.** C — единственный вариант, где книги без канала платят **$0** (`translator.md` байт-в-байт прежний). +3. **МОМЕНТ — сильнее, чем D39.35.** Стенд мини-прогона **уже мёртв на HEAD**: снапшоты в БД несут + `style_check_version = cheapgate-v4-…`, HEAD даёт `v5` (`checks/cheapgates.go:94`, бамп в `ad3633a` 26.07); + поле в **общем** payload ⇒ просрочены **обе** волны. Пере-оплата стенда причитается независимо от B3 + ⇒ **маргинальная цена B3 сегодня = $0.** Полного платного драфта книги в артефактах нет (10 глав из 2284). + +**Цена промедления — переоценена вверх линзой денег, привожу исправленное.** Дизайн первоначально писал +«одноразовая пере-оплата = драфт-волна $5.1–5.8, edit-волна не шевелится». **Занижено в 5.2×.** +Текст черновика входит в `contentHash` **редактуры**: `waverun.go:464` передаёт `unitDraft` как `prev`, +`stagerun.go:70-71` фолдит `RenderVars{Draft: prev}` в `msgsContentHash`, условие резюма `stagerun.go:86` +требует и снапшот, и `contentHash`. Плюс обязательный бамп `RenderFormatVersion` лежит в общем payload. +**Настоящая цифра — ≈$30.7, то есть целая вторая книга.** Аргумент «делать сейчас» от этого становится +в пять раз сильнее. + +**Бюджет строк — не менять.** 144 токена хватает с запасом (максимальный блок пробы 116.7 est-токенов). +**Но лимит 12 строк СВЯЗЫВАЕТ:** 2 блока из 9 (22%) остановились ровно на 12 при `finish=stop` и +`truncated=0` — модель упёрлась в инструкцию, а не в токены, и часть терминов теряется молча. +Правка `bankMaxLines` — третья ось (`TokenBudget` фолдится, `snapshot.go:129`), в скоуп B3 не входит. + +**Разрыв доказательства, который надо признать явно:** финальный текст ≠ байты пробы (минимум надо убрать +литерал «ТОЛЬКО для этой пробы»), ⇒ все цифры пробы (71 строка, 9 из 20 чанков, `parse_fail` 1, `truncated` 0) +формально относятся к другому промпту. Закрытие — микро-проба ≈$0.022. **Развилка №11.** + +**Не-CJK (S7).** Промпт и так пар-специфичен (`prompts/zh-ru/`), так что инструкция — уже пар-данные. +Но `hasBankSrcHan` — ветвление по паре **в Go**. Сегодня недостижимо (загрузка падает раньше на отсутствии +`prompts/<пара>/`), живым станет в момент появления `prompts/ja-ru/`. Вердикт: **гардрейл общности нарушен +на HEAD**, пак-20 его не усугубляет, но и не чинит. Владельцу — записать как «канал объявлен zh-only, +ратифицировано» либо как хвост «вынос правила src-скрипта в пар-данные». + +--- + +## §5. B4 — авто-режим на большой книге + +**Главный экономический вывод — он же аргумент ЗА флаг:** подпись **после** оплаченной edit-волны стоит +**всю edit-волну** (`memory.go:305` → edit-снапшот → `stagerun.go:52-55` → ≈$24 на книге). Точечного ремонта +главы нет. Стоп существует ровно затем, чтобы подпись случилась **до** редактуры. + +| | вариант | деньги | вердикт | +|---|---|---|---| +| A | **ledger-only**: auto-строки копятся, но вне провода | $0 | **обязательный фундамент** | +| B | **forward-only Ambiguous-инъекция** (окно `since_ch = frontier+1`) | $0 пере-оплаты; лишний input впереди фронтира | надстройка, только с решением о каденции | +| C | внутрипрогонный барьер каждые K глав | ~$0.026/книга; **CPU не измерен** (O(N²/K)) | развилка владельцу | +| D | наивная ретроактивная заливка | **тихая пере-оплата до $5.8** | **запретить явно** | + +**По пункту 2 задания ответ прямой: инъекцию строить НЕ НУЖНО.** Механизм «auto → Ambiguous с ⟨проверить⟩» +уже построен для блока переводчика (S1, проверено исполнением). Нужен **путь записи + решение по Source-скоупу ++ dst из B3**. Заодно неверен комментарий самого майнера (`miner_emit.go:180`): auto-строка сегодня инертна +**не из-за trust-гейта**, а из-за исключения `Source:mined` из `baseMemory`. + +**Всё вышесказанное ПУСТО без B3:** без инструкции в промпте dst всегда пуст, а строка без dst не матчится +(`memory.go:265`) и не рендерится (`memory.go:570`). Авто-режим без B3 не инжектирует **ничего**. + +**Риски, названные прямо:** +1. **ТИХАЯ ПЕРЕ-ОПЛАТА — самый опасный класс пака.** При живом `postcheck_gate=false` auto-строки не двигают + **ни один** снапшот (`memory.go:341`), но **меняют `contentHash`** каждого чанка, где терм срабатывает + ⇒ fast-path резюма падает ⇒ чанк пере-переводится. А `projectRebill` считает пере-оплату **исключительно** + по расхождению `snapshot_id` (`rebill.go:121`) ⇒ `checkRebillConsent` выходит на `rebill.go:194-196` + «nothing already-paid is superseded» и **согласия не спрашивает**. Сам код называет это + «a silent per-chunk re-translate» (`stagerun.go:83-84`). **Контур согласия Р6 обходится молча.** +2. **Ловушка самоисключения:** auto-строки в `glossary` становятся `seedSurfaces` для `MineBank` + (`miner_emit.go:59-65` → `:129`) ⇒ дельта пустеет ⇒ **флаговый стоп тихо перестаёт срабатывать**. + Обязательна фильтрация на `mining.go:57`. +3. **Reject воскресает:** накопительный авто-файл сохранит терм, отклонённый позже; `loadMinedRejects` + применяется **только на эмиссии** (`miner_emit.go:143`). Инвариант «reject-set работает в обоих режимах» + **сегодня для авто-режима не держится** — нужен второй пункт применения (на загрузке). +4. **Коллизия ключей:** auto-строка и подписанная на тот же src ломают `UNIQUE(book_id,src,sense,since_ch,until_ch)` + и валят `ReplaceGlossary` посреди прогона; существующий guard знает только пару seed↔mined. +5. **Диагностика слепа** (S14). +6. **Операторская ловушка:** «поздняя подпись бесплатна» верно **только** через `mined_delta`. Естественный + жест «навести порядок — переложить подписанное в `glossary_seed`» делает `Source:"seed"` ⇒ двигает + `baseVersion` ⇒ **$6 (вся драфт-волна) и `--resnapshot`**. + +**Разброс как сигнал.** `bankProposalsByKey` уже считает `Chunks` на рендер. Предлагаю печатать «слабое +предложение» (один чанк / тай-брейк алфавитом) **чисто как печатный признак**, никогда не влияющий ни на +выбор dst, ни на факт эмиссии — иначе это скрытый порог, запрещённый формулировкой владельца. + +--- + +## §6. B5 — тест-пин джойна + +**Рекомендация: вариант A — сквозной тест в новом `internal/pipeline/miningstop_join_test.go` с локальным +конструктором фикстуры** (прецедент: `repair_integration_test.go:30` построил свой `setupRepairProject` +вместо расширения общего). + +**Диагноз хуже, чем в D39.37 (S8): немая не строка 94, а весь диапазон `mining.go:40-102`.** Тест обязан +**впервые зажечь** этот диапазон — это может сделать только вариант A или B, но не «минимальный пин» C +(он зажигает мимо загрузчика конфига). + +**Тест — сквозной:** сырой вывод модели с блоком → persist `banknote_detail` → `bankProposalsByKey` → +`MineBank` → `DeltaYAML` → YAML карты. **Непустое пересечение обязательно.** $0 (локальный `httptest`-провайдер, +`runner_test.go:63-73`), детерминирован, `-race`-чист. + +**Мутационный чек-лист** (каждая обязана краснеть): пустая карта в колл-сайт · `props[0]` в пустую строку · +выключенный persist `banknote_detail` · сломанная нормализация ключа джойна · `status:auto` → `approved` · +выброс `appendProposalNote`. + +**Честно о слабом месте:** что майнер выдаст **именно** заданные термы на корпусе фикстуры, заземлено +транзитивно (`miner_test.go:311` требует того же на том же контрасте), но **не доведено до исполнительного +доказательства** — фикстура подбирается в фазе 2. Тест зависит от живых ин-репо данных +`configs/langpacks/zh/*`: правка `surnames-single.txt` может изменить типизацию кандидатов. + +**Ещё три незапиненных колл-сайта того же класса:** `waverun.go:316` (восстановление предложений на **резюме** — +опаснее среднего, потому что владелец подписывает на повторном прогоне) · `mining.go:68` (reject-сет) · +`chunkrun.go:130-136` (`trust_gate_detail`). + +**Порядок фазы 2 фиксирую явно:** сначала дефолт B1, потом фикстура B5 — иначе первая в истории фикстура +с настроенным майнингом пишется против отменяемой семантики. + +--- + +## §7. Адверсариальный селф-ревью + +Три линзы (author≠reviewer) опровергли **шесть** несущих клеймов моего дизайна. Все исправлены выше; +перечисляю, чтобы вес правок был виден, а не растворён в тексте. + +| # | что я утверждал | вердикт | что стало | +|---|---|---|---| +| 1 | B1: «Δ(книга) между режимами = $0» | **ОПРОВЕРГНУТ** | +$21…25 (поздняя подпись = вся редактура). Два раздела одного дизайна противоречили друг другу по несущей цифре. | +| 2 | «Одноразовая пере-оплата = $5.1–5.8, edit-волна не шевелится» | **ОПРОВЕРГНУТ** | ≈$30.7 (текст черновика фолдится в `contentHash` редактуры + `RenderFormatVersion` в общем payload). Занижено в 5.2×. | +| 3 | B2: «инвариант dst-из-контекста держится во всех вариантах» | **НЕТОЧЕН** | Понижен до «структурно держится, механизмом не обеспечен — обеспечен текстом промпта». Вынесен развилкой. | +| 4 | «Объём майнинга на книге НЕ ВЫВОДИМ» | **НЕТОЧЕН** | Измерен за $0: падение 62×, 51% запаса в первых 10%. Отказ мерить был необеспечен. | +| 5 | «Парный срез после фикса флора дал +47%» | **ОПРОВЕРГНУТ** | Числа «+47%» нет ни в одном отчёте; `pipeline.yaml` двух срезов **байт-идентичны**, различаются главы. Реальная разница +104% — дисперсия содержания. | +| 6 | Вилка книги «$26.10…$37.4» | **НЕТОЧЕН** | $30.7 центр, $19.7…$47.3 вилка (единый метод — по символам; «наивно по разделам» занижает на 17.8%). | + +**Плюс поправка политически важная:** планка COGS не была названа ни разу. После нормировки книга = +**57.7 ранобэ-эквивалентов**; ставка планки $7.52/1M токенов исходника, наш замер **$4.72/1M** ⇒ +**планка НЕ сломана, стек идёт на 63% плановой ставки.** Без этой строки соседство «$26–30» с заголовком +«~$0.85/ранобэ» читается как 35-кратный пробой. + +**Мои собственные слабые места, которые линзы НЕ закрыли:** +- **Цитатный слой дрейфует.** Один и тот же `emitRankCap` цитируется как `:31`, `:33`, `:35` в разных + разделах; `loadMinedRejects` — как `mining.go:125-144` и `mining.go:132-163`. Выводы верны, номера + надо нормализовать перед фазой 2 — владелец и исполнитель цитируют строки дословно. +- **Один клейм был ложен как факт:** «grep `canon-recovery` = 0» — греп даёт 1 (комментарий + `miner_substrate.go:24`). Вывод («метрики нет») верен, формулировка была неточна. +- **Фикстура B5 не доведена до исполнения** (признано в §6). + +--- + +## §8. Развилки владельца (сводка). Фаза 2 не начинается без 1–4 + +| # | развилка | почему блокирует | +|---|---|---| +| **1** | **Source-класс и скоуп базы для auto-строк** (S2). Вне базы ⇒ инертны, $0. В базе ⇒ инжектируются, но при `postcheck_gate=true` двигают **оба** хеша. Третьего варианта в коде нет. | Без ответа авто-режим не работает вовсе | +| **2** | **Форма B3**: буквальный перенос в `translator.md` (буква промта пака) или вариантный файл + `prompt_override` (моя рекомендация). Голый перенос **лендить нельзя** (S5). | Блокер безопасности | +| **3** | **durable-заморозка списка кандидатов** для B2(а). Без неё вариант снимается. | Определяет, какой дизайн строим | +| **4** | **«Принудительный пост-чек»** для Ambiguous (S13) конфликтует с ратифицированным external-review major #1. Цена изменения — отмена того решения. | Семантика владельца vs ратифицированный выбор | +| 5 | Имя флага: `--verify-bank` / `--stop-for-signature` | | +| 6 | Книжный пол `verify_bank: true` (покупает защиту от «забыл флаг» ценой половины формулировки «операторский режим») | | +| 7 | Поведение redrive при стопе: honor / forbid / honor+баннер | | +| 8 | Громкость отказа при невозможном майнинге | | +| 9 | Понижение инварианта «dst только из контекста» до «обеспечено текстом» — принять или отклонить (а)/(б) | | +| 10 | Цена поздней подписи: только вперёд / платить ≈$24 за пере-редактуру / копить подписи | | +| 11 | Микро-проба ≈$0.022 на **финальном** тексте промпта (цифры пробы относятся к другим байтам) | | + +**Плюс амендменты доков, которые я не имею права сделать сам:** research/20 §C2 («не мажоритарность» — +код мажоритарен, S10) и §B3 (артефакт кандидатов уехал в стор, S11); D39.36 п.3 (формулировка +«только CONFIRMED», S1); статус `auto+dst` — гибрид, которого нет в §C2-7. + +--- + +# ДОПОЛНЕНИЕ (тот же день, по замечанию владельца) + +Владелец указал на два пробела фазы 1: корпус доков по банку памяти не читан, и работа шла в режиме +«варианты», а не «решения». Оба справедливы. Ниже — исправление: §9 доктрина (что корпус УЖЕ +предлагает), §10 инженерные решения, §11 честный статус их готовности. + +## §9. Что корпус доков по банку памяти уже предлагает — и не построено + +Прочитаны целиком: `research/05-memory-glossary`, `13-memory-bank-validation`, `14-adaptive-memory`, +`architecture/06-memory-risk-registry`, `01-decisions` (Р-решения), `research/20` §B1/§B2/§C1/§C2/§C3/§E. + +**Д1 — `research/20` §C2 п.7 (строки 596–600) — ПРЯМОЙ ОТВЕТ НА P1, никем не построенный:** + +> «новые термы — `status: auto` (**без dst — инертны в автомате**) или `status: draft` +> (**с канон-предложением — инъекция ⟨проверить⟩**); алиасы — поверхностями терма» + +Эмиссия ратифицирована ДВУХРЕЖИМНОЙ. Авто-режим по доктрине — это **не** «ослабить trust-gate для +`auto`», а «эмитить `draft`, когда dst уже есть». `DeltaYAML` жёстко пишет `Status: "auto"` +(`miner_emit.go:192`) даже когда джойн D39.37 уже приджойнил dst — **draft-ветка эмиссии не построена**. +Механизм для неё живой и ратифицированный: D32 п.2 — «`status:draft` … `memory.go:419` draft→soft-inject». +⇒ Мой вывод фазы 1 «строить инъекцию не надо» подтверждается доктриной и уточняется: надо сменить +литерал статуса, а не трогать инъекцию. + +**Д2 — `research/14` §7 механизм **M2**, вердикт «ВНЕДРЯТЬ»:** + +> «Детерминированный консистентность-кэш + precision-gated adaptive-retrieval». Для auto/ambiguous БЕЗ +> approved — first-seen/majority-vote кэш рендеринга. **Арбитраж: кэш ПРЕДЛАГАЕТ → post-check ГЕЙТИТ → +> batch-судья/человек ПРОМОУТИТ в approved.** … → внедрять как **гигиену банка v2**. + +Это дословно тот авто-режим, который просит владелец, с прописанным контрактом арбитража и с явным +«abstention first-class» (воздержаться лучше, чем инъектить неуверенное). **В D-логе не ратифицирован +ни разу** (упомянут только M1 — и то как конфликт по few-shot, D-лог:258). Плюс §8 «Арбитраж кто +побеждает»: «серая зона … может **обогащать**, но каждая инъекция гейтится детерминированным +post-check; при конфликте побеждает precision-first фильтр». + +**Д3 — `06-memory-risk-registry` A2 (статус ❌ «спроектировать»)** — источник формулировки владельца: + +> «`AMBIGUOUS` (короткий/общий алиас, коллизия поверхности, `auto/draft`) → инъекция с явной пометкой +> «unverified — проверить» **+ принудительный post-check** … паттерн CRAG, но **каждая ветка наблюдаема**» + +⇒ «Принудительный пост-чек» — цитата из реестра, а не импровизация владельца, и реестр там же +говорит, что имеется в виду **наблюдаемость**, а не флагование. Развилка №4 фазы 1 этим снимается +(см. §10, P4). + +**Д4 — `06-memory-risk-registry` B1 (статус ❌)** — риск и смягчение для «закрепления auto-канона»: + +> Риск: «первый (наименее информированный) перевод имени лочится на 1000 глав». +> Смягчение: «**Append-only журнал ревизий рендеринга** (`src, old_dst, new_dst, editorial_ts`) +> **отдельной осью** от спойлер-окна; смена approved-рендеринга → подтверждение → **точечный +> ре-перевод по ключу** (ReTranslation-by-keyword)». + +⇒ Ответ на мою цифру «поздняя подпись = вся edit-волна ≈$24»: доктрина предлагает **точечный ремонт по +ключу**, а не пере-гон волны. Я в §5 написал «точечного ремонта главы нет» — верно про код, но он +спроектирован. Журнал `glossary_revisions` в сторе, кстати, **уже есть** (`store/glossary.go:167-170`). + +**Д5 — `01-decisions` Р7 + реестр G2 — «безлюдный режим»:** «auto→approved автоматом с записью в журнал, +но с явной пометкой качества». **Конфликтует с D39.36** («ничего неподписанного не становится +Confirmed»). Считаю Р7-формулировку superseded словами владельца; фиксирую как амендмент, а не решаю сам. + +**Д6 — `research/20` §C2 п.3 — ратифицированная формула консолидации dst,** которой нет в коде: + +> «скор dst-варианта = частота по всем чанкам × **конформность (Палладий-таблица B6** для name/place) × +> согласование с уже-approved соседями × полнота падежной леммы. Побеждает вариант, а НЕ первое +> вхождение — прямая реализация анти-LTCR-отравления. **Мажоритарность НИКОГДА не даёт approved: +> канон-предложение = draft.**» + +`bankProposalsByKey` сортирует по числу чанков — голая мажоритарность (S10). Формула для замены — вот она. + +**Д7 — поле `Confidence` уже есть в схеме** (`store/glossary.go:39`), реестр предписывает класть туда +приор («ruby — сид в auto-кандидатный пул **с приором `occurrences`**», уточнение 2). Майнер его не +заполняет; `rubyToCandidates` (единственный, кто заполняет) не вызывается (S9). Готовая механика +ранжирования непроверенных строк лежит неиспользованной. + +**Д8 — честная оговорка корпуса, которую обязан услышать владелец до включения авто-режима.** +`research/14`, слабое место №3: «Over-trust я мерил на **известном** имени … На **новом** термине без +прайора over-trust реален (2510.00829) — моё плечо это НЕ покрывает». Плюс `research/13` Q5 п.3: +«уверенность модели растёт при падении точности». ⇒ **Безопасность инъекции непроверенного +намайненного термина корпусом не измерена.** Это не аргумент против, это то, что должно быть сказано вслух. + +## §10. Инженерные решения + +### P1 — auto-терм не доезжает до провода + +**Решение: третья ось `lane` + durable-реестр кандидатов + forward-only окно.** + +Диагноз корня: сегодня в схеме ДВЕ оси (`Source` = провенанс, `Status` = доверие), а решений +принимается ТРИ. Третье — «чем защищено уже оплаченное от изменения этой строки» — принимается +`Source`-ом как прокси (`seeding.go:94` вырезает `Source=="mined"`), и именно эта грубость, а не +trust-gate, делает `mined+auto` инертной. Комментарий `miner_emit.go:177-180` называет неверную причину. + +**Теорема FOI (forward-only invariance)** — доказана разбором всех восьми путей, которыми новая строка +может дотянуться до `Selection.Injected` (`memory.go:404-505`), и **выдержала адверсариальную атаку**: +строка с `since_ch > c` байт-неспособна изменить инъекцию главы `c`, потому что `matchTrust` +(`memory.go:792-804`) пропускает спойлер-блокированных владельцев, а `suppressContained` +(`memory.go:835-838`) отказывает им в роли суппрессора. ⇒ `msgsContentHash` не двигается ⇒ **P3 не +срабатывает по построению**, а не по дисциплине. + +**Следствие B (бонус, верно УЖЕ СЕГОДНЯ без всякой новой оси):** `RenderEditorConstraintBlock` +**байт-инвариантен к любому числу ambiguous-строк**, потому что `priorityRank` (`memory.go:545-560`) +ставит бит `1<<2` на всё не-Confirmed ⇒ confirmed-префикс бюджета не двигается. Значит ослаблять +редактора не нужно **и вредно**: CONFIRMED-only — единственная бесплатная гарантия инвариантности +edit-волны. Ответ на «надо ли auto доезжать до редактора»: **нет, и это не дефект.** + +Схема: `lane ∈ {"", "fwd"}` — «" " = защищено фолдом (все сегодняшние строки), `fwd` = защищено окном». +Два предиката заменяют два литерала: +`VisibleToBase(r) = r.Lane == LaneForward || r.Source != SourceMined` (вместо `seeding.go:94`) и пропуск +`fwd`-строк в `ComputeVersionScoped`. При пустой оси обе формулы **тождественны текущим** ⇒ нулевой +сдвиг байт и хешей, golden не перезахватывается. + +Durable-реестр `bank_candidates` с write-once-инвариантами на уровне SQL (`ACTIVATE` — `UPDATE … WHERE +dst='' AND since_ch=0`), допуск через precision-gate (`votes ≥ 2`, ничья ⇒ **воздержаться**), reject +на загрузке применяется **ретированием вперёд** (`until_ch = frontier`), а не удалением — удаление +сменило бы байты оплаченных глав. + +### P2 — банкнота в шиппинг-промпт + +**Решение: убрать булев. Канал ВЫВОДИТСЯ из промпта (стадия «в канале» ⟺ её шаблон содержит +`bankSeparator`), срез делается БЕЗУСЛОВНО.** Один источник истины вместо двух; рассинхрон перестаёт +существовать как состояние, а не отлавливается проверкой. + +Побайтная проверка, которой я в фазе 1 не делал: опасение «безусловный `splitBanknote` обрежет хвостовой +пробел» **снято** — при `block==""` функция возвращает **`rawText`, а не `cleanText`** +(`banknote.go:191-192`, собственный комментарий «byte-identical path»), то есть `TrimRight` уже сегодня +отбрасывается на этом пути даже при включённом гейте. ⇒ безусловный срез байт-идентичен на любой книге +без сепаратора в выводе — а сепаратора сегодня нет ни в одном промпте, ни в одном конфиге, ни в golden. +Единственный случай расхождения байт — ровно тот, ради которого правка делается. + +### P3 — тихая пере-оплата мимо Р6 + +**Решение: одно определение вместо двух.** Предикат «эта единица пере-выполнится» существует в +`stagerun.go:86` (снапшот **И** contentHash), а `projectRebill` (`rebill.go:121`) вычисляет ту же +величину заново, читая только снапшот. Это не дыра в фиче — это **две реализации одной величины**. +Тот же файл уже описывает этот класс как повод к рефакторингу (`rebill.go:129-131`: «одно определение, +чтобы порог нельзя было посчитать от дрейфующей копии»). + +Проверено, что проекция **выполнима**: шаблон (`runner.go:282`), `Book`, `chunks` (`rebill.go:185` их +уже получает), инъекция — всё доступно в точке гейта. CPU: ≈7800 рендеров на книгу, sha256 по ≈60 МБ = +**60–120 мс**. $0 провайдеру. + +### P4 — «принудительный пост-чек» без наказания + +**Решение: конфликт иллюзорен — «принуждение» и «наказание» в коде физически разведены.** +Наказание = ровно две строки (`waverun.go:370`, `:477` — флагование при `CountConfirmedMisses > 0`). +Принуждение = запуск проверки (`:369`, `:476`), гейтится `isFinalWave`. External-review #1 возражает +против **первого**; владелец просит **второе**. Пересечения нет. + +Плюс находка, меняющая постановку: сегодня ambiguous **измеряется не на том проводе**. Редакторский +блок его не показывает (`memory.go:633`), но `Postcheck` идёт по полной выборке (`waverun.go:476`) ⇒ +«ambiguous-промах» на edit-волне — это запись, которую редактор **никогда не видел**. Живое +подтверждение в сьюте: `runner_memory_test.go:231-261` — терм `田中` (`status: draft`) утверждается в +`PostcheckDetail`, хотя отверг его **переводчик**, а на драфт-проводе не измеряется ничего. + +Решение: `Postcheck` становится CONFIRMED-only **по типу** (а не по дисциплине фильтра, который любой +новый колл-сайт может забыть), а рядом появляется отдельный $0-канал «показано → принято/не принято» +на **драфт**-проводе. Это же и есть «разброс как сигнал» из B4 — один механизм на две задачи. + +### P5 — покрытие и раунды + +**Корень раундов найден и он НЕ там, где я писал в фазе 1.** Не в `subsume`/`isFragment`, а в +`miner_alias.go:98-110`: пара (`家老`, `学堂家老`) даёт `containmentRest = 学堂`; пока `学堂` нет в сиде, +`compositional=false`, а `家老` — сидовый ⇒ **ident-ребро** ⇒ кластер касается сида ⇒ +`clusterTouches` (`miner_emit.go:134`) подавляет весь кластер. После подписи `学堂` ребро деградирует +в `weak/phrase_not_alias`, `学堂家老` остаётся синглтоном и эмитится. Прослежено по реальному +`guzhenren-seed-v2.yaml:696-698` и langpack-файлам, а не по памяти. + +⇒ Замыкание за один проход выполнимо офлайн и за $0: итерировать «эмитировали → добавили поверхности в +`seedSurfaces` → пере-майнили» до неподвижной точки. Плюс сущностный джойн (алиасы + контейнмент), +где контейнмент-dst идёт **уликой, а не значением** (`学堂` ⊂ `学堂家老`, но «школа» ≠ «старейшина школы»), +и единый формат провенанса `tm-prov/1` в сид-схеме и в reject-файле. + +## §11. Честный статус: ни одно решение НЕ готово к стройке в предъявленном виде + +Три адверсариальные линзы (реализуемость / контракт и общность / побочные и деньги) подтвердили +**инженерные ядра** — FOI, Следствие B, диагноз P3, диагноз P4, корень раундов P5 — и нашли, что +**сборка не проходит**. Перечисляю, потому что без этого §10 читается как «можно брать и строить». + +**Блокеры сборки и корректности:** +1. **P1 не компилируется:** `BankCandidate` объявлен в `membank`, а возвращается из `store`, при том что + `membank` импортирует `store` (`memory.go:27`), а обратной зависимости нет ⇒ импортный цикл. + Нужен третий пакет или перенос типа целиком в `store` — это меняет все семь предложенных сигнатур. +2. **P1 нарушает детерминизм:** шаги допуска обходят `bankProposalsByKey` (`banknote.go:242`) и + `LaneAdmissionConflicts` через `range` по карте. Внутренние списки отсортированы, **ключи — нет** ⇒ + порядок активаций и текст карты подписи зависят от рандомизации хеш-таблицы Go. Golden это **не + поймает** (реестр на нём пуст). Нужна явная `sortedKeys`. +3. **P1 `SkipFold` вынимает `fwd`-строки из фолда ДАЖЕ при `gateOn`** — ровно из той ветки, что + построена против тихого флипа вердикта по `decl` (`memory.go:314-318`, self-review #4). А + рекомендованный дефолт «`lane: fwd` для подписанной approved-строки в owner-YAML», где write-once + замков нет, возвращает и тихий флип, и тихую пере-оплату, как только фронтир перешагнёт `since_ch`. + FOI доказывает инвариантность **байт**, а не **вердиктов**, и только в момент активации. +4. **P1 `advanceBankLane` не имеет доступа к `seed ∪ ruby ∪ minedDelta`** — все три локальны внутри + `seedGlossary`. Либо пере-исполнять его на каждой границе сегмента (а там фатальные проверки + `MinedDeltaSeedCollisions`/`ApprovedSharedKeyCollisions` посреди оплаченного прогона), либо менять + владение состоянием. +5. **P1 `AssertForwardOnly` в объявленной сигнатуре не выражает свой контракт** и будет падать на + каждом здоровом сегменте начиная со второго. +6. **P3 неверно моделирует `sanitizer_stripped`:** движок считает его **не-ok** (`resume.go:54`, + `export.go:316`, `waverun.go:320-325`) и выбрасывает члена из edit-юнита, а проекция несёт текст + вперёд ⇒ ложная пере-оплата на здоровой книге. +7. **P2 и P5 взаимоисключающи:** P2 ретирует `Gates.Banknote.Enabled`, на который P5.2 явно опирается. + Заявленный P5 порядок («сначала P2») делает P5.2 несобираемым. +8. **P2 определяет «стадия в канале» через `System+FewShot+User`,** а `tpl.System` уже содержит + few-shot-блок при `few_shot=ON` (`runner.go:281-282`) ⇒ стадия с инструкцией только в `---FEWSHOT---` + при выключенном few-shot получит канал ON, хотя модель инструкции не видела. +9. **P5 замораживает `bank_ask` на ВСЮ книгу одним вызовом** (`waverun.go:103`) ⇒ заявки для ≈4568 + чанков вмораживаются по начальному сиду, и ни одна подпись владельца никогда до них не доедет. + +**Организационное:** P1, P4 и P5 независимо резервируют один слот миграции. **Проверено мной +исполнением: `len(migrations) == 11`, следующий слот — `v12`** (линза денег утверждала `v10`/`v11` — +ошибка, D39.37 прав). + +**Деньги:** P2 занижает главную статью своей сметы примерно вдвое — `banknoteSnap` свёрнут в **ОБЩИЙ** +payload обеих волн (`snapshot.go:406/434`), тогда как соседний `repair` свёрнут по-волново +(`snapshot.go:229`). P5 в том же пакете считает это верно ⇒ **пак несёт два ценника на одно действие** +($12.6 против $26–31), и вывод «включать сегодня, пока $0» принят по неверной цифре. + +**Наблюдаемость:** P1 — единственное решение, вводящее крупное durable-состояние **без единой строки в +`tmctl status`/`report`**, ровно в том авто-режиме, ради которого пак существует. + +**Доктринальная поправка, без которой P1 незаконен:** README-инвариант №2 («всё, что влияет на +wire-байты, свёрнуто в `snapshotID`») пришлось бы уточнить до «всё, что может изменить байты **уже +оплаченной** единицы». Это правка ратифицированного инварианта — **решение владельца, не сессии.**