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

37 KiB
Raw Blame History

Эксперимент 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 метрики, §синтез дня-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 показал: абсолютные оценки судей плывут, ранги — надёжнее.

  • Единица: абзац/короткий чанк (не вся глава — усталость аннотатора). Наборы из 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 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-наборов, правила решения по КАЖДОЙ руке (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 = ____.

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

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                                # вебновелл-срез (по появлению корпуса)