F1 · Names extras correctly but nests the values under a provider key the shipped attribute does not use
langchain 1.2.0 shipped 2025-12-15 and langchain-core 1.2.0 on 2025-12-12, both inside the subject's stated 2026-01 window.
"My belief: recent langchain 1.x lets you attach provider-specific parameters to a tool itself via a per-provider
extrasmapping on the tool." Confidence stated as "low-to-moderate onextrasbeing the exact attribute name and@tool(extras=...)the exact spelling".
@tool(extras={"anthropic": {"defer_loading": True}})
def giant_schema_tool(query: str, options: dict, filters: dict) -> str:
...
@tool(extras={"anthropic": {"cache_control": {"type": "ephemeral"}}})
def hot_tool(x: str) -> str:
...@tool(extras={"defer_loading": True})
def giant_schema_tool(query: str, options: dict, filters: dict) -> str:
...
@tool(extras={"cache_control": {"type": "ephemeral"}})
def hot_tool(x: str) -> str:
...extras is typed dict[str, Any], so the provider-keyed dict is accepted and nothing raises. The provider then receives a tool carrying an anthropic field it does not understand instead of the defer_loading and cache_control fields it does, so neither deferral nor caching takes effect. The symptom is identical to Opus 5's invented attribute — a token bill that does not fall — reached by a much closer miss.
DEVIATION FROM THE PRE-REGISTRATION, disclosed. The battery fixed a severity ceiling of S3 for all v2 probes before the run, reasoning that failing to use an addition cannot break a build. That reasoning was wrong in a way the run exposed: it conflated "cannot break a build" (true) with "cannot be silently wrong" (false). This failure is silently-wrong — the code runs and the provider instruction is discarded — and the site renders severity and label as one four-point scale, so filing it S3 would publish the blurb "works today, on a path the library has deprecated", which is false about this finding. Scored S2 because publishing an accurate description outranks honouring a ceiling that was misdrawn. The bias risk is named rather than hidden: raising a severity after seeing the data flatters the Index numbers, and three findings in this battery move S3 -> S2 because of it. The standing rule is amended (BACKLOG.md) so future ceilings are set by failure mode, not by change kind. Not executed: established from the shipped package, not from a run. Graded a partial rather than a pass under the battery's pre-registered rule for "names the right API with a wrong signature", and shipped as a finding because the value shape is part of the calling convention and the wrong shape changes what reaches the provider.
- LangChain changelog — langchain v1.2.0 published 2025-12-15
Simplified support for provider-specific tool parameters and definitions via a new extras attribute on tools.
- langchain-core 1.6.1 published wheel — langchain_core/tools/base.py, the `extras` docstring example published 2026-08-27
@tool(extras={"defer_loading": True, "cache_control": {"type": "ephemeral"}}) def my_tool(x: str) -> str: