docs: инструменты гейта переехали в свой дом — docs/autotests.md
- перечень «Механизировано» и то, что осталось прозой, снято из конвенций: они про то, как писать код, а не про инструменты, которые его читают - новый документ — дом темы ревью autotests, с границами: семантика гейта остаётся в CLAUDE.md, журнал дефектов и вопросы по темам — в review.md - вопрос ревью о суждении по готовому ответу сужен до того, что машина не проверяет: до ответа мимо recorder
This commit is contained in:
@@ -6,7 +6,8 @@
|
||||
|
||||
**Прозой остаётся только то, что не выражается правилом.** Свойство, ставшее
|
||||
правилом линтера или тестом-сканером, отсюда **удаляется** и переезжает в
|
||||
перечень «Механизировано» ниже. Причина: файл на несколько сотен строк
|
||||
перечень «Механизировано» документа [../autotests.md](../autotests.md) — дома
|
||||
инструментов, которые читают код. Причина: файл на несколько сотен строк
|
||||
размазывает внимание по тривиальному — и модель, и человек добросовестно
|
||||
проверят именование и не дойдут до формы решения.
|
||||
|
||||
@@ -47,30 +48,12 @@ htmx, а здесь решено делать SPA — и перенесённы
|
||||
однофайловые компоненты, таблица маршрутов, состояние в экране, одна обёртка
|
||||
над `fetch`, показ ошибок и состояний списка.
|
||||
|
||||
## Механизировано
|
||||
## Что из этого проверяет машина
|
||||
|
||||
Проверяется командами из [CLAUDE.md](../../CLAUDE.md); прозой не дублируется и в
|
||||
промптах ревью не пересказывается.
|
||||
Перечень правил, доведённых до проверки, и место настройки каждого — в
|
||||
[../autotests.md](../autotests.md). Там же сказано, что из перечисленного в
|
||||
записях осталось прозой и потому проверяется человеком на каждом ревью заново:
|
||||
сегодня правилом выражено ровно одно свойство из всех записей.
|
||||
|
||||
| Правило | Где механизировано |
|
||||
| --- | --- |
|
||||
| Сравнение ошибок через `errors.Is` и `errors.As`, не `==` и не приведением типа | `.golangci.yml` → `errorlint` |
|
||||
| Непроверенное возвращаемое значение ошибки | `.golangci.yml` → `errcheck`, включая присваивание в `_` (`check-blank`). Отказ, который решено не проверять, объявляют в `exclude-functions` поимённо — там сегодня `defer Close` и `send` |
|
||||
| Проверка судит ответ по готовому ответу (`Result()`), а не по живой карте заголовков обработчика | `.golangci.yml` → `forbidigo` с `analyze-types`, находки только в `*_test.go`. Судит по типу приёмника (`httptest.ResponseRecorder`), поэтому ловит любую форму: цепочкой, через переменную, по индексу карты, обходом, полем `HeaderMap`. Остаётся ревью проверка, идущая мимо recorder — через свой `http.ResponseWriter` |
|
||||
| Форматирование исходников | `.golangci.yml` → `gofmt` |
|
||||
| Подозрительные конструкции языка | `.golangci.yml` → `govet`, `staticcheck`, `ineffassign`, `unused` |
|
||||
| Секреты в коммите | `lefthook.yml` → `gitleaks git --staged` |
|
||||
| Достижимая из кода уязвимость в зависимостях | `Taskfile.yml` → шаг `vulns` (`govulncheck ./...`) |
|
||||
| Раскладка документов, битые ссылки, изменённый шаг схемы без правки `database.md` | `docs.py check`; каталог шагов задаёт ключ `migrations` в `docs/.docs.json` |
|
||||
| Одно число версии Go в `go.mod`, `Dockerfile`, `CLAUDE.md` и `README.md` | `Taskfile.yml` → шаг `go-version` (`scripts/check-go-version.sh`) |
|
||||
|
||||
Не названное здесь место механизации означает, что проход по конвенциям будет
|
||||
добросовестно проверять уже проверенное.
|
||||
|
||||
**Из перечисленного в записях правилом выражено одно** — сравнение ошибок через
|
||||
`errors.Is` и `errors.As` (`errorlint`, строка таблицы выше). Прозой остаётся всё
|
||||
прочее: ни константный `msg` лога (`sloglint`), ни запрет `fmt.Print*` и
|
||||
`os.Getenv` (`forbidigo` заведён, но одним правилом — о том, чем судят ответ в
|
||||
проверках; этих двух запретов в нём нет), ни запрет сторонних пакетов ошибок
|
||||
(`depguard`), ни архитектурные тесты-сканеры. Это следующий шаг переноса в правило: свойство,
|
||||
оставшееся прозой, проверяет человек на каждом ревью заново.
|
||||
Здесь этот перечень не повторяется. Дом у него один, и он не тут: конвенции
|
||||
говорят, как писать код, а не какими инструментами его читают.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
**Механизировано:** одно — сверка изменённого шага схемы с
|
||||
[../database.md](../database.md), шаг гейта `docs.py check`
|
||||
([README.md](README.md), «Механизировано»). Под прочие пункты ни правила
|
||||
([../autotests.md](../autotests.md), «Механизировано»). Под прочие пункты ни правила
|
||||
линтера, ни теста-сканера в transcriber нет.
|
||||
|
||||
## Первичные ключи — ULID, не автоинкремент
|
||||
|
||||
@@ -13,7 +13,7 @@ OpenSpec.
|
||||
|
||||
**Механизировано:** ничего из перечисленного ниже. `forbidigo` в `.golangci.yml`
|
||||
включён, но правило у него одно и о другом — чем судят ответ в проверках
|
||||
([README.md](README.md), «Механизировано»); `sloglint` не заведён, и ни один
|
||||
([../autotests.md](../autotests.md), «Механизировано»); `sloglint` не заведён, и ни один
|
||||
пункт этой записи правилом не выражен.
|
||||
|
||||
## Принципы
|
||||
|
||||
Reference in New Issue
Block a user