12 KiB
Промт: сессия БЭКЕНД — пере-прогон-преп (mining-wiring фиксы · echo-сплит · read-model чистка · готовность к единому resnapshot), 2026-07-19
Место в очереди (пост-D39.18): ПАК-11 ЗАВЕРШЁН (Block A → continuation → арх-проход → R1 драйвер-свитч → parent-cancel-фикс → c-lite blast-radius). Осталось перед пере-прогоном — набор мелких целевых фиксов, накопленных приёмками (рубеж-2 R1 + пост-лендинг-ревью). После этой сессии → пере-прогон (ОДИН
--resnapshotfresh-translate под финальным конфигом) → чтение владельца. Это НЕ сам пере-прогон (тот — операционная/ полигон-сессия с langpack+contrast+mined_delta+армами) и НЕ смена алгоритмов.
Директива дисциплины (владелец, в силе): не упарываться на миноры
Это заход целевых фиксов из ратифицированных находок, НЕ рефакторинг-ради-рефакторинга и НЕ минор-хант.
Скоуп-лист ниже — исчерпывающий; сверх него ничего не трогать. Чистый код, стандарт «сеньор Google», stdlib/
x/text, но без над-инженерии.
Кто ты и что сдаёшь
Бэкенд-сессия. Зона: backend/. Прочее read-only. НЕ коммитить (лендит оркестратор). Сдаёшь: код по
скоупу + тесты (пины/golden/race) + отчёт в финальном сообщении (НЕ backend/*_REPORT.md; детальный
артефакт при нужде → docs/archive/reports/). $0 к провайдерам (вся верификация build/test/golden/фикстуры).
Онбординг
CLAUDE.md(гардрейлы) →backend/README.md(инварианты 1–8).- D-лог
05-decisions-log.md: D39.17 (R1) · D39.17-errata (parent-cancel) · D39.18 (c-lite + read-модели) целиком + шапка-актуальность. План11-implementation-plan.md§8 (манифест единого resnapshot). - Отчёты приёмок (контекст находок):
docs/archive/reports/R1_DRIVER_SWITCH_REPORT_2026-07-19.md+R1_POST_LANDING_REVIEW_2026-07-19.md. - Код по скоупу:
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-манифест). 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-basedloadMinedDelta) → снести, если реально мёртв (греп-подтверди).jobs.status-трэш под shared chapter×stage строкой — advisory, ничего не гейтит → коммент-note, не фикс (если фикс дёшев и чист — можно, иначе оставить).escMuчерез LLM-вызов — известный трейд (throughput vs soft-cap-точность) → НЕ трогать (осознанно).- HTTP-адаптер concurrency неотестирован фейк-клиентом → опционально один live-parallel smoke-тест (stdlib
http.Clientthread-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 — наблюдаемость).
Гардрейлы
Инварианты 1–8 не трогать · $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 претензии).