textmachine/docs/BACKEND_RERUN_PREP_SESSION_PROMPT.md

12 KiB
Raw Blame History

Промт: сессия БЭКЕНД — пере-прогон-преп (mining-wiring фиксы · echo-сплит · read-model чистка · готовность к единому resnapshot), 2026-07-19

Место в очереди (пост-D39.18): ПАК-11 ЗАВЕРШЁН (Block A → continuation → арх-проход → R1 драйвер-свитч → parent-cancel-фикс → c-lite blast-radius). Осталось перед пере-прогоном — набор мелких целевых фиксов, накопленных приёмками (рубеж-2 R1 + пост-лендинг-ревью). После этой сессии → пере-прогон (ОДИН --resnapshot fresh-translate под финальным конфигом) → чтение владельца. Это НЕ сам пере-прогон (тот — операционная/ полигон-сессия с langpack+contrast+mined_delta+армами) и НЕ смена алгоритмов.

Директива дисциплины (владелец, в силе): не упарываться на миноры

Это заход целевых фиксов из ратифицированных находок, НЕ рефакторинг-ради-рефакторинга и НЕ минор-хант. Скоуп-лист ниже — исчерпывающий; сверх него ничего не трогать. Чистый код, стандарт «сеньор Google», stdlib/ x/text, но без над-инженерии.

Кто ты и что сдаёшь

