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.