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

**Дата:** 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»** (круги 9–11):
- 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-проходе.
