For 2. This is a false positive. The debug output here is looking for a parent pointer which doesn’t exist in the static tree (the generation code doesn’t set the parent - not 100% here and I’ve asked for clarification from dev side). Looking at the code though the parent does have children as expected, and could be traced from top to bottom. I’m also going to find out if we have a better query for this situation since that may be something we haven’t maintained (which can happen a lot in codebases this large!)
It does set the parent in the dynamic version, which seem to go through a different code path which then calls the code to set a parent.
There is however a situation where this algorithm can fail (and where you don’t end up with a tree), and that is where the algorithm can’t split up the objects. The most common case for this is if you have a load of geometry all on top of each other with the same bounds, that is pretty synthetic as a scenario though.