docs: public int fireNextItem(final AgendaFilter filter,
                              int fireCount,
                              int fireLimit) throws ConsequenceException {
          // Because rules can be on the agenda, but after network evaluation produce no full matches, the
          // engine uses tryAgain to drive a loop to find a rule that has matches, until there are no more rules left to try.
          // once rule with 1..n matches is found, it'll return back to the outer loop.
          boolean tryagain;
          int localFireCount = 0;
          do {
              tryagain = false;
              evaluateEagerList();
              final InternalAgendaGroup group = getNextFocus();
              // if there is a group with focus
              if ( group != null ) {
                  localFireCount = ruleEvaluator.evaluateAndFire(filter, fireCount, fireLimit, group);
  
                  // it produced no full matches, so drive the search to the next rule
                  if ( localFireCount == 0 ) {
                      // nothing matched
                      tryagain = true;
                      propagationList.flush(); // There may actions to process, which create new rule matches
                  }
              }
          } while ( tryagain );
  
          return localFireCount;
      }