# Эксперимент 09. Протокол пилота Фазы 2.5 — выбор ядра, memory-bet, судья, think-режим (v2, D13)

> **⚠ Указатель ревизии D31 (12.07).** Протокол жив (решающая точка проекта). НЕ внесены пост-D13 амендменты — при подготовке решающего прогона добавить: **D30.1** (арм «моно vs билингв» из решающего → ПОДТВЕРЖДАЮЩИЙ — флип D1 принят досрочно exp12; редактор-стек: билингв, кандидат glm-5-билингв, grok reasoning-off снят; draft под вопросом exp13 — D30.6); **D21.4** (тиринг армов voice-A/B/C/D + судейские армы формата/сэндвича с echo-охранной метрикой + minimal-diff-редактор); **D25.3** (prefix-анализ судьи 1/3/5 vs full-11 из ТЕХ ЖЕ данных — sequential-stopping как замена протокола отклонён); **D25.6** (инструментировка minutes/flag + typed resolutions + аудит unflagged); **D30.10** (span-цитирующие судьи reasoning-ON, раздельные вызовы стиль/верность — урок exp12: скаляры без спанов нечувствительны). Блокеры (D27.1): корпус вне претрейна, аннотаторы ≥3, билингв-якорь (D25.9-Q1), проба судьи-дублёра 18+ (D22.6).

**Дата:** 2026-07-05 · **v2:** 2026-07-09 (поправки D13, починка харнесса, Pearmut-вердикт) · **Зона:** полигон (флагман) · **Статус:** протокол + харнесс (memory_eval починен и валидирован индикативом); решающий прогон ждёт корпус владельца + человеческих аннотаторов.
**Закрывает решения:** выбор ядра C0–C3 (Р2), go/no-go на банк памяти (research/13 §Вердикт), валидность LLM-судьи (research/11-gap-3), think-ON/OFF (D6), ценность пре-пасса Annotator (04-unhappy).

Пилот — единственная точка, где сходятся все отложенные «решаемые только человеком» вопросы качества. Он же — **дециждающий эксперимент банка памяти** (ставка не морозится до него, вердикт GO-на-схему был условным).

> **⚠ Разведение имён (D13.4, устраняет коллизию exp09):** **C0–C3 = конфигурации ЯДРА** (§3, baseline/draft→editor/generate-select/select-refine). **M0–M3 = режимы ТЕРМИНОЛОГИИ memory-eval** (§6, no-gloss/selective-bank/full-context/wrong-gloss). Раньше оба назывались C0–C3 — риск путаницы в пре-регистрации; исправлено в доке, харнессе (`memory_eval.py`), данных и pre-registration §12.

## Сводка поправок v2 (D13, 2026-07-09)

- **§3a Новый арм D13.1** — моно-vs-билингв редактор на ОДНОЙ модели, простой general-промпт (прямой тест D1; отдельно от 7-bis бейк-оффа моделей).
- **§3b C2 только на ГЕТЕРОГЕННЫХ кандидатах (D13.2)** — draft'ы от разных моделей, не N сэмплов одной (иначе селекция ≈ монета, плечо предрешено).
- **§5 Панель судей (D13.3)** — 2–3 семейства; 11+ повторов со свапом позиций; Bradley-Terry/медиана; grok не судит grok-выходы; валидация судьи — κ vs человеческий IAA + tie-rate/top-1.
- **§6 memory-eval починен (D13.5)** — эхо-контроль, полные выходы, **ось верности реализована**, C0–C3→M0–M3, зеркало синхронизировано с Go по 7 расхождениям; индикатив пере-прогнан (§6-результаты).
- **§9/§12 Пре-регистрация расширена (D13.4)** — MDE/мощность, N аннотаторов ≥3 (иначе «безκ-режим»), правила решения по каждой руке — неизменяемый каркас §12.
- **§10 Инструмент — Pearmut оценён (D13.5): НЕ берём как BWS-движок** (у него нет BWS), строим тонкий свой + крадём его attention-checks. Вердикт §10.

