ревью: скрипты гейта на python3, шаги выбираются по изменённым файлам

gate.sh и review-context.sh переписаны на python3 — в scripts/ уже жил
diff-coverage.py, а разбор вывода git и сборка сводки на shell читались хуже,
чем работали.

Гейт больше не гоняет go-шаги впустую: build, vet, lint, gofmt, тесты, -race,
покрытие и govulncheck запускаются, только если в диффе есть .go либо
go.mod/go.sum; миграции — если тронуты миграции или код. Правка документации
проходит гейт за секунды вместо минуты. Пропуск при этом не молчит: он в сводке
с причиной и уезжает в границы покрытия, а charter гейта различает «код не
трогали» (корректно) и «инструмента нет» (настоящая дыра).

Изменённые файлы считаем как объединение диффа с базой, рабочего дерева и новых
файлов: гейт гоняют и до коммита, и после, а лишний прогон шага дешевле
пропущенного.

Заодно govulncheck перестал рапортовать «уязвимостей: 0» когда он просто не смог
отработать из-за несобирающегося кода — это SKIP, а не WARN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-23 19:50:40 +03:00
co-authored by Claude Opus 4.8
parent 7473cbd6d3
commit 776a1ca6b6
8 changed files with 332 additions and 238 deletions
+4 -2
View File
@@ -18,7 +18,7 @@ color: red
1. Определи базу диффа: `git merge-base HEAD master` (на master — `HEAD~1`) или
возьми её из задания.
2. Запусти `task gate BASE=<база>` (обёртка над `scripts/gate.sh`). Он гонит все
2. Запусти `task gate BASE=<база>` (обёртка над `scripts/gate.py`). Он гонит все
шаги до конца и печатает сводку `OK`/`FAIL`/`WARN`/`SKIP`; подробности — в
`tmp/gate/<шаг>.log`. Краснит гейт только `FAIL`.
3. По каждому `FAIL` открой лог и прочитай **реальную** причину. Не пересказывай
@@ -44,7 +44,9 @@ color: red
него будут ссылаться как на доказательство.
- **`SKIP` любого шага** — идёт в границы покрытия дословно, с причиной. Молча
пропущенная проверка — это ложное ощущение проверенности, ровно то, ради чего
гейт и заводился.
гейт и заводился. Различай две причины: «код не трогали» — корректный пропуск
(шаги выбираются по изменённым файлам), а «инструмент не установлен» или «не
отработал» — настоящая дыра, и её надо назвать в отчёте.
- **`WARN` от `govulncheck`** — гейт не краснеет, но находка нужна. Открой
`tmp/gate/govulncheck.log` и посмотри трассы вызовов: уязвимость, приехавшая с
зависимостью **этого** change, — `major`; уязвимость в стандартной библиотеке
+4
View File
@@ -63,6 +63,10 @@ description: Конвейер ревью изменений jellybit — дет
верификация**: изменённые строки без покрытия, конкурентность без теста с
параллельным доступом, флаки-тест (не ниже `major`), недоступный инструмент.
Шаги выбираются по изменённым файлам: правка документации не гоняет тесты,
линтеры и `-race`. Пропуск при этом не молчит — он виден в сводке с причиной и
уезжает в границы покрытия, как и любой другой `SKIP`.
## Стадия 1 — Conformance (обязательна во всех профилях)
Два applicative-прохода: оба применяют **записанный** критерий, оба дешёвые,
@@ -49,7 +49,7 @@
- `jellybit-review-code` **не запускался ни в одном профиле** — charter обещал
«проход профиля `quick`», а `quick` состоял из стадий 0, 1, 5. Проход, который
нельзя запустить, нельзя и откалибровать. Включён стадией 1.
- `scripts/review-context.sh` выгружал `go doc -short` по всему модулю — 264
- `review-context` выгружал `go doc -short` по всему модулю — 264
строки из 458. Убрано: граф зависимостей, который иначе не восстановить, — это
21 строка, а публичную поверхность агент вытянет `go doc` сам по нужному месту.
- Из `calibration.md` убрана секция «дополнительных метрик» (precision,
@@ -78,7 +78,7 @@
| матчинг ошибки по тексту сообщения | `internal/archrules` | errors.md |
| `AUTOINCREMENT`, `DEFAULT (datetime('now'))` в новых миграциях | `internal/archrules` | database.md |
| транспорты не знают друг о друге, ядро не знает о транспортах | `internal/archrules` | CLAUDE.md (осталась одна строка принципа) |
| ER-схема обновлена вместе с миграцией | `scripts/gate.sh` (по диффу) | — |
| ER-схема обновлена вместе с миграцией | `scripts/gate.py` (по диффу) | — |
Правки кода под новые правила: `logging.StartCall` как единая точка отсчёта
длительности внешних вызовов, `store.Now` вместо `time.Now` в `httpapi` и