All of the doom and gloom you posted already happens - if you iterate in reverse, it seems very illogical that the iteration direction should produce inconsistent results.
I'm not remotely a fan of that particular feature either and it may go away.
Not sure if rendering trees can really be considered an edge case
Trees - no. Same Traversable recursively - I would say so.
arrays are copied by value that means each call to f:for receives it's own personal copy, what nested calls do to their copy ( resetting iteration pointers or not ) is irrelevant to the caller as it's copy is not changed by this.
Correct. Copy by value is part of why I am concerned about this.
finally this is about fluid in the core not the VHS extension
Yes, and you are completely forgiven for not knowing this, but we are currently working on a very ambitious goal to convert much of VHS to a generic ViewHelper package that is likely to be included in TYPO3v9. This generic package will among other things contain all the iterator ViewHelpers (and this is one thing that would make the "reverse" argument redundant - that purpose is then solved by chaining a ViewHelper when passing the argument). So "it's VHS not core" will soon become a moot point. That, and the variable is possible to cast in TYPO3v8 and onward so if your case requires an array, you can demand an array.
And the point still stands that this procedure is not supported by PHP either, without explicitly converting one of the iterated instances to an array.
This then becomes a matter of accommodating 7.6 LTS and I've given you two options which would prevent this issue without forcing every single other LTS user into more memory consumption, broken Traversable predictability etc.
but that does require you to know that nesting/recursion in fluid does not create a new scope ( which I don't think is documented anywhere )
Actually, it's deeper than that: it requires that you know that you are passing a Traversable and that PHP foreach does what it does if you render a Traversable recursively; plus how arrays are different from this. You need to understand pointers and how they behave with Traversable, essentially. If you know this, you also know the use case you attempt simply is not possible in PHP either without explicit conversion - and then you know how to solve your problem (using any of the methods I recommended).
This is, in fact, pure PHP knowledge and does not pertain in particular to Fluid iterations - it is worth while knowing this about any PHP implementation you make, and I don't really see it as our obligation to document this, for that very reason along with this being an edge case (e.g. less than 5% of normal usage is affected). This is further illustrated by the number of times this has come up during the LONG life of Fluid.
That number is: exactly two. The first time is why I know what I now know about Traversable pointers and foreach.
An alternative could be to have it simply restore the iterator pointer upon exit, but I'm not sure that's advisable
Even PHP does not do this. We follow the way pointers behave in PHP so I would say very inadvisable. Resetting it also causes another issue if done in your use case... infinite loops.
Anywho, my conclusion is still that explicit conversion is the way to solve this. I hope you can use my suggestions and background knowledge to make your implementation work.