Files
brain/bags/2026-06-16-deploy-commit-not-executable-under-wall-bug.md
T
2026-06-17 05:43:18 +03:00

90 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Баг: прод-деплой и коммит невозможно выполнить шагами опечатанного плана под стеной — вся механика падает на хозяина-непрограммиста
> Дата: 16.06.2026. Для проекта **claude-brain**. Кодовая фраза «роутер-наставник».
> Тип: bug-report (управляющий слой стены). Выявлено на живом деплое F-1 (CVE vendor-апдейт).
## Краткая суть
Под стеной «роутер-наставник» легитимный план прод-деплоя, **прошедший наставника и судью**
(✅ GO, опечатан), всё равно **не может быть исполнен самим контроллером**. Его шаги — `ssh`,
`scp`, `composer install`, `systemctl`, `php artisan down/up` — это floor-опасные команды
(класс install / cloud-CLI / ssh / redirect). Пол (M5) рубит их безусловно, стена не двигает
указатель → опечатанный план встаёт колом. Аналогично git-коммит упирается в частокол
router-gate (git-approval) + criterion-gate + verify-gate.
В итоге **вся механика деплоя и коммита перекладывается на хозяина**: он вручную копипастит
~18 команд в свой терминал, по его собственным словам — «тупо сижу выполняю механическую работу
без осознания».
## Почему это баг, а не «так задумано»
Стена строилась, чтобы правки кода шли через осознанный sealed-plan + ревью наставника/судьи.
Но для **прод-ops** она даёт ОБРАТНЫЙ эффект по безопасности:
- осознанный агент, прошедший ревью, **отстранён** от исполнения;
- исполняет **человек-непрограммист**, который не понимает содержимого команды;
- он не может санитарно проверить команду, заметить опечатку, среагировать на нештатный вывод;
- для **НЕОБРАТИМОГО** действия на боевом сервере это **повышает** риск, а не снижает.
То есть для класса задач «прод-ops/коммит» стена работает против собственной цели.
## Доказательства из этой сессии (живой деплой F-1)
1. **Опасный инцидент в окне обслуживания.** Сайт был под `artisan down` (HTTP 503). В терминал
**случайно вставился текст из соседней сессии** (claude-brain): PowerShell ответил
`Unexpected token 'enforce-mentor-then-judge' …`, `'memory' is not recognized`. Мои
smoke-команды НЕ выполнились, сайт оставался в обслуживании дольше нужного. Будь в буфере
деструктивная команда — это ушло бы на живой прод. Корень — человек как «реле» без понимания
того, что он вставляет.
2. **Повторные сбои кавычек.** `grep -iE "a|b"` через цепочку PowerShell → ssh терял двойные
кавычки → `b: command not found` (трижды за сессию: `phone_ranges|region`,
`queue|horizon|liderra`, `Cache|Config|Route|View`). Каждый — лишний round-trip, потому что
человек не мог сам отладить квотинг.
3. **Объём ручного труда.** Pre-flight + доставка + бэкап + down + install + smoke + кэши +
коммит = ~18 копипаст-итераций туда-обратно. Всё это осознанный агент сделал бы за один
проход с само-проверкой вывода.
4. **Баг подтвердил сам себя.** Попытка контроллера записать ЭТОТ баг-файл была заблокирована
стеной: `действие не в плане (ожидался шаг … ssh liderra-prod 'df -h /')`. Опечатанный план
деплоя так и висел на шаге 1, потому что его шаги исполнял человек в терминале (вне стены), а
указатель плана у стены не двигался. Запись удалось сделать только через owner-escape
`write:<path>`. Застрявший неисполнимый план блокирует и последующую обычную работу.
## Где именно ломается (точки для brain)
- **Floor M5** (`enforce-floor-*`): классы install / cloud-CLI / ssh / redirect рубятся
безусловно. Нет понятия «благословлённый ops-шаг опечатанного плана».
- **supreme-gate**: при floor-блоке со-хука указатель плана **не откатывается** (десинк F-J) —
значит даже теоретически собранный sealed-ops-план повис бы на первом ssh-шаге. Вдобавок
план, чьи шаги физически не исполнимы под стеной, навсегда застревает на шаге 1 и блокирует
дальнейшую работу (см. доказательство №4).
- **Коммит**: router-gate + criterion-gate + verify-gate рассчитаны на **код-PR**, не на
docs/ops-коммит. Чистый путь — терминал хозяина `LEFTHOOK=0`, т.е. снова руками.
## Чего хотелось бы (направления; решает brain, это не предписание)
1. **Канал «опечатанный ops-runbook».** Если план прошёл наставника+судью И помечен как
ops/deploy — пол должен **пускать его `ssh`/`scp`/`systemctl`/`composer`-шаги к исполнению
контроллером** строго по белому списку из самого плана, с полным журналом. Тогда необратимое
делает осознанный агент, а человек только один раз говорит «деплоим».
2. **Либо эргономика escape под блок ops-команд:** один owner-grant на весь благословлённый
runbook (а не `FLOOR-ESCAPE` на каждую из ~15 команд), окно шире, привязка к hash плана.
3. **Минимум:** floor должен отличать «ssh-шаг благословлённого плана» от «произвольной
floor-опасной команды»; и стена не должна оставлять указатель на неисполнимом шаге —
план, шаги которого floor-блокируются, должен авто-завершаться или явно помечаться
«исполняется вне стены», а не висеть колом (фикс десинка F-J + застревания из доказательства №4).
4. **Коммит:** docs/ops-коммит из-под опечатанного плана не должен требовать criterion/verify-gate
(там нет кода и тестов) — отдельная ветка гейта по типу изменения.
## Влияние
Пока не починено: каждый прод-деплой и коммит идут через ручной копипаст хозяина-непрограммиста —
**медленно** (раздутый round-trip) и **рискованно** (инцидент №1 в окне обслуживания живого
прода). Это прямо противоречит цели стены: для прод-ops она безопасность снижает.
## Связанное
- Деплой, на котором выявлено: `docs/superpowers/plans/2026-06-16-f1-cve-deploy-plan.md` +
`docs/superpowers/specs/2026-06-16-f1-cve-deploy-spec-v3.md` (опечатаны, GO).
- Соседний баг машинерии: `docs/superpowers/2026-06-16-mentor-empty-recommendation-bug.md`.
- Десинк указателя F-J — описан в `docs/superpowers/router-mentor-wall-GUIDE.md`.