Files
healthlog/docs/conventions
av a834d10415 httpapi: форма провода читающих маршрутов объявлена транспортом
- доменные типы internal/catalog лишились json-тегов и MarshalJSON; типы
  metricWire/layerWire/aggregationWire и перевод catalogWire живут в транспорте,
  тело отказа тоже получило объявленный тип — байты ответа не изменились
- заведён сторож: обход графа типов ответа утверждает, что домен не доезжает до
  сериализации, плюс требование json-тега на полях транспортных структур и
  заведомо красные случаи к обоим правилам
- решение с ценой обеих сторон записано в architecture.md и ADR; шаг lint в
  гейте получил свой кеш — общий на машину красил прогон находками из чужого
  worktree
2026-08-04 16:18:05 +03:00
..

Конвенции кода

Как мы пишем код — в отличие от openspec/specs/, который описывает, что система делает, и architecture.md, который описывает, как она сложена.

Прозой остаётся только то, что не выражается правилом. Свойство, ставшее правилом линтера, отсюда удаляется и переезжает в перечень «Механизировано».

Язык документации и кода — в CLAUDE.md: это правило шире кода, оно касается и коммитов, и документов.

Записи

  • errors.md — ошибки: обёртка, sentinel против типа, трансляция на границе, что глушим.
  • logging.md — логи: уровень по адресату, единственный логирующий чекпоинт, что не попадает в лог никогда.
  • config.md — конфигурация: TOML, валидация на старте, самодокументируемый образец.
  • storage.md — база и идентификаторы: ULID и естественные ключи, время в UTC, правило выбора между версиями, отпечаток витрины, миграции.
  • testing.md — тесты: реальные пакеты в testdata, идемпотентность, перебор версий, замер на живом архиве.

Механизировано

Проверяет task lint по .golangci.yml. Пересказывать эти правила прозой не нужно — линтер скажет точнее и всегда актуальнее.

Правило Где механизировано
msg лога — константная категория, данные атрибутами sloglint
Без fmt.Print* — логируем через slog forbidigo
Конфигурация только из TOML, без os.Getenv forbidigo
Время генерирует store.Now(), не time.Now() forbidigo
Сравнение ошибок через errors.Is/As, не == errorlint
Ошибки только stdlib errors + fmt.Errorf depguard
Стек-трейсы избыточны — контекст несёт slog depguard

Плюс шаги task gate: сборка, go vet, gofmt, тесты, гонки, покрытие изменённых строк, миграции, образцы конфига, секреты в индексе, данные о здоровье в индексе.

Непойманное место механизации означает, что проход по конвенциям будет добросовестно проверять уже проверенное.