# Design: dsh-prestep — harness-check и role-hint через agent/pre-step Issue: #43 (+#62). Статус: черновик до builder-check; утверждение — `/approve dsh-prestep design`. ## Контекст CC-хуки harness-check/role-hint — SessionStart; в DSH аналог — инъекции `agent/pre-step` (уже используем для superpowers-bootstrap). Гейты #59 живые: этот change идёт первым по гейтованному циклу (acceptance #59). ## Механика Обе инъекции — раз за сессию, с маркером `<-- DSH-HARNESS-PRESTEP:...>` и тем же механизмом видимости, что у bootstrap (`isBootstrapVisible` переименован в общий `isInjectionVisible(agent, messages, marker)`). Порядок в pre-step: другие инъекции → harness-check → role-hint (обе неблокирующие; reject/abort — пропуск; сабагенты — пропуск, как bootstrap). ### harness-check - Сигнал подключения (как у CC-хука + DSH-специфичный): upward-walk от sessionCwd до корня ФС: ближайший каталог с `.git` (или без него до упора) — «корень проекта»; сигналы: `openspec/`, `.codegraph/`, секция `## OpenSpec и superpowers` в `CLAUDE.md`, DSH-бонус — `.claude/code-paths`. Всё на месте — молчим. Вне git-репозитория (`.git` не найден до корня) — пропуск, как у CC-хука. Чего-то нет — инъекция с перечнем отсутствующего и командой `bash /adopt-project.sh ` (неблокирующая, в формате сообщения CC-хука). 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 | Нет | ## Тесты (идеи для плана) - pure: detectAdoption(files), detectRole(firstUserText) → role|null, buildRoleHintText(role), buildHarnessCheckText(), маркер-дедуп; - wiring: apply с fake ctx — инъекции появляются при наличии пользовательского сообщения, один раз, пропускаются для сабагентов; - T2.1: негативный тест openspec — PATH-изоляция (временный каталог без openspec-бинарника); - O-2: install.sh WARN при DSH_HOME→существующий каталог + нестандартный HOME (тест в install.test.mjs); - T3.4: пин текста в sdd-скилле («шаг „тест падает“ обязателен»). ## На потом (в план) - Разбивка: Task 1 prestep.js (harness-check+role-hint pure) → Task 2 wiring+bootstrap-рефакторинг → Task 3 #62 (T2.1/O-2/T3.4) → Task 4 спека-дельта `session-prestep` + доки.