a8994fd84d
Treat every non-Success upload response as Transient so audio survives expired sessions, 4xx replies, and unparseable 2xx bodies — the watch keeps retrying instead of silently dropping the recording. Drop the UploadResult.Terminal variant entirely and the SyncWorkerLoop branch that consumed it. Also reap orphaned unsynced markers on app start: a syncedToServer=false marker without a matching pending pair (audio gone) and older than a 5-minute grace window is inconsistent — the user couldn't discard it, and no other path could clean it up. Eliminates the 2026-05-03 21:08 ghost-marker class. Test fixture (InMemoryCaseStore), SyncWorkerLoopTest, UploadClientTest, and StartupCleanupTest updated to reflect the new contract.