textmachine/docs/BANK_ARBITRATION_RESEARCH_SESSION_PROMPT.md

128 lines
36 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.

# Промт ресёрч-сессии: АРБИТРАЖ БАНКА ПАМЯТИ — консилиум, уверенность моделей, инжект/фетч (строки 5/36б · 48 · 16)
**Выдан 02.08.2026, оркестратор №10, по прямому запросу владельца.** Ты — **ресёрч+полигон сессия**. Зона записи ровно три места: **`docs/research/24-bank-arbitration.md`** (свой файл, других в `docs/research/` не трогать) + **`eval/bank_arbitration/`** (свои харнессы; сырьё моделей — durable в `~/books/`, НЕ в scratch) + своя секция в `docs/PROGRESS.md``## Полигон`. ⚠ `eval/` — зона полигона: на момент выдачи полигон-сессий не запущено, но перед первой записью `git status` и опознание чужого; своё держать в своей папке. **НЕ коммитить** — лендит оркестратор. **Первый деливерабл — эхо-блок ≤10 строк** (первым сообщением ДО работы: как понял скоуп · четыре работы и их СТОП-точки · потолки денег · что вне скоупа; подтверждения не жди — работай до СТОП-условий).
**Деньги (жёстко):** работы A и D = **$0**. Пробы работ B и C ≤ **$2.00 суммарно**, суб-потолки: калибровка уверенности ≤$0.60 · арбитраж ≤$0.80 · инжект ≤$0.60. **Каждая проба пре-регистрируется**: критерий успеха/провала записан в отчёт ДО запуска (норма D39.46). Превышение любого суб-потолка = СТОП+релей, а не «добрать немного». В отчёте — деньги по каждой пробе отдельно и суммой; сырые выходы моделей персистить в `~/books/gu-zhenren/bank-arbitration/` (урок 01.08: платное сырьё в эфемерном scratch = потеря).
---
## §0. Рамка и ГЛАВНЫЙ мандат
**Слова владельца дословно (02.08):** «банк памяти сейчас центральная ценность при переводе… туда нужен как грамотный инжект так и фетч по книге, прям очень грамотно алгоритмически продуманный»; про перевод банка — «тут нужен **консилиум без голоса**… либо если модели не равноправные, то склонять вес перевода в какую-то сторону»; «могут ли вообще модели устанавливать уверенность… можно ли на таком построить банковский перевод»; и оговорка — «только тут надо ещё осторожно подходить, чтобы учитывался общий контекст и стиль, а то мы можем выбрать перевод какой-то модели, который разобьёт стиль перевода другой».
Это **гипотеза владельца, поданная на проверку, а не спецификация на стройку.** Твой мандат — проверить её, а не исполнить.
1. **МАНДАТ РЕВИЗИИ ПОСЫЛОК (норма D39.68, обязателен).** Каждый предлагаемый механизм получает вердикт-тройку: **посылка** (источник, актуальна ли) · **нужность** (что даёт НА ДАННЫХ; не даёт — «закрыть») · **форма** (лучшая из ≥2 альтернатив по названному критерию). Допустимый исход любого пункта — **«не строить»**. Замер, бьющий по ПОСЫЛКЕ задачи, обязывает остановиться и поднять через канал вопросов, а не выдать формально требуемый артефакт (процессное правило №4, D39.47).
2. **БАР (по образцу research/14).** Любой новый механизм обязан: (а) оставить детерминированное ядро авторитетным; (б) влезть в стоимостный контур; (в) **эмпирически побить бесплатный детерминированный базис** — сегодняшнюю формулу §C2-3 (частота × конформность × согласие с подписанной строкой × лемма-штраф); (г) оправдать сложность. **Не проходит (в) → не мёржить.** Это главный фильтр пака: у нас уже есть бесплатные сигналы, и платный консилиум обязан их ПЕРЕИГРАТЬ, а не продублировать.
3. **Ревью-вопрос общности:** «заработает ли на паре, которой в репо ещё НЕТ, без правки Go?» Арбитраж не имеет права стать пар-словарём: **D39.47 отменил жанровый словарь КАК КЛАСС** — решение о переводе принадлежит подписи владельца на банк КНИГИ, пар-словарь форсит один регистр как единственно верный. Консилиум, приносящий «правильный русский регистр» из пар-данных, воспроизводит ровно отменённое.
4. **Инвариант, который нельзя размывать:** терминолог **не может ничего утвердить** — тронутый им терм эмитит `draft` (помеченный ⟨проверить⟩), отказ эмитит `auto` (`terminologist.go:31-35`, §C2-7). Худшее, что делает плохой вызов, — кладёт помеченное предложение перед редактором и владельцем. Любой дизайн консилиума обязан сохранить это свойство и явно сказать, как. «Три модели согласились ⇒ канон» — запрещённая форма.
5. **Самопроверка исполнением обязательна** (свой код + сформированные запросы к моделям + полученные результаты). Полигон регулярно багует, и это искажает эксперименты (D37). **Вывод на агрегате до вскрытия единиц запрещён** — перед любым «сигнал работает» открой глазами хотя бы по одной живой единице с каждой стороны. В конце — **адверсариальный проход author≠reviewer** по своим выводам (норма 01.08: соло-самопроверка платные пробы НЕ закрывает).
---
## §1. Онбординг (карта чтения; доки целиком НЕ читать)
1. `CLAUDE.md` — «Цели и мерило» (6 пунктов) + гардрейлы (**`.env` НЕ читать** · DeepSeek thinking НЕ отключать · аномалия провайдера → вендор-дока, не гадать) → CURRENT-STATE в `docs/PROGRESS.md`, строки **5**, **36б**, **48**, **48б**, **16**, **37**, **80**.
2. `docs/architecture/05-decisions-log.md`**D39.69 целиком** (три примитива банка §1§3 + список закрытого ПО НУЖНОСТИ, там же диспозиция 36б), **D39.70** (ответы владельца Q1Q8), **D39.46** (что именно измерено про контексты и про судью), **D39.47** (жанровый словарь отменён как класс), **D39.42** (роль терминолога, эмиссия auto/draft), **D39.77** (политика подписи: банк обязан приходить верным АВТОНОМНО; сид — другой артефакт).
3. `docs/research/20-bank-mining.md`**амендмент-шапка + §C2 + §E** (открытые вопросы, в т.ч. §E-1 мини-голд). `research/13` — TL;DR + Q-структура (там же `eval/retrieval_bench.py`). `research/14` — TL;DR и правило БАР (образец дисциплины: «не бьёт базис — не мёржить»). `research/15` — через ⚠-амендмент 26.07 (двухсекционная инъекция).
4. Код (читать, НЕ править): `internal/terminology/` (`terminology.go` — Merge/AttachKWIC/ScoreVariants; `series.go`; `classify.go`) · `internal/pipeline/terminologist.go` + `banknote.go` · `internal/membank/memory.go` (`Select`, trust-ранги, `RenderGlossaryBlock`/`RenderEditorConstraintBlock`) + `mempostcheck.go` + `memvoice.go` · `internal/miner/`.
5. `eval/README.md` + `docs/experiments/00-provider-quirks.md` (шапка + секция DeepSeek-V4-Flash-0731 целиком) — **перед любым платным вызовом**.
---
## §2. Что УЖЕ установлено замером — не пере-открывать (приоры; опровергаются аргументом или замером)
Это самая важная секция промта: половина наивных форм консилиума уже фальсифицирована НАШИМИ данными.
- **Судья-модель — катастроф-ЭКРАН, а не ранжировщик (D39.46, измерено).** Слепой LLM-судья различает «сломано / не сломано», но не расставляет годные варианты по качеству. Это прямой приор ПРОТИВ схемы «модель ставит скор → скор выбирает победителя»; чтобы её принять, нужен замер, бьющий этот вывод.
- **Контексты — главный рычаг терминолога (D39.46, ратифицировано):** разрыв 6 термов при размахе 1. То есть качество арбитража сегодня двигает ПОДАЧА улик, а не количество мнений.
- **Канал отказа модели НЕСТАБИЛЕН (пакет-8, D39.50; отчёт `archive/reports/POLYGON_PREMEASURE_2026-07-26.md`):** на хвосте расширенной эмиссии роль **выдумывает dst 7782% стабильно**, а сентинел ⟦TM-NO-DST⟧ различает «переводимо», а не «терм», и нестабилен даже там — **размах 0.375**. ⇒ «модель скажет „не уверен“» — уже проверявшаяся и провалившаяся форма. Хочешь строить на отказе/уверенности — обязан показать конструкцию, в которой этот замер не воспроизводится.
- **Согласие прогонов само по себе слабое (D39.50):** банкнота невоспроизводима между прогонами одних и тех же глав — **Жаккар 0.0770.40**. Консенсус-механика, молча считающая согласие сильным сигналом, стоит на песке; мерить надо согласие ПО КОНКРЕТНОМУ ТЕРМУ, а не по составу списка.
- **Роль ре-решает контекстом, а не первым вхождением и не частотой** (first-occurrence-тест $0 исполнен, гипотеза первенства ОПРОВЕРГНУТА — D39.69).
- **Со-батчинг — единственное, что чинит расхождение внутри системы термов (D39.65 строка 21 → D39.69 §1):** черновики расходились по общей ГОЛОВЕ серии через границу батча (甲等→«класс», 乙丙丁等→«ранг»); порядковые и частотные трюки этого не чинят, чинит только показ набора целиком. **Это ядро возражения к по-терминному арбитражу — см. §4.**
- **KWIC-дефолт 3×40 достаточен (D39.50)**: ни одна точка сетки «подача × контекст» не отличима, 0×0 — лучшая. Не пере-открывать без нового носителя.
- **Формула §C2-3 намеренно НЕ мажоритарна** (`terminology.go:363-387`): частотный фактор ограничен 2× (floor 0.5), конформность может его перебить, согласие с подписанной строкой — отдельный фактор. Комментарий там же формулирует «почему»: N согласных чанков — это N независимых догадок из N ЧАСТИЧНЫХ видов книги, а не N подтверждений.
- **Деньги (замер, строка 16):** черновая волна + банкнота **$0.0247/волна**, терминолог **$0.0060.013 за проход** — на 10 главах сопоставимо. Но: **арбитраж платится раз на книгу и по числу РАЗЛИЧНЫХ термов (насыщается), а инжект — на каждом чанке каждой волны каждой роли** (`memory.go:523`, `Select(chunk, chapter, sticky, budgetTokens)`). На книге эти оси расходятся на порядки. **Отсюда рабочая гипотеза пака, которую надо подтвердить или опровергнуть числами: в арбитраже качество можно покупать расточительно, в инжекте каждая строка платная навсегда.**
- **Банк обязан приходить верным АВТОНОМНО** (D39.59/67/77): подпись владельца опциональна и не является частью нормального пути. Дизайн, который «дотягивается качеством» за счёт того, что владелец всё вычитает, — не решение.
-**Терминолог на весах 0731 сломан не алгоритмом, а транспортом:** 4 батча из 5 возвращались пустыми, банк консолидировал **1 терм из 81** (было 21/21 до смены весов; D39.86). **Валидный базлайн качества — coldrun-a, НЕ coldrun-b.** Сравнить консилиум с этой поломкой = получить фальшивую победу; такой вывод приёмка отклонит.
---
## §3. Работа A — КРИТИКА ТЕКУЩЕГО АЛГОРИТМА В КОДЕ ($0, обязательный деливерабл)
**Прямой запрос владельца.** Разбери сегодняшний путь терма от поверхности до инъекции и назови его дефекты — с `file:line`, а не по заголовкам. Маршрут: майнер (`miner/`) → банкнота (`banknote.go`, голоса чанков) → `Merge` + `AttachKWIC` + `ScoreVariants` (`terminology.go`) → серия-батчинг (`series.go`) → классификатор типов (`classify.go`, §2 D39.69) → терминолог (`terminologist.go`, эмиссия auto/draft) → банк (`membank/memory.go`) → отбор и рендер инъекции → пост-чек (`mempostcheck.go`).
На каждый найденный дефект — вердикт-тройка §0 п.1 и класс: **сломано** (даёт неверный результат) / **хрупко** (верно случайно) / **дорого** (стоит непропорционально) / **слепо** (класс явлений не покрыт вовсе). Обязательно ответь по этим точкам, каждая — с собственным вердиктом (не пересказ, а проверка):
- **Единица решения.** `ScoreVariants` ранжирует варианты ОДНОГО кандидата независимо от соседей; единственный межстрочный сигнал — `Neighbours` (согласие с уже подписанной строкой), то есть работает только когда подпись УЖЕ есть. Автономный банк подписи не имеет ⇒ **на холодном старте связность системы термов не защищена ничем, кроме со-батчинга серий.** Так ли это? Насколько широко? (серия ловит равнодлинные наборы с общей головой — а семьи с общим КОРНЕМ, регистры обращения, алиас-графы одной сущности?)
- **`Related`/`containmentRelations`** (`terminology.go:242-256`) обрезан на 4 и заявлен как «контекст для человека и модели, не индекс». Это честно — но достаточно ли для системной связности?
- **Однопроходность.** Терминолог видит книгу один раз; решения ранних батчей не пересматриваются поздними. Где это стоит качества?
- **Потери на швах:** `foldVariants` · `OriginAlias`-путь «не потерять поверхность» (`terminology.go:180-192`) · строка 48 «направленная банкнота» · строка 37 (квадратичность `AttachKWIC`: 16.8 с на 2000 кандидатов) · строка 28 (7 строк утечки латиницы через экран).
- **Инжект-сторона:** `Select` — precision over recall (`memory.go:42`), trust-ранги, sticky-окно, токен-бюджет. Что режется при переполнении бюджета и по какому правилу? Двухсекционная инъекция (закон CONFIRMED + ⟨проверить⟩) — есть ли замер, что помеченная секция читается моделью МЯГЧЕ, чем закон? (приор: замера нет).
- **Наблюдаемость арбитража:** можно ли сегодня по артефактам прогона ответить «почему у этого терма такой dst»? Если нет — это дефект класса «слепо», и он гейтит любой будущий арбитраж (нельзя улучшать то, чего не видно).
**Не чинить.** Работа A — диагноз, а не правка. Код бэкенда — чужая зона и **прямо сейчас в ней ЖИВАЯ сессия** (строки 104/46/16: `internal/config/`, `internal/pipeline/`, новый `internal_call.go`). Твои находки уезжают строками бэклога и рекомендациями §6.
---
## §4. Работа B — АРБИТРАЖ: голд → уверенность → консилиум (≤$1.40 из общего потолка)
**Порядок жёсткий: без B1 остальные пробы неинтерпретируемы.**
**B1. Голд-набор ($0, гейт остального).** Без размеченной истины любое правило арбитража нефальсифицируемо. **Ядро уже есть:** `~/books/gu-zhenren/guzhenren-seed-v2.yaml` — 58 записей, **53 `approved`** с подписанным владельцем dst; плюс дистилл-фикстура BANK-FULL (150 поверхностей побайтно равны боевому TSV, D39.75-ж) и банк coldrun-a. Собери из этого голд и **честно назови его смещение**: сид — это термы, до которых у владельца дошли руки, то есть выборка сдвинута к важным и уже спорным. Нужны ли добавки (мини-голд алиасов §E-1 research/20 — вопрос владельцу, ответа на него нет с 17.07) — реши и сформулируй запрос конкретным списком, а не «нужна разметка». Голд персистить в `eval/bank_arbitration/gold/`, провенанс каждой строки — обязателен.
**B2. Калибровочная проба (≤$0.60): МОГУТ ЛИ наши модели оценивать свою уверенность.** Прямой вопрос владельца, и он не выводится из литературы — только замером на НАШИХ моделях и НАШЕЙ задаче. Пре-регистрируй критерий. Замерь **разделяющую способность, а не точность**: попадает ли верный по голду dst в верхнюю часть шкалы чаще неверного (ранговая мера — AUC или её непараметрический эквивалент; на десятках термов доверительный интервал широкий, и это надо честно напечатать). Обязательные срезы:
- **числа против слов** (0100 против «точно / скорее да / не уверен / не знаю») — какая форма разделяет лучше и стабильнее при повторе;
- **устойчивость к повтору** (тот же вопрос дважды — тот же скор?) и к перестановке вариантов;
- **сравнимость МЕЖДУ моделями** — ключевой вопрос: «0.9» модели A и «0.9» модели B это одна шкала? Приор: **нет**, и тогда сырой кросс-модельный скор как решающее правило запрещён без калибровки;
- **канал отказа** — воспроизводится ли нестабильность ⟦TM-NO-DST⟧ (§2) в лучшей конструкции;
- **против бесплатного базиса:** бьёт ли уверенность сегодняшние даровые сигналы (частота по чанкам, конформность, лемма, согласие вариантов) — это БАР (в). Не бьёт → в отчёт идёт «уверенность как арбитр закрыта по нужности», и это полноценный результат пака, а не провал.
**B3. Консилиум (≤$0.80): форма, а не факт.** Владелец назвал «консилиум без голоса» (равноправные модели) и допустил взвешивание. Сравни на голде минимум три формы против базиса §C2-3:
- **(и) равноправный совет** — N моделей независимо, агрегатор детерминированный;
- **(ии) улики-первым** — §C2-3 решает, совет только на спорных (близкая верхушка) — дешевле в N раз, потому что спорных меньшинство;
- **(иии) взвешенный** — веса из B2/голда, а не назначенные.
Плюс **обязательный контроль:** одна модель, спрошенная N раз (само-согласованность). Если она даёт тот же выигрыш, что совет разных моделей, то «разные семейства» не окупаются, и это ровно вопрос Q2 (строка 5), на который пак и обязан ответить.
**Главное возражение, которое обязано быть проверено, а не обойдено — СВЯЗНОСТЬ СИСТЕМЫ.** Строки банка не независимы: они образуют системы (семья общего корня, серия рангов, регистр обращения, алиас-граф одной сущности). **По-терминный argmax ломает систему, даже когда каждый выбор локально лучший** — и это у нас уже измерено на серии (§2, D39.65 строка 21). Пример класса, НЕ покрытого сегодняшним `DetectSeries` (равная длина + общая голова): семья общего корня, где члены разной длины и голова разная — модель A даёт связную тройку «энергия/камень/жила», модель B связную «ци/камень ци/канал ци», а по-терминный победитель собирает химеру из обеих. **Требование к дизайну: единица арбитража — КЛАСТЕР, а не строка**; совет голосует за согласованный набор, а отклонение отдельной строки от набора — исключение, требующее улик. Проверь это на голде и назови, какие кластеры сегодня детектируются, а какие нет.
**Стоимость обязана быть посчитана в терминах КНИГИ, а не пробы:** число различных термов насыщается, число глав — нет. Дай оценку «$ на книгу в 1000 глав» для каждой формы, с названным допущением о росте словаря.
---
## §5. Работа C — ИНЖЕКТ/ФЕТЧ (≤$0.60)
Владелец назвал инжект и фетч отдельно, и по §2 это ось РЕКУРРЕНТНЫХ денег. Известное: recall банка на холодном прогоне 0.918/0.980 (D39.58). **Но recall — не продуктовая метрика.** Мерить надо ПОСЛУШАНИЕ и ВРЕД: раз модели инъекцию слушают (наша же эмпирика), они одинаково послушно берут и неверную строку.
- **Что мерить:** доля инъецированных строк, реально отражённых в выходе; доля случаев, где инъекция ИСПРАВИЛА выход против безинъекционного контроля; и **доля, где она его УХУДШИЛА** (неверная строка, неуместный падеж/регистр, вытеснение более нужной строки бюджетом).
- **Ручки, которые стоит различить:** объём инъекции (токен-бюджет) · порядок · пометка (закон против ⟨проверить⟩) · sticky-окно · разница между черновой и редакторской формой (`RenderGlossaryBlock` против `RenderEditorConstraintBlock`).
- **Проба маленькая и адресная:** это не полный эксп-пакет, а замер, отвечающий «есть ли здесь вообще управляемый рычаг». Нет рычага — так и скажи, строка уедет в бэклог с честным «не окупается мерить дальше».
-**Не строй эмбеддинг-ретривал.** Закрыт по нужности (D39.69), реопен = измеренный recall-разрыв НА МАСШТАБЕ, и только batch-time лейн. Если твой замер такой разрыв покажет — это находка, а не разрешение строить.
---
## §6. Работа D — РЕКОМЕНДОВАННЫЕ ДАЛЬНЕЙШИЕ АЛГОРИТМЫ ($0, обязательный деливерабл)
**Прямой запрос владельца.** Отдельной секцией — ранжированный список того, что делать дальше с банком, **как инженерная рекомендация, а не как список идей**. На каждый пункт: что даёт (по возможности числом или названным ожидаемым эффектом) · чего стоит (деньги и сложность) · на чём стоит (какой замер его обосновывает) · **чем опровергается** · зависимость от других пунктов. Явно раздели три корзины: **строить сейчас** · **измерить прежде чем решать** · **закрыть по нужности** (последняя обязана быть непустой — если у тебя всё «надо строить», ты не применил §0 п.1).
Обязательно накрой: арбитраж (итог §4) · связность кластеров · инжект (итог §5) · наблюдаемость «почему такой dst» · холодный старт против накопленного банка · перенос на вторую пару (ja→ru; ⚠ **не-CJK детектора не существует** — строка 35, en-майнер даёт 0 эмиссии, ja с zh-таблицами активно неверен 0/10) · серийный шаринг банка между книгами (строки 48а/48б).
**Свободная критика приветствуется.** Если считаешь, что центральная ценность лежит не там, где мы её ищем, — скажи это с обоснованием: это ровно тот случай, ради которого написано процессное правило №4.
---
## §7. Чего НЕ делать
`backend/` **не править ВООБЩЕ** (чужая зона; там ЖИВАЯ сессия — незакоммиченные `internal/config/`, `internal/pipeline/`, новый `internal_call.go`) · `frontend/`, `platform/`, `START_PROMT.MD`, `.claude/settings.local.json` — не трогать · **`~/books/gu-zhenren/coldrun-a/` — ЗАМОРОЖЕННЫЙ ЭТАЛОН, только чтение**; `coldrun-b/`**стенд живой бэкенд-сессии, не трогать вовсе** · пробы гонять СВОИМ харнессом в `eval/bank_arbitration/` против API напрямую (не через движок — так проба не зависит от незакоммиченного кода; перенос выводов в движок обязан быть назван явно) · **`.env` НЕ читать** · слаги моделей — live-фактчеком `/models`, не по памяти · **DeepSeek thinking НЕ отключать**; помни, что бэнк-роли на вендор-дефолте `high` сейчас упираются в потолок (§2) — в СВОЁМ харнессе эффорт задаёшь ты сам, и это надо напечатать в отчёте, иначе числа несравнимы · тексты книги в доки НЕ цитировать (сырьё durable в `~/books`) · не коммитить · **не строить механизм, потому что он красивый** — только под измеренную нужду (канон целей, п.3).
**Фолд-ось: любое предложение обязано назвать свою цену детерминизма.** Строки банка фолдятся в `memory_version`, резолвнутая конфигурация — в снапшот → `RequestHash` → чекпойнты. Смена правила арбитража меняет банк ⇒ меняет инъекции ⇒ **промахивает чекпойнты и перекупает прогон**. Рекомендация без ответа «что это двигает и сколько стоит пере-покупка» неполна.
---
## §8. Отчёт и СТОП
`docs/research/24-bank-arbitration.md`: эхо-шапка · **§A критика текущего кода** (дефекты с `file:line`, классами и вердикт-тройками) · **§B арбитраж** (голд и его смещение · числа калибровки со знаменателями и интервалами · формы консилиума против базиса §C2-3 · кластерная связность · $ на книгу) · **§C инжект/фетч** · **§D рекомендации тремя корзинами** · **вопросы владельцу** отдельным коротким списком (если нужен мини-голд — конкретным перечнем) · **критик полноты против себя** (обязательная секция: какой класс явлений не покрыт, какая проба не гонялась, какой вывод стоит на одном источнике) · **адверсариальный проход author≠reviewer** по своим выводам · **заявление = команда**: каждое число сопровождено командой/скриптом, которым получено (приёмка их пере-ранит) · провенанс сырья · деньги по пробам и суммой.
Краткий итог — `docs/PROGRESS.md`, секция `## Полигон`, СВЕРХУ; бэклог-таблицу и CURRENT-STATE НЕ трогать. D-номер лендинга проставит оркестратор. **СТОП — приёмка оркестратора.**
**Легитимные исходы пака, которые НЕ являются провалом:** «консилиум не бьёт базис — закрыть» · «уверенность не разделяет — закрыть» · «голда недостаточно, вот точный запрос владельцу — остальное неинтерпретируемо» · «рычаг лежит в инжекте, а не в арбитраже».