From 6bc0f6d040586fcadfc895aeb31b01cdd003ba6d 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: Thu, 18 Jun 2026 14:32:26 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20handoff=20=D0=B4=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=8D=D1=82=D0=B0=D0=BB=D0=BE=D0=BD=D0=B0=20?= =?UTF-8?q?=E2=80=94=20B+C=20=D1=87.2/D1/D2=20DONE=20+=20=D1=80=D0=B5?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=85=D0=B2?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обновлён docs/superpowers/2026-06-18-wall-improvements-handoff.md: - «Сделано» дополнено B+C ч.2 (bc1d2a3), D1 (bbc053e), D2 (b47a71c); свод 4319. - «Осталось» переписано: только §3.4 десинк (решение владельца — отдельной сессией; механизм + безопасный путь зафиксированы) + норматив-заметки. - §3.3 docs/ops без criterion/verify — ЗАКРЫТО (владелец 2026-06-18): строго .md, расширение на не-.md ops-артефакты не делаем (конфликт с CLAUDE.md §13). Co-Authored-By: Claude Opus 4.8 --- .../2026-06-18-wall-improvements-handoff.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 docs/superpowers/2026-06-18-wall-improvements-handoff.md diff --git a/docs/superpowers/2026-06-18-wall-improvements-handoff.md b/docs/superpowers/2026-06-18-wall-improvements-handoff.md new file mode 100644 index 0000000..c2bcecf --- /dev/null +++ b/docs/superpowers/2026-06-18-wall-improvements-handoff.md @@ -0,0 +1,104 @@ +# Хэндофф: допил эталона стены (A / B+C / D1 / D2) — для следующей сессии + +**Дата:** 2026-06-18 · **Репозиторий:** claude-brain · **Кодовая фраза:** «роутер-наставник». +**Что это:** чиним баги стены из `bags/` так, чтобы стена контролировала качество (наставник+судья), +а НЕ сваливала механическую/необратимую работу на владельца-непрограммиста. Задумка владельца: он = ТЗ + +приёмка («принимаю/нет»), агент делает всё под ревью. + +--- + +## Текущее состояние + +- Ветка `main`. Свод зелёный: **4319 passed, 2 skipped** (через PowerShell, см. ниже). Обновлено 2026-06-18 после D2. +- **Допил эталона ЗАВЕРШЁН по коду** (A → B+C ч.1 → B+C ч.2 → D1 → D2). Осталось: §3.4 десинк (отдельной сессией) + норматив-заметки. См. «Осталось» и «Хвосты». +- **Режим стены на момент паузы:** ⚠️ уточнить у владельца. Для правок машинерии нужен ШТАТНЫЙ (стена off, + остаются пол+verify-before-push). Включается фразой владельца **«да, штатный»**, выключается + **«выключи штатный»**. Правка `tools/enforce-*.mjs`/`plan-lock`/`floor-*` под включённой стеной + невозможна (F-K) — поэтому работаем в штатном. + +## Сделано и закоммичено + +| Кусок | Коммит | Суть | +|---|---|---| +| **A** — чтение под планом | `e91aa02` | гейт ДР-1 в impl снят: под планом читаем свой вывод/новые файлы; чтение не двигает очередь; impl-чтения логируются `impl:true`. Файл: `tools/reading-discipline.mjs`. | +| **B+C ч.1** — смотрящие инструменты | `e9ba6fb` | предикат `isQueryOnly` (ToolSearch/WebFetch/WebSearch/read-only браузер) проведён во все ветки `decide`/`decideMode`: смотрящие свободны в обоих режимах, указатель не двигают. Файл: `tools/enforce-supreme-gate.mjs`. | +| **B+C ч.2** — сеанс осмотра `op:"session"` | `bc1d2a3` | новый тип шага `{op:'session',goal,tools,produces}`; смотреть/кликать по живым ref свободно (указатель не двигается), закрывает запись последнего `produces`; запрет `op:"Skill"` как шага; предохранитель `sanitizeSessionTools`; наставник понимает session. Файлы: `plan-lock`, `enforce-supreme-gate`, `plan-steps-parse`, `mentor-verdict`. | +| **D1** — благословлённый деплой | `bbc053e` | `kind:"deploy"`-план под `ops-runbook:` агент гонит по белому списку Bash-шагов; «ядерное» (rm-rf/force-push/migrate:fresh) — per-command escape. Мост `tools/blessed-ops.mjs` сохраняет Δ9. Файлы: `plan-lock`, `plan-skills`, `seal-orchestration`, `escape-grant`, `floor-decide`, `blessed-ops`, `enforce-floor`. | +| **D2** — коммит силами агента | `b47a71c` | `commit:` снимает гейт ПРИСУТСТВИЯ (router-gate git-approval); гейты КАЧЕСТВА (criterion/verify) остаются; force-push/--no-verify блокируются всегда. Мост `tools/commit-grant.mjs`; обобщён `loadPlanScopedGrants`. Файлы: `escape-grant`, `commit-grant`, `shell-content-rules`, `enforce-router-gate`. | + +## Осталось (на след. сессию) + +| Кусок | Где | Статус | +|---|---|---| +| **§3.4 десинк** — push последним шагом → ложный блок criterion-gate | `agent-commit-channel-design.md` §3.4 | НЕ начат. Решение владельца 2026-06-18: **отдельной сессией** (правка сердцевины — момент снятия печати на завершении плана). Механизм: supreme-gate в settings.json стоит РАНЬШЕ criterion/verify → на последнем шаге `removeFrozenPlan` срабатывает до criterion → тот видит «нет плана» (подтверждено). Безопасный путь: тест-ловушка → перенос снятия печати в PostToolUse (новый sweep-хук, ибо все PreToolUse-хуки всё равно отрабатывают) → полный свод. | +| **Норматив-заметки** | Pravila/GUIDE | A («читать→перепланировать»), D1 («читать вывод деплоя→стоп на аномалии»), D2 («коммит под `commit:`») — через claude-md-management, когда стена вернётся. | + +Все спеки реализованы (A/B+C/D1/D2). Планы: `plans/2026-06-18-blessed-ops-runbook-plan.md`, `plans/2026-06-18-agent-commit-channel-plan.md`. Спека A: `specs/2026-06-18-wall-impl-read-freedom-design.md`. + +## Решения владельца (ЗАКРЫТЫ — не переспрашивать) + +- **A:** чтение под планом свободно; лог тихий (только ретро), без порога-warn. Секреты держит отдельный + `read-path-deny` (не трогать). +- **B+C:** смотреть — свободно везде; действовать (клик/ввод/MCP) — по списку `tools-json` сеанса, который + входит в печать и виден наставнику/судье. Запрещённое в списке → **отбросить + видимое предупреждение** + (не валить план). Сеанс НЕ ограничен по времени/кликам; итоговых файлов (`produces`) можно несколько. + Браузер — можно всё (смотреть и кликать). **Жёсткий предохранитель:** `tools-json`/сеанс НИКОГДА не + включает `Write`/`Edit`/`MultiEdit`/мут-`Bash`/floor — правки репозитория остаются ШАГАМИ, необратимое + за полом/escape. +- **D1:** одобренный наставником+судьёй деплой выполняет АГЕНТ по белому списку плана, читая вывод каждого + шага и останавливаясь на аномалии; «ядерные» команды (`rm -rf`/force-push/`migrate:fresh`/drop) — всё + равно отдельный per-command escape. Одно согласие владельца `ops-runbook:`, окно **до конца + деплоя**. +- **D2:** коммит делает агент; гейты КАЧЕСТВА (criterion/verify) остаются, гейт ПРИСУТСТВИЯ (router-gate + git-approval) заменяется одним согласием `commit:`. Docs/ops-коммит — без criterion/verify. + Согласия деплоя и коммита — **раздельные** кнопки. + +## Как делать B+C ч.2 (план следующего захода) + +Цель: новый тип шага `op:"session"` = `{op:'session', goal, tools:[...], produces:'<путь>'}` (≥1 produces). +Внутри сеанса (указатель на этом шаге) разрешены `tools` сеанса + query-only, **сколько угодно по живым +ref**, указатель НЕ двигается; запись `produces`-файла = обычный матч-шаг, двигает указатель (закрывает +сеанс). Запретить `op:"Skill"` как шаг (явное сообщение «объяви в skills-json»). + +Точки (TDD, мелкими циклами, после КАЖДОГО — полный свод через PowerShell): +1. `tools/plan-lock.mjs`: распознать `op:'session'` (goal/tools/produces); `validatePlanTree` — session-узел + валиден; `treeLeafAt`/`actionMatchesStep` — сеанс не матчится как обычный шаг, матч-якорь = `produces`. + Хеш плана уже = `canonicalJson(steps)` → `tools`/`produces` автоматически в хеше. +2. Предохранитель: при разборе `tools` отбросить запрещённый набор (Write/Edit/MultiEdit/мут-Bash/floor) с + видимым warn. Вынести список запрещённого в одно место. +3. `tools/enforce-supreme-gate.mjs` `decide`: ветка «указатель на session-шаге» — вызов из `frozenPlan` + сеанса `tools` (или query-only) → allow без advance; запись `produces` → обычный матч-шаг с advance. +4. Запрет `op:"Skill"` как шага (в `plan-lock`/`decide`) с явным сообщением. +5. Показать `goal`/`tools`/`produces` сеанса наставнику/судье (`mentor-verdict.mjs`/`judge-*`) — иначе + завернут «непонятный шаг». Это же закрывает хвост «наставник не видит доп.поля шага». + +Риск: `plan-lock` — сердце стены, блblast-radius = весь свод. Идти по одному тесту, гонять весь свод часто. + +## Хвосты (мелкие, не потерять) + +- **Спек-подчистка:** занести ответы Q-A/Q-B (B+C), Q-D (D1), Q-E (D2) как «РЕШЕНО» в их спеки; пометить + `docs/superpowers/specs/2026-06-18-wall-impl-tool-allowlist-design.md` как ОТМЕНЁННУЮ (её поглотила + interactive-session спека) — файл сейчас untracked. Удобно сделать пачкой в штатном (правки свободны). +- **Round-counter reset** (из `2026-06-16-ownerseal-wiring-bug.md`): `planId=sha256(steps)` зависит только + от шагов → смена имени файла не сбрасывает счётчик кругов owner-seal. Отдельный мелкий фикс. +- **Норматив-заметки:** A («читать→перепланировать, не гадать»), D1 («читать вывод деплоя→стоп на + аномалии»), D2 («коммит под `commit:`») — внести в Pravila/GUIDE, когда стена обратно (через claude-md-management по правилам). +- **§3.3 docs/ops без criterion/verify — ЗАКРЫТО (владелец 2026-06-18):** оставляем строго `.md` (планы/ + заметки/спеки уже идут без проверки). Расширение на не-`.md` «ops-артефакты» НЕ делаем — конфликтует с + CLAUDE.md §13 v2.40 (конфиги ДОЛЖНЫ включать verify) и не определено, что считать ops-артефактом. Код не меняем. + +## Дисциплина (обязательно) + +- **TDD** (superpowers:test-driven-development): RED → видеть падение → GREEN → весь свод. Машинерия — + только в ШТАТНОМ (иначе F-K блок). +- **Тесты гонять ТОЛЬКО через PowerShell-инструмент**, НЕ Bash: vitest коллапсит под Git-Bash. + `npx vitest run [файл] --config vitest.config.tools.mjs --no-file-parallelism`. +- **Коммит** (в штатном; пол остаётся): + 1. `git add <явные пути>` (общая папка — НИКОГДА голый commit; чужие незакоммиченные `M tools/enforce-*` + НЕ трогать). + 2. `node tools/produce-verify-receipt.mjs` **через PowerShell** → `signed GREEN` (расписка под staged-diff). + 3. сообщение в файл `.git/CB_MSG.txt` (Write-инструментом), коммит `git commit -F .git/CB_MSG.txt`. + ПРИЧИНА: пол режет `&&`-цепочки, heredoc и `` (символы `<`/`>`) — поэтому single-команда + файл. + 4. трейлер `Co-Authored-By: Claude Opus 4.8 `. +- **Push** (если попросят): останется verify-before-push; gitea-бэкап `git push gitea main` (github мёртв). +- Коммит/память — по клику владельца.