class Tryouts::TestBatch

def run(before_test_hook = nil, &)

Main execution pipeline using functional composition
def run(before_test_hook = nil, &)
  return false if empty?
  @start_time      = Time.now
  @test_case_count = test_cases.size
  @output_manager&.execution_phase(@test_case_count)
  @output_manager&.info("Context: #{@options[:shared_context] ? 'shared' : 'fresh'}", 1)
  @output_manager&.file_start(path, context: @options[:shared_context] ? :shared : :fresh)
  if shared_context?
    @output_manager&.info('Running global setup...', 2)
    execute_global_setup
    # Stop execution if setup failed
    if @setup_failed
      @output_manager&.error('Stopping batch execution due to setup failure')
      @status = :failed
      finalize_results([])
      return false
    end
  else
    # Fresh context mode: execute setup once to establish shared @instance_variables
    @output_manager&.info('Running setup for fresh context...', 2)
    execute_fresh_context_setup
    # Stop execution if setup failed
    if @setup_failed
      @output_manager&.error('Stopping batch execution due to setup failure')
      @status = :failed
      finalize_results([])
      return false
    end
  end
  idx               = 0
  execution_results = test_cases.map do |test_case|
    @output_manager&.trace("Test #{idx + 1}/#{@test_case_count}: #{test_case.description}", 2)
    idx += 1
    # Check circuit breaker before executing test
    if @circuit_breaker_active
      @output_manager&.error("Circuit breaker active - skipping remaining tests after #{@consecutive_failures} consecutive failures")
      break
    end
    @output_manager&.test_start(test_case, idx, @test_case_count)
    result = execute_single_test(test_case, before_test_hook, &) # runs the test code
    @output_manager&.test_end(test_case, idx, @test_case_count)
    # Update circuit breaker state based on result
    update_circuit_breaker(result)
    result
  rescue StandardError => ex
    @output_manager&.test_end(test_case, idx, @test_case_count)
    # Create error result packet to maintain consistent data flow
    error_result = build_error_result(test_case, ex)
    process_test_result(error_result)
    # Update circuit breaker for exception cases
    update_circuit_breaker(error_result)
    error_result
  end
  # Used for a separate purpose then execution_phase.
  # e.g. the quiet formatter prints a newline after all test dots
  @output_manager&.file_end(path, context: @options[:shared_context] ? :shared : :fresh)
  @output_manager&.execution_phase(test_cases.size)
  execute_global_teardown
  finalize_results(execution_results)
  @status = :completed
  !failed?
end