Skip to content

Config fields - enforce_evolve_blocks and diff_pattern are ignored in worker processes #516

Open

Description

@SUPR1M3

Bug Description:

Setting "enforce_evolve_blocks: true" or a custom "diff_pattern" in the config has no effect during a run. Both are read only inside the iteration worker (process_parallel.py:235 and :331), but ProcessParallelController._serialize_config (openevolve/process_parallel.py:493) builds the worker's config dict from a hand-written list of top-level keys(defaults) that doesn't include either one. _worker_init then rebuilds Config(**dict), so the missing fields silently fall back to their defaults (False and the standard SEARCH/REPLACE regex).

Expected behavior:

Values set in the config reach the worker processes: with enforce_evolve_blocks: true, edits outside EVOLVE-BLOCK-START/END are reverted before evaluation, and a custom diff_pattern is used to parse LLM responses.

Actual behavior:

  • enforce_evolve_blocks: true: edits the LLM makes outside EVOLVE-BLOCK-START/END are kept, evaluated, and can become the best program.
  • Custom diff_pattern: responses in the custom format don't match the default regex, so every iteration fails with "No valid diffs found in response".

No warning is logged, and the main-process config shows the value you set, so inspecting it looks fine.

Steps to reproduce:

Round-trip a config the way a run does:

from openevolve.config import Config
from openevolve import process_parallel as pp

c = Config()
c.enforce_evolve_blocks = True
c.diff_pattern = r"<<<< S\n(.*?)====\n(.*?)>>>> R"

ctl = pp.ProcessParallelController.__new__(pp.ProcessParallelController)
ctl.file_suffix = ".py"
pp._worker_init(ctl._serialize_config(c), "evaluator.py", None)

print(pp._worker_config.enforce_evolve_blocks)  # False
print(pp._worker_config.diff_pattern)           # default pattern

I also confirmed it end to end with OpenEvolve.run() and a fake LLM that edits one line inside and one line outside the EVOLVE-BLOCK. With enforce_evolve_blocks = True, the child kept the outside edit. Patching _serialize_config to also send enforce_evolve_blocks made the outside edit get reverted, as expected.

Why tests didn't catch it:

tests/test_diff_format_validation_worker.py patches _worker_config directly with the test's own Config, so the _serialize_config → _worker_init round trip is never exercised.

Proposed fix:

Build the top-level part of the worker dict from dataclasses.fields(Config) instead of a hand-written list, so new fields can't be dropped again, and add a regression test that round-trips a config with non-default values through _serialize_config → _worker_init and checks every field. I'm happy to open a PR.

Environment:

OpenEvolve 0.4.0 (main @ a1e9d91), Python 3.13, macOS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions