diff --git a/README.md b/README.md index ad44ccd..07c0c36 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,17 @@ iPhone ──HTTPS POST──► healthlog ──► журнал доставо ## Состояние -В разработке. Готовы шаги 1–2 из 11: сервис принимает пакеты и складывает их в -сырой архив. Разбора, хранилища и read API ещё нет — план в -[docs/plan.md](docs/plan.md). +В разработке. Готовы шаги 1–2 из 11 и большая часть шага 3: сервис принимает +пакеты, складывает их в сырой архив и **разбирает метрики в часовые объекты** +— с выводом слоя из данных, канонизацией содержимого и слиянием точек по +полноте. Секции, которых разбор пока не покрывает (`workouts`, `stateOfMind` — +половина потока), принимаются, хранятся и честно помечаются как неразобранные. -Разведка формата закончена: 46 находок на живом потоке, половина расходится с +Чего ещё нет: пересборки хранилища из архива (`reindex`), каталога метрик с +измеренным родом агрегации и **read API** — данные наружу пока не отдаются +никак. План в [docs/plan.md](docs/plan.md). + +Разведка формата закончена: 50 находок на живом потоке, половина расходится с документацией Health Auto Export — [docs/local-research.md](docs/local-research.md). ## Команды diff --git a/docs/plan.md b/docs/plan.md index 092276e..7e1b1f4 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -9,13 +9,22 @@ ## Ближайшая цель Метрики разбираются и ложатся в часовые объекты: тела перестали быть -недифференцированной кучей. Дальше — доразобрать остаток шага 3 -(тренировки и записи со своими `id`, `reindex`, словарь категориальных -значений) и разобрать блокеры, накопившиеся из ревью. +недифференцированной кучей. Блокеры, накопившиеся из ревью, разобраны — их в +беклоге ноль. + +Дальше — **`reindex`**, и он сейчас срочнее остального остатка шага 3. После +миграции 00005 доставки числятся `pending`, а подобрать их некому: код +пересборки не написан. Данные целы (тела в архиве, объекты в витрине), но +учёт честно говорит «этим разбором не смотрели», и так будет, пока пересборки +нет. Тем же кодом закрывается половина задачи «разнести ответ и свёртку». + +Потом — остаток шага 3: тренировки и записи со своими `id` (это половина +потока: `workouts` и `stateOfMind` принимаются и хранятся, но не разбираются), +словарь категориальных значений. Разведка закончена: правило вывода слоя, модель идентичности и формы точки проверены на живом потоке, выводы — в -[local-research.md](local-research.md), 47 находок. +[local-research.md](local-research.md), 50 находок. ## Шаги @@ -25,7 +34,9 @@ запись тела в архив, строка в `delivery`. Разбора ещё нет. ← **подключаем телефон по локальной сети** - [~] **3. Разбор и хранилище.** Метрики — сделано (`bucket`, `internal/hae`, - `internal/canon`, `internal/fold`); остались тренировки и записи со + `internal/canon`, `internal/fold`), вместе с частичным разбором: секции, + которых разбор не покрывает, перечисляются, доставка получает статус + `partial` и список непокрытых ключей. Остались тренировки и записи со своими `id`, `reindex` и словарь категориальных значений. Миграции, часовые объекты метрик (`bucket`, ключ `метрика + слой + час`) + `workout`/`record` по своим @@ -80,6 +91,10 @@ - **Ретеншен сырого архива** — удаление доставок старше последнего проверенного экспорта (не фиксированный срок: журнал не должен рваться). Пока архив не подчищается; включить после того, как разбор устоится. + Предусловие снято: статус `partial` и список непокрытых секций готовы, и + ретеншен обязан спрашивать статус, а не считать `parsed` разрешением. + Вместе с ним действует правило — задача, которая начинает разбирать секцию, + тем же изменением переводит `partial`-строки с этим ключом в `pending`. - **Порог `sealed`** — с какого возраста час считается запечатанным. Ставим по факту: сначала пишем `WARN` на изменение старых объектов и смотрим, какая глубина досчёта встречается в жизни (наблюдалось до 22 минут, находка 10).