Skip to content

Personal build: keep unread completion counts on the app icon until threads are viewed #3

Closed

Description

@iXab3r

Personal-build change

Keep a numeric app-icon badge for completed, unread top-level threads until each corresponding thread is viewed, like Codex. Focusing T3 alone must not acknowledge other threads. This is a personal fork patch layered onto the existing notification feature.

Expected behavior

  • Five completed unread threads show 5; viewing one reduces the count to 4.
  • Count is derived from existing completion/read state across connected environments, including on startup/reconnect, rather than transient notification delivery.
  • New work, read acknowledgement, settlement, snooze, archive, deletion and environment removal update the count consistently; hidden child threads are not counted separately.
  • Preserve existing sounds, popups and attention notifications; deduplicate any notification and unread-completion contribution for the same thread.
  • Desktop native badge and web favicon share the behavior. Mobile native badging is outside this desktop/web personal patch.
  • Focused regression tests cover focus retention, per-thread acknowledgement and lifecycle changes.

Analysed upstream references

The separate pending-question visibility bug (pingdotgg#25806 / pingdotgg#26435) is background context and is not part of this patch.

Activity

  1. iXab3r commented on Oct 31, 2026

    @iXab3r
    OwnerAuthor

    Implemented in commit 8a145e9bcd on branch bugfix/persistent-unread-completion-badge.

    The desktop native icon and web favicon now combine persistent completed-unread threads with the existing background-notification count, deduplicating each thread. App focus still acknowledges transient notifications, while unread completions remain until their corresponding visit watermark advances. The count is reconstructed from connected environment snapshots, works with notifications disabled or permission denied, includes never-opened completions, and respects the local visit fallback for older servers. Restarted, archived, deleted, settled, snoozed and hidden child threads leave the completion count.

    Verification:

    • Regression tests failed before the implementation: native focus forced zero; the browser coordinator lost completions on focus and did not reconstruct them from snapshots.
    • 30 focused tests pass: vp test run apps/web/src/components/ThreadNotificationCoordinator.badge.browser.test.ts apps/desktop/src/ipc/methods/notificationBadge.test.ts apps/web/src/components/ThreadNotificationCoordinator.logic.test.ts. Covers independent per-thread acknowledgements, focus retention, multiple environments, notification deduplication, permission/settings independence, lifecycle changes, unvisited completions and legacy local visits.
    • Two targeted React Compiler cases pass: vp test run apps/web/src/reactCompilerCoverage.test.ts -t ThreadNotificationCoordinator.
    • Scoped desktop/web/scripts typechecking, changed-file lint/format, knip and git diff --check pass. The commit hook also passed the repository's knip:check.
    • check:changed HEAD itself could not spawn vp child commands through this Windows installation's vp.cmd; its relevant checks were run directly instead.

    Scope: renderer logic shared by web/desktop and Electron's Windows/macOS/Linux badge handlers. Provider protocols, server contracts and native mobile behavior are unchanged. Chromium coordinator tests ran in a real headless browser; Electron platform dispatch/focus tests use mocked native APIs. A full application UI pass and native taskbar/Dock placement were not verified. No installer or personal release has been built or installed yet.

    The branch is pushed and ready to integrate into the personal build. Keeping this issue open until that integration/release.

    Model: GPT-6.1 Sol, high reasoning effort. Harness: Codex in T3 Code.

  2. iXab3r commented on Oct 31, 2026

    @iXab3r
    OwnerAuthor

    Merged into personal via #4 (merge commit 50e2ac8). Rebased onto the latest personal branch, retained the reconnect notification fix, and added coverage for unread counts through cached state. Author source review found no blocking issues; 34 focused tests, scoped typechecks and the other documented local checks passed. This records source integration; a new packaged personal release and native taskbar placement have not been verified here.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions