Andrey Epifancev 3ad378c1dc chore(openspec): archive dsh-sdd (#41)
Change dsh-sdd перенесён в openspec/changes/archive/2026-10-24-dsh-sdd,
дельта dsh-sdd добавлена в openspec/specs/dsh-sdd/spec.md (7 требований).

Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
2026-10-24 17:57:35 +04:00

72 lines
5.2 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: DSH-native SDD
Issue: #41 (роадмап порта — #48). Источники:
- `dsh/PORT.md`, разделы 3 (deferred: SDD), 7 (риски), 8 (next phases, п. 4);
- brainstorming 24.10.2026 (ответы владельца о режимах контроллера);
- разбор исходников DSH 0.2.1-rc.3: `dsh-tool-subagent`, `dsh-tool-workflow`,
`dsh-subagent`, `dsh-workflow-ptc`.
## Why
SDD — единственное место, где DSH расходится с Claude Code не текстом, а
семантикой. В Claude Code контроллер исполняет план, вызывая `Task` и получая
результат в том же ходе; в DSH `subagent` возвращает id и завершается
уведомлением позже, а `workflow` исполняет детерминированный скрипт и ждёт
всех детей. Пока эта разница не переписана, `subagent-driven-development`
в DSH-сессии либо врёт о возможностях платформы, либо ломается на первом
ожидании.
Дополнительно разбор исходников показал две вещи, которые меняют план:
1. Глубина делегирования по умолчанию — 1. Фоновый контроллер-сабагент не
может позвать implementer'а, пока `subagent.maxDepth` не поднят до 2.
2. У инструмента `subagent` нет `provider`/`model` в схеме, пока строке
`tool-subagent` не поставлен `modelSelectionSettings: true`; ребёнок
наследует модель сессии. Выбор модели работает сразу только внутри
`workflow.agent()`. Маршрутов в этом окружении два:
`deepseek-official/deepseek-flash` и `deepseek-official/deepseek-v4-pro`.
Без этих двух фактов любая инструкция SDD «укажи модель в dispatch» невыполнима
и превращается в фикцию.
## What Changes
- **Новый DSH-skill `dsh/skills/sdd/SKILL.md`** — инструкция исполнения плана
в DSH: два режима контроллера (главная сессия и фоновый сабагент), протокол
dispatch/wait/report, ревью задачи, fix-loop, ledger `## Findings`, рулинги,
финальное ревью ветки, отличие от Claude-SDD одной таблицей.
Ставится `dsh/install.sh --skills` в `~/.dsh/skills`; Claude Code его не
получает — харнес Claude не меняется.
- **`dsh/subagent-models.yml`** — opt-in overlay профиля: `modelSelectionSettings`
для `tool-subagent` и `tool-subagent-fork` плюс `subagent.maxDepth: 2`.
В бандл не входит: строка `subagent-model-selection-settings` есть в
web/desktop-профиле и отсутствует в headless, и включённый флаг уронил бы
headless на загрузке.
- **`dsh/PORT.md`** — раздел о включении выбора модели и глубины, ссылка на
overlay, снятие пункта 4 из «Next phases» после приёмки.
- **`dsh/tests/sdd-skill.test.mjs`** — проверки, которые идут без DSH runtime:
frontmatter skill, оба режима, имена инструментов, требование маршрута
модели, отсутствие ссылок на несуществующие средства (`job_output` как
ожидание сабагента, `maxDepth` без оговорки).
- **Пробный прогон** в temp-репозитории: план из 3 задач, implementer →
reviewer → fix → финальное ревью; транскрипт и ledger — в отчёте issue.
Прогон доказывает семантику, а не заменяет тесты: без DSH runtime его не
повторить, поэтому он делается один раз и результаты фиксируются в
`design.md` и в комментарии к #41.
## Impact
- Claude-harness не меняется: `roles/`, `hooks/`, `global/`, `install.sh`,
`agents/` остаются как есть.
- Бандл не меняет состав строк профиля; новое поведение — только по явному
решению владельца через overlay.
- Роль dev после приёмки должна ссылаться на новый skill для DSH-сессий
(одна строка; правится в `~/.dsh/roles`, не в общем `roles/dev.md`).
## Acceptance
Из #41, без изменений: три задачи не теряются, отчёты собираются, ревьюер
находит и проверяет хотя бы один дефект, fix-loop завершается, ledger содержит
`## Findings` со статусами, прогон тестов зелёный, отличие от Claude-SDD
указано явно.