This sounds reasonable.
However, I don't know how to walk around this malicious re-enabling if I make one-side platform.
I can correctly check normal of contact only on the very first step. After that I have no relevant information about the contact.
Then please help me to rewrite this to something logically equivalent:
void HandleNodeUpdateContact2D(StringHash eventType, VariantMap& eventData)
Node@ otherNode = eventData["OtherNode"].GetPtr();
VectorBuffer points = eventData["ContactPoints"].GetBuffer();
Vector2 contactPosition = points.ReadVector2();
Vector2 contactNormal = points.ReadVector2();
if (contactNormal.y < 0.5)
eventData["Enabled"] = false;
Note that I don't know anything about object shapes here.