anchor.diff:      d.forEachRemoved((k, v) {
         //print("New ${singularize(methodCategory)} '$k': ${pretty(v)}");
         if (k == '') { k = diff.metadata['name']; }
  -      io.writeln("Removed ${singularize(methodCategory)}$parenthetical [$k](#):\n");
  +      io.writeln("Removed $category$parenthetical [$k](#):\n");
         io.writeCodeblockHr(methodSignature(v as Map, includeComment: false));
       });
       if (erase) { d.removed.clear(); }
  
positive.code:     }
  
      // iterate over the method categories
      diff.forEachOf("methods", (k,v) {
        reportEachMethodThing(k, v);
      });
      diff.forEachOf("inheritedMethods", (k,v) {
        reportEachMethodThing(k, v, parenthetical: "inherited");
      });
      
      DiffNode variables = diff["variables"];
      if (variables != null) {
        if (variables.hasAdded) {
          io.writeln("New variables:\n");
          io.writeCodeblockHr(variables.added.values.map(variableSignature).join("\n"));
        }
        if (erase) { variables.added.clear(); }
  
        if (variables.hasRemoved) {
          io.writeln("Removed variables:\n");
          io.writeCodeblockHr(variables.removed.values.map(variableSignature).join("\n"));
        }
        if (erase) { variables.removed.clear(); }
  
        if (variables.hasChanged) {
          variables.forEachChanged((k,v) {
            print("CHANGED: $k, $v");
          });
        }
  
        variables.forEach((key, variable) {
          if (variable.hasChanged) {
            variable.forEachChanged((attribute, value) {
              io.writeln("The [$key](#) variable's `$attribute` changed:\n");
              io.writeln("Was: `${value[0]}`\n");
              io.writeln("Now: `${value[1]}`\n");
              io.writeln("---\n");
            });
          }
          if (erase) { variable.changed.clear(); }
          
          if (variable.node.isNotEmpty) {
            variable.node.forEach((s, dn) {
              print("BAD WRITING?");
              io.writeBad("TODO: The [$key](#) variable's `$s` has changed:\n", dn.toString(pretty: false));
            });
          }
          if (erase) { variable.node.clear(); }
        });
      }
    }
    
    void reportList(String key, DiffNode d) {
      d[key].forEachAdded((String idx, String el) {
        io.writeln("New $key at index $idx: ${el}");
  
negative.code:     // iterate over the methods
      d.forEach((method, attributes) {
        // for a method, iterate over its attributes
        reportEachMethodAttribute(category, method, attributes);
      });
    }
    
    void reportEachMethodAttribute(String category, String method, DiffNode attributes) {
      attributes.forEach((attributeName, attribute) {
        attribute.forEachAdded((k, v) {
          //print("The '$method' in '$methodCategory' has a new $name: '$k': ${pretty(v)}");
          io.writeln("The [$method](#) ${category} has a new ${singularize(attributeName)}: `${parameterSignature(v as Map)}`");
          io.writeln("\n---\n");
        });
        if (erase) { attribute.added.clear(); }
        
        attribute.node.forEach((attributeAttributeName, attributeAttribute) {
          reportEachMethodAttributeAttribute(category, method, attributeName, attributeAttributeName, attributeAttribute);
        });
      });
  
      attributes.forEachChanged((String key, List oldNew) {
        io.writeln("The [$method](#) $category's `${key}` changed:\n");
        if (key == "comment") {
          io..writeln("Was:\n")
              ..writeBlockquote((oldNew as List<String>)[0])
  