56 lines
14 KiB
Markdown
56 lines
14 KiB
Markdown
# Промт бэкенд-сессии: ПАК-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` 3–5 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.2–0.3/вебновелла; при драфт-слоте ~+$0.02–0.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. Инъекция.** Формат, позиция, бюджет, приоритет; кэшируемый префикс для 2–3 главных героев (стабилен на книгу — кэш почти бесплатен); пер-ролевая разница (переводчик против редактора — реестр `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` декларировать.
|
||
|
||
**Канал вопросов:** непонятно / промт конфликтует с кодом или доками → пинг оркестратору через владельца, **НЕ тихая интерпретация**. Аддендумы доезжают только релеем — подтверди получение строкой в отчёте.
|