Go обновлён до 1.26, а расхождение версий теперь роняет гейт

- шаг go-version в task gate сверяет объявленную версию в go.mod, Dockerfile,
  CLAUDE.md и README.md; судит по репозиторию, go не зовёт, docker и сети не
  требует
- заведена capability toolchain: до сих пор спеки нормировали только поведение
  сервиса, теперь и инструмент сборки. Причина и цена — в двух ADR
- закрыт дефект 2026-08-12: образ на golang:1.24-alpine разошёлся с go.mod и
  перестал собираться, а восемь шагов гейта и шесть проходов ревью были зелёными
This commit is contained in:
av
2026-08-12 10:57:50 +03:00
parent aa20b229f9
commit 09228f23d8
20 changed files with 1963 additions and 11 deletions
@@ -0,0 +1,51 @@
## Why
Сервис собирается тремя разными числами версии Go сразу: модуль требует одно,
сборочный образ берёт другое, памятка обещает третье, а README не называет
никакого. Расхождение этих чисел никто не проверяет, и один раз оно уже уехало в
работу: 2026-08-12 образ не собирался вовсе, а полный набор проверок и шесть
проходов ревью показали зелёное. Поймали случайно, руками. Пока сравнения нет,
то же самое повторится на следующем подъёме версии — а замечено будет в момент
выкладки, когда чинить дороже всего.
## What Changes
- Версия Go, на которой собирается сервис, поднимается до 1.26 и называется
**одним и тем же числом** в четырёх местах: требование модуля, сборочный
образ, памятка разработчику и README. Сегодня README не называет его вовсе —
строка заводится.
- В набор проверок добавляется шаг, который сравнивает объявленные числа между
собой и краснеет, называя все четыре места и число каждого. Шаг сравнивает
строки: он не собирает образ, не ходит в сеть, не требует docker и не
спрашивает, что за Go установлен на машине, — судит он по тому, что лежит в
репозитории.
- Собирать образ проверкой мы по-прежнему **не** будем — это дорого, и отказ
осознанный. Сравнение строк ловит тот же класс расхождений за доли секунды.
- Разница в третьем числе версии между модулем и образом остаётся законной:
сравниваются только первые два.
## Capabilities
### New Capabilities
- `toolchain`: каким инструментом и какой его версии собирается сервис, и что об
этом проверяется до выкладки. Первое требование capability — согласованность
объявленной версии инструмента сборки и её проверка набором проверок.
### Modified Capabilities
Нет. Поведение сервиса для его потребителей не меняется: запись принимается,
расшифровывается и хранится ровно как прежде.
## Impact
- требование версии в `go.mod`;
- сборочный слой `Dockerfile`;
- строка о версии в `CLAUDE.md` и в `README.md`;
- набор шагов `task gate` в `Taskfile.yml` и описание семантики набора проверок
в `CLAUDE.md`;
- запись журнала дефектов `docs/review.md` за 2026-08-12 получает починку,
которую обещала.
Выкладка этим изменением не запускается. Внешних зависимостей изменение не
трогает: PocketBase требует не ниже 1.25, и 1.26 это требование выполняет.