12.8 Permission Decision Tracking
Every permission decision is fully recorded for auditing and debugging:
typescript
type DecisionSource =
| 'user_permanent' // User approved and saved rule ("Always allow")
| 'user_temporary' // User approved once
| 'user_abort' // User pressed Escape to abort
| 'user_reject' // User explicitly rejected
| 'hook' // PermissionRequest Hook decision
| 'classifier' // LLM classifier auto-approved
| 'config' // Config allowlist auto-approvedEach tool call has a unique toolUseID, and decision records are stored in the toolUseContext.toolDecisions Map. These records serve two purposes:
- Telemetry events: Each decision sends a corresponding telemetry event for security auditing and product analytics
typescript
// Telemetry events
'tengu_tool_use_granted_in_prompt_permanent' // User approved and saved
'tengu_tool_use_granted_in_prompt_temporary' // User one-time approval
'tengu_tool_use_granted_by_classifier' // LLM classifier approved
'tengu_tool_use_granted_in_config' // Config rule approved
'tengu_tool_use_granted_by_permission_hook' // Permission Hook approved
'tengu_tool_use_rejected_in_prompt' // Rejected in prompt
'tengu_tool_use_denied_in_config' // Config rule denied
// Code editing tools additionally record OTel counters
// Including file extension (language info), used for analyzing editing patterns- PermissionDenied Hook: Triggered when permission is denied, passing denial details to external scripts. Enterprises can use this to implement custom logging, alert notifications, and compliance reports.