From 0c8338509805d52143f8c0f43870f11461341b5c Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 7 Aug 2026 13:48:01 +0300 Subject: [PATCH] =?UTF-8?q?tasks:=20=D0=B7=D0=B0=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D0=BD=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - tests-convention: разобрать кандидатов пункта «Тесты» и записать docs/conventions/tests.md, четыре критерия приёмки с оракулами - пункт «Тесты» снят из convention-candidates и заменён ссылкой, чтобы не жить вторым домом --- docs/tasks/BACKLOG.md | 1 + docs/tasks/items/convention-candidates.md | 8 ++-- docs/tasks/items/tests-convention.md | 57 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 docs/tasks/items/tests-convention.md diff --git a/docs/tasks/BACKLOG.md b/docs/tasks/BACKLOG.md index 0797870..09b0d98 100644 --- a/docs/tasks/BACKLOG.md +++ b/docs/tasks/BACKLOG.md @@ -41,6 +41,7 @@ - [🧹 Кэшировать ответы метабаз с TTL (и опционально LLM)](items/metadata-cache.md) — повторные и ретраящиеся прогоны бьют TMDB/TVDB/TVMaze одним запросом — кэш с TTL сэкономил бы лимиты и ускорил «Распознать заново» - [✨ Чистить БД от терминальных задач и сырых ответов LLM старше срока хранения](items/db-retention-cleanup.md) — терминальные задачи и сырые ответы LLM копятся вечно — без авточистки список загрузок и БД деградируют по мере эксплуатации - [🧹 Свести термины домена в словарь единого языка](items/ubiquitous-language-glossary.md) — наименования домена расходятся между спеками, UI и кодом — нет единого глоссария (на нём же стоит агент-ревьювер наименований) +- [🧹 Разобрать кандидатов по тестам и записать конвенцию](items/tests-convention.md) — как пишем тесты, не записано нигде: пункт «Тесты» в convention-candidates не пересматривали, он обещает фикстуры в testdata/, которых в проекте нет — а трение накопилось (четыре внешних клиента, fakeStore с инъекцией ошибок, env-гейты, флаки-прогон, diff-coverage) - [🔬 Потолок нагрузки: 100 одновременных загрузок, план-максимум 1000](items/scale-100-downloads.md) — Зафиксировать в НФТ ориентир 100/1000 загрузок + аудит узких мест (SQLite, воркер, поллинг) - [🔬 Завершение загрузки через webhook](items/completion-webhook.md) — завершение сейчас ловим поллингом qBittorrent — webhook реагировал бы быстрее, но связывает нас с его конфигом (решим по опыту эксплуатации) - [🔬 Кандидаты в конвенции кода](items/convention-candidates.md) — накоплен список кандидатов (внешние клиенты, конкурентность, тесты, CLI, время) — надо решить, что из них стало реальным трением, а что выдумано вперёд diff --git a/docs/tasks/items/convention-candidates.md b/docs/tasks/items/convention-candidates.md index 9acb4cb..ce4bd5a 100644 --- a/docs/tasks/items/convention-candidates.md +++ b/docs/tasks/items/convention-candidates.md @@ -28,10 +28,10 @@ `http.DefaultClient`, ретраи с backoff и потолком, HTTP-прокси из конфига. Кандидат на общий конструктор клиента вместо копипасты в `qbt`/`llm`/`jellyfin`/`metadata`. Самый живой пункт: клиентов уже четыре. -- **Тесты.** Table-driven, фикстуры в `testdata/`, `t.Parallel()` где - безопасно, зафиксировать stdlib `testing` против `testify`, разделение - быстрых и интеграционных (`*_integration_test.go` + env-гейты уже есть), что - считаем обязательным к покрытию. +- ~~**Тесты.**~~ Вынесены отдельной задачей — + [tests-convention](tests-convention.md): кандидат разошёлся с проектом + (обещал фикстуры в `testdata/`, которого нет), и разбирать его надо вместе с + тем, что накопилось в самих тестах. **Кандидаты в строку-инвариант, а не в документ** diff --git a/docs/tasks/items/tests-convention.md b/docs/tasks/items/tests-convention.md new file mode 100644 index 0000000..e1c51d8 --- /dev/null +++ b/docs/tasks/items/tests-convention.md @@ -0,0 +1,57 @@ +# 🧹 Разобрать кандидатов по тестам и записать конвенцию + +- **Тип:** chore +- **Категория:** Инфраструктура +- **Зачем:** как пишем тесты, не записано нигде: пункт «Тесты» в convention-candidates не пересматривали, он обещает фикстуры в testdata/, которых в проекте нет — а трение накопилось (четыре внешних клиента, fakeStore с инъекцией ошибок, env-гейты, флаки-прогон, diff-coverage) +- **Теги:** sprint:2026-08-06 + +В `docs/conventions/` пять записей, и ни одна не про тесты. Знание о том, как +они здесь устроены, живёт в головах и в самих файлах: фикстуры чужих форматов +константами (`testdata` не заводился сознательно), интеграционные за env-гейтами +в `*_integration_test.go`, инъекция ошибок хранилища через `fakeStore`, +архитектурные правила тестом-сканером `internal/archrules` с русскими именами, +покрытие изменённых строк меряет гейт. + +Пункт «Тесты» в [convention-candidates](convention-candidates.md) с тех пор не +пересматривали, и он уже расходится с проектом: обещает фикстуры в `testdata/`, +которого нет и который запрещён `CLAUDE.md`. Часть остальных кандидатов +проверяется замером, а не мнением: table-driven используется в 18 пакетах из 19, +`t.Parallel()` — ни разу, `testify` в `go.mod` не подключён. + +Правило каталога конвенций — «пишем по мере реального трения, а не вперёд». +Трение здесь и есть: тема `autotests` идёт первым проходом на любой метке ревью, +а дома у неё нет — источником ей служит только семантика гейта из `CLAUDE.md`, +то есть «что краснеет», а не «что стоит проверять». + +## Затрагивает + +- `docs/conventions/tests.md` — новый файл записи конвенции; +- `docs/conventions/README.md` — строка в индексе «Записи» и, возможно, строки в + таблице «Механизировано»; +- `docs/tasks/items/convention-candidates.md` — пункт «Тесты» уходит из списка + кандидатов; +- `.golangci.yml` и `internal/archrules` — только если что-то из решённого + выражается правилом, а не прозой. + +## Критерии приёмки + +- Каждый кандидат пункта «Тесты» получил исход поимённо: в прозу, в правило или + выброшен как выдуманный вперёд. **Оракул:** в `convention-candidates.md` + пункта «Тесты» больше нет, а судьба каждого его подпункта названа — в новой + конвенции, в таблице «Механизировано» или в `REJECTED`-строке причины. +- `docs/conventions/tests.md` заведён и назван в индексе. **Оракул:** `task + gate`, шаг `canon` — файл вне канона и битая ссылка краснят безусловно. +- Ни одно утверждение конвенции не расходится с тем, как код устроен сегодня: + фикстуры описаны как лежат, `testdata` не обещан, число пакетов и приёмов не + выдумано. **Оракул:** `grep -r testdata` по репозиторию пуст, и агент + `doc-code-drift` на ближайшей сессии не даёт находки по этому файлу. +- Выражаемое правилом не осталось прозой. **Оракул:** каждое утверждение новой + конвенции либо отсутствует в таблице «Механизировано», либо стоит там с + адресом механизации — конфигом линтера или тестом `internal/archrules`. + +## Рамки + +Существующие тесты под новую конвенцию не переписываются — она применяется к +тому, что пишется дальше. `testdata/` не заводится: отказ от него записан в +`CLAUDE.md`, и его пересмотр — отдельное решение, а не побочный эффект этой +задачи.