раскладка av-dev повышена с канона 12 до версии 5

- три плагина слились в один `av-dev`: служебные `docs/.docs.json` и
  `tasks/.tasks.json` заменены на `.av-dev.toml` в корне, в гейте переехали пути
  трёх скриптов, вызовы скиллов переименованы по всему репозиторию
- тип задачи `goal` и `ROADMAP.md` упразднены: семь целей закрыты с причинами,
  теги сняты, объявлена стадия `support`
- метка `small`/`medium`/`large` снята из процесса — вместо «Триггеров метки» в
  review.md подраздел «Когда звать глубокое ревью»; следом разобран урожай
  doc-consistency: девять фактов сведены к одному дому
This commit is contained in:
av
2026-09-02 09:55:28 +03:00
parent fc9a3b4066
commit 3bce73fc34
68 changed files with 178 additions and 327 deletions
+1 -1
View File
@@ -9,7 +9,7 @@
перечень «Механизировано» ниже. Причина: файл на несколько сотен строк
размазывает внимание по тривиальному — и модель, и человек добросовестно
проверят именование и не дойдут до формы решения. Процедура промоута —
`references/promote.md` скилла `av-dev-pipeline:review-pipeline`.
`references/promote.md` скилла `av-dev:code-review`.
Обоснование «почему именно так» живёт в [../adr/](../adr/README.md); инварианты
с severity — в [CLAUDE.md](../../CLAUDE.md).
+9 -9
View File
@@ -39,16 +39,16 @@
## Прочее
- Enum-поля (`state`, `kind`, …) — обычный `TEXT` без `CHECK`; допустимые
значения держит код (`internal/store`).
- Временные метки — `TEXT` в **RFC 3339, UTC (суффикс `Z`)**, напр.
`2006-01-02T15:04:05Z` (секундная точность). Фиксированная ширина сохраняет
лексикографическую сортировку TEXT = хронологию (`ORDER BY created_at`).
Единая точка генерации — приложение: `store.Now()` + `store.FormatTime`/
- Enum-поля — обычный `TEXT`/`INTEGER` без `CHECK`; допустимые значения держит
код (`internal/store`). Какие именно поля — [../database.md](../database.md) →
«Индексы и ограничения».
- Временные метки пишет приложение: `store.Now()` + `store.FormatTime`/
`ParseTime` (аналогично `ident.NewID` для id), а не дефолт в схеме — так
забытая вставка падает громко. Измерение длительности — не метка времени: у
внешних вызовов его засекает `logging.StartCall`. Таймзона отображения в
UI — конфиг `[general].timezone`.
забытая вставка падает громко. Формат и точность хранения —
[../database.md](../database.md); фиксированная ширина там выбрана затем, чтобы
лексикографическая сортировка TEXT совпадала с хронологией. Измерение
длительности — не метка времени: у внешних вызовов его засекает
`logging.StartCall`. Таймзона отображения в UI — конфиг `[general].timezone`.
- Миграции — goose (`internal/store/migrations`): SQL-файлы для DDL;
Go-миграции (`goose.AddMigrationContext`) — когда нужен код (генерация
id, backfill). При изменении структуры обновляем ER-схему
+12 -7
View File
@@ -219,12 +219,16 @@ Go-ошибки логируем как атрибут, не как текст
## Безопасность: что не логируем
Никаких секретов в полях и сообщениях. Под запретом:
Никаких секретов в полях и сообщениях. Состав секретов —
[CLAUDE.md](../../CLAUDE.md) → «Инварианты», строка «Секреты не попадают в логи,
диагностику и ответы API»; здесь он не дублируется.
- учётные данные qBittorrent (логин/пароль, cookie сессии);
- API-ключ и токен LLM-провайдера, `Authorization`-заголовки;
- ключи TMDB/TVDB и прочих метабаз;
- содержимое аутентификационных параметров magnet/трекеров.
Специфичные для логов **носители** секрета, которых в инварианте нет:
- cookie сессии qBittorrent;
- заголовки `Authorization`;
- аутентификационные параметры magnet и трекеров;
- URL внутри `*url.Error` (см. ниже).
Дополнительно:
@@ -246,8 +250,9 @@ Go-ошибки логируем как атрибут, не как текст
- Пишем JSON в `stdout` одним потоком; сбор и ротацию делает окружение
(docker/journald). Не маршрутизируем по файлам.
- Базовый уровень в проде — `INFO`; `DEBUG` включается через конфиг/env при
необходимости. dev — `DEBUG`.
- Базовый уровень в проде — `INFO`; `DEBUG` включается полем `level` секции
`[log]` в `config.toml` — env для конфига не используется
([config.md](config.md)). dev — `DEBUG`.
## Анализ