tasks: очередь расставлена от базы к деталям

- порядок беклога и роадмапа назначен слоями: проверки, которым можно
  верить → долги входа → владелец записи и контракт API → конвейер под
  тестами → приложение и возможности поверх; у каждого движения записана
  причина;
- заведены восемь задач под пункты «Завершения», которых не закрывала ни
  одна запись, — цель any-audio-source была без задач вовсе;
- у четырёх задач сняты критерии, требовавшие того, что делает задача ниже
  по очереди; исправлены ссылки на несуществующий repo/sqlite и на
  отменённую разведку об очереди.
This commit is contained in:
av
2026-08-12 20:48:53 +03:00
parent ddc34b3182
commit 8739b18a9f
73 changed files with 490 additions and 139 deletions
+14 -13
View File
@@ -1,9 +1,8 @@
# 🧹 Считать покрытие изменённых строк шагом гейта
# 🧹 Ронять гейт на изменённой функции, которую не выполняет ни один тест
- **Тип:** chore
- **Категория:** Очередь
- **Категория:** Очередь — Непокрытую изменённую функцию дважды ловил проход ревью, а не машина; порог решён 2026-08-12, брать можно.
- **Зачем:** Свойство «изменённое место покрыто хоть одним тестом» записано в docs/review.md, но не механизировано: за две задачи подряд непокрытые шаги ловили руками.
- **Теги:** question
`CLAUDE.md`, раздел «Гейт», объявляет прямо: «покрытие изменённых строк не
считается ничем». Цена этого измерена дважды. В задаче
@@ -11,6 +10,13 @@
`pocketbase-storage` два из трёх шагов конвейера переписали целиком и не
выполнили ни одним тестом — нашёл это проход ревью, а не машина.
**Единица счёта — функция, а не строка** (решение владельца 2026-08-12). Шаг
краснеет на новой или изменённой функции, которую не выполняет ни один тест;
доля покрытых строк внутри неё не считается и порогом не ограничивается. Довод:
процент изменённых строк роняет гейт на всякой ветке отказа, которую нечем
изобразить в тесте, а порог ниже ста пришлось бы брать из ниоткуда. Именно
непокрытая целиком функция — то, что дважды ловили руками.
## Затрагивает
- набор шагов `task gate` в `Taskfile.yml` и переменная `BASE` как база диффа;
@@ -25,16 +31,11 @@
адресом.
- Изменение, не трогающее код, шаг не гоняет. Оракул — `task gate` на дереве с
правкой одной только документации: шаг сообщает о пропуске с причиной.
- Порог назван числом в `CLAUDE.md` и совпадает с тем, что проверяет шаг. Оракул
`task gate`, шаг `docs.py check`.
## Вопросы
- **Какой порог и что считать изменённой строкой.** Варианты: сто процентов
изменённых строк (роняет на всякой ветке отказа, которую нечем изобразить),
порог ниже ста (число берётся из ниоткуда), только новые функции целиком.
Цена решения — частота ложных отказов гейта; пока решения нет, шаг заводить
нельзя.
- Единица счёта названа в `CLAUDE.md` и совпадает с тем, что проверяет шаг.
Оракул`task gate`, шаг `docs.py check`.
- Функция, тронутая правкой на одну строку, шаг не роняет, если её вызывает хоть
один тест. Оракул — прогон на дереве с однострочной правкой внутри покрытой
функции: шаг зелёный.
## Рамки