- четыре новые записи: проверить шаг migrations так же, как шаг сверки версий Go; свести шесть расхождений между документами канона; запретить обращаться к Bot API мимо клиента бота; разведка о шагах гейта, теряющих предмет - context-cancel-in-pipeline приведена к правде: дописан перечень сделанного попутно, критерий с оракулом «тест на трёх прерываниях подряд» разбит надвое — проверена была только его узкая половина
4.2 KiB
🧹 Проверить шаг гейта migrations так же, как шаг сверки версий Go
- Тип: chore
- Категория: Очередь — Шаг уже стоит в гейте и уже назван стражем critical-инварианта в двух документах — необеспеченное обещание дороже отсутствующего.
- Зачем: Шаг охраняет critical-инвариант «применённый шаг схемы не переписывается», но своих проверок не имеет: дрейф шаблона имени, переезд каталога или потеря grep в конвейере оставят его вечно зелёным, и это не заметит ничто.
Шаг заведён 2026-08-13 и проверен мутацией на восьми исходах вручную — правка
уехавшего шага в дереве и в коммите, удаление, переименование, новый шаг, правка
migrations.go, отсутствующий ключ в docs/.docs.json, каталог без шагов,
неразрешимая база диффа. Прогон был разовым: в дереве от него не осталось ничего.
Прецедент рядом. У шага сверки версий Go есть спека
toolchain и 20 мутационно проверенных
сценариев в scripts/check_go_version_test.go; заведены они после дефекта
2026-08-12, когда зелёный шаг не проверял ничего и образ перестал собираться.
Долг назван строкой в
go-linters.md, «Границы: где что живёт».
Развилка, решаемая внутри задачи: нормировать шаг спекой (второй capability
о проверке, как toolchain) либо ограничиться проверками без нормы. Первое
дороже и даёт построчную сверку сценариев; второе закрывает регрессию, но
оставляет норму в комментарии Taskfile.yml.
Затрагивает
- шаг
migrationsвTaskfile.yml— его логика разбораgit diff; - ключ
migrationsвdocs/.docs.json— из него шаг берёт каталог; - каталог шагов схемы
internal/adapter/repo/pocketbase/migrations/как предмет правила; - возможно — новая capability в
openspec/specs/и файл проверок рядом сscripts/check_go_version_test.go.
Критерии приёмки
- Переписанный уехавший шаг схемы роняет проверку. Оракул — прогон сценария на временном клоне репозитория: правка файла шага даёт код 1 и называет файл.
- Новый файл шага проверку не роняет, и правка
migrations.goтоже: строкаRegisterнового шага прибавляется именно там. Оракул — те же два сценария. - Каталог без единого файла шага и отсутствующий ключ в
docs/.docs.jsonдают код 3, а не тихий ноль. Оракул — два сценария на временном каталоге. - Проверка сценариев идёт в гейте, а не руками. Оракул —
task gateкрасный при внесённом нарушении шаблона имени файла шага.
Рамки
Боевой каталог данных и файлы шагов схемы не трогаем: сценарии гоняются на
временном клоне репозитория. Чужие скрипты проверок (docs.py, tasks.py,
openspec.py) — не наши, они в задаче gate-steps-subject-guard.