Make unread Web Push use the production notification contract #565

Closed
opened 2026-08-11 10:50:36 +00:00 by timmy · 0 comments
Owner

Problem

Unread Web Push is wired to a field that the production Gitea adapter never returns. gitea_proxy.notification_page() normalizes each thread as id, while both dispatch and subscription baselining read notification_id. Production polls therefore derive no update IDs and send nothing, while synthetic push tests remain green.

User impact

Operators who enable notifications should actually receive privacy-safe alerts for new unread Gitea updates, without replaying updates that existed when the device subscribed.

Acceptance criteria

  • A production-shaped Gitea notification normalized by notification_page() dispatches exactly one deep-linked Web Push.
  • Subscription baselining records production-shaped existing unread IDs and does not replay them.
  • Later unread IDs dispatch once; malformed/non-positive IDs are ignored.
  • Payloads remain generic and privacy-safe.
  • Focused and full test suites pass.

Non-duplication

Reviewed 285 historical issue titles, 276 PR titles, six open issues, zero open PRs, releases through v0.1.0-rc.748, and recent history through 92b0fd5. Existing Web Push issues #549/#551/#553/#557/#561/#563 do not address the adapter/dispatcher id contract mismatch or test the end-to-end production shape.

## Problem Unread Web Push is wired to a field that the production Gitea adapter never returns. `gitea_proxy.notification_page()` normalizes each thread as `id`, while both dispatch and subscription baselining read `notification_id`. Production polls therefore derive no update IDs and send nothing, while synthetic push tests remain green. ## User impact Operators who enable notifications should actually receive privacy-safe alerts for new unread Gitea updates, without replaying updates that existed when the device subscribed. ## Acceptance criteria - A production-shaped Gitea notification normalized by `notification_page()` dispatches exactly one deep-linked Web Push. - Subscription baselining records production-shaped existing unread IDs and does not replay them. - Later unread IDs dispatch once; malformed/non-positive IDs are ignored. - Payloads remain generic and privacy-safe. - Focused and full test suites pass. ## Non-duplication Reviewed 285 historical issue titles, 276 PR titles, six open issues, zero open PRs, releases through v0.1.0-rc.748, and recent history through `92b0fd5`. Existing Web Push issues #549/#551/#553/#557/#561/#563 do not address the adapter/dispatcher `id` contract mismatch or test the end-to-end production shape.
timmy self-assigned this 2026-08-11 10:50:36 +00:00
timmy closed this issue 2026-08-11 10:57:49 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: stackchain/stackchain-dashboard#565
No description provided.