Repository navigation
fix(sync): prevent pending board deletions from being resurrected - #206
Merged
Merged
Conversation
- When a fetched clip names a board with a pending local deletion, re-queue the clip so its next upload removes the stale board reference from the server copy. - Document that skippedAsStale also counts records beaten by a pending deletion. - Assert the re-queue in the fetched-page regression test and describe it in the board deletion sync notes. - Add an Unreleased Fixed changelog entry.
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.
Finding
A locally deleted board remains tombstoned until its remote deletion is acknowledged. In that interval, a fetched board record or a clip carrying the old board membership could recreate it. The clip receive path already respected pending deletions; the board receive paths did not.
Correction
Regression evidence
Source and integration
Base: main at ccc4403.
Head: d73b54b.
Verified local/uploaded tree: c06b79c82faa51314a7de08a224bcea8c2ea85de.
All open Gancho PR file lists were inspected before editing. No existing PR addresses these board receive paths. #200 touches SyncLocalStore.swift only in separate blob-ownership hunks; this PR remains independently main-based. No combined native integration with other open repairs is claimed.
Limits
This temporary guard lasts only while the existing pending tombstone exists. It does not add permanent deletion history, promise cross-zone ordering after acknowledgement, or retroactively repair boards resurrected before this change.
No live user data, UI flow, schema, dependency, coverage threshold, workflow, credential, permission, merge, release or deployment changes.
CI follow-up
The first run, 37725090341 on 6eb9074, passed strict swift-format and portable/metadata gates, then failed SwiftLint on the new placeholder test's empty-string comparison. Package tests had not run. The forward-only follow-up uses isEmpty with the same assertion semantics; no behavior, gate, test coverage or threshold was weakened. The complete new-head native run below passed.
While this PR was being checked, #194 merged into main at 577036f. A fresh source merge with that main and a separate source merge with #200 at fc98aad are conflict-free. Those source-only checks did not qualify native integration. The completed CI below subsequently tested the merge with main at 577036f; combined native integration with #200 remains untested.
Exact-head native qualification
CI 37726317091 completed successfully for d73b54b. Checkout logs confirm synthetic merge 04ab326, combining this exact head with main at 577036f.
Scoped implementation and validation are complete. The PR remains a draft for human review. No separate full UI workflow was dispatched because no UI flow changed; no merge, release or deployment occurred.