textmachine/docs/BACKEND_PACK16_DIFF_EDITOR_SESSION_PROMPT.md

46 lines
11 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 «слой-3 diff-редактор» (ДВУХФАЗНЫЙ: дизайн → ратификация → стройка)
**Статус: ВЫДАН 25.07.2026, оркестратор №7 (ревизия 2 — усилен по анти-рассинк норме).** Слой 3 `09-target-architecture.md` — крупнейший остаток плана; мандат редактора до сих пор full-regen (D39: причина инверсий). Приоритет подтверждён research/22 §2 №1: конкуренты ЧИНЯТ typed-error адресно (AiNiee ProofreadTask — однострочный proofread с `error_type`; LinguaGacha — retranslation-by-keyword), мы только флагаем. Их код GPL/AGPL — НЕ копировать ни строчки, брать только идею. North-star: ИЗМЕРЕННЫЙ вклад петли (сколько чинится по классам), не вера.
**Цель:** флаг детерминированного чекера → адресный ремонт минимального спана дешёвым вызовом → детерминированный re-gate → при неудаче прежний flag+skip.
## Инварианты — «РОВНО ТАК» (ратифицировано, из кода не выводится; конфликт промта с кодом/доками → пинг оркестратору через владельца, НЕ интерпретация)
- **Дисциплина D2 неприкосновенна:** петля НЕ хард-гейт; неудача ремонта = сегодняшний flag+skip, мусор не течёт в TM/экспорт.
- **Лестница эскалации не ломается:** ремонт встраивается в существующую механику `regenerate_before_escalate``escalate_to` (под `budget_usd`), не меняя её семантику молча (развилки — в D3a).
- **Wire/деньги:** $0-резюм драфта НЕ ломать; repair-вызовы = новый класс → чекпойнты, RequestHash, леджер Reserve→Settle с CostSource-маркером; **no-repair путь байт-идентичен** (петля выключена = сегодняшнее поведение, golden compare-режим зелёный БЕЗ пере-капчера).
- **Общность §0:** промпт ремонта = данные пары → файл конвенции `prompts/<пара>/<роль>.md`; никаких пар/книго-литералов в Go; новые ключи конфига проходят строгий декод.
- **Провайдер-ловушки:** DeepSeek thinking НИКОГДА не off (эхо-мина); слаги не менять без live-фактчека.
- **Книга и производные ВНЕ git:** валидация на живых rerun2-выходах — на СТЕНДЕ, без коммита текста; в репо — только СИНТЕТИЧЕСКИЕ фикстуры по образцу дефект-классов (тест-данные пары легитимны §0.3, цитаты книги — нет).
## Отправные точки в код (сверь САМ — код первичен; это entry-points, не предписания; у тебя контекст кода лучше оркестраторского)
Typed-факты чекеров: `internal/checks``CheapGateResult`/`RunCheapGates` (`cheapgates.go:~89/120`), `SanitizerResult`/`SanitizeOutput` (`sanitizer.go:~142/190`), `CoverageResult` (`coverage.go:~139`), DC-паттерны из `configs/langpacks/zh-ru/dc-checkers.txt` (`checkers.go:~50`). Диспозиция-луп: `internal/pipeline/chunkrun.go` (classifyOutput). Гейты в волне: `waverun.go` (draft- и edit-пути). Грубая петля: `retries.regenerate_before_escalate` (`internal/config/pipeline.go:~110`). CostSource: `store/migrate.go` (v10). Инвентаризацию «кто даёт позиции, кто только факт» делай по коду, не по этому списку.
## Онбординг (карта чтения — для направления и глубины)
`CLAUDE.md``09-target-architecture.md` (слой 3) → `docs/archive/reports/PACK15_STRUCTURE_REPORT_2026-07-25.md` (пакет checks, границы) → D39.20 в D-логе (дефект-классы → механизмы) → research/22 §2 №1.
## ФАЗА 1 — ДИЗАЙН (без единой правки кода; каждый пункт — «реши сам и аргументируй», советы оркестратора = приоры, опровергаются только аргументом/замером)
- **D1. Единица ремонта + маппинг флаг→спан.** Инвентаризация: какие чекеры дают ПОЗИЦИИ, какие только факт; что дотипизировать в checks (не ломая API пака-15). *Приор: спан = предложение(я) с матчем + минимальный контекст; дотипизация = позиции в Result-структуры аддитивными полями.*
- **D2. Классы петли v1 vs flag-only.** Критерий отбора: существует детерминированный ре-чек. *Приор: в петлю — юнит-конверсия (时辰), число-масштабы (千万/成), broken-word, latin-residue; flag-only — register/style/coverage (нет детерминированного «починено»). Отдельно отсортируй класс (в): чинится ЧИСТЫМ КОДОМ без LLM (прецеденты уже в проде: заголовок-шаблон пака-13, санитайзер-стрип D30.3) — такие в LLM-петлю НЕ тащить.*
- **D3. Механика вызова.** Промпт ремонта (src-спан + draft-спан + типизированная ошибка → исправление; язык = данные пары) · где живёт в конфиге (суб-шаг edit-стадии vs новая стадия) · модель · потолок вызовов/бюджет · loop-guard. *Приор: суб-шаг edit-стадии (меньше поверхности схемы/снапшота), модель = дешёвая (flash-класс), 1 раунд на чанк, re-gate тем же чекером + полной cheap-сюитой юнита.*
- **D3a. Позиция в лестнице эскалации.** Как ремонт соотносится с `regenerate_before_escalate` и `escalate_to`. *Приор: для typed-span дефектов ремонт ПЕРВЫМ (дешевле полного re-gen); regenerate остаётся для классов без спана; эскалация не трогается. Провал ремонта НЕ триггерит regenerate автоматически (иначе двойная оплата пути) — аргументируй, если не согласен.*
- **D4. Wire/снапшот/resume.** RequestHash для repair-вызовов · чекпойнт-ключи (резюм скипает сделанный ремонт) · снапшот-фолд промпта ремонта · resnapshot ОДИН · golden: эволюция capture новым классом вызовов — пере-капчер ТОЛЬКО по санкции, no-repair путь без пере-капчера.
- **D5. Деньги/отчётность.** CostSource-маркер для repair · счётчики «починено/по классам/не удалось» в quality-report и паспорт главы.
- **D6. $0-валидация.** Синтетические фикстуры дефект-классов в репо (см. «РОВНО ТАК» про книгу вне git) + прогон на стенде против живых rerun2-выходов без коммита; mini-live гейт = отдельное решение владельца, НЕ в паке.
**Приёмка фазы 1:** отчёт-предложение `docs/archive/reports/PACK16_DESIGN_<дата>.md` — НАЧИНАЕТСЯ эхо-блоком (≤10 строк: скоуп / инварианты / не-делать — как ты их понял; расхождение чиним сразу), затем по каждому D: варианты, рекомендация, риски, где расходишься с приорами и почему; адверсариальный селф-ревью дизайна (линзы: детерминизм/resume · деньги · D2-дисциплина · общность «заработает ли на паре, которой нет»). Кода НЕ трогать. **СТОП — ратификация оркестратора через владельца.**
## ФАЗА 2 — СТРОЙКА (только после ратификации; список пунктов станет размеченным «ровно так» при ратификации)
По ратифицированному дизайну. Инварианты фазы: no-repair путь байт-идентичен · парити EXACT · `-race` весь · тесты на синтетических фикстурах + стенд-прогон. **Хвосты первого касания (байт-нейтральные, тем же паком):** строгий декод `book.yaml` (санкционирован; перед вкл. проверить стендовые book.yaml на внесхемные ключи, доложить) · строгий декод pair/models-слоёв · unknown-key-тест пинит ИМЯ ключа · zero-value-паники PickedEntry/Bank (гард или док).
## НЕ делать
Канал B (пак-17) · копирование GPL/AGPL · пар/книго-литералы в Go · live-вызовы без санкции владельца · книжный текст в git · расширение скоупа без пинга.
## Приёмка (мандат 12.07)
Фаза 1 — см. выше, СТОП. Фаза 2 — ревью исполнением: build/vet/test -race · golden (инварианты выше) · парити · **дифф `^func Test` ИСПОЛНЕНИЕМ в отчёте** (норма после паков 14/15) · адверсариальный селф-ревью. Отчёт `docs/archive/reports/PACK16_DIFF_EDITOR_REPORT_<дата>.md`. Сессия НЕ коммитит; `git mv` стейджит — декларировать. Вопросы/конфликты — пинг оркестратору через владельца.