# dsh-prestep Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use the `sdd` skill (DSH). Steps use checkbox syntax. **Goal:** Портировать SessionStart-хуки harness-check и role-hint в DSH как неблокирующие agent/pre-step инъекции + закрыть follow-ups #62 (T2.1, T3.4, O-2). **Architecture:** `dsh/bundle/lib/prestep.js` — чистые функции (detectAdoption с upward-walk, detectRole по ключевым словам первого пользовательского сообщения, тексты инъекций); общий хелпер видимости `isInjectionVisible` (рефакторинг из isBootstrapVisible); wiring в index.js (конфиг harnessCheck/roleHint, гейт — `typeof ctx.on === 'function'`). **Tech Stack:** Node builtins; тесты node:test; bash для install.sh-правки. **Spec:** `openspec/changes/dsh-prestep/` (proposal.md + design.md, D-1…D-10). **Models:** Task 1, 3, 4 — deepseek-flash; Task 2 — deepseek-v4-pro; ревью — v4-pro. ## Global Constraints - Node builtins only; package.test.mjs enforcement обновляется для новых файлов. - Инъекции неблокирующие; reject/abort — пропуск; сабагенты — пропуск (как bootstrap). - Маркер ``; общая видимость через isInjectionVisible. - Роль-ключевики ровно из AGENTS.md (admin: jira, гант, спринт; qa: стенд, прогон, скриншот, макет; analyst: тз, oq, спека, методика; dev: срез, issue, pr, тест, миграция); `pr` — отдельным словом. - Вопрос с четырьмя вариантами — текст из design.md D-7. - Префикс инъекций `[dsh-harness]` (D-10; фильтр знает и `[claude-harness]`). - CC-сторона (hooks/) не трогается. ## Review Focus 1. Инъекции бандла не принимаются за первое пользовательское сообщение (фильтр маркеров). 2. Автономный раунд без нового сообщения — role-hint не стреляет. 3. cwd вне git-репозитория — harness-check молчит. 4. Подкаталог репозитория (cwd = /dsh) — upward-walk находит корень, ложной подсказки нет. 5. bootstrap:false — инъекции живут (гейт на ctx.on, не на bootstrapOk). --- ### Task 1: prestep.js — чистые функции **Files:** Create `dsh/bundle/lib/prestep.js`, `dsh/tests/prestep.test.mjs`. **Interfaces:** - `detectAdoption(cwd) -> {adopted:boolean, root:string|null, missing:string[]}` — upward-walk: ближайший каталог с `.git` (или root ФС); сигналы: `openspec/`, `.codegraph/`, `## OpenSpec и superpowers` в `CLAUDE.md` (без `.claude/code-paths`, D-9); вне git → `{adopted:true, missing:[]}` (молчим). - `buildHarnessCheckText(root, missing) -> string` — DSH-нативный текст (D-9): `[dsh-harness] Проект не подключён к обвязке: нет: … . Предложи владельцу настройку: openspec init --tools agents, codegraph init и секцию «OpenSpec и superpowers» в CLAUDE.md.`. - `detectRole(firstUserText) -> 'dev'|'admin'|'analyst'|'qa'|null`. - `buildRoleHintText(role|null) -> string` — `[dsh-harness] Роль сессии: . Вызови skill role. Если не так — скажи.` или вопрос с четырьмя вариантами (D-7). - `isHarnessMessage(text) -> boolean` — текст начинается с `