hook-event-architecture
Design hook-based event systems for ADW observability. Use when implementing real-time event broadcasting, creating hook pipelines, or building agent activity monitoring.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Hook Event Architecture
Design hook-based event systems for capturing and broadcasting agent activities in AI Developer Workflows.
MANDATORY: docs-management Delegation
Documentation Verification: This skill references Claude Code hook events and configuration that may change between releases. Before implementing, invoke
hook-managementskill to verify current event types and hook configuration patterns.
Verification Checkpoint:
- Did I invoke
hook-managementfor current event types? - Did official documentation confirm the event schema?
- Is my implementation based on official docs?
When to Use
- Implementing real-time event broadcasting
- Building observability infrastructure
- Creating swimlane visualizations
- Logging agent activities to database
- Generating AI-powered event summaries
Prerequisites
- Understanding of Claude Code hooks (@hook-event-patterns.md)
- Familiarity with WebSocket patterns (@websocket-architecture.md)
- Access to Claude Agent SDK for full implementation
SDK Requirement
Implementation Note: Full hook event architecture requires Claude Agent SDK with custom tooling. This skill provides design patterns and specifications.
Event Types
Documentation Verification: The event types listed here are Claude Code internal types that may change between releases. For authoritative current event types, query the
hook-managementskill which delegates todocs-managementfor official documentation.
ADW systems capture these event types:
| Event Type | Icon | Source | Payload |
|---|---|---|---|
PreToolUse |
🪝 | Hook | Tool name, inputs, session |
PostToolUse |
🪝 | Hook | Tool name, outputs, duration |
TextBlock |
💬 | Agent | Response text, tokens |
ToolUseBlock |
🛠️ | Agent | Tool invocation record |
ThinkingBlock |
🧠 | Agent | Extended thinking content |
StepStart |
⚙️ | System | Step name, inputs |
StepEnd |
⚙️ | System | Step name, outputs, duration |
Architecture Design Process
Step 1: Define Event Schema
Create Pydantic models for events:
class ADWEvent(BaseModel):
type: str # Event type from table
adw_id: str # 8-char correlation ID
step: str # Current step name
timestamp: datetime
payload: dict # Type-specific data
summary: str | None # AI-generated summary
Step 2: Configure Hook Triggers
Set up Claude Code hooks:
{
"hooks": {
"PreToolUse": [{
"matcher": ".*",
"command": "python hooks/pre_tool.py"
}],
"PostToolUse": [{
"matcher": ".*",
"command": "python hooks/post_tool.py"
}]
}
}
Step 3: Design Event Pipeline
Agent Execution
│
├── PreToolUse ──► Hook Script ──┬── Log to DB
│ ├── Summarize (Haiku)
▼ └── Broadcast (WebSocket)
Tool Execution
│
├── PostToolUse ──► Hook Script ──┬── Log to DB
│ ├── Summarize (Haiku)
▼ └── Broadcast (WebSocket)
Continue...
Step 4: Implement Summarization
AI-generated event summaries using Haiku:
async def summarize_event(event: ADWEvent) -> str:
prompt = f"""Summarize in 15 words or less:
Event: {event.type}
Tool: {event.payload.get('tool_name', 'N/A')}
Data: {str(event.payload)[:500]}
"""
return await claude.complete(prompt, model="haiku")
Step 5: Design Broadcast Pattern
Event distribution to clients:
class EventBroadcaster:
def __init__(self, ws_manager, db_client):
self.ws = ws_manager
self.db = db_client
async def broadcast(self, event: ADWEvent):
# Log to database first
await self.db.log_event(event)
# Broadcast to WebSocket clients
await self.ws.broadcast(event.dict())
Hook Script Templates
PreToolUse Hook
#!/usr/bin/env python
import sys, json, asyncio
from adw_modules import broadcast, summarize
async def main():
data = json.load(sys.stdin)
event = {
"type": "PreToolUse",
"adw_id": data.get("adw_id"),
"step": data.get("step"),
"payload": {
"tool_name": data["tool_name"],
"tool_input": data["tool_input"]
}
}
event["summary"] = await summarize(event)
await broadcast(event)
if __name__ == "__main__":
asyncio.run(main())
PostToolUse Hook
#!/usr/bin/env python
import sys, json, asyncio
from adw_modules import broadcast, summarize
async def main():
data = json.load(sys.stdin)
event = {
"type": "PostToolUse",
"adw_id": data.get("adw_id"),
"step": data.get("step"),
"payload": {
"tool_name": data["tool_name"],
"tool_output": data.get("tool_output", "")[:1000],
"duration_ms": data.get("duration_ms", 0)
}
}
event["summary"] = await summarize(event)
await broadcast(event)
if __name__ == "__main__":
asyncio.run(main())
Output Format
When designing hook event architecture:
## Hook Event Architecture Design
### Event Types
| Type | Trigger | Payload Schema |
| --- | --- | --- |
| [type] | [when triggered] | [fields] |
### Hook Configuration
```json
[hooks.json configuration]
Event Pipeline
[ASCII diagram of flow]
Summarization Strategy
[How Haiku generates summaries]
Broadcasting Pattern
[WebSocket or other broadcast mechanism]
Database Schema
[Event logging tables]
Implementation Checklist
- [Step 1]
- [Step 2] ...
## Design Checklist
- [ ] Event types defined with payloads
- [ ] Hook configuration specified
- [ ] Event pipeline documented
- [ ] Summarization prompt designed
- [ ] Broadcast mechanism chosen
- [ ] Database schema defined
- [ ] Error handling considered
- [ ] Performance implications assessed
## Anti-Patterns
| Anti-Pattern | Problem | Solution |
| --- | --- | --- |
| Sync broadcasting | Blocks agent execution | Async dispatch |
| No correlation ID | Can't trace workflows | Use adw_id |
| Raw payload logging | Token waste | Truncate large data |
| Missing summaries | Hard to scan | Always summarize |
| No error handling | Silent failures | Log and recover |
## Cross-References
- @hook-event-patterns.md - Event type details
- @websocket-architecture.md - Broadcasting patterns
- @production-patterns.md - Database logging
- @adw-framework.md - ADW overview
## Version History
- **v1.0.0** (2026-01-01): Initial release (Lesson 14)
---
## Last Updated
**Date:** 2026-01-01
**Model:** claude-opus-4-5-20251101
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-02-04
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!