@Override
    public List<ValidationEvent> evaluate(Differences differences) {
        NullableIndex oldIndex = NullableIndex.of(differences.getOldModel());
        NullableIndex newIndex = NullableIndex.of(differences.getNewModel());
        Set<ValidationEvent> events = new HashSet<>();

        Stream.concat(
                // Get members that changed.
                differences.changedShapes(MemberShape.class),
                // Get members of structures that added/removed the input trait.
                changedInputMembers(differences)).forEach(change -> {
                    // If NullableIndex says the nullability of a member changed, then that's a breaking change.
                    MemberShape oldShape = change.getOldShape();
                    MemberShape newShape = change.getNewShape();
                    boolean wasNullable = oldIndex.isMemberNullable(oldShape);
                    boolean isNowNullable = newIndex.isMemberNullable(newShape);
                    if (wasNullable != isNowNullable) {
                        createErrors(differences, change, wasNullable, events);
                    }
                });

        return new ArrayList<>(events);
    }
Validates that only backward compatible changes are made to
structure member nullability to ensure that if something was
previously nullable to clients then it continue to be nullable
and vice versa.
smithy-diff/src/main/java/software/amazon/smithy/diff/evaluators/ChangedNullability.java