## 1. Что пилот решает (и почему только он)

| Решение | Почему не решено раньше | Рука пилота |
|---|---|---|
| **Ядро C0–C3** (baseline / draft→editor / generate-select / select-refine) | arXiv:2603.20324 «When Agents Disagree» не покрывает перевод; на zh/ja→ru нужен свой (research/11-gap-3) | человеческий BWS + судья-панель |
| **Банк памяти vs длинный контекст** (go/no-go на ставку) | DelTA — LLM-в-цикле, не наш детерминированный путь; сравнение «банк vs длинный контекст» на zh/ja→ru не проведено (research/13 Q6) | memory-eval (§6), WMT25-3-режим |
| **Валиден ли LLM-судья вообще** | LAIT: судьи расходятся с людьми; на s\* висит вся ставка generate-select C2/C3 | корреляция судья↔человек + калибровка s\* (§5) |
| **think-ON vs OFF по качеству** (draft/translator + editor) | локально подтвердилось на реалиях (羅生門→Радзёмон), но COGS +13–25% (эксп.08) — стоит ли | think-рука (§7), встроена в ядро |
| **Ценность пре-пасса Annotator** | улучшает ли настолько, чтобы оправдать вызов | A/B в ядре (§8) |

## 2. Корпус (нужен от владельца)

- **25–35 глав** реальных произведений с **приватными эталонными переводами** (издательскими или выверенными). GuoFeng V2 — только dev, non-commercial (нельзя в продукт-оценку).
- Покрытие: zh→ru (вебновелла + данмэй), ja→ru (ранобэ), en→ru (роман) — по 8–12 глав. Диалого-плотные и нарративные главы (см. эксп.07: диалог-плотность — ключевая ось).
- **Рекуррентные имена/термины** обязательны (≥8 сущностей, повторяющихся через главы) — иначе memory-eval нечего мерить.
- **⚠ Методическое ограничение (эксп.04): владелец читает только en/ru.** → человеческая оценка **ВЕРНОСТИ** возможна лишь на **en→ru** (и русская сторона стиля любого перевода). Для zh/ja верность оценивается: (а) **английским якорь-подстрочником** (профессиональный en-перевод как мост), (б) LLM-судьёй чужого семейства против исходника, (в) сверкой с приватным русским эталоном. Заложено в дизайн (§4–5).

Пока корпуса нет — индикативный прогон на PD-Ah-Q (`eval/pilot/memory_eval.py`) валидирует харнесс и метрики; **вебновелл-срез добора** (r-коэффициенты/эхо/coverage-precision вне претрейна) — `eval/webnovel_slice.py`, одна команда по появлению файлов в `eval/data/samples/webnovel/`.

## 3. Дизайн ядра (C0–C3, Р2)

Один и тот же чанк проходит 4 конфигурации ядра, все на ратифицированном стеке (draft=DeepSeek-v4-flash, editor=grok-non-reason):

- **C0 baseline** — один проход переводчика (+ детерминированный глоссарий = уровень VseGPT; baseline метрики, §синтез дня-0 — ныне `../archive/PROGRESS-2026-07-04-10.md`).
- **C1 draft→editor** — черновик → моноязычный редактор (D1). Дефолт Ф1.
- **C2 generate-then-select** — N черновиков → судья-селектор выбирает лучший (arXiv:2603.20324). Висит на калибровке s\* и валидности судьи (§5). **D13.2: кандидаты ГЕТЕРОГЕННЫ** — draft'ы от РАЗНЫХ моделей (deepseek/glm/kimi/mistral), НЕ N сэмплов одной. Основание: на гомогенных селекция ≈ монета (2603.20324 WR 0.512; LitMT 2606.05924 best-of-8+судья — последнее место). На гомогенных C2 предрешён и жжёт бюджет впустую.
- **C3 select-then-refine** — селект + точечный re-ask/refine на выбранном (verifier-gated, research/14 M2; рычаг L3 эксп.adaptive_reask).

