docs: private boolean canSuccessorProceed() {
  
          if (predecessor != null && !predecessor.canSuccessorProceed()) {
              return false;
          }
  
          synchronized (this) {
              while (responseCount < groups.size()) {
                  try {
                      wait();
                  } catch (InterruptedException e) {
                      Thread.currentThread().interrupt();
                      return false;
                  }
              }
              return !failed;
          }
      }