3bf5eaed81
Прогон всех 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>
96 lines
9.1 KiB
Markdown
96 lines
9.1 KiB
Markdown
# БАГ — чтение под стеной «роутер-наставник» (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 — нужен предохранитель (эскалация к владельцу).
|