19 KiB
Промт для свежей полигон-сессии (Фаза 2: валидация гейтов, экономика, подготовка пилота)
Скопируй в новую сессию Claude Code в /home/ubuntu/projects/textmachine. Это продолжение роли «Полигон» — предыдущая сессия закрыла эксперименты 00–04 и починила refusal-харнесс; контекст забился, поэтому передаём эстафету.
Ты — испытательный полигон проекта TextMachine (AI-перевод крупных художественных текстов zh/ja/en→ru мультиагентным пайплайном на LLM API; бэкенд Go, EU-сервер, прямые ключи, SaaS без BYOK). Твоя работа — эмпирическая валидация допущений архитектуры: мерить, а не верить на слово. Зона: eval/ (Python-скрипты) + docs/experiments/NN-*.md (отчёты на русском, с методикой и цифрами). backend/ — только читать; architecture/* и research/* — не редактировать, расхождения оформлять пингом оркестратору в PROGRESS.md.
Онбординг — читай в этом порядке
docs/README.md— карта;docs/PROGRESS.md— журнал (секции «Полигон», «Бэкенд», «Память», сообщения оркестратора).docs/architecture/05-decisions-log.md— КОНТРАКТ Фазы 1, источник истины. Твои три задачи описаны там: D12/Q4 (флип coverage-гейта), D-эконом (пересчёт бюджета, §«Экономические открытые пункты (полигону)»), D-пилот (Ф2.5).docs/experiments/00–06— что полигон уже намерил: 00 справочник провайдерских граблей (читать ПЕРЕД любым вызовом провайдера), 01 токен-калибровка, 02 refusal-бенчмарк (+ пороги coverage), 03 локальный стенд, 04 бейк-офф редактора (grok-4.3 победил), 06 экстракция терминов.docs/architecture/06-memory-risk-registry.md— реестр рисков банка памяти (вход для memory-eval, задача 3) +docs/research/14-adaptive-memory.md(вердикт «гибрид не строим» + детерминированные рычаги консистентности L1–L4 — вход для метрики memory-eval).docs/architecture/01-decisions.mdР4 (стек), Р5 (экономика), Р7 (гейты);docs/architecture/04-unhappy-paths.md.
Что сделала предыдущая полигон-сессия
- Эксперименты 01–04 + 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(многословная думалка, дорогая); Geminithinking_budget:0(2.5) / 3.1-pro обязательно-думающая; deepseek-v4-flash — thinking НЕ отключать (иначе эхает китайский); gpt-5reasoning_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 ниже коридора эксп.01–02; прочитать реализацию в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: ja→ru ранобэ ~$0.73 стандарт (было $0.6).
- Выход:
experiments/08-cost-model-v2.md(или дополнить 01); дать бэкенду числа дляbudget_usdдефолтов (пинг). Расхождения с research/09 — отдельным разделом.
3. Подготовка пилота Фазы 2.5 — выбор ядра пайплайна + memory-eval
Пилот выбирает ядро C0–C3 (baseline / draft→editor / 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 по базовой форме. Измерено: наивный матч на склонённом русском даёт 18–67% ЛОЖНЫХ флагов (research/14 §2: 18–36% на трудном чанке; бэкенд-тест
backend/internal/pipeline/memory_e1_test.go: full-decl 0% / base-only 67%). Эталон метрики — переиспользуйeval/adaptive_reask.py/eval/adaptive_levers.py(strict-регэксп vs лемма на реальном zh→ru, канон Рогова; pymorphy3 сворачивает и OOV-транслит: Вана→ван). Без decl-осознанности eval зашумлён и вердикт по ставке недостоверен. Это заодно — валидация E1-надёжности post-check на РЕАЛЬНОМ корпусе (бэкенд мерил на тест-сете; жёсткий гейт флипается только после твоего замера precision на живых книгах). - Спроектировать протокол BWS (best-worst scaling) человеческих сравнений + панель LLM-судей чужих семейств; харнесс
eval/pilot/. - Отобрать пилотный корпус (25–35 глав с приватными эталонами — попросить у владельца; GuoFeng V2 только dev, non-commercial).
- Методическое ограничение (из эксп.04): владелец читает только en/ru → человеческая оценка ВЕРНОСТИ возможна лишь на en→ru + русская сторона; для 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.6→4.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, режь фрагменты).