# Промт: сессия-БЭКЕНД — Трек A, пак-1.5 (экспорт-поверхность + глосс-whitelist + пример), 2026-07-16 > Малый хирургический пак ПОСЛЕ приёмки пака-1 (D39.2, `d3f6b34`). Три задачи — все НЕ гейтятся > эмпирикой exp15 и закрывают открытые вопросы D39.2 с решениями владельца от 16.07. Крупные слои > (чанкер B1, кнобы когезии, дифф-apply) **НЕ строить** — они гейтятся результатами exp15 (research/19 §D). > Смысл окна: все снапшот-сдвиги этого пака ложатся В ТОТ ЖЕ единый `--resnapshot`, который и так > предстоит (D38.5+пак-1) — сейчас они бесплатны, после resnapshot стоили бы вторую переоплату книги. ## Зона/дисциплина (как в паке-1) `backend/` только; не коммитить; `.env` не читать; мандат самопроверки ИСПОЛНЕНИЕМ (build/vet/gofmt/ test -race, каждый фикс запинен firing+non-firing тестом, ДО/ПОСЛЕ на сконструированном входе); golden = инвариант №8 — re-capture только с обоснованием «что и почему сдвинулось» (ратифицировано D39.2-open + решения владельца 16.07); git status перед работой — в дереве возможны параллельные сессии. ## Онбординг `CLAUDE.md` → D-лог **D39.2** (что залендено паком-1 + открытые вопросы) → `09-target-architecture.md` §2 (слой 6) → свой же код пака-1 (sanitizer.go exportNormalize/detectCJKLeak/stripCosmetic, chunkrun.go FinalText, cmd/tmctl). ## T1 — Read-only экспорт-поверхность для полигона (закрывает D39.2-open №1; НУЖНО ДО пере-прогона) **Проблема:** exportNormalize живёт на бэкенд-поверхностях (translate stdout / report), а полигонная экстракция (`records.json`/exp12_extract-класс) читает СЫРЫЕ чекпоинты из store → полигон и читатель-сэмплы увидят НЕнормализованный текст. Решение оркестратора: НЕ Python-зеркало нормализации (анти-паттерн зеркального дрейфа), а **бэкенд-поверхность**. **Сделать:** read-only команда `tmctl export` (проекция класса `status`/`report`: OpenReadOnly, $0, без снапшот-влияния): для каждого чанка книги эмитит финальный экспорт-текст РОВНО по прод-семантике (`chunk_status.final_hash` → checkpoint.response_text → [для `sanitizer_stripped` — это уже стрипнутый derived-чекпоинт] → `exportNormalize`) + метаданные (chapter/chunk/disposition/flag/ snapshot_id) в стабильном JSON (+опц. plaintext). Флагнутые-непоправимые — пустой текст + причина (как FinalText-семантика). Это и есть отложенный `tmctl export` из D15.2-этап-Б в минимальной форме — НЕ строй annotations/override-часть, только чтение. Тест: export == translate-FinalText байт-в-байт на golden-фикстуре (fresh и resume). ## T2 — CJK-глосс-whitelist (решение владельца 16.07: глоссы СОХРАНЯТЬ) **Сейчас:** `stripCosmetic` стрипает намеренный глосс «Кулак Ло Ханя (羅漢拳)» и пустит скобку; `detectCJKLeak` флагует такой Han-ран. **Сделать:** узкий whitelist — **сбалансированный Han-ран целиком внутри скобок, непосредственно после кириллического/латинского слова-головы** (паттерн «терм (漢字)») — НЕ утечка: `detectCJKLeak` не флагует, `stripCosmetic`/`exportNormalize` сохраняют байты глосса (вкл. НЕ-фолд его полноширинных символов, если они часть глосса). Голый Han вне этого паттерна — по-прежнему утечка (прод-класс cjk_leak цел). Краевые: вложенные скобки, глосс с пробелами/ пиньинем, глосс в начале строки без головы (→ утечка), два глосса подряд. `sanitizerVersion` v5→v6 + golden re-capture (обоснование: решение владельца). Тесты: глосс сохранён (strip и normalize), standalone-Han флагуется, пустая скобка больше не рождается. ## T3 — `example/book.yaml`: вернуть runnable После pair-сеама ja-пример fail-loud'ится через zh-ru-keyed pipeline-c1 (сеам работает как задуман). **Сделать:** переоформить пример на **zh→ru** (реальный прод-контент пары уже есть) — пример снова проходит end-to-end; рядом закомментированный ja-блок с пояснением «fail-loud до появления ja-ru пакета» (демонстрация сеама, не заглушка). ja-ru пакет НЕ сочинять (контент пары = данные под реальную книгу, инвариант общности §0.1). ## T4 — РЕЗЕРВ: фикс-лист отложенного адверсариала D39.2 Оркестратор догоняет отложенный мульти-агентный адверсариал пака-1 (падал на API-529). Если к старту твоей сессии в этом файле/в D-логе появился раздел «фикс-лист D39.2-долга» — исполни его пункты (приоритет над T1–T3 при CRITICAL/HIGH). Если раздела нет — T4 пуст, работай T1–T3. ## Deliverable Отчёт в ответе (не в PROGRESS): per-T — file:line, ДО/ПОСЛЕ, какие снапшот-версии/golden сдвинулись и почему, результаты build/vet/gofmt/test -race, само-ревью исполнением. Открытые вопросы — списком. Не коммитить — лендит оркестратор.