From 5d96e89d5cdd845358d104bd9edfd2e9ab4e477c 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: Sun, 7 Jun 2026 11:49:37 +0300 Subject: [PATCH] =?UTF-8?q?docs(m5):=20handoff=20=D0=B2=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=83=D1=8E=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D1=8E=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=9F=D0=B0=D0=BA=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=201-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Готовый промт-эстафета для продолжения Машины 5 с Пакета 3: дерево (worktree+ветка), источники (spec §3/§10 + план R1 + этот handoff), план использования скилов с HARD-запретом на нарушение алгоритма (audit-context только 4/5/7; net-new 3/6/8 skip; TDD RED-first; focus-линза; systematic-debugging на непредвиденный красный; инлайн без суб-агентов; commit-not-push), квирки (vitest absolute / git PowerShell / tdd-real-test- verifier не принимает it.each + coverage-ссылка в Edit), состояние (Пакет 1 22b84fbb + Пакет 2 b6d06ede, baseline 2649+2), вскрытые аудитом расхождения план↔код (writer unsigned / F5 мнимая / force-push door мут / router-gate default-deny). Co-Authored-By: Claude Opus 4.8 (1M context) --- ...outer-mentor-machine-5-handoff-session2.md | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 docs/superpowers/plans/2026-06-07-router-mentor-machine-5-handoff-session2.md diff --git a/docs/superpowers/plans/2026-06-07-router-mentor-machine-5-handoff-session2.md b/docs/superpowers/plans/2026-06-07-router-mentor-machine-5-handoff-session2.md new file mode 100644 index 00000000..d75ce4a4 --- /dev/null +++ b/docs/superpowers/plans/2026-06-07-router-mentor-machine-5-handoff-session2.md @@ -0,0 +1,144 @@ +# Машина 5 — handoff в новую сессию (после Пакетов 1-2) + +> **Это готовый промт.** Скопируй блок «=== ПРОМТ ДЛЯ НОВОЙ СЕССИИ ===» целиком в новую сессию. + +Кодовая фраза эпика: **«роутер-наставник»**. + +--- + +## === ПРОМТ ДЛЯ НОВОЙ СЕССИИ === + +роутер-наставник — ПРОДОЛЖИТЬ РЕАЛИЗАЦИЮ Машины 5 с Пакета 3. + +Продолжаем эпик «роутер-наставник» (цепочка план→роутер→судья→владелец→ПОЛ). +Машина 5 (несущий пол) строится по плану. Пакеты 1-2 уже сделаны и закоммичены. +Твоя задача — продолжить реализацию С ПАКЕТА 3, СТРОГО соблюдая алгоритм +использования скилов (п.4 — нарушать ЗАПРЕЩЕНО). + +1. ДЕРЕВО (вся работа здесь, НЕ в основном репо): + путь: c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo + ветка: worktree-brainrepo + Все git/vitest — с этим путём. «parallel session lock» → закрой второе окно + Claude на этом дереве; замок протухнет за 5 минут. + ОПЕЧАТКА-ловушка: «Документация» — русские а/и (не украинская «і»). + +2. ПРОЧИТАТЬ ПЕРВЫМ: + - Spec: docs/superpowers/specs/2026-06-07-router-mentor-machine-5-floor-design.md + (§3 пять блоков + §10 «Амендмент» Δ1-Δ9 + N1/N5). + - План: docs/superpowers/plans/2026-06-07-router-mentor-machine-5-floor.md + (шапка «Ревизия R1»; Пакеты 3-8 — задачи+критерии+линзы, бит-сайз пишется + just-in-time на RED). + - Этот handoff: docs/superpowers/plans/2026-06-07-router-mentor-machine-5-handoff-session2.md + (раздел «СОСТОЯНИЕ» ниже — что уже сделано и какие расхождения план↔код вскрыты). + +3. ГДЕ СТОИМ (HEAD = b6d06ede): + - Машины 1-4 собраны+переаудичены ранее; М4 инертна ($0). + - Машина 5 Пакет 1 — ГОТОВ, commit 22b84fbb (classifyDestructive двухуровневый + {floor,suspicious} + rewire a2CaseSelect/detectHighRisk; оба локальных + DESTRUCTIVE_RE удалены; Δ9-б seed-инвариант m5-floor-invariants.test.mjs). + - Машина 5 Пакет 2 — ГОТОВ, commit b6d06ede (несущий пол: tools/floor-decide.mjs + + tools/enforce-floor.mjs matcher '*' + дверь владельца Δ1 read-only + Δ7 + defense-in-depth в supreme-gate + C4 migrate:fresh/refresh/reset убраны из + router-gate whitelist → default-deny). + - Базовая регрессия tools-only сейчас: **2649 passed + 2 skip** (новый baseline). + - НАЧАТЬ: Пакет 3 (floor-signer + RECEIPT_DOMAINS.M5_GREEN + occurrence). + +4. ПЛАН СКИЛОВ — HARD-RULE, НАРУШАТЬ ЗАПРЕЩЕНО. Исполнение ИНЛАЙН через + superpowers:executing-plans. Суб-агенты / Task / Workflow / ultracode ЗАПРЕЩЕНЫ. + Петля на КАЖДЫЙ пакет: + (1) executing-plans ведёт пакет; + (2) audit-context-building — ТОЛЬКО Пакеты 4,5,7 (трогают существующий код M1-M4/ + хуки); на net-new Пакетах 3,6,8 ПРОПУСТИТЬ (понимать нечего, скил для + существующего кода); + (3) test-driven-development — RED→GREEN, реальный expect в изменённом фрагменте; + (4) линзы: focus-линза пакета из таблицы плана ОБЯЗАТЕЛЬНА; две другие + (sharp-edges / корректность / agentic-actions-auditor) — по риску, не вслепую; + (5) requesting-code-review инлайн (суб-агент запрещён → самопроверка по чеклисту); + (6) verification-before-completion — без свежего прогона «готово» НЕ говорить; + (7) regression (quick per-пакет, full в конце) — sentinel ≥2649 passed + 2 skip. + Спец: systematic-debugging при ЛЮБОМ непредвиденном красном (НЕ угадывать фикс!); + verify на Пакете 4 (живой прогон тулчейна после сужения node-whitelist — RISK); + finishing-a-development-branch только под слово владельца «пуш». + ЗАПРЕЩЕНО: пропускать audit-context-building на 4/5/7; линзы вслепую вместо focus; + угадывать фикс вместо systematic-debugging; код до RED; два инструмента на задачу; + «готово» без verification; суб-агенты. + +5. ЖЁСТКИЕ ПРАВИЛА: commit-not-push (пуш только по слову «пуш»); эпик в памяти + + spec/план/handoff в worktree, НЕ в основном CLAUDE.md (worktree-эксцепшн); + владельцу — простым языком, код/память — технически; активация хуков в + settings.json (enforce-floor + будущие) — шаг ВЛАДЕЛЬЦА, не код (до регистрации + пол инертен); каждый ответ: 1-я строка «экономия:…», 2-я «coverage:…». + +6. КВИРКИ (проверено в сессии 1): + - vitest в worktree — одной АБСОЛЮТНОЙ командой, без cd и без &&: + node "\app\node_modules\vitest\vitest.mjs" run --root "\app" --config "\app\vitest.config.tools.mjs" [фильтр] (+ --reporter dot для сводки) + - git commit через PowerShell, БЕЗ переменных, по одной команде с литеральным путём: + git -C "" add потом отдельно git -C "" commit -F "\.scratch\msg.txt" + («Can't find lefthook in PATH» — шум.) + - PowerShell/Bash-гейт режет цепочки (&&/;/|) с мутирующей частью (C13) и sort — + по одной простой команде. + - Glob с {скобками} и tools/+path на кириллице глючит → используй **/имя.mjs. + - ХУК tdd-real-test-verifier (важно!): (а) НЕ распознаёт it.each( как тест-блок + (regex /\b(test|it)\s*\(/) → пиши for-of + плоский it(); (б) на Edit тест-файла + new_string ОБЯЗАН содержать и expect(+it(, И строковый литерал с basename + prod-файла, отредактированного в ЭТОЙ сессии (coverage) — иначе no_coverage. + Решение: объединяй import+тест в один Edit, ИЛИ упомяни имя модуля + (напр. 'classify-destructive') в describe-заголовке/строке. Чисто-import Edit + тест-файла отклоняется (no_test_block/no_expect_call). + - Базовая регрессия tools-only: 2649 passed + 2 skip. + +7. СТАРТ: прочитай spec §3 (Блок 2) + §10 (Δ4) и план (Пакет 3), запусти + superpowers:executing-plans, начни Пакет 3 (net-new → audit-context ПРОПУСТИТЬ, + сразу TDD RED). Фокус-линза Пакета 3 — «атака». Коммить каждую задачу, БЕЗ пуша. + +Кодовая фраза эпика: «роутер-наставник». + +## === КОНЕЦ ПРОМТА === + +--- + +## СОСТОЯНИЕ (детали для новой сессии — расхождения план↔код, уже учтённые) + +Аудит-контекст Пакета 2 (mandatory audit-context-building) вскрыл, что **премиссы +плана 2.2 не совпадали с кодом**. Это УЖЕ исправлено в Пакете 2 (commit b6d06ede), +задокументировано в JSDoc `tools/floor-decide.mjs`. Новой сессии знать для контекста +дверей/подписей в Пакетах 3 и 5: + +1. **Writer approval-записей НЕ подписывает.** `enforce-askuser-answer-parser.mjs` + пишет `{type:'approve_git_operation', command, ts}` БЕЗ `sig`. Функции + `signApprovalRecord`/`verifyApprovalRecord` (домен `RECEIPT_DOMAINS.APPROVAL`) + существуют в `askuser-answer-parser.mjs` (P10-c), но к writer'у НЕ подключены. + → План «дверь через verifyReceipt(APPROVAL)» дал бы вечный deadlock. Дверь Пакета 2 + сделана на реальном механизме: read-only `approve_git_operation` через + `shell-content-rules::loadApprovedGitOps` (exact-match + окно 5 мин), интегрити — + protected-path side-channel (~/.claude/runtime: runtime-write-deny + Bash/PowerShell + гейты; пишет только PostToolUse на реальный AskUser), НЕ HMAC. +2. **F5-гонка мнимая.** `enforce-branch-switch.mjs` НЕ потребляет `approve_git_operation` + (он на текстовых маркерах). Реальный потребитель `loadApprovedGitOps` — read-only + + window, НЕ consume. Гонки нет; floor читает тем же read-only способом. +3. **force-push доп-блокируется shell-content GIT_HARD_PATTERNS ВСЕГДА** (даже approved). + → дверь владельца для force-push операционно мута (защита-в-глубину). Дверь реально + значима для floor-only (migrate:fresh/reset/refresh/db:wipe). В М5 дверь = «шов под + М6» (полный escape — в М6, Р3). +4. **router-gate default-deny** (стр.182). После C4 (Пакет 2) migrate:fresh/refresh/reset + default-денятся router-gate'ом даже без enforce-floor (SPOF-защита). + +**Для Пакета 3 (floor-signer):** Δ4 в плане УЖЕ честно переписан (§10 Δ4) — подписант +НЕ заявляет «защиту ключа от контроллера» (ключ читается через `node tools/X.mjs` до +сужения node-whitelist в Пакете 4). Честная ценность: (а) убрать ключ из логов/env; +(б) шов под HSM/YubiKey. occurrence-счётчик — анти-пере-зачёт одного green на 2 критерия. +Добавить `RECEIPT_DOMAINS.M5_GREEN` в `receipt-sign.mjs` (НЕ дефолтный домен). + +**Для Пакета 5 (критерий):** Δ5 — criterion_id = целостность, не подлинность (защита = +подпись подписанта И id∈sealed, обе). Δ6 — 4 проверки регистрируются шагами +существующей `runGateLadder` (НЕ плодить criterionFullyProven). `judge-gate-floor.mjs` +`criteriaGreenMatched` дополняется fingerprint+подписью. + +## Файлы Машины 5 (созданы/изменены в сессии 1) +- Новые: tools/classify-destructive.mjs(+test), tools/floor-decide.mjs(+test), + tools/enforce-floor.mjs(+test), tools/enforce-supreme-gate-floor.test.mjs, + tools/m5-floor-invariants.test.mjs. +- Изменены: tools/judge-orchestrator.mjs(+test), tools/router-engine.mjs(+test), + tools/enforce-router-gate.mjs(+test), tools/enforce-supreme-gate.mjs. + +## Осталось: Пакеты 3,4,5,6,7,8 + финал (full regression + finishing-a-development-branch под «пуш»).