Бэкенд-сессия. Зона: backend/. Прочее read-only. НЕ коммитить (лендит оркестратор). Сдаёшь: код по скоупу + тесты (пины/golden/race) + отчёт в финальном сообщении (НЕ backend/*_REPORT.md; детальный артефакт при нужде → docs/archive/reports/). $0 к провайдерам (вся верификация build/test/golden/фикстуры).

Онбординг

  1. CLAUDE.md (гардрейлы) → backend/README.md (инварианты 18).
  2. D-лог 05-decisions-log.md: D39.17 (R1) · D39.17-errata (parent-cancel) · D39.18 (c-lite + read-модели) целиком + шапка-актуальность. План 11-implementation-plan.md §8 (манифест единого resnapshot).
  3. Отчёты приёмок (контекст находок): docs/archive/reports/R1_DRIVER_SWITCH_REPORT_2026-07-19.md + R1_POST_LANDING_REVIEW_2026-07-19.md.
  4. Код по скоупу: cmd/tmctl/main.go+render.go (exit-коды), mining.go+waverun.go (стоп), memnorm.go (Ш-2), quality.go+status.go+export.go (echo/read-модели), snapshot.go (§8-манифест).
  5. docs/experiments/00-provider-quirks.md.

Скоуп (исчерпывающий — 6 пунктов)

1. R1-FL-A — CLI обрабатывает WaveSignatureStop (exit-код)

Сейчас exitCode() (main.go) маппит только *CompletedWithFlags→2; *WaveSignatureStop падает в default→ exit 1 (== крэш) → exit-код-автоматику вводит в заблуждение (человек видит stderr, но код неотличим от падения). Фикс: errors.As(&sigStop) рукав → distinct exit-код (предлагаю 3, отдельный от 2-flagged/1-крэш; задокументировать в render.go-комменте кодов) + рендер Terms/SignaturePath оператору. Поправить оверклейм-комменты (waverun.go:72/77 «CLI-сентинел»/«carried up like CompletedWithFlags» — сейчас ложь). Тест: WaveSignatureStop → ожидаемый exit-код. Wire/снапшот НЕ трогает.

2. R1-FL-B — mining-стоп: reject-set (нужен дизайн, ниже — дефолт)

Сейчас стоп очищается ТОЛЬКО при пустой дельте (mining.go); reject-механизма нет → терм, который владелец ОТКЛОНИЛ (опустил из mined_delta), ре-предлагается каждый прогон → стоп фаерит вечно (livelock), edit-волна недостижима; единственный костыль-escape (пометить status:auto no-dst) не задокументирован. Дизайн-дефолт (реализуй, если владелец не переопределит): reject-set файломBook.MinedRejects (yaml, список src отклонённых термов) грузится в runBankMiningStop, MineBank-эмиссия исключает их (как seedSurfaces). Стоп очищается, когда каждый предложенный терм ЛИБО промоутнут (mined_delta) ЛИБО отклонён (reject-set). Reject-set НЕ фолдится в снапшот (влияет только на ПРЕДЛОЖЕНИЕ, не на контент банка). Обнови stop-сообщение: «промоутни в mined_delta ИЛИ отклони в mined-rejects». Тест: отклонённый терм не ре-фаерит стоп. (Это закрытие твоего же вопроса W1.5-UX §10-1 — чистый reject-list вместо status:auto-костыля.)

3. R1-FL-C — x/text/norm Unicode-редакция в Ш-2

memoryNormVersion фолдит stdlib unicode.Version, НО x/text/unicode/norm (NFKC в normalizeSourceKey) несёт СВОЮ Unicode-редакцию независимо → go get -u golang.org/x/text мог бы тихо сдвинуть NFKC → пере-вердикт post-check без сдвига снапшота. Фикс: вплести версию x/text (модуль-версию из runtime/debug.ReadBuildInfo для golang.org/x/text, ИЛИ явную пин-константу + трипваер-коммент «бампать x/text только с resnapshot»). Двигает снапшот (memoryNormVersion) → golden re-capture (version-only, masked-diff чист). Строка §8-манифеста.

4. echo-сплит echo_draft_rate / echo_edit_rate (решение владельца)

Заменить агрегат EchoRate + re-derive-хак (quality.go:124) на два поля по стадии: echo_draft_rate = доля draft-стадия chunk_status с FlagReason=cjk_artifact (переводчик эхнул — вкл. дропнутых c-lite, считается ПРЯМО из draft-строк) / echo_edit_rate = доля edit-стадия строк с cjk_artifact (редактор эхнул / echo в шипнутом — качество доставленного). Убирает костыль (draft-echo не нужно пере-выводить per-unit — он в draft- строках). Старое echo_rate/echo_chunks — снести или пометить deprecated (JSON-консюмеры: report — наблюдаемость, не контракт). Тест: дропнутый draft-echo → echo_draft_rate>0, echo_edit_rate=0. Report — наблюдаемость, снапшот НЕ трогает.

5. read-model naming-debt

Поля chunk/total_chunks в read-моделях теперь несут UNIT-счётчики (пост-c-lite) — имена вводят в заблуждение JSON-консюмеров. Переименовать в unit-семантику (unit/total_units или явный алиас), внутренние счётчики уже верны (D39.18). Косметика контракта, не логика. Наблюдаемость, снапшот НЕ трогает.

6. Ниты D39.17-errata (ЛЁГКАЯ гигиена — только явно-мёртвое/дешёвое; НЕ раздувать)

  • minedToCandidates — dead в live-пути (вытеснен file-based loadMinedDelta) → снести, если реально мёртв (греп-подтверди).
  • jobs.status-трэш под shared chapter×stage строкой — advisory, ничего не гейтит → коммент-note, не фикс (если фикс дёшев и чист — можно, иначе оставить).
  • escMu через LLM-вызов — известный трейд (throughput vs soft-cap-точность) → НЕ трогать (осознанно).
  • HTTP-адаптер concurrency неотестирован фейк-клиентом → опционально один live-parallel smoke-тест (stdlib http.Client thread-safe by design) — если дёшево; иначе коммент-note. Всё под «не упарываться»: сомнительное/дорогое → note, не фикс.

Готовность к единому resnapshot (§8-манифест — ВЕРИФИЦИРОВАТЬ, НЕ исполнять)

Пере-прогон будет ОДНИМ --resnapshot fresh-translate (D30.9). Эта сессия его НЕ запускает — но обязана подтвердить, что §8-манифест полон: всё снапшот-двигающее свёрнуто (memmatch-v4 · sanitizer-v6 · чанкер-v5 segmentation · src→dst render-format · pack.Version · + R1-FL-C unicode/x/text · reseed-сид). Сверь список §8 с реальными фолдами в snapshot.go; расхождение → в отчёт (не тихо). Golden после сессии: только version-only сдвиги (Ш-2/R1-FL-C) + новые поля report — НУЛЬ вердикт/wire-правок (echo-сплит/naming — наблюдаемость).

Гардрейлы

Инварианты 18 не трогать · $0 к провайдерам · Go-каноны (gofmt/vet/-race чисто; %w; table-driven) · неконсистентность → даблчек тулзами + эскалация · .env не читать · книга/производные вне git · не коммитить.

Верификация (мандат самопроверки)

build/vet/test -race после каждого куска (лог, не слово) · golden: version-only (Ш-2/R1-FL-C) + новые report-поля, НОЛЬ вердикт/wire-правок · пины на каждый фикс (exit-код · reject-set не-livelock · x/text-фолд · echo-сплит · naming) · адверсариальный селф-ревью (author≠reviewer) по несущему (reject-set-логика, echo-сплит-корректность, §8-манифест-полнота) — находки чинить до сдачи.

Приёмка (оркестратор — знай заранее)

Прямая верификация исполнением (build/race/golden-version-only/пины) + спот-чек §8-манифеста; тяжёлый воркфлоу по надобности (эти фиксы локальны — вероятно прямой верификации хватит). Затем лендинг → D-блок → пере-прогон (операционная сессия: langpack+contrast+подписанная сид-дельта[карта exp16]+армы редактора; ОДИН resnapshot; риг- стандарт D39.7; finish=stop; ⚠ ре-чек прайса DeepSeek у катовера 24.07 ДО платных вызовов) → чтение (планка 2 претензии).