After the previous developers' meeting, Matz said an idea to restrict it to only T_HASH and not to call to_hash method, but it breaks mocks in rubyspec so much.
I agree that if the conversion of a hash-like argument to keyword parameter fails because the keys aren't all symbols, the original object should be passed.
I would do this without waiting for final decision on if to_hash is acceptable for keyword arguments or not, since even if it is decided to change so that to_hash isn't sufficient, the new behavior will be to receive the original object.
In all released versions of Ruby I tested, zoo(hashie) raises ArgumentError.
With the changes in #14183, in the master branch, you also get a warning notifying you of the upcoming behavior change:
zoo(hashie)# file.rb: warning: The last argument for `zoo' (defined at file.rb:14) is used as the keyword parameter# file.rb:14:in `zoo': unknown keyword: :a (ArgumentError)
In Ruby 3, the behavior for zoo will be the same as foo and woo.