Files
healthlog/docs/tasks/items/categorical-value-dictionary.md
T
avandClaude Opus 5 a53d0f0f2f задачи: мета переехала в блок, поле «Хук» стало «Зачем»
49 файлов, миграция сделана командой tasks.py check --fix — той самой, ради
которой в скрипте оставлена читаемость старой формы. Побочно тот же прогон
проставил тег decomposed целям, у которых есть задачи: это его штатная работа.

check после миграции зелёный, индексы согласованы.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 17:31:29 +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.