29c676fcf8
Audit v2 silent breakage / standing rule violation (feedback_offline_first_for_server_writes): RequestsRepository.cancel was direct REST with no queue fallback. Tap cancel offline and the user's intent vanishes. Now mirrors the unflag / appendTrack / requestCreate pattern: REST on the happy path, MutationKind.REQUEST_CANCEL enqueued on IOException. Replayer's existing AuthStore.sessionCookie trigger drains it on the next signed-in transition. Repository signature changed from `suspend fun cancel(id): RequestRef` to `Pair<CancelOutcome, RequestRef?>` so callers can distinguish synced vs queued (RequestsViewModel ignores the distinction for now; optimistic removal already reflects the user's intent and the post-replay refresh surfaces the canonical row). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>