64 lines
4.4 KiB
Markdown
64 lines
4.4 KiB
Markdown
# 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»), владелец согласования отменил до пробуждения.
|