docs(openspec): dsh-prestep — builder-check отчёт, адьюдикации в дизайне (#43)

This commit is contained in:
Andrey Epifancev 2026-10-25 06:05:14 +04:00
parent 0d5d621fdc
commit 5f2a914de0
2 changed files with 46 additions and 15 deletions

View File

@ -0,0 +1,19 @@
# Builder-check: dsh-prestep
Дата: 25.10.2026. Свежий субагент (v4-pro). Три вопроса — все адьюдицированы
контроллером в design.md:
1. Триггер role-hint видит собственные инъекции (bootstrap/harness-check —
user-source сообщения) → добавлен фильтр: сообщение не считается первым,
если начинается с `<!-- DSH-HARNESS-` или содержит `[claude-harness]`;
скан — только новые сообщения текущего pre-step (`decision.messages`).
2. harness-check при literal-sessionCwd даёт ложную подсказку в подкаталоге
репозитория и вне git → upward-walk до ближайшего `.git`/корня ФС, вне
git-репозитория — пропуск (как CC-хук); без spawn git.
3. «грант» в admin-ключевиках — опечатка «Гант» → список приведён к
AGENTS.md точно (admin: jira, гант, спринт).
Подтверждено: текста вопроса с четырьмя вариантами в репо нет — сочинён в
дизайне (D-7); в sdd-скилле TDD-предложения нет — текст T3.4 добавляется
с нуля (D-8); гейт инъекций — прямое `typeof ctx.on` (D-5, selfcheck
пропускает bootstrap при config.bootstrap=false).

View File

@ -20,29 +20,38 @@ bootstrap).
### harness-check
- Сигнал подключения: `CLAUDE.md` или `AGENTS.md` в корне cwd содержит
`OpenSpec и superpowers` ИЛИ существует `openspec/` ИЛИ
`.claude/code-paths` ИЛИ `CLAUDE.harness-section.md`. Нет — инъекция:
- Сигнал подключения: upward-walk от sessionCwd до корня ФС: ближайший
каталог с `.git` (или без него до упора) — «корень проекта»; в нём
`CLAUDE.md`/`AGENTS.md` содержит `OpenSpec и superpowers` ИЛИ есть
`openspec/` ИЛИ `.claude/code-paths` ИЛИ `CLAUDE.harness-section.md`.
Вне git-репозитория (`.git` не найден до корня) — пропуск, как у
CC-хука (молчит). Нет сигнала — инъекция:
«[claude-harness] Проект не подключён к обвязке: предложи владельцу
`adopt-project.sh` или спроси, нужна ли обвязка». Не блокирует.
- cwd — `sessionCwd` (та же резолюция, что у гейтов: workingDirectory →
process.cwd()).
- Реализация — fs-чтения (stat/readFile) по путям, без spawn git.
### role-hint
- Триггер: первое пользовательское сообщение сессии (в `decision.messages`
ищем message с `source.kind === 'user'` и текстом; до первого такого —
инъекции нет).
- Ключевые слова (порядок приоритета, как в AGENTS.md):
- admin: `jira`, `грант`, `гант`, `спринт`;
- Триггер: **новое** пользовательское сообщение текущего pre-step
(`decision.messages`), source.kind === 'user', И текст не начинается с
`<!-- DSH-HARNESS-` и не содержит `[claude-harness]` (фильтр собственных
инъекций — bootstrap/harness-check не считаются «первым сообщением»).
Нет такого — инъекции нет (в т.ч. автономные раунды без нового
сообщения).
- Ключевые слова (точно как в AGENTS.md; builder-check нашёл опечатку —
«грант» убран):
- admin: `jira`, `гант`, `спринт`;
- qa: `стенд`, `прогон`, `скриншот`, `макет`;
- analyst: `тз`, `oq`, `спека`, `методика`;
- dev: `срез`, `issue`, `pr`, `тест`, `миграция`.
Совпадение — инъекция `[claude-harness] Роль сессии: <r>. Вызови
skill role. Если не так — скажи.` Нет — инъекция вопроса с четырьмя
вариантами (текст — как в AGENTS.md).
- Матчинг: нижний регистр, подстроки по границам слов (русские слова —
подстрока в нижнем регистре; `pr` — только как отдельное слово).
skill role. Если не так — скажи.` Нет — инъекция вопроса (текст сочинён
здесь, в репо его не было): «Роль сессии неясна. Вызови skill role:
dev — код, issue, PR, тест, миграция; admin — Jira, Гант, спринт;
analyst — ТЗ, OQ, спека, методика; qa — стенд, прогон, скриншот, макет.
Задай владельцу один вопрос с этими четырьмя вариантами.»
- Матчинг: нижний регистр; `pr` — только отдельным словом; остальные —
подстроки.
## Decisions made without discussion
@ -52,7 +61,10 @@ bootstrap).
| D-2 | harness-check — только подсказка, без HARNESS_AUTO_ADOPT | YAGNI; авто-подключение — отдельная фича при запросе | Сессия в неподключённом проекте продолжает работу — как и сейчас |
| D-3 | Общий хелпер инъекций (рефакторинг bootstrap) без изменения поведения bootstrap | Два новых pre-step не должны дублировать маркер/дедуп | Регрессия bootstrap — страхуется существующими тестами bootstrap |
| D-4 | #62-пункты едут задачами этого change (не отдельными фичами) | Мелкие, один PR-цикл дешевле трёх | Смешивание тем в одном PR — компенсируется отдельными задачами плана |
| D-5 | Конфиг-ключи harnessCheck/roleHint — по умолчанию true, гейтятся bootstrapOk (нужен ctx.on) | Симметрия с bootstrap; без pre-step обе инъекции невозможны | Нет |
| D-5 | Конфиг-ключи harnessCheck/roleHint — по умолчанию true; гейт — прямое `typeof ctx.on === 'function'` (не bootstrapOk: selfcheck пропускает запись bootstrap при config.bootstrap=false, а инъекциям нужен ctx.on независимо от bootstrap) | Симметрия с bootstrap; корректность при выключенном bootstrap | Нет |
| D-6 | Маркер инъекций — `<!-- DSH-HARNESS-PRESTEP:<hash> -->` (формат bootstrap, не `<--`); `isBootstrapVisible` → общий `isInjectionVisible` (переименование трогает imports bootstrap.test.mjs — учтено в плане) | Одна машинерия видимости на все инъекции | Регрессия bootstrap — страхуется его тестами |
| D-7 | Текст вопроса с четырьмя вариантами сочинён в этом дизайне (в репо его не было) | Builder-check подтвердил отсутствие | Нет |
| D-8 | T3.4: в sdd-скилле предложения про TDD-порядок нет — текст добавляется с нуля (пин в тесте), а не «усиливается» | Факт builder-check | Нет |
## Тесты (идеи для плана)