trpc-query-used-for-write-operations-breaks-idempotency-contract
tRPC query procedures map to HTTP GET semantics and must be idempotent reads. Using a query to trigger side-effects (e.g. creating notification rows in a checkDueTomorrow query) violates the GET contract, breaks caching, and prevents correct React Query invalidation. Any procedure that writes to the database must be declared as a mutation. Additionally, a query-based reminder check only fires when a client calls it — without a cron job the reminders are never dispatched.