anchor.diff:    final token = Platform.environment['GITHUB_TOKEN'];
     final github = GitHub(token);
   
  -  var state = GitHubIssueState.open;
  +  var issues = List<dynamic>();
  +  
     DateRange when = null;
     var rangeType = GitHubDateQueryType.none;
  -  if (opts.showClosed) {
  -    state = GitHubIssueState.closed;
  -    when = DateRange(DateRangeType.range, start: opts.from, end: opts.to);
  -    rangeType = GitHubDateQueryType.closed;
  -  }
  -
  -  var issues = await github.fetch(owner: 'flutter', 
  +
  +  
  +  var state = GitHubIssueState.open;
  +  if (!opts.onlyClosed) issues.addAll(await github.fetch(owner: 'flutter', 
       name: 'flutter', 
       type: GitHubIssueType.issue,
       state: state,
       dateQuery: rangeType,
       dateRange: when
  -  );
  -
  -  print(opts.showClosed ? 
  -    "# Closed issues from " + opts.from.toIso8601String() + ' to ' + opts.to.toIso8601String() :
  -    "# Open issues" );
  -
  -  if (false) {
  +  ));
  +  state = GitHubIssueState.closed;
  +  if (!opts.onlyOpen) issues.addAll(await github.fetch(owner: 'flutter', 
  +    name: 'flutter', 
  +    type: GitHubIssueType.issue,
  +    state: state,
  +    dateQuery: rangeType,
  +    dateRange: when
  +  ));
  +  issues.sort((a, b) => a.number.compareTo(b.number));
  +
  +  if (opts.tsvOutput) {
  +    print(opts.dateRange ? 
  +      "Punted issues from " + opts.from.toIso8601String() + ' to ' + opts.to.toIso8601String() :
  +      "Punted issues" );
  +    print('Issue number\tIssue summary\tState\tNumber of punts\tOriginal milestone\tLast punt\tCurrent milestone');
  +  } else {
  +    print(opts.dateRange ? 
  +      "# Punted issues from " + opts.from.toIso8601String() + ' to ' + opts.to.toIso8601String() :
  +      "# Punted issues" );
  +  }
  +
  +  // Lots o' debugging when this is enabled --- flip to true.
  +  if (opts.markdownOutput && false) {
       print('## All issues\n');
       for (var issue in issues) print(issue.summary(linebreakAfter: true));
       print('\n');
     }
  -
  -  if (opts.includeMilestones) {
  +  // End debugging
  +
  +  if (opts.includeMilestones && opts.markdownOutput) {
       print("## Issues by milestone\n");
       print("There were ${issues.length} issues.\n");
   
  
positive.code:       ..addFlag('date-range', defaultsTo: false, abbr: 'd', negatable: false, help: 'show punted issues in date range')
        ..addFlag('include-milestones', defaultsTo: false, abbr: 'i', negatable: true, help: 'show all milestones, too')
        ..addFlag('tsv-output', defaultsTo: false, abbr: 't', negatable: true, help: 'output is in tsv format')
      try {
        _results = _parser.parse(args);
        if (_results['help'])  _printUsage();
        if (_results['closed'] && _results.rest.length != 2 ) throw('need start and end dates!');
      } on ArgParserException catch (e) {
        print(e.message);
        _printUsage();
  
negative.code: class Options  {
    final _parser = ArgParser(allowTrailingOptions: false);
    ArgResults _results;
    get dateRange => _results['date-range'];
    get includeMilestones => _results['include-milestones'];
    get tsvOutput => _results['tsv-output'];
    get markdownOutput => !tsvOutput;
    get onlyOpen => _results['only-open'];
    get onlyClosed => _results['only-closed'];
    DateTime _from, _to;
    get from => _from;
    get to => _to;
    get exitCode => _results == null ? -1 : _results['help'] ? 0 : null;
  
    Options(List<String> args) {
      _parser
  