From ad6fd73ec9bee0dff24b1c3517d4d11cd6d95fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 9 Jun 2026 05:30:35 +0300 Subject: [PATCH] docs(router-mentor): handoff for next session (Block B plus R-08 closed, autonomous front exhausted) --- ...-06-09-router-mentor-blockB-r08-handoff.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 docs/superpowers/plans/2026-06-09-router-mentor-blockB-r08-handoff.md diff --git a/docs/superpowers/plans/2026-06-09-router-mentor-blockB-r08-handoff.md b/docs/superpowers/plans/2026-06-09-router-mentor-blockB-r08-handoff.md new file mode 100644 index 00000000..bbb6ca7c --- /dev/null +++ b/docs/superpowers/plans/2026-06-09-router-mentor-blockB-r08-handoff.md @@ -0,0 +1,98 @@ +# Router-mentor — Handoff к следующей сессии (Блок B + R-08 ЗАКРЫТЫ · автономный фронт исчерпан) + +**Дата:** 2026-06-09 · **Кодовая фраза эпика:** «роутер-наставник». +**Ветка:** `worktree-brainrepo` · **commit-not-push** (origin не тронут). +**HEAD на момент handoff:** `fa07472d`. + +**Сделано этой сессией:** (1) Блок B Классы 1+2 (R-09/R-24/R-30/reconcile) — реализованы TDD; +(2) **R-08 волны** (последний пункт B) — реализован через полный adversarial-разбор; (3) М1 +атомарность журнала — запинена характеризационным тестом; (4) реестр хвостов синхронизирован. +**Этапы 1 (H) и 2 (B) критпути ЗАКРЫТЫ Claude. Автономный фронт эпика исчерпан** — остаток +требует владельца (settings.json / ключи / scoping / push). + +--- + +## === ПРОМТ ДЛЯ НОВОЙ СЕССИИ (скопировать целиком) === + +роутер-наставник. Этапы 1 (H) и 2 (B) критпути ЗАКРЫТЫ — автономный фронт исчерпан. НЕ приступай к коду сразу: прочитай состояние, реши со мной, что берём, подними согласованную цепочку скилов, действуй по ней. Всё инлайн, субагенты/Task/Workflow ЗАПРЕЩЕНЫ. + +ДЕРЕВО: `c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo`, ветка `worktree-brainrepo`. Git — ТОЛЬКО PowerShell (`git -C "" ...`). Сверь верх: `git -C "" log -14 --oneline` (ожидаемый верх — `fa07472d` docs mark Block B closed; под ним `5782ede3` M1 pin, `2b0c28e5` R-08 supreme-gate). + +ПРОЧИТАЙ ПЕРВЫМИ: `docs/superpowers/plans/2026-06-09-router-mentor-blockB-r08-handoff.md` (этот файл) + `docs/superpowers/plans/2026-06-08-router-mentor-loose-ends-registry.md` (реестр; B помечен ✅, M1 ✅). При необходимости — `docs/superpowers/specs/2026-06-09-router-mentor-r08-hierarchical-waves-design.md` (дизайн R-08 + 7 SE-hardening + 2 flat-варианта). + +ДАЛЬШЕ: спроси владельца, что берём — **весь остаток требует владельца, чисто-автономного кода больше нет.** Варианты: (A) «пуш» — финализировать ветку через `finishing-a-development-branch` (14 коммитов сессии + предыдущие, origin не тронут); (B) этап 3 — owner-обкатка в shadow (судья М4 / пол М5 / стена М2 / escape М6) — Claude помогает инструкциями, рубильник у владельца; (C) этап 4 — Фаза 8 «Большой переезд» (регистрация М1–М6 в settings.json + ключи + увольнение v4-зоопарка §10 + sealedPlanCoversEdit live + откат); (D) Фаза 2 observer (LLM agent-судья качества + авто-правка нормативки) — СНАЧАЛА brainstorm-scoping, т.к. авто-правка Pravila/Tooling = ровно то, что стерегут М1–М6; (E) C-контракты (R-06 K4 после live K1 / R-10 G6 адаптер не построен / М4 think-layer) — owner-gated. + +ЦЕПОЧКА СКИЛОВ (что сработало этой сессией): для рискованной стены/несущего кода — `brainstorming → audit-context-building → sharp-edges → variant-analysis → writing-plans → executing-plans (инлайн TDD, наблюдаемый RED до prod-правки) → verification-before-completion → regression`. Для observation-only/нерискованного — `brainstorming → writing-plans → executing-plans`. Для pinning существующего инварианта — характеризационный тест (TDD-discipline, GREEN-only честно, без фальш-RED). НЕ `requesting-code-review`. Скилы инлайн, coverage `direct:`/`chain:<...>`. **Владелец требует: высылать цепочку скилов на согласование ДО исполнения рискованных задач.** + +ЖЁСТКОЕ: commit-not-push (пуш ТОЛЬКО по слову «пуш»); 1-я строка ответа «экономия:…», 2-я «coverage:…»; CLAUDE.md в worktree НЕ трогать (чужая зона, 99.8KB чужой diff); жёсткие стены М2/М5/М4/М6 не ослаблять; нормативку (Pravila/Tooling/PSR/MEMORY) не двигать; чужую грязь дерева (observer-jsonl авто-регенерат / `.scratch/` / `patch-*.mjs` / `setup-nm.mjs` / `commit-msg.txt`) НЕ коммитить — стейджить свои файлы поимённо. + +СТАРТ: реестр + этот handoff → выбор хвоста у владельца → согласование цепочки → действуй. Кодовая фраза: «роутер-наставник». + +## === КОНЕЦ ПРОМТА === + +--- + +## Что закрыто этой сессией (14 коммитов `2e6a6c0a..fa07472d`, commit-not-push) + +| Коммит | Что | +|---|---| +| `2e6a6c0a` | R-09 `computeLearningQueueBlock` (read-only STATUS) | +| `0eef670e` | R-24 `door-coverage`: `extractGateMatcher`/`CANONICAL_MUTATING_TOOLS`/`isMutatingTool` + `export SEED_TOOLS` (пиннинг инвариантности стены) | +| `1000abc7` | R-24 `computeDoorCoverageBlock` (read-only STATUS) | +| `752512d3` | R-30 `computeJournalIntegrityBlock` (verifyChain live в read-only генераторе) | +| `0e995970` | reconcile `reconcileEvent` reader в main (WARN-only, ИНЕРТЕН до регистрации хука владельцем A3) | +| `93fcb5e1` | R-08 design spec | +| `4a0c3a98` | R-08 spec ужесточён adversarial-проходом (7 SE + 2 flat-варианта) | +| `1651fdfb` | R-08 implementation plan (6 задач TDD) | +| `1a3ccc21` | R-08 step-pointer: serialize/deserialize + nodeAt/normalizeToLeaf/advanceOverTree (depth-first, предел глубины) | +| `51f718ea` | R-08 plan-lock: treeLeaves/treeLeafAt/validatePlanTree + рекурсия criterion_id + V1/V2 потребители | +| `16e0c1db` | R-08 supreme-gate: указатель-состояние принимает дерево-позицию (целое/массив индексов) | +| `2b0c28e5` | R-08 supreme-gate: treeLeafAt + advanceOverTree + SE-1 флаг `advance` в decide/runGate | +| `5782ede3` | М1 пиннинг: оборванная дозапись журнала → verifyChain fail-closed (характеризация) | +| `fa07472d` | sync реестра хвостов (B ✅, M1 ✅, stale-заметки исправлены) | + +**Регрессия tools-only: `3259 passed / 2 skipped / 0 failed`** (baseline входа 3221 → +38: R-09 6 + R-24 10 + R-30 6 + reconcile 4 + R-08 36 — wait см. ниже + М1 2). Точная дельта: вход B0=3221 → после Классов 1+2 = 3221+? → после R-08 = 3257 → после М1 = 3259. Все существующие тесты GREEN без правок (flat-регрессия SE-7). 2 skipped — `llm-judge.integration.test.mjs` (gated на live-ключ, не баг). + +**R-08 несущий инвариант (для будущего аудита):** лист ВСЕГДА из подписанного дерева (I2) — +`treeLeafAt` возвращает только узел без `substeps` либо null; контейнер с op/object/ref → +`validatePlanTree` block (SE-2); под-шаги под той же печатью (canonicalJson рекурсит, I9/I10); +стена выбирает ход, не контроллер (I8/SE-1 явный флаг advance). Единый дерево-указатель: целое = +сериализация depth-1 (плоский план round-trip'ит → существующие тесты GREEN). Пол М5 / судья М4 / +escape М6 НЕ тронуты. + +--- + +## Что осталось — ВСЁ требует владельца (карта) + +| Блок | Что | Кто | +|---|---|---| +| **Этап 3** | shadow-обкатка: судья М4 / пол М5 / стена М2 / escape М6 | владелец (рубильник) | +| **Этап 4 / A** | Фаза 8 переезд: регистрация М1–М6 в `settings.json` + ключи (судья `router-mentor-judge` / подписант) + флаг `ROUTER_MENTOR_JUDGE_ENABLED=1` + увольнение v4-зоопарка §10 + `sealedPlanCoversEdit` live (V3 ниже) + откат | владелец | +| **A9** | **push всего эпика** (commit-not-push) | владелец («пуш») | +| **V3** (R-08 future) | `enforce-normative-content-rules.mjs:253` `sealedPlanCoversEdit` hardcoded `false` → при Ф8 coverage через `actionMatchesStep` обязана стать tree-aware (`treeLeaves` из plan-lock) | владелец (Ф8) | +| **G Фаза 2** | observer LLM agent-судья качества + **авто-правка нормативки** → нужен brainstorm-scoping (НЕ автономно) | владелец → Claude | +| **C** | R-06 K4 (после live K1) / R-10 G6 адаптер (не построен) / М4 think-layer / М6 FIX-5 (осознанно нет) / М2 T1-T9 (не спецированы) | owner-gated / deferred | +| **F** | enforce-hole-3 trust-level (вариант C, Stage 4) / остаточный предел ~0.5% | владелец | +| **H3** | few-shot память роутера | владелец → Claude | + +--- + +## Квирки сессии (подтверждены, экономят время новой) + +- **vitest:** `npx vitest run --root "/app" --config "/app/vitest.config.tools.mjs" <фильтр> --reporter dot` — БЕЗ `cd app`, явный `--root`. После 1-го Bash cwd залипает в `app/`. +- **git** — PowerShell, `git -C ""`, литеральные пути. `cd` в `.claude`-путь режет router-гейт. +- **PowerShell-гейт режет тело коммита и команды:** редкие латинские слова за cmdlet (`export`/`v1`/`write-output`/`distinct`) → **короткие ASCII commit-msg без редких слов**, без `>`/`>=`; стейдж отдельным `git add`. `Write-Output` не в whitelist — не использовать. +- **TDD-gate** ждёт падающий тест в СОБСТВЕННОМ тест-файле правимого prod-файла (правка `enforce-supreme-gate.mjs` требует RED в `enforce-supreme-gate.test.mjs`, не в соседнем). +- **`enforce-tdd-real-test-verifier`:** правка `*.test.mjs` через Edit обязана сама нести `it`+`expect`+ссылку на prod; правка одной assertion-строки внутри `it` отвергается → расширять границы Edit на весь `it`-блок ИЛИ класть импорт+тесты одной правкой. +- **pinning-тест существующего инварианта** — GREEN сразу, RED нет; не фабриковать фальш-RED (quirk закреплён). +- **Список файлов** — Grep (Glob ломается на junction worktree). +- **Память харнесса** пишется только при активном `claude-md-management` + coverage `direct:memory-sync`; CLAUDE.md в этом worktree off-limits → знание фиксировать в `docs/superpowers/plans/*` (git). +- **«Can't find lefthook in PATH»** — ШУМ, игнор. + +--- + +## Методология (что сработало) + +- **Цепочка скилов высылается владельцу на согласование ДО исполнения рискованной задачи** (R-08 — стена М2 «тонко-опасная»). Владелец утверждает цепочку, потом дизайн, потом спек (review-gate), и только затем код. +- Для несущей стены — **тройной adversarial-разбор между дизайном и планом**: `audit-context-building` (карта инвариантов) → `sharp-edges` (footgun нового API) → `variant-analysis` (охота на варианты класса-дыры по всему коду). Этот проход расширил scope R-08 (нашёл 2 flat-варианта V1/V2 в plan-lock, иначе иерархический план тихо сломал бы Гейт-2 + reconcile). +- Объяснять владельцу-непрограммисту суть простыми словами + сверять понимание перед спеком.