II.
HookSurface JSON
Structured · livehook-surface:after-agent
AfterAgent (canonical) json
Inspect the normalized record payload exactly as the atlas UI reads it.
{
"id": "hook-surface:after-agent",
"_kind": "HookSurface",
"_file": "channels-hooks/hook-surfaces/canonical/missing-canonical-hooks.yaml",
"_cluster": "channels-hooks",
"attributes": {
"eventName": "AfterAgent (canonical)",
"displayName": "AfterAgent (canonical)",
"kind": "canonical",
"direction": "post",
"blocking": false,
"family": "in-process",
"payloadSchema": {
"type": "object",
"required": [
"agent_name",
"agent_input",
"agent_result",
"session_id",
"transcript_path"
],
"properties": {
"agent_name": {
"type": "string",
"description": "Name of the subagent that just ran."
},
"agent_input": {
"type": "object",
"description": "Input the subagent was launched with."
},
"agent_result": {
"type": "object",
"description": "Subagent's terminal output / structured result."
},
"session_id": {
"type": "string"
},
"transcript_path": {
"type": "string"
}
}
},
"description": "Fires when a subagent invocation completes. Distinct from SubagentStop\n(which fires when the subagent process is terminating but before\nresult aggregation). AfterAgent is non-blocking; observers receive the\nfinal result envelope for telemetry / logging / accounting.\n"
},
"outgoingEdges": [],
"incomingEdges": [
{
"from": "agent-runtime-impl:claude-code.runtime@1.x",
"to": "hook-surface:after-agent",
"kind": "exposes",
"attributes": {}
},
{
"from": "hook-mapping:after-agent-gemini",
"to": "hook-surface:after-agent",
"kind": "maps_hook",
"attributes": {}
}
]
}