конвенции: перенести механизируемое в 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:
+9
-13
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user