circuit-breaker-open Hook
Metadata
name: circuit-breaker-open
version: 1.0.0
category: resilience
status: active
priority: P1
trigger: CircuitBreaker state changes to OPEN
derived_from: Claude Operating Preferences v4.0/v5.0
Description
Triggered when a circuit breaker transitions to the OPEN state due to repeated failures. Logs the event, notifies the user, and suggests mitigation strategies.
Trigger Conditions
- Circuit breaker failure count exceeds threshold
- Circuit transitions from CLOSED to OPEN
- Circuit transitions from HALF_OPEN to OPEN (recovery failed)
Actions
-
Log Event
- Record circuit name and failure count
- Log last error details
- Record timestamp and recovery timeout
-
Notify User
- Display warning about service degradation
- Show affected operations
- Provide retry_after time
-
Suggest Mitigation
- Recommend fallback strategies
- Suggest manual intervention if needed
- Provide health check command
Configuration
# hooks/circuit-breaker-open.yaml
hook:
name: circuit-breaker-open
enabled: true
triggers:
- event: circuit_state_change
from_state: [CLOSED, HALF_OPEN]
to_state: OPEN
actions:
- type: log
level: warning
include:
- circuit_name
- failure_count
- last_error
- recovery_timeout
- type: notify
message: |
Circuit breaker OPEN: {circuit_name}
Failures: {failure_count}
Retry after: {recovery_timeout}s
- type: suggest
options:
- "Wait for recovery timeout"
- "Use fallback service"
- "Manual intervention required"
Example Output
[HOOK: circuit-breaker-open]
Circuit Breaker OPEN
--------------------
Circuit: external_api
State: CLOSED → OPEN
Failures: 5 consecutive
Last Error: ConnectionTimeout after 30s
Recovery: 60s (retry at 15:05:00)
Health Report
-------------
Success Rate: 0%
Last Success: 15:02:45
P95 Latency: 28.5s (before failure)
Mitigation Options
------------------
1. Wait 60s for automatic recovery attempt
2. Use cached data if available
3. Run: /circuit-status external_api --force-half-open
Warning: Operations using external_api will fail until recovery.
Integration
class CircuitBreakerOpenHook:
"""Hook handler for circuit breaker open events"""
async def on_circuit_open(
self,
circuit_name: str,
failure_count: int,
last_error: str,
recovery_timeout: float,
health_report: dict
):
"""Handle circuit opening"""
self._log_event(circuit_name, failure_count, last_error)
self._notify_user(circuit_name, recovery_timeout)
self._suggest_mitigation(circuit_name, health_report)
def _log_event(
self,
circuit_name: str,
failure_count: int,
last_error: str
):
"""Log circuit open event"""
import logging
logger = logging.getLogger("circuit_breaker")
logger.warning(
f"Circuit {circuit_name} OPEN after {failure_count} failures. "
f"Last error: {last_error}"
)
def _notify_user(self, circuit_name: str, recovery_timeout: float):
"""Notify user of circuit open"""
from datetime import datetime, timedelta
retry_time = datetime.now() + timedelta(seconds=recovery_timeout)
print(f"\n[HOOK: circuit-breaker-open]")
print(f"Circuit: {circuit_name}")
print(f"Status: OPEN")
print(f"Retry at: {retry_time.strftime('%H:%M:%S')}")
def _suggest_mitigation(self, circuit_name: str, health_report: dict):
"""Suggest mitigation strategies"""
success_rate = health_report.get("success_rate", 0)
if success_rate == 0:
print("\nRecommendation: Service appears down. Consider fallback.")
else:
print(f"\nRecommendation: Intermittent failures ({success_rate*100:.0f}% success)")
print(f"Check status: /circuit-status {circuit_name}")
Related Components
skills/circuit-breaker-patterns/- Circuit breaker implementationagents/circuit-breaker-monitor.md- Monitoring agentcommands/circuit-status.md- CLI commandscripts/circuit-breaker-manager.py- Management script