Add handoff prompts for backend fixes package and polygon pilot-harness repair, linked from README and journal

This commit is contained in:
Claude (backend session) 2026-07-09 16:25:07 +03:00
parent 8ac568b97e
commit bc7ee58f80
4 changed files with 101 additions and 1 deletions

View file

@ -0,0 +1,48 @@
# Промт: бэкенд-сессия — пакет фиксов стратегического ревью (D15/D16, 2026-07-09)
---
Ты — **бэкенд-сессия** TextMachine, зона записи `backend/` (+ твоя запись в `docs/PROGRESS.md` §Бэкенд). Корневой `CLAUDE.md` уже в твоём контексте — гардрейлы и зоны оттуда обязательны (**`.env` не читать; DeepSeek thinking НЕ отключать; слаги моделей не менять; коммиты en ≤30 слов без Co-Authored-By**). `docs/` (кроме своей секции журнала) и `eval/` не редактировать — расхождения пингом оркестратору в PROGRESS.
## Онбординг (порядок чтения)
1. `backend/README.md` — карта пакетов + 7 инвариантов «ломать нельзя».
2. **`docs/architecture/05-decisions-log.md` — контракт; твой мандат = D15.3, D16, D13.6** (блок «Пост-ревью решения D13D17»).
3. `docs/architecture/07-strategic-review.md` §4.34.4 — детальные трассы находок (каждая воспроизведена исполнением; номера строк могли сместиться — сверяй по своему коду).
4. По ходу: `03-implementation-notes.md` (контракты), `00-provider-quirks.md` (перед любой правкой адаптеров).
Дисциплина проекта: каждый фикс — с регресс-тестом, **mutation-verified** (реверт фикса валит именно его тест); финал — агентское адверсариальное селфревью (несколько дименсий → независимая верификация каждой находки); `go build/vet/test ./... -race` зелёные и `tmctl report` за $0 — перед сдачей. Живые LLM без нужды не звать.
## Задача 1 — гигиена (первым, мелко, до механики)
1a. **Лгущие комментарии resume**: `runner.go:~156-160` и `coverage.go:~29-33` обещают «re-classify from checkpoint for FREE / no re-bill» — это верно ТОЛЬКО внутри неизменного снапшота; после `--resnapshot` ВСЕ чекпоинты промахиваются (snapshotID вшит в RequestHash, `render.go:~212-214`) и книга переоплачивается (воспроизведено ревью: 2→4 оплаченных вызова на байт-идентичных телах). Механику НЕ менять — только честные комментарии (+ упоминание D15).
1b. **Бамп edit `prompt_version`** `v0-draft``v1-monolingual` в `pipeline-c1.yaml` и `pipeline-c2.yaml` (D1-уточнение №3 не исполнено: коммит 6a68dfd сменил SHA editor.md, лейбл остался — один лейбл на два SHA). Это сменит снапшот — осознанно, боевых прогонов ещё не было.
1c. Битая docs-ссылка `capability.go:3`: «03-decisions-log» → «05-decisions-log».
## Задача 2 — D16: фиксы границ доверия памяти (ядро НЕ трогать — F1/нормализация/спойлер/инъекция чисты)
2a. **Полисемия same-src (D16.1).** Репро: две approved-записи один src / разные sense / разные dst / пересекающиеся (или дефолтные 0/0) окна → обе инжектятся CONFIRMED (`memory.go:~198-204,299-306` — keyOwners), модель получает противоречивые авторитетные строки; post-check даёт гарантированный confirmed-miss (`mempostcheck.go:~63-75`), с `postcheck_gate=true` — детерминированный livelock чанка. Гарды не ловят: `memseed.go:~155-163` требует равного sense, injectivity смотрит dst-сторону. **Рекомендуемый фикс: fail-loud в `loadGlossarySeed`** — same-src + different-sense + different-dst с пересекающимися окнами = ошибка сида (запасной вариант: даунгрейд обоих совпадений в AMBIGUOUS). ⚠ `memseed_test.go:~100-103` сейчас благословляет кейс («distinct senses should be allowed») — пересмотри тест под новый контракт; одноиероглифный src (道) отсечён A3-баном — не регресси.
2b. **Sticky наследует disposition (D16.2).** Репро: collision-prone ключ (≤3 фонетических) фаерится ВНУТРИ чужого слова → честно AMBIGUOUS, но id попадает в activeIDs без disposition (`memory.go:~323`) → в чанке N+1 sticky даёт status-based CONFIRMED (`memory.go:~391-398`, via=="sticky" обходит collision-чек), минуя post-check (`mempostcheck.go:~64`), прямо в editor-констрейнты (`memory.go:~465`). Фикс: наследовать disposition исходного матча в sticky-кэрри ИЛИ класть в activeIDs только CONFIRMED-ids. Бамп `memoryMatchVersion`.
2c. **Source-граница для фонетических ключей ≥4 (D16.3).** `collisionProneKey` покрывает только significantLen ≤3 (`memory.go:~62-64`), Aho-Corasick границ не знает (`memory.go:~552-581`) → approved «rose» = CONFIRMED внутри «roseanne»; 4-kana ключ — внутри компаунда. Фикс: для фонетических скриптов (латиница, кана) матч валиден только при не-буквенных (или чужескриптовых) соседних рунах; Han не трогать (сегментации нет — это осознанно). Асимметрия с target-`containsWholeWord` закрывается. Бамп версии.
2d. **Ruby-reading как поверхность (D16.4), минимальный вариант:** reading НЕ выбрасывать для ручных терминов (`memseed.go:~217-220`) — сделать его alias соответствующей manual-записи (кана-написание имени становится матчимым). Auto-кандидаты без dst остаются нематчимыми (осознанно, до B6). Плюс: задокументируй в `backend/README.md` чек-лист ja-книги («kana-написания сид-имён — aliases руками до этого фикса/сверх него»).
## Задача 3 — D15.3: `tmctl status` + `redrive` (контракт D12, «Прогресс — единственный реальный пробел»)
3a. `tmctl status --config book.yaml`: READ-ONLY проекция `chunk_status`+`jobs`+spend+request_log (0 LLM, 0 replay); `--json` со стабильными enum disposition/flag_reason; **book manifest на snapshot** (честный знаменатель N/M); unit-счёт done/in-progress/flagged/skipped/pending (% только из N/M, никакого синтетического time-бара); flagged≠failed, всегда REASON; паспорт качества главы (total/ok/flagged/skipped, worst flag_reason, coverage-вердикт, $); деньги committed/reserved/ceiling% + projected book cost; ETA от EWMA — вторично. Заодно доложи телеметрию эскалации на flagged-resume (отложенная находка №6 внешнего ревью Вехи 2.5 — ей нужна колонка escalation в chunk_status).
3b. `tmctl redrive`: точечная переатака ФЛАГНУТЫХ чанков (DispOK не трогать — D12) без `--resnapshot`: выбор по (chapter,chunk) и/или flag_reason; сброс терминального флага + ре-ран только выбранных; redrive получает свежий retry/escalation-бюджет (явная команда оператора — задокументируй семантику). Деньги: redrive-вызовы биллятся штатно (reserve/settle+checkpoint).
## Задача 4 — D15.2: СПЕКА content-addressed resume (документ, НЕ код)
Полная спека (в `03-implementation-notes.md` новым разделом либо отдельным доком — реши сам, скажи оркестратору): как переиспользовать чекпоинты при смене снапшота без потери snapshot-гарантий. Вход: `msgsContentHash` уже существует (`render.go:~233-249`), но заперт условием `cs.SnapshotID == snapID` (`runner.go:~874`). Ключевые вопросы спеки: разделение «wire-байты» vs «вердиктные версии» (classifier/coverage) в снапшоте; когда байт-идентичный запрос легально переиспользовать; что с re-classify по новым порогам; ось безопасности — никакого тихого расходящегося ре-пэя (класс F1). Гейтит онгоинг Ф1.5 — реализация ПОСЛЕ утверждения спеки оркестратором.
## Задача 5 — D13.6: reasoning-буфер в `EstimateUSD` для additive-провайдеров
xAI биллит reasoning ПОВЕРХ completion (`pricing.go:~108-111` признаёт овершут). Для think-арма пилота (D13.6): (а) `EstimateUSD` резервирует явный reasoning-бюджет для провайдеров с `reasoning: additive`; (б) fail-fast валидация «стадия с reasoning low|medium|high на additive-провайдере без буфера» (сейчас конфиг загрузится молча — `pipeline.go:~220-224`; контраст с эхо-миной, у которой структурный гейт есть). Снимает D6.2-блокировку think-ON на grok.
## Задача 6 — выборочная перепроверка отсевов прошлых ревью (дёшево, важно)
Ревью доказало один ложно-негативный отсев 44-агентки (sticky-апгрейд, 0/3 — рациональ не проверялась исполнением). Подними из PROGRESS (§«44 агента», ~строка 494) список отсеянных кандидатов и миноров; перепроверь адверсариально С ИСПОЛНЕНИЕМ хотя бы все 0/3-отсевы (временные тесты — удалить после, `git status backend/` чист). Подтверждённые — в фиксы этой же сессии; отчёт по каждому — в журнал.
## Приёмка сессии
`go build/vet/test ./... -race` зелёные; каждый фикс mutation-verified; `tmctl report` $0; `tmctl status`/`redrive` продемонстрированы на example-книге (моки/чекпоинты, $0); селфревью проведено, находки исправлены; запись в `docs/PROGRESS.md` §Бэкенд (итоги, техдолг, вопросы оркестратору) + спека D15.2 сдана на утверждение. Порядок задач 1→2→3 жёсткий; 46 — параллелятся по твоему усмотрению.

