A better piece of documentation to look at is the REST API documentation for statuses. The problem here is likely that you're using the same context field for both statuses, but you're doing different checks. The statuses are both technically immutable, but when you create a new status with the same context, it overrides the old status with that status.
Your PR checks are more stringent than your push checks, but they use the same context. As a result, when your push checks update the status with success, that overrides the PR update event. If you're really running two separate sets of tests, then use two different contexts, and they will appear as two separate checks.
I think what you were asking for is how to never allow a status to be overridden by a new status with the same context, and that's not possible. You wouldn't want that anyway, because if the CI server had a temporary problem and you needed to re-run the check, you'd never be able to replace the old failure with that commit, and you'd have to make a no-op change and push a new commit in order to merge.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…