Hmm. That is interesting. I would expect this to be an error as well. I see BadSelfReference tests, but it seems that cycles are not detected in general. This would likely need a policy to resolve.
The implementation avoids repeatedly following the same target multiple times, which is needed even in non-cyclical DAGs. On repeat encounter, evaluation produces an empty string.
I don’t believe this is documented anywhere. I think it would be helpful to add some text on the genex evaluation strategy to the docs. For another instance, the fact that all sub-genex are always evaluated prevents using $<IF:...> to check if a string names a target before using it to access a target property (and therefore avoid a fatal error).