конвенции: перенести механизируемое в golangci-lint и internal/archrules

Правило, которое проверяет машина, не должно оставаться прозой: файл конвенций
на сотни строк размазывает внимание по тривиальному — модель добросовестно
проверит именование полей лога и не дойдёт до формы решения.

Включены sloglint (константный msg, стиль ключ-значение), forbidigo (fmt.Print*,
os.Getenv, time.Now мимо store.Now), errorlint (сравнение ошибок), depguard
(сторонние пакеты ошибок). internal/archrules — сканеры на то, что линтером не
выражается: направление зависимостей ядро↔транспорты, AUTOINCREMENT и серверное
время в новых миграциях, матчинг ошибки по тексту.

Код приведён к правилам: logging.StartCall как единая точка отсчёта длительности
внешних вызовов, store.Now вместо time.Now в httpapi и часах воркера,
slog.DiscardHandler в тестах.

Перенесённое вычеркнуто из docs/conventions/* и openspec/config.yaml — прозой
осталось только то, что правилом не выражается.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-23 18:17:40 +03:00
co-authored by Claude Opus 4.8
parent 6792f7082a
commit 612344bab3
28 changed files with 325 additions and 98 deletions
+9 -13
View File
@@ -29,19 +29,15 @@ context: |
- Тривиальная задача — достаточно одного прохода (код).
Конвенции кода (соблюдать при apply):
- Логирование — только log/slog (структурированный JSON), без fmt.Println.
Логируем все вызовы внешних сервисов; healthcheck-эндпоинты — на DEBUG.
Детали: уровни, обязательные поля — docs/conventions/logging.md.
- Безопасность: никаких секретов в полях логов (пароли qBittorrent,
API-ключи LLM/метабаз, auth-заголовки).
- Конфигурация — только TOML; секреты рендерит деплой (Ansible+Vault) в
файл (config.toml не коммитится, 0600), env для конфига не используем;
валидация на старте. Детали: docs/conventions/config.md.
- Ошибки — stdlib, обёртка с контекстом (fmt.Errorf("...: %w", err)),
проверка errors.Is/errors.As, трансляция доменной ошибки в ответ на
внешней границе (наружу не отдаём текст внутренней ошибки). Детали:
docs/conventions/errors.md.
- Время — всегда с явным TZ (сервер в Europe/Moscow; логи — в UTC).
- Механизируемое проверяет конвейер сборки (.golangci.yml + internal/archrules),
пересказывать его здесь не нужно: `task lint` и `task test` скажут точнее.
- Прозой остаётся то, что правилом не выражается, и это читаем в источнике:
docs/conventions/{logging,errors,config,database,web-ui}.md — уровень лога
по адресату, единственный логирующий чокпоинт на доменной границе,
трансляция доменной ошибки на внешней границе, самодокументируемый
config.example.toml, htmx-партиалы.
- Безопасность: никаких секретов в полях логов и в диагностике состояния
(пароли qBittorrent, API-ключи LLM/метабаз, auth-заголовки).
# Project context (optional)
# This is shown to AI when creating artifacts.