# Design: dsh-prestep — harness-check и role-hint через agent/pre-step Issue: #43 (+#62). Статус: утверждён владельцем 25.10.2026 (`/approve dsh-prestep design`); реализация — ветка `feat/43-dsh-prestep`, статусы решений — в конце файла. Спека-дельта — `openspec/changes/dsh-prestep/specs/session-prestep/spec.md`. ## Контекст CC-хуки harness-check/role-hint — SessionStart; в DSH аналог — инъекции `agent/pre-step` (уже используем для superpowers-bootstrap). Гейты #59 живые: этот change идёт первым по гейтованному циклу (acceptance #59). ## Механика Каждая инъекция — по содержимому и маркеру (per-text dedupe); повторная инъекция с другим текстом возможна — см. D-11. Маркер `` и тот же механизм видимости, что у bootstrap (`isBootstrapVisible` переименован в общий `isInjectionVisible(agent, messages, marker)`). Порядок в pre-step: другие инъекции → harness-check → role-hint (обе неблокирующие; reject/abort — пропуск; сабагенты — пропуск, как bootstrap). ### harness-check - Сигнал подключения (проектные, без CC-артефактов): upward-walk от sessionCwd до корня ФС: ближайший каталог с `.git` (или без него до упора) — «корень проекта»; сигналы: `openspec/`, `.codegraph/`, секция `## OpenSpec и superpowers` в `CLAUDE.md`. Всё на месте — молчим. Вне git-репозитория (`.git` не найден до корня) — пропуск. Чего-то нет — неблокирующая инъекция: «[dsh-harness] Проект не подключён к обвязке: нет: … . Предложи владельцу настройку: `openspec init --tools agents`, `codegraph init` и секцию «OpenSpec и superpowers» в CLAUDE.md.» (DSH-нативный текст: без `~/.claude`-путей и adopt-скрипта CC — их порт под DSH — отдельная фича, D-9). HARNESS_AUTO_ADOPT — вне скоупа (D-2). - Реализация — fs-чтения (stat/readFile) по путям, без spawn git. ### role-hint - Триггер: **новое** пользовательское сообщение текущего pre-step (`decision.messages`), source.kind === 'user', И текст не начинается с `` (формат bootstrap, не `<--`); `isBootstrapVisible` → общий `isInjectionVisible` (переименование трогает imports bootstrap.test.mjs — учтено в плане) | Одна машинерия видимости на все инъекции | Регрессия bootstrap — страхуется его тестами | | D-7 | Текст вопроса с четырьмя вариантами сочинён в этом дизайне (в репо его не было) | Builder-check подтвердил отсутствие | Нет | | D-8 | T3.4: в sdd-скилле предложения про TDD-порядок нет — текст добавляется с нуля (пин в тесте), а не «усиливается» | Факт builder-check | Нет | | D-9 | DSH-автономность (замечание владельца 25.10): в текстах и сигналах дизайна нет CC-артефактов — ни `~/.claude`-путей, ни `adopt-project.sh`, ни `.claude/code-paths`; CC-хуки harness-check.sh/role-hint.sh живут только для CC-сессий; DSH-порт adopt-скрипта — отдельная фича (non-goal этого change) | Порт должен жить самостоятельно; CC-сторона — параллельный мир | Подключение проекта в DSH остаётся ручным до порта adopt-скрипта — инъекция даёт точный список шагов | | D-10 | Префикс DSH-инъекций — `[dsh-harness]` (не `[claude-harness]`); фильтр собственных сообщений — по нему и по `` + общий `isInjectionVisible` | реализовано (a2453e3) | `lib/prestep.js` `makePrestepMarker`, `lib/bootstrap.js` | | D-7 | Текст вопроса с четырьмя вариантами | реализовано | `buildRoleHintText(null)`; пины в тестах | | D-8 | TDD-текст в `sdd`-скилле добавлен с нуля | реализовано (183f8d8) | `dsh/skills/sdd/SKILL.md`, «Порядок TDD» | | D-9 | DSH-автономность: без `~/.claude`-путей и adopt-скрипта | реализовано | тексты `lib/prestep.js` | | D-10 | Префикс `[dsh-harness]`, фильтр обоих префиксов | реализовано | `isHarnessMessage` | | D-11 | Дедуп по содержимому, не «ровно раз за сессию» | реализовано как факт (a2453e3) | заявлено в спеке `session-prestep`, требование «Повторная инъекция и видимость» | Статусы `T1.2`, `T2.2`, `T1.3` и `T1.5` (оба из #77) — в спеке-дельте `session-prestep` и `openspec/specs/approval-gates/spec.md`; ledger — `.superpowers/sdd/2026-10-25-dsh-prestep/progress.md`.