You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
notificationStore.updatePreferences starts every save immediately. The API carries no expected revision, and NotificationPreferenceConfiguration does not configure UpdatedAt or another field as a concurrency token. Two saves from one client can therefore commit or settle in an order different from the user’s submissions.
This is a source-backed follow-up to #3339 / PR #3340. It should be implemented as a stacked child only after the parent’s read/session ownership contract is stable.
Reachable race
Submit preference set A.
Before A settles, submit preference set B.
Both PUT requests run concurrently against the same unique user preference row.
Server commit order and HTTP response order are unconstrained.
The client assigns every response to preferences, so an older intent can finish last and appear authoritative. The persisted server row may also reflect the opposite order from the UI.
There is no request version or If-Match field to resolve this after the fact.
Expected contract
One preference-mutation lane preserves submission order for this client.
The first save starts transport immediately; later saves wait for their predecessor.
A failed predecessor does not cancel the next submitted save.
Queued saves hold truthful loading ownership from submission through settlement.
Exact-head frontend/full CI and independent review pass.
Boundaries
No automatic retries, backend schema change, cross-device ordering claim, or notification-feature expansion. Keep this separate from mark-all/read semantics and reminder/email epic #2010.
Summary
notificationStore.updatePreferencesstarts every save immediately. The API carries no expected revision, andNotificationPreferenceConfigurationdoes not configureUpdatedAtor another field as a concurrency token. Two saves from one client can therefore commit or settle in an order different from the user’s submissions.This is a source-backed follow-up to #3339 / PR #3340. It should be implemented as a stacked child only after the parent’s read/session ownership contract is stable.
Reachable race
preferences, so an older intent can finish last and appear authoritative. The persisted server row may also reflect the opposite order from the UI.There is no request version or
If-Matchfield to resolve this after the fact.Expected contract
This client queue does not solve cross-device concurrency. A future server-side revision contract may still be warranted.
Acceptance
Boundaries
No automatic retries, backend schema change, cross-device ordering claim, or notification-feature expansion. Keep this separate from mark-all/read semantics and reminder/email epic #2010.