docs: handoff допила эталона — B+C ч.2/D1/D2 DONE + решения по хвостам
Обновлён 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 <noreply@anthropic.com>
This commit is contained in:
@@ -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:<hash>` агент гонит по белому списку 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:<hash>` снимает гейт ПРИСУТСТВИЯ (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:<hash>`») — через 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:<plan-hash>`, окно **до конца
|
||||
деплоя**.
|
||||
- **D2:** коммит делает агент; гейты КАЧЕСТВА (criterion/verify) остаются, гейт ПРИСУТСТВИЯ (router-gate
|
||||
git-approval) заменяется одним согласием `commit:<plan-hash>`. 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:<hash>`») — внести в 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 и `<email>` (символы `<`/`>`) — поэтому single-команда + файл.
|
||||
4. трейлер `Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>`.
|
||||
- **Push** (если попросят): останется verify-before-push; gitea-бэкап `git push gitea main` (github мёртв).
|
||||
- Коммит/память — по клику владельца.
|
||||
Reference in New Issue
Block a user