Hi there, just to add a few pieces of information to the discussion:
I've been using Jenkins and ran into a use case trying to set stage and build status differently and finally ended up in this ticket.
From the info in several tickets including this one, without actually reading tons of Jenkins source code, my guess is that the post for stage is likely evaluating against the worse result of current build and stage. If that's correct the example pipeline's behavior could be explained.
Likely related w/ the "BuildCondition.combineResults" mentioned in this comment.
Intuitively I think post for stage should only evaluate against the stage result, and post for whole pipeline should evaluate against the build result. But I'm not familiar w/ Jenkins source code so I'm not sure if that will run into any compatibility issue/historical design conflict and can't estimate how much work it would be.