URI.decode_www_form は、引数の先頭にある ? を無視します。

% ./ruby -ruri -ve 'p URI.decode_www_form("?a=b")'
ruby 1.9.2dev (2010-04-08 trunk 27262) [i686-linux]
[["a", "b"]]
% ./ruby -ruri -ve 'p URI.decode_www_form("a=b")'
ruby 1.9.2dev (2010-04-08 trunk 27262) [i686-linux]
[["a", "b"]]

意図は分かるんですが、残念なことに、URI の query には ? という文字を
入れられます。

RFC 3986:

      query       = *( pchar / "/" / "?" )

そのため、? で始まる key もちゃんと扱うにはどうするのか明瞭ではありません。
ここは ? の特別扱いをあきらめたほうがいいんじゃないでしょうか。

あと、その

    unless /\A\??(?<query>[^=;&]*=[^;&]*(?:[;&][^=;&]*=[^;&]*)*)\z/ =~ str

というところで、[^;&]* というパターンが使われていて、
正しい application/x-www-form-urlencoded であることを検査していません。
ちゃんと検査したほうがいい気がするんですがどうでしょうか。

% ./ruby -ruri -e 'p URI.decode_www_form("%=%")'
[["%", "%"]]
-- 
[田中 哲][たなか あきら][Tanaka Akira]