Каждая конфигурация × {think-OFF, think-ON} (§7) × {Annotator-pre-pass OFF/ON} (§8) — факторный, но приоритезированный (полный крест дорог; ядро × think — первично, Annotator — вторичный A/B на подвыборке).

### 3a. Арм D13.1 — моно-vs-билингв редактор на ОДНОЙ модели (прямой тест D1)

Отдельная рука, **не путать с 7-bis** (тот — бейк-офф РАЗНЫХ моделей на моно-редактуре). Здесь одна модель (grok-4.3) правит черновик в двух режимах:
- **моно**: вход = только русский черновик + глоссарий-констрейнты (боевой D1, без исходника);
- **билингв general**: вход = исходник + черновик + ПРОСТОЙ general-промпт «улучши, не переври».

**Основание (верифицировано по PDF arXiv:2605.13368, вкл. en→ru):** monolingual-рефайнмент теряет accuracy с ПЕРВОГО прохода (−2.2…−5.6 MQM у всех 6 моделей); general-рефайнмент С исходником даёт тот же fluency при accuracy ~flat и лучшем overall. **Вход в решение (D17):** если моно даёт паритет верности — D1 подтверждён дёшево; если налог на верность воспроизводится — флип на «редактор с исходником, простой промпт» (дешевле любой альтернативной митигации калек). Метрики те же (§4 BWS-стиль + §6 decl-консистентность + верность через сверку с эталоном/якорем).

## 4. Человеческая оценка — Best-Worst Scaling (BWS)

**Почему BWS, не шкала Ликерта:** BWS (выбери ЛУЧШИЙ и ХУДШИЙ из набора) даёт более надёжные, менее шумные ранги, чем абсолютные оценки (устойчив к разнице калибровки аннотаторов) — стандарт для сравнения близких систем. LAIT показал: абсолютные оценки судей плывут, ранги — надёжнее.

- **Единица:** абзац/короткий чанк (не вся глава — усталость аннотатора). Наборы из 3–4 систем (C0–C3, или think-ON vs OFF пары).
- **Слепота:** аннотатор не видит, какая система какой выход дал (рандомизация порядка + меток) — **и рандомизация ПО НАБОРУ, ключ вне артефакта** (урок exp04, D13.5: за `<details>` для фетча не скрытие).
- **Оси оценки (раздельно, НЕ смешивать):**
  - **Стиль/естественность** (русская сторона) — владелец/русскоязычный аннотатор, любой языковой парой (не нужен исходник).
  - **Верность/полнота** — только en→ru напрямую; для zh/ja — через en-якорь-подстрочник (§2). Отдельная BWS-задача с исходником/якорем на виду.
- **N и κ (D13.4):** ≥3 аннотатора на набор для inter-annotator agreement (κ); при низком κ — расширять, не усреднять шум. **Если аннотатор реально один (владелец) — κ неисчислим → это ЯВНЫЙ «безκ-режим»** (пишем честно, не выдаём одиночную оценку за согласованную).
- **Мощность/MDE (D13.4):** число BWS-наборов пред-регистрируется под целевой MDE (минимально-детектируемую разницу рангов) — иначе «нет разницы» неотличимо от «мало мощности». См. §12.
- **Стилевая ось для M1** (in-context демонстрации, research/14): бьёт ли демо-рука стиль БЕЗ потери консистентности/fidelity (индикатив: по консистентности не бьёт; стиль не мерен).

## 5. LLM-судейская панель (валидация + калибровка, D13.3)

Судья держит две вещи: (а) **выбор в C2/C3** (селектор), (б) **валидацию качества** offline. Обе непроверены на домене → пилот их валидирует, не принимает на веру.

