docs: public void propagateActions( InternalWorkingMemory workingMemory ) {
          final PropagationQueueingNodeMemory memory = workingMemory.getNodeMemory( this );
  
          // first we clear up the action queued flag
          memory.isQueued().compareAndSet( true,
                                           false );
  
          // we limit the propagation to avoid a hang when this queue is never empty
          Action next;
          for ( int counter = 0; counter < PROPAGATION_SLICE_LIMIT; counter++ ) {
              next = memory.getNextAction();
              if ( next != null ) {
                  next.execute( this.sink,
                          workingMemory );
              } else {
                  break;
              }
          }
  
          if ( memory.hasNextAction() && memory.isQueued().compareAndSet( false,
                                                                          true ) ) {
              // add action to the queue again.
              workingMemory.queueWorkingMemoryAction( this.action );
          }
      }