Files
portal/docs/superpowers/2026-06-17-wall-read-block-bug.md
T
Дмитрий e13b9e7bea docs(security): аудит доведён до конца + поправка по верификации кода + баги стены
Прогон всех 5 сканеров: gitleaks 0 / Semgrep 0 / Ward 2(dev) / Nuclei 0(medium+) / ZAP 0(high). pg_anonymizer не установлен (факт). Три ложных P0 сняты проверкой кода (E9/E18/admin/SSRF закрыты). Вердикт NO-GO держат F-P1, pg_anonymizer, прод-.env. Трекер открытых вопросов + файл-баг (чтение под стеной, десинк F-J, зацикл наставника) для claude-brain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 16:25:23 +03:00

9.1 KiB

БАГ — чтение под стеной «роутер-наставник» (impl-режим) + связанный десинк указателя

Дата: 17.06.2026 Откуда: живой прогон go-live security gate (отчёт docs/security/2026-06-17-go-live-security-report.md). Куда: claude-brain (управляющий слой стены — enforce-supreme-gate и оркестрация). Связано: docs/superpowers/router-mentor-wall-GUIDE.md (раздел «Уроки живого прогона»).


Суть бага (одной фразой)

В режиме реализации (под опечатанным планом) чтение разрешено только по пути текущего шага. Всё остальное читать нельзя — включая файлы, появившиеся во время прогона, и собственный вывод запущенных инструментов (гейт ДР-1 в enforce-supreme-gate).

Почему это серьёзно

Многошаговая работа, где следующее действие зависит от прочитанного (аудит, отладка, цепочки инструментов, проверка результата), под стеной фактически слепнет. Обойти удалось только тем, что владелец вставлял файлы в чат вручную (контекст разговора ≠ вызов Read-инструмента → стена его не трогает). Это костыль, а не решение.

Случаи, где дефект бьёт

  1. Свой же вывод не прочитать. Длинная команда (сканер/сборка/тесты) уезжает в фоновый запуск, результат пишется в temp-файл — открыть нельзя. Живой пример прогона: не прочитался вывод Nuclei.
  2. Забыл прочитать до печати плана — всё. Понадобился файл по ходу — под планом не открыть; только переделывать план или просить владельца вставить.
  3. Сторонний сервис/процесс создал файл во время прогона. Генератор, выгрузка, отчёт другой задачи, артефакт CI — недоступны.
  4. Нечем проверить результат шага. Сделал шаг, для проверки нужен другой файл/лог — нельзя. Получается «сделал вслепую».
  5. Ветвление по содержимому невозможно. «Если в конфиге X — делаем Y» не работает: чтобы выбрать, надо прочитать.
  6. Диагностика ошибки по внешнему логу. Шаг упал, ошибка «смотри лог тут» — тот лог открыть нельзя.
  7. Промежуточный артефакт в цепочке инструментов. Шаг N сделал файл, шаг N+1 должен на него посмотреть — нельзя, только передать вслепую.
  8. Перечитать только что записанное. Записал файл на шаге 2, на шаге 4 надо свериться — закрыто.
  9. Неожиданная находка. Поиск дал совпадение в файле, о котором при планировании не знал — открыть его уже нельзя.
  10. Файлы от параллельной сессии. Соседняя сессия добавила/закоммитила файлы — мне их не глянуть.

Связь с рассинхроном указателя (важно для починки)

Наивная мысль «добавить escape-метку read:» опасна: стена сейчас двигает счётчик шагов вперёд даже когда действие не прошло (это и есть десинк F-J — на прогоне так был пропущен шаг gitleaks: supreme-gate сдвинул указатель, а enforce-domain-skill-discipline дальше в цепочке уронил действие). Если пустить чтение через ту же машинерию шагов — очередь сдвинется, план поедет.

Ключ: чтение не является шагом. Шаги плана — только Write/Edit/Bash/MultiEdit. Значит разрешение на чтение должно работать «сбоку от очереди», не касаясь счётчика шагов.

Приоритет починки (для claude-brain)

  1. ГЛАВНОЕ — счётчик шагов += 1 только при успешно завершённом настоящем шаге. Не на заблокированном действии, не на чтении, не на постороннем. Это чинит десинк F-J И автоматически делает чтение безопасным (раз чтение не шаг — оно не может сдвинуть очередь).
  2. Пассивно разрешить чтение без escape и без касания очереди: (а) собственный вывод инструментов, запущенных в этом плане (temp-файлы); (б) файлы, появившиеся ПОСЛЕ опечатывания плана (их при планировании не было — запрет «лишнего чтения» здесь нелогичен).
  3. Escape-метка read:<путь> — только крайний резерв, и строго мимо счётчика шагов (out-of-band), чтобы не повторить десинк. После п.1+п.2 почти не нужна.

Критерий «починено»

  • Под опечатанным планом можно прочитать свой вывод и файлы, созданные после печати, без сдвига очереди шагов.
  • Падение/блокировка шага НЕ двигает указатель (десинк F-J не воспроизводится).
  • При необходимости разовое read:<путь> через escape не ломает очередность.

БАГ-2 — наставник не видит часть плана + нет owner-seal при зацикле (17.06.2026)

Случай: правка-поправка аудита (2 аддитивных Edit в docs/). Наставник 3 круга подряд (17, 18, 19) давал NO-GO с одним требованием: «добавь к каждому шагу явную пометку, что вердикт остаётся NO-GO».

Дефект 1 — наставник не видит доп.поля steps-json. Контроллер добавил поле note к каждому шагу с требуемым текстом. Но наставник в своём представлении плана видит только op/object/ref — поле note (и любые доп.поля) срезаются до того, как план попадает к наставнику. Поэтому он снова и снова требует то, что уже добавлено → дедлок, план не пройти, сколько ни переписывай.

Дефект 2 — нет owner-seal при зацикле. По дизайну после 3 NO-GO подряд должна появляться карточка арбитража owner-seal (3 кнопки: держусь контроллера / согласен / своё). На прогоне после кругов 17–19 карточка не появилась — круг не разрывался. Контроллер обошёл стену через терминал владельца.

Починка (для claude-brain):

  1. Наставник должен видеть план целиком, включая доп.поля шагов (note/description); ИЛИ задокументировать единственно поддержанный способ «пометки к шагу».
  2. Счётчик «N NO-GO подряд» обязан реально триггерить owner-seal-карточку — проверить порог и срабатывание.
  3. Требование, которое контроллер физически не может выразить в формате плана, не должно вести к бесконечному NO-GO — нужен предохранитель (эскалация к владельцу).