code: @Override
      public CustomPhase buildPhase(int phaseIndex, HeuristicConfigPolicy solverConfigPolicy,
              BestSolutionRecaller bestSolutionRecaller, Termination solverTermination) {
          HeuristicConfigPolicy phaseConfigPolicy = solverConfigPolicy.createPhaseConfigPolicy();
          DefaultCustomPhase phase = new DefaultCustomPhase(
                  phaseIndex, solverConfigPolicy.getLogIndentation(), bestSolutionRecaller,
                  buildPhaseTermination(phaseConfigPolicy, solverTermination));
          if (ConfigUtils.isEmptyCollection(customPhaseCommandClassList)) {
              throw new IllegalArgumentException(
                      "Configure at least 1 <customPhaseCommandClass> in the <customPhase> configuration.");
          }
          List<CustomPhaseCommand> customPhaseCommandList = new ArrayList<>(customPhaseCommandClassList.size());
          for (Class<? extends CustomPhaseCommand> customPhaseCommandClass : customPhaseCommandClassList) {
              CustomPhaseCommand customPhaseCommand = ConfigUtils.newInstance(this,
                      "customPhaseCommandClass", customPhaseCommandClass);
              ConfigUtils.applyCustomProperties(customPhaseCommand, "customPhaseCommandClass",
                      customProperties, "customProperties");
              customPhaseCommandList.add(customPhaseCommand);
          }
          phase.setCustomPhaseCommandList(customPhaseCommandList);
          phase.setForceUpdateBestSolution(forceUpdateBestSolution == null ? false : forceUpdateBestSolution);
          EnvironmentMode environmentMode = phaseConfigPolicy.getEnvironmentMode();
          if (environmentMode.isNonIntrusiveFullAsserted()) {
              phase.setAssertStepScoreFromScratch(true);
          }
          return phase;
      }
docs: ************************************************************************