Does in your case PreCheckX have to complete before DoSthX?
I think you could run each of the PreCheckX->DoSthX activities as a parallel branch, see sample here. Each branch could retry the sequence of precheck->doX if you need, sample here.
I found that “preCheck-1” and “preCheck-2” has same “WorkflowTaskCompletedEventId”
Yes this is i believe an optimization Temporal does to keep the workflow history smaller, see this post for another example.
With reset and async invocations I think would be pretty difficult to rely on it for your use case. Would consider trying out the branch approach and dealing with retries in workflow code rather than falling back on reset.