# 🧹 Завести недостающие проверки: shellcheck, hadolint и тест скрипта сверки версий - **Тип:** chore - **Категория:** Очередь - **Зачем:** Скрипты оболочки и Dockerfile машина не проверяет: shellcheck и hadolint не заведены, lefthook смотрит только gitleaks, а единственный исполняемый скрипт проекта на shell — scripts/check-go-version.sh — разбирали на ревью глазами построчно, потому что машине его показать нечем. Собрана из двух источников: заметки владельца от 2026-08-12 про lefthook и находки N-1 ревью `go-1-26-upgrade` про непроверенный скрипт сверки версий. Собраны вместе, потому что правятся одним заходом: и то и другое — недостающие проверки на файлы, которых сегодняшний гейт не видит. Цена shellcheck замерена на прогоне 2026-08-12: shell-файлов в репозитории два, в гейте из них один, единственное замечание — ложный `SC1007` на идиому `CDPATH= cd`, и оно уже подавлено в скрипте директивой. То есть шаг стоит одной строки. Отдельная половина — **скрипт сверки версий не проверен ничем.** Его норма (`openspec/specs/toolchain/spec.md`) описывает девятнадцать сценариев, а гейт гоняет скрипт ровно на согласованном дереве, то есть проверяет один из них — тот, где всё сошлось. Остальные восемнадцать подтверждены разовыми ручными прогонами 2026-08-12 и после первой же правки образца перестанут выполняться молча. Проверки go (`go vet`, `gofmt`) в гейте уже есть; в заметке речь о том, чтобы часть из них ловил и pre-commit, не дожидаясь полного прогона. ## Затрагивает - `lefthook.yml` — набор предкоммитных проверок; - набор шагов `task gate` в `Taskfile.yml`; - новый тест-скрипт для `scripts/check-go-version.sh`; - `Dockerfile` — как объект проверки hadolint, не правкой содержимого; - семантика гейта в `CLAUDE.md`, раздел «Гейт», подраздел «чего в гейте намеренно нет»; - таблица «Механизировано» в `docs/conventions/README.md`. ## Критерии приёмки - `shellcheck` краснеет на негодном скрипте оболочки. Оракул — внести в `scripts/check-go-version.sh` неэкранированную переменную и прогнать шаг: он краснеет; вернуть — зеленеет. - `hadolint` краснеет на негодном `Dockerfile`. Оракул — тот же приём: снять закрепление версии базового образа и прогнать шаг. - Каждый сценарий нормы `toolchain` проверяется машиной, а не памятью. Оракул — тест-скрипт мутирует дерево по одному сценарию за прогон; снять любую проверку из `check-go-version.sh` — тест краснеет и называет сценарий. - Предкоммитные проверки не дублируют гейт молча. Оракул — `CLAUDE.md`, раздел «Гейт», называет, что именно ловит pre-commit и что остаётся только гейту. - Гейт зелёный целиком. Оракул — `task gate`. ## Рамки Мутационный тест работает на временной копии дерева: `t.TempDir()`-подход, в `data/` не писать, рабочее дерево после прогона обязано остаться нетронутым. Заметка владельца называет проверки go в lefthook, но полный набор `task gate` в pre-commit не переносится: он идёт минуты, а pre-commit обязан быть быстрым. Что именно из него дублировать — решение этой задачи, и его надо назвать.