This is expected. When you use *args, it passes the flagged hash as keywords (new hash), it doesn't pass it through directly. This has nothing to do with __send__, you get the same false result using p h.equal?(*args).
What was very confusing is in ruby/spec, I had code like:
after_usage.should_not.equal?(marked)
to check whether a copy was made for #18625.
And this didn't fail, even though after_usage and marked are the same object.
The reason is this behavior, and MSpec internally dispatching through __send__.
I worked around it by calling equal? more directly and avoiding __send__ for the case of equal? but obviously it's kind of a hack.
What this means is ruby2_keywords delegation doesn't preserve identity of the last argument if it is a marked Hash.
And an unintentionally marked Hash does not seem so unlikely to happen with #18625.
I updated the description of #18625 to this, there is no copy currently on master for that case (I misunderstood that originally due to this issue):
after_usage.equal?(marked)# => true, BUG, should be false