a617de3bde
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
158 lines
12 KiB
Markdown
158 lines
12 KiB
Markdown
# Баг-репорт стены «роутер-наставник»: невозможно провести интерактивный браузерный осмотр под стеной
|
||
|
||
**Дата:** 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-проходе.
|