areDictionariesUpToDate() mapped every exception to NeedsUpdate, and the post-update recheck ran after the first indexed source of a batch, before later sources finished downloading; the interim NeedsUpdate persisted for the day. Treat unexpected errors as up to date, rethrow cancellation, and recheck once when the download batch completes.