anchor.diff:    for (final name in names) {
       final mapBefore = before[name];
       final mapAfter = after[name];
  +    final mapApproved = approved[name];
       final resultBefore = mapBefore != null
           ? new Result.fromMap(mapBefore, flakinessData[name])
           : null;
       final resultAfter = new Result.fromMap(mapAfter, flakinessData[name]);
  -    final event = new Event(resultBefore, resultAfter);
  +    final resultApproved = mapApproved != null
  +        ? new Result.fromMap(mapApproved, flakinessData[name])
  +        : null;
  +    final event = new Event(resultBefore, resultAfter, resultApproved);
       events.add(event);
     }
  +
  +  final filterDescriptions = {
  +    "passing": {
  +      "unchanged": "continued to pass",
  +      "changed": "began passing",
  +      null: "passed",
  +    },
  +    "flaky": {
  +      "unchanged": "are known to flake but didn't",
  +      "changed": "flaked",
  +      null: "are known to flake",
  +    },
  +    "failing": {
  +      "unchanged": "continued to fail",
  +      "changed": "began failing",
  +      null: "failed",
  +    },
  +    null: {
  +      "unchanged": "had the same result",
  +      "changed": "changed result",
  +      null: "ran",
  +    },
  +  };
  +
  +  final searchForStatuses =
  +      ["passing", "flaky", "failing"].where((option) => options[option]);
  +
  +  final approvalDescriptions = {
  +    "passing": {
  +      "approved": " (approved)",
  +      "unapproved": " (should be approved)",
  +      null: "",
  +    },
  +    "flaky": {
  +      "approved": " (approved result)",
  +      "unapproved": " (unapproved result)",
  +      null: "",
  +    },
  +    "failing": {
  +      "approved": " (approved)",
  +      "unapproved": " (needs approval)",
  +      null: "",
  +    },
  +    null: {
  +      "approved": " (approved)",
  +      "unapproved": " (needs approval)",
  +      null: "",
  +    },
  +  };
  +
  +  final searchForApprovals =
  +      ["approved", "unapproved"].where((option) => options[option]);
   
     // Report tests matching the filters.
     bool judgement = false;
  -  if (options["passing"] || options["flaky"] || options["failing"]) {
  -    if (options["passing"]) {
  -      String sectionHeader;
  -      if (options["unchanged"]) {
  -        sectionHeader = "The following tests continued to pass:";
  -      } else if (options["changed"]) {
  -        sectionHeader = "The following tests began passing:";
  -      } else {
  -        sectionHeader = "The following tests passed:";
  -      }
  -      search(sectionHeader, "passing", events, options);
  -    }
  -    if (options["flaky"]) {
  -      String sectionHeader;
  -      if (options["unchanged"]) {
  -        sectionHeader = "The following tests are known to flake but didn't:";
  -      } else if (options["changed"]) {
  -        sectionHeader = "The following tests flaked:";
  -      } else {
  -        sectionHeader = "The following tests are known to flake:";
  -      }
  -      search(sectionHeader, "flaky", events, options);
  -    }
  -    if (options["failing"]) {
  -      String sectionHeader;
  -      if (options["unchanged"]) {
  -        sectionHeader = "The following tests continued to fail:";
  -      } else if (options["changed"]) {
  -        sectionHeader = "The following tests began failing:";
  -      } else {
  -        sectionHeader = "The following tests failed:";
  -      }
  -      judgement = search(sectionHeader, "failing", events, options);
  -    }
  -  } else {
  -    String sectionHeader;
  -    if (options["unchanged"]) {
  -      sectionHeader = "The following tests had the same result:";
  -    } else if (options["changed"]) {
  -      sectionHeader = "The following tests changed result:";
  -    } else {
  -      sectionHeader = "The following tests ran:";
  -    }
  -    judgement = search(sectionHeader, null, events, options);
  +  for (final searchForStatus
  +      in searchForStatuses.isNotEmpty ? searchForStatuses : <String>[null]) {
  +    for (final searchForApproval in searchForApprovals.isNotEmpty
  +        ? searchForApprovals
  +        : <String>[null]) {
  +      final searchForChanged = options["unchanged"]
  +          ? "unchanged"
  +          : options["changed"] ? "changed" : null;
  +      final aboutStatus = filterDescriptions[searchForStatus][searchForChanged];
  +      final aboutApproval =
  +          approvalDescriptions[searchForStatus][searchForApproval];
  +      final sectionHeader = "The following tests $aboutStatus$aboutApproval:";
  +      bool possibleJudgement = search(
  +          sectionHeader, searchForStatus, searchForApproval, events, options);
  +      if ((searchForStatus == null || searchForStatus == "failing") &&
  +          (searchForApproval == null || searchForApproval == "unapproved")) {
  +        judgement = possibleJudgement;
  +      }
  +    }
     }
   
     // Exit 1 only if --judgement and any test failed.
  
positive.code: 
  bool firstSection = true;
  
  bool search(String description, String searchFor, List<Event> events,
      ArgResults options) {
    bool judgement = false;
    bool beganSection = false;
    int count = options["count"] != null ? int.parse(options["count"]) : null;
    final configurations =
        events.map((event) => event.after.configuration).toSet();
    for (final event in events) {
      if (searchFor == "passing" &&
          (event.after.flaked || !event.after.matches)) {
        continue;
      }
      if (searchFor == "flaky" && !event.after.flaked) {
        continue;
      }
      if (searchFor == "failing" && (event.after.flaked || event.after.matches)) {
        continue;
      }
      if (options["unchanged"] && !event.unchanged) continue;
  
negative.code: 
  main(List<String> args) async {
    final parser = new ArgParser();
    parser.addFlag("approved",
        abbr: 'A', negatable: false, help: "Show approved tests.");
    parser.addFlag("changed",
        abbr: 'c',
        negatable: false,
  