ようやく分かった。
多分だけどAggregator::Asyncがcustomfeed.handleでURIのデータがFeedであろうがなかろうが真を返していて、かつPublish::OPMLが$context->subscription->feedsを参照しているため、だと思う。
つまり相性の問題。
customfeed.handleで真を返されたURIはパースが成功されたとみなされて、$context->subscription->delete_feed( $feed )されないので、もし対象がFeedで無かったとしても、パース出来なかったURIが残ってしまうっぽい。
Aggregator::Simple使った場合で問題ないのは、パースできなかった場合、customfeed.handleが偽を返しているため。
あとcustomfeed.handleで問答無用で真を返してるタイプのプラグインはどれでもこうなると思う。
これの解決策としては、
- Aggregator::Simple使う
- customfeed.handleでFeedを生成できなかった場合に削除するようにする
- Filter系のプラグイン書いてパースされなかったURIを削除するようにする
ぐらい。
なんか面倒だなぁ。