山本です。

少し頭の整理がつきました。まつもとさんの仰りたかった仕様は、

  FNM_SEPMATCH == !FNM_PATHNAME

  FNM_SEPMATCH がないときは、
    *, ? は / にマッチせず、[ ] が '/' を含んでも、この '/' は無視する
      File.fnmatch('hoge[/X]hoge', 'hogeXhoge') => true
      File.fnmatch('hoge[/X]hoge', 'hoge/hoge') => false
    **/ は、ディレクトリ再帰のようにマッチする(オプション)
    Dir.glob も、これと同じ動作をすべきである。
    Dir.glob に FNM_CASEFOLD や FNM_SEPMATCH が指定されたときは、例外(警告)を出す

  FNM_SEPMATCH があるときは、
    *, ? は / にマッチして、[ ] が '/' を含むなら、範囲指定で '/' もマッチする
      File.fnmatch('hoge[/X]hoge', 'hogeXhoge', FNM_SEPMATCH) => true
      File.fnmatch('hoge[/X]hoge', 'hoge/hoge', FNM_SEPMATCH) => true
    **/ は */ と同様の意味しかもたない

  マジック文字の優先順位は
    1. { }
    2. [ ]
    3. *, ?, /

ということだったんですね。

FNM_SEPMATCH は、「マジック文字が '/' にマッチする」という、FNM_PATHNAME と逆のフラグです。
始め、上のほうを「FNM_PATHNAMEがないとき」と書いてしまって混乱したので、定義しました。

私はまだ [ruby-dev:22879] のシンプルさを推しています。でも、[ruby-dev:22887] で書いた

>と書いたんですが、これではエントリ名に 'hoge[/]hoge' をマッチさせる動作になり、fnmatchの
>動作と異なってしまいます。'/' を '[' に優先させれば、この問題は解決します。

といったあいまいさはありませんでした。もう少し整理してみます。