class GEPA::Core::Engine

def process_merge_iteration(state)

def process_merge_iteration(state)
  return :skipped unless @merge_proposer && @merge_proposer.use_merge
  if @merge_proposer.merges_due.positive? && @merge_proposer.last_iter_found_new_program
    proposal = @merge_proposer.propose(state)
    @merge_proposer.last_iter_found_new_program = false
    if proposal&.tag == 'merge'
      parent_sums = Array(proposal.subsample_scores_before).map(&:to_f)
      new_sum = Array(proposal.subsample_scores_after).map(&:to_f).sum
      if parent_sums.empty?
        @logger.log("Iteration #{state.i}: Missing parent subscores for merge proposal, skipping")
        return :handled
      end
      if new_sum >= parent_sums.max
        with_span('gepa.engine.full_evaluation', iteration: state.i) do
          run_full_evaluation(state, proposal.candidate, proposal.parent_program_ids)
        end
        @merge_proposer.merges_due -= 1
        @merge_proposer.total_merges_tested += 1
        return :accepted
      else
        @logger.log(
          "Iteration #{state.i}: Merge subsample score #{new_sum.round(4)} "\
          "did not beat parents #{parent_sums.map { |v| v.round(4) }}, skipping"
        )
        return :attempted
      end
    end
  end
  @merge_proposer.last_iter_found_new_program = false
  :skipped
end