- **Панель — 2–3 семейства МАКСИМУМ (D13.3а).** Не 9 судей: 9 ≈ 2 эффективных голоса (2605.29800), лучший ОДИНОЧНЫЙ судья ≥ панели. Кандидаты чужих семейств (анти-self-preference): Gemini-3.1-Pro (нативный, safety-off для 18+), grok-4.3, gpt-5-mini.
- **11+ повторов на вердикт со свапом позиций A/B (D13.3б).** Одиночный прогон нестабилен (13.6% флипов; парафраз меняет исход в 25%; 2606.13685). Позиции A/B свапаются, вердикт агрегируется по повторам.
- **Агрегация — медиана / Bradley-Terry (D13.3в)**, НЕ среднее (JP-TL-Bench-паттерн).
- **grok НЕ судит grok-редактированные выходы (D13.3г)** — нарушение собственного анти-self-preference правила. Реализуется на уровне харнесса (family-guard; тот же принцип, что cross-family fidelity-судья в memory_eval — `family_of(judge) != family_of(translator)`).
- **Валидация судьи — κ vs человеческий IAA + tie-rate/top-1 within-prompt (D13.3д)**, НЕ средняя корреляция (2603.12520). Метрики: доля совпадений top-1 судья↔человек ВНУТРИ набора, tie-rate; Kendall τ судья↔человек на BWS-ранге как вторичная.
- **Шкала Комиссарова** (анкета MQM-весов, 04-unhappy): mistranslation / omission / addition / терминология / согласование рода / стиль-канцелярит.
- **Калибровка порога s\*** (на нём вся ставка generate-select, arXiv:2603.20324): при каком судейском скоре «выбрать/переспросить» максимизируется человеческий win-rate. **Пред-регистрировать s\* ДО финального прогона** (§12).

## 6. Memory-eval — дециждающий эксперимент банка (WMT25 три-режимный; M0–M3)

**Вопрос (страх владельца + go/no-go):** оправдана ли ДЕТЕРМИНИРОВАННАЯ селективная инъекция (наш банк) vs просто весь глоссарий в длинном контексте, и **вредит ли ошибочная инъекция** (тихая деградация).

**Три режима терминологии (WMT25) × baseline — переименованы M0–M3 (D13.4):**
- **M0** без глоссария; **M1** селективная инъекция (наш банк); **M2** полный глоссарий + скользящее резюме (длинный контекст); **M3** случайный/неверный глоссарий (dst перемешан) — **адверсариальная рука, прямой замер тихой деградации**.

