Repeated Contacts syncs must never create duplicate birthdays. Enforce it on the server, independent of the client's reconcile: - POST /local/events is now idempotent on external_uid: if an event with the same (calendar_id, external_uid) exists, update it in place instead of inserting a new row - startup cleanup removes existing duplicates sharing the same (calendar_id, external_uid), keeping the earliest — auto-heals old data - unique DB index on (calendar_id, external_uid) as a hard guarantee external_uid is the stable "contact:<deviceId>:<contactId>", so the same contact from the same device always maps to exactly one event. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 KiB
25 KiB