Files
healthlog/docs/tasks/items/categorical-value-dictionary.md
T
av d79189be18 docs: документация переведена на канон av-dev-pm
- беклог и план переехали в docs/tasks (38 задач, 11 целей), слаги
  переименованы с транслита на английские, 85 ссылок поправлены
- conventions.md разобран в docs/conventions/, local-research.md — в
  docs/research/, review-journal.md — в docs/review.md с разделом настройки
  конвейера; заведены security.md, adr/ и .pm.json
- шаг docs.py check добавлен в task gate; поведение в architecture.md помечено
  девятью маркерами долга, database.md получил настройки с числовым значением
2026-08-03 17:14:53 +03:00

3.2 KiB
Raw Blame History

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

Секция: ядро · Хук: Фазы сна и типы тренировок приходят строками русской локали — с экспортом Apple их не сверить · Теги: goal:parsing-and-storage

HAE отдаёт перечислимые значения строками локали телефона: «БДГ», «Сидячий образ жизни», «В помещении Ходьба». Родной экспорт Apple при этом говорит кодами (HKCategoryValueSleepAnalysisAsleepREM) — источники несопоставимы (находка 37).

Три следствия, и третье решающее: клиент угадывает словарь; смена языка телефона молча расколет историю; сверить покрытие экспортом нечем — а на этой сверке стоит устаревание нижнего слоя.

Решение (вариант «б»): строка хранится дословно, рядом кладётся выведенный код. Словарь ключуется парой (локаль, строка), локаль берётся из Accept-Language. Незнакомая строка → пустой код, а не догадка.

Словарь фаз сна уже выведен сопоставлением потока с экспортом за тот же период (находка 43) — составлять руками не нужно:

Основная → AsleepCore    Бодрствование → Awake    БДГ → AsleepREM
Глубокий → AsleepDeep    В кровати → InBed        Во сне → AsleepUnspecified

Тем же способом добираются heart_rate.context и типы тренировок.

Осложнение, всплывшее на истории экспортов: коды тоже не вечны. Одни и те же записи сна приезжают как …Asleep в экспорте 2021 года и как …AsleepUnspecified в экспорте 2026-го: Apple переименовала значение и переписывает историю при выгрузке (находка 43). Значит словарь должен переживать переименование самих кодов, иначе после обновления iOS история расколется вторично — уже на «стабильной» стороне. Простейшее решение: хранить код как есть, а эквивалентность старых и новых имён держать отдельной таблицей синонимов.

Готово, когда фазы сна из потока и из экспорта Apple сравниваются напрямую, а /stats показывает строки, для которых кода ещё нет.

stateOfMind в словаре не нуждается — он и так шлёт коды HealthKit.