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