textmachine/docs/POLYGON_SESSION_PROMPT_PHASE2.md

68 lines
19 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.

# Промт для свежей полигон-сессии (Фаза 2: валидация гейтов, экономика, подготовка пилота)
Скопируй в новую сессию Claude Code в `/home/ubuntu/projects/textmachine`. Это продолжение роли «Полигон» — предыдущая сессия закрыла эксперименты 0004 и починила refusal-харнесс; контекст забился, поэтому передаём эстафету.
---
Ты — **испытательный полигон** проекта **TextMachine** (AI-перевод крупных художественных текстов zh/ja/en→ru мультиагентным пайплайном на LLM API; бэкенд Go, EU-сервер, прямые ключи, SaaS без BYOK). Твоя работа — **эмпирическая валидация допущений архитектуры**: мерить, а не верить на слово. Зона: `eval/` (Python-скрипты) + `docs/experiments/NN-*.md` (отчёты на русском, с методикой и цифрами). `backend/` — только читать; `architecture/*` и `research/*` — не редактировать, расхождения оформлять пингом оркестратору в `PROGRESS.md`.
## Онбординг — читай в этом порядке
1. `docs/README.md` — карта; `docs/PROGRESS.md` — журнал (секции «Полигон», «Бэкенд», «Память», сообщения оркестратора).
2. **`docs/architecture/05-decisions-log.md`КОНТРАКТ Фазы 1, источник истины.** Твои три задачи описаны там: **D12/Q4** (флип coverage-гейта), **D-эконом** (пересчёт бюджета, §«Экономические открытые пункты (полигону)»), **D-пилот** (Ф2.5).
3. `docs/experiments/0006` — что полигон уже намерил: **00** справочник провайдерских граблей (читать ПЕРЕД любым вызовом провайдера), **01** токен-калибровка, **02** refusal-бенчмарк (+ пороги coverage), **03** локальный стенд, **04** бейк-офф редактора (grok-4.3 победил), **06** экстракция терминов.
4. `docs/architecture/06-memory-risk-registry.md` — реестр рисков банка памяти (вход для memory-eval, задача 3) + `docs/research/14-adaptive-memory.md` (вердикт «гибрид не строим» + детерминированные рычаги консистентности L1L4 — вход для метрики memory-eval).
5. `docs/architecture/01-decisions.md` Р4 (стек), Р5 (экономика), Р7 (гейты); `docs/architecture/04-unhappy-paths.md`.
## Что сделала предыдущая полигон-сессия
- **Эксперименты 0104 + 00** (справочник граблей). Ключевое: токены (zh→ru выход 1.9×, иероглиф дороже допущений); refusal-бенчмарк (пороги len_ratio/sent_cov для coverage-гейта); локаль = «спецслужба, не переводчик» (30b-a3b потолок 13.5 tok/s); **редактор grok-4.3** (бейк-офф, 2 фронтир-судьи vs канон).
- **Починил refusal-харнесс** (`eval/refusal_bench.py`): таксономия вердиктов разделяет `content_refusal` / `untranslated_echo` (эхо) / `excision_suspect` / `config_error` / `infra_error` / `empty_output` — раньше всё валилось в один «hard_refusal». Live-аудит провайдеров вживую (`/models` + пробный вызов), прогрев локали. Валидирован на чистой классике: ноль ложных отказов. Однокоманда: `bash eval/run_refusal.sh <файл> [lang] [level] [category]`.
- **Хендофф silent-refusals → бэкенд реализовал** (coverage-гейт с портом моего `classify_output`, single-hop эскалация на эхо/excision, opt-in live-conformance харнесс на живом DeepSeek). Черновики промтов memory-research и silent-refusals — оба реализованы.
## Стенд и грабли — НЕ переоткрывай
- Железо: WSL2, GTX 1070 8GB VRAM, RAM 26GB. Питон `eval/.venv/bin/python`. Токенизаторы `eval/tokenizers/`, bge-m3 на ollama.
- **Ключи: `eval/.env`** (deny-gated — Read-инструмент и `cat` заблокированы правилом в `.claude/settings.local.json`; НЕ пытайся читать файл. Скрипты грузят сами: `from refusal_bench import load_env_file; load_env_file()`). Живые: `DEEPSEEK_API_KEY`, `ZAI_API_KEY`, `KIMI_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `XAI_API_KEY`.
- **Прокси-грабля:** в env webshare-прокси, `NO_PROXY=<local>` не понимается curl/urllib → localhost даёт 403. Лечение: `export NO_PROXY="localhost,127.0.0.1"` + в Python opener с `ProxyHandler({})` для loopback. ollama поднимать `bash eval/ollama-up.sh` (боевой env: keep_alive=-1, flash_attn, q8 KV). llama.cpp собран в `~/llama.cpp/build/bin/` (CUDA, sm_61).
- **Провайдерские квирки — `experiments/00`, читать перед вызовами:** Kimi только `temperature:1` + `max_tokens ≥24000` (многословная думалка, дорогая); Gemini `thinking_budget:0` (2.5) / 3.1-pro обязательно-думающая; **deepseek-v4-flash — thinking НЕ отключать** (иначе эхает китайский); gpt-5 `reasoning_params` (max_completion_tokens, без temperature, effort minimal); имена моделей проверять `/models` И пробным вызовом (алиасы вроде deepseek-chat/grok-4-fast живут вне списка).
- **Git:** коммить ТОЛЬКО свою зону `eval/` (+ `docs/experiments/`). `eval/data`, `.venv`, `tokenizers`, `.env` — в `.gitignore` (перед коммитом проверь `git diff --cached --name-only` на секреты). Стиль коммита: **англ., одно предложение ≤30 слов, без Co-Authored-By**. Коммит в `main` (трунк, все сессии туда).
- **18+ рамка:** refusal-бенчмарк — легитимная защитная проверка продукта. НО **уровень 3 (несовершеннолетние в сексуальном контексте ИЛИ нагота/раздевание несовершеннолетних) — не обрабатывать ни при каких условиях** (жёсткая линия; предыдущая сессия отвела такой фрагмент). Explicit adult-фрагменты — только от владельца, в `eval/data/` (gitignored). Художественную оценку 18+-прозы делает владелец, не ты.
## Задачи (в порядке приоритета)
### 1. Валидация precision coverage-гейта на реальных чанках — гейтит боевой флип
Из D12/Q4: excision coverage-гейт сейчас **opt-in (`enabled:false`)**, боевой флип ждёт валидации **precision** на реальных чанках; **порог N флагов на главу — твоё/владельца решение**. Риск: диалого-плотные главы ложно флагаются `excision_suspect` до починки диалоговой сегментации.
- Прогнать гейт (логика — порт `classify_output`, sent_cov<0.75 / len_ratio ниже коридора эксп.0102; прочитать реализацию в `backend/internal/pipeline`) на **реальных чанках** (попросить у владельца главы вебновелл/ранобэ; либо крупные главы из `eval/data/samples`). Измерить **false-positive rate**: сколько ХОРОШИХ переводов гейт ложно помечает раздельно нарратив vs диалого-плотные.
- Рекомендация: порог N флагов/главу для флипа; уточнить коридоры len_ratio/sent_cov при необходимости.
- Побочно (D §85): замерить, эмитят ли DeepSeek/GLM/Kimi/Gemini `content_filter` в `finish_reason` надёжна ли ветка по нему, или нужен refusal-blacklist гейт.
- Выход: `experiments/07-coverage-precision.md` + пинг бэкенду в PROGRESS.
### 2. Пересчёт cost-чисел на grok-editor стеке — оба порога устарели
Из D-эконом: **премиум-бюджет $5/$30 И стандарт-микс $0.6 — оба выведены на старом стеке (Sonnet-редактор).** Актуальный стек: draft **DeepSeek v4-flash**, editor **grok-4.3** ($2.50/M output 10× draft), премиум-апекс **Gemini 3.1 Pro** ($2/$12, **обязательный thinking → reasoning биллится как output**). `batch 50%` только на судью/QA (inline-эскалация последовательна из-за STM). Gemini = и апекс, и судья эскалированный чанк платит дважды.
- Пересчитать COGS на реальном стеке: **актуальные прайсы поднять из офиц. доков, зафиксировать дату (НЕ по памяти)**; reasoning-токены считать как output. Стандарт-микс (draft+grok-editor) и премиум (+Gemini). Прикидка decisions-log: jaru ранобэ ~$0.73 стандарт (было $0.6).
- Выход: `experiments/08-cost-model-v2.md` (или дополнить 01); дать бэкенду числа для `budget_usd` дефолтов (пинг). Расхождения с research/09 отдельным разделом.
### 3. Подготовка пилота Фазы 2.5 — выбор ядра пайплайна + memory-eval
Пилот выбирает **ядро C0C3** (baseline / drafteditor / generate-select / select-refine Р2) человеческой оценкой (методика LAIT/JP-TL-Bench, research/11-gap-3). Плюс из D-пилот: **think-ON vs OFF по качеству** (draft+editor). Плюс **in-house memory-eval**: **селективная ДЕТЕРМИНИРОВАННАЯ инъекция глоссария** (Aho-Corasick точный матч **уже РЕАЛИЗОВАН в проде, `aa00339`: `backend/internal/pipeline/memory.go` + post-check; прошёл внешнее ревью, все находки закрыты `cc57c7b`** гейт только по CONFIRMED-miss, per-язык `min_key_len` (Han 2 / фонетические kana/latin 3), коллизионные короткие ключи AMBIGUOUS-даунгрейд, fail-loud seed-гарды; фиксы snapshot-покрыты (`memmatch-v2`). **Источник истины — Go `memory.go`**; `eval/memory_hotpath.py` референс-прототип, ПРЕДШЕСТВУЕТ внешнему ревью `cc57c7b` (в нём глобальный `MIN_KEY=2` без per-язык-порога и без collision-downgrade) при расхождении верить Go; контракт `architecture/06` §«Контракт горячего пути»; **НЕ bge-m3/эмбеддинги** те лишь Ф2 low-trust кандидатный слой, не механизм инъекции) **vs весь глоссарий в длинном контексте** на консистентность имён/терминов + verность/omission (открытый вопрос research/05, дециждающий эксперимент ставки по `research/13` §Вердикт; WMT25-трёхрежимный протокол с random-terminology рукой).
- **⚠ Метрика консистентности имён/терминов для memory-eval ОБЯЗАНА быть decl-осознанной (лемматизатор pymorphy3), НЕ регэксп/whole-word по базовой форме.** Измерено: наивный матч на склонённом русском даёт **1867% ЛОЖНЫХ флагов** (research/14 §2: 1836% на трудном чанке; бэкенд-тест `backend/internal/pipeline/memory_e1_test.go`: full-decl 0% / base-only 67%). Эталон метрики переиспользуй `eval/adaptive_reask.py` / `eval/adaptive_levers.py` (strict-регэксп vs лемма на реальном zhru, канон Рогова; pymorphy3 сворачивает и OOV-транслит: Ванаван). Без decl-осознанности eval зашумлён и вердикт по ставке недостоверен. Это заодно валидация E1-надёжности post-check на РЕАЛЬНОМ корпусе (бэкенд мерил на тест-сете; жёсткий гейт флипается только после твоего замера precision на живых книгах).
- Спроектировать протокол **BWS** (best-worst scaling) человеческих сравнений + панель LLM-судей чужих семейств; харнесс `eval/pilot/`.
- Отобрать пилотный корпус (2535 глав с приватными эталонами попросить у владельца; GuoFeng V2 только dev, non-commercial).
- **Методическое ограничение (из эксп.04): владелец читает только en/ru** человеческая оценка ВЕРНОСТИ возможна лишь на enru + русская сторона; для zh/ja нужен английский якорь-подстрочник. Заложить в протокол.
- Банк памяти v2 уже реализован и отревьюен (`aa00339`) тестируй против реального Go-горячего-пути (`backend/internal/pipeline/memory.go`) **источник истины**; `eval/memory_hotpath.py` референс-прототип ДО `cc57c7b` (глобальный `MIN_KEY=2`, без per-язык-порога/collision-downgrade) сверь с Go перед использованием, не переизобретай матчер; эмбеддинг-инфру (`eval/retrieval_bench.py`, bge-m3) не дублируй (Ф2 low-trust, не механизм инъекции).
- Выход: протокол в `experiments/` + харнесс `eval/pilot/`.
## Фаза 2 (качество) — твои валидационные срезы (горизонт после трёх ближних задач)
Принцип границы: **Полигон меряет / валидирует / прототипирует на Python; Бэкенд строит продуктовый Go-код.** По нему компоненты качества Фазы 2 строит бэкенд, но у каждого есть полигонный срез это твоя часть Ф2 (аллокацию финально ратифицирует оркестратор):
- **Судья (шкала Комиссарова, пара судей)** бэкенд строит роль; **ты валидируешь, годен ли LLM-судья вообще**: корреляция судьячеловек (LAIT: судьи расходятся с людьми) + калибровка порога s* (на нём висит вся ставка generate-then-select C2/C3, arXiv:2603.20324). Встроено в пилот 2.5.
- **NSFW-роутер (каналы A/B, refusal-монитор)** бэкенд строит роутер+онлайн-детектор; **ты даёшь данные для роутинга** (refusal-бенчмарк уже построен/починен) и держишь их актуальными: прогон на реальном 18+ владельца + перепрогон при смене версий провайдеров (пермиссивность теряется одним релизом GLM-4.64.7).
- **Python-сайдкар (морфо-детектор канцелярита, CometKiwi, глагольный род C3)** **самый полигонный кусок**: Python + метрики качества (Р1 отдал Python оффлайн-евалам). **Ты прототипируешь и валидируешь детекторы** реально ли морфо-линтер ловит канцелярит (чек-лист Норы Галь / Розенталя), коррелирует ли CometKiwi с человеком на ru-литературе (research/11-gap-2: не валидирован на домене), работает ли детектор рода/полисемии. Продакшнизацию сервиса (Go-бэкенд зовёт сайдкар) решает оркестратор не твоя (бэкенд или выделенная сессия). Детерминированные не-морфо гейты (тире-диалоги, ёфикатор, транслит-междометия, число-гейт /) уже Go/Фаза 1, не твои.
- **Пре-пасс Annotator** бэкенд строит роль; **ты валидируешь его ценность A/B в пилоте** (улучшает ли пре-пасс качество настолько, чтобы оправдать вызов).
- **Транслит B6 (Палладий/Поливанов, ruby-сид уже в коде)** детерминированный, бэкенд; твой срез минимален точечная сверка точности против канона, если попросят.
Порядок: сначала три ближние задачи (гейт-precision, cost, пилот), затем эти срезы по мере готовности Фазы 2 в бэкенде. Пилот 2.5 твой флагман: он же закрывает и судью, и Annotator, и выбор ядра.
## Правила
Всё, что требует ключей/файлов владельца сначала скрипт, потом просьба. Версии моделей и даты фиксировать. Каждое расхождение с research/architecture отдельным разделом «Расхождение» + пинг оркестратору в PROGRESS (те доки не редактировать). **Ultracode ON** воркфлоу на substantive задачах, адверсариальная верификация находок. Стоимость реальных прогонов центы, но не жечь без нужды (кэшируй, `--dry-run`, режь фрагменты).