Проблема
У kind spec три правила валидатора: spec-summary, spec-contracts, spec-related. Правила, проверяющего сценарии, нет.
Между тем центральный инвариант SPEC в методологии сформулирован жёстко: у каждого ### Requirement есть хотя бы один #### Scenario. Скилл /spec-author называет это «the single hard gate before freeze» (spec-author/SKILL.md:48), канон — NOTE-020, решение — ADR-008.
Инвариант заявлен прозой в трёх местах и не проверяется нигде.
Где он всё-таки держится — и почему это плохое место
Зубы появляются на стадию позже, у потребителя:
agents-tdd/agents/tdd-planner.md:204 HARD RULE 1 — отказывается планировать против SPEC без блоков #### Scenario;
agents-tdd/hooks/tdd-gate.sh:193 — ловит дрейф SPEC после заморозки по нормализованному хешу.
То есть автор SPEC узнаёт о дефекте, только когда кто-то попытается по нему работать. SPEC успевает пройти валидацию, попасть в active и стать источником истины — а потом оказывается, что оракула в нём нет.
Доказательство
strings $(which forgeplan) | grep -oE '\bspec-[a-z-]+' | sort -u
# spec-summary spec-contracts spec-related
Все 5 SPEC в рабочем окружении блоки #### Scenario несут — но это дисциплина автора, а не результат проверки.
Что предлагается
| Правило |
Уровень |
Что проверяет |
spec-requirement-has-scenario |
Should |
каждый ### Requirement имеет ≥1 вложенный #### Scenario |
spec-scenario-format |
Could |
тело сценария содержит GIVEN и WHEN и THEN |
Should, а не Must — по тем же соображениям, что и с NFR: не ломать существующие артефакты одномоментно.
Важно не перепутать с существующим правилом
В бинаре уже есть scenario-required-sections, но оно относится к отдельному brownfield-виду артефакта Scenario (см. plugins/forgeplan-brownfield-pack/templates/scenario.template.md и скилл /scenario-writer, который превращает use-case в Gherkin).
Это не то же самое, что блоки #### Scenario внутри SPEC. Новое правило должно смотреть на вложенные заголовки внутри тела SPEC, а не на вид артефакта.
Проблема
У kind
specтри правила валидатора:spec-summary,spec-contracts,spec-related. Правила, проверяющего сценарии, нет.Между тем центральный инвариант SPEC в методологии сформулирован жёстко: у каждого
### Requirementесть хотя бы один#### Scenario. Скилл/spec-authorназывает это «the single hard gate before freeze» (spec-author/SKILL.md:48), канон — NOTE-020, решение — ADR-008.Инвариант заявлен прозой в трёх местах и не проверяется нигде.
Где он всё-таки держится — и почему это плохое место
Зубы появляются на стадию позже, у потребителя:
agents-tdd/agents/tdd-planner.md:204HARD RULE 1 — отказывается планировать против SPEC без блоков#### Scenario;agents-tdd/hooks/tdd-gate.sh:193— ловит дрейф SPEC после заморозки по нормализованному хешу.То есть автор SPEC узнаёт о дефекте, только когда кто-то попытается по нему работать. SPEC успевает пройти валидацию, попасть в
activeи стать источником истины — а потом оказывается, что оракула в нём нет.Доказательство
Все 5 SPEC в рабочем окружении блоки
#### Scenarioнесут — но это дисциплина автора, а не результат проверки.Что предлагается
spec-requirement-has-scenario### Requirementимеет ≥1 вложенный#### Scenariospec-scenario-formatShould, а не Must — по тем же соображениям, что и с NFR: не ломать существующие артефакты одномоментно.
Важно не перепутать с существующим правилом
В бинаре уже есть
scenario-required-sections, но оно относится к отдельному brownfield-виду артефактаScenario(см.plugins/forgeplan-brownfield-pack/templates/scenario.template.mdи скилл/scenario-writer, который превращает use-case в Gherkin).Это не то же самое, что блоки
#### Scenarioвнутри SPEC. Новое правило должно смотреть на вложенные заголовки внутри тела SPEC, а не на вид артефакта.