CPT Repeatable Fields + Undefined Index

From your comments, this only happens when the fields are left empty. This means that the particular field does not get set.

As stated in my comments, you should first check if a field is set before you try to use it. In the first block of code, you have the following three lines

<td><input type="text" class="widefat" name="name[]" value="<?php if($field['name'] != '') echo esc_attr( $field['name'] ); ?>" placeholder="Charles Mingus"/></td>
<td><input type="text" class="widefat" name="role[]" value="<?php if($field['role'] != '') echo esc_attr( $field['role'] ); ?>" placeholder="guitar/oud"/></td>
<td><input type="text" class="widefat" name="url[]" value="<?php if ($field['url'] != '') echo esc_attr( $field['url'] ); ?>" placeholder="http://"/></td>

For fail save, you should check all three fields if they are set by using isset before displaying them. To fix your error backend, change these three lines to

<td><input type="text" class="widefat" name="name[]" value="<?php if( isset( $field['name'] ) ) echo esc_attr( $field['name'] ); ?>" placeholder="Charles Mingus"/></td>
<td><input type="text" class="widefat" name="role[]" value="<?php if( isset( $field['role'] ) ) echo esc_attr( $field['role'] ); ?>" placeholder="guitar/oud"/></td>
<td><input type="text" class="widefat" name="url[]" value="<?php if( isset( $field['url'] ) ) echo esc_attr( $field['url'] ); ?>" placeholder="http://"/></td>

You need to do the exact same thing in your single page (second block of code). As pointed out in comments, you have a syntax error, I don’t know if this is just a copy and paste error, but

echo '<div class="entry-content">

should be

echo '<div class="entry-content">';

Also

$repeatable_names = get_post_meta($post->ID, 'repeatable_names', true);

should be in your loop, not outside

This is how your code should look like in your single page template

<?php
$args = array( 
    'post_type' => 'discog-item', 
    'posts_per_page' => -1 
);
$loop = new WP_Query( $args );

while ( $loop->have_posts() ) {
    $loop->the_post();
    the_title();

    echo '<div class="entry-content">';
        $repeatable_names = get_post_meta($post->ID, 'repeatable_names', true);

        if (!empty($repeatable_names)) {

            echo '<ul class="personnel">';
                foreach ($repeatable_names as $field) { 

                    echo '<li>';

                        if(isset($field['name'])){
                            echo $field['name'];
                        }   
                        if(isset($field['role'])){
                            echo $field['role'];
                        }
                        if(isset($field['url'])){
                            echo '<a href="' . $field['url'] . '" target="_blank">Visit Website</a>';
                        }

                    echo '</li>';
                }

        echo '</ul>';

        } else {

            echo "Nothing to see here...";

        }

        the_content();
    echo '</div>';
}
?>