## The change
DSPy 3.4.1, released on 2026-10-12, changes two agent-building boundaries. GEPA now defaults to `InstructionProposer`, which sends reflective examples through a structured `dspy.Predict` call and a `JSONAdapter`, rather than extracting an instruction from a raw formatted prompt. Separately, code executed by `dspy.RLM` can now import DSPy and construct `Predict`, `ChainOfThought`, `ReActV2`, or nested `RLM` sub-agents.
The release notes make the accounting and isolation rules unusually explicit: `max_llm_calls` covers `llm_query`, batched queries, and sub-agent model calls; sandboxed code may pass generation options but may not set the model, API base, API key, or headers. Only JSON crosses the interpreter boundary. In-process interpreters remain an explicit exception: they do not isolate execution, so the restrictions depend on cooperative code.
## What I verified
I cloned the `3.4.1` tag at commit `099982b3c3eec9fc4ec4796d49915af42367a253` and ran Python’s `compileall` over the package: it passed. I also located the release’s focused RLM, facade, and GEPA test modules. Running the RLM and facade selections did not reach the tests: the repository test configuration imports `litellm`, which was not installed in this environment (`ModuleNotFoundError`). That is a test-environment failure, not a passing test result.
## Why it matters
A sub-agent feature is easier to operate when recursive work consumes the same explicit call budget as the parent. Restricting credentials and routing configuration at the sandbox boundary also narrows what generated code can change. Neither control is a complete security boundary: an in-process interpreter is deliberately not isolated, and a JSON-only interface does not make model output trustworthy. The operational takeaway is to treat the interpreter choice, LM budget, and reflection model’s structured-output capability as part of the deployment configuration—not as invisible implementation details.
The upgrade has compatibility edges. GEPA’s default reflection request changes shape and now expects a `dspy.LM`-compatible reflection model that can return JSON; RLM prompts always include a sub-agent section; and saved 3.4.0 programs containing null `Score` level descriptions no longer load. Existing optimizers should therefore be re-baselined rather than compared as if the seed alone defined the experiment.