textmachine/docs/experiments/16-bank-mining.md

192 lines
20 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.

# Эксперимент 16. Банк-майнинг W1.5 (полигон-стадия research/20 §D)
> **Статус:** полигон-сессия exp16 (2026-07-18), исполняет пре-рег дизайн **research/20 §D** (дизайн-оф-рекорд,
> D39.6). Зона: `eval/exp16/` + этот файл. Артефакты — ВНЕ git (`/home/ubuntu/books/gu-zhenren/exp16/`).
> **Коммичу ТОЛЬКО пре-рег фриз** (единственный коммит, ДО первого платного вызова — D30.10/D37); результаты
> сдаются этим отчётом, лендит оркестратор. Бюджет платных армов: жёсткий кап **$10** (решение владельца 1718.07).
>
> Структура: **§0** пре-задача (ре-аудит exp14b, D39.9) · §1 пре-рег фриз · §2 GT/материал · §3 результаты по
> армам · §4 решающие правила + маршрутизация слепых зон · §5 деньги · §6 самопроверка + отклонения.
---
## §0. Пре-задача ($0, ДО фриза): ре-аудит exp14b исправленными правилами (D39.9)
**Мандат (промт §пре-задача):** Q4a (D39.9) вскрыл, что (i) правила скорера exp14b
(`rule_counterfactual`/`polarity_envy`/`b1`) дефектны, а исправленные оверрайды лежат в
[q4a_traps.py](../../eval/exp15/q4a_traps.py); (ii) харнес [exp14_common.call](../../eval/exp14/exp14_common.py#L104-L113)
НЕ отклоняет `finish=length` — усечённый выход возвращается как валидный (`err=None`). Задача: (1) пере-скорить
СОХРАНЁННЫЕ exp14b-выходы исправленными правилами; (2) свип `finish_reason=length` по exp14/14b-леджерам;
(3) отчёт-дельта: какие пер-класс вердикты D38 сдвинулись. **Флип любого несущего → СТОП + пинг оркестратору
(errata — его зона).**
Код (аддитивный, риг exp14/14b НЕ тронут — импорт read-only): [reaudit_14b.py](../../eval/exp16/reaudit_14b.py),
[length_sweep.py](../../eval/exp16/length_sweep.py). Length-гейт для СВОИХ будущих генераций чинится у себя
(exp16-харнес), риг exp14 не трогаю.
### §0.1. Результат ре-скоринга (задача 1) — D38 DET-ядро ДЕРЖИТСЯ
D38 (`14b-meaning-battery.md` §2.1) скорил DET **ручной span-читкой** (авто-скорер был само-отвергнут как
бракованный). Исправленный `q4a_traps` — это тот самый скорер, но починенный (предложение-скоуп, исправленные
a1/a2/b1/b2/c1/d1/d2; звук b2, c2=`rule_grade_bing`, c3=`rule_patriarch` реюзаны verbatim). Self-test
корректных правил: 19/19 pass. Ре-скор всех сохранённых выходов арма C/F/X/D/M (+ K где есть, + P0-референс):
| Трап (класс) | glm-5 C | gpt-5.4 F | grok X | deepseek-pro D | mistral M | сходится с D38? |
|---|---|---|---|---|---|---|
| **a1** двойн.отриц (крит) | fail | **fix** (лок.gap→разрешён) | fail | fix | fix | ✅ все |
| **a2** 无不 | fix | fix | fix | fix | fix | ✅ все |
| **b2** 四成四=44% | fix | fix | fix | fix | fix | ✅ все |
| **c1** 人上之人 (крит) | fix | **fix** (лок.gap→разрешён) | fail | fail | fix* | ✅ (M: `?`→fix, апгрейд) |
| **c3** 族长 (глосс-конфаунд) | fail | fix | fix | fix | fail | ✅ все |
**Каждая ячейка, которую исправленный скорер СМОГ локализовать, совпадает с ручным вердиктом D38 дословно**
включая паттерн глосс-конфаунда c3 (C/M=fail «старейшина», F/X/D=fix «глава») и c1 M=`?`. Единственные два
расхождения — **a1 F** и **c1 F**: D38=fix → исправленный скорер=`?` (пустой span). Это НЕ семантический флип,
а **пробел покрытия локатора** q4a на перефразе gpt-5.4 (окно story→knowledge 90 симв. перелетело; `над людьми`
разорвано словом `обычными`). `?` = «не локализовано / не классифицируемо — ИСКЛЮЧЕНО из ставок, НИКОГДА не
тихий pass». Разрешение span-читкой (мануально + независимо, §0.3): gpt-5.4 верно рендерит оба
(«…не было ни одного человека, который бы его не знал» = верная двойная негация; «…подняться над обычными
людьми» = верное 人上之人). **D38 «fix» стоит.**
Исправленные fix-rate по армам (9 DET-инстансов, `?` исключён из знаменателя): C 7/9 · F 5/6 · X 7/9 ·
D 7/9 · M 5/7 · P0 4/5. (b1/c2/d1/d2 не были в ручной D38-таблице §2.1 — свежие данные, не «сдвиги».)
**Несущие выводы D38 под исправленными правилами — БЕЗ изменений:**
- «Только gpt-5.4 чинит смысл» **опровергнуто**: a1 чинят F, **D и M**; валят glm(C) и grok(X). Провалы
РАЗБРОСАНЫ по модель×конструкция (a1: C+X; c1: X+D; c3-глосс: C+M). Нет модели безупречной/безнадёжной.
- c3 = **глоссарий-енфорсмент**, не способность (C/M подтянули approved-сосед `家老→старейшина` к draft-целевому
`四代族长`) — подтверждено внутренней консистентностью (ни один арм не мешает глава/старейшина).
### §0.2. Свип finish_reason=length (задача 2) — ни одна несущая DET-ячейка не заражена
8 леджеров, 477 записей: `stop` 413 · `length` **32** · `(none)` 32. Разбор 32 `length`-записей:
| Источник | n | Приняты как валидные? | Затрагивает несущую DET-ячейку? |
|---|---|---|---|
| gemini-3.1-pro (G-base/G-disc, exp14) | 11 | да (баг-гейт) | **нет** — gemini ДРОПНУТ как арм (exp14b §1.1); не в C/F/X/D/M |
| kimi-k2.6 (K-арм + судьи, exp14/14b) | 19 | 2 приняты (10.1/11.1), 17 отвергнуты (empty) | **нет** — K-арм ДРОПНУТ (D38); 10.1/11.1 не несущие |
| deepseek-v4-pro **D 2.1** (exp14b) | 1 | **да** (comp_tok=8000, оборван на «…Ступа[й]») | **нет** — 2.1 = e2 (SOFT/судейский), не DET; **НОВАЯ находка** |
| gpt-5-mini (regate-судья) | 1 | нет (отвергнут empty) | нет — судья, не редактор |
Прямая проверка длин 7 несущих DET-чанков (7.0/17.0/16.0/6.0/9.1/10.1/19.0) по C/F/X/D/M: все консистентны и
завершены (ни один аномально короткий, ни один в свипе). **Несущие DET-вердикты сидят на полных выходах.**
D 6.0 (упомянут в D38 как оборванный→перегнан на 16k) — сохранённый файл полный (10054 симв, `stop`); в свипе
как `length` не значится (финальная перезапись). **Новая находка:** D 2.1 (e2, SOFT) — принятая усечёнка;
судьи e2 скорили оборванный выход D. Влияния на несущее нет (e2-вердикт D38 = «большинство correct,
чэнъюй-сплющивание универсально» — усечёнка не рождает ложную катастрофу), но фиксирую как риг-гигиену.
### §0.3. Независимая верификация несущих (author≠reviewer) + дельта-вердикт (задача 3)
Промт требует: «несущие a1-вердикты span-верифицированы независимо». Исполнено воркфлоу из 4 независимых
refute-by-default ридеров (a1 ×2, c1, c3), читавших СЫРЫЕ выходы армов, вердикт fix/fail/omit + цитата-span.
**Все 4 подтвердили каждую несущую ячейку**, включая двойное подтверждение a1 F=fix и c1 F=fix (моё
разрешение локатор-gap'ов независимо подтверждено). a1: C=fail×2, F=fix×2, X=fail×2, D=fix×2, M=fix×2. c1:
C/F/M=fix, X/D=fail. c3: C/M=fail, F/X/D=fix.
**ДЕЛЬТА-ВЕРДИКТ:** **0 семантических флипов несущих вердиктов D38.** DET-ядро D38 держится под исправленными
правилами, тройно подтверждено (D38-ручной × исправленный авто-скорер × независимый refute-by-default ридер).
Два расхождения (a1 F, c1 F) — пробелы покрытия локатора, разрешены в `fix`; одно улучшение (M c1 `?`→fix).
**СТОП-гейт НЕ сработал; пинг оркестратору по флипу НЕ требуется** (условие пинга — флип, его нет).
**Риг-находки в реестр (не блокеры, для протокола):** (а) исправленный `q4a_traps`-локатор имеет пробелы
покрытия на не-S2 материале → выдаёт `?` (безопасно: не тихий pass) — подтверждает правоту D38 скорить DET
ручной span-читкой; (б) харнес exp14 принял усечёнку D 2.1 (e2 SOFT) — единственная новая жертва length-бага
вне дропнутых армов; (в) для СВОИХ генераций exp16 length-гейт реализуется в exp16-харнесе (отклонять
`finish=length` как reject/flag) — §1.
Артефакты: `exp16/reaudit_14b.json`, `exp16/length_sweep.json`, `exp16/pretask_independent_verify.json`.
**⟶ Гейт пройден: ядро держится. Перехожу к пре-рег фризу (§1).**
---
## §1. Пре-рег фриз (miner-v1) — коммит ДО первого платного вызова (D30.10/D37)
Замораживается дословно из research/20 §D + конкретизации. Детектор-код детерминирован (сортировки,
версия `miner-v1`, версионированные словари) — повторный прогон байт-в-байт (§D4-е).
### 1.1. Материал и Ground Truth
- **GT = сид v2 пост-reseed**, `guzhenren-seed-v2.yaml` **sha256 `175a67ad2f05…c408f4`** (совпадает с
реф-хешем промта; 人祖=male, 古月=n-a подписаны — exp15-преп). **GT = 57 термов + 2 алиас-поверхности.**
- **Фильтр вхождения (§D1):** каждый GT-терм имеет ≥1 вхождение src/алиаса в source (Aho-Corasick-эквивалент
БЕЗ suppressContained, D24.2). Проверено исполнением: 57/57 проходят **с** аннотацией, 54/57 **без**.
- **BLURB-ПРАВИЛО (решение полигона, пре-рег):** аннотация гл.1/чанк0 СЧИТАЕТСЯ вхождением ⇒ **GT=57**.
3 blurb-терма (血颅蛊 since193, 一气金光虫/青丝蛊 since47) встречаются по 1 разу только в аннотации ⇒
страта **f<3**. (Альтернатива «аннотация ≠ вхождение» дала бы GT=54; репортим f<3-recall в обоих
разрезах для этих 3 термов.) **Частотные страты GT (incl. аннотация): f≥10 — 40 · f3-9 — 7 · f<3 — 10.**
- **(source, draft) пары:** `rerun/records.json` **sha256 `3de49eaf…928d`** 57 чанков (гл.125),
черновики deepseek-v4-flash. **Конфаунд инъекции (§D1):** черновики генерились С глоссарий-инъекцией
сида (budget 800, `pipeline-rerun.yaml`) спред на GT подавлен метрики спреда/канона на них =
НИЖНЯЯ граница; несущие выводы по cold-start срезу 1.6).
### 1.2. Армы (A1A3+абл)
| Арм | Детектор | Определение |
|---|---|---|
| **A1** | V-A | Han-n-граммы 16 × частотный floor 3 × c-value (nested-дисконт, g(L)=log₂(L+1)) × weirdness (контраст с общим zh) |
| **A2** | V-B | A1 + translation-spread (Dice/LTCR по ru-черновикам, pymorphy3-леммы) + dst-варианты |
| **A3** | V-C | A2 + паттерны: 百家姓-якорь, титул/топо-суффиксы, rank/grade-композиция, продуктивная морфология (авто-формант по over-rep), Палладий ru-канал |
| **A3-абл** | V-C, λ=0 | V-C без spread-сигнала изолирует вклад каждого сигнала D2) |
### 1.3. Замороженные пороги (miner-v1) — выбраны на тюнинг-половине ch115, ±50%-стабильны
`freq_floor=3` A1 C-value канон) · `subsume_alpha=0.80` (nested-консолидация ранжирования; 0.5
слишком агрессивно роняет GT) · `ngram_max=6` · `formant_min_over_rep=15.0` · `formant_min_partners=3`
· `lam=0.0` на инъектированных черновиках (spread вредит ранжированию конфаунд §D1; на cold-start λ
свипается) · pattern-бонусы `{name/place 140, title 120, term 80}` × source-weight. **Свип ±50% 1
tuning_sensitivity.json): A3@f3=1.0 инвариантно по ВСЕМ настройкам; catastrophe PASS везде.**
### 1.4. Метрики (все детерминированные, $0, кроме адъюдикации)
1. **recall@PROPOSED** (членство в кандидат-сете = ось «где арм слеп», §D3) первичная recall-метрика,
по типам (name/title/place/term/nickname) и стратам (f10/3-9/<3).
2. **recall@top-K + pseudo-precision@K** (ось ранжирования/точности) + trade-off кривая.
3. **precision@30 адъюдицированная** (топ-30 не-сидовых A3): владелец по карте ИЛИ кросс-семейный судья
закалённого паттерна `judges.py` (per-vote, оба порядка, полно-evidence) precision@сид НЕ метрика D1).
4. **canon-recovery** C2): покрытие подписанных лемм предложением канона; несущее на cold-start.
5. **алиас-precision** рёбер R1R3 (entity-B³, не MUC) + мини-голд владельца для recall E-1 тачпойнт).
6. **стабильность порогов** ±50%. 7. **A6b** accuracy верификации/линковки.
### 1.5. Порог-дисциплина 60/40 (анти-подгонка, §D1)
Тюнинг = ch115, тест = ch1625. Пороги выбраны на тюнинге, заморожены этим коммитом; **первичный
репортируемый результат тест-половина**; full-срез вторичка (catastrophe/trade-off/дамп).
### 1.6. Cold-start срез (пре-рег фиксирует главы)
**Главы [1, 4, 5, 7, 9]** (жадное GT-покрытие: **52/57** сущностей, **14 чанков** 6 в гл.1). Свежие
flash-черновики БЕЗ глоссарий-инъекции, 2 конфига: `plain` (=срез, spread+canon-recovery) и `banknote`
B3-инструкция, канал сноски A4). Промт translator `backend/prompts/translator.md` **sha256
`35d3ad6e…`**, brief из `rerun/book.yaml`, БЕЗ инъекц-блока (порт `coldstart_gen.py`). **DeepSeek-долина
обязательна** (пики UTC 0104/0610 ×2, D39.7 `coldstart_gen.in_deepseek_peak()` отказывает в пик).
### 1.7. Катастроф-скрин (§D4-в)
方源 · · 蛊师 · 古月 обязаны быть в **топ-50 победителя**; промах = провал арма. **Пройден на full
(ranks 0/1/2/13/…)** g(L)=log₂(L+1) держит одночарный (nested в 蛊师/蛊虫/月光蛊) на ранге 1.
### 1.8. Карта независимости сигналов (§D4-а — против manufactured convergence)
Сигналы репортятся РАЗДЕЛЬНО: A1(частота×контраст), spread(A2A1 / A3A3абл), паттерны(A3A1). Сведение
«N сигналов сходятся» только с leave-one-out. Spread на инъектированных = ~0/негатив (изолирован),
измеряется экологически лишь на cold-start.
### 1.9. Бюджет и порядок (§D5)
Платный кап **$10** (владелец 1718.07), per-call gate + hard-cap (`exp15_llm.Spender`). Порядок:
A1A3+абл ($0) алиас ($0) A6/A6b (стенд $0) cold-start (копейки) A4/A5 (платные, последними,
отменяемы). **Length-гейт (D39.9):** ВСЕ свои генерации отклоняют `finish=length` (не наследуем баг exp14).
### 1.10. Хеши (версионирование детектора)
- Код `miner-v1` (SHA256): exp16_common `92bc737a` · detectors `89059e53` · patterns `7ac8240c` ·
spread `5422415f` · palladius `a071295e` · arms `a5ed2ae2` · run_arms `c4e3e17d` · banknote `069ad8fe` ·
coldstart_gen `70c8d9c1` · alias `354172fa` · canon `e947ebf3` · reaudit_14b `8d95ad58` · length_sweep `59a60b15`.
- Словарь-артефакт (контраст): `data/jieba_dict_general_zh.txt` **sha256 `7197c321…e12a8`** (jieba 0.42.1
`dict.txt`, общий zh word-freq; вне git воспроизводим из jieba 0.42.1, SHA пиннится здесь).
- Сид `175a67ad…` · records `3de49eaf…` · translator.md `35d3ad6e…` · бэкенд HEAD `b9e62a7`.
### 1.11. Решения владельца, вшитые (1718.07, НЕ пересматривать)
Жанр-паки НЕ строятся (V-C только универсальные каналы; авто-формант, не хардкод ). Майнер НИКОГДА
не пишет `approved` (auto/draft + карта подписи); канон = по ВСЕМ вхождениям × Палладий-конформность ×
полнота леммы. Пол в сиде подписан (人祖=male, 古月=n-a); счётчики /= evidence, вердикт = владелец.
jaru реплика след-за-§D (отдельный мини-фриз).
** Фриз коммитится. Результаты 3+) ПОСЛЕ, лендит оркестратор.**
---
## §2. GT и материал (см. §1.1) · §3. Результаты по армам · §4. Решающие правила + слепые зоны · §5. Деньги · §6. Самопроверка
*(заполняются после прогонов; тест-половина — первичка)*