Skip to content

feat(calendar): opt-in durable UUID recovery for private Google Calendar projections - #2293

Open
martin-forge wants to merge 4 commits into
callumalpass:mainfrom
martin-forge:martin-forge/google-calendar-projection-uuid-recovery
Open

feat(calendar): opt-in durable UUID recovery for private Google Calendar projections#2293
martin-forge wants to merge 4 commits into
callumalpass:mainfrom
martin-forge:martin-forge/google-calendar-projection-uuid-recovery

Conversation

@martin-forge

@martin-forge martin-forge commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Problem

Google task events can go missing, duplicate, or link to an old path after task files move or the local event index is lost. A damaged or missing task file must not make recovery delete its Calendar event.

Solution

Add an optional Rebuild private task projections setting, off by default. Exported tasks receive a persistent UUID. Startup and the existing recovery loop use it to repair event links, missing events and stale details.

Cleanup requires a readable task with the same UUID and either a retirement marker or an identical surviving event. Missing IDs and unreadable files preserve events. The same check protects queued retries, and deletion refuses a provider revision that changed after verification. Unrelated and invited events remain untouched.

Testing

  • 30 recovery and provider-safety tests pass, including damaged files, retries, retirement, differing duplicate content and changed provider revisions.
  • Lint and build:test pass. Live Obsidian checks against disposable Google events confirm that malformed frontmatter and missing task IDs preserve the events.
  • Two local filtering/locale failures also reproduce on the unchanged parent branch.
  • GitHub CI passed: tests, lint, type checks and build.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant