iOS Safari kills fetch requests when the app goes to background or
the connection drops during large uploads, producing 'load failed'.
The sync engine was burning through all 5 retries instantly with no
delay, so a transient failure became permanent.
Changes:
- Add AbortController timeout (120s) on upload fetch
- Add exponential backoff between retries (2s, 5s, 10s...60s)
- Increase max retries from 5 to 15 for flaky mobile networks
- Remove 10MB resize step that was re-compressing photos already
sized at capture time, avoiding extra memory pressure on iOS
- Log photo size with each upload attempt for easier debugging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>