code: public function move(RunnerServiceContext $context, $ref)
      {
          /* @var AssessmentTestSession $session */
          $session = $context->getTestSession();
          $nextPosition = $session->getRoute()->getPosition() - 1;
          
          if ($context->isAdaptive()) {
              $shadowTest = $context->getShadowTest();
              $currentCatItemId = $context->getCurrentCatItemId();
              $search = array_search($currentCatItemId, $shadowTest);
              
              // Consider potential changes in the selected items.
              $context->selectAdaptiveNextItem();
              
              if ($search === 0) {
                  QtiRunnerNavigation::checkTimedSectionExit($context, $nextPosition);
                  $session->moveBack();
              } else {
                  $context->persistCurrentCatItemId($shadowTest[$search - 1]);
              }
          } else {
              QtiRunnerNavigation::checkTimedSectionExit($context, $nextPosition);
              $session->moveBack();
          }
          
          return true;
      }
docs: Do the move
  @param RunnerServiceContext $context
  @param mixed $ref
  @return boolean
  @throws \common_Exception