76 KiB
ПАК-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 — обе строки обязаны стоять рядом.
Риски (все грунтованы):
- Молчаливая регрессия дефолта. Смена stop→auto не делает красным ничего (S8). Обязателен тест до правки — тот же класс, что находка рубежа-2 D39.37.
- Экзит-код 3 тихо исчезает из обычного прогона. Скрипты
if [ $? -eq 3 ]перестанут срабатывать молча. - Redrive: стоп после деструктивного ресета и без вывода (S17).
- Redrive оценивает майнинг по всей книге — подписной раунд может вытеснить точечную переатаку.
- Draft-only пайплайн теряет результат (S16).
- Таблица может быть огромной:
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 |
Рекомендация — (в) с жёсткой очерёдностью, но с одним честным понижением:
- (г) — безусловно и немедленно. $0, не двигает ни одного хеша, покрытие замерено, применим
независимо от судьбы B3. Норма D39.24 ($0-решения первыми) не оставляет выбора. Обратная секция
немедленно снимает жалобу «на стопе почти голые термины»: 66 из 67 предложений банкноты уже оплачены
и лежат в
banknote_detail— их просто никто не показывает. Но потолок (г) арифметически ~10%: несущая причина — разъезд классов, а не строк. Продавать (г) как решение B2 нельзя. - (а) — основной канал, N≤12. Единственный вариант, бьющий по несущей причине: отнимает у модели
право самой решать, что достойно строки банкноты, и оставляет ей ратифицированную роль — WHAT из контекста.
Почти бесплатен рекуррентно (перераспределяет уже оплаченный бюджет: 2 блока из 9 упёрлись ровно в 12 строк,
потратив их на
无/少年/三成/六块/雨声/停息/乏闷). - (б) — страховка на остатке, только под флагом. В деньгах бесплатен, в структуре дорог.
ЧЕСТНОЕ ПОНИЖЕНИЕ ИНВАРИАНТА (находка контрактной линзы, принимаю). Ратифицированный механизм 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⟧
и под ней — таблицу НОВЫХ имён собственных и терминов этого фрагмента, которых НЕТ в приложенном глоссарии.
Формат строки: исходный_термин<TAB>предлагаемый_перевод<TAB>тип
Тип — одно из: name, place, title, term, nickname.
Не более 12 строк. Если новых терминов нет — не добавляй ни разделитель, ни таблицу.
Разделитель и таблица идут ПОСЛЕ перевода и никогда внутри него.
Рекомендация: вариант C — отдельный prompts/zh-ru/translator-banknote.md + prompt_override, НЕ буквальный
перенос в translator.md. Это отклонение от буквы промта пака (он говорит «перенос в translator.md»),
поэтому выношу развилкой, а не исполняю тихо.
Три причины:
- БЕЗОПАСНОСТЬ (блокер S5). Голый перенос лендить нельзя: при выключенном гейте срез не выполняется,
а гейт выключен во всех пяти конфигах ⇒ таблица
⟦TM-BANK-v1⟧уедет в экспорт. В варианте C класс невозможен: файл с инструкцией видит только конфиг, который ставит гейт. Условной вставки на уровне шаблона не существует и не может появиться без Go (S6). - ДЕНЬГИ. C — единственный вариант, где книги без канала платят $0 (
translator.mdбайт-в-байт прежний). - МОМЕНТ — сильнее, чем D39.35. Стенд мини-прогона уже мёртв на HEAD: снапшоты в БД несут
style_check_version = cheapgate-v4-…, HEAD даётv5(checks/cheapgates.go:94, бамп вad3633a26.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 не инжектирует ничего.
Риски, названные прямо:
- ТИХАЯ ПЕРЕ-ОПЛАТА — самый опасный класс пака. При живом
postcheck_gate=falseauto-строки не двигают ни один снапшот (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 обходится молча. - Ловушка самоисключения: auto-строки в
glossaryстановятсяseedSurfacesдляMineBank(miner_emit.go:59-65→:129) ⇒ дельта пустеет ⇒ флаговый стоп тихо перестаёт срабатывать. Обязательна фильтрация наmining.go:57. - Reject воскресает: накопительный авто-файл сохранит терм, отклонённый позже;
loadMinedRejectsприменяется только на эмиссии (miner_emit.go:143). Инвариант «reject-set работает в обоих режимах» сегодня для авто-режима не держится — нужен второй пункт применения (на загрузке). - Коллизия ключей: auto-строка и подписанная на тот же src ломают
UNIQUE(book_id,src,sense,since_ch,until_ch)и валятReplaceGlossaryпосреди прогона; существующий guard знает только пару seed↔mined. - Диагностика слепа (S14).
- Операторская ловушка: «поздняя подпись бесплатна» верно только через
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 читается как «можно брать и строить».
Блокеры сборки и корректности:
- P1 не компилируется:
BankCandidateобъявлен вmembank, а возвращается изstore, при том чтоmembankимпортируетstore(memory.go:27), а обратной зависимости нет ⇒ импортный цикл. Нужен третий пакет или перенос типа целиком вstore— это меняет все семь предложенных сигнатур. - P1 нарушает детерминизм: шаги допуска обходят
bankProposalsByKey(banknote.go:242) иLaneAdmissionConflictsчерезrangeпо карте. Внутренние списки отсортированы, ключи — нет ⇒ порядок активаций и текст карты подписи зависят от рандомизации хеш-таблицы Go. Golden это не поймает (реестр на нём пуст). Нужна явнаяsortedKeys. - P1
SkipFoldвынимаетfwd-строки из фолда ДАЖЕ приgateOn— ровно из той ветки, что построена против тихого флипа вердикта поdecl(memory.go:314-318, self-review #4). А рекомендованный дефолт «lane: fwdдля подписанной approved-строки в owner-YAML», где write-once замков нет, возвращает и тихий флип, и тихую пере-оплату, как только фронтир перешагнётsince_ch. FOI доказывает инвариантность байт, а не вердиктов, и только в момент активации. - P1
advanceBankLaneне имеет доступа кseed ∪ ruby ∪ minedDelta— все три локальны внутриseedGlossary. Либо пере-исполнять его на каждой границе сегмента (а там фатальные проверкиMinedDeltaSeedCollisions/ApprovedSharedKeyCollisionsпосреди оплаченного прогона), либо менять владение состоянием. - P1
AssertForwardOnlyв объявленной сигнатуре не выражает свой контракт и будет падать на каждом здоровом сегменте начиная со второго. - P3 неверно моделирует
sanitizer_stripped: движок считает его не-ok (resume.go:54,export.go:316,waverun.go:320-325) и выбрасывает члена из edit-юнита, а проекция несёт текст вперёд ⇒ ложная пере-оплата на здоровой книге. - P2 и P5 взаимоисключающи: P2 ретирует
Gates.Banknote.Enabled, на который P5.2 явно опирается. Заявленный P5 порядок («сначала P2») делает P5.2 несобираемым. - P2 определяет «стадия в канале» через
System+FewShot+User, аtpl.Systemуже содержит few-shot-блок приfew_shot=ON(runner.go:281-282) ⇒ стадия с инструкцией только в---FEWSHOT---при выключенном few-shot получит канал ON, хотя модель инструкции не видела. - 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») пришлось бы уточнить до «всё, что может изменить байты уже
оплаченной единицы». Это правка ратифицированного инварианта — решение владельца, не сессии.