Agent tool call
Request, plan, approve, execute, reply
User interface
Agent runtime
Policy and recovery
Tool execution and evidence
Intake
Plan and route
Execute and report
Planning loop
Human or policy stop
User
Asks for work
Chat surface
Thread and files
Final reply
Answer and changes
Agent planner
Plan next step
context aware
Tool router
Choose capability
Approval gate
Scope and consent
blocks risky ops
Blocked
Wait or reject
Retry path
Revise request
Tool call
Shell, browser, MCP
structured result
External API
Network service
Context store
Repo and memory
Trace log
Events and output
plan
needs approval?
approved
denied
revise
result
record
context
diagram.html#The link keeps the view, selection, route and playback.
About this diagram
Steps done by different owners, in order: a release process, an incident runbook, an agent’s tool call.
Ask for one like it
Draw our release process as a workflow, with a lane for rollbacks.
The JSON
{ "kind": "workflow", "title": "Agent tool call", "subtitle": "Request, plan, approve, execute, reply", "lanes": [ { "id": "ui", "label": "User interface" }, { "id": "agent", "label": "Agent runtime" }, { "id": "policy", "label": "Policy and recovery", "tone": "exception" }, { "id": "tools", "label": "Tool execution and evidence" } ], "phases": [ { "id": "intake", "label": "Intake", "nodes": ["user", "chat", "store"] }, { "id": "plan", "label": "Plan and route", "nodes": ["planner", "router", "approval"] }, { "id": "execute", "label": "Execute and report", "nodes": ["tool", "external", "blocked", "retry", "final"] } ], "groups": [ { "id": "loop", "label": "Planning loop" }, { "id": "stop", "label": "Human or policy stop", "tone": "security" } ], "nodes": [ { "id": "user", "type": "external", "lane": "ui", "card": { "title": "User", "subtitle": "Asks for work" } }, { "id": "chat", "type": "client", "lane": "ui", "card": { "title": "Chat surface", "subtitle": "Thread and files" } }, { "id": "final", "type": "service", "lane": "ui", "card": { "title": "Final reply", "subtitle": "Answer and changes" } }, { "id": "planner", "type": "service", "lane": "agent", "group": "loop", "card": { "title": "Agent planner", "subtitle": "Plan next step", "tag": "context aware", "brand": "anthropic" } }, { "id": "router", "type": "service", "lane": "agent", "group": "loop", "card": { "title": "Tool router", "subtitle": "Choose capability" } }, { "id": "approval", "type": "security", "lane": "policy", "group": "stop", "card": { "title": "Approval gate", "subtitle": "Scope and consent", "tag": "blocks risky ops" } }, { "id": "blocked", "type": "security", "lane": "policy", "group": "stop", "card": { "title": "Blocked", "subtitle": "Wait or reject" } }, { "id": "retry", "type": "queue", "lane": "policy", "group": "stop", "card": { "title": "Retry path", "subtitle": "Revise request" } }, { "id": "tool", "type": "queue", "lane": "tools", "card": { "title": "Tool call", "subtitle": "Shell, browser, MCP", "tag": "structured result" } }, { "id": "external", "type": "gateway", "lane": "tools", "card": { "title": "External API", "subtitle": "Network service" } }, { "id": "store", "type": "database", "lane": "tools", "card": { "title": "Context store", "subtitle": "Repo and memory" } }, { "id": "trace", "type": "database", "lane": "tools", "card": { "title": "Trace log", "subtitle": "Events and output" } } ], "edges": [ { "id": "e1", "from": "user", "to": "chat", "tone": "main" }, { "id": "e2", "from": "chat", "to": "planner", "label": "plan", "tone": "main" }, { "id": "e3", "from": "planner", "to": "router", "tone": "main" }, { "id": "e4", "from": "router", "to": "approval", "label": "needs approval?", "tone": "security" }, { "id": "e5", "from": "approval", "to": "tool", "label": "approved", "tone": "main" }, { "id": "e6", "from": "approval", "to": "blocked", "label": "denied", "tone": "error" }, { "id": "e7", "from": "blocked", "to": "retry", "kind": "async" }, { "id": "e8", "from": "retry", "to": "planner", "label": "revise", "kind": "return" }, { "id": "e9", "from": "tool", "to": "external", "tone": "main" }, { "id": "e10", "from": "external", "to": "final", "label": "result", "kind": "return", "tone": "main" }, { "id": "e11", "from": "external", "to": "trace", "label": "record", "kind": "async" }, { "id": "e12", "from": "store", "to": "trace", "kind": "async" }, { "id": "e13", "from": "store", "to": "planner", "label": "context", "kind": "async" } ], "views": [ { "id": "gate", "label": "Approval gate", "caption": "Risky work waits for scope and consent before any tool runs.", "nodes": ["router", "approval", "tool", "blocked", "retry"] } ], "notes": [ { "title": "Runtime semantics", "items": [ "Approval gates risky work before tool execution", "A denial loops back to planning instead of failing silently", "Evidence returns through the trace log and memory" ] } ]}