* fix: detect circular references in GetDescendants * chore: use map[string]bool and instantiate at the beginning of the function
* fix: detect circular references in GetDescendants * chore: use map[string]bool and instantiate at the beginning of the function