change razbor-metrik-v-obekty заархивирован

Дельты влиты в openspec/specs (parsing, storage), задача убрана из беклога,
план отражает сделанную часть шага 3.

Не закрыт один пункт: живая доставка с телефона не разобрана — поток молчит
с 17:13, пауза началась до перезапуска сервиса.
This commit is contained in:
av
2026-08-01 19:03:46 +03:00
parent cd7a4c1493
commit 37413bb551
11 changed files with 487 additions and 41 deletions
-1
View File
@@ -18,7 +18,6 @@
- [Судьба доставки, у которой разобрана не вся секция data](nerazobrannye-sekcii-dostavki.md) — тело с одним stateOfMind помечается parsed, а ретеншен снесёт его как разобранное
## высокий
- [Разбор метрик в часовые объекты](razbor-metrik-v-obekty.md) — Доставки копятся непрозрачными телами — точек в хранилище нет вовсе, всё остальное упирается в это
- [Тренировки и секции с собственными id](trenirovki-i-zapisi.md) — Тренировки с геотреком и состояние разума приходят, но не разбираются — без них не закрыть ни трекер, ни агента-медика
- [Пересборка хранилища из сырого архива](reindex-iz-arhiva.md) — Ошибка разбора без пересборки становится потерей данных — исправленный код не применится к уже разобранному
- [Измеренный род агрегации и каталог разрезов](rod-agregacii-i-katalog.md) — Без рода метрики свёртка в ответе неотличима от угадывания — а суммировать нижний слой значит завысить втрое
-33
View File
@@ -1,33 +0,0 @@
# Разбор метрик в часовые объекты
**Приоритет:** высокий
Приём работает, но дальше архива данные не идут: 89 доставок лежат телами
`.json.gz`, а в SQLite только строки `delivery`. Всё остальное — каталог,
Read API, MCP — стоит на этой задаче.
Правила выведены на живом потоке и проверены, изобретать заново не нужно
(`docs/local-research.md`, находки 33, 35, 36, 38, 39, 41):
- ключ точки — координаты `метрика + слой + метка`, у эпизода — `метрика + слой
+ начало + конец` (находка 47); `source` в ключ не входит;
- слой выводится из выравнивания меток: плотная метрика (≥10 точек)
классифицируется сама, редкая наследует преобладающий слой доставки;
- при столкновении выигрывает более полная точка, а не последняя пришедшая
(0.66% координат различаются набором полей, а не значением);
- три формата времени: локальное со смещением, RFC 3339 Z, Unix-эпоха внутри
`heartbeatSeries`;
- `sleep_analysis` разводится на два имени — поэпизодное и суточную сводку.
Шаги:
- миграция `bucket` (`метрика + слой + час`, payload gzip-BLOB, `sealed`);
- разбор метрик, вывод слоя, канонизация с округлением до ~12 значащих цифр;
- слияние точек в объект read-modify-write, хеш объекта как детектор изменений;
- `docs/database.md` — ER-схема (её требует шаг гейта `er-schema`).
Готово, когда по существующим доставкам собирается хранилище, суммы по часовому
слою сходятся с проверкой из `tmp/research/`, а эпизодов сна выходит 174, а не
170 (находка 47).
Связано: `docs/architecture.md` → «Хранилище», план шаг 3.
+9 -5
View File
@@ -8,13 +8,14 @@
## Ближайшая цель
Приём работает, поток настоящих пакетов копится в сыром архиве. Дальше —
разбор и хранилище (шаг 3): всё, что нужно, чтобы данные перестали быть
недифференцированной кучей тел запросов.
Метрики разбираются и ложатся в часовые объекты: тела перестали быть
недифференцированной кучей. Дальше — доразобрать остаток шага 3
ренировки и записи со своими `id`, `reindex`, словарь категориальных
значений) и разобрать блокеры, накопившиеся из ревью.
Разведка закончена: правило вывода слоя, модель идентичности и формы точки
проверены на живом потоке, выводы — в
[local-research.md](local-research.md), 46 находок.
[local-research.md](local-research.md), 47 находок.
## Шаги
@@ -23,7 +24,10 @@
- [x] **2. Приём без разбора.** `POST /api/v1/ingest`: лимит тела, gzip,
запись тела в архив, строка в `delivery`. Разбора ещё нет.
**подключаем телефон по локальной сети**
- [ ] **3. Разбор и хранилище.** Миграции, часовые объекты метрик
- [~] **3. Разбор и хранилище.** Метрики — сделано (`bucket`, `internal/hae`,
`internal/canon`, `internal/fold`); остались тренировки и записи со
своими `id`, `reindex` и словарь категориальных значений. Миграции,
часовые объекты метрик
(`bucket`, ключ `метрика + слой + час`) + `workout`/`record` по своим
`id`. Вывод слоя из выравнивания меток; развод `sleep_analysis` на два
имени (находка 38). Канонизация с округлением чисел и хеш содержимого