docs: public boolean addProposedItem(final ItemsNodeInterval newNode) {
          Preconditions.checkState(newNode.getItems().size() == 1, "Invalid node=%s", newNode);
          final Item item = newNode.getItems().get(0);
  
          return addNode(newNode, new AddNodeCallback() {
              @Override
              public boolean onExistingNode(final NodeInterval existingNode) {
                  // If we receive a new proposed that is the same kind as the reversed existing (current node),
                  // we match existing and proposed. If not, we keep the proposed item as-is outside of the tree.
                  if (isSameKind((ItemsNodeInterval) existingNode)) {
                      final ItemsInterval existingOrNewNodeItems = ((ItemsNodeInterval) existingNode).getItemsInterval();
                      existingOrNewNodeItems.cancelItems(item);
                      return true;
                  } else {
                      return false;
                  }
              }
  
              @Override
              public boolean shouldInsertNode(final NodeInterval insertionNode) {
                  // At this stage, we're currently merging a proposed item that does not fit any of the existing intervals.
                  // If this new node is about to be inserted at the root level, this means the proposed item overlaps any
                  // existing item. We keep these as-is, outside of the tree: they will become part of the resulting list.
                  if (insertionNode.isRoot()) {
                      return false;
                  }
  
                  // If we receive a new proposed that is the same kind as the reversed existing (parent node),
                  // we want to insert it to generate a piece of repair (see SubscriptionItemTree#buildForMerge).
                  // If not, we keep the proposed item as-is outside of the tree.
                  return isSameKind((ItemsNodeInterval) insertionNode);
              }
  
              private boolean isSameKind(final ItemsNodeInterval insertionNode) {
                  final List<Item> insertionNodeItems = insertionNode.getItems();
                  Preconditions.checkState(insertionNodeItems.size() == 1, "Expected existing node to have only one item");
                  final Item insertionNodeItem = insertionNodeItems.get(0);
                  return insertionNodeItem.isSameKind(item);
              }
          });
      }