From b2b744874f31da3cd9b5be90dbca9275a8997160 Mon Sep 17 00:00:00 2001 From: arpan Date: Wed, 16 Sep 2026 14:46:51 +0530 Subject: [PATCH] The roadmap says why a LangChain adapter exists after saying it would not The line 'LangGraph and not LangChain, deliberately' was true of the legacy AgentExecutor path it was about. LangChain 1.0 added wrap_tool_call, which hands the middleware the call itself, and ctrlrun-langchain 1.0.0 shipped on it on 2026-09-15. A public roadmap contradicting a released package is amended in place with the reason, as the file requires of every change, and the adapter rule is widened from 'the framework's own HITL primitive' to 'the framework's own primitive', of which a call-wrapping hook is the second kind. Signed-off-by: arpan --- docs/ROADMAP.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 611d52a..e89039c 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -99,6 +99,8 @@ Standards: first mapping doc — `docs/OWASP-AGENTIC-TOP10.md`, each guarantee m **This line said `Suspended` / `Control.resume` until `SPEC-v0.5.md` was written, and it was wrong.** `Suspended` exists for the remote asking a question *mid-execution*, where the reservation is already taken and must stay taken; an approval gate has none to hold, because v0.1 consumes the approval in the same transaction as the reservation and a human deliberating for an hour must pin nothing. `SPEC-v0.5.md` §3.1 argues it in full. The correction is recorded here rather than made silently, on the rule `SPEC-v0.4.md` §9.4 set for the threat model's sentence about a check verify could not deliver. - LangGraph and not LangChain, deliberately. LangGraph owns the primitive the adapter reuses, and LangChain's agent path runs on LangGraph, so one adapter covers both. A separate LangChain adapter would buy only the legacy `AgentExecutor` path. + + **Amended 2026-09-16, and the reason is recorded here rather than made silently.** There is a LangChain adapter now, `ctrlrun-langchain` 1.0.0, released 2026-09-15, and the sentence above is still true of the thing it was about. What changed is LangChain: 1.0 added `AgentMiddleware.wrap_tool_call`, whose contract hands the middleware the tool call itself, so `handler` *is* the executor. That is not the legacy `AgentExecutor` path and it is not an approval primitive either; it is a different surface, on which the effect is reserved before the tool runs and committed from what it returned, and a refused call never reaches the tool. An adapter on it is not the second approval path this track forbids, because it routes nothing through an interrupt: it gates the call. The rule that an adapter exists only to reuse a framework's own HITL primitive is amended to say *own primitive*, of which HITL is one kind and a call-wrapping hook is another. `ctrlrun-langgraph` still covers the LangGraph interrupt, and the two are documented as different shapes on the adapters page. - An adapter is an entry point, so each one is a `SPEC` §4.3.1 row before it is code: principal validity and expiry, then authority, then policy. Exit: two adapters pass the v0.1 and v0.3 acceptance suites through the adapter surface; and a third is written against the contract alone, in a session that may not read the kernel, because a contract that only its author can implement is not a contract.