# Proposal: enforce-upstream-loop — технические гейты цикла Issue: #59. Источники: сессия ce9187ca 24.10.2026 (модель пропустила builder-check и рационализировала пропуск; спека и план ушли владельцу одним пакетом), решение владельца 25.10.2026 «оба гейта сразу», согласования по этой фиче владельцем отменены (решения — в design.md). ## Why Луп brainstorm→design→builder-check→approve→plan→approve→sdd существует в superpowers 7.0.0 как инструкции. В DSH-сессии 24.10.2026 модель пропустила builder-check, предложила его «вхолостую» и сняла предложение; план был написан до того, как владелец утвердил дизайн. Инструкции не являются механизмом: нужен технический гейт, который нельзя рационализировать. ## What Changes 1. **Артефакты**: `openspec/changes//builder-check.md` (отчёт свежего builder-check субагента) и `openspec/changes//approval.md` (маркер утверждения, yaml-секции `design:` и `plan:` с `by`/`at`). 2. **Команда `/approve design|plan`** в бандле — единственный писатель `approval.md`: - `design` — отказ, пока нет `proposal.md`+`design.md`+`builder-check.md`; - `plan` — отказ, пока нет design-утверждения и файла плана в `docs/superpowers/plans/`, чей `**Spec:**` указывает на этот change. 3. **Гейт A (вход)**: bundle-guard отклоняет Edit/Write/MultiEdit в `docs/superpowers/plans/**`, если в содержимом есть строка `**Spec:**` со ссылкой на change без design-утверждения — план физически не создаётся до утверждения дизайна. «Уход к владельцу» закрывается цепочкой: approve дизайна требует builder-check; план требует approve дизайна; исполнение требует approve плана. 4. **Гейт B (исполнение)**: bundle-guard отклоняет диспатчи `subagent`/ `subagent_fork`, чей промпт ссылается на план в `docs/superpowers/plans/` или на `.superpowers/sdd//`, если `approval.md` change'а не содержит `plan:` — sdd не стартует без утверждённого плана. Причина отказа: «plan not approved; run `/approve plan`». 5. **Тексты**: `dsh/skills/sdd/SKILL.md` — шаг «проверь approval-маркер до первого диспатча, при BLOCKED не обходи»; `roles/dev.md` (DSH-заметка `--roles`) — builder-check обязателен, пропуск — только явное решение владельца. ## Impact - Affected: `dsh/bundle/` (новая `lib/gates.js`, `command-approve.js`, wiring в `index.js`), `dsh/skills/sdd/SKILL.md`, `dsh/tests/`, `dsh/install.sh` (`--roles`-заметка), спека-дельта (новая capability `approval-gates`), `dsh/README.md`/`dsh/PORT.md`. - Не трогаем: CC-сторону (хуки, роли, скрипты) — гейты живут только в DSH-бандле; bounded-задачи без change/плана не задеваются. - Breaking: нет для существующих потоков с утверждёнными change/планами; для неутверждённых — ожидаемый BLOCKED с подсказкой `/approve`. ## Non-goals Свой UI апрува; переписывание sdd-протокола; гейт на сообщения модели (презентация дизайна владельцу не перехватывается — закрыта цепочкой артефактов); CC-сторона. ## Открытые вопросы Нет: решения по enforcement-точкам приняты (design.md, «Decisions made without discussion»), владелец согласования отменил до пробуждения.