diff --git a/docs/BACKEND_TRACKA_PACK15_SESSION_PROMPT.md b/docs/BACKEND_TRACKA_PACK15_SESSION_PROMPT.md new file mode 100644 index 0000000..a9504d0 --- /dev/null +++ b/docs/BACKEND_TRACKA_PACK15_SESSION_PROMPT.md @@ -0,0 +1,60 @@ +# Промт: сессия-БЭКЕНД — Трек 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, само-ревью исполнением. Открытые вопросы — списком. +Не коммитить — лендит оркестратор.