добавлен словарь категориальных значений HAE → коды HealthKit

- фазы сна, контекст пульса и имена тренировок попадают в реестр
  `category_value` (миграция 00010): строка хранится дословно, выведенный код
  лежит рядом отдельной записью, а не полем внутри точки
- словарь и синонимы кодов живут в бинаре (`internal/healthkit`); локаль из
  `Accept-Language` сужает поиск, но в ключ реестра не входит — заголовков в
  сыром архиве нет
- наблюдение входит в отпечаток витрины, выведенный код — нет: он производная
  от словаря, а не от журнала
This commit is contained in:
av
2026-08-04 07:32:19 +03:00
parent eb3fca77ee
commit 1b649ba3d5
40 changed files with 4317 additions and 42 deletions
+12 -3
View File
@@ -79,8 +79,12 @@ type Report struct {
// Workouts и Records — остальные единицы хранения витрины. Считаются рядом
// с объектами потому, что отпечаток отвечает «да/нет» за витрину целиком, а
// решение о подмене базы необратимо и требует направления расхождения.
Workouts int64
Records int64
Workouts int64
Records int64
// Categories — строки реестра категориальных значений: четвёртая единица
// хранения витрины. Без счётчика расхождение по ней безадресно — объекты,
// тренировки и записи при этом не меняются вовсе.
Categories int64
Fingerprint string
// Canceled — проигрывание прервано отменой, а не дошло до конца.
@@ -184,6 +188,10 @@ func Run(ctx context.Context, o Options) (Report, error) {
if err != nil {
return stopOr(rep, err)
}
rep.Categories, err = o.Target.CountCategoryValues(ctx)
if err != nil {
return stopOr(rep, err)
}
rep.Fingerprint, err = o.Target.Fingerprint(ctx)
if err != nil {
return stopOr(rep, err)
@@ -207,7 +215,8 @@ func Run(ctx context.Context, o Options) (Report, error) {
"entities_diverging", rep.EntitiesDiverging,
"buckets", rep.Buckets,
"workouts", rep.Workouts,
"records", rep.Records)
"records", rep.Records,
"category_values", rep.Categories)
return rep, nil
}