code: public function process()
      {
          $this->validate();
  
          $ref = $this->getRequestParameter('ref') ?: null;
          $itemDuration = null;
  
          $scope = $this->getRequestParameter('scope');
          $start = $this->getRequestParameter('start') !== false;
  
          try {
              $serviceContext = $this->getServiceContext();
  
              $this->saveToolStates();
  
              $this->getRunnerService()->endTimer($serviceContext, $itemDuration, $this->getTime());
  
              if ($this->getRequestParameter('offline') === true) {
                  $this->setOffline();
              }
  
              $result = $this->getRunnerService()->skip($serviceContext, $scope, $ref);
  
              $response = [
                  'success' => $result,
              ];
  
              if ($result) {
                  $response['testContext'] = $this->getRunnerService()->getTestContext($serviceContext);
                  if ($serviceContext->containsAdaptive()) {
                      // Force map update.
                      $response['testMap'] = $this->getRunnerService()->getTestMap($serviceContext, true);
                  }
              }
  
              if ($start == true) {
                  // start the timer only when move starts the item session
                  // and after context build to avoid timing error
                  $this->getRunnerService()->startTimer($serviceContext, $this->getTime());
              }
          } catch (Exception $e) {
              $response = $this->getErrorResponse($e);
          }
  
          return $response;
      }
docs: Process the skip action.
  
  Validate required fields.
  Stop timer.
  Wrap the skip to runner service.
  Start next timer.
  
  @return array
  @throws common_Exception
  @throws common_exception_Error
  @throws common_exception_InconsistentData