textmachine/docs/BACKEND_PACK19_VOICE_STATE_SESSION_PROMPT.md

56 lines
14 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 «голос и состояние» (ДВУХФАЗНЫЙ: дизайн → ратификация → стройка)
**СТАТУС: СКОУП УРЕЗАН И ПОЗИЦИЯ УТОЧНЕНА АУДИТОМ (`D39.34`, 25.07). Стартует ПОСЛЕ пака-20 «банк» (порядок D39.38; мини-прогон и сид-дельта закрыты).** Курс D39.33: масштаб последним, доказательство эффективности — мини-прогоны ~10 глав. Аудит корпуса вскрыл, что (а) сид/банк-дельта стоит раньше по D39.20, (б) замер остатка обязан пройти ПОКА ЖИВ $0-резюм драфта, то есть ДО пака, вызывающего resnapshot, (в) **инъекционная часть D21 ратифицирована УСЛОВНО** (D21 п.2: «Схема + детерминированный ты/вы-флаггер — безусловно; инъекционная часть — условно до полигон-эксперимента на ТРУДНЫХ парах»).
**Статус выдачи: 25.07.2026, оркестратор №8.** Цель — построить последний крупный НЕпостроенный рычаг качества: механизмы D21 (voice-профиль · реестр обращений ты/вы · reveal-окна). Ратифицированы 09.07 как механизмы Ф2, в коде их НЕТ — есть только описания будущих таблиц в комментариях миграций. Пак **двухфазный** (образец паков 16/17): фаза 1 — дизайн + СТОП, фаза 2 — стройка по размеченному списку.
**Первый деливерабл — эхо-блок (≤10 строк): скоуп / инварианты / чего не делать. ДО работы.**
## Почему это ответственный пак (контекст, из кода не выводится)
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-глоссарий > обращения > голос; в инъекцию идёт только 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. **Только CONFIRMED идёт в инъекцию.** Курируемое ≠ намайненное.
3. **Ни одного пар/языкового литерала в Go** (§0). Ты/вы, формы обращений, признаки регистра — данные.
4. **Voice-профиль заморожен per-job**, пока не доказано обратное (см. базу выше).
5. **Ниты общности + ОБЯЗАТЕЛЬНЫЙ флип `Gates.RegressionGuard.Enabled` едут этим паком — потому что он вызывает первый resnapshot.** Точная атрибуция (исправлено D39.34): D39.31 п.5 ратифицировал «ближайший ПОЛНЫЙ `--resnapshot`», а не именно этот пак. Флип `RegressionGuard` — НЕИСПОЛНЕННОЕ обязательство D38.4 п.5 («Оркестратор при сборке единого resnapshot ОБЯЗАН включить»): ключа `regression_guard` нет ни в одном шиппинг-конфиге, гейт = false, rerun2 прошёл без построенной наблюдаемости. Включить и покрыть тестом. Оба: множитель `expectedHours := n * 2` (`internal/checks/checkers.go`) → данные пары; Detail-строки чекеров → шаблоны из данных (у второго байт-нейтральной формы НЕ существует определительно — он именно поэтому ждал resnapshot).
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` декларировать.
**Канал вопросов:** непонятно / промт конфликтует с кодом или доками → пинг оркестратору через владельца, **НЕ тихая интерпретация**. Аддендумы доезжают только релеем — подтверди получение строкой в отчёте.