198**`claude_code.tool.blocked_on_user`**198**`claude_code.tool.blocked_on_user`**
199 199
200| Attribute | Description | Gated by |200| Attribute | Description | Gated by |
201| ------------- | --------------------------------------------------- | -------- |201| ------------- | ------------------------------------------------------------------------- | -------- |
202| `duration_ms` | Time spent waiting for the permission decision | |202| `duration_ms` | Time spent waiting for the permission decision | |
203| `decision` | `accept` or `reject` | |203| `decision` | `accept` or `reject` | |
204| `source` | Decision source, matching the `tool_decision` event | |204| `source` | Decision source, matching the [Tool decision event](#tool-decision-event) | |
205 205
206**`claude_code.tool.execution`**206**`claude_code.tool.execution`**
207 207
458* All [standard attributes](#standard-attributes)458* All [standard attributes](#standard-attributes)
459* `tool_name`: Tool name (`"Edit"`, `"Write"`, `"NotebookEdit"`)459* `tool_name`: Tool name (`"Edit"`, `"Write"`, `"NotebookEdit"`)
460* `decision`: User decision (`"accept"`, `"reject"`)460* `decision`: User decision (`"accept"`, `"reject"`)
461* `source`: Decision source - `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`461* `source`: Where the decision came from. One of `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`. See the [Tool decision event](#tool-decision-event) for what each value means.
462* `language`: Programming language of the edited file, such as `"TypeScript"`, `"Python"`, `"JavaScript"`, or `"Markdown"`. Returns `"unknown"` for unrecognized file extensions.462* `language`: Programming language of the edited file, such as `"TypeScript"`, `"Python"`, `"JavaScript"`, or `"Markdown"`. Returns `"unknown"` for unrecognized file extensions.
463 463
464#### Active time counter464#### Active time counter
524* `error_type`: Error category string when the tool failed, such as `"Error:ENOENT"` or `"ShellError"`524* `error_type`: Error category string when the tool failed, such as `"Error:ENOENT"` or `"ShellError"`
525* `error` (when `OTEL_LOG_TOOL_DETAILS=1`): Full error message when the tool failed525* `error` (when `OTEL_LOG_TOOL_DETAILS=1`): Full error message when the tool failed
526* `decision_type`: Either `"accept"` or `"reject"`526* `decision_type`: Either `"accept"` or `"reject"`
527* `decision_source`: Decision source - `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`527* `decision_source`: Where the decision came from. One of `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`. See the [Tool decision event](#tool-decision-event) for what each value means.
528* `tool_input_size_bytes`: Size of the JSON-serialized tool input in bytes528* `tool_input_size_bytes`: Size of the JSON-serialized tool input in bytes
529* `tool_result_size_bytes`: Size of the tool result in bytes529* `tool_result_size_bytes`: Size of the tool result in bytes
530* `mcp_server_scope`: MCP server scope identifier (for MCP tools)530* `mcp_server_scope`: MCP server scope identifier (for MCP tools)
635* `tool_name`: Name of the tool (for example, "Read", "Edit", "Write", "NotebookEdit")635* `tool_name`: Name of the tool (for example, "Read", "Edit", "Write", "NotebookEdit")
636* `tool_use_id`: Unique identifier for this tool invocation. Matches the `tool_use_id` passed to hooks, allowing correlation between OTel events and hook-captured data.636* `tool_use_id`: Unique identifier for this tool invocation. Matches the `tool_use_id` passed to hooks, allowing correlation between OTel events and hook-captured data.
637* `decision`: Either `"accept"` or `"reject"`637* `decision`: Either `"accept"` or `"reject"`
638* `source`: Decision source - `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`638* `source`: Where the decision came from:
639 * `"config"`: Decided automatically without prompting, based on project settings, enterprise managed policy, `--allowedTools` or `--disallowedTools` flags, the active permission mode, or because the tool is inherently safe.
640 * `"hook"`: A `PreToolUse` or `PermissionRequest` hook returned the decision.
641 * `"user_permanent"`: Emitted when the user chose "Always allow" when prompted, saving a rule to their personal settings. Also emitted for later calls that match that saved rule. Treated as an accept.
642 * `"user_temporary"`: Emitted when the user chose "Yes" or "Yes, for this session" when prompted, without saving a rule. Also emitted for later calls in the same session that match that session-scoped allow. Treated as an accept.
643 * `"user_abort"`: Emitted when the user dismissed the permission prompt without answering. Treated as a reject.
644 * `"user_reject"`: Emitted when the user chose "No" when prompted, or a call matched a deny rule in their personal settings. Treated as a reject.
639 645
640#### Permission mode changed event646#### Permission mode changed event
641 647