anchor.diff:    if (verbose)
       print('Starting run_tests.dart...');
   
  +  if (files.length < shardIndex)
  +    print('Warning: There are more shards than tests. Some shards will not run any tests.');
  +
  +  if (numberShards <= shardIndex) {
  +    print('Error: There are more shard indexes than shards.');
  +    return help;
  +  }
  +
  +  // Best attempt at evenly splitting tests among the shards
  +  final List<File> shardedFiles = <File>[];
  +  for (int i = shardIndex; i < files.length; i += numberShards) {
  +    shardedFiles.add(files[i]);
  +  }
  +
     int testCount = 0;
     int failures = 0;
   
     if (verbose) {
       final String s = files.length == 1 ? '' : 's';
  -    print('${files.length} file$s specified.');
  +    final String ss = shardedFiles.length == 1 ? '' : 's';
  +    print('${files.length} file$s specified. ${shardedFiles.length} test$ss in shard #$shardIndex.');
       print('');
     }
   
  -  for (final File file in files) {
  +  if (verbose) {
  +    print('Tests in this shard:');
  +    for (final File file in shardedFiles)
  +      print(file.path);
  +  }
  +  print('');
  +
  +  for (final File file in shardedFiles) {
       if (verbose)
         print('Processing ${file.path}...');
       TestFile instructions;
  
positive.code:       help: 'How many times to run each test. Set to a high value to look for flakes.',
        valueHelp: 'count',
      )
      ..addFlag(
        'skip-on-fetch-failure',
        defaultsTo: false,
  
negative.code:   final bool skipTemplate = parsedArguments['skip-template'] as bool;
    final bool verbose = parsedArguments['verbose'] as bool;
    final bool help = parsedArguments['help'] as bool;
    final int numberShards = int.tryParse(parsedArguments['shards'] as String);
    final int shardIndex = int.tryParse(parsedArguments['shard-index'] as String);
    final List<File> files = parsedArguments
      .rest
      .expand((String path) => Glob(path).listSync())
  