The sync engine was adding per-photo backoff delays (2-60s) inside
the processing loop, during which the user would navigate to another
page (browser -> queue -> browser), killing the sync mid-wait. The
upload POST never fired because the delay ran out the clock.
Changes:
- Remove per-photo backoff delay from processQueue loop — uploads
start immediately on page load without blocking
- Move retry scheduling to after the full queue pass: if any uploads
failed, schedule a new triggerSync() after 15s instead of blocking
inline
- Keep the duplicate check on retries (fast, catches interrupted
uploads that actually succeeded server-side)
- uploadPhoto now returns true/false so processQueue can track
failures
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>