4.4 KiB
Raw Blame History

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