4f5c928796
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
90 lines
8.9 KiB
Markdown
90 lines
8.9 KiB
Markdown
# Баг: прод-деплой и коммит невозможно выполнить шагами опечатанного плана под стеной — вся механика падает на хозяина-непрограммиста
|
||
|
||
> Дата: 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`.
|