## Why

Read API обязан уметь сворачивать метрику к запрошенной сетке, а род свёртки
(сумма или среднее) HAE не присылает: `Avg`/`Min`/`Max` есть только у
`heart_rate`, всё остальное приходит в `qty` (находка 40), заголовок доставки
про род молчит, а единицы врут на краях. Просуммировать мгновенную метрику или
сложить нижний слой HAE значит завысить ответ втрое — поэтому род измеряется
**до** Read API, а не угадывается внутри него.

Второй пробел того же размера: потребитель не может спросить «что у тебя вообще
есть». Слои и их диапазоны — часть контракта (после пересборки старый период
законно теряет верхние слои), и узнать их сегодня можно только через sqlite на
хосте.

## What Changes

- **Род агрегации измеряется сверкой минутного и часового слоёв между собой**:
  часовое значение сходится с суммой минутных — метрика накопительная, с
  арифметическим средним — мгновенная, ни с тем ни с другим или свидетельства
  противоречат — `unknown`. Измерено на живом архиве (123 доставки, 31 метрика):
  17 метрик классифицируются, 14 остаются `unknown`, **противоречивых
  свидетельств ноль**.
- **Нижний слой (`raw`) в измерении не участвует и не суммируется никогда** — он
  посекундная развёртка, а не сэмплы (находка 34).
- **Новая ручка `GET /api/v1/metrics`** — каталог: по каждой метрике единицы,
  измеренный род с основанием измерения и список слоёв с диапазонами и числом
  точек. Первый маршрут под токеном чтения; появляется проверка этого токена.
- **Род нигде не хранится**: он производен от витрины и считается на запрос по
  ограниченному окну. Ни новой колонки, ни строки в перечне того, что не
  переносит пересборка.
- Схема получает **только индекс** (`00009`): разрезы и границы обязаны
  отвечать, не разжимая содержимое объектов. Само измерение содержимое читает —
  иначе сумму минутных значений не получить, — но не больше `2 × 48` объектов на
  метрику и одной транзакцией чтения на весь ответ.
- Тай-брейк при равной полноте точек **в этой задаче не меняется** — вынут
  блокером: род измеряется из витрины, а витрина есть результат слияния, и
  правило слияния, читающее собственную выдачу, повторяет дефект вывода слоя из
  журнала ревью.

## Capabilities

### New Capabilities
- `catalog`: каталог разрезов и измеренный род агрегации — что за метрики есть,
  в каких слоях, за какие периоды и какая свёртка по ним осмысленна.

### Modified Capabilities
- `storage`: каталог отвечает по учётным полям объекта, не разжимая `payload`;
  отсюда требование к стоимости выборки разрезов.

## Impact

- Новый пакет `internal/catalog` — измерение рода и сборка каталога.
- `internal/store` — выборка разрезов метрики и общих часов двух слоёв.
- `internal/hae` — единственное место, знающее, какое поле точки несёт число.
- `internal/httpapi` — маршрут каталога и проверка токена чтения.
- `internal/store/migrations/00009_bucket_catalog.sql` — покрывающий индекс.
- Документация: `architecture.md` (метод измерения и отвергнутые чужие решения),
  `database.md` (индекс), `local-research.md` (находка о результате измерения),
  `config.example.toml` (read_tokens перестали быть заделом на будущее).
