# Промт: бэкенд-сессия, пакет D15.2 — реализация content-addressed resume + качественные фиксы D30 + экспорт-контракт D29 (2026-07-12) --- ## Кто ты и что делаешь Ты — **бэкенд-сессия** TextMachine, реализационный пакет D15.2 (самый крупный после Ф1-машинерии). Зона: `backend/` + секция «Бэкенд» в `docs/PROGRESS.md`. **Ничего не коммитить** — лендинг оркестратором по этапам (см. этапность). Пакет собирает четыре ратифицированных потока: качественные фиксы D30 (гейтят пере-прогон 25 глав), реализацию D15.2 v3.1, экспорт-контракт D29, накопленные fix-листы. ## Онбординг (~60 мин) 1. `CLAUDE.md` → CURRENT-STATE → `docs/architecture/05-decisions-log.md`: **D30 (мандат качественной части), D29 (экспорт/override), D28.2–28.3, D22.2 (v3.1-амендменты), D20.1–20.2, D15** — целиком. 2. **Спека D15.2** (`backend/docs/D15.2-content-addressed-resume-spec.md`) + ревью-требования к ней: D20.1 (v2-правки), D22.2 (v3.1: SourceLang/TargetLang → verdictSnapshotID; cache_ttl → advisory; правило «судьбу получает ЛЮБОЕ brief-поле вне рендера»). 3. `docs/research/16-reader-ide-alignment.md` — ревью-шапка + §3–4 (контракт экспорта; поправки шапки ОБЯЗАТЕЛЬНЫ: ключ override = хеш СЫРОГО src, RED = дополнение, паспорт-rollup = амендмент). 4. `docs/experiments/12-quality-diagnosis.md` — шапка + §2.5/2.6 (root-cause вёрстки, классы санитайзера). ## Этап А — качественные фиксы D30 (гейтит пере-прогон; лендится ОТДЕЛЬНО и раньше) 1. **Билингв-редактор (флип D1, D30.1):** `editor.md` получает исходник (форма D13.1: простой general-промпт — блок `{{source}}` + инструкция сверять смысл; БЕЗ сложного инжиниринга); bump `prompt_version`. Моно-вариант сохранить отдельным промпт-файлом (пилот-арм D13.1 остаётся подтверждающим). 2. **Reflow (D30.2):** убрать «Сохраняй разбивку на абзацы» из `translator.md:9` и `editor.md:8`; редактору — разрешение нормативной репараграфизации (реплики диалога с тире с абзаца; без максимума длины абзаца); bump обеих prompt_version. 3. **Output-санитайзер (D30.3) — новый детерминированный гейт-класс** (vердикт-ось, дисциплина D2 flag+skip): ведущие сервис-преамбулы («Вот отредактированный…» и класс) И хвостовые блоки «заметок/правок»; markdown-заголовки `###`; латиница-врезки в ru-выходе (порог, не единичные имена); битые словоформы — класс «слово, отсутствующее в выходе draft'а, с внутренним разрывом/дубликацией» детектировать дёшево (минимум: повтор подстроки типа «Первок предок», невалидные кириллические биграммы — предложи детерминированную эвристику, precision > recall, это ФЛАГГЕР). Версионируй как санитайзер-version в вердикт-снапшот. 4. **Golden:** этап А меняет промпты и вердикты → осознанный re-capture (инвариант №8) + **расширение фикстуры по D28.2**: (i) стадия на флорнутой модели, (ii) oblique-only decl entry (golden начинает пиновать floor и union), (iii) кейс санитайзера. Дифф-класс задокументировать. ## Этап Б — D15.2 v3.1 + реализация - Сначала v3.1-амендменты спеки (D22.2 два обязательных + D20.1: role/stage в guard_hash, editor-каскадное правило dry-run, полевой маппинг §4). Затем реализация: пер-стадийный wireSnapshotID (D20.1-Q1), расщепление wire/verdict, fast-path гард на ВЕСЬ wire-план, pre-flight dry-run «N чанков, ~$X» + `--accept-rebill[=usd]` (порог min($0.50, 5%×Projected)), миграция store с сиквенсингом (старые чекпоинты этапа A/пере-прогона не теряются). - Axis-sensitivity тест RequestHash (флип role/stage меняет хеш — D22.9); негативный кейс additive_total; hop-checkpoint-replay тест (D28.3а — пин fbHash-зеркала). ## Этап В — экспорт-контракт D29.1 - **`tmctl export`**: канонический ассемблер перевода (нормализация выхода: стрип markdown-###, унификация разделителей) + `annotations.json` annot-v1 (схема research/16 §4.1 С ПОПРАВКАМИ шапки: src_range — офсеты в чанкере (net-new), dst_range nullable/эфемерный, source_file_hash — новое поле, спаны style-флагов пересчитываются линтерами на экспорте, paragraph_anchors — ТОЛЬКО позиционная пара при равном числе абзацев); editor-facing: красные = маркированный плейсхолдер; reader-facing: fail-closed + release-state лестница D25.1 (`run_complete/structurally_complete/quality_reviewed/publishable`). - **Цвет-мап + GREY** (RED = flagged && reason≠glossary_miss — дополнение, не перечень) + **паспорт-rollup 3-тир** (это амендмент вердикт-правила D12/exp07 — сохранить консистентность с exit-кодом translate; поведение при gate-on задокументировать). - **human_override слой 1 (LOCK):** per-chunk provenance-состояние; ключ = **хеш сырого src-текста чанка** (новое поле; НЕ chunk_status.content_hash); redrive/resume НЕ трогают override (mutation-тест); слой 2 (carry-over + «needs re-review») — только дизайн-нота, реализация после. ## Попутно (fix-листы, мелочь) D22.9: CLI-тест `redrive --resnapshot`; комменты models.yaml «native Gemini судья 18+ — Ф2» (устарели против exp11). D23.4-остаток: опц. компонент-тест snapshotID. D28.3: provider_local×floor note; коммент mempostcheck.go:84 «D24.3/D24.4»→«D24.4»; стейл-комменты models.yaml «чистый ключ/data-sharing» → привести к D27. ## Дисциплина - Этапность лендинга: **А отдельно и первым** (гейтит пере-прогон; Б/В не гейтят). По завершении А — пинг в PROGRESS, не жди Б/В. - Никаких wire-изменений сверх мандата; каждый фикс mutation-verified; `go build/vet/test -race` чисто; санитайзер и промпты — с тестами на классы из exp12 (преамбула gemini, «Первок предок», ###). - `git status` перед стартом (чужие правки — стоп); `.env` не читать; книга/diag вне git. - Отчёт: секция PROGRESS «Бэкенд» по этапам, дифф-классы golden, вопросы оркестратору.