Files
portal/docs/superpowers/2026-06-17-wall-interactive-walk-blockers-bug.md
T

158 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Баг-репорт стены «роутер-наставник»: невозможно провести интерактивный браузерный осмотр под стеной
**Дата:** 17.06.2026
**Кому:** проект claude-brain (управляющий слой, ADR-020)
**Где наблюдалось:** замороженная рабочая копия рантайм-хуков в репо «Документация»
(`tools/enforce-supreme-gate.mjs` + оркестратор наставник→судья).
**Задача, на которой всплыло:** Фаза 1 имитации — ручной осмотр запущенного
портала 127.0.0.1:8000 глазами клиента через Playwright (MCP). Подготовка
(seed/build/serve) прошла штатно; сам **интерактивный проход по экранам** уперся в
стену.
---
## Краткая суть (TL;DR)
Стена спроектирована под **детерминированные код-церемонии** (шаги Write/Edit/Bash
с заранее известными op+object). **Интерактивный браузерный осмотр в неё не
ложится** по трём независимым причинам:
1. **Шаг `op:"Skill"` запечатывается, но на исполнении НЕ двигает указатель**
план намертво виснет на этом шаге.
2. **Блок `tools-json` (запрос набора инструментов) игнорируется** — стена чисто
пошаговая, разрешает только текущий шаг.
3. **Живой проход нельзя выразить шагами** — клики/ввод идут по `ref` элементов из
снимка страницы, которых на момент написания плана не существует.
Дополнительно: **наставник (этап печати) требует «шаг verify»**, который по
причине №1 неисполним — печать и исполнение противоречат друг другу.
---
## Баг 1 — `op:"Skill"` не двигает указатель (deadlock)
**Что ожидалось:** объявить шаг `{op:"Skill", object:"verify"}`; при вызове навыка
`verify` указатель сдвигается на следующий шаг.
**Что произошло:** навык `verify` вызывается и загружается (PreToolUse пускает —
скил объявлен в `skills-json`), но **указатель остаётся на шаге `Skill verify`**.
Любое следующее действие (ToolSearch, browser-вызов, даже `Read`) режется:
```
[supreme-gate] действие не в плане (ожидался шаг undefined: Skill verify)
```
и затем:
```
[supreme-gate] авторское сырьё-чтение вне шага плана — гейт ДР-1 (impl-режим) [тип: code]
```
**Вероятная причина:** указатель сдвигается на **PostToolUse** инструмента (для
Write/Edit/Bash это работает — подготовительный план из Edit+Bash прошёл все 7
шагов подряд). Но вызов навыка возвращается в среде Claude Code **как инъекция
user-сообщения** (текст скила приходит новым ходом), а не как обычный tool-result —
поэтому PostToolUse для шага `Skill` **не срабатывает**, и шаг никогда не
«закрывается». Подтверждено на запечатанном плане v5: после `verify` указатель
застрял на шаге 1, план заперт целиком (impl-режим блокирует всё).
**Рекомендация brain:**
- либо сдвигать указатель для `Skill`-шага по факту загрузки скила (отдельный
механизм, не PostToolUse-tool-result);
- либо **запретить `op:"Skill"` на этапе печати** с явным сообщением «Skill не
может быть шагом» — чтобы наставник не требовал заведомо неисполнимый шаг.
---
## Баг 2 — `tools-json` игнорируется, стена строго пошаговая
**Что пробовали:** объявить нужные инструменты в блоке `tools-json` рядом со
`skills-json` (по аналогии «запросить инструменты в плане»):
```
tools-json: [ ToolSearch, mcp__playwright__browser_navigate, browser_snapshot,
browser_type, browser_click, browser_select_option,
browser_fill_form, browser_wait_for, browser_take_screenshot ]
```
**Что произошло:** на запечатанном плане v6 (шаги — две записи) `ToolSearch`
отбит:
```
[supreme-gate] действие не в плане (ожидался шаг: Write ...observations.md)
```
То есть `tools-json` **не дал никакого доступа** — стена пускает строго текущий
шаг и ничего кроме него.
**Рекомендация brain:** ввести реальный механизм авторизации инструментов на план:
- либо `tools-json` как allowlist, который PreToolUse чтит на протяжении всего
плана (разрешает перечисленные инструменты независимо от позиции указателя);
- либо специальный тип шага «сессия инструмента» / «исследовательский шаг»,
внутри которого разрешён заявленный набор MCP-инструментов до явного перехода
к следующему шагу.
---
## Баг 3 (корневой архитектурный) — интерактивный проход не выразить шагами
Браузерный осмотр исследовательский: чтобы кликнуть/ввести, нужен `ref` элемента
из **снимка живой страницы** (`browser_snapshot` возвращает динамические `e1,
e2…`). На момент написания плана этих `ref` не существует, поэтому конкретные
шаги `browser_click {ref: …}` **нельзя задать заранее**. Логин (ввод email/пароля
+ submit) тем более требует ввода в поля с динамическими ref.
Стена матчит шаги по op+object (для Bash — точная команда; проверено). Для
интерактивного UI это означает, что **ни фиксированной цепочкой шагов, ни
allowlist'ом текущая стена проход не покрывает**.
**Рекомендация brain:** для классов задач «интерактивный осмотр/драйв UI»
предусмотреть режим, где после печати плана разрешён заявленный MCP-инструментарий
свободно (owner-gated), а результат фиксируется обычными шагами записи
(наблюдения → отчёт). По сути — это Баг 2 в более сильной форме.
---
## Противоречие печать ↔ исполнение (наставник)
Наставник на этапе печати **требовал явный «шаг verify»** (круги 911):
- v1 (один Write-отчёт) → NO-GO: «нет шага, выполняющего верификацию»;
- v2 (Write наблюдений + Write отчёта) → NO-GO: «нет шага, инициирующего верификацию»;
- v3 (`Skill verify` ref D1) → NO-GO: «ref должен покрывать D1–D5»;
- v4 (`Skill verify` ref D1-D5) → **GO, опечатано**; на исполнении — deadlock (Баг 1);
- v5 (`tools-json` + `Skill verify`) → GO; deadlock на шаге Skill;
- v6 (`tools-json` + 2 Write, `verify` в `skills-json`) → GO; `tools-json` проигнорирован (Баг 2).
**Суть противоречия:** наставник настаивает на шаге-операции `verify`, но такой шаг
**неисполним** (Баг 1). Печать (наставник) и исполнение (supreme-gate) расходятся:
печать принимает `op:"Skill"`, исполнение на нём виснет.
**Рекомендация brain:** согласовать две стороны — если `Skill`-шаг неисполним,
наставник не должен его требовать; «использование навыка» должно засчитываться
через дисциплину навыков (`skills-json` + реальный вызов до первого мутирующего
шага, что проверяет `enforce-domain-skill-discipline`), без шага-операции.
---
## Сопутствующие наблюдения (для полноты)
- **Видимость вердикта с задержкой на ход.** Исход наставника/судьи приходит
контроллеру строкой только в начале **следующего** хода (`enforce-verdict-surface`).
В тот же ход после записи плана проверить печать делом можно (если GO — шаг
проходит сразу), но **текст** замечаний виден лишь следующим ходом. Несколько
раз строка «✅ GO — опечатано ×N» показывалась как **прошлые** записи, не
относящиеся к текущему плану, — это путало (казалось «GO», а печати уже/ещё нет).
- **Финансовый детектор / эскалация.** Спека и план, содержащие денежные термины
(баланс, списания, тарифы), должны были **эскалироваться владельцу**, но
эскалация не сработала; помогла money-free переформулировка. Владелец отметил,
что это **известный баг, починенный в новом релизе мозга**. Зафиксировано здесь
для сверки.
- **Эфемерность печати — опровергнута.** Ранее казалось, что печать «на один ход»;
на деле запечатанный план **сохраняется между ходами**, пока не завершён или не
снят escape'ом (v5/v6 держались impl-режим через ход). Прошлые «GO без печати»
объясняются Багом 1/2 и задержкой видимости вердикта, а не эфемерностью.
---
## Что работает штатно (контроль)
Подготовительный план (Edit команды seed → Bash `db:show``migrate``seed`
`npm ls vite``npm run build``php artisan serve`) **запечатался и прошёл все
7 шагов подряд в одном ходу** без проблем. То есть для детерминированных
Write/Edit/Bash-церемоний стена работает как задумано. Проблема строго в
интерактивном MCP-проходе.