Clean the backend code zone: move session reports to docs/archive/reports, stop persisting backend/*_REPORT.md, and ratify the Sh-1/Sh-2 snapshot-guard findings into the R1 fix-list

This commit is contained in:
Claude (backend session) 2026-07-19 18:03:57 +03:00
parent d358143342
commit e0b8a52783
6 changed files with 57 additions and 8 deletions

View file

@ -1,6 +1,6 @@
> **⚠ АКТУАЛИЗИРОВАН ПОД R1-ПРОДОЛЖЕНИЕ (19.07, пост-D39.14; предыдущие версии — в git-истории).** Сессия №1
> сдала Block A (`85f5b9e`, D39.13); сессия №2 сдала R2R5 + R1-аддитив (D39.14). **Осталось: R1 драйвер-свитч +
> 3-пунктовый фикс-лист рубежа-2 (ниже).** Дизайны — `backend/PACK11_CONT_REPORT.md §R1` + `PACK11_REPORT.md §Резидуал`
> 3-пунктовый фикс-лист рубежа-2 (ниже).** Дизайны — `docs/archive/reports/PACK11_CONT_REPORT_2026-07-19.md §R1` + `docs/archive/reports/PACK11_REPORT_2026-07-19.md §Резидуал`
> (авторитет наравне с планом). Сданное — под тестами, НЕ пере-строить.
>
> **ФИКС-ЛИСТ рубежа-2 (D39.14; все латентны — банкнота off по дефолту, эмиссия за R1 — лендинг не блокировали;
@ -14,6 +14,16 @@
> - **FL-3 (PARTIAL, порт-fidelity):** `miner_emit.go:68` идёт по полному `mr.ranked`; референс капит `a3[:200]`/
> `[:30]` ДО фильтров (`eval/exp16/{alias.py:165, emit_owner_sheets.py:143,162,169}`) → карта подписи шумнее
> референса. Добавить top-N кап перед emission-фильтрами. **Закрыть ДО живого W1.5** (владелец подписывает карту).
> *(FL-1/2/3 УЖЕ залендены D39.14/D39.16 — здесь как контекст; если тронуты — не регрессировать.)*
>
> **Ш-1/Ш-2 (D39.16-записка, ратифицированы → едут В ЭТОМ R1-заходе, снапшот-двигающие):**
> - **Ш-2 (несущее):** вплести `unicode.Version` в `memoryNormVersion` (`memnorm.go:56`) + classifier/style-версии —
> сейчас NFKC/`unicode.Han/Cyrillic` привязаны к Unicode-версии тулчейна, но не фолдятся → бамп go1.27 сменил бы
> их ТИХО. **Фолдить в ТОТ ЖЕ единый resnapshot, что `pack.Version()`** (один заход). **ТРИПВАЕР: обязательно
> до любого go1.27-бампа** (мы на 1.26.4 — не горит, но не бампать тулчейн, пока Ш-2 не в снапшоте).
> - **Ш-1 (низкая срочность):** хелпер masked-diff при golden re-capture (`TM_UPDATE_GOLDEN=1` → маскировать
> хеш/версия-поля + печатать «N вердикт-изменений / M version-only» ДО записи). Делает re-capture безопасным
> по построению; можно в этом заходе или отдельной гигиеной.
# Промт: сессия БЭКЕНД — единый пак по плану 11 (волновой раннер · чанкер/единицы · банк W1.5 · банкнота · чекеры · армы), 2026-07-19
@ -27,13 +37,14 @@
Бэкенд-сессия TextMachine. **Зона записи: `backend/`** (вкл. `configs/`, `prompts/`); всё остальное читать
можно, править нельзя (расхождения — пингом через отчёт/владельца). **НЕ коммитить** — лендит оркестратор
после приёмки (git-гардрейл CLAUDE.md: никаких reset --hard/rebase/checkout поверх грязного дерева). Сдаёшь:
1. Код резидуала R1R5 + тесты из (д)-секций плана (пины/golden/race/kill-9).
2. **`backend/PACK11_CONT_REPORT.md`** — отчёт продолжения: per-буллет чек-лист (✓/девиация+причина),
тест-логи, golden-диффы, «багфиксы вне плана», «структурные переносы», residual. Сданный
`PACK11_REPORT.md` НЕ редактировать (история приёмки D39.13).
1. Код резидуала R1 + Ш-1/Ш-2 + тесты из (д)-секций плана (пины/golden/race/kill-9).
2. **Отчёт — в финальном сообщении сессии** (per-буллет чек-лист ✓/девиация+причина, тест-логи, golden-диффы,
«багфиксы вне плана», residual). **НЕ заводить `backend/*_REPORT.md`** (процесс-правка владельца 19.07:
код-зона чистая; постоянный record = D-блоки+PROGRESS; если оркестратору нужен детальный артефакт — пиши
в `docs/archive/reports/<имя>_<дата>.md`, НЕ в `backend/`).
Онбординг-добавка продолжения: **`backend/PACK11_REPORT.md` читать ЦЕЛИКОМ** сразу после плана — что уже
сдано (Block A, под тестами) и §Резидуал R1R5 с пошаговыми дизайнами.
Онбординг-добавка: приёмочные детали прошлых заходов (Block A / continuation / арх-проход) — в
`docs/archive/reports/` + D-блоки D39.13/14/16; §Резидуал R1 — там же в отчётах и в плане §1.
## Онбординг (порядок чтения, ~45 мин)
@ -196,7 +207,7 @@
(iii) **функциональное** — деньги/resume/снапшот/гейты end-to-end на фикстурах. Находки чинить ДО
следующего блока; сводку каждого чекпойнта — в отчёт.
4. **Финал:** полный многоосевой адверсариал по паку (деньги/resume · снапшот/волны · детерминизм ·
банк/банкнота · чекеры · экспорт · код-качество) + `PACK11_REPORT.md`.
банк/банкнота · чекеры · экспорт · код-качество) + отчёт в финальном сообщении (НЕ `backend/*_REPORT.md`).
5. Golden re-capture — только под ратифицированную смену поведения; маскированный дифф прикладывать всегда.
## Что НЕ строить (гейтнуто/анти-скоуп — план §0/§11; в код не тащить)

View file

@ -13,6 +13,8 @@
По прямому указанию владельца прошёл всю документацию, освежил current-state-маркеры до пост-D39.16 (дисциплина D23.3: правил ТОЛЬКО шапки/статус-строки, историю не трогал). Тронуто: `CLAUDE.md` (текущее состояние → D39.16, эра «стройка пере-прогонного стека») · `docs/README.md` (статус-абзац пост-D38.1→D39.16, D-лог-диапазон D39.6→D39.16, дедуп дубль-предложения о закрытых промтах) · `docs/PROGRESS.md` (CURRENT-STATE шапка+очередь+«ждём от владельца») · `05-decisions-log.md` (заголовок D1D38→D1D39.16) · `09-target-architecture.md` §2-слой-2 + `10-prompt-architecture.md` (отметки реализации langpack D39.16) · оркестратор-хендофф №5 (статус-баннер: первый deliverable исполнен, тело=снимок D39.11). **Чужие зоны (мандат владельца «всю», дерево чистое/живых сессий нет — клоббера нет):** `backend/README.md` (D-лог-диапазон + указатели на план-11/промт стройки/langpack) · `eval/README.md` (очередь пост-D39.16: исслед-программа завершена, следующее = пере-прогон). **НЕ тронуто (обоснованно):** `components.puml`/`pipeline.puml` — код всё ещё ПОСЛЕДОВАТЕЛЬНЫЙ (R1-волны не залендены) → диаграммы СЕЙЧАС точны, обновление после R1; историческая хроника D-лога/PROGRESS (D23.3).
**Чистка код-зоны + процесс-правка (мандат владельца 19.07, «доки бэкенда выглядят плохо»):** три сессионных `backend/*_REPORT.md` (PACK11/PACK11_CONT/ARCH_CLEANUP, ~82 КБ нарратива, дублировали PROGRESS/D-лог) вынесены из `backend/` в `docs/archive/reports/` (архив-не-удаление); `backend/` теперь чист (README+спека+промты). **Процесс впредь:** сессии НЕ плодят персистентные `backend/*_REPORT.md` — постоянный record = D-блоки+PROGRESS, детальный артефакт (если нужен) → `docs/archive/reports/`; вписано в R1-промт. Плюс из ARCH_CLEANUP-записки ратифицированы **Ш-1/Ш-2** (снапшот-гард: Ш-2 — фолд `unicode.Version`, трипваер до go1.27, едет в R1-resnapshot; Ш-1 — masked-diff-хелпер, низкая срочность) → фикс-лист R1 (детали в D39.16).
## Оркестратор №7 — арх-проход D39.16 ПРИНЯТ и залендён: язык-данные майнера в internal/lang, 19.07 (шестая фаза)
Сессия исполнила 5-фазный арх-промт. **Залендено:** zh/Палладий-данные майнера вынесены из Go-констант pipeline/ в `configs/langpacks/zh|zh-ru/` (10 файлов), грузятся leaf-пакетом `internal/lang` (граница компиль-enforced: не импортит pipeline), движок читает `*lang.Pack` через DI. + FL-1 (bankTokenBudget-фолд) / FL-2 (банкнота-телеметрия на резюме) / FL-3 (emitRankCap=200) / тест-путь env-override. **Приёмка исполнением:** build/vet/race сам, **golden БАЙТ-ИДЕНТИЧЕН** (нейтральность механически доказана), **байт-точность перемещения доказана парити** (константы удалены, DI, EXACT 13618/古月:22/0.9649 против референса — строже ручного парсинга), граница грепом. **Ратифицированы 3 дивергенции (пресс-тест сработал):** language.Tag ОТВЕРГНУТ (CLDR-инстабильность в снапшот-вердиктах, golang/go#24211 — мой наивный буллет опровергнут верно) · DC-чекеры DEFER (пара-агностичны → пара-кеинг = смена поведения; translitInterj = ЯПОНСКИЕ филлеры) · снапшот-фолд DEFER до R1 (майнер offline → не wire-определяющ → преждевременный resnapshot). Дисциплина «не минор-хант/не rewrite» соблюдена. Общность структурно доказана (синтетик-пара роутится, fail-loud). Калибровка: рубеж-2 не гонялся — golden байт-идентичен + парити EXACT = correctness-риск ≈0. Промт отработан→архив. **Очередь:** R1-продолжение (фолдит pack.Version() + грузит пак при wiring майнера) → resnapshot → пере-прогон → чтение.

View file

@ -562,6 +562,10 @@ exp14b (D37-мандат) прогнал батарею DET-смысл-трап
3. **Снапшот-фолд `pack.Version()`: DEFER до R1.** Майнер OFFLINE → его данные не wire/вердикт-определяющи → фолд СЕЙЧАС = преждевременный resnapshot (инвариант №2). `pack.Version()` построен и готов; R1 фолдит его при wiring майнера в живой W1.5 (один resnapshot тогда). Резкое и верное наблюдение (мой буллет «folded как промпты» не учёл, что майнер ещё не живой).
Плюс честные DEFER-2 (`sourceAbbrevs` — 28 англ-аббревиатур в chunker, единственный per-source инвентарь движка) / DEFER-4 (`isCJK/RuTarget` как langpack-атрибут — если реестр расширится). Дисциплина «не упарываться на миноры / не rewrite-ради-rewrite» соблюдена: один оправданный рефактор + реальные FL-фиксы, косметика не плодилась.
**Записка сессии (Ш-1/Ш-2) — диспозиция оркестратора (ратифицирую, обе → R1, НЕ в нейтральный пак):** сессия при пресс-тесте нашла две слепые зоны снапшот-гарда (не дефекты текущего кода — сейчас консистентно, go1.26.4, x/text Unicode 15.0.0, дрейфа нет; всплывут при след. смене поведения / первом бампе тулчейна). **Ш-2 (несущее):** снапшот-версии (`memoryNormVersion` `memnorm.go:56` + classifier/style) НЕ фолдят `unicode.Version`а `norm.NFKC` (парити майнера + матчер банка) и голые `unicode.Han/Cyrillic` (~10 файлов) привязаны к Unicode-версии тулчейна → **бамп до go1.27 (Unicode 15→17) сменил бы NFKC/классификацию БЕЗ сдвига снапшот-версии = тихая дивергенция** (тот же класс, что отвергнутый `language.Tag`). Фикс: вплести `unicode.Version` в norm/classifier/style-версии → любой Unicode-бамп = громкий resnapshot. **Едет в R1** (R1 и так делает resnapshot при фолде `pack.Version()` — один заход покрывает оба); **ТРИПВАЕР: обязательно ДО любого go1.27-бампа** (сейчас не горит — на 1.26.4, бампать ради свежести не рекомендовано). **Ш-1 (безопасность, низкая срочность):** masked structural diff при golden re-capture — ручная дисциплина ревью, не код; хелпер (на `TM_UPDATE_GOLDEN=1` маскировать хеш/версия-поля + печатать «N вердикт-изменений / M version-only» ДО записи) делает re-capture безопасным по построению. → R1/гигиена. Обе вписаны в фикс-лист R1.
**Процесс-правка (мандат владельца 19.07): сессии НЕ плодят персистентные `backend/*_REPORT.md`** — постоянный record = D-блоки + PROGRESS; детальный приёмочный артефакт (если нужен оркестратору) пишется в `docs/archive/reports/`, не в код-зону. Три существующих репорта (PACK11/PACK11_CONT/ARCH_CLEANUP) вынесены из `backend/` в `docs/archive/reports/` (архив-не-удаление).
**Общность доказана структурно:** синтетик-пара роутится через сеам, fail-loud на неизвестный/пустой пак. Полный тест §B5 — ja→ru-реплика (когда исполнится, DEFER-1 чекеры едут туда же). **Честная калибровка:** мульти-агентный рубеж-2 на этой приёмке не гонялся — golden байт-идентичен (механический пруф нейтральности) + парити EXACT (пруф байт-точности данных) делают correctness-риск рефактора близким к нулю; прямая верификация (граница/байт-точность/фиксы/дивергенции) пропорциональна. Промт арх-прохода ОТРАБОТАН → архив с баннером. **Очередь:** R1-продолжение (`BACKEND_PLAN11_SESSION_PROMPT.md` активен; R1 фолдит `pack.Version()` + грузит пак в раннере при wiring майнера) → resnapshot → пере-прогон → чтение.
## D39.15 — Директива владельца: изоляция языковых данных из `pipeline/` (архитектурный проход ПЕРЕД R1); промт выдан (19.07, оркестратор №7). ✅

View file

@ -193,3 +193,35 @@ author≠reviewer, refute-by-default. **Итог: линза-1 (нейтраль
- **Новое R1-условие:** при подключении майнера в живой W1.5 — грузить `lang.Pack` в раннере (fail-loud-at-load для пары с
каталогом-пакетом; nil-and-run для пары без) + фолдить `pack.Version()` в `snapshotID` (единый resnapshot тогда).
- DC-чекеры/cheapgates → `internal/lang` на ja→ru-реплике (тот же сеам).
---
## Записка оркестратору — шероховатости golden/снапшот-гарда (НАБЛЮДЕНИЕ, без правок кода в этом паке)
**Провенанс:** найдено в этой сессии при пресс-тесте `isRuTarget→x/text` и разборе, что делает golden. Это НЕ дефекты
текущего кода — сейчас всё консистентно (golden зелёный, тулчейн `go1.26.4` == директива, x/text на Unicode 15.0.0, дрейфа
нет). Это **слепые зоны гарда**, которые всплывут при (а) следующей ратифицированной смене поведения и (б) первом бампе
тулчейна. Диспозиция — за оркестратором/владельцем. **В нейтральный пак НЕ тащу**: обе правки двигают снапшот/тест-инфру →
не байт-нейтральны, требуют своего ратифицированного resnapshot-захода.
**Ш-1 — masked structural diff при re-capture РУЧНОЙ.** `TestGoldenDeterminism` (`golden_test.go:317`) сравнивает capture
байт-в-байт; на `TM_UPDATE_GOLDEN=1` просто перезаписывает файл (`:306`). «Маскированный дифф» (хеши/версии→плейсхолдер,
проверить что вердикты не сдвинулись) — **дисциплина ревью, не код** (README backend/; D39.14 делал руками). Риск: небрежный
re-capture может запечь тихую вердикт-правку под видом «version-only» — ровно то, от чего golden защищает. **Опция:** хелпер,
который на `TM_UPDATE_GOLDEN=1` маскирует хеш/версия-поля и печатает сводку «N вердикт-изменений (final_text/disposition) /
M version-only» ДО записи → человек видит, что именно сдвинулось. Не ослабляет гард — делает re-capture безопасным по
построению.
**Ш-2 — снапшот-версии не фолдят `unicode.Version` (мина под бамп гошки).** `memoryNormVersion` (`memnorm.go:56`) хеширует
`memoryNormAlgoVersion + trad2simpRaw`, но НЕ Unicode-версию / версию norm-таблиц. `norm.NFKC``normalizeSourceKey`
парити майнера + матчер банка памяти) и голые `unicode.Han/Cyrillic/…` (~10 файлов: `tokenClassCounts`/`cjkShare`/чанкер/
санитайзер) привязаны к Unicode-версии ТУЛЧЕЙНА. Конкретный порог: x/text выбирает norm-таблицы build-тегом
(`//go:build go1.27` → Unicode 15→17). Значит **бамп тулчейна до go1.27 сменит NFKC/классификацию БЕЗ смены
`memoryNormVersion`** → тихая дивергенция снапшота без сигнала (тот же класс, что x/text/language-находка §DON'T-1).
**Опция:** вплести `unicode.Version` (+ версию norm-таблиц) в `memoryNormVersion` и в classifier/style-версии → любой
Unicode-бамп = громкий resnapshot / красный golden, не тихий. **Обязательно ДО любого go1.27-бампа.**
**Секвенс (предложение):** обе — отдельным ратифицированным заходом, не в этом паке. Порядок при будущем бампе гошки/либ:
(1) фолд Unicode-версии → (2) авто-masked-diff в re-capture → (3) bump → (4) re-capture с пустым masked-diff +
`TM_MINER_PARITY=1` re-pin. Про сам вопрос «бампать ли сейчас»: форсирующего CVE/фичи по коду НЕТ, версии свежие →
рекомендация «не бампать ради свежести» (churn + риск golden).