- `GET /api/v1/metrics/{name}?from&to&layer` — ряд точек за период; конверт
объявляет слой, измеренный род, его применимость к отданному ряду и границу
окна измерения, а сам ряд собирается из одного слоя, выбранного по охвату
точек внутри периода
- use-case вынесен в `internal/points`, чтение — одним входом `store.ReadSeries`
под одной транзакцией; правило выбора слоя остаётся в домене и приходит в
хранилище колбэком
- `writeJSON` перестал экранировать HTML-символы и перестал глушить отказ
записи: дословность содержимого точки иначе не удерживается, а оборванное
тело уходило под видом успешного `200`
5.5 KiB
5.5 KiB
Журнал решений
Одна запись — одно решение. ADR это промоут поверх архивного design.md,
а не второе сочинение: запись цитирует решение и ссылается на
openspec/changes/archive/<id>/design.md.
Когда заводить
Верно одно из трёх:
- дорогой откат — переделка стоит дороже переписывания одного файла;
- намеренный отказ от очевидного подхода;
- пересмотр прежнего решения — тогда у старой записи обязателен статус «заменено на».
Не заводить для рутины и для того, что видно из кода и git log.
Соглашения
- Имя файла —
ADR-ГГГГ-ММ-ДД-slug.md, слаг английский, дата — когда решение реально принято. - Записи неизменяемы: передумали — новая запись, старой ставится статус.
- Активная запись статуса не имеет. Значений два:
заменено на ADR-…иустарело; ставятся полем меты записи —- **Статус:** …рядом с датой и источником, а не абзацем в теле.
Записи
Новые сверху.
| Дата | Запись | Статус |
|---|
- ADR-2026-08-04-otvet-tochek-nesyot-rod-i-ego-primenimost
— конверт точек несёт измеренный род, его применимость к отданному ряду и
границу окна измерения; строка
"aggregation": "sum"пересмотрена, полеappliedотвергнуто как выводимое; род вместе с данными взят у Google Cloud Monitoring и CloudWatch, отдельный/metadataPrometheus отвергнут. - ADR-2026-08-04-sloy-vybiraetsya-po-ohvatu-tochek — «самый мелкий слой, покрывающий весь диапазон» пересмотрено: правило было неопределено на законном входе. Охват меряется метками точек, а не часами объектов, иначе период короче часа отдаёт пустой ряд при непустых данных; цена меры измерена (13.9 мс против 0.026 мс) и потребовала одного словаря слоёв.
- ADR-2026-08-04-forma-provoda-prinadlezhit-transportu
— публичный контракт чтения объявляет транспорт, а не домен; «доменные типы и
есть форма провода» (
wtf, Prometheus) отвергнуто фактом — поляstore.Pointне совпадают с обещанным проводом точек ни одним именем;apidiffкак сторож отвергнут: сменыjson-тега он не видит вовсе. - ADR-2026-08-04-novizna-sekcii-vyvoditsya-iz-zhurnala
— признак «секция встречена впервые» выводится запросом к журналу; реестр по
образцу
category_valueотвергнут как вторая копия факта, с названным условием пересмотра — ретеншен архива. - ADR-2026-08-04-tie-break-po-poryadku-zhurnala — тай-брейк точек при равной полноте: побеждает пришедшая, то есть правило становится явной функцией порядка журнала; хранимая метка провенанса (LWW-Register) отвергнута по цене формата и миграции.
- ADR-2026-08-03-kod-ryadom-so-strokoj-reestrom — код HealthKit кладётся реестром рядом со строкой, а не полем внутри точки; словарь живёт в бинаре, выведенный код в отпечаток витрины не входит.
Сырьё для промоута накоплено — архивные изменения в
openspec/changes/archive/, из них решения с дорогим откатом и намеренные
отказы есть как минимум в 2026-08-01-polnota-tochki-mnozhestvom-klyuchey
(идентичность точки и тай-брейк), 2026-08-02-reindex-iz-arhiva (подмену базы
делает человек) и 2026-08-02-cena-chitayushchego-marshruta (чекпойнт WAL по
таймеру). Промоут делает скилл av-dev-pm:docs, а не переезд: адаптация
раскладки содержания не сочиняет.