- tests-convention: два кандидата про тесты — один стенд чужого API на пакет, интеграционный тест обязан утверждать - convention-candidates: язык вывода в пяти местах без связывающего правила - quality-review-agents: четыре прохода не сообщили потолок находок — первый замер калибровки
5.4 KiB
5.4 KiB
🔬 Кандидаты в конвенции кода
- Тип: research
- Категория: Инфраструктура
- Зачем: накоплен список кандидатов (внешние клиенты, конкурентность, тесты, CLI, время) — надо решить, что из них стало реальным трением, а что выдумано вперёд
- Теги: goal:dev-process-quality
Список копился в черновике docs/drafts/conventions-backlog.md (удалён при
переводе на канон, текст в истории git) под правилом «пишем по мере реального
трения, а не вперёд». Правило соблюдено — но список с тех пор не пересматривали,
а часть пунктов за это время либо реализовалась, либо механизировалась правилом
и должна из кандидатов выпасть, а не переехать в прозу.
Разобрать по одному: стало реальным трением → в docs/conventions/; выражается
правилом → в .golangci.yml или internal/archrules и в таблицу
«Механизировано»; выдумано вперёд → выбросить.
Кандидаты в отдельный документ
- Раскладка пакетов и направление зависимостей.
cmd/<bin>+internal/<компонент>по доменам, домен не импортирует транспорт, без свалокutil/common/helpers. Частично уже механизировано тестамиinternal/archrules— проверить, что осталось прозой. context.Context. Первый параметр, не хранить в структурах, вValueтолько request-scoped данные (не зависимости), дедлайны и отмена тянутся сквозь стадии. Протяжка логгера уже сделана (internal/logctx).- Внешние клиенты. Таймаут на каждый исходящий вызов, не
http.DefaultClient, ретраи с backoff и потолком, HTTP-прокси из конфига. Кандидат на общий конструктор клиента вместо копипасты вqbt/llm/jellyfin/metadata. Самый живой пункт: клиентов уже четыре. Тесты.Вынесены отдельной задачей — tests-convention: кандидат разошёлся с проектом (обещал фикстуры вtestdata/, которого нет), и разбирать его надо вместе с тем, что накопилось в самих тестах.
Кандидаты в строку-инвариант, а не в документ
- БД и миграции. Forward-only, только параметризованные запросы, явные транзакции для многошаговых изменений, context-aware запросы. Сильно стек-специфично.
- Конкурентность. Каждая горутина знает, как останавливается
(ctx/закрытие канала);
errgroupдля связанных задач; фоновые процессы гасятся при shutdown. Актуально для воркера, не для всего проекта. - CLI. Данные в
stdout, логи и диагностика вstderr, осмысленные коды возврата. Для диагностических командadd/recognize/healthcheck. - Время. Явный TZ всегда, хранение и логи в UTC. Уже частично в
CLAUDE.mdиconventions/logging.md, аtime.Nowвнеstoreзапрещён линтером — этот пункт, вероятно, закрыт и подлежит вычёркиванию. - Язык вывода связан с мапперами. Провенанс — ревью
tvdb-title-locale(2026-08-07, отчёт триажа, находка R2 проходаarchitecture). Язык вывода живёт в пяти местах четырёх пакетов, и теста, связывающего множество кодов языка с мапперами, нет: забытая ветка молча даст английский вывод вместо ошибки. Кандидат в правилоinternal/archrules, а не в прозу. Дешёвый паллиатив, если правило окажется дорогим: строка «язык вывода» вdocs/architecture.md→ «Единые точки проекта» — тогда расхождение хотя бы спросит проход по темеarchitecture. Число мест перед правкой перепроверить: оно снято ревью одной задачи и с тех пор могло измениться.