textmachine/docs/experiments/09-pilot-protocol.md

204 lines
37 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Эксперимент 09. Протокол пилота Фазы 2.5 — выбор ядра, memory-bet, судья, think-режим (v2, D13)
**Дата:** 2026-07-05 · **v2:** 2026-07-09 (поправки D13, починка харнесса, Pearmut-вердикт) · **Зона:** полигон (флагман) · **Статус:** протокол + харнесс (memory_eval починен и валидирован индикативом); решающий прогон ждёт корпус владельца + человеческих аннотаторов.
**Закрывает решения:** выбор ядра C0C3 (Р2), go/no-go на банк памяти (research/13 §Вердикт), валидность LLM-судьи (research/11-gap-3), think-ON/OFF (D6), ценность пре-пасса Annotator (04-unhappy).
Пилот — единственная точка, где сходятся все отложенные «решаемые только человеком» вопросы качества. Он же — **дециждающий эксперимент банка памяти** (ставка не морозится до него, вердикт GO-на-схему был условным).
> **⚠ Разведение имён (D13.4, устраняет коллизию exp09):** **C0C3 = конфигурации ЯДРА** (§3, baseline/draft→editor/generate-select/select-refine). **M0M3 = режимы ТЕРМИНОЛОГИИ memory-eval** (§6, no-gloss/selective-bank/full-context/wrong-gloss). Раньше оба назывались C0C3 — риск путаницы в пре-регистрации; исправлено в доке, харнессе (`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)** — 23 семейства; 11+ повторов со свапом позиций; Bradley-Terry/медиана; grok не судит grok-выходы; валидация судьи — κ vs человеческий IAA + tie-rate/top-1.
- **§6 memory-eval починен (D13.5)** — эхо-контроль, полные выходы, **ось верности реализована**, C0C3→M0M3, зеркало синхронизировано с Go по 7 расхождениям; индикатив пере-прогнан (§6-результаты).
- **§9/§12 Пре-регистрация расширена (D13.4)** — MDE/мощность, N аннотаторов ≥3 (иначе «безκ-режим»), правила решения по каждой руке — неизменяемый каркас §12.
- **§10 Инструмент — Pearmut оценён (D13.5): НЕ берём как BWS-движок** (у него нет BWS), строим тонкий свой + крадём его attention-checks. Вердикт §10.
## 1. Что пилот решает (и почему только он)
| Решение | Почему не решено раньше | Рука пилота |
|---|---|---|
| **Ядро C0C3** (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 +1325% (эксп.08) — стоит ли | think-рука (§7), встроена в ядро |
| **Ценность пре-пасса Annotator** | улучшает ли настолько, чтобы оправдать вызов | A/B в ядре (§8) |
## 2. Корпус (нужен от владельца)
- **2535 глав** реальных произведений с **приватными эталонными переводами** (издательскими или выверенными). GuoFeng V2 — только dev, non-commercial (нельзя в продукт-оценку).
- Покрытие: zh→ru (вебновелла + данмэй), ja→ru (ранобэ), en→ru (роман) — по 812 глав. Диалого-плотные и нарративные главы (см. эксп.07: диалог-плотность — ключевая ось).
- **Рекуррентные имена/термины** обязательны (≥8 сущностей, повторяющихся через главы) — иначе memory-eval нечего мерить.
- **⚠ Методическое ограничение (эксп.04): владелец читает только en/ru.** → человеческая оценка **ВЕРНОСТИ** возможна лишь на **en→ru** (и русская сторона стиля любого перевода). Для zh/ja верность оценивается: (а) **английским якорь-подстрочником** (профессиональный en-перевод как мост), (б) LLM-судьёй чужого семейства против исходника, (в) сверкой с приватным русским эталоном. Заложено в дизайн (§45).
Пока корпуса нет — индикативный прогон на PD-Ah-Q (`eval/pilot/memory_eval.py`) валидирует харнесс и метрики; **вебновелл-срез добора** (r-коэффициенты/эхо/coverage-precision вне претрейна) — `eval/webnovel_slice.py`, одна команда по появлению файлов в `eval/data/samples/webnovel/`.
## 3. Дизайн ядра (C0C3, Р2)
Один и тот же чанк проходит 4 конфигурации ядра, все на ратифицированном стеке (draft=DeepSeek-v4-flash, editor=grok-non-reason):
- **C0 baseline** — один проход переводчика (+ детерминированный глоссарий = уровень VseGPT; baseline метрики, PROGRESS §синтез).
- **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 показал: абсолютные оценки судей плывут, ранги — надёжнее.
- **Единица:** абзац/короткий чанк (не вся глава — усталость аннотатора). Наборы из 34 систем (C0C3, или 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. Обе непроверены на домене → пилот их валидирует, не принимает на веру.
- **Панель — 23 семейства МАКСИМУМ (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 три-режимный; M0M3)
**Вопрос (страх владельца + go/no-go):** оправдана ли ДЕТЕРМИНИРОВАННАЯ селективная инъекция (наш банк) vs просто весь глоссарий в длинном контексте, и **вредит ли ошибочная инъекция** (тихая деградация).
**Три режима терминологии (WMT25) × baseline — переименованы M0M3 (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-осознанной** — наивный матч даёт 1867% ложных флагов (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 268, precision 0.2730.371), СОХРАНЯЯ 3-kana имена (メロス/ゼウス/おさん реальные корпус-имена). MIN=4 даёт conf-precision 1.0, НО роняет recall (TP 136 банит легитимные 3-kana имена, большой класс в ja).
2. **collision-downgrade (≤3→AMBIGUOUS) реально работает:** при MIN=3 len-3 фаерятся AMBIGUOUS (софт, проверить⟩+forced post-check), CONFIRMED только len4 опасные авторитетные FP = 8 штук len-4.
3. **Потолок precision — класс HOMOGRAPH** (имя == целое частое слово: ひまわり=подсолнух, あさひ=утреннее солнце, ひかる=光る), ДЛИНО-ИНВАРИАНТЕН MIN-порог его НЕ гасит (это полный substring на любой длине). Митигация ортогональна: POS/known-word гейтинг или требование ruby/kanji-якоря, или даунгрейд kana-only name-ключей в AMBIGUOUS вне зависимости от длины. Вход для B6 оркестратору/бэкенду.
4. **D16.3 source-граница на кане КАТАСТРОФИЧНА (эмуляция):** TP 151 (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-наборов**, правила решения по КАЖДОЙ руке (C0C3, 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 M0M3 + **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.
- Судейская панель обёртка (23 семейства, 11+ повторов+свап, Bradley-Terry, family-guard, Комиссаров-анкета) `judge_panel.py`.
- en-якорь-подстрочник pipeline для zh/ja верности.
## 12. Пред-регистрационный каркас (НЕИЗМЕНЯЕМЫЙ; заполнить ДО решающего прогона)
> Заполняется ОДИН раз перед решающим прогоном и не меняется; правки — отдельным датированным подразделом с обоснованием (D13.4).
- **Корпус:** ____ глав, языки ____, 8 рекуррентных сущностей: да/нет.
- **Аннотаторы:** N = ____ (≥3 иначе «безκ-режим: да»), κ-порог = ____ (низкий расширять, не усреднять).
- **Мощность:** число BWS-наборов = ____ под MDE рангов = ____.
- **Судья:** семейства = ____ (23), повторов/вердикт = ____ (≥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).
- **Правила решения по руке:** C0C3 = ____; 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 # индикатив M0M3 + fidelity
eval/.venv/bin/python eval/pilot/kana_precision.py # kana-precision MIN=2/3/4
eval/.venv/bin/python eval/webnovel_slice.py # вебновелл-срез (по появлению корпуса)
```