II.
HookSurface JSON
Structured · livehook-surface:claude.post-tool-batch
PostToolBatch (Claude Code) json
Inspect the normalized record payload exactly as the atlas UI reads it.
{
"id": "hook-surface:claude.post-tool-batch",
"_kind": "HookSurface",
"_file": "channels-hooks/hook-surfaces/native/claude-code-extended-hooks.yaml",
"_cluster": "channels-hooks",
"attributes": {
"eventName": "PostToolBatch (Claude Code)",
"displayName": "PostToolBatch (Claude Code)",
"kind": "native",
"originVendor": "Anthropic",
"direction": "post",
"blocking": true,
"family": "in-process",
"payloadSchema": {
"type": "object",
"required": [
"hook_event_name",
"tool_results"
],
"properties": {
"hook_event_name": {
"type": "string",
"const": "PostToolBatch"
},
"tool_results": {
"type": "array",
"items": {
"type": "object",
"required": [
"tool_name",
"tool_input",
"tool_use_id"
],
"properties": {
"tool_name": {
"type": "string"
},
"tool_input": {
"type": "object"
},
"tool_use_id": {
"type": "string"
},
"tool_result": {
"type": [
"string",
"null"
]
},
"error_message": {
"type": [
"string",
"null"
]
}
}
}
}
}
},
"description": "Fires once after a parallel batch of tool calls fully resolves, before\nthe next model call. The single hook receives all tool results in one\narray — convenient for cross-tool reasoning. Subscribers can block the\nnext model call via decision: \"block\".\n"
},
"outgoingEdges": [],
"incomingEdges": [
{
"from": "agent-runtime-impl:claude-code.runtime@1.x",
"to": "hook-surface:claude.post-tool-batch",
"kind": "exposes",
"attributes": {}
},
{
"from": "hook-mapping:claude-post-tool-batch",
"to": "hook-surface:claude.post-tool-batch",
"kind": "maps_hook",
"attributes": {}
}
]
}