Issue the intermediate architecture-cleanup session prompt per D39.15: isolate language data out of the pipeline package before R1, ratify the direction and re-sequence the queue

This commit is contained in:
Claude (backend session) 2026-07-19 15:51:56 +03:00
parent 13c4375e2a
commit 3798643740
4 changed files with 154 additions and 2 deletions

View file

@ -0,0 +1,138 @@
# Промт: сессия БЭКЕНД (промежуточная) — изоляция языковых данных из пайплайна + алгоритмы/чистота кода, 2026-07-19
> **Место в очереди:** ПЕРЕД R1-драйвер-свитчем (директива владельца 19.07 — вставить архитектурный проход до
> завершения волнового исполнителя, пока не накопился ещё язык-специфичный код и до того, как майнер станет
> живым в W1.5). После этой сессии → R1-продолжение (`BACKEND_PLAN11_SESSION_PROMPT.md`) → resnapshot →
> пере-прогон → чтение. **Это не R1 и не пере-прогон.**
## Директива владельца (дословно, ратифицирована — это НЕ гипотеза сессии)
Язык-специфичные русско-китайские вставки НЕ должны жить внутри `internal/pipeline/`. Горизонт — сотни
языков. Пересмотреть архитектурный подход: язык-данные — вне движка, через **библиотеки где уместно** и
**данные-файлами, а не константами**. **Писать ЧИСТЫЙ КОД с НОРМАЛЬНЫМИ АЛГОРИТМАМИ — как сеньоры из Google.**
**НО:** не упарываться на миноры, переписывание ради переписывания НЕ делать. Один оправданный крупный
рефактор (изоляция языка) + известные реальные фиксы — и всё; не плодить косметику.
## Кто ты и что сдаёшь
Бэкенд-сессия. **Зона: `backend/` (вкл. `configs/`, `prompts/`) + новый каталог языковых данных.** Прочее —
read-only. **НЕ коммитить** (лендит оркестратор). Сдаёшь:
1. Код рефактора + фиксов + тесты; **поведенчески НЕЙТРАЛЬНО для zh→ru** (это РЕФАКТОР-перемещение данных, не
смена поведения — доказывается байт-стабильностью golden с точностью до одного version-поля).
2. **`backend/ARCH_CLEANUP_REPORT.md`** — результаты каждой фазы-воркфлоу (ресёрч-буллеты, синтез, фикс-лист с
диспозициями do/defer/don't, лог исполнения, ревью-вердикт), golden-дифф, «багфиксы вне плана», residual.
## Онбординг
1. `CLAUDE.md` (гардрейлы) → `backend/README.md` (**инварианты 18**) → `docs/architecture/09-target-architecture.md`
**§0.1 инвариант общности** (любая книга/пара/структура; пара = ось данных — это север) + §2 слой-2.
2. `docs/architecture/10-prompt-architecture.md`**прецедент, который расширяем:** промпты УЖЕ живут pair-keyed
(`Stage.Prompts[pair]` + `PromptPathFor` + fail-loud + снапшот-фолд). Языковые данные получают ту же форму.
3. `docs/architecture/11-implementation-plan.md` §3 **§B5 (плагины P1P6)** — 6 интерфейсов языковых данных уже
спроектированы; эта сессия делает их **data-backed и вне `pipeline/`**.
4. D-лог D39.12D39.15; `docs/experiments/00-provider-quirks.md`.
5. Грунтовка по коду (где сейчас зашит язык): `miner_patterns.go` (百家姓 `surnamesSingleRaw`, суффиксы),
`miner_palladius.go` (таблица Палладия), `miner_alias.go` (`aliasParticle` 的了在是…), `checkers_zh_ru.go`
(时辰-таблица, числительные, «терем»-регистр), `cheapgates.go` (allowlist междометий), `disposition.go`
(`isRuTarget`/`isCJKTarget`), `chunker.go` (фертильность CJK/other). Референсы данных — `eval/exp16/*.py`.
## Фазовая структура (ВОРКФЛОУ — ultracode включён; каждая фаза = отдельный воркфлоу)
### Фаза 1 — РЕСЁРЧ (независимый, 2 направления × 3 источника, свои буллеты)
Параллельные агенты, каждый ищет СВОИ находки (refute-by-default, независимая перспектива). Источники каждого:
**(1) Go-идиоматика/stdlib/`golang.org/x/text`, (2) наш репозиторий, (3) интернет (websearch)**. Направления:
- **A. АЛГОРИТМЫ:** правильные ли алгоритмы в текст-работе (майнер n-граммы/c-value, matcher Aho-Corasick,
нормализация, union-find алиасов, фертильность)? Что из этого — переизобретённый велосипед, заменяемый
stdlib/`x/text` (сегментация/коллация/нормализация/`language.Tag`)? Что — уже правильный нормальный алгоритм,
который ТРОГАТЬ НЕ НАДО (напр. union-find `clusterAlias` — оставить)? Где Go-библиотека реально поможет, а где
честно нет (морфология/NER — вынесено в облако, не Go)?
- **B. АРХИТЕКТУРА КОДА / ОБЩНОСТЬ:** как изолировать языковые данные из `pipeline/` под сотни языков.
Паттерны: data-as-files + реестр-per-пара, plugin-интерфейсы, `x/text/language.Tag`. Прайор-арт: наш
pair-keyed промпт-сеам; Go project-layout идиомы; i18n/l10n data-separation из индустрии (websearch).
Выход фазы: два набора буллетов (алгоритмы / архитектура) с обоснованием и file:line/ссылками.
### Фаза 2 — СИНТЕЗ (короткий воркфлоу): свести все входы
Реконсилировать: **ресёрч-буллеты + буллеты оркестратора (ниже) + буллеты владельца (ниже) + известный
фикс-лист (ниже)**. Дедуп, разрешить конфликты, ранжировать по ценности×риску. Явно пометить, что —
консенсус, что — спорно.
### Фаза 3 — ВЫВОД фикс-листа + предложений (резюмирующий воркфлоу)
Из синтеза вывести **финальный actionable-список** с диспозицией КАЖДОГО пункта: **DO** (делаем сейчас) /
**DEFER** (в резидуал, с причиной) / **DON'T** (переписывание-ради-переписывания — отвергнуть явно). Это
рубеж против «упарывания на миноры»: пункт без ясной ценности → DON'T. Отдельно — предложения по
алгоритмам/архитектуре, которые сверх скоупа этой сессии (в план/владельцу).
### Фаза 4 — ИСПОЛНЕНИЕ (редактура кода)
Только DO-пункты. Временные тесты — можно. **Поведенческая нейтральность zh→ru обязательна** (см. приёмку).
### Фаза 5 — РЕВЬЮ (воркфлоу): изменения с разных точек зрения + функциональное
Мульти-линзовый адверсариал (author≠reviewer): (i) корректность/поведенческая нейтральность (golden,
детерминизм, снапшот); (ii) сеньор-код-ревью (Go-идиоматика, чистота сеамов, отсутствие велосипедов и
над-инженерии); (iii) функциональное (пара резолвится, fail-loud на неизвестную пару, добавление 2-й пары =
только данные). Находки чинить до сдачи. **Ревью НЕ должно генерить длинный минор-лист** — оно проверяет, что
рефактор корректен и нейтрален, а не хантит косметику.
## Входные буллеты для синтеза (Фаза 2)
**Буллеты ОРКЕСТРАТОРА (стартовое предложение — ПРЕСС-ТЕСТ ресёрчем, не имплементить слепо):**
- Движок (`pipeline/`) — общий, язык-данных НЕ содержит.
- Новый пакет `internal/lang/` (или лучшее по ресёрчу): интерфейсы `LangPack`/P1P6 + загрузчик + реестр,
**без самих данных**.
- `configs/langpacks/<lang>/*.yaml` + `<pair>/*.yaml`: 百家姓/суффиксы/частицы (zh), Палладий (zh-ru),
регистр/числительные/гендер-местоимения (ru), единицы 时辰 (zh-ru).
- Резолв по `Book.LangPair()`, снапшот-folded (как промпты). Добавить язык = положить каталог, **без
перекомпиляции, без правок `pipeline/`**.
- `golang.org/x/text/language.Tag` вместо `isRuTarget`/ручных рун-сетов (реестр языков с фолбэком; `x/text`
уже в зависимостях).
- НЕ трогать правильные алгоритмы: union-find, детерминированные сортировки, целочисленные пути — они верны;
из движка уходят ДАННЫЕ, алгоритм остаётся.
**Буллеты ВЛАДЕЛЬЦА:** язык вне `pipeline/`; сотни языков; библиотеки где уместно; чистый код + нормальные
алгоритмы, стандарт «сеньор Google»; не упарываться на миноры; никакого rewrite-ради-rewrite.
**Известный фикс-лист (реальные, рождены рубежом-2 D39.14 + §0.1-разбор — риды-along, не хантить сверх):**
- **FL-1 (MINOR):** свернуть `bankMaxLines`/`bankTokenBudget` в `banknoteSnap` (`snapshot.go`) — сейчас
`max_tokens += bankTokenBudget` wire-affecting, но не свёрнут → правка конста без бампа `bankParserVersion`
= тихий re-bill на резюме.
- **FL-2 (MINOR, observability):** `resumeFromChunkStatus` (`resume.go:22`) не ставит `BankFlags`
банкнота-телеметрия обнуляется на резюме готовых чанков; коммент «self-heals» ложен. Re-derive из сырого
чекпоинта / не обнулять эти колонки на резюме / поправить коммент.
- **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-фильтрами.
- **Тест-путь:** абсолютные `/home/ubuntu/...` в `miner_parity_test.go` → env-var/`testdata`-относительные
(тест-гигиена; не прод).
## Скоуп
**IN:** ресёрч; изоляция языковых данных (движок→`lang`/`langpacks`); `x/text/language`-реестр; FL-1/2/3;
тест-путь; доказательство общности «2-я пара = только данные» (минимальный второй langpack-скелет ИЛИ тест
загрузки синтетической пары через сеам — НЕ полный ja→ru-контент). **OUT:** R1 драйвер-свитч (след. промт);
пере-прогон; любая смена ПОВЕДЕНИЯ перевода zh→ru; полная ja→ru-реплика (отдельная задача); минор-хант.
## Гардрейлы (жёсткие)
- **Поведенческая нейтральность zh→ru:** рефактор = перемещение ДАННЫХ; langpack-значения обязаны быть
байт-равны прежним константам. Golden после = байт-стабилен С ТОЧНОСТЬЮ до одного нового version-поля
(langpack-версия в снапшоте); НОЛЬ изменений вердиктов/wire/final. Один чистый resnapshot (масштаб — как
chunkerVersion). Если langpack-путь меняет хоть один вердикт — это БАГ рефактора, не «улучшение».
- **Снапшот-дисциплина:** langpack-данные wire-определяющи (майнер/чекеры/фертильность) → версия пакета
фолдится в `snapshotID` (правка данных = громкий resnapshot, как `chunkerVersion`/промпты). Детерминизм:
загрузка сортирована/версионирована, без map-order в выводе.
- **Чистый код, сеньор-Google:** идиоматичный Go (`gofmt`/`vet`/`-race` чисто; обёртка ошибок `%w`; без
глобального мутабельного стейта; table-driven тесты); **stdlib/`x/text` вместо велосипедов**; НО НЕ
над-инженерия (union-find не превращать в «библиотеку»; не плодить абстракции без второго потребителя —
а он есть: 2-я пара). Комментарии — как в окружающем коде (констрейнты, не пересказ).
- **Инварианты 18 не трогать** (деньги/durability, снапшот, эхо-мина, детерминизм, экспорт-контракт, golden).
- **$0 к провайдерам:** ресёрч — websearch + чтение кода; верификация — build/test/golden/фикстуры. LLM-вызовов
перевода НЕТ.
- **Неконсистентность/аномалия** — даблчек всеми тулзами (grep, git log, вендор-дока, websearch — правило двух
направлений); реальное расхождение → эскалация запиской, не тихо.
- Git: `.env` не читать; книга/производные вне git; PUML не рендерить; не коммитить.
## Приёмка (оркестратор — знай заранее)
Пере-исполнение фикстур; спот-чек file:line; **golden байт-стабильность** (масштаб — только langpack-версия,
ноль вердикт-правок); адверсариальный рубеж-2 (перемещение данных нейтрально? общность реальна — 2-я пара
грузится без правок `pipeline/`? алгоритмы не сломаны, велосипеды сняты, над-инженерии нет?); проверка «не
упоролись на миноры» (фикс-лист = DO-пункты с ценностью, не косметика). Затем лендинг → D-блок → R1-продолжение.

View file

@ -9,6 +9,10 @@
> - **Ждём от владельца:** запуск exp15 (бюджет ≤$15 подтверждён) · research/20 §E: мини-голд алиасов (~2030 мин) / бюджет ≤$5 полигон-стадии / политика канона / жанр-паки / реплика ja→ru · чтение пере-прогона (после очереди) · старые висящие: планка запуска (лучше-фана/гибрид/издательский) · билингв-якорь пилота (D25.9-Q1) · контаминация пилот-корпуса (D27.4) · publishable/waiver (D25.1) · FN-bound L3 (D25.4) · юр-пакет · провенанс 12-*-доков.
> - Архивы хроники: `archive/PROGRESS-2026-07-04-10.md` (D31) · `archive/PROGRESS-2026-07-10-13.md` (D39.6-гигиена). Записи ниже — живая эра D39.
## Оркестратор №7 — директива владельца D39.15: изоляция языка из pipeline/, архитектурный проход перед R1 (19.07, пятая фаза)
Владелец нашёл zh/ru-константы внутри `internal/pipeline/` (百家姓, Палладий, частицы, `checkers_zh_ru`, `isRuTarget`) → директива: язык ВНЕ пайплайна, сотни языков, библиотеки/данные-файлами, чистый код+нормальные алгоритмы (стандарт «сеньор Google»), НО не минор-хант/не rewrite-ради-rewrite. Разбор оркестратора по коду: §0.1-сеам реален (гейты/pair-keyed промпты/fail-loud — en→es даёт fail-loud, не крэш); хардкод-пути только в тесте; `clusterAlias` = корректный union-find. Настоящий зазор: данные-как-консты (а не файлы) + `x/text` (уже в deps v0.38) недоиспользован. **Ратифицировано D39.15:** целевая форма — `internal/lang/` (интерфейсы+загрузчик, без данных) + `configs/langpacks/<lang|pair>/*.yaml` + `x/text/language.Tag`; резолв по LangPair, снапшот-folded как промпты; алгоритмы не трогать (уходят ДАННЫЕ). **Секвенс: этот проход ПЕРЕД R1** (пока майнер не живой). **Промт выдан `BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md`** — 5 фаз-воркфлоу (ресёрч 2×3 → синтез → фикс-лист do/defer/don't → исполнение → ревью); поведенчески нейтрально zh→ru (golden байт-стабилен, один resnapshot); риды-along FL-1/2/3 + тест-путь. ja→ru = приёмочный тест общности позже. **Очередь пере-упорядочена:** арх-проход → R1-продолжение → resnapshot → пере-прогон → чтение.
## Оркестратор №7 — пак-11 continuation принят и залендён (D39.14), рубеж-2-долг погашен, 19.07 (четвёртая фаза)
Continuation-сессия сдала R2R5 + R1-аддитив (санкц. порядок вариант-1). **Залендено:** R2 Go-майнер (паритет EXACT: 13618, 古月:22, recall 0.9649) · R3 банкнота 12-точек (на посл. раннере, переезжают в волны как есть) · R4 DC1/DC2/DC6+DC3-gender+`export --pairs` (2 golden re-capture masked-чист) · R5 2 арм-конфига · R1-аддитив (snapshotIDForWave + W0-precompute байт-идентично). R1 драйвер-свитч (W1/W1.5/W2 + структурный golden-рерайт) — санкц. резидуал. **Приёмка исполнением:** build/vet/race сам, ~40 пинов свежим `-count=1` (майнер-паритет TM_MINER_PARITY EXACT), независимая masked-golden репликация (0 изменений final_text/disposition), построчное чтение деньги-пути (settle пишет raw, срез после durable settle — деньги нетронуты). **Долг рубежа-2 (D39.13) ПОГАШЕН:** 8-агентный адверсариал по обоим кускам, 5 линз refute-by-default, $0 — **3 находки (все MINOR/PARTIAL, 0 refuted); все CRITICAL/MAJOR-линзы пусты** (деньги/wire/порт/резюм/base-enriched/residual — clean bill). Фикс-лист FL-1 (bankTokenBudget не свёрнут в banknoteSnap) · FL-2 (banknote-телеметрия обнуляется на резюме, observability) · FL-3 (miner emission без top-N капа референса) — все латентны (банкнота off по дефолту, эмиссия за R1), лендинг не блокируют → R1-продолжение (промт активен, фикс-лист вписан). §0.1-заметка владельцу: DC-данные = код-консты за isRuTarget-гейтом (сеам защищает; config-extraction — открытый вопрос, увязать с ja→ru). Очередь: R1-продолжение → приёмка → resnapshot → пере-прогон → чтение.

View file

@ -16,7 +16,7 @@
- `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13), `10-explicit-benchmark` (18+ violence-рука канала B), `11-erotica-benchmark` (erotica по трём парам/регистрам — закрытие D14.4, D22).
- `research/` — фактура исследований 0405.07: `0110` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память, `15` голос и состояние (принят, D21), **`16` ридер-IDE (принят с ревью-шапкой, D29)**, **`17` внешняя критика GPT-5.6 (принят с ревью-шапкой, D25)** — у 16/17 читать шапку прежде тела. **`18` рычаги качества (два отчёта, D36)** · **`19` нарезка+когезия+контракт t/e (D39.1)** · **`20` банк-майнинг W1.5 (D39.6)** — у всех ревью-шапки. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**.
- `PROGRESS.md`**журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений).
- **Активные хендофф-промты (пост-D39.12, 19.07):** [`BACKEND_PLAN11_SESSION_PROMPT.md`](BACKEND_PLAN11_SESSION_PROMPT.md) (**СТАРТОВЫЙ для бэкенд-сессии — единый пак по ратифицированному плану [`11-implementation-plan.md`](architecture/11-implementation-plan.md), D39.12**) · [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (хендофф №5 оркестратора) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual пилот/18+/echo). Закрытые — в `archive/prompts/` (свежий: дизайн-синтез→D39.12). Закрытые — в `archive/prompts/` (свежие: exp16→D39.10, Q4a→D39.9, exp15→D39.7, банк-майнинг-ресёрч→D39.6).
- **Активные хендофф-промты (пост-D39.15, 19.07):** [`BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md`](BACKEND_ARCH_CLEANUP_SESSION_PROMPT.md) (**СТАРТОВЫЙ — промежуточный арх-проход: изоляция языковых данных из pipeline/, ПЕРЕД R1, D39.15**) · [`BACKEND_PLAN11_SESSION_PROMPT.md`](BACKEND_PLAN11_SESSION_PROMPT.md) (**R1-продолжение по плану [`11-implementation-plan.md`](architecture/11-implementation-plan.md) — ПОСЛЕ арх-прохода; D39.12/14**) · [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (хендофф №5 оркестратора) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual пилот/18+/echo). Закрытые — в `archive/prompts/` (свежий: дизайн-синтез→D39.12). Закрытые — в `archive/prompts/` (свежие: exp16→D39.10, Q4a→D39.9, exp15→D39.7, банк-майнинг-ресёрч→D39.6).
- `archive/` — закрытые сессионные промты (только история, инструкции оттуда не исполнять).
## Статус (2026-07-12, пост-D38.1 · консолидация D38.2)

File diff suppressed because one or more lines are too long