Files
transcriber/tasks/items/gate-changed-lines-coverage.md
T
av 8739b18a9f tasks: очередь расставлена от базы к деталям
- порядок беклога и роадмапа назначен слоями: проверки, которым можно
  верить → долги входа → владелец записи и контракт API → конвейер под
  тестами → приложение и возможности поверх; у каждого движения записана
  причина;
- заведены восемь задач под пункты «Завершения», которых не закрывала ни
  одна запись, — цель any-audio-source была без задач вовсе;
- у четырёх задач сняты критерии, требовавшие того, что делает задача ниже
  по очереди; исправлены ссылки на несуществующий repo/sqlite и на
  отменённую разведку об очереди.
2026-08-12 20:48:53 +03:00

3.7 KiB

🧹 Ронять гейт на изменённой функции, которую не выполняет ни один тест

  • Тип: 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.
  • Функция, тронутая правкой на одну строку, шаг не роняет, если её вызывает хоть один тест. Оракул — прогон на дереве с однострочной правкой внутри покрытой функции: шаг зелёный.

Рамки

Общее покрытие проекта не считаем и порога на него не ставим: он растёт от тестов на тривиальное и не отвечает ни на один вопрос.