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

12 KiB
Raw Blame History

Баг-репорт стены «роутер-наставник»: невозможно провести интерактивный браузерный осмотр под стеной

Дата: 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:showmigrateseednpm ls vitenpm run buildphp artisan serve) запечатался и прошёл все 7 шагов подряд в одном ходу без проблем. То есть для детерминированных Write/Edit/Bash-церемоний стена работает как задумано. Проблема строго в интерактивном MCP-проходе.