private String formatPath(PathFinder.Path path) {
        StringJoiner joiner = new StringJoiner(" > ");
        List<Shape> shapes = path.getShapes();
        for (int i = 0; i < shapes.size(); i++) {
            // Skip the first shape (the subject) to shorten the error message.
            if (i > 0) {
                joiner.add(shapes.get(i).getId().toString());
            }
        }
        return joiner.toString();
    }
Ensures that list, set, and map shapes are not directly recursive,
meaning that if they do have a recursive reference to themselves,
one or more references that form the recursive path travels through
a structure or union shape. And ensures that structure members are
not infinitely mutually recursive using the required trait.

<p>This check removes an entire class of problems from things like
code generators where a list of itself or a list of maps of itself
is impossible to define.
smithy-model/src/main/java/software/amazon/smithy/model/validation/validators/ShapeRecursionValidator.java