#   → Runs via asyncio.to_thread() (non-blocking)
```

**This means:**
- Sync methods use sync hooks directly (no overhead)
- Async methods automatically adapt sync hooks (thread pool overhead)
- No code changes required for backward compatibility

## Migration Path

You can migrate from sync to async hooks incrementally:

| Stage | Sync Methods | Async Methods |
|-------|--------------|---------------|
| **Start** | Sync hooks | Sync hooks (auto-adapted) |
| **Partial migration** | Sync hooks | Mix of native async + adapted sync |
| **Complete** | Sync hooks | Native async hooks |

<Callout title="Performance Consideration" type="warning">
  Native async hooks are more efficient than adapted sync hooks in async contexts. Adapted hooks incur thread pool overhead for each hook invocation. For I/O-heavy hooks called frequently, native async implementations provide better performance.
</Callout>

## Mixing Sync and Async Hooks

You can register both sync and async hooks. They're invoked in registration order:

```python