View file

@ -0,0 +1,51 @@
# Промт: полигон-сессия — починка пилот-харнесса + пробы (D13/D14/D16, 2026-07-09)
---
Ты — **полигон-сессия** TextMachine, зона записи `eval/` + `docs/experiments/` (+ твоя запись в `docs/PROGRESS.md` §Полигон). Корневой `CLAUDE.md` уже в контексте — гардрейлы обязательны (**`.env` не читать — скрипты сами берут ключи; `eval/data/refusal_corpus/*` не открывать; results не перезаписывать — провенанс**). `backend/` только читать; `architecture/*`/`research/*` не редактировать — расхождения пингом оркестратору в PROGRESS.
Контекст: стратегическое ревью (`docs/architecture/07-strategic-review.md`) верифицировало дефекты пилот-харнесса — **пилот Ф2.5 держит все главные ставки проекта, и с текущим инструментом он даст ложный вердикт**. Твой мандат — D13 (поправки пилота), D14.2 (проба Mistral), D16-хвост (kana-precision). Контракт: `docs/architecture/05-decisions-log.md`, блок «Пост-ревью решения D13D17».
## Онбординг (порядок чтения)
1. `eval/README.md` — карта скриптов + 6 правил, выученных на ошибках.
2. `05-decisions-log.md` D13D17 (мандат) + `07-strategic-review.md` §4.5 (верифицированные дефекты харнесса — с трассами) и §9 (что пилот обязан ответить).
3. `docs/experiments/09-pilot-protocol.md` (текущий протокол — ты его обновляешь) + `00-provider-quirks.md` (перед любым вызовом провайдера).
4. Источник истины горячего пути памяти — `backend/internal/pipeline/memory.go` (+ memnorm/mempostcheck): **при расхождении зеркала с Go — верить Go**. ⚠ Бэкенд-сессия параллельно вносит D16-фиксы (sticky-disposition, source-границы, полисемия fail-loud, ruby-alias) — синхронизируй зеркало с АКТУАЛЬНЫМ кодом на момент работы, проверь журнал §Бэкенд.
## Задача 1 — починка `eval/pilot/memory_eval.py` (D13.5; решающий инструмент memory-ставки)
Верифицированные дефекты (07-ревью §4.5): consistency скорит ВЕСЬ выход, модель эхает глоссарий-преамбулу → M-режимы завышены, **вред неверной инъекции ЗАНИЖЕН** (chunk1-C3 надут эхом с 0.667 до 1.0); полные выходы не сохранены (`out[:160]`); fidelity-оси нет. Сделать:
1a. **Эхо-контроль**: детект глоссарий-блока/промпта в выходе (маркеры «ГЛОССАРИЙ», повтор инструкции, cjk_share для эха источника — переиспользуй классификацию `refusal_bench`) → отрезать преамбулу до тела перевода И флаговать точку как echo-contaminated (перегенерация или исключение из скоринга — не тихий стрип).
1b. **Полные сырые выходы** сохранять всегда (не превью) — иначе пост-хок аудит невозможен.
1c. **Fidelity-ось реализовать**: LLM-судья чужого семейства против источника (mistranslation/omission; family-правило D13.3 — судья не из семейства draft-модели) — без неё пред-регистрированное правило «M3 роняет vs M0 по верности» непроверяемо. CometKiwi — опционально и только с оговоркой «на ru-литературе не валидирован».
1d. **Переименовать режимы C0C3 → M0M3** (коллизия с конфигурациями ядра exp09 §3) — в скрипте, данных и exp09.
1e. **Синк зеркала с Go** по 7 расхождениям из ревью: sticky-глубина (Go: stickyDepth=2), `until_ch` (не реализован в eval-select), span-containment со спойлер-гейтом суппрессора, токен-бюджет/eviction, sticky-диспозиция (после D16.2-фикса бэкенда — наследование!), полная trad2simp-таблица (вендорить из `backend/internal/pipeline/data/trad2simp.txt`), ignorables (Cf+VS-диапазоны). Плюс `declmetric.py`: dash-fold/ignorable-strip + граница по `unicode.IsLetter`-эквиваленту (сейчас только кириллица).
1f. **Пере-прогнать индикатив на Ah-Q** после фиксов; ожидание: M3-вред станет виднее. Обновить exp09 и цифры в своей записи PROGRESS (старые «C1 1.0 = C2 1.0, C3 0.60» пометить как контаминированные).
## Задача 2 — гигиена оценочных артефактов (урок exp04)
Верифицировано: ключ моделей+цены лежал В ТОМ ЖЕ артефакте при LLM-оценке (за `<details>` — для LLM-фетча это не скрытие), маппинг A/B/C/D фиксирован на всех фрагментах. Сделать: (а) `build_editor_artifact.py` — пере-рандомизация меток per-фрагмент, ключ — ОТДЕЛЬНЫМ файлом, не публикуемым до вынесения оценки; (б) в `04-editor-quality.md` добавить честную оговорку о слепоте задним числом (сноска, историю не переписывать): выбор grok-4.3 остаётся провизорным, страхуют объективные латентность/цена и руки пилота (7-bis + D13.1).
## Задача 3 — протокол пилота v2 (`09-pilot-protocol.md`; правки D13)
3a. **Новые/правленые армы**: «моно vs билингв редактор на ОДНОЙ модели, простой general-промпт» (D13.1 — прямой тест D1; отдельно от 7-bis); C2 — только ГЕТЕРОГЕННЫЕ кандидаты (разные модели, D13.2 — на гомогенных селекция ≈ монета).
3b. **Панель судей (D13.3)**: 23 семейства максимум; **11+ повторов на вердикт со свапом позиций A/B**; агрегация Bradley-Terry/медианой; **grok исключён из судейства grok-редактированных выходов**; валидация судьи — κ против человеческого IAA + tie-rate/top-1 within-prompt (НЕ средняя корреляция).
3c. **Пре-регистрация (D13.4)**: MDE/мощность (число BWS-наборов), N аннотаторов ≥3 (иначе явный «безκ-режим»), правила решения по каждой руке — зафиксировать ДО решающего прогона неизменяемым разделом.
3d. **Инструмент**: оценить Pearmut (arXiv:2601.02933 — открытая платформа человеческой оценки с attention-checks) ПРЕЖДЕ постройки своего BWS-тулинга; вердикт «берём/своё» — в exp09.
## Задача 4 — проба Mistral для канала B (D14.2)
Mistral Usage Policy (eff. 11.06.2026) без бланкетного запрета adult-текста → кандидат-фолбэк канала B (DeepSeek для explicit выбыл по своему ToS — D14.1). Сделать: завести Mistral в `providers.json` (⚠ **`MISTRAL_API_KEY` в наборе НЕТ — запроси у владельца**; без ключа задача блокирована — так и пометь); прогнать SFW/L1/L2-violence срез refusal-бенча сразу; explicit-часть — когда владелец даст фрагменты (та же 18+ рука exp02, единственный critical ревью). Заодно снять базовое качество ru-перевода Mistral на 23 PD-фрагментах (индикативно — годен ли вообще как переводчик канала B, не только «не отказывает»).
## Задача 5 — kana-precision (D16-хвост; расширение E1-протокола)
`minKeyLenPhonetic=3` в Go — «консервативный дефолт до замера» (`memory.go:~42-48`). Собери ja-kana ловушки (аналог омографов retrieval_bench: 23-kana ключи внутри частых слов/компаундов, реальные имена из PD-ja корпуса) и замерь precision матчера на MIN=2/3/4 — вход для прод-ja решения (подтвердить 3 / поднять / развести по типу каны). Учитывай D16.3-фикс бэкенда (source-границы) — мерь ПОСЛЕ него или на обеих версиях.
## Задача 6 — вебновелл-срез (блокирована корпусом владельца; подготовь скрипты заранее)
Когда владелец положит 35 глав реальных вебновелл в `eval/data/samples/`: довалидация r-коэффициентов (exp01/08), precision coverage-гейта на терсных репликах (exp07 §просьба — гейтит снятие 1-флаг-толерантности), частота DeepSeek-эха вне претрейна. Подготовь прогоны так, чтобы по появлению файлов запускалось одной командой.
## Приёмка сессии
Обновлённые `memory_eval.py`/`declmetric.py` (эхо-контроль, полные выходы, fidelity, M0M3, синк с Go) + пере-прогнанный индикатив; `09-pilot-protocol.md` v2 с D13-правками и пре-регистрационным каркасом; вердикт по Pearmut; Mistral-прогон (или явный блок «нет ключа»); kana-precision отчёт; всё — с провенансом (model id, дата, usage, сырые выходы). Запись в `docs/PROGRESS.md` §Полигон: итоги, изменившиеся цифры, вопросы оркестратору/владельцу.

