Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
12 KiB
Баг-репорт стены «роутер-наставник»: невозможно провести интерактивный браузерный осмотр под стеной
Дата: 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). Интерактивный браузерный осмотр в неё не ложится по трём независимым причинам:
- Шаг
op:"Skill"запечатывается, но на исполнении НЕ двигает указатель → план намертво виснет на этом шаге. - Блок
tools-json(запрос набора инструментов) игнорируется — стена чисто пошаговая, разрешает только текущий шаг. - Живой проход нельзя выразить шагами — клики/ввод идут по
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» (круги 9–11):
- v1 (один Write-отчёт) → NO-GO: «нет шага, выполняющего верификацию»;
- v2 (Write наблюдений + Write отчёта) → NO-GO: «нет шага, инициирующего верификацию»;
- v3 (
Skill verifyref D1) → NO-GO: «ref должен покрывать D1–D5»; - v4 (
Skill verifyref 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-проходе.