3.0 KiB
3.0 KiB
🧹 Считать покрытие изменённых строк шагом гейта
- Тип: chore
- Категория: Очередь
- Зачем: Свойство «изменённое место покрыто хоть одним тестом» записано в docs/review.md, но не механизировано: за две задачи подряд непокрытые шаги ловили руками.
- Теги: question
CLAUDE.md, раздел «Гейт», объявляет прямо: «покрытие изменённых строк не
считается ничем». Цена этого измерена дважды. В задаче
http-handler-tests-never-green тесты обработчика не были зелёными ни разу; в
pocketbase-storage два из трёх шагов конвейера переписали целиком и не
выполнили ни одним тестом — нашёл это проход ревью, а не машина.
Затрагивает
- набор шагов
task gateвTaskfile.ymlи переменнаяBASEкак база диффа; - семантика гейта в
CLAUDE.md, раздел «Гейт», строка про покрытие; docs/review.md, раздел настройки конвейера: чем проходautotestsперестаёт заниматься руками.
Критерии приёмки
- Изменённая строка без покрытия роняет гейт. Оракул — прогон на дереве, где в тронутый файл добавлена заведомо невыполняемая ветка: шаг краснеет с её адресом.
- Изменение, не трогающее код, шаг не гоняет. Оракул —
task gateна дереве с правкой одной только документации: шаг сообщает о пропуске с причиной. - Порог назван числом в
CLAUDE.mdи совпадает с тем, что проверяет шаг. Оракул —task gate, шагdocs.py check.
Вопросы
- Какой порог и что считать изменённой строкой. Варианты: сто процентов изменённых строк (роняет на всякой ветке отказа, которую нечем изобразить), порог ниже ста (число берётся из ниоткуда), только новые функции целиком. Цена решения — частота ложных отказов гейта; пока решения нет, шаг заводить нельзя.
Рамки
Общее покрытие проекта не считаем и порога на него не ставим: он растёт от тестов на тривиальное и не отвечает ни на один вопрос.