Files
healthlog/docs/tasks/items/workout-identity-on-import.md
T
av 3d24248075 docs: документация приведена к канону av-dev-pm 4
- каждая запись каталога задач получила тип вместо тега kind: и префикса
  заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок
  секций канонический
- поправлены протухшие факты: нереализованные маршруты Read API, MCP и
  `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию
  диффа, периметр перестал дублировать security.md
- замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек
  storage и parsing
2026-08-05 19:09:35 +03:00

3.5 KiB
Raw Blame History

Не задваивать тренировки при импорте родного экспорта

  • Тип: feature
  • Категория: Ядро
  • Зачем: В export.xml у тренировки нет id — импорт снапшота задвоит тренировки, приехавшие от HAE
  • Теги: goal:native-export-import

Тренировка в витрине адресуется своим id из HealthKit — его шлёт HAE. В export.xml этого идентификатора нет вовсе: у элемента Workout только тип, источник, даты и статистика. Значит healthlog import не сможет сопоставить тренировку из снапшота с той же тренировкой, уже приехавшей от HAE, и они задвоятся.

Это ровно та дыра, что была у точек, и там её закрыли ключом start + end (находка 47): HKObject.uuid в выгрузку не попадает, поэтому модель идентичности обязана выражаться через интервал.

Prior art: dogsheep/healthkit-to-sqlite адресует тренировку хешем содержимого (hash_id в sqlite-utils) — ровно потому, что идентификатора в экспорте нет. Нам это не подходит в лоб: у нас половина тренировок уже лежит под настоящим id, и хеш содержимого дал бы третий ключ рядом с двумя.

Варианты, которые надо будет сравнить:

  • Второй уникальный ключ (start_utc, end_utc) у тренировки: импорт ищет по нему, HAE — по id. Цена: индекс и вопрос, что делать при столкновении двух разных тренировок с одним интервалом (бывает ли такое — неизвестно).
  • Сопоставление на стадии импорта, без изменения схемы: импорт читает уже сохранённые тренировки за период и приписывает найденным их id. Цена: логика сопоставления живёт в импорте и не проверяется ничем, кроме него.
  • Считать тренировки из экспорта отдельным родом и не сопоставлять вовсе. Цена: потребитель видит две тренировки вместо одной и обязан схлопывать сам — ровно то, чего проект старается не делать.

Решать до появления формы healthlog import значит угадывать: неизвестно, понадобятся ли тренировки из экспорта вообще (у HAE они полнее — с маршрутом и рядами, а в экспорте маршрут лежит отдельными GPX).

Связано: docs/architecture.md → «Тренировки и прочие секции», задача apple-export-import.

Двигает строку «Завершения» цели: «Тренировки из экспорта не задваивают приехавшие от HAE».