Accept pack twenty phase one as D39.41 with adversarial verification review header, thirty-nine confirmed and seven partial verdicts
This commit is contained in:
parent
b3f3a4d935
commit
0d07b1bcb7
3 changed files with 645 additions and 1 deletions
File diff suppressed because one or more lines are too long
|
|
@ -1074,3 +1074,9 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу
|
|||
**Мини-прогон — по норме D39.33 (именованные вопросы):** покрытие WHAT→WHICH живьём при непустом пересечении (обязательство D39.37) · оба режима флага (стоп с таблицей / auto→Ambiguous от начала до конца) · срабатывания голос-флаггера пака-19 · эхо-метрика на живом эхо. Ограничение: `dialogue_dash` на 蛊真人 загрязнён подгонкой (D39.37 п.4) — его цифры мини-прогона аргументом не считаются. Скан остатка пойдёт по линейкам с ИЗВЕСТНЫМИ слепыми зонами (D39.39) — приемлемо: зоны документированы, чтение «тишина ≠ чисто» уже в силе.
|
||||
|
||||
**Пак-21 «чекеры» (вход зафиксирован):** 12 дефектов D39.39 с file:line + переезд `translitInterjections` из Go в данные цели (улов владельца 26.07: захардкоженный словарь в `cheapgates.go:367` против нормы §0) + починки по ответам владельца на Р1–Р4 (дизайн пака пишется ПОСЛЕ этих ответов). Приёмка = ре-ран против размеченного набора пакета-6: recall вверх, precision не ниже текущей, `metrics.json` — сравнение с базлайном D39.39.
|
||||
|
||||
## D39.41 — Пак-20 ФАЗА 1 ПРИНЯТА: синк вскрыл 18 расхождений «доктрина↔код» и 4 структурных тупика; корпус доков УЖЕ содержит непостроенные ратифицированные ответы (двухрежимная эмиссия §C2-7 · M2 · журнал ревизий); вердикт сессии «P1–P5 в предъявленном виде не строятся» подтверждён верификацией 39 CONFIRMED / 7 PARTIAL / 0 REFUTED (26.07, оркестратор №8). ✅
|
||||
|
||||
**Приёмка исполнением (7 верификаторов, 46 клеймов, $0):** все несущие S-строки синка подтверждены кодом и исполнением (S1 — тест `TestRenderGlossaryBlock` PASS на `status:auto` + ⟨проверить⟩; S2 — вырез `Source:mined` из baseMemory + confirmed-only редактор = инертность на обоих проводах; S5 — срез банкноты не выполняется при выключенном гейте, ключа нет ни в одном конфиге; S8 — `contrast_path` не задан ни в одном тесте, тело майнинг-стопа `mining.go:40-102` не исполняется ни разу за сьюту, доказано подсчётом логов с позитивным контролем). Доктринальные цитаты Д1–Д8 сверены с первоисточниками; деньги пересчитаны из БД стенда тремя способами (verify $0.0161 / verify2 $0.0328, +104%); теорема FOI и Следствие B выдержали атаку (девятый путь не найден). PARTIAL-поправки — в ревью-шапке отчёта `docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md`; весомые: цитата-парафраз в Д5 (овер-атрибуция), блокер 7 не грунтован текстом, посылка блокера 3 не предъявлена в отчёте. **Новая находка приёмки: бюджет банкноты `bankTokenBudget=144` по честной формуле движка впритык/отрицателен (худший блок пробы 142.6/147.2 est-токенов) — фазе 2 пере-считать.**
|
||||
|
||||
**Статус: фаза 2 НЕ стартует** до решений владельца по блокирующим развилкам (следующий D-блок). Ключевое уточнение семантики от владельца (26.07, дословно по смыслу): флаг = ОПЦИОНАЛЬНАЯ ПОДПИСЬ — «можно запустить перевод так, чтоб сессия не останавливалась и не запрашивала верификацию банка, а просто как намайнит и закончит — шла в редактуру». Семантика D39.36 не пересматривается; сложность пака — не в стопе, а в том, ЧТО едет в провод, когда подпись пропущена (у большинства намайненных терминов нет dst — разъезд каналов 3% по построению; путь записи не существует; строки в проводе двигают хеши оплаченного).
|
||||
|
|
|
|||
638
docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md
Normal file
638
docs/archive/reports/PACK20_BANK_DESIGN_2026-07-26.md
Normal file
|
|
@ -0,0 +1,638 @@
|
|||
# ПАК-20, ФАЗА 1 — дизайн «банк: флаговый стоп + покрытие WHAT→WHICH»
|
||||
|
||||
**Сессия бэкенда, 2026-07-26.** Исполнение `docs/BACKEND_PACK20_BANK_TRUST_SESSION_PROMPT.md` (санкция D39.38).
|
||||
**Кода не трогал** — дерево чисто (`git status --porcelain` пуст до и после). Сессия не коммитит.
|
||||
**СТОП НА РАТИФИКАЦИЮ** — ниже 11 развилок владельца, из них 4 блокирующие фазу 2.
|
||||
|
||||
**Аддендумы:** подтверждаю получение — релеем на 26.07 доехало только тело промта; иных аддендумов не поступало.
|
||||
|
||||
> **Ревью-шапка (оркестратор №8, 26.07): ФАЗА 1 ПРИНЯТА, D39.41.** Адверсариальная верификация
|
||||
> исполнением (7 параллельных верификаторов, 46 несущих клеймов): **39 CONFIRMED · 7 PARTIAL · 0 REFUTED**.
|
||||
> PARTIAL-поправки: (1) полей снапшот-payload **20**, не 21 (суть S18 верна); (2) «ничего неподписанного
|
||||
> не становится Confirmed» подано в кавычках как цитата D39.36 — такой фразы в D-логе НЕТ, это парафраз
|
||||
> (овер-атрибуция; доктринальный смысл верен: D-лог:1030,1049); (3) «+104% при байт-идентичном конфиге» —
|
||||
> суммы подтверждены тремя независимыми пересчётами, но `mined-delta`/`mined-rejects` двух срезов
|
||||
> РАЗЛИЧАЮТСЯ — сужать до «pipeline+prompts+seed идентичны»; (4) **блокер 7 (P2⊥P5) не грунтован текстом
|
||||
> отчёта** — «P5.2» нигде в документе не определён; (5) **посылка блокера 3 («дефолт lane:fwd на
|
||||
> approved-строке») в отчёте отсутствует** — механика опасности подтверждена кодом, но атакуемая
|
||||
> рекомендация не предъявлена; (6) в иллюстративном списке 12-строчного блока 少年 не из того блока
|
||||
> (2/9=22% верно); (7) «максимальный блок пробы 116.7 est-токенов» невоспроизводим — честная формула
|
||||
> движка (TokenClassCounts × zh-ru фертильности) даёт **142.6 без сепаратора / 147.2 с ним** против
|
||||
> бюджета 144 ⇒ **«хватает с запасом» не обеспечено расчётом** (практикой не пробито: truncated=0);
|
||||
> фазе 2 — пере-считать бюджет. Вердикт «P1–P5 в предъявленном виде не строятся» ПОДТВЕРЖДЁН.
|
||||
|
||||
## Эхо-блок
|
||||
|
||||
```
|
||||
СКОУП: только ФАЗА 1 — дизайн. Шаг 0 (синк источник↔код↔вердикт) + B1 форма флага ·
|
||||
B2 покрытие WHAT→WHICH (ядро, со сметой) · B3 банкнота в shipping-промпт ·
|
||||
B4 авто-режим на книге · B5 тест-пин джойна. Выход — этот отчёт → СТОП.
|
||||
ИНВАРИАНТЫ: флаг бинарный, операторский, НЕ ось wire/снапшота · dst только из контекста
|
||||
(exp16/D39.10) · ничего неподписанного ≠ Confirmed · провенанс + reject-set в обоих
|
||||
режимах · общность движка (новая пара без правки Go) · расхождение = пинг, не интерпретация.
|
||||
НЕ ДЕЛАТЬ: код фазы 2 · D21 · судья · веб-фетч · L3 · авто-подпись порогом · платные прогоны ·
|
||||
книжный канон в код/D-лог · коммиты.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## §0. Как эта работа сделана и чего её числа НЕ доказывают
|
||||
|
||||
Норму D39.37 («пере-мерь свой вывод ДРУГИМ способом, чем получил») я исполнял механически, а не декларативно:
|
||||
каждая несущая ось прочитана **дважды независимо** — один проход по коду, второй по сырью прогонов
|
||||
(`immutable`-SQL к БД в `/home/ubuntu/books/gu-zhenren/`) или по артефактам полигона. Затем весь дизайн прошёл
|
||||
**три адверсариальные линзы** (author≠reviewer): соответствие коду · контракт и семантика владельца ·
|
||||
деньги и измеримость. Линзы опровергли **шесть** несущих клеймов моего же дизайна — они исправлены ниже,
|
||||
а не спрятаны (см. §7).
|
||||
|
||||
**Чего эти числа НЕ доказывают** (дисциплина, ратифицированная D39.37 п.3):
|
||||
|
||||
- **Смета книги ($30.7 центр, вилка $19.7…$47.3) держится на n=3 срезах по 14 главам одной книги.**
|
||||
Разброс между двумя соседними двухглавыми срезами одной книги при **байт-идентичном конфиге** — **+104%**
|
||||
(`verify` $0.016091 против `verify2` $0.032764, мой SQL). Это дисперсия содержания, а не конфига.
|
||||
Любая цифра «на книгу» ниже — порядок величины, не оценка.
|
||||
- **Покрытие вариантов (а)/(б) НЕ ИЗМЕРЕНО.** Замерено только сегодняшнее: **0 из 2** на единственном прогоне,
|
||||
где включены оба канала. Все проценты будущего покрытия — оценки; способ проверить их за $0 назван в B2.
|
||||
- **Качество доставленного dst измерить нечем.** `canon-recovery` в бэкенде не существует
|
||||
(единственное совпадение грепа — комментарий `miner_substrate.go:24`). Любой вариант доставки dst
|
||||
вводится **вслепую** относительно ратифицированного порога ≥70%.
|
||||
- **Насыщение майнинга я измерил ($0), но ДРУГИМ детектором,** чем майнер (кривая первого появления
|
||||
Han-биграмм/триграмм с книжной частотой ≥5 — тот же пол, что `emitMinFreq`). Это прокси, не реплей `MineBank`.
|
||||
|
||||
---
|
||||
|
||||
## §1. ШАГ 0 — СИНК: источник ↔ код ↔ вердикт
|
||||
|
||||
Полная таблица — 138 строк по 6 осям; здесь **расхождения и не-построенное** (совпадения перечислены сводкой).
|
||||
Каждая строка проверена исполнением или чтением по `file:line`.
|
||||
|
||||
### 1.1. Совпадает (сводкой, без разворота)
|
||||
|
||||
`research/20 §B3` интеграционные точки 1–8 построены и местами строже спеки: срез до `classifyOutput`
|
||||
(`stagerun.go:588→591`), coverage/echo по очищенному тексту, `+144` токена к `max_tokens` только для
|
||||
роли translator при включённом гейте (`stagerun.go:112-113`), derived-чекпоинт и ре-поинт `final_hash`
|
||||
на OK-пути (`stagerun.go:215-221`), резюм пере-доказывает срез из сырого чекпоинта за $0
|
||||
(`stagerun.go:397`). Майнер **никогда не пишет `approved`** — литерал `"auto"` (`miner_emit.go:193`),
|
||||
инвариант держится. Майнер пар-агностичен: все языковые данные приходят пакетом `*lang.Pack`,
|
||||
ru-стороны в нём физически нет (`mining.go:54` кладёт только `NSource`). Палладий-подканал
|
||||
**выключен** в default-B (`miner.go:52`) — со-встречаемость в коде отсутствует, запрет exp16 на HEAD
|
||||
структурно соблюдён.
|
||||
|
||||
### 1.2. Расходится / не построено
|
||||
|
||||
| # | Источник | Код | Вердикт | Суть |
|
||||
|---|---|---|---|---|
|
||||
| S1 | D39.36: «сегодня в инъекцию идёт ТОЛЬКО CONFIRMED» | `memory.go:570-575` | **расходится** | Неверно для блока **переводчика**: `RenderGlossaryBlock` рендерит не-Confirmed, приписывая `tx.UnverifiedMarker` («⟨проверить⟩»). CONFIRMED-only — свойство **только** редакторского блока (`memory.go:633`). Проверено исполнением: `go test ./internal/membank/ -run TestRenderGlossaryBlock` PASS на ассерте `小D → Малыш Дэ ⟨проверить⟩` для `status:"auto"`. |
|
||||
| S2 | Семантика владельца: «auto → инжектируются как Ambiguous» | `seeding.go:94` + `memory.go:633` | **не построено, СТРУКТУРНЫЙ ТУПИК** | Драфт-волна селектит над `baseMemory`, откуда `Source:"mined"` **вырезан целиком**; редактор видит строку, но его блок confirmed-only. ⇒ `mined`+`auto` инертна на **обоих** проводах. Авто-режим не сводится к «убрать `return stopped`». **Развилка №1.** |
|
||||
| S3 | Семантика владельца: «предложения входят в банк как auto» | `mining.go:36-104` | **не построено** | `runBankMiningStop` только **читает** стор и пишет YAML. Ни одной строки в `glossary` он не добавляет. Пути записи не существует. |
|
||||
| S4 | Семантика владельца: «стоп **с таблицей** (src · dst · частота · разброс · улики)» | `cmd/tmctl/render.go:79-84` | **расходится** | CLI печатает 6 строк: число термов + путь к файлу. Таблицы нет. `Term.Freq` вычислен (`miner_emit.go:42`), но **в артефакт не попадает**; KWIC и счётчики пола не строятся. «Разброс» доступен только как число чанков на вариант. |
|
||||
| S5 | ПАК-20 B3: «перенос блока в `translator.md`» | `banknote.go:187` + `grep banknote: configs/` = 0 | **БЛОКЕР** | При `Gates.Banknote.Enabled=false` `applyBanknote` возвращает **сырой текст, не заходя в `splitBanknote`**. Ключа `banknote:` нет ни в одном шиппинг-конфиге. ⇒ буквальное исполнение B3 даст неотрезанную таблицу `⟦TM-BANK-v1⟧` в черновике → редакторе → **экспорте**; санитайзер не перехватит (он `isFinal`-only, `chunkrun.go:51`). **Развилка №2.** |
|
||||
| S6 | ПАК-20 B2(а): кандидаты майнера в промпт | `render.go:176` | **не построено, и через промпт невозможно** | Набор плейсхолдеров **закрыт**; неизвестный `{{…}}` — жёсткая ошибка рендера. `{{mining_candidates}}` без правки Go не заводится. Единственный законный шов — code-assembled инъекционное system-сообщение (`render.go:220-225`). |
|
||||
| S7 | Гардрейл общности (владелец 24.07) | `banknote.go:92-99,143` | **расходится** | `hasBankSrcHan` вызывается **безусловно**, диапазон U+3400–U+9FFF зашит в Go; пар-гейта в `banknote.go` нет (grep по `SourceLang`/`LangPair` пуст). На en — все строки `bad++`; на ja — кандзи пройдут случайно, чисто-кановые имена (ровно целевой класс) отбросятся **молча**: `ParseFail` уходит только в телеметрию, в `FlagReason` не участвует. Ответ на контрольный вопрос: **нет, без правки Go не заработает.** **Развилка №3.** |
|
||||
| S8 | D39.37 фикс-лист №1: «мутация джойна выживает сьюту» | `mining.go:37` | **хуже, чем записано** | Диагноз неполон. `grep -rn contrast_path --include=*_test.go --include=*.yaml internal/` = **0** ⇒ гард `mining.go:37` всегда возвращает `false` на `:38`, и строки **40–102 не исполняются ни разу за всю сьюту**. Исполнительное доказательство: `go test ./internal/pipeline/ ./internal/miner/ -v \| grep -ci "bank-mining"` = 0 при зелёном прогоне, при позитивном контроле (логи того же логгера в вывод попадают). **Немая не строка 94, а весь диапазон.** |
|
||||
| S9 | `memseed.go:20-24` (замысел «auto/draft churn») | `memseed.go:283` | **не построено** | `rubyToCandidates` — единственный автогенератор `status:auto` — **не вызывается нигде**, кроме своего теста. D8-обоснование опирается на путь, которого в проде нет. |
|
||||
| S10 | research/20 §C2: «канон по ВСЕМ вхождениям × Палладий-конформность, НЕ мажоритарность» | `banknote.go:242-281` | **расходится** | `bankProposalsByKey` сортирует по числу чанков и `DeltaYAML` берёт `props[0]` — это **ровно мажоритарность**. Палладий-конформности в джойне нет. Смягчение: альтернативы едут в `note` с числами, и `status:auto` не даёт им стать каноном без подписи. |
|
||||
| S11 | research/20 §B3 (артефакт кандидатов) | `chunkrun.go:112` | **расходится** | Кандидаты пишутся **в стор** (`retrieval_state.banknote_detail`), а не в отдельный evidence-файл, как требует §B3. Расхождение осознанное (джойн D39.37 читает стор), но спека не амендирована. |
|
||||
| S12 | §B3 п.1 «первый рубеж — `banknote_parse_fail` до редактуры» | `banknote.go:192` | **не построено** | Именно тот случай, ради которого п.1 писался («модель написала "Примечание:" вместо разделителя»), не покрыт: без сепаратора парсер не вызывается и `ParseFail` остаётся `false`. |
|
||||
| S13 | `mempostcheck.go` / слова владельца «принудительный пост-чек» | `waverun.go:365` | **расходится** | В штатном двухстадийном пайплайне `isFinalWave` для драфт-волны = `false` ⇒ пост-чек над выходом **переводчика не запускается вообще**. Ambiguous-промах — наблюдаемость в JSON-детали, в счётчик не входит **по ратифицированному основанию** (`mempostcheck.go:45-48`, external-review major #1: обратное «наказывало бы модель, верно отвергшую непроверенное предложение»). Формулировка владельца конфликтует с этим решением. **Развилка №4.** |
|
||||
| S14 | Диагностика при непроверенном dst | `memory.go:953`, `memseed.go:173` | **расходится** | `InjectivityCollisions` и `ApprovedSharedKeyCollisions` — **approved-only**. Пара «approved 族长→глава клана» + «auto 族长→старейшина» не будет поймана, а в `Select` оба попадут в `matchedVia` ⇒ модель получит **две противоречивые строки на одну поверхность**. Самый вероятный источник тихой деградации авто-режима. |
|
||||
| S15 | `memseed.go:146` (текст fail-loud) | `memseed.go:133` | **расходится** | Проверка полисемии D16.1 итерирует весь набор без фильтра по статусу ⇒ лекарство, предлагаемое её же сообщением («mark one `status: auto`»), проблему **не снимает**. Для пака-20 это ограничение: auto-строки проходят те же fail-loud, что approved. |
|
||||
| S16 | `waverun.go:79-84` («STOPS before the edit wave») | `waverun.go:126` против `:135` | **расходится** | Стоп стоит **выше** ветки draft-only ⇒ срабатывает и в пайплайне без редактора, где волны, «перед которой» он останавливается, не существует. Собранный `BookResult` при этом теряется. |
|
||||
| S17 | ПАК-20 B1 «как ложится на translate/redrive» | `main.go:114`, `:218-221` | **расходится** | На стопе `translate` возвращает `err` **до** `renderTranslate` ⇒ оператор не видит ни строки по уже оплаченной драфт-волне. В `redrive` баннер стопа не печатается вовсе, при том что деструктивный ресет (`status.go:713-717`) уже выполнен. |
|
||||
| S18 | ПАК-20: «флаг — операторский режим, не ось снапшота» | `snapshot.go:370-437` | **совпадает (доказано)** | В payload входят 21 поле; ни `Mining.ContrastPath`, ни какой-либо режим стопа туда не входят (grep = 0). `Book`-поле тоже невидимо снапшоту — `book.go:256-291` «FROZEN LAYOUT», единственное касание `snapshot.go:413`. Оба места нового флага доказуемо вне хешей. |
|
||||
|
||||
**Открытые вопросы синка, требующие решения оркестратора/владельца, а не сессии:** S2, S5, S7, S13
|
||||
(развилки 1–4), плюс расхождение §C2-спеки с построенным (S10, S11) — амендировать research/20 или код.
|
||||
|
||||
---
|
||||
|
||||
## §2. B1 — форма флага
|
||||
|
||||
**Рекомендация: `--verify-bank`, CLI-only bool на `translate` + `redrive`.**
|
||||
|
||||
| | вариант | цена механики | вердикт |
|
||||
|---|---|---|---|
|
||||
| O1 | `--verify-bank`, CLI-only, карта пишется **до** ветвления, fail-loud при невозможном майнинге | $0 | **рекомендую** |
|
||||
| O2 | O1 + книжный пол `verify_bank: true` в `book.yaml` | $0 | развилка владельцу |
|
||||
| O3 | имя `--stop-for-signature` | $0 | развилка владельцу |
|
||||
| O4 | сохранить дефолт=стоп, ввести обратный `--continue-unsigned` | $0 | отклоняю: пере-открывает решение владельца (D39.36 п.2, D39.38) |
|
||||
| O5 | переменная окружения | $0 | отклоняю: режим невоспроизводим из истории команд |
|
||||
|
||||
**Обоснование места.** Прецедент в коде однозначен: операторские **режимы** живут в CLI→Runner
|
||||
(`Resnapshot` `runner.go:50`, `AcceptRebill` `runner.go:55` — оба вне снапшота), книжные **пороги и пути** —
|
||||
в `book.yaml` (`RebillConsentUSD` `book.go:106` «WIRING, not brief»; `MinedRejects` `book.go:98`).
|
||||
«Останавливаться ли сейчас» — режим.
|
||||
|
||||
**ДЕНЬГИ — здесь мой дизайн был опровергнут собственной линзой, привожу исправленное.**
|
||||
Первоначально B1 утверждал «Δ(книга) между режимами = $0, флаг не двигает ни один край». **Это неверно.**
|
||||
Подпись после авто-прогона двигает `enrichedVersion` (`memory.go:305`) → edit-волновой снапшот
|
||||
(`snapshot.go:216-217`) → `stagerun.go:52-55` требует `--resnapshot`, `rebill.go:233` — `--accept-rebill`
|
||||
⇒ **вся редактура заново, ≈$21–25 на книге.** Это и есть **единственный денежный аргумент ЗА флаг**,
|
||||
и он был вычеркнут в одном разделе, пока другой его считал. Итог: механика флага $0, **Δ поздней
|
||||
подписи +$21…25** — обе строки обязаны стоять рядом.
|
||||
|
||||
**Риски (все грунтованы):**
|
||||
1. **Молчаливая регрессия дефолта.** Смена stop→auto не делает красным **ничего** (S8). Обязателен тест
|
||||
до правки — тот же класс, что находка рубежа-2 D39.37.
|
||||
2. **Экзит-код 3 тихо исчезает** из обычного прогона. Скрипты `if [ $? -eq 3 ]` перестанут срабатывать молча.
|
||||
3. **Redrive: стоп после деструктивного ресета и без вывода** (S17).
|
||||
4. **Redrive оценивает майнинг по всей книге** — подписной раунд может вытеснить точечную переатаку.
|
||||
5. **Draft-only пайплайн теряет результат** (S16).
|
||||
6. **Таблица может быть огромной:** `emitRankCap = 200` (`miner_emit.go:33`). Кап stdout (~20) + сайдкар обязательны.
|
||||
|
||||
**Владельцу (развилки 5–8):** имя флага · нужен ли книжный пол O2 (защита от «забыл флаг» ценой отказа
|
||||
от половины формулировки «операторский режим») · поведение redrive (honor / forbid / honor+баннер) ·
|
||||
громкость отказа при невозможном майнинге.
|
||||
|
||||
---
|
||||
|
||||
## §3. B2 — покрытие WHAT→WHICH (ядро пака)
|
||||
|
||||
### 3.1. ДИАГНОЗ (пере-мерен тремя способами, до всякого дизайна)
|
||||
|
||||
**Замер, который реально существует:** `minirun-verify2/run-01-draft.log:13` — `terms=2 terms_with_proposed_dst=0`.
|
||||
Это **единственный** прогон, где включены оба канала (`pipeline.yaml:28` + `:33-34`). Я воспроизвёл его
|
||||
из сырья независимо:
|
||||
|
||||
- подписная карта: `花海` (evidence `[surname:花 topo_suffix:海]`), `陈博` (`[surname:陈]`) — оба `dst: ""`;
|
||||
- `banknote_detail`: `古月方源`→«Гуюэ Фан Юань», `学堂家老`→«старейшина школы», `开窍大典`→«Церемония
|
||||
открытия апертуры», `力量蛊`→«гу Силы», `智慧蛊`→«гу Мудрости», `灵泉`→«духовный родник»;
|
||||
- пересечение **0**.
|
||||
|
||||
**«1/2» — не замер.** В `minirun/pipeline.yaml` `grep banknote` = 0: в главном 10-главном прогоне канал был
|
||||
**выключен** (`config/pipeline.go:296` «Opt-in, default false»), а его БД осталась на схеме v10 без колонки
|
||||
`banknote_detail`. Это кросс-проектное сопоставление двух раундов главного прогона с предложениями
|
||||
**отдельной** пробы. Вес числа надо назвать честно.
|
||||
|
||||
**ПРИЧИНА — арифметическая, а не выборочный шум.** Каналы разъезжаются **по построению**:
|
||||
|
||||
- фильтр эмиссии майнера `emissionEligible` (`miner_emit.go:241`): тип ∈ {name, place, title} (`:242`)
|
||||
**И** `Freq ≥ emitMinFreq = 5` (`:245`, константа `:27`);
|
||||
- банкнота просит «новые имена собственные и термины **этого фрагмента**», тип — свободное поле с дефолтом `term`.
|
||||
|
||||
На живой пробе (67 уникальных src, реплика парсера `banknote.go:104-147`): тип ∈ {name,place,title} — **12 из 67**;
|
||||
`freq ≥ 5` — **12 из 67**; **оба одновременно — 3 из 67 = 4.5%**. Минус сид (`古月方源` — алиас сидового `方源`;
|
||||
поверхность вырезается на `miner_emit.go:129`, кластер, касающийся сида, — на `:134`) ⇒ **2 из 67 ≈ 3%**. Плюс **45% предложений банкноты встречаются
|
||||
в 10 главах ровно ОДИН раз** — они не могут пройти пол частоты в принципе.
|
||||
|
||||
⇒ **Расширение банкноты «вообще» на прецизионный набор майнера не сойдётся.** Сходимость даёт только
|
||||
**адресация** банкноты на список кандидатов.
|
||||
|
||||
**Позитивная улика за канал:** когда наборы пересеклись, предложение было **точным** — `学堂家老` →
|
||||
«старейшина школы» в `banknote_detail` буквально совпало со строкой, которую владелец подписал вручную
|
||||
(`minirun/mined-delta.yaml`).
|
||||
|
||||
### 3.2. Варианты
|
||||
|
||||
| | вариант | покрытие (оценка) | рекуррентно $/книга | одноразово |
|
||||
|---|---|---|---|---|
|
||||
| **(г)** | **$0-двусторонний джойн**: alias/containment-резолвер ключа + обратная секция карты («что банкнота предложила, но майнер не нашёл») | 4.7%→9.4% (замерено на exp16-выборке n=64) | **$0** | $0 |
|
||||
| **(а)** | **направленная банкнота**: майнер бежит до драфта, его кандидаты (N≤12 на главу) едут code-assembled инъекцией, модель отвечает по ним | не измерено; потолок = доля кандидатов, присутствующих в главе | $0.09 (потолок; с учётом насыщения — в разы меньше) | **≈$30.7** |
|
||||
| **(б)** | **точечный до-спрос на границе стопа** с реальными вхождениями из исходника, батч 50 | 100% остатка по построению | $0.015 (flash, R=5) … $0.061 (R=20) | $0 |
|
||||
| **(в)** | **гибрид**: (г) безусловно → (а) основной канал → (б) только остаток под флагом | — | $0.105…$0.151 | ≈$30.7 |
|
||||
|
||||
**Рекомендация — (в) с жёсткой очерёдностью, но с одним честным понижением:**
|
||||
|
||||
1. **(г) — безусловно и немедленно.** $0, не двигает ни одного хеша, покрытие **замерено**, применим
|
||||
независимо от судьбы B3. Норма D39.24 ($0-решения первыми) не оставляет выбора. Обратная секция
|
||||
немедленно снимает жалобу «на стопе почти голые термины»: 66 из 67 предложений банкноты **уже оплачены**
|
||||
и лежат в `banknote_detail` — их просто никто не показывает. **Но потолок (г) арифметически ~10%**:
|
||||
несущая причина — разъезд классов, а не строк. Продавать (г) как решение B2 нельзя.
|
||||
2. **(а) — основной канал, N≤12.** Единственный вариант, бьющий по несущей причине: отнимает у модели
|
||||
право самой решать, что достойно строки банкноты, и оставляет ей ратифицированную роль — WHAT из контекста.
|
||||
Почти бесплатен рекуррентно (перераспределяет уже оплаченный бюджет: **2 блока из 9 упёрлись ровно в 12 строк**,
|
||||
потратив их на `无/少年/三成/六块/雨声/停息/乏闷`).
|
||||
3. **(б) — страховка на остатке, только под флагом.** В деньгах бесплатен, в структуре дорог.
|
||||
|
||||
**ЧЕСТНОЕ ПОНИЖЕНИЕ ИНВАРИАНТА (находка контрактной линзы, принимаю).** Ратифицированный механизм D39.10 —
|
||||
dst как **побочный продукт акта рендеринга чанка**. В (б) акта рендеринга нет вовсе; в (а) директивный
|
||||
список принуждает отвечать по кандидатам, которые модель сама эмитить отказалась. Со-встречаемость
|
||||
структурно невозможна в обоих (ru-стороны в майнере нет), но **«dst только из контекста» перестаёт быть
|
||||
гарантией конструкции и становится просьбой в тексте промпта, статически непроверяемой.** Заявлять
|
||||
«держится» нельзя. **Развилка №9 владельцу.**
|
||||
|
||||
**Блокирующая развилка №10 — durable-заморозка списка кандидатов.** Без неё дописывание глав в
|
||||
`source_file` меняет ранжирование → меняет инъекционный блок **во всех ранее переведённых главах** →
|
||||
`msgsContentHash` каждого драфт-чанка (`render.go:209-212`) → пере-перевод. Для книги, которую переводят
|
||||
инкрементально, это приговор. **Если владелец не санкционирует заморозку (новая durable-колонка + правило
|
||||
инвалидации) — вариант (а) снимается, и рекомендация вырождается в (г)+(б) с честным признанием, что
|
||||
покрытие остаётся ~10% плюс платная затычка.**
|
||||
|
||||
**Насыщение — я его измерил за $0** (первоначально дизайн объявил «НЕ ВЫВОДИМО»; это был необеспеченный
|
||||
отказ мерить). По 2284 секциям: разделы 1–228 → **128 774** новых кандидата; 229–456 → 46 939;
|
||||
1825–2052 → **2 089**; падение скорости открытия **62×**, **51% всего запаса — в первых 10% книги.**
|
||||
⇒ линейная смета (а) — **потолок, а не оценка**.
|
||||
|
||||
**Как проверить покрытие за $0 до платного прогона:** реплей `MineBank` + `banknote_detail` по существующим
|
||||
БД (`minirun-banknote/`, `minirun-verify2/`) — для (г) это прямой замер, для (а) — оценка доли кандидатов,
|
||||
присутствующих в главе.
|
||||
|
||||
---
|
||||
|
||||
## §4. B3 — банкнота в шиппинг-промпт
|
||||
|
||||
**Текст пробы найден** (`/home/ubuntu/books/gu-zhenren/minirun-banknote/prompts/zh-ru/translator.md`,
|
||||
дифф против шиппинга — ровно 8 строк после строки 18):
|
||||
|
||||
```
|
||||
БАНКНОТА (служебный канал, ТОЛЬКО для этой пробы). ПОСЛЕ полного текста перевода добавь строку-разделитель
|
||||
⟦TM-BANK-v1⟧
|
||||
и под ней — таблицу НОВЫХ имён собственных и терминов этого фрагмента, которых НЕТ в приложенном глоссарии.
|
||||
Формат строки: исходный_термин<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.1–5.8, edit-волна не шевелится». **Занижено в 5.2×.**
|
||||
Текст черновика входит в `contentHash` **редактуры**: `waverun.go:464` передаёт `unitDraft` как `prev`,
|
||||
`stagerun.go:70-71` фолдит `RenderVars{Draft: prev}` в `msgsContentHash`, условие резюма `stagerun.go:86`
|
||||
требует и снапшот, и `contentHash`. Плюс обязательный бамп `RenderFormatVersion` лежит в общем payload.
|
||||
**Настоящая цифра — ≈$30.7, то есть целая вторая книга.** Аргумент «делать сейчас» от этого становится
|
||||
в пять раз сильнее.
|
||||
|
||||
**Бюджет строк — не менять.** 144 токена хватает с запасом (максимальный блок пробы 116.7 est-токенов).
|
||||
**Но лимит 12 строк СВЯЗЫВАЕТ:** 2 блока из 9 (22%) остановились ровно на 12 при `finish=stop` и
|
||||
`truncated=0` — модель упёрлась в инструкцию, а не в токены, и часть терминов теряется молча.
|
||||
Правка `bankMaxLines` — третья ось (`TokenBudget` фолдится, `snapshot.go:129`), в скоуп B3 не входит.
|
||||
|
||||
**Разрыв доказательства, который надо признать явно:** финальный текст ≠ байты пробы (минимум надо убрать
|
||||
литерал «ТОЛЬКО для этой пробы»), ⇒ все цифры пробы (71 строка, 9 из 20 чанков, `parse_fail` 1, `truncated` 0)
|
||||
формально относятся к другому промпту. Закрытие — микро-проба ≈$0.022. **Развилка №11.**
|
||||
|
||||
**Не-CJK (S7).** Промпт и так пар-специфичен (`prompts/zh-ru/`), так что инструкция — уже пар-данные.
|
||||
Но `hasBankSrcHan` — ветвление по паре **в Go**. Сегодня недостижимо (загрузка падает раньше на отсутствии
|
||||
`prompts/<пара>/`), живым станет в момент появления `prompts/ja-ru/`. Вердикт: **гардрейл общности нарушен
|
||||
на HEAD**, пак-20 его не усугубляет, но и не чинит. Владельцу — записать как «канал объявлен zh-only,
|
||||
ратифицировано» либо как хвост «вынос правила src-скрипта в пар-данные».
|
||||
|
||||
---
|
||||
|
||||
## §5. B4 — авто-режим на большой книге
|
||||
|
||||
**Главный экономический вывод — он же аргумент ЗА флаг:** подпись **после** оплаченной edit-волны стоит
|
||||
**всю edit-волну** (`memory.go:305` → edit-снапшот → `stagerun.go:52-55` → ≈$24 на книге). Точечного ремонта
|
||||
главы нет. Стоп существует ровно затем, чтобы подпись случилась **до** редактуры.
|
||||
|
||||
| | вариант | деньги | вердикт |
|
||||
|---|---|---|---|
|
||||
| A | **ledger-only**: auto-строки копятся, но вне провода | $0 | **обязательный фундамент** |
|
||||
| B | **forward-only Ambiguous-инъекция** (окно `since_ch = frontier+1`) | $0 пере-оплаты; лишний input впереди фронтира | надстройка, только с решением о каденции |
|
||||
| C | внутрипрогонный барьер каждые K глав | ~$0.026/книга; **CPU не измерен** (O(N²/K)) | развилка владельцу |
|
||||
| D | наивная ретроактивная заливка | **тихая пере-оплата до $5.8** | **запретить явно** |
|
||||
|
||||
**По пункту 2 задания ответ прямой: инъекцию строить НЕ НУЖНО.** Механизм «auto → Ambiguous с ⟨проверить⟩»
|
||||
уже построен для блока переводчика (S1, проверено исполнением). Нужен **путь записи + решение по Source-скоупу
|
||||
+ dst из B3**. Заодно неверен комментарий самого майнера (`miner_emit.go:180`): auto-строка сегодня инертна
|
||||
**не из-за trust-гейта**, а из-за исключения `Source:mined` из `baseMemory`.
|
||||
|
||||
**Всё вышесказанное ПУСТО без B3:** без инструкции в промпте dst всегда пуст, а строка без dst не матчится
|
||||
(`memory.go:265`) и не рендерится (`memory.go:570`). Авто-режим без B3 не инжектирует **ничего**.
|
||||
|
||||
**Риски, названные прямо:**
|
||||
1. **ТИХАЯ ПЕРЕ-ОПЛАТА — самый опасный класс пака.** При живом `postcheck_gate=false` auto-строки не двигают
|
||||
**ни один** снапшот (`memory.go:341`), но **меняют `contentHash`** каждого чанка, где терм срабатывает
|
||||
⇒ fast-path резюма падает ⇒ чанк пере-переводится. А `projectRebill` считает пере-оплату **исключительно**
|
||||
по расхождению `snapshot_id` (`rebill.go:121`) ⇒ `checkRebillConsent` выходит на `rebill.go:194-196`
|
||||
«nothing already-paid is superseded» и **согласия не спрашивает**. Сам код называет это
|
||||
«a silent per-chunk re-translate» (`stagerun.go:83-84`). **Контур согласия Р6 обходится молча.**
|
||||
2. **Ловушка самоисключения:** auto-строки в `glossary` становятся `seedSurfaces` для `MineBank`
|
||||
(`miner_emit.go:59-65` → `:129`) ⇒ дельта пустеет ⇒ **флаговый стоп тихо перестаёт срабатывать**.
|
||||
Обязательна фильтрация на `mining.go:57`.
|
||||
3. **Reject воскресает:** накопительный авто-файл сохранит терм, отклонённый позже; `loadMinedRejects`
|
||||
применяется **только на эмиссии** (`miner_emit.go:143`). Инвариант «reject-set работает в обоих режимах»
|
||||
**сегодня для авто-режима не держится** — нужен второй пункт применения (на загрузке).
|
||||
4. **Коллизия ключей:** auto-строка и подписанная на тот же src ломают `UNIQUE(book_id,src,sense,since_ch,until_ch)`
|
||||
и валят `ReplaceGlossary` посреди прогона; существующий guard знает только пару seed↔mined.
|
||||
5. **Диагностика слепа** (S14).
|
||||
6. **Операторская ловушка:** «поздняя подпись бесплатна» верно **только** через `mined_delta`. Естественный
|
||||
жест «навести порядок — переложить подписанное в `glossary_seed`» делает `Source:"seed"` ⇒ двигает
|
||||
`baseVersion` ⇒ **$6 (вся драфт-волна) и `--resnapshot`**.
|
||||
|
||||
**Разброс как сигнал.** `bankProposalsByKey` уже считает `Chunks` на рендер. Предлагаю печатать «слабое
|
||||
предложение» (один чанк / тай-брейк алфавитом) **чисто как печатный признак**, никогда не влияющий ни на
|
||||
выбор dst, ни на факт эмиссии — иначе это скрытый порог, запрещённый формулировкой владельца.
|
||||
|
||||
---
|
||||
|
||||
## §6. B5 — тест-пин джойна
|
||||
|
||||
**Рекомендация: вариант A — сквозной тест в новом `internal/pipeline/miningstop_join_test.go` с локальным
|
||||
конструктором фикстуры** (прецедент: `repair_integration_test.go:30` построил свой `setupRepairProject`
|
||||
вместо расширения общего).
|
||||
|
||||
**Диагноз хуже, чем в D39.37 (S8): немая не строка 94, а весь диапазон `mining.go:40-102`.** Тест обязан
|
||||
**впервые зажечь** этот диапазон — это может сделать только вариант A или B, но не «минимальный пин» C
|
||||
(он зажигает мимо загрузчика конфига).
|
||||
|
||||
**Тест — сквозной:** сырой вывод модели с блоком → persist `banknote_detail` → `bankProposalsByKey` →
|
||||
`MineBank` → `DeltaYAML` → YAML карты. **Непустое пересечение обязательно.** $0 (локальный `httptest`-провайдер,
|
||||
`runner_test.go:63-73`), детерминирован, `-race`-чист.
|
||||
|
||||
**Мутационный чек-лист** (каждая обязана краснеть): пустая карта в колл-сайт · `props[0]` в пустую строку ·
|
||||
выключенный persist `banknote_detail` · сломанная нормализация ключа джойна · `status:auto` → `approved` ·
|
||||
выброс `appendProposalNote`.
|
||||
|
||||
**Честно о слабом месте:** что майнер выдаст **именно** заданные термы на корпусе фикстуры, заземлено
|
||||
транзитивно (`miner_test.go:311` требует того же на том же контрасте), но **не доведено до исполнительного
|
||||
доказательства** — фикстура подбирается в фазе 2. Тест зависит от живых ин-репо данных
|
||||
`configs/langpacks/zh/*`: правка `surnames-single.txt` может изменить типизацию кандидатов.
|
||||
|
||||
**Ещё три незапиненных колл-сайта того же класса:** `waverun.go:316` (восстановление предложений на **резюме** —
|
||||
опаснее среднего, потому что владелец подписывает на повторном прогоне) · `mining.go:68` (reject-сет) ·
|
||||
`chunkrun.go:130-136` (`trust_gate_detail`).
|
||||
|
||||
**Порядок фазы 2 фиксирую явно:** сначала дефолт B1, потом фикстура B5 — иначе первая в истории фикстура
|
||||
с настроенным майнингом пишется против отменяемой семантики.
|
||||
|
||||
---
|
||||
|
||||
## §7. Адверсариальный селф-ревью
|
||||
|
||||
Три линзы (author≠reviewer) опровергли **шесть** несущих клеймов моего дизайна. Все исправлены выше;
|
||||
перечисляю, чтобы вес правок был виден, а не растворён в тексте.
|
||||
|
||||
| # | что я утверждал | вердикт | что стало |
|
||||
|---|---|---|---|
|
||||
| 1 | B1: «Δ(книга) между режимами = $0» | **ОПРОВЕРГНУТ** | +$21…25 (поздняя подпись = вся редактура). Два раздела одного дизайна противоречили друг другу по несущей цифре. |
|
||||
| 2 | «Одноразовая пере-оплата = $5.1–5.8, edit-волна не шевелится» | **ОПРОВЕРГНУТ** | ≈$30.7 (текст черновика фолдится в `contentHash` редактуры + `RenderFormatVersion` в общем payload). Занижено в 5.2×. |
|
||||
| 3 | B2: «инвариант dst-из-контекста держится во всех вариантах» | **НЕТОЧЕН** | Понижен до «структурно держится, механизмом не обеспечен — обеспечен текстом промпта». Вынесен развилкой. |
|
||||
| 4 | «Объём майнинга на книге НЕ ВЫВОДИМ» | **НЕТОЧЕН** | Измерен за $0: падение 62×, 51% запаса в первых 10%. Отказ мерить был необеспечен. |
|
||||
| 5 | «Парный срез после фикса флора дал +47%» | **ОПРОВЕРГНУТ** | Числа «+47%» нет ни в одном отчёте; `pipeline.yaml` двух срезов **байт-идентичны**, различаются главы. Реальная разница +104% — дисперсия содержания. |
|
||||
| 6 | Вилка книги «$26.10…$37.4» | **НЕТОЧЕН** | $30.7 центр, $19.7…$47.3 вилка (единый метод — по символам; «наивно по разделам» занижает на 17.8%). |
|
||||
|
||||
**Плюс поправка политически важная:** планка COGS не была названа ни разу. После нормировки книга =
|
||||
**57.7 ранобэ-эквивалентов**; ставка планки $7.52/1M токенов исходника, наш замер **$4.72/1M** ⇒
|
||||
**планка НЕ сломана, стек идёт на 63% плановой ставки.** Без этой строки соседство «$26–30» с заголовком
|
||||
«~$0.85/ранобэ» читается как 35-кратный пробой.
|
||||
|
||||
**Мои собственные слабые места, которые линзы НЕ закрыли:**
|
||||
- **Цитатный слой дрейфует.** Один и тот же `emitRankCap` цитируется как `:31`, `:33`, `:35` в разных
|
||||
разделах; `loadMinedRejects` — как `mining.go:125-144` и `mining.go:132-163`. Выводы верны, номера
|
||||
надо нормализовать перед фазой 2 — владелец и исполнитель цитируют строки дословно.
|
||||
- **Один клейм был ложен как факт:** «grep `canon-recovery` = 0» — греп даёт 1 (комментарий
|
||||
`miner_substrate.go:24`). Вывод («метрики нет») верен, формулировка была неточна.
|
||||
- **Фикстура B5 не доведена до исполнения** (признано в §6).
|
||||
|
||||
---
|
||||
|
||||
## §8. Развилки владельца (сводка). Фаза 2 не начинается без 1–4
|
||||
|
||||
| # | развилка | почему блокирует |
|
||||
|---|---|---|
|
||||
| **1** | **Source-класс и скоуп базы для auto-строк** (S2). Вне базы ⇒ инертны, $0. В базе ⇒ инжектируются, но при `postcheck_gate=true` двигают **оба** хеша. Третьего варианта в коде нет. | Без ответа авто-режим не работает вовсе |
|
||||
| **2** | **Форма B3**: буквальный перенос в `translator.md` (буква промта пака) или вариантный файл + `prompt_override` (моя рекомендация). Голый перенос **лендить нельзя** (S5). | Блокер безопасности |
|
||||
| **3** | **durable-заморозка списка кандидатов** для B2(а). Без неё вариант снимается. | Определяет, какой дизайн строим |
|
||||
| **4** | **«Принудительный пост-чек»** для Ambiguous (S13) конфликтует с ратифицированным external-review major #1. Цена изменения — отмена того решения. | Семантика владельца vs ратифицированный выбор |
|
||||
| 5 | Имя флага: `--verify-bank` / `--stop-for-signature` | |
|
||||
| 6 | Книжный пол `verify_bank: true` (покупает защиту от «забыл флаг» ценой половины формулировки «операторский режим») | |
|
||||
| 7 | Поведение redrive при стопе: honor / forbid / honor+баннер | |
|
||||
| 8 | Громкость отказа при невозможном майнинге | |
|
||||
| 9 | Понижение инварианта «dst только из контекста» до «обеспечено текстом» — принять или отклонить (а)/(б) | |
|
||||
| 10 | Цена поздней подписи: только вперёд / платить ≈$24 за пере-редактуру / копить подписи | |
|
||||
| 11 | Микро-проба ≈$0.022 на **финальном** тексте промпта (цифры пробы относятся к другим байтам) | |
|
||||
|
||||
**Плюс амендменты доков, которые я не имею права сделать сам:** research/20 §C2 («не мажоритарность» —
|
||||
код мажоритарен, S10) и §B3 (артефакт кандидатов уехал в стор, S11); D39.36 п.3 (формулировка
|
||||
«только CONFIRMED», S1); статус `auto+dst` — гибрид, которого нет в §C2-7.
|
||||
|
||||
---
|
||||
|
||||
# ДОПОЛНЕНИЕ (тот же день, по замечанию владельца)
|
||||
|
||||
Владелец указал на два пробела фазы 1: корпус доков по банку памяти не читан, и работа шла в режиме
|
||||
«варианты», а не «решения». Оба справедливы. Ниже — исправление: §9 доктрина (что корпус УЖЕ
|
||||
предлагает), §10 инженерные решения, §11 честный статус их готовности.
|
||||
|
||||
## §9. Что корпус доков по банку памяти уже предлагает — и не построено
|
||||
|
||||
Прочитаны целиком: `research/05-memory-glossary`, `13-memory-bank-validation`, `14-adaptive-memory`,
|
||||
`architecture/06-memory-risk-registry`, `01-decisions` (Р-решения), `research/20` §B1/§B2/§C1/§C2/§C3/§E.
|
||||
|
||||
**Д1 — `research/20` §C2 п.7 (строки 596–600) — ПРЯМОЙ ОТВЕТ НА P1, никем не построенный:**
|
||||
|
||||
> «новые термы — `status: auto` (**без dst — инертны в автомате**) или `status: draft`
|
||||
> (**с канон-предложением — инъекция ⟨проверить⟩**); алиасы — поверхностями терма»
|
||||
|
||||
Эмиссия ратифицирована ДВУХРЕЖИМНОЙ. Авто-режим по доктрине — это **не** «ослабить trust-gate для
|
||||
`auto`», а «эмитить `draft`, когда dst уже есть». `DeltaYAML` жёстко пишет `Status: "auto"`
|
||||
(`miner_emit.go:192`) даже когда джойн D39.37 уже приджойнил dst — **draft-ветка эмиссии не построена**.
|
||||
Механизм для неё живой и ратифицированный: D32 п.2 — «`status:draft` … `memory.go:419` draft→soft-inject».
|
||||
⇒ Мой вывод фазы 1 «строить инъекцию не надо» подтверждается доктриной и уточняется: надо сменить
|
||||
литерал статуса, а не трогать инъекцию.
|
||||
|
||||
**Д2 — `research/14` §7 механизм **M2**, вердикт «ВНЕДРЯТЬ»:**
|
||||
|
||||
> «Детерминированный консистентность-кэш + precision-gated adaptive-retrieval». Для auto/ambiguous БЕЗ
|
||||
> approved — first-seen/majority-vote кэш рендеринга. **Арбитраж: кэш ПРЕДЛАГАЕТ → post-check ГЕЙТИТ →
|
||||
> batch-судья/человек ПРОМОУТИТ в approved.** … → внедрять как **гигиену банка v2**.
|
||||
|
||||
Это дословно тот авто-режим, который просит владелец, с прописанным контрактом арбитража и с явным
|
||||
«abstention first-class» (воздержаться лучше, чем инъектить неуверенное). **В D-логе не ратифицирован
|
||||
ни разу** (упомянут только M1 — и то как конфликт по few-shot, D-лог:258). Плюс §8 «Арбитраж кто
|
||||
побеждает»: «серая зона … может **обогащать**, но каждая инъекция гейтится детерминированным
|
||||
post-check; при конфликте побеждает precision-first фильтр».
|
||||
|
||||
**Д3 — `06-memory-risk-registry` A2 (статус ❌ «спроектировать»)** — источник формулировки владельца:
|
||||
|
||||
> «`AMBIGUOUS` (короткий/общий алиас, коллизия поверхности, `auto/draft`) → инъекция с явной пометкой
|
||||
> «unverified — проверить» **+ принудительный post-check** … паттерн CRAG, но **каждая ветка наблюдаема**»
|
||||
|
||||
⇒ «Принудительный пост-чек» — цитата из реестра, а не импровизация владельца, и реестр там же
|
||||
говорит, что имеется в виду **наблюдаемость**, а не флагование. Развилка №4 фазы 1 этим снимается
|
||||
(см. §10, P4).
|
||||
|
||||
**Д4 — `06-memory-risk-registry` B1 (статус ❌)** — риск и смягчение для «закрепления auto-канона»:
|
||||
|
||||
> Риск: «первый (наименее информированный) перевод имени лочится на 1000 глав».
|
||||
> Смягчение: «**Append-only журнал ревизий рендеринга** (`src, old_dst, new_dst, editorial_ts`)
|
||||
> **отдельной осью** от спойлер-окна; смена approved-рендеринга → подтверждение → **точечный
|
||||
> ре-перевод по ключу** (ReTranslation-by-keyword)».
|
||||
|
||||
⇒ Ответ на мою цифру «поздняя подпись = вся edit-волна ≈$24»: доктрина предлагает **точечный ремонт по
|
||||
ключу**, а не пере-гон волны. Я в §5 написал «точечного ремонта главы нет» — верно про код, но он
|
||||
спроектирован. Журнал `glossary_revisions` в сторе, кстати, **уже есть** (`store/glossary.go:167-170`).
|
||||
|
||||
**Д5 — `01-decisions` Р7 + реестр G2 — «безлюдный режим»:** «auto→approved автоматом с записью в журнал,
|
||||
но с явной пометкой качества». **Конфликтует с D39.36** («ничего неподписанного не становится
|
||||
Confirmed»). Считаю Р7-формулировку superseded словами владельца; фиксирую как амендмент, а не решаю сам.
|
||||
|
||||
**Д6 — `research/20` §C2 п.3 — ратифицированная формула консолидации dst,** которой нет в коде:
|
||||
|
||||
> «скор dst-варианта = частота по всем чанкам × **конформность (Палладий-таблица B6** для name/place) ×
|
||||
> согласование с уже-approved соседями × полнота падежной леммы. Побеждает вариант, а НЕ первое
|
||||
> вхождение — прямая реализация анти-LTCR-отравления. **Мажоритарность НИКОГДА не даёт approved:
|
||||
> канон-предложение = draft.**»
|
||||
|
||||
`bankProposalsByKey` сортирует по числу чанков — голая мажоритарность (S10). Формула для замены — вот она.
|
||||
|
||||
**Д7 — поле `Confidence` уже есть в схеме** (`store/glossary.go:39`), реестр предписывает класть туда
|
||||
приор («ruby — сид в auto-кандидатный пул **с приором `occurrences`**», уточнение 2). Майнер его не
|
||||
заполняет; `rubyToCandidates` (единственный, кто заполняет) не вызывается (S9). Готовая механика
|
||||
ранжирования непроверенных строк лежит неиспользованной.
|
||||
|
||||
**Д8 — честная оговорка корпуса, которую обязан услышать владелец до включения авто-режима.**
|
||||
`research/14`, слабое место №3: «Over-trust я мерил на **известном** имени … На **новом** термине без
|
||||
прайора over-trust реален (2510.00829) — моё плечо это НЕ покрывает». Плюс `research/13` Q5 п.3:
|
||||
«уверенность модели растёт при падении точности». ⇒ **Безопасность инъекции непроверенного
|
||||
намайненного термина корпусом не измерена.** Это не аргумент против, это то, что должно быть сказано вслух.
|
||||
|
||||
## §10. Инженерные решения
|
||||
|
||||
### P1 — auto-терм не доезжает до провода
|
||||
|
||||
**Решение: третья ось `lane` + durable-реестр кандидатов + forward-only окно.**
|
||||
|
||||
Диагноз корня: сегодня в схеме ДВЕ оси (`Source` = провенанс, `Status` = доверие), а решений
|
||||
принимается ТРИ. Третье — «чем защищено уже оплаченное от изменения этой строки» — принимается
|
||||
`Source`-ом как прокси (`seeding.go:94` вырезает `Source=="mined"`), и именно эта грубость, а не
|
||||
trust-gate, делает `mined+auto` инертной. Комментарий `miner_emit.go:177-180` называет неверную причину.
|
||||
|
||||
**Теорема FOI (forward-only invariance)** — доказана разбором всех восьми путей, которыми новая строка
|
||||
может дотянуться до `Selection.Injected` (`memory.go:404-505`), и **выдержала адверсариальную атаку**:
|
||||
строка с `since_ch > c` байт-неспособна изменить инъекцию главы `c`, потому что `matchTrust`
|
||||
(`memory.go:792-804`) пропускает спойлер-блокированных владельцев, а `suppressContained`
|
||||
(`memory.go:835-838`) отказывает им в роли суппрессора. ⇒ `msgsContentHash` не двигается ⇒ **P3 не
|
||||
срабатывает по построению**, а не по дисциплине.
|
||||
|
||||
**Следствие B (бонус, верно УЖЕ СЕГОДНЯ без всякой новой оси):** `RenderEditorConstraintBlock`
|
||||
**байт-инвариантен к любому числу ambiguous-строк**, потому что `priorityRank` (`memory.go:545-560`)
|
||||
ставит бит `1<<2` на всё не-Confirmed ⇒ confirmed-префикс бюджета не двигается. Значит ослаблять
|
||||
редактора не нужно **и вредно**: CONFIRMED-only — единственная бесплатная гарантия инвариантности
|
||||
edit-волны. Ответ на «надо ли auto доезжать до редактора»: **нет, и это не дефект.**
|
||||
|
||||
Схема: `lane ∈ {"", "fwd"}` — «" " = защищено фолдом (все сегодняшние строки), `fwd` = защищено окном».
|
||||
Два предиката заменяют два литерала:
|
||||
`VisibleToBase(r) = r.Lane == LaneForward || r.Source != SourceMined` (вместо `seeding.go:94`) и пропуск
|
||||
`fwd`-строк в `ComputeVersionScoped`. При пустой оси обе формулы **тождественны текущим** ⇒ нулевой
|
||||
сдвиг байт и хешей, golden не перезахватывается.
|
||||
|
||||
Durable-реестр `bank_candidates` с write-once-инвариантами на уровне SQL (`ACTIVATE` — `UPDATE … WHERE
|
||||
dst='' AND since_ch=0`), допуск через precision-gate (`votes ≥ 2`, ничья ⇒ **воздержаться**), reject
|
||||
на загрузке применяется **ретированием вперёд** (`until_ch = frontier`), а не удалением — удаление
|
||||
сменило бы байты оплаченных глав.
|
||||
|
||||
### P2 — банкнота в шиппинг-промпт
|
||||
|
||||
**Решение: убрать булев. Канал ВЫВОДИТСЯ из промпта (стадия «в канале» ⟺ её шаблон содержит
|
||||
`bankSeparator`), срез делается БЕЗУСЛОВНО.** Один источник истины вместо двух; рассинхрон перестаёт
|
||||
существовать как состояние, а не отлавливается проверкой.
|
||||
|
||||
Побайтная проверка, которой я в фазе 1 не делал: опасение «безусловный `splitBanknote` обрежет хвостовой
|
||||
пробел» **снято** — при `block==""` функция возвращает **`rawText`, а не `cleanText`**
|
||||
(`banknote.go:191-192`, собственный комментарий «byte-identical path»), то есть `TrimRight` уже сегодня
|
||||
отбрасывается на этом пути даже при включённом гейте. ⇒ безусловный срез байт-идентичен на любой книге
|
||||
без сепаратора в выводе — а сепаратора сегодня нет ни в одном промпте, ни в одном конфиге, ни в golden.
|
||||
Единственный случай расхождения байт — ровно тот, ради которого правка делается.
|
||||
|
||||
### P3 — тихая пере-оплата мимо Р6
|
||||
|
||||
**Решение: одно определение вместо двух.** Предикат «эта единица пере-выполнится» существует в
|
||||
`stagerun.go:86` (снапшот **И** contentHash), а `projectRebill` (`rebill.go:121`) вычисляет ту же
|
||||
величину заново, читая только снапшот. Это не дыра в фиче — это **две реализации одной величины**.
|
||||
Тот же файл уже описывает этот класс как повод к рефакторингу (`rebill.go:129-131`: «одно определение,
|
||||
чтобы порог нельзя было посчитать от дрейфующей копии»).
|
||||
|
||||
Проверено, что проекция **выполнима**: шаблон (`runner.go:282`), `Book`, `chunks` (`rebill.go:185` их
|
||||
уже получает), инъекция — всё доступно в точке гейта. CPU: ≈7800 рендеров на книгу, sha256 по ≈60 МБ =
|
||||
**60–120 мс**. $0 провайдеру.
|
||||
|
||||
### P4 — «принудительный пост-чек» без наказания
|
||||
|
||||
**Решение: конфликт иллюзорен — «принуждение» и «наказание» в коде физически разведены.**
|
||||
Наказание = ровно две строки (`waverun.go:370`, `:477` — флагование при `CountConfirmedMisses > 0`).
|
||||
Принуждение = запуск проверки (`:369`, `:476`), гейтится `isFinalWave`. External-review #1 возражает
|
||||
против **первого**; владелец просит **второе**. Пересечения нет.
|
||||
|
||||
Плюс находка, меняющая постановку: сегодня ambiguous **измеряется не на том проводе**. Редакторский
|
||||
блок его не показывает (`memory.go:633`), но `Postcheck` идёт по полной выборке (`waverun.go:476`) ⇒
|
||||
«ambiguous-промах» на edit-волне — это запись, которую редактор **никогда не видел**. Живое
|
||||
подтверждение в сьюте: `runner_memory_test.go:231-261` — терм `田中` (`status: draft`) утверждается в
|
||||
`PostcheckDetail`, хотя отверг его **переводчик**, а на драфт-проводе не измеряется ничего.
|
||||
|
||||
Решение: `Postcheck` становится CONFIRMED-only **по типу** (а не по дисциплине фильтра, который любой
|
||||
новый колл-сайт может забыть), а рядом появляется отдельный $0-канал «показано → принято/не принято»
|
||||
на **драфт**-проводе. Это же и есть «разброс как сигнал» из B4 — один механизм на две задачи.
|
||||
|
||||
### P5 — покрытие и раунды
|
||||
|
||||
**Корень раундов найден и он НЕ там, где я писал в фазе 1.** Не в `subsume`/`isFragment`, а в
|
||||
`miner_alias.go:98-110`: пара (`家老`, `学堂家老`) даёт `containmentRest = 学堂`; пока `学堂` нет в сиде,
|
||||
`compositional=false`, а `家老` — сидовый ⇒ **ident-ребро** ⇒ кластер касается сида ⇒
|
||||
`clusterTouches` (`miner_emit.go:134`) подавляет весь кластер. После подписи `学堂` ребро деградирует
|
||||
в `weak/phrase_not_alias`, `学堂家老` остаётся синглтоном и эмитится. Прослежено по реальному
|
||||
`guzhenren-seed-v2.yaml:696-698` и langpack-файлам, а не по памяти.
|
||||
|
||||
⇒ Замыкание за один проход выполнимо офлайн и за $0: итерировать «эмитировали → добавили поверхности в
|
||||
`seedSurfaces` → пере-майнили» до неподвижной точки. Плюс сущностный джойн (алиасы + контейнмент),
|
||||
где контейнмент-dst идёт **уликой, а не значением** (`学堂` ⊂ `学堂家老`, но «школа» ≠ «старейшина школы»),
|
||||
и единый формат провенанса `tm-prov/1` в сид-схеме и в reject-файле.
|
||||
|
||||
## §11. Честный статус: ни одно решение НЕ готово к стройке в предъявленном виде
|
||||
|
||||
Три адверсариальные линзы (реализуемость / контракт и общность / побочные и деньги) подтвердили
|
||||
**инженерные ядра** — FOI, Следствие B, диагноз P3, диагноз P4, корень раундов P5 — и нашли, что
|
||||
**сборка не проходит**. Перечисляю, потому что без этого §10 читается как «можно брать и строить».
|
||||
|
||||
**Блокеры сборки и корректности:**
|
||||
1. **P1 не компилируется:** `BankCandidate` объявлен в `membank`, а возвращается из `store`, при том что
|
||||
`membank` импортирует `store` (`memory.go:27`), а обратной зависимости нет ⇒ импортный цикл.
|
||||
Нужен третий пакет или перенос типа целиком в `store` — это меняет все семь предложенных сигнатур.
|
||||
2. **P1 нарушает детерминизм:** шаги допуска обходят `bankProposalsByKey` (`banknote.go:242`) и
|
||||
`LaneAdmissionConflicts` через `range` по карте. Внутренние списки отсортированы, **ключи — нет** ⇒
|
||||
порядок активаций и текст карты подписи зависят от рандомизации хеш-таблицы Go. Golden это **не
|
||||
поймает** (реестр на нём пуст). Нужна явная `sortedKeys`.
|
||||
3. **P1 `SkipFold` вынимает `fwd`-строки из фолда ДАЖЕ при `gateOn`** — ровно из той ветки, что
|
||||
построена против тихого флипа вердикта по `decl` (`memory.go:314-318`, self-review #4). А
|
||||
рекомендованный дефолт «`lane: fwd` для подписанной approved-строки в owner-YAML», где write-once
|
||||
замков нет, возвращает и тихий флип, и тихую пере-оплату, как только фронтир перешагнёт `since_ch`.
|
||||
FOI доказывает инвариантность **байт**, а не **вердиктов**, и только в момент активации.
|
||||
4. **P1 `advanceBankLane` не имеет доступа к `seed ∪ ruby ∪ minedDelta`** — все три локальны внутри
|
||||
`seedGlossary`. Либо пере-исполнять его на каждой границе сегмента (а там фатальные проверки
|
||||
`MinedDeltaSeedCollisions`/`ApprovedSharedKeyCollisions` посреди оплаченного прогона), либо менять
|
||||
владение состоянием.
|
||||
5. **P1 `AssertForwardOnly` в объявленной сигнатуре не выражает свой контракт** и будет падать на
|
||||
каждом здоровом сегменте начиная со второго.
|
||||
6. **P3 неверно моделирует `sanitizer_stripped`:** движок считает его **не-ok** (`resume.go:54`,
|
||||
`export.go:316`, `waverun.go:320-325`) и выбрасывает члена из edit-юнита, а проекция несёт текст
|
||||
вперёд ⇒ ложная пере-оплата на здоровой книге.
|
||||
7. **P2 и P5 взаимоисключающи:** P2 ретирует `Gates.Banknote.Enabled`, на который P5.2 явно опирается.
|
||||
Заявленный P5 порядок («сначала P2») делает P5.2 несобираемым.
|
||||
8. **P2 определяет «стадия в канале» через `System+FewShot+User`,** а `tpl.System` уже содержит
|
||||
few-shot-блок при `few_shot=ON` (`runner.go:281-282`) ⇒ стадия с инструкцией только в `---FEWSHOT---`
|
||||
при выключенном few-shot получит канал ON, хотя модель инструкции не видела.
|
||||
9. **P5 замораживает `bank_ask` на ВСЮ книгу одним вызовом** (`waverun.go:103`) ⇒ заявки для ≈4568
|
||||
чанков вмораживаются по начальному сиду, и ни одна подпись владельца никогда до них не доедет.
|
||||
|
||||
**Организационное:** P1, P4 и P5 независимо резервируют один слот миграции. **Проверено мной
|
||||
исполнением: `len(migrations) == 11`, следующий слот — `v12`** (линза денег утверждала `v10`/`v11` —
|
||||
ошибка, D39.37 прав).
|
||||
|
||||
**Деньги:** P2 занижает главную статью своей сметы примерно вдвое — `banknoteSnap` свёрнут в **ОБЩИЙ**
|
||||
payload обеих волн (`snapshot.go:406/434`), тогда как соседний `repair` свёрнут по-волново
|
||||
(`snapshot.go:229`). P5 в том же пакете считает это верно ⇒ **пак несёт два ценника на одно действие**
|
||||
($12.6 против $26–31), и вывод «включать сегодня, пока $0» принят по неверной цифре.
|
||||
|
||||
**Наблюдаемость:** P1 — единственное решение, вводящее крупное durable-состояние **без единой строки в
|
||||
`tmctl status`/`report`**, ровно в том авто-режиме, ради которого пак существует.
|
||||
|
||||
**Доктринальная поправка, без которой P1 незаконен:** README-инвариант №2 («всё, что влияет на
|
||||
wire-байты, свёрнуто в `snapshotID`») пришлось бы уточнить до «всё, что может изменить байты **уже
|
||||
оплаченной** единицы». Это правка ратифицированного инварианта — **решение владельца, не сессии.**
|
||||
Loading…
Add table
Reference in a new issue