Skip to content

From time to time when syncing I see some old tasks, shortly disappears after clicking Sync - #50

Merged
wdembinski merged 4 commits into
developmentfrom
fix/from-time-to-time-when-syncing-i-see
Sep 19, 2026
Merged

wdembinski merged 4 commits into
developmentfrom
fix/from-time-to-time-when-syncing-i-see

Conversation

@wdembinski

Copy link
Copy Markdown
Owner

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.

wdembinski and others added 4 commits September 18, 2026 17:16
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
@wdembinski
wdembinski merged commit c18e084 into development Sep 19, 2026
4 checks passed
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