docs(router-mentor): handoff for next session (Block B plus R-08 closed, autonomous front exhausted)

This commit is contained in:
Дмитрий
2026-06-09 05:30:35 +03:00
parent fa07472dd0
commit ad6fd73ec9
@@ -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 "<wt>" ...`). Сверь верх: `git -C "<wt>" 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:<role>`/`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 "<wt>/app" --config "<wt>/app/vitest.config.tools.mjs" <фильтр> --reporter dot` — БЕЗ `cd app`, явный `--root`. После 1-го Bash cwd залипает в `app/`.
- **git** — PowerShell, `git -C "<wt>"`, литеральные пути. `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).
- Объяснять владельцу-непрограммисту суть простыми словами + сверять понимание перед спеком.