**Инъекция M1 = ЗЕРКАЛО Go-горячего-пути** (`backend/internal/pipeline/memory.go` — ИСТОЧНИК ИСТИНЫ). Синхронизировано D13.5 + пакет-2 (07-review §4.5): sticky depth=2 union+reset; until_ch-гейт; span-containment со спойлер-гейтом суппрессора; токен-бюджет+eviction; **sticky-диспозиция НАСЛЕДУЕТСЯ** (D16.2 — collision-prone AMBIGUOUS не апгрейдится sticky'ем в CONFIRMED; Go `memmatch-v3` залендён 09.07); полная вендоренная trad2simp-таблица (508→500 уник., hash-синк + байт-parity self-test); ignorables=Cf+VS-диапазоны; **source-граница фонетических ключей D16.3** (rose⊄roseanne — Latin/Cyrillic только, кросс-скрипт=валидная граница; кана/Han НЕ проверяются — пакет-2 Task 1a) и **апостроф-фолд ‘’ʼ＇→' с обеих сторон** (пакет-2 Task 1b, критично для en→ru руки). Han-скрипт по ВСЕМ плоскостям, significantLen по Unicode-letter (закрыты дельты адверсариального ревью — supplementary-plane имена). На кану source-граница НЕ распространяется (см. kana-precision §6-bis — эмуляция даёт TP 15→1). **При расхождении — верить Go**; parity закреплён `memory_eval.py --self-test` (мирроры Go-тестов TestSourcePhoneticWordBoundary/TestApostropheFold).

**Метрики (три оси раздельно):**
- **(а) консистентность** — decl-осознанная (`eval/pilot/declmetric.py`, pymorphy3 + Go-style stored-decl): одинаково ли рендерится approved-dst во всех чанках, где встречается src. **ОБЯЗАНА быть decl-осознанной** — наивный матч даёт 18–67% ложных флагов (research/14 §2; backend memory_e1_test.go full-decl 0% / base-only 67%). Заодно — **валидация E1-надёжности post-check на РЕАЛЬНОМ корпусе** (жёсткий гейт `postcheck_gate` флипается только после этого замера precision на живых книгах).
- **(б) верность/пропуски — РЕАЛИЗОВАНА (D13.5, была дырой):** LLM-судья ЧУЖОГО семейства против источника (family-guard `family_of(judge)!=family_of(translator)`; mistranslation/omission/addition/wrong_names → JSON). Без неё пред-регистрированное правило «M3 роняет vs M0 по верности» непроверяемо. CometKiwi — опционально и только с оговоркой «на ru-литературе не валидирован» (research/11-gap-2), НЕ подключён.
- **(в) стоимость** — input/output токены по режимам.

**Эхо-контроль (D13.5):** модель эхает глоссарий-преамбулу («ГЛОССАРИЙ … 阿Q → А-кью …») перед переводом; скоринг всего выхода тогда считает эхнутые dst «отрендеренными» → M-режимы завышены, вред M3 занижен (ревью проследил chunk1-M3 надут 0.667→1.0). Теперь: детект преамбулы/source-эха (переиспользован CJK-классификатор refusal_bench) → стрип до тела перевода → **флаг echo_contaminated + исключение из чистого агрегата** (опц. `--regen-on-echo` переспрашивает с усиленным промптом) — не тихий стрип.

**Пред-регистрированное правило решения:** M1≈M2 по качеству но M1 дешевле → банк оправдан; M2≫M1 → нужен полнее контекст; **M3 роняет vs M0 по ВЕРНОСТИ → страх владельца подтверждён, post-check/disposition обоснованы** (и мы их конвертируем в громкое, а не устраняем).

### 6-результаты. Индикатив на Ah-Q (пере-прогнан 2026-07-09 ПОСЛЕ починки; grok-4.20-non-reasoning, судья gemini-2.5-flash, 5 чанков)

| Режим | consistency (decl) | **fidelity (судья)** | in_tok (ср.) | echo |
|---|---|---|---|---|
| **M0** без глоссария | 0.567 | 94.6 | 1155 | 0/5 |
| **M1** селективный банк | **1.0** | 93.4 | 1237 | 0/5 |
| **M2** полный глоссарий | **1.0** | 93.4 | 1260 | 0/5 |
| **M3** неверный глоссарий | 0.467 | **49.0** | 1218 | 0/5 |

**Чтение (все пред-регистрированные правила разрешились чисто):**
1. **M1≈M2** (consistency 1.0=1.0, fidelity 93.4=93.4), M1 дешевле по input (1237<1260; разрыв растёт с полной книжной глоссарией) → **банк оправдан** vs длинный контекст.
2. **M3 роняет ВЕРНОСТЬ: 49.0 vs M0 94.6 (−45.6)** → страх владельца ПОДТВЕРЖДЁН количественно. Судья ловит: 阿Q (А-Кью) отрендерен как «Вэйчжуан» (имя человека → топоним) — модель ПОСЛУШАЛАСЬ неверной инъекции.
3. **Ключевое: M3 consistency (0.467) ≈ M0 (0.567)** — по консистентности M3 выглядит как baseline, вред НЕВИДЕН. Его ловит ТОЛЬКО ось верности → почему её реализация (D13.5) была решающей, а старый харнесс давал ложный «вред меньше».

> **⚠ Старые числа КОНТАМИНИРОВАНЫ, не использовать:** до починки харнесс показывал «C1 1.0 = C2 1.0, C3 0.60» (только консистентность; C3 chunk1 надут эхом до 1.0; оси верности НЕ было). Индикатив на PD-классике из претрейна — предварительный; решающий замер — на вебновелл-корпусе владельца + человеческий BWS.

### 6-bis. Kana-precision (D16-хвост, `eval/pilot/kana_precision.py`, 2026-07-09)

Замер precision матчера на ja-kana ключах при MIN=2/3/4 (вход в прод-ja решение: minKeyLenPhonetic=3 был «консервативным дефолтом до замера»). Trap-корпус (`kana_traps.json`): имена из PD-ja сэмплов (メロス/おさん/…) + коллизии, размеченные по типу (substring vs homograph).

| MIN (substring-матчер = текущий Go) | TP_fire | FP всего | FP substring | FP homograph | **FP CONFIRMED** | precision | conf-precision |
|---|---|---|---|---|---|---|---|
| 2 | 15 | 40 | 26 | 14 | 22 | 0.273 | 0.371 |
| **3 (дефолт)** | 13 | 22 | 8 | 14 | **8** (все len-4, 7 homograph) | 0.371 | 0.429 |
| 4 | 6 | 8 | 1 | 7 | 0 | 0.429 | 1.0 |

> ⚠ **Числа precision — ОТНОСИТЕЛЬНО trap-сета, не корпусные** (ратификация 09.07 §1). `kana_traps.json` — намеренно adversarial коллекция (имена + сконструированные коллизии/омографы), так что `precision`/`conf_precision` здесь измеряют РАЗДЕЛИТЕЛЬНУЮ способность матчера на трудных парах, а НЕ ожидаемую долю ложных срабатываний на реальном ja-тексте (там доля коллизионных контекстов на порядок ниже). Использовать для СРАВНЕНИЯ MIN=2/3/4 между собой (за этим замер и ставился), не как продовую метрику. Корпусный precision — на вебновелл-срезе/приёмке.

**Выводы:**
1. **Подтвердить MIN=3 как дефолт каны.** Он гасит len-2 substring-шум (substring-FP 26→8, precision 0.273→0.371), СОХРАНЯЯ 3-kana имена (メロス/ゼウス/おさん — реальные корпус-имена). MIN=4 даёт conf-precision 1.0, НО роняет recall (TP 13→6 — банит легитимные 3-kana имена, большой класс в ja).
2. **collision-downgrade (≤3→AMBIGUOUS) реально работает:** при MIN=3 len-3 фаерятся AMBIGUOUS (софт, ⟨проверить⟩+forced post-check), CONFIRMED только len≥4 → опасные авторитетные FP = 8 штук len-4.
3. **Потолок precision — класс HOMOGRAPH** (имя == целое частое слово: ひまわり=подсолнух, あさひ=утреннее солнце, ひかる=光る), ДЛИНО-ИНВАРИАНТЕН — MIN-порог его НЕ гасит (это полный substring на любой длине). Митигация ортогональна: POS/known-word гейтинг или требование ruby/kanji-якоря, или даунгрейд kana-only name-ключей в AMBIGUOUS вне зависимости от длины. Вход для B6 — оркестратору/бэкенду.
4. **D16.3 source-граница на кане КАТАСТРОФИЧНА (эмуляция):** TP 15→1 (14 реальных имён подавлены — за именем идёт kana-частица は/が, нет kana-run границы). Бэкенд правильно скоупнул D16.3 на Latin/Cyrillic; **на кану НЕ распространять** (в японском нет пробелов между словами). Замер это подтверждает.

## 7. Think-ON vs OFF (D6, встроено в ядро)

Гипотеза владельца частично подтвердилась локально (羅生門→Радзёмон) + DRT (arXiv:2412.17498). Но COGS: deepseek-reasoning мал, grok-4.3 +25% (эксп.08), Gemini форс. Мерить **по качеству** на draft/translator И editor (не только Terminologist):
- пары think-ON vs think-OFF того же ядра → BWS + судья;
- скоуп think-ON — subset-billing провайдеры (deepseek/glm/kimi, reasoning ⊆ completion); xAI/Grok think-ON только после reasoning-буфера в EstimateUSD (D6.2);
- **вход в решение:** оправдывает ли прирост качества +25% COGS редактора при reasoning ON (эксп.08: grok-reasoning отключается `reasoning_effort:"none"`, дефолт-редактор — off; reasoning-редактура — опция под этот замер).

## 7-bis. Моно-редактор бейк-офф (F8 — доп-рука, из caveat эксп.08:92)

**Зачем:** эксп.04 выбрал grok-4.3 редактором, кормя его **билингвально** (исходник+черновик), но боевой редактор D1 — **моноязычный**; рейтинг grok на моноредактуре **строго не перенесён**, а слепота exp04 была структурно сломана (D13.5-сноска exp04) → выбор ПРОВИЗОРЕН. Отдельная рука — валидировать выбор редактора на РЕАЛЬНОЙ моноязычной задаче:
- **grok-4.3 моно-редактура** (вход = только русский черновик + глоссарий-констрейнты, БЕЗ исходника) vs кандидаты (gemini-3.1-pro-preview, gpt-5-mini, glm-5) на той же моно-задаче;
- крест с think-ON/OFF (§7); метрика — BWS-стиль (§4) + консистентность (§6) + верность через сверку с эталоном;
- **вход в решение:** держится ли ранг grok-редактора при переходе билингв→моно; если нет — перевыбрать редактора Ф1.
- **Инструмент слепоты починен:** `eval/build_editor_artifact.py` теперь рандомизирует метки ПО ФРАГМЕНТУ (соль в ключе) и пишет ключ+цену в ОТДЕЛЬНЫЙ файл (`--key`), не публикуемый до оценки.

## 8. Пре-пасс Annotator (A/B)

Улучшает ли пре-пасс (извлечение терминов/резюме/контекста ДО перевода) качество настолько, чтобы оправдать вызов. A/B на подвыборке: ядро с Annotator-pre-pass vs без. Метрика — та же BWS + консистентность (пре-пасс должен поднимать recall глоссария).

## 9. Пред-регистрация (до финального прогона — против p-hacking)

Зафиксировать ДО прогона **неизменяемым разделом §12**: пороги s\*, допустимый flag-volume на главу (эксп.07: ≥2 excision-флага = fail), decl-метрику и её матчер, состав судейской панели (§5), правило решения memory-eval (§6), N аннотаторов и κ-порог (§4), **MDE/мощность и число BWS-наборов**, правила решения по КАЖДОЙ руке (C0–C3, D13.1 моно-vs-билингв, think, Annotator). Изменения после — отдельным разделом с обоснованием.

## 10. Инструмент человеческой оценки — Pearmut vs своё (вердикт D13.5)

**Оценён Pearmut (arXiv:2601.02933, Zouhar & Kocmi, ETH; MIT, `pip install pearmut`, self-host файловый, verified по GitHub/PyPI 2026-07-09).**

**Вердикт: НЕ брать Pearmut как BWS-движок; строить тонкий свой BWS-тул + красть attention-checks Pearmut.** Три решающих факта:
1. **BWS в Pearmut ОТСУТСТВУЕТ (дилбрейкер).** Его протоколы — DA/ESA/cESA/MQM (скоринг + error-span), НЕ best-worst-из-набора. Наш дизайн (§4) целиком на BWS с рандомизацией меток и агрегацией в ранги — под data-model Pearmut это ломать.
2. **Self-host НЕ различает кандидатов** (все self-host'ятся: Pearmut MIT, Potato, Label-Studio Apache-2.0, Appraise BSD) → приватность/18+ проходят все, решает BWS-fit, где Pearmut проигрывает.
3. **Наша логика тонкая и это то, что важно:** генерация наборов, слепая рандомизация меток, best-minus-worst (Orme) агрегация, κ, **безκ-режим** — ни один тул не даёт их turnkey; несколько сотен строк. Владение = пришпилить пре-регистрацию (§12) в тот же репо + держать две-строгие-оси (стиль/верность) как инвариант.

**Практический путь:** нужен нулевой UI-труд → поднять **Potato** (native BWS-схема; ⚠ лицензия MIT-vs-GPLv3 в источниках расходится — проверить `github.com/davidjurgens/potato/LICENSE` перед принятием) как фронт, свой export→агрегация→κ поверх. Нужен полный контроль слепоты/двух-осей/безκ — писать тонкий харнесс напрямую. В обоих — **украсть attention-checks Pearmut** (Loud/Silent/Tutorial — его самая переиспользуемая идея) + doc-level-context.

## 11. Харнесс `eval/pilot/` (состояние)

**Построено и валидировано:**
- `declmetric.py` — decl-осознанная консистентность (pymorphy3 + Go-style stored-decl); зеркало memnorm.go normalizeTargetForm/containsWholeWord (NFC/dash-fold/ignorable-strip/letter-boundary). Parity-asserts зелёные.
- `memory_eval.py` — WMT25 M0–M3 + **fidelity-ось (cross-family судья) + эхо-контроль + полные выходы + провенанс**; инъекция = зеркало Go D13.5 (self-test 12 инвариантов зелёный; адверсариально верифицирован — faithful, дельты supplementary-plane закрыты). Индикатив пере-прогнан (§6-результаты).
- `kana_precision.py` (+ `kana_traps.json`) — kana-precision MIN=2/3/4 (§6-bis).
- `trad2simp.txt` — вендоренная таблица (508, hash-синк с Go-embed).
- `webnovel_slice.py` — одна команда добора вне претрейна (§2; блокируется корпусом, не падает).

**Нужно достроить (когда есть корпус + аннотаторы):**
- BWS item-generator + агрегатор (наборы, рандомизация, best-minus-worst, κ, безκ-режим) → `bws.py` (или Potato-фронт; §10). attention-checks по Pearmut.
- Судейская панель обёртка (2–3 семейства, 11+ повторов+свап, Bradley-Terry, family-guard, Комиссаров-анкета) → `judge_panel.py`.
- en-якорь-подстрочник pipeline для zh/ja верности.

## 12. Пред-регистрационный каркас (НЕИЗМЕНЯЕМЫЙ; заполнить ДО решающего прогона)

> Заполняется ОДИН раз перед решающим прогоном и не меняется; правки — отдельным датированным подразделом с обоснованием (D13.4).

- **Корпус:** ____ глав, языки ____, ≥8 рекуррентных сущностей: да/нет.
- **Аннотаторы:** N = ____ (≥3 иначе «безκ-режим: да»), κ-порог = ____ (низкий → расширять, не усреднять).
- **Мощность:** число BWS-наборов = ____ под MDE рангов = ____.
- **Судья:** семейства = ____ (2–3), повторов/вердикт = ____ (≥11) со свапом A/B, агрегация = медиана/Bradley-Terry, family-guard: судья ∉ семейства выхода. Валидация = κ vs IAA + tie-rate/top-1.
- **s\*:** порог селектора C2/C3 = ____ (калибр §5).
- **memory-eval:** правило = M1≈M2&дешевле→банк; M3<M0 верность→страх подтверждён; матчер = decl-осознанный (stored-decl primary, pymorphy cross-check); fidelity-судья = ____ (чужого семейства).
- **coverage-гейт:** flag-volume/глава fail-порог = ____ (exp07: ≥2 excision = fail).
- **Правила решения по руке:** C0–C3 = ____; D13.1 моно-vs-билингв = ____ (паритет верности→D1; налог→флип); think-ON/OFF = ____ (+25% COGS оправдан?); Annotator A/B = ____.

## Воспроизведение (индикатив, без корпуса владельца)

```bash
eval/.venv/bin/python eval/pilot/declmetric.py                              # decl-метрика + parity-asserts
eval/.venv/bin/python eval/pilot/memory_eval.py --self-test                 # 12 инвариантов зеркала (без API)
eval/.venv/bin/python eval/pilot/memory_eval.py --dry-run --chapter 6       # инъекция-зеркало + спойлер/until/eviction
eval/.venv/bin/python eval/pilot/memory_eval.py --chapter 6 --max-chunks 5 --regen-on-echo  # индикатив M0–M3 + fidelity
eval/.venv/bin/python eval/pilot/kana_precision.py                          # kana-precision MIN=2/3/4
eval/.venv/bin/python eval/webnovel_slice.py                                # вебновелл-срез (по появлению корпуса)
```