View file

@ -62,7 +62,7 @@
- **Роль оркестратора передана этой сессии (решение владельца 09.07).** Владелец подтвердил курс: Rust-переписывание — НЕТ до пост-пилота (Р1/Go остаётся); архив + онбординг-доки — одобрены.
- **Ратифицированы D13D17** ([05-decisions-log](architecture/05-decisions-log.md)): D13 поправки пилота (арм моно-vs-билингв, гетерогенные кандидаты C2, панель 23 семейства × 11+ повторов, починка харнесса ДО прогона); D14 канал B (минус DeepSeek-explicit, плюс проба Mistral, xAI-опора = AUP); D15 resume/онгоинг (комментарии-фиксы + status/redrive сейчас, content-addressed reuse — гейт онгоинга); D16 фиксы границ памяти; D17 D1 понижен до «дефолт Ф1, оспорен — решает пилот».
- **Консолидация доков:** `02-mvp-plan` → v3 (мёртвые пороги сняты, интерим-18+ переписан, фазы синхронизированы); обе `*.puml` → v3 (минус Opus/BYOK/«≤2×», плюс ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01/02/03/04/09`; провенанс-шапки на два внешних `12-*`-дока; закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md` + обновлённый `docs/README.md`.
- **Следующее (оркестратор):** хендофф-промты сессиям «Бэкенд» (пакет D15.3/D16 + выборочная перепроверка отсевов) и «Полигон» (харнесс D13.5 + проба Mistral + kana-precision) — по запросу владельца.
- **Хендофф-промты выданы (09.07):** [`BACKEND_SESSION_PROMPT_REVIEW_FIXES.md`](BACKEND_SESSION_PROMPT_REVIEW_FIXES.md) — гигиена (комментарии resume, prompt_version-бамп) → фиксы памяти D16 → `tmctl status`/`redrive` → спека content-addressed resume (D15.2) → reasoning-буфер additive (D13.6) → перепроверка отсевов 44-агентки; [`POLYGON_SESSION_PROMPT_PILOT_HARNESS.md`](POLYGON_SESSION_PROMPT_PILOT_HARNESS.md) — memory_eval (эхо-контроль, полные выходы, fidelity, M0M3, синк с Go) → гигиена оценочных артефактов → протокол пилота v2 (D13) → проба Mistral (⚠ нужен `MISTRAL_API_KEY` от владельца) → kana-precision → подготовка вебновелл-среза. ⚠ Порядок запуска: бэкенд-сессию первой или одновременно — полигон синкает зеркало памяти с кодом ПОСЛЕ D16-фиксов (в промте оговорено).
## Бэкенд

View file

@ -16,6 +16,7 @@
- `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13).
- `research/` — фактура исследований 0405.07: `0110` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**.
- `PROGRESS.md`**журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений).
- **Активные хендофф-промты**: [`BACKEND_SESSION_PROMPT_REVIEW_FIXES.md`](BACKEND_SESSION_PROMPT_REVIEW_FIXES.md) (пакет D15/D16) · [`POLYGON_SESSION_PROMPT_PILOT_HARNESS.md`](POLYGON_SESSION_PROMPT_PILOT_HARNESS.md) (харнесс D13 + пробы).
- `archive/` — закрытые сессионные промты (только история, инструкции оттуда не исполнять).
## Статус (2026-07-09)