It took me a long time to realize what was wrong with a traversal I wrote that used optional(blah.sideEffect.blah). optional() maps to ChooseStep under the hood and the provide traversal is first tested for a hasNext(). If so, the it plays itself out. The problem is that if there is a side-effect in the traversal child, then it gets executed twice.
We should NOT allow optional() to have SideEffectStep steps in it so as not to cause unexpected behavior. StandardVerificationStrategy can analyze and throw an exception if necessary.
Also, coalesce() has a similar problem, though perhaps it can be a useful 'technique.'