- порядок беклога и роадмапа назначен слоями: проверки, которым можно верить → долги входа → владелец записи и контракт API → конвейер под тестами → приложение и возможности поверх; у каждого движения записана причина; - заведены восемь задач под пункты «Завершения», которых не закрывала ни одна запись, — цель any-audio-source была без задач вовсе; - у четырёх задач сняты критерии, требовавшие того, что делает задача ниже по очереди; исправлены ссылки на несуществующий repo/sqlite и на отменённую разведку об очереди.
44 lines
3.7 KiB
Markdown
44 lines
3.7 KiB
Markdown
# 🧹 Ронять гейт на изменённой функции, которую не выполняет ни один тест
|
||
|
||
- **Тип:** 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`.
|
||
- Функция, тронутая правкой на одну строку, шаг не роняет, если её вызывает хоть
|
||
один тест. Оракул — прогон на дереве с однострочной правкой внутри покрытой
|
||
функции: шаг зелёный.
|
||
|
||
## Рамки
|
||
|
||
Общее покрытие проекта не считаем и порога на него не ставим: он растёт от
|
||
тестов на тривиальное и не отвечает ни на один вопрос.
|