textmachine/docs/BACKEND_PACK19_VOICE_STATE_SESSION_PROMPT.md

66 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.

# Промт бэкенд-сессии: ПАК-19 «голос и состояние» (ДВУХФАЗНЫЙ: дизайн → ратификация → стройка)
**АКТУАЛИЗИРОВАН 26.07 (пост-D39.53), оркестратор №8; дельта 30.07 (пост-D39.54), оркестратор №9.** С момента выдачи (25.07) закрыт ВЕСЬ пак-20 с продолжениями: построены терминолог (роль пар-пака, `internal/terminology`), флаговый стоп `--verify-bank` (дефолт = авто), **авто-провод неподписанного — редакторская инъекция теперь ДВУХСЕКЦИОННАЯ** (закон CONFIRMED + помеченная секция ⟨проверить⟩; ВСЕ строки банка фолдятся в версию памяти — D39.42/45), **точечная ре-редактура по ключу** (bank-only-сдвиг → пере-пин $0 + оплата только затронутых юнитов, `repin.go`), языковой экран `target_script`, дисциплина банкноты (кавычки, агрегация по чанкам); жанровый словарь ОТМЕНЁН КАК КЛАСС (D39.47: решение о переводе = подпись владельца на банк КНИГИ). После этого пака идёт **ХОЛОДНЫЙ мини-прогон** (D39.51 §6: пустой сид, отдельная БД) — твои метрики флаггера попадут в него. Устаревшие места исходного промта исправлены по тексту; при любом конфликте промта с кодом — код и D-лог первичны, пинг обязателен.
**Дельта D39.54 (30.07):** залендена малая пачка 14а+14б — ingest епабов переехал на токенайзер `x/net/html` (байт-паритет со старым ридером запинен), а `LoadPromptTemplate` теперь ВЫРЕЗАЕТ `<!-- -->` с провода и хеширует каноническую форму: комментарий в промпт-файле больше не байты провода и не деньги (само-документируй новые промпт-файлы смело, шапка 12 строки — норма остаётся). Фикс-лист пачки, закрыть по пути фазы 2 (одна строка): комментарий поля `SHA256` в `pipeline/render.go:89` остался «hash of the raw file» — привести к «канонической форме».
**СТАТУС: СКОУП УРЕЗАН И ПОЗИЦИЯ УТОЧНЕНА АУДИТОМ (`D39.34`, 25.07). Стартует ПОСЛЕ пака-20 «банк» (закрыт целиком, D39.4153).** Курс D39.33: масштаб последним, доказательство эффективности — мини-прогоны ~10 глав. **Инъекционная часть D21 ратифицирована УСЛОВНО** (D21 п.2: «Схема + детерминированный ты/вы-флаггер — безусловно; инъекционная часть — условно до полигон-эксперимента на ТРУДНЫХ парах»).
## ШАГ 0 — ОБЯЗАТЕЛЬНЫЙ СИНК (норма D39.38, ДО дизайна)
Таблица «источник ↔ код ↔ вердикт (совпадает / расходится / не построено)» в отчёт фазы 1. Сверять: D21/`research/15` (ратифицированная база ниже) ↔ **новая реальность банка**: `membank/memory.go` (двухсекционный редакторский блок `editor_unverified_header`, условный фолд `editor-unverified-section-v1`, `ComputeVersionScoped` фолдит ВСЕ строки) · `pipeline/repin.go` (bank-only-сдвиг = точечная ре-редактура — если сущности голоса/обращений фолдятся в версию банка, их поздняя правка наследует этот механизм: спроектировать ЯВНО) · `pipeline/terminologist.go` + `config.TerminologyGate` (прецедент «гейт-конфиг вне снапшота» и роль-сосед по инъекции) · головы D-лога D39.4254. Расхождение = пинг, не тихая интерпретация.
**Статус выдачи: 25.07.2026, оркестратор №8.** Цель — построить последний крупный НЕпостроенный рычаг качества: механизмы D21 (voice-профиль · реестр обращений ты/вы · reveal-окна). Ратифицированы 09.07 как механизмы Ф2, в коде их НЕТ — есть только описания будущих таблиц в комментариях миграций. Пак **двухфазный** (образец паков 16/17): фаза 1 — дизайн + СТОП, фаза 2 — стройка по размеченному списку.
**Первый деливерабл — эхо-блок (≤10 строк): скоуп / инварианты / чего не делать. ДО работы.**
**Дисциплина ответа, обязательное следование (норма для многословных моделей, владелец 26.07):** эрудиция ≠ улика — каждая рекомендация либо грунтована `file:line`/замером, либо явно помечена «мнение»; не писать лишнего кода и не выходи за свои границы, пиши как профессиональный сеньер; не пересказывай промт и контекст; отчёт меряется плотностью, а не объёмом; шаблонные оговорки и советы вне скоупа не писать; комментарии в коде/данных — 12 строки «почему», улики — в отчёт.
## Почему это ответственный пак (контекст, из кода не выводится)
1. **Он двигает провод.** Инъекция голоса/обращений меняет сборку контекста ⇒ снапшот, ⇒ `--resnapshot`, ⇒ пере-оплата книги. Это не побочный эффект, а планируемое свойство: пак делается тогда, когда мы готовы платить за пере-прогон.
2. **Он трогает банк памяти**а банк durable и его версия фолдится в снапшот. Ошибка схемы стоит пере-оплаты всех книг, а не одной.
3. **Он на грани ru-target долга.** Различение ты/вы — свойство ПАРЫ (в английском его нет, в японском своя система), поэтому это первый пак, где §0-инвариант общности проверяется по-настоящему. Ревью-вопрос по умолчанию: «заработает ли на паре, которой в репо ещё НЕТ, без правки Go?»
## Ратифицированная база (D21, читать как контракт)
- **Voice-профиль** — схема `research/15` §1.5 (`char_id` · `register` · `self_ref` · `address_default` · `lexicon_markers` · `ng_lexicon` · `exemplars` 35 RU-реплик из УТВЕРЖДЁННОГО перевода · `brightness` · окна `since_ch/until_ch`). **Оговорка red-team, «ровно так»: до полного лендинга D15.2 профиль ЗАМОРОЖЕН per-job** — самодозаполнение exemplars = mid-run append памяти = пере-оплата книги (D8/D15.1). Проверь фактическое состояние D15.2-семантики в коде и, если считаешь, что заморозку можно снять, — принеси АРГУМЕНТ, а не тихое послабление.
- **Реестр обращений `address_pair`** — ратифицирован как **МАТЕРИАЛИЗАЦИЯ журнала ты/вы** (D7-Правки-1), то есть ОДИН источник истины, а не второе хранилище рядом с банком.
- **Reveal-окна** (`reveal_ch` + pre/post-reveal алиасы) — та же фигура, что уже работающие спойлер-окна `since_ch/until_ch` (`internal/seed`, `internal/membank`): pre-reveal dst не должен инжектиться до раскрытия.
- **Приоритет инъекции:** CONFIRMED-глоссарий > обращения > голос. **АМЕНДИРОВАНО D39.42/45:** «только CONFIRMED» больше не описывает редакторскую инъекцию — она двухсекционная (закон + помеченная секция ⟨проверить⟩). Дизайн обязан ПЕРЕ-ПОДТВЕРДИТЬ D21-приоритет против этой реальности: куда встают обращения/голос относительно ДВУХ секций глоссария, и идёт ли неподписанное голосовое в помеченную секцию или только CONFIRMED (аргумент, не умолчание).
- **Экономика D21 п.8:** верхняя граница editor-side инъекции +$0.20.3/вебновелла; при драфт-слоте ~+$0.020.05. Дороже — повод для развилки, не для тихого списания.
## ФАЗА 1 — ДИЗАЙН (кода не трогать; отчёт → СТОП → ратификация)
Каждый пункт — «реши сам и аргументируй»; советы ниже = приоры, опровергаются аргументом или замером.
- **V1. Скоуп и порядок — граница ратификации, «ровно так».** Строим БЕЗУСЛОВНУЮ половину: схема трёх сущностей · **детерминированный ты/вы-флаггер** · reveal-окна. **Инъекционная часть ПРОЕКТИРУЕТСЯ, но НЕ проводится в прод** — D21 п.2 держит её условной до полигон-эксперимента на ТРУДНЫХ парах («лифт на лёгких = 0; исход «только флаггер-ось» легитимен и дешевле»), а `internal/store/migrate.go:312` добавляет гейт пилота и лендинга D15.2. Дизайн инъекции обязан быть в отчёте — чтобы полигон знал, что мерить, — но код за ним не идёт до отдельного решения.
- **V1-бис. Вход, которого пока нет.** Детерминированному флаггеру нужны speaker/addressee, а их производит Annotator (D21 п.5), которого в этом паке НЕТ. Ответь честно: на каком входе флаггер работает сегодня (атрибуция 说/道 детерминированным пре-гейтом?), и что именно он НЕ поймает без Аннотатора. Плюс требование из реестра памяти: гендер-аннотация нужна НАРРАТИВНАЯ (since_ch-смены + перспектива), а не булево поле.
- **V2. Схема и хранение.** Где живут три сущности (типы записей банка против отдельных таблиц), как ложатся на миграции, что делает версия банка со снапшотом, и какова политика append в середине книги. Явно ответь: **что из этого durable, что производное, что пере-оплачивается при правке.**
- **V3. Инъекция.** Формат, позиция, бюджет, приоритет; кэшируемый префикс для 23 главных героев (стабилен на книгу — кэш почти бесплатен); пер-ролевая разница (переводчик против редактора — реестр `role→инъекция` уже существует). **Обязательно: что именно фолдится в снапшот и почему** — блок `context_assembly` уже есть, новая ось обязана быть в нём или получить осознанный отказ.
- **V4. Детерминированный детектор отклонения голоса (слой 1, $0).** Ты/вы-флип в атрибутированной реплике против реестра пар — где живёт (пакет `checks`), как отчитывается (`QualityReport`), версионируется ли (`CheapGateVersion` фолдится БЕЗУСЛОВНО — любое изменение правила двигает снапшот всех книг: реши осознанно). Слой 2 (эмбеддинги) — НЕ в этом паке.
- **V5. Общность (несущее).** Ты/вы — свойство пары, не движка. Спроектируй так, чтобы T/V-различение приходило ДАННЫМИ (`internal/lang` + `configs/langpacks|pairs`), а пара без T/V (en→?) просто не активировала механизм без единой правки Go. **Мысленный тест обязателен и должен быть в отчёте:** что именно придётся дописать для пары, которой в репо нет.
- **V6. Деньги и измеримость.** Оценка прироста COGS по слотам инъекции; что мерить и чем (детерминированно, где возможно — «детерминированный скорер > судьи»). Метрика blind speaker attribution — eval-сторона, в пак НЕ входит.
**Приёмка фазы 1:** отчёт `docs/archive/reports/PACK19_DESIGN_<дата>.md` — эхо-блок · по каждому V варианты/рекомендация/риски · адверсариальный селф-ревью (линзы: деньги и пере-оплата · durable-схема и миграции · общность §0 · байт-точность и снапшот · граница с ru-target долгом). **СТОП — ратификация.**
## «РОВНО ТАК» для обеих фаз
1. **Annotator-пре-пасс (D21 п.5) — НЕ в этом паке.** Это LLM-проход, то есть деньги и отдельное решение; дизайн может на него ссылаться как на будущее.
2. **Курируемое ≠ намайненное; неподписанное — только с пометкой** (двухсекционная реальность D39.45; «только CONFIRMED» — амендировано, см. базу выше).
3. **Ни одного пар/языкового литерала в Go** (§0). Ты/вы, формы обращений, признаки регистра — данные.
4. **Voice-профиль заморожен per-job**, пока не доказано обратное (см. базу выше).
5. ~~Ниты общности + флип `RegressionGuard`~~ **ИСПОЛНЕНО ДО ТЕБЯ (мини-прогон, D39.37): флип сделан и дал первое живое срабатывание; множитель ×2 и Detail-строки уехали в данные пары (`dc_ratio`/шаблоны, загрузчик падает громко без них). НЕ пере-делывать.** Нормы замеров D39.46/47 обязательны и для тебя: у измеряемого фактора — арм без него · критик полноты на каждую фазу · право сказать «этого делать не надо», если синк подрывает посылку.
6. **Пере-капчер golden — под ратифицированную смену поведения, с доказательством:** маскированный структурный дифф обязан быть пуст вне осей, которые пак сознательно двигает. Каждую сдвинутую ось назвать в отчёте отдельной строкой.
7. **Деньги durable не трогаем:** reserve→settle+чекпойнт одной транзакцией; инъекция не смеет ослепить потолок (бюджет инъекции входит в оценку).
8. **Никаких платных прогонов.** Фикстуры и мок; живой прогон — отдельное решение владельца после лендинга.
## НЕ делать
ru-target долг (`isRuTarget`/`TokenizeCyrillic`/санитайзер — слой 7, свой дизайн-пак; но **проектируй так, чтобы не углублять его**) · Annotator · слой-2 детектора · native-Gemini судья · метрики пилота · масштаб на сотни глав · расширение скоупа без пинга.
## Мандат самопроверки и приёмка
Ревью ИСПОЛНЕНИЕМ (решение владельца 12.07): сквозные сценарии через настоящий драйвер · мутация на каждую новую ветку (мутация возвращает дефект → тест краснеет) · дифф `^func Test` ИСПОЛНЕНИЕМ · заявление = команда (приёмка ре-ранит манифест). Инварианты фазы 2: парити EXACT · `-race` · golden только под п.6 · сессия НЕ коммитит, `git mv` декларировать.
**Канал вопросов:** непонятно / промт конфликтует с кодом или доками → пинг оркестратору через владельца, **НЕ тихая интерпретация**. Аддендумы доезжают только релеем — подтверди получение строкой в отчёте.