mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 12:32:43 +00:00
Both wearables wrote their period days with a bare create and so skipped the seam every other cycle writer goes through: a first bleeding day never opened its cycle and no day was attributed to one. An account whose periods came from a watch or a ring held day-logs only, with no cycle start, no lengths and no forecast. The create now goes through one shared helper that keeps the create-only-if-absent rule and then runs the same attribution and `ensureCycleForBleedingDay` inference as the shared upsert. The hourly legs and the newest-first Garmin backfill both use it; a finished Garmin period also stamps its last day on a cycle that has no period end yet. Rows imported before this change are repaired by a one-shot job sent from boot discovery while candidates exist. It opens or attributes cycles oldest first per account, touches no day-log content, and converges to an empty candidate set. Refs #1333