textmachine/docs/research/20-bank-mining.md

793 lines
94 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.

# research/20 — Авто-формирование банка памяти книги из черновиков (W1.5 / банк-майнинг)
> **РЕВЬЮ-ШАПКА ОРКЕСТРАТОРА (17.07, лендинг D39.6).** Верификация: **§A-хеш воспроизведён байт-в-байт**
> (awk-команда отчёта → `7687d56a…` MATCH); несущие репо-клеймы спот-проверены по file:line
> (injectivityCollisions `memory.go:809+`, rubyToCandidates `memseed.go:314+`, isFinal-only санитайзер,
> final_hash→сырой-чекпоинт на OK-пути — все сошлись с моим собственным чтением кода); **конфаунд
> глоссарий-инъекции в records.json corroborated** (PROGRESS:151: rerun шёл с selective-инъекцией сида v2) —
> это несущая находка отчёта, cold-start срез в §D обязателен. Внутренняя дисциплина сессии: свой пост-хок
> адверсариал (~50 клеймов, 1 WRONG + 9 IMPRECISE исправлены ДО сдачи), claim-fidelity §A по первоисточникам.
> **Отклонение HOLD-гейта ПРИНЯТО** (запуск прямым указанием владельца; рационал гейта — фокус полигона —
> не нарушен: exp15 ещё не стартовал, полигон-стадия §D по-прежнему гейтится его завершением). Вердикт:
> **ACCEPT**. §E-владельцу (мини-голд алиасов · бюджет ≤$5 · политика канона · жанр-паки · реплика ja→ru)
> вынесены владельцу отдельно; §E-бэкенду — слоты дизайна, НЕ строить до итогов §D (ратифицировано D39.6).
**Сессия-ресёрчер, 2026-07-17.** Исполнение `docs/RESEARCHER_BANK_MINING_SESSION_PROMPT.md` (D39.3).
Не закоммичено — лендит оркестратор.
> **⚠ ОТКЛОНЕНИЕ HOLD-ГЕЙТА (фиксирую честно):** промт требовал запуск ПОСЛЕ пре-рег фриза exp15
> (первый коммит полигон-сессии). На момент старта сессии (2026-07-17) в истории git НЕТ ни одного
> коммита полигон-сессии exp15 и нет `eval/exp15/` (проверено: `git log --oneline --all | grep exp15`
> — только оркестраторские коммиты выдачи промтов; `ls eval/` — папки exp15 нет). Сессия запущена
> прямым указанием владельца («Работай по этому промту»). Рационал гейта — «не разбавлять фокус
> полигона» — работой отдельной ресёрч-сессии не нарушается; полигон-стадия §D по-прежнему гейтится
> завершением exp15 (без изменений). Оркестратору при лендинге: подтвердить, что отклонение принято.
## Протокол анти-анкоринга (как research/18/19)
1. **§A (внешняя фактура) собран ДО чтения репо-стека сверх промта сессии.** Источники — только веб
(WebSearch/WebFetch), мульти-агентно: 6 тем × (ресёрчер → адверсариальный верификатор claim-fidelity
по первоисточникам, author≠reviewer). До заморозки §A из репо прочитано ТОЛЬКО: промт сессии,
CLAUDE.md/MEMORY (системный контекст), `git log`/`ls eval` + греп `exp15` в PROGRESS.md (гейт-чек,
одна строка статуса — не фактура).
2. **Заморозка:** sha256 блока §A — от строки `## §A.` до строки-маркера `<!-- END §A (frozen) -->`
включительно: `awk '/^## §A\./,/^<!-- END §A \(frozen\) -->/' docs/research/20-bank-mining.md | sha256sum`.
Хеш зафиксирован ниже ДО чтения прайор-арта репо.
3. Несущие клеймы §A прошли адверсариальную верификацию исполнением (агент-верификатор фетчил
первоисточники); вердикты CORRECTED/REFUTED отражены в тексте, инфляция рамок срезана.
**§A-хеш (sha256, заморожен до чтения репо-стека):**
`7687d56a9f8a07cff000ef8337ada09435614a93e7e6026c61b7106fe831cf08` (248 строк блока §A;
зафиксирован 2026-07-16T23:01:46Z UTC, до открытия любого файла прайор-арта).
---
## §A. Внешняя фактура (заморожено)
### A0. Метод сбора и статус верификации
Собрано веб-only (WebSearch/WebFetch), 6 тем × независимый ресёрч-агент → адверсариальный
верификатор claim-fidelity по первоисточникам (author≠reviewer; охота на овер-атрибуцию: верное
число не из той статьи, реальный источник с завышенной рамкой). Статус: тема A1 (ATE-ядро) —
первый верификатор вернул заглушку, проведена повторная независимая верификация отдельным
агентом: 9/11 CONFIRMED, 2 CORRECTED (Velardi: 3.2M слов — общий объём коллекции, включая
200k туризма, т.е. ~3.0M вне-доменных; Marciniak: «SOTA 0.59» — овер-атрибуция, 0.59 в статье =
Kappa аннотаторов). Темы A2A6 — 49/54 несущих клеймов CONFIRMED дословно по первоисточникам,
5 CORRECTED, 0 REFUTED. Все цифры ниже — в пост-коррекционном виде.
### A1. Статистическое ATE: меры и измеренный потолок
- **Unithood vs termhood** (Kageura & Umino 1996, Terminology 3(2)): каноническая декомпозиция —
unithood (устойчивость последовательности; PMI/LLR/вложенность) и termhood (доменная
специфичность; контраст с референс-корпусом). $0-экстрактор должен скорить их раздельно.
- **C-value/NC-value** (Frantzi, Ananiadou & Mima 2000, Int. J. Digital Libraries 3(2):115130):
C-value(a) = log₂|a|·f(a) для невложенных; для вложенных — log₂|a|·(f(a) (1/P(Tₐ))·Σ_{b∈Tₐ} f(b)).
Вклад — обработка вложенных многословных термов (дисконт частоты подстроки на среднюю частоту
содержащих кандидатов). Оригинальная оценка (глазная патология, 810 719 слов, порог частоты 3):
+68% precision против частотного ранжирования глобально, +3138% на вложенных кандидатах;
NC-value (0.8·C + 0.2·контекст-веса) добавляет ~5% в топ-интервалах. Всё ниже частоты 3 не
скорится вовсе.
- **PMI-патология** (Church & Hanks 1990, CL 16(1)): сами авторы объявили меру нестабильной и
исключили пары с f(x,y) ≤ 5 — канонический предел снизу. **LLR** (Dunning 1993, CL 19(1)):
count-based MI систематически переоценивает связь редких событий; G²-тест валиден на малых
счётчиках — стандартная замена PMI для низкочастотных кандидатов.
- **Контрастные меры termhood:** weirdness = (w_s/t_s)/(w_g/t_g) (Ahmad, Gillam & Tostevin,
TREC-8 1999) — у контент-слов частота в общем корпусе «low or potentially zero», т.е. OOV-имена
и неологизмы попадают в вырожденный режим бесконечной weirdness (для именного фикшн-майнинга
это скорее эксплуатируемая фича, чем баг — но требует сглаживания). Domain Relevance (нормированная
условная вероятность против контраст-корпусов) + Domain Consensus (энтропия распределения терма
по документам домена) — Velardi, Missikoff & Basili 2001 (ACL W01-1005; контраст ~200k-словного
туристического корпуса против мульти-доменной коллекции ~3.2M слов total, из них ~3.0M
вне-доменных).
- **Измеренный потолок (ACTER/TermEval 2020**, Rigouts Terryn et al., CompuTerm 2020**):** 3 языка
(en/fr/nl), 4 домена, 119 455 аннотаций термов+NE (19 002 уникальных) на ~596k слов. Протокол
против подгонки порогов — кросс-доменный holdout (тюнинг на 3 доменах, финальный скор только на
отложенном heart-failure). Итог: классическая статистическая система (e-Terminology/TBXTools)
F1 ≈ 0.140.21; лучший BERT-классификатор кандидатов 0.467 (en) / 0.481 (fr); Dutch-победитель
0.187. Sequence-labeling XLM-R позже поднял до 0.583 (en) / 0.576 (fr) / 0.698 (nl; трансфер
en→nl), +11.6 F1 против кандидат-классификации в тех же условиях (Lang et al., Findings of
ACL-IJCNLP 2021). Аудит Marciniak, Rychlik & Mykowiecka (Natural Language Processing, CUP;
онлайн 08.2025, том 32/2026): ATE не «решён» и трансформерами — их лучшее 0.58 F1 с NE
(0.46 без NE) на ACTER heart failure, что авторы называют сопоставимым с диапазоном ~0.6;
но режим ошибок инвертирован — трансформеры извлекают редкие в тексте термы (где частотные
меры слепы по построению), а ошибки концентрируются на частых общеязыковых частях термов и
run-to-run нестабильности (+10% трейн-данных иногда значимо ухудшали результат).
- **Калибровка к нашей задаче:** цифры ACTER — для исчерпывающей выгрузки всех термов корпуса
против полной аннотации; банк книги таргетирует существенно более узкий класс (салиентные
повторяющиеся сущности), т.е. это floor-калибровка «чистый статистический ATE = шумный список
кандидатов, не глоссарий», а не прямой прогноз нашего recall/precision.
### A2. Билингвальный терм-майнинг из параллельных пар
- **Статистическое выравнивание слабо именно на zh-en:** fast_align/IBM Model 4 дают AER 44.1/45.8
на FBIS zh-en против ~1017 на fr-en в той же работе (Dyer, Chahuneau & Smith, NAACL 2013).
Нейральные выравниватели втрое лучше: awesome-align — zh-en AER 18.1 без файнтюна / 13.4 с
мультиязычным файнтюном (Dou & Neubig, EACL 2021; тест TsinghuaAligner — с fast_align напрямую
не сопоставим). SimAlign (Jalili Sabet et al., Findings of EMNLP 2020) работает вовсе без
параллельного обучения (en-de F1 0.81 против eflomal 0.76), но **zh-en не оценивался**.
- **Терм-пары из выровненного корпуса:** TExSIS (Macken, Lefever & Hoste 2013, Terminology 19(1)) —
точность выравнивания есть критическая зависимость всего пайплайна; двусторонняя (билингвальная)
фактура даёт precision выше монолингвальной. TermEnsembler (Repar et al. 2019, Terminology 25(1),
en→sl — морфологически богатый славянский таргет): precision >96% на топ-400 ранжированных пар —
верхняя планка ранжированного списка на чистых человеческих параллельных данных.
- **Без выравнивания:** Champollion (Smadja, McKeown & Hatzivassiloglou 1996, CL 22(1)) — Dice
ко-оккуренция, 6578% точности (среднее 73%). Транслитерационный майнинг имён en-zh без
параллельности: фонетика одна — CoreMRR 0.637, корреляция частоты по времени — 0.824,
комбинация — 0.875 (Tao et al., EMNLP 2006) — фонетическое сходство юзабельно только как
вторичный сигнал в комбинации с частотно-распределительным.
- **Comparable corpora — не наш масштаб:** Rapp (ACL 1999): 72% top-1 на 100 словах потребовали
135M+163M слов моноязычных корпусов и сид-словарь 16 380 статей.
- **Сегментация zh — конфаунд:** Chang, Galley & Manning (WMT 2008) — сегментер с более высокой
собственной F даёт худший MT из-за неконсистентной сегментации того же слова по контекстам;
char-level хуже word-level (30.28 vs 32.09 BLEU); оптимальна гранулярность короче CTB (+0.73).
Для новелл сегментация деградирует из-за книго-специфичного словаря сущностей, и майнинг
сущностей улучшает сегментацию (связь двусторонняя — Qiu & Zhang, AAAI 2015, в A4).
- **Русская сторона — лемматизация значима:** морфо-осведомлённое выравнивание даёт наибольший
выигрыш на малых корпусах и простых моделях (IBM-1 AER 27.5→24.8 на 0.5k предложений;
Popović & Ney, COLING 2004) — агрегировать пары надо по леммам таргета.
- **Дыра в литературе:** работ, майнящих терминологию именно из ЧЕРНОВИКОВ MT (не человеческих
референсов), не найдено — «шум черновика ломает/не ломает выравнивание» внешне не установлено.
### A3. Разброс переводов как сигнал — и его слепая зона
- **LTCR** (Lyu, Li, Gong & Zhang, EMNLP 2021): доля совпадающих пар среди C(k,2) переводов
источника, повторённого k раз в документе. Референсы консистентны: 74.24% zh→en (существительные
80.98%; прилагательные 81.77% — формально чуть выше, вопреки прозе статьи), sentence-level NMT —
43.13% (сущ. 50.74%), т.е. **~половина повторных вхождений переводится по-разному** уже на
новостном корпусе (LDC2015T06).
- **One translation per discourse** (Carpuat, SEW-2009): в человеческих переводах >80% лемм имеют
один перевод на документ, >98% — не более двух; нарушения гипотезы «can reveal lexical choice
errors» (предварительное исследование, не масштабная валидация).
- **Слепая зона задокументирована** (Carpuat & Simard, WMT 2012): (1) ~40% неконсистентно
переведённых типов фраз вовсе не потребовали постредактуры — benign-вариативность, т.е.
ложноположительные для детектора; (2) более слабая zh-en система (23.6 BLEU) оказалась БОЛЕЕ
консистентной, чем сильная (27.2) — «consistency can signal a lack of coverage»: **стабильность
≠ правильность, стабильно-неверный перевод структурно невидим для сигнала разброса**.
Дополнительно LREC-COLING 2024 (310 статей zh→en): аннотаторам пришлось делить консистентность
на true/false — наивный детектор «тот же источник ⇒ тот же перевод» систематически оверфлагает.
- **Именно на вебновеллах сигнал обилен:** DelTA (Wang et al., ICLR 2025, arXiv:2410.08143) вводит
LTCR-1 (совпадение с ПЕРВЫМ переводом имени собственного в документе): sentence-by-sentence
LLM-бейзлайны на GuoFeng zh→en — 37.00 (Qwen2-7B) / 58.00 (Qwen2-72B) / 58.82 (GPT-4o-mini) /
61.58 (GPT-3.5), т.е. **3863% повторных упоминаний имён расходятся с первым переводом**; память
имён поднимает до 85.588.9 и улучшает COMET (+3.14/+3.16). Издержка неверного первого перевода
НЕ измерялась; пост-хок глобальная реконсиляция НЕ тестировалась.
- **Жанровая валидация класса ошибки:** WMT23 Discourse-Level Literary Translation (GuoFeng
Webnovel: 1.9M пар, 179 новелл, 22.6K глав, 14 жанров; Wang et al., arXiv:2311.03127) кодифицирует
«Terminology / Inconsistent» как MQM-класс с примером 斗罗大陆 → «Douluo Land» в первых главах,
затем «Soul Land». WMT24 добавил zh→ru (GuoFeng V2: 122 книги, ~20.0K глав, 23.5M слов; цитировать
arXiv:2412.11732 — ACL-версия усечена), но zh-ru «референсы» = GPT-4 doc-level + человеческая
пост-редактура, и human error-analysis для zh-ru не проводился — опубликованной энтити-эмпирики
zh-ru вебновелл НЕТ.
- **Метрики терм-точности WMT** требуют готового словаря: WMT21 — lemmatized exact match, window
overlap, 1-TERm; WMT23 — fuzzy search с порогом 90% (регэксп-матчинг явно отвергнут, лемматизация
не описана) + предостережение: выигрыш от словаря сопоставим с «утечкой» эквивалентного объёма
информации из референса (Semenov et al., WMT 2023).
- **Контекст уменьшает, но не убирает:** Karpinska & Iyyer (WMT 2023): paragraph-level LLM-перевод
даёт меньше mistranslations/стилевых инконсистентностей, чем sentence-level, но критические
ошибки (включая пропуски) остаются (18 языковых пар, литературные фрагменты).
- **Дыра в литературе:** «стабильно-неверный перевод редких неологизмов» (класс 蛊→«гусеницы») как
отдельно изученный феномен не найден — ближайшее это generic rare-word/NE-mistranslation и
hallucination-детекция; готового внешнего решения для слепой зоны (г) нет.
### A4. NER на литературном zh/ja
- **Трансфер news→fiction проваливается с числами:** LitBank (Bamman, Popat & Shen, NAACL 2019):
ACE/news-модель 45.7 F1 на литературе vs 68.3 при in-domain обучении (>20 пунктов). Китайские
новеллы (Zhao et al., arXiv:2311.15509: 260 новелл, 13 жанров, 263 135 сущностей): in-domain
BERT-BiLSTM-CRF MicroF1 86.73 (PER 87.72 / LOC 85.41 / ORG 79.09), но People's Daily→новеллы —
MicroF1 42.91 и **ORG F1 0.47%**; OOV LOC даже in-domain — 31.63. Кросс-жанрово тоже лосси
(ORG на Reality: 39.13 при обучении на Xianxia vs 31.44 на Wuxia). GenWebNovel (Zhao et al.,
COLING 2025; 400 глав, XuanHuan/History): сущности между жанрами «share few overlaps».
- **Инструменты из коробки — news-trained и без фикшн-цифр:** HanLP zh-NER — все модели MSRA
(in-domain F1 95.16, фикшн не мерился); spaCy zh_core_web_lg — OntoNotes 5, ENTS_F 71.39
in-distribution. Т.е. деградация на новеллах у вендоров не измерена, выводится из трансфер-работ
выше.
- **Правила для китайских имён — высокий recall:** surname-anchored правила + статистика
(Cao et al., ISCSLP 2002): P 83.66 / R 93.50 (⚠ мягкие числа: внутренняя арифметика статьи
неконсистентна, тест — People's Daily, не фикшн; но класс «фамильный якорь + bound words»
как high-recall PERSON-канал поддержан). Структура эксплуатируема кодом: инвентарь фамилий
(百家姓), титулы/гоноративы-суффиксы (公子/大人/前辈/长老), префиксы 老/小/阿 + порядковые.
- **Сегментация ↔ сущности связаны** (Qiu & Zhang, AAAI 2015): сегментация деградирует на новеллах
из-за книго-специфичного словаря; майнинг именных сущностей (double-propagation) и подача их в
news-сегментер значимо улучшает точность, особенно OOV, на 5 новеллах.
- **Японский:** GiNZA v5 — NER обучен на GSK2014-A (BCCWJ-издание БЕЗ газетных документов, т.е.
книжные регистры в трейне), ENE 53.970.8 по вариантам; фикшн-детекция персонажей — активная,
но proceedings-уровневая область (ANLP 2024, D3-6, Нагоя).
- **Малые локальные модели:** GLiNER (50M300M; NAACL 2024) бьёт ChatGPT zero-shot на en OOD
(60.9 vs 47.5 avg F1), но **zh MultiCoNER — всего 24.3 (мульти-вариант) / 6.59 (en-вариант)**
не дроп-ин для китайского источника. UniversalNER 7B/13B (ICLR 2024): avg zero-shot F1 41.7/43.4
vs 34.9 у учителя gpt-3.5-turbo (43 датасета; «79 пунктов» аннотации покрывает оба размера).
### A5. Кластеризация алиасов персонажей
- **BookNLP: правила только для PROP-слоя, by design.** Генерация допустимых вариантов имени
(Mr. Tom Sawyer → Tom/Sawyer/Mr. Sawyer/…) + жадная привязка к последней активной сущности
(Bamman, Underwood & Smith, ACL 2014); common NP (титулы/эпитеты «the boy») в именные кластеры
НЕ мержатся — полная свободная кореференция на масштабе книги «tends to erroneously conflate
multiple distinct entities into one» (README BookNLP; собственный coref avg F1 76.4/79.0).
~74% упоминаний персонажей в книгах — местоимения (82.7% точность их резолюции, 10-fold CV).
- **Мера масштаба слепой зоны:** в LitBank-кореференции (Bamman, Lewke & Mansoor, LREC 2020)
PROP-упоминания — лишь 12.2%, NOM (титулы/эпитеты/роли — класс «四代族长») — 33.5%, PRON — 54.3%.
Строковые правила по построению достают только PROP-слой. Потолки кореференции: OntoNotes-модель
теряет 10.3 пункта на литературе (83.2→72.9 gold mentions); in-domain LitBank — 79.3 (gold) /
**68.1 (predicted mentions, end-to-end)**.
- **Прецизионно-безопасный инвентарь правил** (Vala, Jurgens, Piper & Ruths, EMNLP 2015): графовый
алиас-резолвер — стриппинг гоноративов, газеттир гипокоризмов (1 859 форм / 560 имён), и главное
НЕГАТИВНЫЕ констрейнты (разный инференс-пол; общая фамилия при разных именах; разные гоноративы;
ко-презенция в сочинении/диалоге ⇒ не мержить). P&P: F1 0.758 vs BookNLP 0.502. Ролевые
референты («the governor») потребовали отдельного bootstrap-этапа (2 073 глагол-зависимостных
пар) — и это только ДЕТЕКЦИЯ, не привязка к именованному персонажу.
- **Линк-метрики льстят кластеризации:** rule-sieve кореференция на 48 немецких новеллах (Krug
et al., CLfL@NAACL 2015): MUC F1 85.5 — но entity-level B³ лишь 56.0; крупнейший класс ошибок
(37%) — «semantic errors», требующие знания мира (ровно класс титул-идентичности). Их
fuzzy-дистанция для прозвищ — прецизионно-рисковый проход.
- **zh-новеллы: оценённого бейзлайна не найдено.** Характерная работа (Fan & Li 2022, Comput.
Intell. Neurosci.: 红楼梦 265 персонажей, 三国演义 1 133, два романа Цзинь Юна) мержит
姓名/绰号/简称 неоценёнными ручными правилами — P/R алиас-мержа не репортится (обобщать «нигде
в литературе нет» нельзя, но в найденном — нет). Ближайший якорь: in-domain NER китайской
литературы (Xu et al., arXiv:1711.07010) — Person F1 85.00 (CRF-эра).
- **$0-строковое сходство:** канонический бенч имён (Cohen, Ravikumar & Fienberg, KDD-WS 2003):
SoftTFIDF «best overall», но ранжирование датасето-зависимо (на census Levenshtein 0.832 >
SoftTFIDF 0.685) — метрику без валидации не выбирать; для коротких CJK-строк токенные компоненты
вырождаются в перекрытие иероглифов (наш вывод, не источника).
### A6. LLM-ATE, гибриды, консолидация
- **LLM ≈ но не > файнтюн-PLM на ATE:** промптед 79B с retrieval few-shot — до F1 60.2 (Gemma-2)
на кросс-доменном ACTER vs RoBERTa-large 61.2; in-domain PLM выше (Findings of ACL 2025,
arXiv:2506.21222). На редких литературных сущностях (Zibaldone, arXiv:2505.20113): файнтюн-GLiNER
68.98 vs LLaMa3.1-8B generative 30.71 — **LLM-ICL вдвое хуже файнтюна компактной модели**.
- **Порядок «high-recall код → LLM-фильтр» поддержан, но слабо:** RATE (arXiv:2507.21125):
кандидаты с высоким recall + LLM-валидация по мульти-дефинициям — F1 91.27 vs BERT 53.73
(голд всего 70 статей, BCI+XR — сигнал о порядке стадий, не переносимая цифра).
- **Иерархическая консолидация > инкрементальной — с оговорками:** BooookScore (Chang, Lo, Goyal
& Iyyer, ICLR 2024; 100 книг, 1 193 аннотации): когерентность GPT-4 89.1 (hierarchical) vs 82.5
(incremental), НО по детальности инкрементальная предпочтена 83% vs 11% (overall — лишь 54/44,
и Claude-2 на 88K-чанках — исключение: 90.9 incremental). Мерилась когерентность САММАРИ —
к реконсиляции глоссария переносится аналогией, с явным recall-риском на верхних уровнях мержа.
- **First-wins работает онлайн, пост-хок реконсиляция не проверена:** DelTA (см. A3) фиксирует
первый перевод имени и этим ПОДНИМАЕТ и консистентность, и COMET — но цену неверного первого
выбора не мерил никто, и глобальный пост-хок пересбор не тестировался. Внешней эмпирики
«глобальная реконсиляция качественно бьёт first-wins» НЕТ — это остаётся нашей проверяемой
гипотезой, а не заимствованным фактом.
- **In-band разметка от переводчика не валидирована внешне:** опубликованных воркфлоу, где
переводчик-LLM сам эмитит терминологические сноски in-band с измеренными echo/leakage-рейтами,
не найдено. Ближайшее предостережение: жёсткие форматные констрейнты измеримо деградируют
качество генерации, чем строже — тем хуже (Tam et al., EMNLP 2024 Industry, arXiv:2408.02442).
Инжекция терминологии в MT (Dinu et al. 2019 и линия WMT21) — про ВХОД, не про эмиссию.
- **Дыры:** количественного hallucinated-term rate для LLM-ATE на ACTER не найдено (только
качественные упоминания); prompt-sensitivity-исследования ATE существуют (TSD 2024, LlamATE),
но их дельты за пейволлом — не верифицированы.
### A7. Сводка ориентиров для дизайна (из внешней фактуры)
1. Чистый статистический ATE даёт шумный список кандидатов, не глоссарий: на честном кросс-доменном
протоколе статистика = F1 0.140.21, и даже SOTA seq-labeling ~0.580.70. Но это floor-калибровка
исчерпывающей выгрузки; таргет «салиентные повторяющиеся сущности книги» заведомо легче.
2. Частотные меры структурно слепы к редкому (C-value порог 3, PMI f≥5): редкие алиасы и
одноразовые реалии — не их зона; там нужны паттерны/seq-labeling/сигнал разброса/LLM.
3. Сигнал разброса переводов внешне валидирован и на вебновеллах обилен (3863% повторных имён
расходятся с первым переводом; MQM-класс WMT23). Его две измеренные слабости: ~40%
инконсистентностей benign (оверфлаг) и полная слепота к стабильно-неверному переводу.
4. NER news-инструменты на новеллах рушатся (ORG 0.47%); правила «фамильный якорь + титульный
суффикс» — high-recall PERSON-канал; OOV-реалии (LOC/ORG/артефакты) — главная дыра recall.
GLiNER — не дроп-ин для zh (24.3); UniversalNER-класс (7B+) на грани 8GB-GPU.
5. Кластеризация алиасов распадается на два слоя: PROP-слой (общие иероглифы/токены, титул-стрип,
негативные констрейнты) — решаемо правилами с известной ошибкой; zero-overlap слой (титулы,
эпитеты, «四代族长») — NOM-класс, за пределами строковых правил by design, кореференция
end-to-end ~68 F1 in-domain и хуже кросс-доменно.
6. Для zh-ru пар: статистическое пословное выравнивание слабо на zh-* (AER 4446), нейральный
выравниватель или co-occurrence (Dice) предпочтительнее; сегментация zh — конфаунд; русскую
сторону агрегировать по леммам (наибольший эффект именно на малых корпусах).
7. Иерархическая/глобальная консолидация поддержана аналогией (BooookScore) с recall-оговоркой;
first-wins-банк уже помогает онлайн (DelTA), но превосходство пост-хок реконсиляции над
first-wins эмпирически не установлено нигде — требует нашей собственной проверки.
8. Гибрид «дешёвые high-recall кандидаты кодом → дорогая точная фильтрация» согласуется с внешней
фактурой (RATE; инверсия ошибок статистика↔трансформеры у Marciniak 2025: они закрывают слепые
зоны друг друга). Малая локальная модель как экстрактор/фильтр валидна для en, для zh —
без in-domain адаптации не подтверждена.
9. In-band сноска переводчика — внешне не валидированный канал; форматные констрейнты имеют
измеренную цену качества. Echo/leakage-рейты придётся мерить самим.
<!-- END §A (frozen) -->
---
## §B. Дифф §A↔репо · варианты детектора · алиас-кластеризация · канал сноски
### B0. Дифф внешней фактуры и репо
**Что в репо уже есть (сторона ПОТРЕБЛЕНИЯ банка — построена и захардена):** детерминированный
матчер Aho-Corasick по нормализованным src+алиасам (`memory.go:535-635`, floors Han≥2/фонетика≥3
`memory.go:57-69`), трёхходовая диспозиция CONFIRMED/AMBIGUOUS/REJECT (`memory.go:89-93`),
trust-gated longest-match (memmatch-v4, `memory.go:699-724`), статусы `auto|draft|approved` с
фейл-лаудами на полисемию/коллизии ключей (`memseed.go:161-181, 201-237`), пост-чек с
decl-формами (`mempostcheck.go:77-117`), телеметрия retrieval_state. **И готовый ja-аналог
майнинга:** ruby→auto-кандидаты (`memseed.go:314-359`) — детерминированная генерация, класс-хинт,
`status=auto` без dst (в автомат не входит — инертно), промоушен только через гейт
(батч-судья/человек), никогда автоматически. Майнинг zh из
черновиков — ровно недостающий зеркальный канал; его выход ложится в СУЩЕСТВУЮЩУЮ схему
(`store.GlossaryEntry`: Source, Confidence, RubyClass-аналог — `store/glossary.go:18-48`) без
изменения дисциплины сида.
**Дифф по пунктам:**
| Внешняя фактура (§A) | Репо | Следствие для дизайна |
|---|---|---|
| Статистический ATE исчерпывающе слаб (F1 0.140.21 кросс-доменно), но наш таргет — узкий класс салиентных повторяющихся сущностей (§A1) | Сид v2 = 57 термов на 25 глав; ~62.5% document-level ошибок вебновелл — сущности/термины, все банко-адресуемы (research/19:559-568) | Гипотеза №1 владельца правдоподобна именно из-за узости таргета; мерить против сида, не против «всех термов корпуса» |
| Сигнал разброса валидирован: 3863% повторных имён расходятся с первым переводом на вебновеллах (§A3) | records.json: 57 чанков (source, draft, final), черновики deepseek-v4-flash | ⚠ КОНФАУНД: черновики генерились С инъекцией сида (budget 800, `pipeline-rerun.yaml:19-24`) — разброс на GT-термах подавлен самим банком; см. §D-поправку (cold-start срез) |
| Слепота разброса: ~40% инконсистентностей benign; стабильно-неверный невидим (§A3) | Реестр рисков это предвидел: B1 «first-wins порождает drift» ❌, F5 коррелированный судья (`06-memory-risk-registry.md:36,77`) | Зона (г) без внешнего готового решения — нужна своя эмпирика; спред-сигнал = recall-канал, не пруф корректности |
| Алиасы: правила достают только PROP-слой; zero-overlap = NOM-класс вне правил by design (§A5) | B3 реестра: типизированный alias-граф + name-tables; сид хранит алиасы как поверхности терма (2 fullname-алиаса всего) | Двухъярусная граница §B2; ГТ алиасов в сиде ТОНКИЙ (2 шт.) — для замера а-бис нужен мини-голд (§E-1) |
| Выравнивание: статистическое слабо на zh (AER 4446), нейральное лучше; лемматизация ru-стороны критична на малых корпусах (§A2) | Пар (source, draft) на чанк уже даёт грубое выравнивание бесплатно (границы чанков); exp06: спот=локаль/рендер=облако+таблица Палладия (G1, `06-memory-risk-registry.md:83`) | Для книги хватает чанк-уровневой ко-оккуренции (Dice/LLR) + Палладий-детектор на ru-стороне; пословный алайнер — оверкилл, в дизайн не тащим |
| Пост-хок реконсиляция vs first-wins эмпирически НЕ доказана внешне (§A6) | research/19:550-553 выводит W1.5 из LTCR-отравления + BooookScore (аналогия) | Честный статус: W1.5-превосходство — НАША проверяемая гипотеза; §D меряет её суррогат (canon-recovery) |
| LLM-ATE ≈ но не > файнтюна; гибрид high-recall-код → LLM-фильтр поддержан слабо (RATE) (§A6) | exp06: локальный спот recall 0.981.0, halluc 0 ($0 на стенде); рендер zh локально 0.26 | Маршрут зон (г): локальная 9B = верификатор/споттер, облако = рендер/адъюдикация топ-N, человек = подпись (§B4) |
| In-band разметка от переводчика внешне не валидирована; форматные констрейнты имеют цену (§A6) | Санитайзер v6: trailing-note класс — прямой блокер (`sanitizer.go:236-251` worktree); прецеденты: gloss-whitelist v6, derived-checkpoint `tm-sanitized-v1` (`stagerun.go:225-242`) | Канал сноски проектируем как «срез кодом ДО всех гейтов + derived checkpoint» (§B3); echo/parse-rate мерим сами (§D-арм) |
| H15-рычаги: query-time context-recording и жанр-кондиционирование нигде не диспозиционированы | Жанр есть только как brief-var перевода (H15-верификатор, `08-sync-audit-ledger.md:473`) | Детерминированная версия обоих рычагов встроена в §C: KWIC-контексты в evidence-карту кандидата; жанровые лексикон-паки как конфиг детектора V-C |
| Web-fetch тир для трудных термов (V4-п4) | За trust boundary D25.5 (Ф3), `05-decisions-log.md:311` | В схеме кандидата — флаг-слот `needs_external_lookup`, НЕ строим |
### B1. Три варианта детерминированного детектора (арм-лестница для §D)
Общий субстрат всех вариантов ($0, Go или Python-полигон): кандидаты = **символьные n-граммы
16 Han** по источнику (НЕ пословная сегментация — она сама деградирует на новеллах и вносит
конфаунд, §A2/Qiu&Zhang; вложенность разруливаем c-value-дисконтом; ⚠ для |a|=1 длиновой
множитель log₂|a| вырожден в 0 — использовать log₂(|a|+1) либо чистый частотный nested-дисконт
без длинового множителя, иначе одночарные кандидаты (蛊, 转) зануляются и катастроф-скрин §D4-в
непроходим by construction; вдобавок вхождения 蛊 почти всегда вложены в 蛊师/蛊虫/月光蛊 —
nested-дисконт по нему бьёт сильнее всех, скрин это специально проверяет), нормализация
memnorm-симметричная (`memnorm.go:104-124`); частотный floor=3 (§A1: ниже — не скорится, это
осознанная слепота варианта, закрываемая V-C-паттернами и зоной (г)); подсчёт вхождений
GT-термов — Aho-Corasick БЕЗ suppressContained (урок D24.2: вложенный алиас не должен
проглатываться при подсчёте).
**V-A «частотно-контрастный минимум».** Сигналы: freq × контраст с общим zh-корпусом
(weirdness-класс, §A1; референс — открытый частотник zh, версионируется как артефакт детектора)
× c-value-дисконт вложенных n-грамм × LLR вместо PMI для редких (§A1: PMI нестабилен при f≤5).
Выход: ранжированный список src-кандидатов без dst. Порог: top-K + floor.
- Ожидание по §A: высокий recall на частотном ядре (蛊师/古月/元石-класс), шум на частых
свободных сочетаниях; редкое и zero-overlap — мимо; dst не даёт.
**V-B = V-A + разброс переводов в черновиках (новый сигнал пакета).** Для каждого кандидата X:
чанки-вхождения {i}; на ru-стороне черновиков этих чанков ищем сверхпредставленные (Dice/LLR
против остальных чанков) леммы/биграммы — лемматизация ru обязательна (§A2 Popović&Ney;
pymorphy3 на полигоне); доминантный кандидат-рендеринг на чанк → LTCR-стиль разброс между
чанками. Скор V-B = V-A-скор × (1 + λ·spread). Выход дополнительно: **список dst-вариантов с
частотами** — сырьё канона §C.
- Ожидание по §A: +recall на сущностях, которые модель переводит нестабильно (3863% имён);
оверфлаг benign-вариативности (~40% внешне) — режется на консолидации, не в детекторе;
слеп к стабильно-неверному (зона Z1). Спец-мицигация вездесущих термов (方源 почти в каждом
чанке — контраст «чанки с X vs без X» вырождается): внутричанковое пропорциональное
выравнивание предложений (черновик идёт по порядку источника — грубое соответствие
предложение↔предложение достаточно для со-оккуренции).
**V-C = V-B + NER-паттерны и структурная морфология (жанровый рычаг).** Каналы: (1) фамильный
якорь — инвентарь 百家姓 + окно 12 Han справа (§A4 Cao: high-recall PERSON); (2) титульные
суффиксы/префиксы (公子/大人/长老/前辈/族长/嬷嬷; 老/小/阿/порядковые 四代-класс); (3)
топо-суффиксы (山/寨/村/疆/谷); (4) **продуктивная морфология книги**: Han-символ, комбинирующийся
с ≥m разными n-граммами (蛊 в 蛊师/蛊虫/月光蛊… — авто-обнаружение доменного форманта, не
хардкод 蛊); (5) **Палладий-детектор на ru-стороне**: токены черновика, распознаваемые
слог-таблицей Палладия (фан/юань/гуюэ…) = модель сочла это именем → обратный маппинг в
источник-чанк (высокоточный спот имён С ГОТОВЫМ dst-вариантом); (6) жанровый лексикон-пак как
конфиг (сянься/уся/исекай-паки суффиксов; детерминированное жанр-кондиционирование = H15-рычаг).
Кандидаты типизируются (name/title/place/term) — ложится в поле `type` сида.
- Ожидание по §A: закрывает частотно-слепые классы (редкие алиасы с фамильным якорем,
одноразовые реалии с типовым суффиксом); цена — инвентари правил (поддержка) и точность
паттернов; zh-специфично by design (для ja уже есть ruby-канал — паритет архитектурный).
**Trade-off таблица (ожидания до замера; recall/precision — предмет §D, не обещание):**
| Критерий | V-A | V-B | V-C |
|---|---|---|---|
| Ожид. recall на сиде (частотное ядро) | средний | средний+ | высокий |
| Ожид. recall на редком (f<3) | ~0 | ~0 | частичный (паттерны) |
| Ожид. precision топ-списка | низк.-средн. | средняя (спред режет случайные фразы) | средняя+ (типизация) |
| Даёт dst-кандидатов | нет | да | да (+Палладий-канал) |
| Сырьё для алиас-кластеров | нет | ru-сторона (общий рендеринг) | обе стороны |
| Сложность/поддержка | ~1 экран кода | +лемматизация ru, +выравнивание | +инвентари правил, жанр-паки |
| Хрупкость порогов | 2 порога (floor, top-K) | +λ спреда | +m форманта; пороги паттернов булевы (устойчивее) |
| Зависимости | частотник zh | +pymorphy3 | +百家姓/суффикс-листы (версионируемые файлы) |
| Слепые зоны | редкое, стабильно-неверное, zero-overlap, полисемия | те же минус нестабильное | остаются Z1, Z2, Z4, Z5; Z3 частично (якорные редкие закрыты паттернами) B4) |
Выбор по данным §D (армы A1A3), не по элегантности; V-C прайор фаворита (единственный
закрывает частотную слепоту), но если V-A/V-B дают 90% его recall на сиде побеждает простота.
### B2. Алиас-кластеризация — отдельная подзадача (а-бис): честная граница
Кластер = сущность сида с алиас-поверхностями (модель данных уже такова: research/19:189-195
«кластеры алиасов на СУЩНОСТЬ», `entryFiringKeys` `memseed.go:243-261`). Три яруса:
**Ярус 1 — код (PROP-слой, прецизионно-безопасные правила):**
- R1 «вложение поверхности»: X строго содержится в Y при |X|≥2 (方源 古月方源) предлагает
ребро «fullname/расширение»;
- R2 «фамильный якорь + композиция»: общий фамильный префикс из инвентаря ( в 方源/方正/方公子)
предлагает СЕМЕЙНЫЙ суперкластер, НЕ тождество;
- R3 «общий рендеринг ru-стороны»: разные src-поверхности с одинаковой доминантной леммой
рендеринга в черновиках (古月方源 и 方源 оба «Фан Юань») сильное ребро тождества;
обратный GROUP BY dst уже существует как диагностика (`memory.go:809-834`);
- R4 НЕГАТИВНЫЕ констрейнты (перенос Vala §A5, адаптация zh): (i) общая фамилия + РАЗНЫЕ имена
НЕ мержить (方源方正 ровно наш кейс; 方公子 остаётся амбигуальным членом семейного
суперкластера до яруса 2/3); (ii) разный подтверждённый пол; (iii) разные approved dst;
(iv) ко-презенция в одном предложении/диалоговом обмене НЕ мержить (детектится по
source-чанку $0); (v) титул-вложение при разных dst сида (族长 四代族长) разные сущности
негативный урок уже оплачен (D38 §3, `05-decisions-log.md:499`).
- Ожидаемая ошибка яруса: по внешним якорям (Vala P&P F1 0.76 на свободном тексте; у нас проще
закрытый список кандидатов, не весь текст), но мерить entity-уровнево (B³-класс), НЕ
парно-линковым MUC: внешний урок Krug (MUC 85.5 при B³ 56.0) линковые метрики льстят.
**Ярус 2 — слепая зона (г), LLM/локаль:** алиасы с нулевым поверхностным пересечением И без
общего рендеринга: чистые титулы-в-роли-референции (四代族长 как сущность сцены), эпитеты,
прозвища класса 花酒行者→«Монах Цветочного Вина» (dst-сторона вообще не транслитерационная),
ру-сторонние описательные алиасы четвёртый Фан»-класс). Это кореференция A5: NOM-слой,
end-to-end ~68 F1 даже in-domain en) код может только ПРЕДЛОЖИТЬ кандидатов на связь
(со-оккуренция в окне + согласование типов) с явной меткой `link_evidence:weak`. Дёшево ли
это детектится локальной 9B неизвестно (exp06 мерил экстракцию, не кореференцию) §D-A6b.
**Ярус 3 — человек:** подпись кластера при W1.5-консолидации; спорные рёбра остаются
раздельными draft-записями (дисциплина сида: дешевле расклеить два терма потом, чем расщепить
один ошибочно слитый мерж только по подписи).
**Гэп ground truth:** в сиде v2 всего 2 алиас-поверхности (古月方源, 古月方正) recall
кластеризации на таком голде не меряется. §D предусматривает мини-голд алиасов от владельца
E-1); без него ярус-1 меряется только по precision предложенных рёбер.
### B3. Канал «сноска переводчика» (б): спека и ВСЕ интеграционные точки
**Формат (banknote-v1, версионируется):** после перевода строка-разделитель
`⟦TM-BANK-v1⟧` (не встречается в естественном тексте; НЕ слова «Примечание/Сноска» они
зарезервированы trailing-note классом санитайзера), далее N строк `src<TAB>dst<TAB>type`.
Инструкция в промпте: только НОВЫЕ термины, отсутствующие в инжектированном глоссарий-блоке;
нет новых разделитель не эмитится вовсе.
**Срез КОДОМ на границе волны — точка и механизм:** parse+strip сразу после получения ответа
модели в стадии draft, ДО classify()/санитайзера/coverage/пост-чека (`chunkrun.go:32-80`).
Чекпоинт с сырым ответом сохраняется как есть (детерминизм оплаченного байта), очищенный
черновик derived-checkpoint по прецеденту `tm-sanitized-v1` (`stagerun.go:225-242`):
`tm-banknote-v1:` + sha256(reqHash + stripped); распарсенные кандидаты отдельный
артефакт-файл (evidence-карты §C), НЕ в store до W1.5.
**Интеграционные точки (все, по мандату D39.3):**
1. **Санитайзер, класс trailing-note** (`sanitizer.go:232-268` worktree): важное уточнение
санитайзер по draft-стадии не гоняется ВОВСЕ (isFinal-only, `chunkrun.go:48`), так что
trailing-note класс лишь ВТОРОЙ рубеж на финале, если редактор протащит остаток
малформенного блока (модель написала «Примечание:» вместо разделителя). Первый рубеж
телеметрия п.10: `banknote_parse_fail` обязан флагать резидуал ДО редактуры, иначе
черновиковый мусор доходит до редактора незамеченным.
2. **Санитайзер, класс cjk_leak (v6):** src-колонка сноски Han по построению; без среза
каждый чанк с блоком флагался бы. После среза чистый черновик блока не содержит;
gloss-whitelist v6 не трогаем.
3. **classify()/echo-детект** (`disposition.go:268-289`, порог cjkShare 0.15): считать по
ОЧИЩЕННОМУ тексту. По сырому: ~10 строк × 26 Han 3060 Han на ~4000-знаковый черновик
12% под порогом, но короткий чанк + жирный блок может ложно флагаться как echo.
Порядок жёсткий: срез classify(stripped).
4. **Coverage-гейт** (`coverage.go:158-203`; translator-only энфорсится в `chunkrun.go:64-75`):
числитель len_ratio по очищенному тексту (сноска перевод, в числитель не входит);
sent_cov не затронут; знаменатель (source) не меняется.
5. **max_tokens-сайзинг** (`stagerun.go:82-99`): +бюджет блока (≤N строк × ~12 ток). Перевод
идёт ПЕРВЫМ, блок хвостом трункация бьёт по блоку, не по переводу; парсер обязан
толерантно обрезать недописанную последнюю строку и флагать `banknote_truncated` (лауд).
6. **request_hash/детерминизм** (`render.go:221-251`): инструкция сноски часть промпта
prompt SHA256 + константа `banknote-v1` фолдятся в снапшот (`snapshot.go:96-234`) включение
канала = громкий --resnapshot, как любой wire-инвариант. Парсер детерминированный
версионированный код; derived-hash неймспейсит версию.
7. **Чекпоинт/резюм** (`stagerun.go:66-80`): resume передоказывает derived-артефакты из сырого
чекпоинта бесплатно (прецедент sanitized_export).
8. **«Редактор её не видит»:** на свежем прогоне редактор читает in-memory текст предыдущей
стадии (`chunkrun.go:162`) хук подменяет его на очищенный; НО на chunk_status-резюме
стадия N+1 берёт текст чекпоинта по final_hash, а для OK-пути final_hash сегодня указывает
на СЫРОЙ attempt-чекпоинт (`stagerun.go:168-169`; re-point на derived существует только для
flagged-пути, `stagerun.go:170-185`). Требование спеки: **final_hash OK-стадии draft
перенаправляется на `tm-banknote-v1` derived-чекпоинт** (расширение прецедента с flagged-
на ok-путь) иначе резюм отдаёт редактору сырой блок. Только с этим re-point гарантия
конструкцией.
9. **Пост-чек глоссария** (`mempostcheck.go`): работает по финалу редактора канал не влияет;
но глоссарий-блок переводчика (`renderGlossaryBlock`) обязан идти в промпте ДО инструкции
сноски новые = не из этого списка») иначе модель дублирует известное.
10. **Телеметрия:** per-chunk `n_banknote_lines`, `banknote_parse_fail`, `banknote_truncated`
лауд, в retrieval_state-стиле.
11. **Провайдер-квирки:** DeepSeek thinking-ON неизменен (echo-мина, `models.go:352-377`);
формат-цена A6 Tam: констрейнты деградируют генерацию) риск качества САМОГО перевода
от инструкции §D-арм меряет дельту качества черновика с/без инструкции, это гейт канала.
12. **Экспорт/полигон:** `tmctl export` (worktree) отдаёт final_text без сноски автоматически
(срез раньше); полигонный экстрактор кандидатов читает артефакт-файл, не текст.
**Цена канала (пере-верификация оценки ресёрчера-19 «~$0.004/ранобэ»):** параметрически
Δ$ chunks × avg_lines × ~12 ток × price_out. На слайсе-25 (57 чанков): при 5 строках/чанк
в среднем 3.4k выходных токенов. Экстраполяция на ранобэ зависит от размера книги и дисциплины
«только новое» (эмиссия падает по мере насыщения банка: первые главы 510 строк, хвост 02);
при 25k чанков/книга и 13 строках/чанк в среднем 25180k ток **порядок $0.010.1/ранобэ
по flash-ценам выходных токенов: оценка $0.004 выглядит заниженной в разы, но класс «копейки»
подтверждается**; точные числа §D по живому прайсу providers.json. Код-канал $0 подтверждён
(всё на существующих артефактах); гибрид = код + сноска та же дельта, что сноска.
### B4. Слепые зоны кода (г): маршрутизация спот=локаль / рендер=облако / человек
| Зона | Детектируется дёшево ($0/локаль)? | Облачный судья | Человек |
|---|---|---|---|
| **Z1 стабильно-неверный перевод** (→«гусеницы»: высокий термхуд, НУЛЕВОЙ спред, dst обычное слово) | $0-эвристика: high-score кандидат + spread0 + dst не-Палладий/не-заглавный класс `suspicious_stable`; локальная 9B ВЕРИФИКАЦИЯ пары src-предложение + рендеринг верно?») exp06 мерил экстракцию, НЕ верификацию: нужен мини-бенч D-A6b) | топ-N suspicious дешёвому облачному судье (центы; кросс-семейный к драфт-модели F5 реестра) | подпись канона с evidence-картой |
| **Z2 полисемия 转-класса** | $0-симптом: спред dst НЕ падает после лемматизации И KWIC-контексты расслаиваются на кластеры `sense_split_candidate`; сам сплит кодом не решается (матчер keys-only-src, D16.1) | LLM-адъюдикация сплита по двум KWIC-пулам | sense/окна в сиде только человек (D16.1 fail-loud уже защищает) |
| **Z3 редкие реалии** (f<3) | частотно слеп by construction A1); частично закрывают паттерны V-C (типовой суффикс) и канал сноски (переводчик видел контекст); локальная 9B: полный спот-проход по источнику $0 (exp06 recall 0.981.0 НО на PD-классике; вебновелл-ре-замер = §D-A6, заодно закрывает оговорку eval/README) | рендер dst редких облако + таблица Палладия (B6: даже облако 0.75 на zh) | как всегда |
| **Z4 пол персонажа** | $0: счётчики / в окне вхождений; эмитить СЧЁТЧИКИ-evidence, не вердикт: класс gender:hidden (白凝冰 текст говорит , канон female) невыводим из текста | нет смысла | пол = подпись владельца (D19.3) |
| **Z5 zero-overlap алиасы** (ярус-2 §B2) | код предлагает слабые рёбра (со-оккуренция + тип); решения нет | LLM-кореференция на паре KWIC-пулов; локальная 9B неизвестно, пробовать в §D-A6b | подпись кластера |
Рамка G1 (`06-memory-risk-registry.md:83`) сохраняется дословно: спот локаль/код, рендер dst
облако/человек + детерминированная таблица Палладия, промоушен только через статус-машину
autodraftapproved.
### B5. Инвариант общности слоя 4 (по вводной владельца 17.07): движок vs языковые плагины
Бэкенд обязан переводить с любых популярных языков на любые популярные; языковая заточка
изолируется и выносится. Это распространение инварианта общности research/19 §0.1 (чанкер) на
слой банка. Прецеденты идиома в коде уже есть: pair-keyed промпт-паки с fail-loud
(`runner.go:148-158`), пер-язычные floors матчера (Han=2/фонетика=3, `memory.go:57-69`),
ruby-канал как ja-специализация майнинга (`memseed.go:314-359`).
**Языко-агностический движок (не параметризуется языком):** сигналы частота×контраст и
разброс переводов между чанками; чанк/предложение-уровневая ко-оккуренция; каркас
алиас-кластеризации (типизированные рёбра + негативные констрейнты + ярусы код/LLM/человек);
консолидация «канон по всем вхождениям»; статус-машина autodraftapproved и карта подписи с
KWIC; канал сноски (формат/срез/derived-checkpoint/телеметрия); метрики и гарды §D.
**Шесть плагин-интерфейсов (данные/конфиг per язык или пара, НЕ ветки в коде идиом
промпт-паков):**
| Интерфейс | Ключ | zh | ja | ko | en (источник) |
|---|---|---|---|---|---|
| P1 генератор кандидатов | src-язык | Han-n-граммы 16, без сегментации | ruby-канал (ПОСТРОЕН) + kanji-n-граммы; катакана-раны само-маркируют заимствованные имена | пробелы есть, но агглютинация стемы-токены | токены; Капитализация = бесплатный NER-сигнал |
| P2 контраст-корпус | src-язык | частотник zh | частотник ja | частотник ko | частотник en |
| P3 паттерн-пак (язык×жанр) | src-язык + жанр | 百家姓, титулы 公子/大人/长老, топо / | гоноративы さん//殿, имя-паттерны | 3-слоговые hangul-имена, -님/-씨 | Mr./Lady/-son, газеттир гипокоризмов (Vala, §A5) |
| P4 таблица транслитерации | ПАРА (src,dst) | ru Палладий; en пиньинь (вариативнее dst-детектор слабее) | ru Поливанов; en Хэпбёрн | ru Концевич | ru практическая транскрипция |
| P5 лемматизатор цели | dst-язык | | | | ru: pymorphy3; флективные цели обязателен A2), аналитические тривиален |
| P6 гендер-евиденс | src И dst | /她-счётчики | /彼女 (реже, эллипсис) | /그녀 | he/she |
К P6 общий трюк для флективных целей: морфология самого ЧЕРНОВИКА пошёл/пошла») выдаёт,
что предположила драфт-модель target-side гендер-сигнал для любой пары Xru/pl/cs, движковый.
**Политика отсутствия плагина — degrade-with-flag, НЕ fail-loud** (отличие от промптов, где
missing pair = стоп: там неверные конвенции опасны, здесь потеря recall допустима, если
видима): нет P3 детектор деградирует до V-A/V-B с громкой пометкой в карте подписи; нет P4
из скоринга канона выпадает член конформности (лауд); нет P5 поверхностное сравнение форм с
известным ударом по recall (лауд). Единственный fail-loud P1: без генератора кандидатов
майнинг для языка не заявляется вовсе.
**Честная разметка текущего инстанса:** §D-эмпирика одна пара zhru; её вердикты про
инстанс, не про движок. zh стресс-инстанс (нет сегментации, OOV-композиты, худший
NER-трансфер §A4), а Палладий самая регулярная из P4-таблиц: положительный результат на
zhru переносим с осторожностью «на en-источнике легче, на en-цели транслит-детектор слабее».
Тест общности = репликация на второй паре E-владелец-7).
---
## §C. Консолидация W1.5: алгоритм и поток данных до сида
### C1. Место в волновой архитектуре
W1.5 снапшот-граница между W1 (параллельные черновики) и W2 (параллельная редактура),
НЕ mid-run-append (research/19:548-553). Это согласовано с механикой снапшота: банк входит в
`memoryVersion` в snapshotID (`snapshot.go:79-93`), значит изменение банка между волнами
штатный (и единственный законный) момент; W2 работает уже на новом снапшоте с обогащённым
банком. Замечание по экономике: при gate OFF в memoryVersion фолдятся только approved-строки
(`memory.go:258-285`) вливание auto/draft-кандидатов само по себе снапшот не двигает; двигает
его подпись владельца (draftapproved), что и есть смысловая граница W1.5.
### C2. Алгоритм консолидации (детерминированный код + человек, LLM только в зонах §B4)
Вход: (source, draft) пары всех чанков W1 + артефакты канала сноски (если включён) +
текущий сид (fan-конвенции / пустой на холодном старте).
1. **Майнинг кандидатов** детектором V-x B1) таблица кандидатов
`{src, occ, chapters[], kwic[], dst_variants{v:count}, type_hint, pattern_evidence,
spread, flags(suspicious_stable|sense_split|needs_external_lookup)}`.
2. **Алиас-кластеризация** B2 ярус-1): рёбра R1R3 при непротиворечии R4; выход кластеры
с типизированными рёбрами и меткой силы; слабые рёбра (ярус-2) отдельным списком
«предложения к связи», НЕ слитые.
3. **Выбор канона по ВСЕМ вхождениям (не первый-победил):** скор dst-варианта =
частота по всем чанкам × конформность (Палладий-таблица B6 для type=name/place;
согласование с уже-approved соседями ряда прецедент 元-ряда в сиде) × полнота падежной
леммы. Побеждает вариант, а НЕ первое вхождение прямая реализация анти-LTCR-отравления.
Мажоритарность НИКОГДА не даёт approved: канон-предложение = draft.
4. **Пол:** счётчики //контекст-гоноративов по кластеру evidence-поле; gender
проставляется только владельцем (класс hidden D19.3 из текста невыводим).
5. **Спойлер-окна:** since_ch = первая глава вхождения кластера (автоматически, по source);
until_ch только человек.
6. **Пре-валидация против фейл-лаудов загрузчика:** зеркально `loadGlossarySeed` дубликаты
(src,sense,window), D16.1-полисемия, shared-key коллизии (`memseed.go:91-99, 161-181, 201-237`),
иначе W1.5 упадёт на ровном месте при загрузке; выход линта часть карты подписи.
7. **Эмиссия сид-дельты:** YAML в схеме `seedTerm` (`memseed.go:30-57`), БЕЗ новых полей:
новые термы `status: auto` (без dst инертны в автомате) или `status: draft`
(с канон-предложением инъекция проверить⟩); алиасы поверхностями терма; `Source`-класс
кандидата и evidence в отдельной **карте подписи** (сайдкар-markdown, прецедент
`diag/glossary_v2_signoff.md` из exp13_seed_v2.py), НЕ в схеме сида.
8. **Подпись владельца:** карта подписи = per-кластер: канон-предложение, dst-варианты с
частотами, топ-KWIC контексты (детерминированный context-recording H15-рычаг), счётчики
пола, флаги зон §B4, слабые рёбра яруса-2. Владелец: approve / правка / оставить draft /
расклеить кластер. Только после этого resnapshot и W2.
Дисциплина сида НЕ меняется: approved-инвариант (D30.5/D34.1), «тихий промоушен = откат»
действует и для майнера майнер по построению не умеет писать `approved`.
### C3. Поток данных (ASCII)
```
W1 drafts (par.) chunks (source zh) сид_т0 (fan-конвенции|пусто)
│ │ │
▼ ▼ │
[срез сноски] [детектор V-x: n-граммы×контраст×спред×паттерны]
│banknote │кандидаты+KWIC+dst-варианты │
└────────┬────────┘ │
▼ │
[алиас-кластеризация R1R4] │
▼ │
[канон по всем вхождениям + пол-evidence + окна] │
▼ │
[линт против фейл-лаудов memseed] │
▼ ▼
сид-дельта YAML (auto/draft) + карта подписи ──► ВЛАДЕЛЕЦ подписывает
сид_т1 → seedGlossary (replace)
resnapshot (снапшот-граница W1.5)
W2 edit (par., банк-enforce)
```
Слот web-fetch (V4-п4): флаг `needs_external_lookup` в карте подписи; исполнение Ф3+
за trust boundary D25.5, в W1.5 НЕ строится.
---
## §D. Пре-рег дизайн полигон-эмпирики (исполняет полигон ОТДЕЛЬНЫМ промтом ПОСЛЕ exp15)
### D0. Рамка
Автор дизайна исполнитель (authorreviewer). Бюджет: армы A1A3, A6 $0 (код + стенд);
платные A4/A5 + cold-start срез оценка ≤$35, отдельное подтверждение владельца E-2).
Мандат самопроверки исполнением (CLAUDE.md, решение владельца 12.07) в промт полигона
обязательно: ревью своего кода детектора, своих запросов к моделям, своих результатов.
### D1. Ground truth и его честные ограничения (пре-регистрируется ДО запуска)
- **GT = сид v2**, отфильтрованный по фактическому вхождению в слайс-25: термы с 1
вхождением src/алиаса в source (счёт Aho-Corasick-эквивалентом БЕЗ suppressContained
D24.2). Проверено исполнением при самопроверке: ВСЕ 57 термов проходят фильтр blurb-термы
since_ch 47/193 (血颅蛊, 一气金光虫, 青丝蛊) встречаются по 1 разу в аннотации (гл.1/чанк0)
GT=57, blurb-термы попадают в страту f<3. Полигону решить в пре-реге: считать ли
blurb-регион вхождением (спойлер-семантика since_ch говорит «нет» тогда явное правило
исключения аннотации, отдельным пунктом пре-рега, не следствием фильтра).
- **Recall против сида чистая метрика.** **Precision против сида — НЕ метрика:** сид не
исчерпывающая разметка (кандидат вне сида ошибка). Вместо неё: (а) pseudo-precision@K
(доля топ-K в сиде) как грубый ориентир И (б) адъюдицированная precision@K топ-30
не-сидовых кандидатов победившего арма размечает владелец по карте (минуты) или
кросс-семейный судья с ручной подвыборкой (F5-защита). Пре-регистрируются обе.
- **⚠ Конфаунд инъекции (несущий):** черновики records.json генерились С глоссарий-инъекцией
сида (budget 800) спред-сигнал на GT-термах системно подавлен, canon-recovery на них
тривиализован. Разрез арм-метрик:
(i) на существующих черновиках НИЖНЯЯ граница спред-сигнала (бесплатно);
(ii) **cold-start срез**: свежий черновик 5 глав слайса flash-ом БЕЗ glossary-инъекции
(1014 чанков: 14, если срез включает гл.1 в ней 6 чанков против 23 у остальных;
выбор глав фиксируется в пре-реге; копейки-доллары) экологически валидный вход W1.5
(новая книга без банка).
Несущие выводы по спреду/канону по (ii); (i) только как подтверждение направления.
- **Порог-дисциплина (анти-подгонка, §A1-протокол):** главы слайса делятся 60/40
(напр., 115 тюнинг / 1625 тест; фикс в пре-реге); все пороги (floor, top-K, λ, m)
выбираются на тюнинг-половине, замораживаются, репортится ТОЛЬКО тест-половина +
кривые чувствительности 50% порога recall/precision) для оценки хрупкости.
### D2. Армы
| Арм | Что | Цена |
|---|---|---|
| A1 | V-A частотно-контрастный | $0 |
| A2 | V-B (+спред) | $0 |
| A3 | V-C (+паттерны/Палладий-канал/жанр-пак) | $0 |
| A3-абл | V-C минус спред (паттерны без черновиков) вклад каждого сигнала честно | $0 |
| A4 | канал сноски: cold-start срез 5 глав × 2 конфига (с/без инструкции banknote) | ~$12 |
| A5 | гибрид: A3 A4-кандидаты маржинальный recall сноски над кодом | $0 поверх A4 |
| A6 | локальная 9B споттер по source слайса (exp06-паттерн на вебновелл-тексте) | $0 (стенд) |
| A6b | локальная 9B как ВЕРИФИКАТОР пары (Z1) и линкер слабых рёбер (Z5) мини-бенч 3050 пар с ручным голдом | $0 (стенд) |
A4 меряет одновременно: маржинальный recall; parse_fail/truncated-рейты; дельту качества
перевода от форматной инструкции (детерминированно: coverage/пост-чек/style-флаги/длина +
при сигнале дешёвый судья); фактическую цену токенов по providers.json.
### D3. Метрики (все детерминированные, $0, кроме адъюдикации)
1. recall@сид по типам (name/title/place/term/nickname) и по частотным стратам GT
(f10 / 39 / <3 где какой арм слеп);
2. pseudo-precision@K и адъюдицированная precision@K (D1);
3. **canon-recovery** (только cold-start срез): для GT-термов совпала бы канон-процедура §C2
с подписанным dst владельца (нормализация memnorm, лемма-уровень)? Прямой суррогат
гипотезы 1 на выбор канона;
4. алиас-precision предложенных рёбер R1R3 (entity-уровнево, B³-класс не MUC; урок §A5);
recall только при мини-голде §E-1;
5. квантификация слепых зон: список GT-термов, не пойманных лучшим армом, с РУЧНОЙ
классификацией по зонам Z1Z5 это главный вход бэкенд-дизайна (что доверить коду);
6. стабильность порогов (кривые ±50%);
7. A6b: accuracy верификации Z1-пар и линковки Z5 против мини-голда.
### D4. Гарды методологии (D32.4-адаптация + уроки D37/exp13)
- (а) сигналы армов репортятся РАЗДЕЛЬНО, сведение «N сигналов сходятся» запрещено без
leave-one-out по сигналам (память: manufactured convergence exp12/exp13);
- (б) судьи (если используются) leave-one-judge-out; судья драфт-модель (F5);
- (в) **катастроф-скрин**: ядровые термы (方源, , 蛊师, 古月) обязаны быть в топ-50 победителя;
промах ядра = провал арма независимо от агрегатов;
- (г) все таблицы кандидатов/скоры/пороги персистентные артефакты (`eval/exp16/` или
следующий номер);
- (д) пер-колл бюджет-кэп на платные вызовы; счёт спенда с первого запроса;
- (е) код детектора детерминирован (сортировки, версия miner-v1, фиксированные словари-файлы);
повторный прогон = байт-в-байт;
- (ж) 18+ гардрейл: майнер оперирует поверхностями/счётчиками; refusal_corpus не трогать;
- (з) пре-рег фриз: SHA кода детектора + пороги с тюнинг-половины объявляются коммитом ДО
прогона тест-половины и платных армов;
- (и) D32.4(е): если облачным судьёй адъюдикации выбирается grok сверка reasoning-token
wire-квирка с docs.x.ai ДО платных вызовов; D32.4(ж) разовая бухгалтерская правка exp13,
здесь N/A.
### D5. Решающие правила (пре-регистрируются)
- **Гипотеза 1 подтверждена для частотного слоя**, если лучший $0-арм даёт recall 85% на
GT-страте f3 И canon-recovery 70% на cold-start срезе. Тогда LLM зовётся только в зоны
из метрики-5 (список слепых), маршрутами §B4.
- **Канал сноски оправдан**, если его маржинальный recall над лучшим $0-армом 10 п.п. НА
СТРАТЕ f<3 (редкое его единственная ниша) И дельта качества перевода неотличима от нуля
И parse_fail <5%. Иначе код-детектор + локальная 9B в зонах, сноска в архив идей.
- **Порядок исполнения:** A1A3+абл ($0, существующие данные) A6/A6b (стенд) cold-start
срез A4/A5 (платные, последними; отменяемы решением владельца без потери $0-результатов).
---
## §E. Открытые вопросы
**Владельцу:**
1. **Мини-голд алиасов** для замера а-бис: подписать список алиас-поверхностей сущностей
слайса-25 (методом: код предлагает кандидатов рёбер, вы вычёркиваете/дополняете; ~2030 мин).
Без него ярус-1 меряется только по precision.
2. **Бюджет платных армов** §D (A4/A5 + cold-start срез): ≤$5. Подтвердить (отдельно от
≤$15 exp15).
3. **Политика канона:** подтвердить, что майнер НИКОГДА не пишет approved (только auto/draft
+ карта подписи) заложено в §C2-дисциплину; и что «канон по всем вхождениям» с
Палладий-конформностью (не мажоритарность черновиков) правильная целевая функция.
4. **Жанровые лексикон-паки** (детерминированное жанр-кондиционирование, H15-рычаг): жанр
берём из brief книги как селектор пака суффиксов/титулов? (сянься-пак первый).
5. **W1.5 человеческий гейт в середине прогона** уже ваш вопрос 1 к research/19 §E.1;
решение «после Q3» (16.07). Этот пакет добавляет аргумент ЗА гейт: карта подписи §C2
компактная (кластеры, не термы), UX-стоимость ниже, чем казалось.
6. **Оценки цены каналов** ресёрчера-19 пере-верифицированы: код $0 ✅; сноска скорее
$0.010.1/ранобэ, чем $0.004 B3-формула, живой прайс в §D); гибрид цене сноски.
7. **Слот репликации на второй паре (тест инварианта общности §B5):** после zhru-инстанса §D
реплика движка на jaru, где P1 = уже построенный ruby-канал (репликация почти бесплатна:
ja-приёмочная книга в репо, кандидаты уже генерятся). Одобрить как след-за-§D шаг полигона?
**Бэкенду (слоты дизайна, НЕ строить до итогов §D):**
1. `Source: "mined"` в GlossaryEntry + конвенция сайдкара карты подписи; `tmctl seed-lint`
(сухой прогон фейл-лаудов loadGlossarySeed по дельте) дёшево и снимает риск §C2-6.
Плагины P1P6 B5) файлы данных/конфиг по идиому промпт-паков (pair/lang-keyed),
НЕ ветки в коде майнера.
2. Канал сноски: derived-checkpoint `tm-banknote-v1` + телеметрия B3 п.5/10) только если
§D-правило «сноска оправдана» сработает.
3. Экспорт (source, draft) пар: полигону хватает records.json; для продакшн-W1.5 режим
`tmctl export --pairs` (source уже джойнится в Export, `export.go:115`).
4. Транспорт поля gender (exp15-преп, уже в плане) консолидация §C2-4 на нём висит.
5. Rubymined конвергенция: единая схема кандидата (Source=ruby|mined, Confidence, class-хинт)
при лендинге дизайна унифицировать, не плодить второй формат.
6. Открытый вопрос D30.1-редактора (srcdst вместо голых dst-форм, `memory.go:505-511`) станет
острее с майненым банком (больше AMBIGUOUS-строк у переводчика) решить до W2-дизайна.
---
## Самопроверка сессии (мандат 12.07)
- §A: мульти-агентный сбор + адверсариальная верификация по первоисточникам (authorreviewer);
заглушка верификатора ate-core обнаружена и закрыта повторной верификацией (9/11 CONFIRMED,
2 CORRECTED внесены). Хеш §A зафиксирован ДО чтения репо.
- §B–§E: несущие репо-клеймы грунтованы file:line через независимых ридеров; сид v2, memseed.go
и ядро memory.go перечитаны автором лично; конфаунд глоссарий-инъекции в records.json и
GT-фильтр по вхождению найдены при этой проверке и внесены в §D как несущие поправки.
- Пост-хок адверсариальный проход по готовому отчёту ВЫПОЛНЕН (3 независимых верификатора:
citation-fidelity §B–§E, промт-комплаенс+целостность §A-хеша, опровержение несущих механик):
~50 проверенных клеймов, 1 WRONG (GT-фильтр: blurb-термы встречаются в аннотации гл.1
GT=57, не ~54) и 9 IMPRECISE все исправлены в тексте, в т.ч. два несущих: вырожденность
c-value на одночарных кандидатах B1) и обязательный re-point final_hash OK-стадии на
derived-чекпоинт для канала сноски при резюме B3 п.8). Комплаенс промта: все требования
(а)/(а-бис)/(б)/(в)/(г)/структура §A–§E CONFIRMED верификатором. Git: отчёт не закоммичен,
сессия коммитов не делала.