diff --git a/docs/review.md b/docs/review.md index d382ec0..54ab2f9 100644 --- a/docs/review.md +++ b/docs/review.md @@ -474,3 +474,28 @@ повторился дважды; и «оракул сходимости называет свою посылку рядом с собой». Третий случай одного класса за три дня — это уже не совпадение, и в `docs/conventions/testing.md` он теперь правило, а не запись в журнале. + +## 2026-08-04 — гейт после интеграции пропустил все go-шаги и объявил себя зелёным [пойман] + +- **Где:** конвейер, а не код — `Taskfile.yml`, шаг `gate`, и правило батча + «после каждой интеграции — гейт на основной ветке» +- **Симптом:** после `git merge --ff-only` ветки задачи `task gate` без + аргументов напечатал «код не менялся — go-шаги пропускаются» и вышел с нулём. + Сборка, тесты, гонки, покрытие диффа и миграции **не гонялись вовсе**, а исход + выглядел как зелёный прогон. +- **Причина:** база диффа по умолчанию — `git merge-base HEAD master`. На самой + ветке `master` после ff-слияния это сам `HEAD`, дифф пуст, и все шаги, + привязанные к изменённым файлам, честно пропускаются. Пропуск по пустому + диффу — правильное поведение шага; неправильно то, что **правило интеграции + на него опирается**: батч вливает ветку и проверяет результат прогоном, + который в этот момент проверить ничего не может. +- **Чем воспроизведён:** `task gate` — 0, все go-шаги SKIP. `task gate + BASE=<коммит до слияния>` на том же дереве — 45 изменённых файлов, 13 шагов, + и **красный** `lint`. +- **Что изменено:** `.golangci.yml` — `./tmp` исключён из проверок + (`9f77e56`): `CLAUDE.md` велит держать черновое в `./tmp`, а линтер про это не + знал, и туда попадали и worktree батча, и диагностические программы. Краснота + по причине, не связанной с изменением, приучает не читать красноту. +- **Что осталось незакрытым:** гейт после интеграции обязан звать `BASE` + вершиной **до** слияния. Сейчас это знание живёт только в этой записи — + ни `Taskfile.yml`, ни скилл батча его не несут.