From time to time when syncing I see some old tasks, shortly disappears after clicking Sync - #50
Merged
wdembinski merged 4 commits intoSep 19, 2026
Conversation
A large, query-unchanged share of on-board cards missing from a sync's own results (not the tracker's self-reported total/isLast, which lie exactly here) is now treated as an incomplete answer: nothing is removed, quietly — through the same funnel choke point a truncated fetch already uses — rather than letting a clean-looking per-key confirm pass overrule a broadly under-answering instance. Adds isIncompleteAnswer() to the shared removalGuard, wires it into both reconcileJiraTasks and reconcileGitHubIssues, and updates the tests that previously exercised this shape as a loud guard refusal. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The JIRA notice bar (truncated fetch, incomplete answer, paging artifacts, or a genuine guard refusal) repeated itself on every poll for as long as the underlying condition held, undoing a dismiss within one sync interval and never explicitly clearing once the condition went away. It already only ever reached the warning (yellow) surface, never the error bar — confirmed, not changed. The background poller now only pushes board:notice when the message actually changes from what it last sent, and an empty text tells the renderer to clear a stale bar once the warning resolves. A manual sync still always reports the current truth, unaffected by the poller's dedupe. Also implements the confirm-pass skip described but not built at ipc.ts: after the removal guard refuses, the next sync skips the by-key confirm pass unless the query changed, since an unconfirmed key is already kept either way. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Unit: jiraSync.test.ts / githubIssueSync.test.ts now prove the loud
guardRemovals refusal ("Kept X of Y... Check the board's JQL") is
unreachable through either reconciler for a query-unchanged shortfall —
isIncompleteAnswer's missingCount is always >= the candidate count
guardRemovals would see, so whatever would trip the loud guard already
tripped the quiet one first. A determinism test locks in the precondition
ipc.ts's string-equality notice dedupe relies on, and a direct guardRemovals
call reproduces the user's own "Kept 52 of 82 JIRA cards..." message
verbatim, showing the fix is upstream of that function rather than a
softening of it. Both additions are proven able to fail: reverting the
incompleteAnswer short-circuit in drop() turns 6 (jiraSync) and 3
(githubIssueSync) of them red.
Scenario: scripts/verify-incomplete-jira-answer.mjs drives the real
reconcileJiraTasks against a real SQLite store across a pair of polls (one
under-answer, one full answer) and asserts no card is ever archived across
them. Since ipc.ts's notice-dedupe (jiraGuardRefused / lastJiraNotice /
dedupeNotice) lives only in registerIpcHandlers's closures — which that
file's own docstring says are deliberately never harnessed — the ~6-line
dedupe condition is mirrored the same way verify-jira-move.mjs mirrors
transitionIssue, and proven against the real reconciler's output: one quiet
notice on the first under-answer, nothing repeated on an identical second
poll, and a clearing empty notice once JIRA recovers. A genuine query
change is also driven through the same store to confirm turnover still
works normally. Reverting the same drop() short-circuit turns 3 of its
checks red and reproduces the loud refusal text live.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…to-time-when-syncing-i-see # Conflicts: # apps/client/src/main/ipc.ts # apps/client/src/main/jira/jiraSync.test.ts
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.
I noticed that some previous tasks or unpinned from the board/sprint (in the JIRA for example) keep appearing when Task Manager syncs. Then when I click manually Sync button, they disappear and the board shows correct state.