{
  "$schema": "../../schema/run.schema.json",
  "run_id": "langchain--claude-fable-5--v1--2026-08-31",
  "markdown": "data/langchain/fable-5.md",
  "supersedes": null,
  "library": {
    "name": "langchain",
    "ecosystem": "pypi",
    "latest_version_at_test": "1.3.18",
    "latest_version_verified_on": "2026-08-31"
  },
  "model": {
    "id": "claude-fable-5",
    "label": "Claude Fable 5",
    "vendor": "Anthropic",
    "invoked_as": "Agent tool, model alias \"fable\"",
    "self_reported_cutoff": "2026-01",
    "cutoff_basis": "Self-reported: \"January 2026, as best I know.\"",
    "believed_latest_version": "1.0.x",
    "believed_latest_quote": "\"The newest `langchain` version numbers I have *seen referenced* are 1.x patch releases from late 2025 — I believe 1.0.x into November/December 2025, and I cannot state the exact latest patch with confidence. The most recent release whose *contents I can actually describe* is langchain 1.0.0, released around October 2025 ... Anything after 1.0.0 I know as version numbers at most, not contents.\"",
    "knowledge_stops_at_version": "1.0.0",
    "knowledge_stops_on": "2025-10-17",
    "knowledge_gap_starts_at_version": "1.1.0",
    "knowledge_gap_starts_on": "2025-11-24",
    "cutoff_lag_months": 3
  },
  "test": {
    "date": "2026-08-31",
    "battery": "langchain/v1",
    "battery_spec": "prompts/langchain.md",
    "prompt_file": null,
    "tasks": 11,
    "direct_questions": 3,
    "tool_uses_during_test": 0,
    "probe_window": {
      "from": "1.0.0",
      "to": "1.2.0"
    },
    "self_test": false,
    "saturated": false,
    "status": "open",
    "retested_on": null
  },
  "sources": [
    "https://docs.langchain.com/oss/python/releases/langchain-v1",
    "https://docs.langchain.com/oss/python/migrate/langchain-v1",
    "https://docs.langchain.com/oss/python/migrate/langgraph-v1",
    "https://docs.langchain.com/oss/python/releases/changelog",
    "https://docs.langchain.com/oss/python/langchain/tools",
    "https://reference.langchain.com/python/langchain/",
    "https://reference.langchain.com/python/langchain-classic/",
    "https://pypi.org/pypi/langchain/json"
  ],
  "summary": "Eleven code tasks, eleven pieces of working LangChain v1, from the subject with the shortest measured lag in the Index — three months. `create_agent`, `system_prompt`, `ToolRuntime`, `wrap_model_call`, the `\"model\"` node, `.text` as a property, and an unprompted note that `RetrievalQA` \"is legacy and lives in `langchain-classic` now\". One finding: version attribution stops at 1.0.0 (2025-10-17) — it can describe that release and cannot describe 1.1.0, which shipped 2025-11-24, inside its stated 2026-01 window. Battery v1 does not probe 1.1.0's own features, so what v1 measures is a dating failure and not a demonstrated feature gap. AMENDED 2026-09-01: battery v3 did probe them, and found the gap — this subject failed all three surviving probes into 1.1.0 (JOURNAL/022). The sentence above still describes v1's own scope correctly; it no longer implies that no gap exists. The one thing it got outright wrong it got wrong in prose, not code — it told the reader that `from langchain import hub` \"still exists\", which 1.0.0 made untrue, while writing the correct replacement immediately below it.",
  "findings": [
    {
      "id": "F1",
      "severity": "S4",
      "severity_label": "wrong-metadata",
      "title": "Version knowledge stops at 1.0.0, with 1.1.0 inside its window",
      "api": null,
      "change_kind": "version-fact",
      "introduced_in": "1.1.0",
      "introduced_on": "2025-11-24",
      "chargeable": true,
      "chargeable_note": "Anchored to 1.1.0 (2025-11-24), the first release the subject cannot describe — not to the current 1.3.18. 1.1.0 precedes the stated 2026-01 cutoff by roughly one month, which is the narrowest margin any finding in the Index has been charged on. 1.2.0 (2025-12-15) is also inside the window.",
      "model_belief": "\"Anything after 1.0.0 I know as version numbers at most, not contents.\" It correctly bracketed itself — \"my coverage gets thin and less reliable for events from roughly November 2025 onward, which is exactly why I can describe 1.0.0 but not its latest patches\" — and 2025-11-24 is where 1.1.0 landed.",
      "wrong_code": null,
      "correct_code": null,
      "impact": "Minimal in practice: 1.1.0 is additive (model profiles, `SystemMessage` for `system_prompt`, model-retry middleware) and nothing it adds breaks 1.0 code. Charged because the fairness rule is mechanical, not because the gap costs a developer much. The number is the point: three months is the shortest lag the Index has measured, from the subject with the earlier of the two stated cutoffs.",
      "citations": [
        {
          "url": "https://docs.langchain.com/oss/python/releases/changelog",
          "title": "LangChain changelog — langchain v1.1.0",
          "published_on": "2025-11-25",
          "quote": "Chat models now expose supported features and capabilities through a .profile attribute."
        },
        {
          "url": "https://pypi.org/pypi/langchain/json",
          "title": "PyPI JSON API — langchain release timestamps (1.1.0 uploaded 2025-11-24)"
        }
      ]
    }
  ],
  "non_findings": [
    {
      "kind": "correct",
      "summary": "Task 2: `create_agent` from `langchain.agents` with `@tool` from `langchain.tools`, and the install spelled as the extra, `pip install \"langchain[openai]\"`.",
      "api": "langchain.agents.create_agent",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 3: `system_prompt=`, with the rename attributed correctly — \"In the pre-1.0 LangGraph `create_react_agent` this parameter was called `prompt`.\"",
      "api": "create_agent(system_prompt=...)",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 4: retrieve-then-answer written by hand, with the chain removal stated unprompted — \"the old `RetrievalQA` chain is legacy and lives in `langchain-classic` now.\"",
      "api": "langchain.chains (LLMChain, ConversationChain, RetrievalQA)",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 5: `InMemorySaver` checkpointer and `thread_id`, with the persistent alternatives named.",
      "api": "langchain.memory (ConversationBufferMemory)",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 7: `response_format=WeatherReport` with a bare Pydantic model, reading `result[\"structured_response\"]`. Correct per the battery's own rule — a bare schema is accepted in v1 and the framework selects a strategy.",
      "api": "create_agent(response_format=...)",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 8: `ToolRuntime[Context]` with `context_schema` and `context=`, plus the correct pre-1.0 comparison (`InjectedToolArg` / `config[\"configurable\"]`).",
      "api": "run-scoped context (context= / context_schema=)",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 9: `@wrap_model_call` middleware wrapping `trim_messages`, with `request.override(messages=...)`.",
      "api": "create_agent(pre_model_hook=...) / post_model_hook",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 10: both spellings of the filter — `\"model\" in chunk` for `stream_mode=\"updates\"` and `meta.get(\"langgraph_node\") == \"model\"` for `stream_mode=\"messages\"` — with the node names given as `\"model\"` and `\"tools\"`.",
      "api": "agent streaming node name",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "correct",
      "summary": "Task 11: `.text` as a property, with the version note — \"`.text` is a property in langchain-core 1.x; on older 0.3.x it was the method `resp.text()`.\"",
      "api": "message.text",
      "introduced_in": "1.0.0"
    },
    {
      "kind": "imprecision",
      "summary": "Task 6 wrote the correct `langsmith.Client().pull_prompt(...)` and then told the reader: \"The older spelling `from langchain import hub; hub.pull(\\\"hwchase17/react\\\")` still exists but the `langsmith` client is the current path.\" It does not still exist — 1.0.0 moved `hub` to `langchain-classic`.",
      "api": "langchain.hub",
      "introduced_in": "1.0.0",
      "why_not_a_finding": "Code-vs-claim rule, applied against the Index's own interest. The generated code is correct and the correct path is named; the false half is an aside about the legacy route. Under a stricter reading this is a flat wrong statement rather than a hedge, and it is the one place in this run where the rule's edge is doing real work — recorded here in full so a reader can disagree with the call."
    },
    {
      "kind": "imprecision",
      "summary": "Task 11 described `langchain-anthropic`'s default as \"small (historically 1024)\". 1.0.0 replaced the flat 1024 default with a per-model value.",
      "api": "ChatAnthropic(max_tokens=...)",
      "introduced_in": "1.0.0",
      "why_not_a_finding": "Hedged with \"historically\", and the code sets `max_tokens=8192` explicitly, which is correct regardless of the default."
    },
    {
      "kind": "correct",
      "summary": "Belief probe (c): listed the v1 namespace accurately — `langchain.agents` (with `create_agent`, `AgentState`, `middleware`), `langchain.chat_models`, `langchain.tools`, `langchain.messages`, `langchain.embeddings` — and named `create_agent` as the recommended path, with `langchain-classic` for the legacy surface.",
      "api": "langchain package namespace",
      "introduced_in": "1.0.0"
    }
  ],
  "open_questions": []
}
