diff --git a/CLAUDE.md b/CLAUDE.md index 98ce6c0c..60f3f06b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,6 +29,7 @@ Go-бэкенд издательского художественного пер - **Коммиты**: английский, одно предложение ≤30 слов, без Co-Authored-By. `.claude/settings.local.json` НЕ коммитить (ломает пермишены). - Провайдерские ловушки: **DeepSeek — НИКОГДА не отключать thinking** (эхо-мина; гейт `echoMineViolation` это принуждает); grok-4.3 reasoning off — только ЯВНЫЙ `reasoning_effort:"none"` (дефолт low; wire-квирк в силе, но из РЕДАКТОРСКИХ ролей reasoning-off снят — no-op, D30.1); слаги моделей не менять без live-фактчека `/models`. **Пробы/запросы падают или ведут себя странно (флейки, 404 живой модели, новый finish_reason, игнор параметров) → идём в официальную доку вендора (deprecations/changelog/status) и гуглим, НЕ гадаем** — интерпретацию аномалии без вендор-сверки в доки/промты не абсорбировать (решение владельца 10.07; правило двух направлений — `00-provider-quirks.md` шапка). - Дисциплина: не верь заголовкам — грунтуй выводы `file:line`/цитатой; спорное верифицируй адверсариально (author≠reviewer); эмпирика на PD-классике из претрейна считается предварительной до вебновелл-среза. +- **Общность движка (владелец 24.07):** Go-логика НЕ ветвится по паре/книге; пара-данные → `internal/lang`+`configs/langpacks/`, книго-каноны → сид/brief (данные); книжный термин в общем пар-слое = утечка. Тест-данные пары легитимны. Норматив (только больные места): `docs/architecture/12-go-style-notes.md`. Ревью-вопрос по умолчанию: «заработает ли на паре, которой в репо ещё НЕТ, без правки Go?» - **Мандат самопроверки в промтах сессий (обязателен, решение владельца 12.07):** промты полигон-сессий — и вообще любых пишущих код / запросы к моделям — ДОЛЖНЫ явно требовать ревью ИСПОЛНЕНИЕМ: своего кода + сформированных запросов к моделям + полученных результатов. Полигон регулярно ошибается/багует, и это искажает эксперименты (D37: заявленные «0 ошибок» = 36 ошибок+биллинг, «13 катастроф» = ~5–6 при оверфлаге судьи; exp13 +10% бюджета). Бэкенд-промты — явный бэкенд-ревью после кода (обычно отрабатывает по опыту, но требовать явно). Пост-хок адверсариальная верификация оркестратора при лендинге — второй рубеж, НЕ замена самопроверки. - **Git-координация мультисессий:** НИКАКИХ `reset --hard`, перезаписей истории (amend/rebase несвежих коммитов) и `checkout` поверх грязного дерева, пока возможны незакоммиченные правки параллельных сессий — сначала `git status` и опознание ЧУЖИХ изменений; чужое не трогать; history-rewrite — только по согласованию через оркестратора при чистом дереве (урок 09.07: rewrite оркестратора стёр незакоммиченные правки полигона). diff --git a/docs/BACKEND_GENERALITY_PASS_SESSION_PROMPT.md b/docs/BACKEND_GENERALITY_PASS_SESSION_PROMPT.md new file mode 100644 index 00000000..a75c5dcd --- /dev/null +++ b/docs/BACKEND_GENERALITY_PASS_SESSION_PROMPT.md @@ -0,0 +1,29 @@ +# Промт бэкенд-сессии: ПАК-14 «генеральность-пасс» (движок ↔ данные) + +**Статус: ВЫДАН 24.07.2026, оркестратор №7.** Источник: директива владельца 24.07 («движок не должен врастать в одну книгу/пару — при 10 языках захлебнёмся») + адверсариально подтверждённый аудит-фикс-лист (25-агентный воркфлоу, findings пережили refute-pass). Норматив — `docs/architecture/12-go-style-notes.md` §0 (читать ПЕРВЫМ). Это перенос ДАННЫХ, не редизайн алгоритмов. + +**Жёсткий инвариант: байт-точность.** Каждый перенос данных из Go-констант в langpack/данные — поведенчески нулевой: golden байт-идентичен, **майнер-парити EXACT** неизменен, все пины зелёные. Прецедент дисциплины — D39.16 (арх-проход, парити EXACT). Данные langpack фолдятся в `pack.Version()` — движение снапшот-хеша от НОВЫХ файлов данных допустимо и ожидаемо (version-only), wire-тела — нет. + +## Онбординг + +`CLAUDE.md` → `docs/architecture/12-go-style-notes.md` → D39.16 (граница данные/код, что уже ратифицировано: `translitInterjections` = DEFER, НЕ трогать) → `internal/lang/langpack.go` (loader/формат) → `configs/langpacks/`. + +## Фикс-лист (подтверждённый; file:line на момент 24.07) + +1. **古月 из общего zh-langpack — ВОН** (`configs/langpacks/zh/surnames-compound.txt`): это клан книги, не 百家姓-фамилия. Механизм: книго-скоупное расширение langpack (например, `book.yaml: langpack_extензии` / merge сид-имён в майнер-вход) — дизайн предложи, парити EXACT сохрани (古月 обязан остаться в майнер-входе ДЛЯ ЭТОЙ книги — иначе catastrophe-набор {古月:22} сломается; общий langpack при этом чист). +2. **Инъекция-тексты — в пар-данные** (`memory.go:601` и рядом): русские строки инъекции (gender-аннотации «(муж. — …)», заголовки glossaryBlockHeader/editorConstraintHeader) рендерятся для ЛЮБОЙ пары без гейта. Вынести в pair-keyed данные (langpack-слот или prompts-pack по образцу stage-промптов). ⚠ Байты для zh-ru обязаны совпасть с текущими (иначе wire-сдвиг) — сверка golden. +3. **Refusal-блэклист** (`disposition.go:235-250`): en/ru/zh/ja-фразы отказов — в langpack-данные (per-source или общий файл `refusal.txt` со слотами). +4. **Чанкер:** zh-числительные (`chunker.go:207,270-304` — руны+value-мапы; heading-рендер уже данные, а числительные под ним — нет) и `sourceAbbrevs` (`chunker.go:628`, en-аббревиатуры) — в langpack. +5. **Майнер:** sentence-терминаторы `。!?` (`miner_alias.go:64`) и фонотактика Палладия (jqx/ретрофлексы/ü-finals, `miner_palladius.go:38`) — в langpack; формат loader'а расширь при необходимости (fail-loud, байты в Version()). +6. **Чекеры zh-ru:** таблицы DC1 (`checkers_zh_ru.go:30`) и `dcRegisterNegList` («терем»+формы, `:139`) — в langpack-данные пары; код чекера остаётся, читает данные. +7. **Калибровки как fallback-константы** (`config/pipeline.go:366-377`): fertility 1.1978/0.3852 + draft/edit-бюджеты — оставить механизм, но дефолты пере-документировать как «пар-калибровка zh-ru» и брать из пар-конфига, Go-fallback — только generic. +8. **Свип-добор:** полный grep CJK/Cyrillic-литералов в non-test `.go` (карта zone-6 аудита — спроси оркестратора при старте, он передаст список) — каждый решить: langpack / book-data / OK-generic; ратифицированные DEFER не трогать. +9. **Промпты — видимость пар-скоупа в дереве:** файлы `prompts/*.md` (все pair-keyed через `prompts:{zh-ru:…}`, голых `prompt:` нет) перенести в `prompts/zh-ru/` и обновить пути во всех конфигах — чтобы имя файла не читалось как общий слой. Механика: байты файлов НЕ менять (wire нетронут), только пути. Извлечение конвенций в структурированный пакет пары — НЕ в этом паке (10-prompt-architecture, гейтится формой пакета). + +## НЕ делать + +Редизайн алгоритмов · переезд `checkers_zh_ru.go` как файла (пар-модуль легитимен — выносятся ДАННЫЕ) · трогать `translitInterjections` (D39.16 DEFER) · любые правки wire-байтов zh-ru · переименования пакетов «для красоты» (12-go-style §3: файлы ≠ критерий сплита). + +## Приёмка (ревью исполнением, мандат 12.07) + +`go build/vet/test -race` зелёные · **golden байт-идентичен** (кроме version-only снапшот-метаданных от новых langpack-файлов — классифицировать дифф) · **майнер-парити EXACT** (вкл. 古月-механику через книго-расширение) · `grep -P '[\x{4e00}-\x{9fff}]|[а-яА-Я]' backend/internal/**/*.go` (non-test) — остаток объяснён построчно в отчёте · адверсариальный селф-ревью (линзы: байт-точность/парити/общность ja-ru мысленный тест). Отчёт — `docs/archive/reports/PACK14_GENERALITY_REPORT_<дата>.md`. Сессия НЕ коммитит. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 0dedeb94..cae08fc2 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -9,6 +9,10 @@ > - **Ждём от владельца:** тачпойнты exp16 (карта подписи/пол · мини-голд алиасов · precision@30, `books/gu-zhenren/exp16/`, ~30–40 мин — для сид-дельты к пере-прогону) · развилки плана §10 (W1.5-UX · DC5-стих-политика · Edit-ceiling · и др.) · реплика ja→ru (тест общности §B5) · **ре-чек прайса DeepSeek у катовера слагов 24.07** (до него платных deepseek-прогонов нет) · чтение пере-прогона (после R1+resnapshot) · старые висящие: планка запуска (лучше-фана/гибрид/издательский) · билингв-якорь пилота (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 — паки 12+13 ПРИНЯТЫ (25-агентный воркфлоу) и залендены; директива общности → норматив+фикс-лист; промт пака-14 выдан, 24.07 + +**Лендинг двумя коммитами по зонам** (`7fe0a5b` пак-12, `2f91b04` пак-13). Приёмка: build/vet + полный `-race` зелёные (сам) + воркфлоу 25 агентов/0 ошибок: пак-12 все пункты CONFIRMED, wire-нейтральность доказана по коду (маршалинг запроса не тронут); пак-13 все 10 CONFIRMED (сид↔дельта-гард loud, heading = langpack-данные с golden-no-op, книго-чекеры сняты сессией по директиве, FP-фиксы исполнением); **golden исчерпывающе: 113 пар хеш-only + 4 version-строки + 10 строк ЕДИНСТВЕННОГО wire-изменения (gender-аннотация в драфт-глоссарий, «род должен доезжать» D39.21) — категория «прочее» = 0**; зоны дизъюнктны, санкция echo_mine соблюдена. Нюансы зафиксированы: джиттер поверх 5-мин капа (+25% максимум, анти-herd, принято) · additive при total=0 (анти-undercount, принято) · few_shot:false у dspro-редактора (зеркало арма, принято). **Директива владельца «движок не врастает в книгу/пару» → норматив `12-go-style-notes.md` §0 + CLAUDE.md-гардрейл + генеральность-аудит:** подтверждённые (пережили refute-pass) утечки: **古月 в общем zh-langpack (книжный клан как «фамилия»!)** · ru-инъекция-строки для любой пары (`memory.go:601`) · refusal-блэклист в Go (`disposition.go:235`) · zh-числительные+sourceAbbrevs чанкера · терминаторы/фонотактика майнера · DC1/register-таблицы чекеров · fertility-fallback. **Промт пака-14 «генеральность-пасс» выдан** (байт-точность/парити EXACT, 古月 через книго-расширение langpack). Go-стиль-вопросы владельца закрыты в 12-*: источник = Google Go Style Guide (+Decisions/Best Practices/Effective Go/CodeReviewComments); `_test.go` рядом с кодом = требование тулчейна; 50 файлов в пакете = норма, сплит только по концептуальной подсистеме. Сид: 资质=«талант» добавлен (D39.21, lint OK); гу-ср.род → brief-слот следующего прогона (enum пола wire = male/female/hidden, среднего нет — nit пака-14+). **research/22 сдан сессией (обнаружен аудитом зон) — ПРИДЕРЖАН до ревью оркестратора, в паки не вмешан.** + ## Оркестратор №7 — РЕТРАКТ «каденса майнинга» и «масштаб-пака» (поймал владелец), очередь пере-грундована по 09-target, 23.07 Владелец верно указал: «каденс майнинг-стопов каждые N глав» — моя экстраполяция СВЕРХ контракта. Код-правда (`mining.go:14-21`): детектор офлайн читает ИСХОДНИК скоупа (черновики лишь метят охват), стоп ОДИН на прогон, все термы скоупа добываются этим стопом; между прогонами-срезами банк аккумулируется штатно (mined_delta+rejects) — довозникать нечему, каденс-механика не нужна. Сериализация edit-волны на подписи — осознанный дизайн (единственное горлышко), не проблема масштаба. **«Масштаб-пак» и полнокнижный precompute СНЯТЫ** (работоспособность проверяется малым срезом; полный масштаб встретит первый продовый прогон). Очередь пере-грундована по слоям `09-target-architecture.md`: построено — слои 1/2/4/6 + большая часть 5/7 (паки D39.2–D39.19); **остаток намеченного плана: слой 3 diff-based редактор (крупнейший; мандат до сих пор full-regen) · канал B вживую · голос/состояние D21 · C2/C3-коры · native-Gemini судья · span-чекеры смысла (полярность/ранг) · хвосты слоя 7 (strip-резолвер, сироты-промпты) · ja→ru §B5.** diff --git a/docs/README.md b/docs/README.md index 76ce0c0a..8a3c7400 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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/` — фактура исследований 04–05.07: `01–10` базовые, `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)** · **`21` обзор LLM-транспорта чужих харнессов (23.07: наш транспорт опережает/вровень со всеми 11; рекомендации DEFER до после пере-прогона, Q7-квирки — кандидаты до вендор-сверки)** — у всех ревью-шапки. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**. - `PROGRESS.md` — **журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений). -- **Активные хендофф-промты (пост-D39.22, 23.07):** [`BACKEND_TRANSPORT_PACK_SESSION_PROMPT.md`](BACKEND_TRANSPORT_PACK_SESSION_PROMPT.md) (пак-12, **ЗАПУЩЕН**; лендится первым) · [`BACKEND_PACK13_QA_SESSION_PROMPT.md`](BACKEND_PACK13_QA_SESSION_PROMPT.md) (пак-13, **ЗАПУЩЕН** ∥; 8 пунктов вкл. дефолт-редактор dspro; golden-пере-капчер — после отчёта пака-12) · [`DOMAIN_HARNESS_RESEARCH_SESSION_PROMPT.md`](DOMAIN_HARNESS_RESEARCH_SESSION_PROMPT.md) (research/22: 6 доменных конкурентов в `/home/ubuntu/projects/tmp/`, $0 → сравнение глоссарий/майнер/батчинг/QA) · [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (хендофф №5) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual пилот/18+/echo). Следующие промты (пишет оркестратор при лендинге 12/13, по слоям `09-target-architecture.md`): **пак-14 = канал B (18+) вживую + хвосты слоя 7** → **пак-15 = слой 3: diff-based узкомандатный редактор** → голос/состояние D21 + C2/C3. «Масштаб-пак» СНЯТ (ретракт оркестратора 23.07: майнинг = один стоп на прогон по исходнику, каденс-механика не нужна; полный масштаб встретим первым продовым прогоном). Закрытые — в `archive/prompts/`. +- **Активные хендофф-промты (пост-паки-12/13, 24.07):** [`BACKEND_GENERALITY_PASS_SESSION_PROMPT.md`](BACKEND_GENERALITY_PASS_SESSION_PROMPT.md) (**пак-14 генеральность-пасс — ТЕКУЩИЙ**: подтверждённые утечки пара/книга-данных из Go в langpack/сид; байт-точность+парити EXACT; норматив — [`architecture/12-go-style-notes.md`](architecture/12-go-style-notes.md)) · [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (хендофф №5) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (residual пилот/18+/echo). **Паки 12/13 ЗАЛЕНДЕНЫ 24.07** (`7fe0a5b`/`2f91b04`, приёмка 25-агентным воркфлоу; их промты + research/22-промт → архив после ревью research/22). Дальше: пак-15 = канал B вживую + хвосты слоя 7 → пак-16 = слой 3 diff-based редактор → голос/состояние D21 + C2/C3. Закрытые — в `archive/prompts/`. - `archive/` — закрытые сессионные промты (только история, инструкции оттуда не исполнять). ## Статус (2026-07-23, пост-D39.20 — механизация выпускного качества) diff --git a/docs/architecture/12-go-style-notes.md b/docs/architecture/12-go-style-notes.md new file mode 100644 index 00000000..aef2223c --- /dev/null +++ b/docs/architecture/12-go-style-notes.md @@ -0,0 +1,19 @@ +# Правила общности движка + Go-ответы по больным местам (12) + +> Короткий норматив для бэкенд-сессий (24.07.2026). Только неочевидное/больное — общий Go-стиль сессии и так соблюдают, его тут нет. Источники Go-части: Google **Go Style Guide** (guide/decisions/best-practices) + Effective Go + Go Wiki CodeReviewComments. + +## §0. Общность движка (директива владельца 24.07 — жёсткая) + +1. **Движок language/book-agnostic.** Go-ЛОГИКА не ветвится по паре языков или книге. Пара-специфичное — ДАННЫМИ: `internal/lang` + `configs/langpacks/<пара>/` (fail-loud loader, байты в `pack.Version()` → снапшот). Книго-специфичное — данными КНИГИ: сид-глоссарий / brief / book.yaml. Книжный канон в общем пар-слое = утечка (прецедент: 古月 в surnames-compound.txt). +2. **Пар-скоупнутые модули** (checkers_zh_ru и т.п.) легитимны как код за pair-гейтом, но их ДАННЫЕ (словники, руны, таблицы) подлежат выносу в langpack. +3. **Тест-данные пары легитимны**: zh/ru-строки в `*_test.go`/golden упражняют общую логику. Не путать с логикой. +4. **Промпты — pair-keyed файлы** (`prompts: {<пара>: файл}`, fail-loud на чужую пару); конвенции пары (меры, стихи, дискурс) живут в теле промпта СВОЕЙ пары — это данные. Дальний план — извлечение в структурированный пакет конвенций пары (10-prompt-architecture, гейтится формой пакета). +5. Ревью-вопрос по умолчанию: **«заработает ли это на паре, которой в репо ещё НЕТ, без правки Go?»** Если нет — данные наружу. + +## §1. Go-ответы (только то, о чём реально спорим) + +- **`_test.go` рядом с кодом — не бардак, а требование тулчейна**: `go test` собирает тесты только из каталога пакета; отдельных `tests/`-деревьев в Go не существует. +- **~50 файлов в `internal/pipeline` — норма, не смелл.** Google явно: число/размер файлов — НЕ критерий сплита («maintainers can move code between files without affecting callers»; эталон — stdlib `bytes`). Единственный легитимный триггер сплита — концептуально отдельная подсистема со своим узким API, которую не импортируют всегда вместе с pipeline. Дробление «ради размера» рождает util-пакеты и течёт деталями в публичные API. +- **Никаких пакетов `util`/`common`/`helpers`/`types`** — имя пакета обязано нести домен (Decisions/CodeReviewComments). +- **«Least mechanism»** (Guide): сперва slice/map/struct, потом stdlib, только потом своё/зависимость; это же — мера сдержанности к дженерикам и абстракциям «на вырост». +- **Интерфейс объявляет потребитель, не реализация**; не заводить интерфейсы заранее «для моков» (CodeReviewComments) — наш `BuildClient`/адаптеры уже так устроены, держать линию.