From e0b8a52783c275c5703c2c91e2318d5b6f20ad90 Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sun, 19 Jul 2026 18:03:57 +0300 Subject: [PATCH] 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 --- docs/BACKEND_PLAN11_SESSION_PROMPT.md | 27 +++++++++++----- docs/PROGRESS.md | 2 ++ docs/architecture/05-decisions-log.md | 4 +++ .../reports/ARCH_CLEANUP_REPORT_2026-07-19.md | 32 +++++++++++++++++++ .../reports/PACK11_CONT_REPORT_2026-07-19.md | 0 .../reports/PACK11_REPORT_2026-07-19.md | 0 6 files changed, 57 insertions(+), 8 deletions(-) rename backend/ARCH_CLEANUP_REPORT.md => docs/archive/reports/ARCH_CLEANUP_REPORT_2026-07-19.md (85%) rename backend/PACK11_CONT_REPORT.md => docs/archive/reports/PACK11_CONT_REPORT_2026-07-19.md (100%) rename backend/PACK11_REPORT.md => docs/archive/reports/PACK11_REPORT_2026-07-19.md (100%) diff --git a/docs/BACKEND_PLAN11_SESSION_PROMPT.md b/docs/BACKEND_PLAN11_SESSION_PROMPT.md index bf11630..dc95116 100644 --- a/docs/BACKEND_PLAN11_SESSION_PROMPT.md +++ b/docs/BACKEND_PLAN11_SESSION_PROMPT.md @@ -1,6 +1,6 @@ > **⚠ АКТУАЛИЗИРОВАН ПОД R1-ПРОДОЛЖЕНИЕ (19.07, пост-D39.14; предыдущие версии — в git-истории).** Сессия №1 > сдала Block A (`85f5b9e`, D39.13); сессия №2 сдала R2–R5 + 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. Код резидуала R1–R5 + тесты из (д)-секций плана (пины/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, под тестами) и §Резидуал R1–R5 с пошаговыми дизайнами. +Онбординг-добавка: приёмочные детали прошлых заходов (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; в код не тащить) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index c0c0d4c..56ee113 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -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` (заголовок D1–D38→D1–D39.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 → пере-прогон → чтение. diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 4bb35f5..615e381 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -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). ✅ diff --git a/backend/ARCH_CLEANUP_REPORT.md b/docs/archive/reports/ARCH_CLEANUP_REPORT_2026-07-19.md similarity index 85% rename from backend/ARCH_CLEANUP_REPORT.md rename to docs/archive/reports/ARCH_CLEANUP_REPORT_2026-07-19.md index de98552..5cc87ae 100644 --- a/backend/ARCH_CLEANUP_REPORT.md +++ b/docs/archive/reports/ARCH_CLEANUP_REPORT_2026-07-19.md @@ -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). diff --git a/backend/PACK11_CONT_REPORT.md b/docs/archive/reports/PACK11_CONT_REPORT_2026-07-19.md similarity index 100% rename from backend/PACK11_CONT_REPORT.md rename to docs/archive/reports/PACK11_CONT_REPORT_2026-07-19.md diff --git a/backend/PACK11_REPORT.md b/docs/archive/reports/PACK11_REPORT_2026-07-19.md similarity index 100% rename from backend/PACK11_REPORT.md rename to docs/archive/reports/PACK11_REPORT_2026-07-19.md