you're right, it is a simple change to clone the stream lazily. And I think I will do that for now. The benefit then is, that it won't be more expensive anymore to use a SegmentTermPosition object instead of a SegmentTermDocs in scorers.
However, there might be one drawback. SegmentTermDocs implements the method
int read(final int docs, final int freqs)
which is used by TermScorer for better performance. SegmentTermPositions overwrites this method and just throws a UnsupportedOperationException. This just becomes a problem if we want to make TermScorer extendable, so that subclasses can make use of payloads.... But actually I don't see much benefit in extending TermScorer over just extending Scorer for such a use case. What do you think?