Issue the small track-A pack-1.5 backend prompt: read-only tmctl export surface, owner-decided CJK gloss whitelist, runnable example, adversarial-debt reserve slot

This commit is contained in:
Claude (backend session) 2026-07-16 22:05:32 +03:00
parent 8ba0f720e8
commit 11589d3935

View file

@ -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-долга» — исполни его пункты
(приоритет над T1T3 при CRITICAL/HIGH). Если раздела нет — T4 пуст, работай T1T3.
## Deliverable
Отчёт в ответе (не в PROGRESS): per-T — file:line, ДО/ПОСЛЕ, какие снапшот-версии/golden сдвинулись и
почему, результаты build/vet/gofmt/test -race, само-ревью исполнением. Открытые вопросы — списком.
Не коммитить — лендит оркестратор.