Research review / frameworks

Framework Watch: LangGraph 1.2.17 Stops Dropping a Recursion Limit Equal to the Default, Pydantic AI 2.61 Closes Guardrail Fail-Open Paths, Ollama Adds Decision Models, and LiteLLM Backports Scanner Fixes to Four Lines

Releases published October 24 and 25. Several fixes are the same kind of bug: a control that looked configured was silently not applied. A loop limit, a guardrail verdict, a browser blocklist and even a community invite link all needed fixing.

By Sandeep Belgavi · Published 2026-10-26

This edition covers agent-framework and harness releases published on October 24 and 25, 2026. Claude Code 2.1.310 and ADK Python's temporary-state change were covered on October 25.

LangGraph 1.2.17: an explicit limit that was ignored

LangGraph 1.2.17, released October 24, fixes a bug in how configs are merged (#9417). merge_configs decided whether a recursion_limit had been set by comparing it with the default, so an explicit limit equal to the default was dropped. With LANGGRAPH_DEFAULT_RECURSION_LIMIT set to 1000, agent.with_config(recursion_limit=1000) silently kept the 9999 that create_agent and create_deep_agent bind, "and a looping agent ran to 9999 steps." The default is now a sentinel value. The pull request notes that langchain-core has the same check in its own merge_configs (tracked in langchain issue #39994) and that "this PR does not touch it". The release also keeps the caller's namespace in RemoteGraph.stream(subgraphs=True).

Pydantic AI 2.61.0: fewer fail-open paths in guardrails

Pydantic AI 2.61.0, also October 24, includes a review of its harness guardrails (#10841). A guard that returns something other than True, False or a GuardrailResult is still read for truthiness, "because a truthy label such as 'unsafe' lets the value through". In 2.61 such a label still lets the value through: guards that return one now trigger a deprecation warning, and only a future release will raise an error. A guard declared as def guard(prompt: str, threshold=0.5) had been handed RunContext instead of the prompt. On multi-part prompts, a redaction used to send the earlier parts unredacted.

A second fix (#10775) concerns BrowserUse. browser-use "matches a prohibited list of 100 or more entries by exact hostname only", which "silently disabled the harness's file:// and localhost rules". The harness adds its own entries to that list, so a user list of 97 entries crossed the threshold. Such lists now raise ValueError. The release also stops aws configure writing to ~/.aws inside the LocalStack capability and adds structured citations to TextPart.

Ollama 0.40.11: speech and d3 decision models

Ollama 0.40.11 (October 24) adds speech generation on macOS through an OpenAI-compatible /v1/audio/speech endpoint. It also adds d3, which brings vLLM Semantic Router's decision models to Ollama in 2B, 4B, 9B and 27B sizes. They classify input, answer yes or no, or score options with probabilities. It is the local counterpart to the decision-model APIs this digest has covered, and a cheap way to keep routing and triage calls off a large model.

LiteLLM backports and a promptfoo invite fix

On October 25 LiteLLM shipped v1.103.9, v1.104.7, v1.105.5 and v1.106.4. Each fixes image scans flagging "brotli 1.2.0, the emSign ECC Root CA - G3 and unused lockfile packages". Three also fix a proxy that could exit on startup with an ImportError when the remote model cost map was unreachable. Last week's Brotli and eMudhra news has now reached dependency scanners. promptfoo 0.125.1 (#11967) replaced 34 vanity Discord links, because the promptfoo vanity invite "currently resolves to a different guild".

What remains uncertain. These are maintainers' release notes. None says whether the bugs were exploited, and the langchain-core issue was still open on October 26.

Analysis: Each of these is a test you can write today. Set a recursion limit equal to the default and assert that it fires. Return a string from a guardrail and assert that the run is blocked. Give BrowserUse a 100-entry blocklist and try a file:// URL. Resolve every vanity link in your docs. Testing configuration only shows intent; testing enforcement shows the control works.

Sources and evidence

October 24-25 releases fixed controls that were configured but not applied: LangGraph 1.2.17 stopped dropping a recursion limit equal to the default (a looping agent could run 9,999 steps), Pydantic AI 2.61.0 began warning that truthy guardrail labels let values through (a later release will reject them) and rejected 100-entry browser blocklists that disabled file:// rules, Ollama 0.40.11 added d3 decision models, and LiteLLM backported Brotli and emSign scanner fixes to four release lines.