{
  "$schema": "../../schema/run.schema.json",
  "run_id": "langchain--claude-fable-5-1--v5-b--2026-09-06",
  "supersedes": null,
  "replicate_of": null,
  "library": {
    "name": "langchain",
    "ecosystem": "pypi",
    "latest_version_at_test": "1.4.0",
    "latest_version_verified_on": "2026-09-06",
    "latest_version_note": "Re-fetched this session from PyPI. 1.4.0 shipped 2026-09-03, three days before this draw and above every drawable subject's stated cutoff; the target release is 1.3.0 (2026-05-12) and the release below the window is 1.2.18 (2026-05-08). All three wheels were downloaded and unpacked before the battery was written, and the whole 1.2.18 -> 1.3.0 diff of the `langchain` package is three files and thirty lines, which is what makes the introducing release exact."
  },
  "model": {
    "id": "claude-fable-5-1",
    "label": "Claude Fable 5.1",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"fable\"; the blind twin of `v5-a`, spawned concurrently from the same stored prompt file with no knowledge of the sibling. Born-duplicated pair (JOURNAL/028): this arm charges nothing and points at `v5-a`.",
    "self_reported_cutoff": "2026-06",
    "cutoff_basis": "\"My configured cutoff is stated as June 2026. In practice, my detailed knowledge of this library thins out around the end of 2025 / very early 2026, so treat anything after that as unknown to me.\" A density qualification, not a substitute cutoff - the same shape as the sibling's, so both arms would have been licensed to charge and only the pre-registered one does.",
    "believed_latest_version": "1.2.x, held as a number",
    "believed_latest_quote": "\"The latest version I know of by name is the langchain 1.2.x line (roughly December 2025 / January 2026). The most recent release whose contents I can actually describe with confidence is 1.1.0 (about late November 2025); for 1.2 I have only a hazy sense of the changes.\"",
    "knowledge_stops_at_version": "1.1.0",
    "knowledge_stops_on": "2025-11-24",
    "knowledge_gap_starts_at_version": "1.2.0",
    "knowledge_gap_starts_on": "2025-12-15",
    "cutoff_lag_months": 6
  },
  "test": {
    "date": "2026-09-06",
    "battery": "langchain/v5-b",
    "battery_spec": "prompts/langchain.md",
    "prompt_file": "prompts/sent/langchain-v5.txt",
    "tasks": 7,
    "direct_questions": 3,
    "elicits_code": true,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "1.2.0",
      "to": "1.4.0"
    },
    "self_test": true,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://pypi.org/pypi/langchain/json",
    "https://docs.langchain.com/oss/python/releases/changelog",
    "https://files.pythonhosted.org/packages/59/20/959f6098c79158afe5aedce7de05c3700f10d293890ef9e5dace6c3ad94b/langchain-1.2.18-py3-none-any.whl",
    "https://files.pythonhosted.org/packages/7b/6f/b9a9721c27fbb6d29a6a7cd89d6a41eeffc7c79b49b9a5cf5beb1d60952d/langchain-1.3.0-py3-none-any.whl",
    "https://files.pythonhosted.org/packages/92/fa/7da07d9977a5e292ef602c1bb911514ff8206e85dc09a66961874345d57a/langchain-1.4.0-py3-none-any.whl"
  ],
  "findings": [],
  "non_findings": [
    {
      "kind": "miss",
      "api": "create_agent(transformers=...)",
      "introduced_in": "1.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "langchain--claude-fable-5-1--v5-a--2026-09-06",
      "why_not_a_finding": "The `-b` arm of a born-duplicated pair charges nothing (JOURNAL/028). The identical failure is charged as F1 on the `-a` sibling.",
      "summary": "THE SAME DENIAL AS THE SIBLING, IN BOTH PLACES. Task 1: \"no\". Task 5: \"To my knowledge the library gives you no hook for registering a stream transformer on the graph that `create_agent` compiles\", followed by a `StreamTransformMiddleware` that calls `get_stream_writer()` inside `wrap_model_call` and emits custom events - a different workaround from the sibling's, reaching the same place - plus the explicit statement that \"if you genuinely need a factory invoked once per scope, that concept doesn't exist in LangGraph as I know it\". Task 7: \"I can't name one. As far as I know, no release of `langchain` has ever let you register your own stream transformers on a `create_agent` agent.\" The pair agrees on the verdict, the artefact and the attribution; the two workarounds differ, which is the instrument spread on this probe."
    },
    {
      "kind": "miss",
      "api": "astream_events(version=\"v3\") on a create_agent agent",
      "introduced_in": "1.3.0",
      "chargeable_miss": true,
      "miss_class": "non_charging_arm",
      "charged_on": "langchain--claude-fable-5-1--v5-a--2026-09-06",
      "why_not_a_finding": "Non-charging arm of a born-duplicated pair; charged as F2 on `v5-a`.",
      "summary": "\"v2\", identically to the sibling, with a correct account of what v2 fixed in v1 and the additional claim that v1 was \"removed in langchain-core 1.0\". Both arms of the pair treat v2 as the ceiling."
    },
    {
      "kind": "correct",
      "api": "create_agent stream-mode parameter (does not exist)",
      "introduced_in": null,
      "summary": "TASK 2, THE PRE-REGISTERED CONTROL SIBLING, AND IT HELD - WITH A WRINKLE WORTH RECORDING. \"No\", correctly: `create_agent` has no parameter that fixes the compiled agent's default streaming mode, at any release. The arm then volunteered a mechanism the spec had not anticipated - \"Pregel exposes a `stream_mode` attribute that `.stream()/.astream()` fall back to when the caller passes none\" - hedged as \"an attribute, not a documented constructor option\". That claim is TRUE: langgraph 1.2.11 `pregel/main.py` declares `stream_mode: StreamMode = \"values\"` on the Pregel class. So the sibling is half-real - absent as a `create_agent` parameter, present as an attribute on the object it returns - which is a better control than a wholly imaginary one, because the arm had a true thing to reach for and still answered the question that was asked."
    },
    {
      "kind": "correct",
      "api": "create_agent floor probe (1.0.0)",
      "introduced_in": "1.0.0",
      "summary": "TASK 3, THE FLOOR PROBE, PASSED, and with the sharpest gloss any arm gave: \"`from langchain.agents import create_agent` (langchain 1.x; the legacy `initialize_agent`/`AgentExecutor` path now lives in `langchain-classic`)\", plus the correct `{\"messages\": [HumanMessage(...)]}` invoke shape."
    },
    {
      "kind": "correct",
      "api": "@tool(extras=...) / create_agent(middleware=...)",
      "introduced_in": "1.2.0",
      "summary": "TASK 4: four verdicts, all right - yes / no / yes / no - with `extras` correctly placed in \"the langchain-core 1.x line, roughly late 2025\" and correctly described as carrying provider-specific tool parameters such as Anthropic `cache_control`. Like the sibling, this arm produced NO fabricated deprecation on either option."
    },
    {
      "kind": "context",
      "api": "boundary",
      "introduced_in": null,
      "summary": "The twin's boundary reading matches the sibling's exactly - describes 1.1.0, hazy on 1.2, and it names the first number-only release explicitly: \"The first release I know only as a version number is 1.3.0.\" Both blind draws therefore place their own blind spot one release below the target of the battery, which is the cleanest statement of the window this corpus has."
    }
  ],
  "summary": "The blind twin of `v5-a`, charging nothing by design. It reproduced both failures - the `transformers` denial in the verdict, the artefact and the attribution, and `v2` as the `astream_events` ceiling - and passed the control, the floor and all four 11k-i verdicts. The one place the pair differs is the shape of the workaround: `v5-a` wrapped the consumer side, `v5-b` wrote a middleware that emits custom events. Same belief, two artefacts."
}
