Preserve concurrent task edits and recover private calendar projections - #2290
Closed
martin-forge wants to merge 2 commits into
Closed
Preserve concurrent task edits and recover private calendar projections#2290martin-forge wants to merge 2 commits into
martin-forge wants to merge 2 commits into
Conversation
Contributor
Author
|
Superseded by focused, independently buildable PRs: #2291 (concurrent task edits), #2292 (OAuth/API protection), #2293 (optional Calendar recovery), #2294 (unreadable-settings startup), and #2295 (mobile Pomodoro startup). Closing this combined PR so each change can be reviewed and merged separately. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Task edits made from an older modal can restore a recurrence date or a field that an external writer has already changed. Rebase each edit on current frontmatter and publish only the requested fields and their recurrence consequences.
An opt-in Google export setting, Rebuild private task projections, assigns a durable task UUID and marks private, transparent, attendee-free provider events. The existing startup and 15-minute recovery loop can then repair renamed links, provider drift, missing events, duplicate projections and orphaned series or detached occurrences without treating the local index as authority. Ambiguous identities and incomplete source reads stop cleanup. Unchanged projections skip remote writes; managed writes use readback and conditional ETags. Existing unmarked events are adopted only through a task's explicit event binding, and unmarked events are never automatically deleted.
The patch also stops startup on unreadable existing settings, leaves saved mobile Pomodoros paused, generates a token before API/MCP listener startup, and hardens the temporary OAuth callback with an OS-assigned port, one-use state and static response pages.
Validation:
npm run lintandnpm run build:testpass.TZ=UTC npm test -- --runInBand: 4,175 tests pass; two failures reproduce unchanged on tag4.12.5: thear-SAweekend expectation inissue-782-recurrence-weekdaysand missing-value ordering infilterService.userListNormalization.The live canaries ran against stable
4.12.5plus this patch. The branch now merges currentmain; the updated branch also builds and reloads successfully in the disposable vault, and GitHub test and build checks pass. This is a proposed opt-in recovery path, with no default change to existing Google export behavior.