In finish_failed_job, there's only a check on self.keep_result_s, not the value configured from the function. As a result, any failed tasks are stored for potentially a very long time and cannot be re-enqueued with the same job id, even if configured on the function level to not store a result.
This also relates to #416 as currently it's impossible to follow this pattern for tasks that can fail, e.g. trying to re-enqueue a task that you want to have eventually succeed does nothing of the worker is configured to keep values.