An administrator read the transfer line by line: twenty units, approved vendor, signed off. Two thousand units left the account under that approval.

A paper published on 17 September names this Loopjacking and reproduces it in released products: a human approves operation A, the implementation spends that decision on operation B.

Flat:

1. Two variants, needing different fixes. Representation mismatch: B is already in the request, but the approval view omits the fields that make it B. State substitution: the human sees the correct A, then mutable pending state is replaced before the decision is spent. Rendering the whole request fixes the first. Only a use-time comparison fixes the second.

2. Agno AgentOS: seven released versions, 2.5.6 through 3.0.9, five of five trials at 3.0.9. LangGraph Agent Server: twelve tested versions, 0.7.5 through 0.14.0. OpenClaw 2026.2.23 vulnerable, 2026.2.24 rejects it. OpenAI Agents SDK 0.22.0 and 0.22.2 are the negative control: zero of six, because serialized continuation keeps the binding.

3. Before you file this under "upgrade". The Agno change being cited alongside it is pull request 10270, nine authorization guard fixes merged 22 September: endpoint gating, scope namespaces, JWT checks. It is an endpoint-authorization audit, and says nothing about binding an approval to an action. Downgrading is worse — 2.5.6 is the lower bound only because 2.5.5 ran the substituted operation with no approval at all.

4. For two of the three, no patch exists to wait for. LangGraph's result is conditional on an authorization policy that lets a non-approver update a shared pending thread — configuration you own, not a version you bump. And if you are an EU financial entity, DORA Article 9(3)(c) has required you since 17 January 2025 to prevent "the impairment of the authenticity and integrity" of your data. A pending task is data. An approval record whose action was swapped is not authentic.

My Monday: capture the approval view and the full request, mutate one material field through each post-review surface, then assert the exact operation at the sink, not the status code. Six cases, one afternoon — unchanged A passes, substituted B is rejected, a consumed approval cannot be replayed.

An approval gate records that a human decided. Binding that decision to an action is separate work, and three of the four tested had not done it.

Which of your approvals has anyone ever tried to substitute?

#AgenticAI #DORA #AIGovernance #DevSecOps #EUTech