diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index 09bb680..43545d1 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -53,9 +53,8 @@ - [🧹 Разобрать мелочи http-транспорта](items/http-transport-nits.md) — Маршруты зарегистрированы дважды, и переименование пути в main.go проходит проверки зелёным; обработчик пишет в журнал через стандартный log и дублирует запись, уже сделанную сервисом. - [🧹 Переименовать образец конфига в config.example.toml](items/config-example-toml.md) — Конвенция называет config.dist.toml объявленным расхождением, но тут же пишет это имя как правило — документ противоречит сам себе, а образец расходится с конвенцией. - [🔬 Стоит ли брать OpenTelemetry вместо голого Prometheus](items/opentelemetry-fit.md) — Метрик одиннадцать штук на пять счётчиков, трассировки нет вовсе: путь одной записи по конвейеру собирается только чтением логов глазами. -- [🧹 Обновить Go до 1.26 в модуле и в образе](items/go-1-26-upgrade.md) — Модуль объявляет go 1.25.0, образ собирается на golang:1.25-alpine, а на машине разработки стоит 1.26.5: три места расходятся, и проверки идут не на той версии, что уезжает на сервер. +- [🧹 Обновить Go до 1.26 и сверять версию шагом гейта](items/go-1-26-upgrade.md) — Модуль объявляет go 1.25.0, образ собирается на golang:1.25-alpine, на машине разработки стоит 1.26.5, и расхождение этих чисел не ловит ни один шаг гейта: разъехавшийся Dockerfile прошёл весь конвейер зелёным. - [🧹 Ловить уязвимости в зависимостях шагом гейта](items/gate-dependency-vulnerabilities.md) — govulncheck находит две достижимые уязвимости в клиентах Yandex, а ни гейт, ни список «чего в гейте нет» о нём не знают: узнать о третьей будет неоткуда. -- [🧹 Сверять версию Go в образе с директивой go.mod](items/gate-go-version-sync.md) — Образ гейт не собирает, и расхождение версий прошло весь конвейер молча: task image упал бы уже на сервере. - [🧹 Считать покрытие изменённых строк шагом гейта](items/gate-changed-lines-coverage.md) — Свойство «изменённое место покрыто хоть одним тестом» записано в docs/review.md, но не механизировано: за две задачи подряд непокрытые шаги ловили руками. - [🧹 Прервать шаг конвейера отменой контекста](items/context-cancel-in-pipeline.md) — Воркер читает ctx только между итерациями: остановка контейнера ждёт конца шага, а на занятом писателе один запрос к хранилищу держится до 9,5 секунды при мягком таймауте в 5. - [🧹 Разобрать мелочи слоя хранилища](items/storage-layer-nits.md) — Три мелочи ниже потолка триажа: цикл воркера пишет потерю захвата уровнем ERROR и считает её отказом, тип ошибки заведён там, где конвенция просит sentinel, а FileName несёт два разных смысла. diff --git a/tasks/REJECTED.md b/tasks/REJECTED.md index cac85e8..5d17218 100644 --- a/tasks/REJECTED.md +++ b/tasks/REJECTED.md @@ -5,3 +5,4 @@ есть коммит. Это первое место, куда смотрит дедупликация при заведении. +- 2026-08-12 `gate-go-version-sync` — 🧹 Сверять версию Go в образе с директивой go.mod. Причина: слита в go-1-26-upgrade 2026-08-12: сверка версии и само обновление правят одни и те же строки go.mod и Dockerfile, и порознь заводят расхождение заново. Была секция: Очередь. diff --git a/tasks/items/gate-go-version-sync.md b/tasks/items/gate-go-version-sync.md deleted file mode 100644 index 06d37f5..0000000 --- a/tasks/items/gate-go-version-sync.md +++ /dev/null @@ -1,35 +0,0 @@ -# 🧹 Сверять версию Go в образе с директивой go.mod - -- **Тип:** chore -- **Категория:** Очередь -- **Зачем:** Образ гейт не собирает, и расхождение версий прошло весь конвейер молча: task image упал бы уже на сервере. - -Случай записан журналом дефектов `docs/review.md` за 2026-08-12: `go mod tidy` -поднял директиву до 1.25, `Dockerfile` остался на `golang:1.24-alpine` с -`GOTOOLCHAIN=local`, и шесть проходов ревью вместе с восемью шагами гейта -показали зелёное. Нашлось случайным свойством прогона, а не устройством -проверок. - -Сборку образа в гейт не заводим — она дорога. Дешёвая замена: сравнение двух -строк. - -## Затрагивает - -- набор шагов `task gate` в `Taskfile.yml`; -- директива `go` в `go.mod` и сборочный слой `Dockerfile` как источники - сравнения; -- семантика гейта в `CLAUDE.md`, раздел «Гейт». - -## Критерии приёмки - -- Расхождение версий роняет гейт. Оракул — прогон `task gate` на дереве, где - версия в `Dockerfile` понижена на минор: шаг краснеет и называет оба числа. -- Совпадение гейт не роняет. Оракул — `task gate` на неизменённом дереве. -- Шаг не требует docker и работает без сети. Оракул — прогон с - `DOCKER_HOST=/dev/null`. - -## Рамки - -Сравнение строковое: `Dockerfile` называет `golang:.-alpine`, а -`go.mod` — `..`. Сверяются мажор и минор; патч сборочного -образа своей жизнью живёт законно. diff --git a/tasks/items/go-1-26-upgrade.md b/tasks/items/go-1-26-upgrade.md index a3438a3..bcb7f7f 100644 --- a/tasks/items/go-1-26-upgrade.md +++ b/tasks/items/go-1-26-upgrade.md @@ -1,30 +1,53 @@ -# 🧹 Обновить Go до 1.26 в модуле и в образе +# 🧹 Обновить Go до 1.26 и сверять версию шагом гейта - **Тип:** chore - **Категория:** Очередь -- **Зачем:** Модуль объявляет go 1.25.0, образ собирается на golang:1.25-alpine, а на машине разработки стоит 1.26.5: три места расходятся, и проверки идут не на той версии, что уезжает на сервер. +- **Зачем:** Модуль объявляет go 1.25.0, образ собирается на golang:1.25-alpine, на машине разработки стоит 1.26.5, и расхождение этих чисел не ловит ни один шаг гейта: разъехавшийся Dockerfile прошёл весь конвейер зелёным. -Заметка владельца от 2026-08-12. Версия 1.25 в модуле появилась не выбором, а -требованием PocketBase: `go mod tidy` поднял директиву сам, а образ подтянули -следом. То есть сегодняшнее число никем не назначено, и повторится это на -следующей же зависимости. +Задача собрана из двух: заметки владельца от 2026-08-12 про обновление и находки +ревью `pocketbase-storage` про несверяемые версии. Собраны вместе, потому что +правятся одним заходом: поднимать число в трёх местах и не заводить сверку +значит завести то же расхождение заново на следующей зависимости. + +Версия 1.25 в модуле появилась не выбором, а требованием PocketBase: `go mod +tidy` поднял директиву сам, а образ подтянули следом. То есть сегодняшнее число +никем не назначено. + +Случай расхождения записан журналом дефектов `docs/review.md` за 2026-08-12: +`go mod tidy` поднял директиву до 1.25, `Dockerfile` остался на +`golang:1.24-alpine` с `GOTOOLCHAIN=local`, и шесть проходов ревью вместе с +восемью шагами гейта показали зелёное. Нашлось случайным свойством прогона, а не +устройством проверок. + +Сборку образа в гейт не заводим — она дорога. Дешёвая замена: сравнение двух +строк. ## Затрагивает - директива `go` в `go.mod`; - сборочный слой `Dockerfile`; -- строка стека в `CLAUDE.md` и в `README.md`. +- строка стека в `CLAUDE.md` и в `README.md`; +- набор шагов `task gate` в `Taskfile.yml`; +- семантика гейта в `CLAUDE.md`, раздел «Гейт». ## Критерии приёмки -- Модуль, образ и документы называют одну версию Go. Оракул — `grep` по - четырём местам: `go.mod`, `Dockerfile`, `CLAUDE.md`, `README.md`; все дают - одно число. +- Модуль, образ и документы называют одну версию Go. Оракул — `grep` по четырём + местам: `go.mod`, `Dockerfile`, `CLAUDE.md`, `README.md`; все дают одно число. - Сборка на объявленной версии проходит. Оракул — `task image` и `CGO_ENABLED=0 go build ./...` на чистом дереве. +- Расхождение версий роняет гейт. Оракул — прогон `task gate` на дереве, где + версия в `Dockerfile` понижена на минор: шаг краснеет и называет оба числа. +- Совпадение гейт не роняет, а сам шаг не требует docker и работает без сети. + Оракул — `task gate` на неизменённом дереве и прогон с + `DOCKER_HOST=/dev/null`. - Гейт зелёный целиком. Оракул — `task gate`. ## Рамки Версию выбирает человек: обновление до неподдерживаемой ещё зависимостями версии ломает сборку молча. Выкладку не запускаем. + +Сравнение строковое: `Dockerfile` называет `golang:.-alpine`, а +`go.mod` — `..`. Сверяются мажор и минор; патч сборочного +образа своей жизнью живёт законно.