64 lines
4.4 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.

# 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/<id>/builder-check.md` (отчёт свежего
builder-check субагента) и `openspec/changes/<id>/approval.md` (маркер
утверждения, yaml-секции `design:` и `plan:` с `by`/`at`).
2. **Команда `/approve <change-id> 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/<plan>/`, если
`approval.md` change'а не содержит `plan:` — sdd не стартует без
утверждённого плана. Причина отказа: «plan not approved; run
`/approve <change-id> 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»), владелец согласования отменил до пробуждения.