textmachine/docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md

76 KiB
Raw Permalink Blame History

ПАК-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 — пере-считать бюджет. Вердикт «P1P5 в предъявленном виде не строятся» ПОДТВЕРЖДЁН.

Эхо-блок

СКОУП: только ФАЗА 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 интеграционные точки 18 построены и местами строже спеки: срез до 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+3400U+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, и строки 40102 не исполняются ни разу за всю сьюту. Исполнительное доказательство: 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 и ApprovedSharedKeyCollisionsapproved-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 (развилки 14), плюс расхождение §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вся редактура заново, ≈$2125 на книге. Это и есть единственный денежный аргумент ЗА флаг, и он был вычеркнут в одном разделе, пока другой его считал. Итог: механика флага $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) + сайдкар обязательны.

Владельцу (развилки 58): имя флага · нужен ли книжный пол O2 (защита от «забыл флаг» ценой отказа от половины формулировки «операторский режим») · поведение redrive (honor / forbid / honor+баннер) · громкость отказа при невозможном майнинге.


§3. B2 — покрытие WHAT→WHICH (ядро пака)

3.1. ДИАГНОЗ (пере-мерен тремя способами, до всякого дизайна)

Замер, который реально существует: minirun-verify2/run-01-draft.log:13terms=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 ≥ 512 из 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 секциям: разделы 1228 → 128 774 новых кандидата; 229456 → 46 939; 18252052 → 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⟧
и под ней — таблицу НОВЫХ имён собственных и терминов этого фрагмента, которых НЕТ в приложенном глоссарии.
Формат строки: исходный_термин<TAB>предлагаемый_перевод<TAB>тип
Тип — одно из: 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.15.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_detailbankProposalsByKeyMineBankDeltaYAML → YAML карты. Непустое пересечение обязательно. $0 (локальный httptest-провайдер, runner_test.go:63-73), детерминирован, -race-чист.

Мутационный чек-лист (каждая обязана краснеть): пустая карта в колл-сайт · props[0] в пустую строку · выключенный persist banknote_detail · сломанная нормализация ключа джойна · status:autoapproved · выброс 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.15.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% плановой ставки. Без этой строки соседство «$2630» с заголовком «~$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 не начинается без 14

# развилка почему блокирует
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 (строки 596600) — ПРЯМОЙ ОТВЕТ НА 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:draftmemory.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 (ACTIVATEUPDATE … 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 МБ = 60120 мс. $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 против $2631), и вывод «включать сегодня, пока $0» принят по неверной цифре.

Наблюдаемость: P1 — единственное решение, вводящее крупное durable-состояние без единой строки в tmctl status/report, ровно в том авто-режиме, ради которого пак существует.

Доктринальная поправка, без которой P1 незаконен: README-инвариант №2 («всё, что влияет на wire-байты, свёрнуто в snapshotID») пришлось бы уточнить до «всё, что может изменить байты уже оплаченной единицы». Это правка ратифицированного инварианта — решение владельца, не сессии.