Agent-almanac design-on-call-rotation
git clone https://github.com/pjt222/agent-almanac
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/es/skills/design-on-call-rotation" ~/.claude/skills/pjt222-agent-almanac-design-on-call-rotation-e767d2 && rm -rf "$T"
i18n/es/skills/design-on-call-rotation/SKILL.mdDiseñar la Rotación de Guardia
Crea un horario de guardia sostenible que equilibre la cobertura con el bienestar del ingeniero.
Cuándo Usar
- Configurar la guardia por primera vez
- Escalar el equipo de 2-3 a 5+ ingenieros
- Abordar el agotamiento de la guardia o la fatiga de alertas
- Mejorar los tiempos de respuesta a incidentes
- Después de que un post-mortem identifique problemas de traspaso
Entradas
- Requerido: Tamaño del equipo y zonas horarias
- Requerido: Requisitos de SLA del servicio (tiempo de respuesta, horas de cobertura)
- Opcional: Volumen histórico de incidentes y temporización
- Opcional: Presupuesto para compensación de guardia
- Opcional: Herramienta de guardia existente (PagerDuty, Opsgenie)
Procedimiento
Paso 1: Definir el Horario de Rotación
Elige la duración de la rotación según el tamaño del equipo:
## Rotation Models ### Weekly Rotation (5+ person team) - **Length**: 7 days (Monday 09:00 to Monday 09:00) - **Pros**: Predictable, easy to plan around - **Cons**: Whole week disrupted if alerts are frequent ### 12-Hour Split (3-4 person team) - **Day shift**: 08:00-20:00 local time - **Night shift**: 20:00-08:00 local time - **Pros**: Shared burden, night coverage paid differently - **Cons**: More handoffs, coordination needed ### Follow-the-Sun (Global team) - **APAC**: 00:00-08:00 UTC - **EMEA**: 08:00-16:00 UTC - **Americas**: 16:00-00:00 UTC - **Pros**: No night shifts, timezone-aligned - **Cons**: Requires distributed team ### Two-Tier (Senior/Junior split) - **Primary**: Junior engineers (first responder) - **Secondary**: Senior engineers (escalation) - **Pros**: Training opportunity, lighter senior load - **Cons**: Risk of junior burnout
Ejemplo de horario para un equipo de 5 personas:
Week 1: Alice (Primary), Bob (Secondary) Week 2: Charlie (Primary), Diana (Secondary) Week 3: Eve (Primary), Alice (Secondary) Week 4: Bob (Primary), Charlie (Secondary) Week 5: Diana (Primary), Eve (Secondary)
Esperado: Horario que rota equitativamente y proporciona cobertura 24/7.
En caso de fallo: Si existen lagunas de cobertura, agregar más ingenieros o reducir el SLA a solo horas de oficina.
Paso 2: Configurar la Política de Escalada
Configura la escalada por niveles en PagerDuty/Opsgenie:
# PagerDuty escalation policy (YAML representation) escalation_policy: name: "Production Services" repeat_enabled: true num_loops: 3 escalation_rules: - id: primary escalation_delay_in_minutes: 0 targets: - type: schedule id: primary_on_call_schedule - id: secondary escalation_delay_in_minutes: 15 targets: - type: schedule id: secondary_on_call_schedule - id: manager escalation_delay_in_minutes: 30 targets: - type: user id: engineering_manager
Crea un diagrama de flujo de escalada:
Alert Fires ↓ Primary On-Call Paged ↓ Wait 15 minutes (no ack) ↓ Secondary On-Call Paged ↓ Wait 15 minutes (no ack) ↓ Manager Paged ↓ Repeat cycle (max 3 times)
Esperado: Ruta de escalada clara con retrasos razonables.
En caso de fallo: Si las escaladas se activan con demasiada frecuencia, acortar las ventanas de reconocimiento o verificar la calidad de las alertas.
Paso 3: Definir el Procedimiento de Traspaso
Crea una lista de verificación estructurada de traspaso:
## On-Call Handoff Checklist ### Outgoing On-Call - [ ] Update incident log with any ongoing issues - [ ] Document any workarounds or known issues - [ ] Share any alerts that are "noisy but safe to ignore" temporarily - [ ] Note any upcoming deploys or maintenance windows - [ ] Provide context on any flapping alerts ### Incoming On-Call - [ ] Review incident log from previous shift - [ ] Check for any ongoing incidents - [ ] Verify PagerDuty/Opsgenie has correct contact info - [ ] Test alert delivery (send test page to yourself) - [ ] Review recent deploys and release notes - [ ] Check capacity metrics for any concerning trends ### Handoff Meeting (15 min) - Review any incidents from past week - Discuss any changes to systems or runbooks - Questions and clarifications
Automatiza los recordatorios de traspaso:
# Slack reminder script curl -X POST https://slack.com/api/chat.postMessage \ -H "Authorization: Bearer $SLACK_BOT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "channel": "#on-call", "text": "On-call handoff in 1 hour. Outgoing: @alice, Incoming: @bob. Please use the handoff checklist: https://wiki.company.com/oncall-handoff" }'
Esperado: Transferencia fluida de conocimiento, sin pérdida de información entre turnos.
En caso de fallo: Si los incidentes se repiten porque el ingeniero entrante no sabía sobre las soluciones temporales, hacer el traspaso obligatorio.
Paso 4: Implementar la Gestión de la Fatiga
Establece reglas para prevenir el agotamiento:
## Fatigue Prevention Rules ### Alert Volume Limits - **Threshold**: Max 5 pages per night (22:00-06:00) - **Action**: If exceeded, trigger incident review next day - **Goal**: Reduce noisy alerts that disrupt sleep ### Time Off After Major Incident - **Rule**: If on-call handles P1 incident >2 hours overnight, they get comp time - **Amount**: Equal to incident duration (e.g., 3-hour incident = 3 hours off) - **Scheduling**: Must be taken within 2 weeks ### Maximum Consecutive Weeks - **Limit**: No more than 2 consecutive weeks on-call - **Reason**: Prevents exhaustion from extended coverage ### Minimum Rest Between Rotations - **Cooldown**: At least 2 weeks between primary rotations - **Exception**: Emergency coverage (requires manager approval) ### Vacation Protection - **Rule**: No on-call during scheduled vacation - **Process**: Mark as "Out of Office" in PagerDuty 2 weeks in advance - **Swap**: Coordinate swap with team, update schedule
Rastrear las métricas de fatiga de alertas:
# Alerts per on-call engineer per week count(ALERTS{alertstate="firing"}) by (oncall_engineer) # Nighttime pages (22:00-06:00 local) count(ALERTS{alertstate="firing", hour_of_day>=22 or hour_of_day<6}) # Time to acknowledge (should be <5 min during business hours) histogram_quantile(0.95, rate(alert_ack_duration_seconds_bucket[7d]))
Esperado: La carga de guardia es sostenible, los ingenieros no están crónicamente agotados.
En caso de fallo: Si se produce el agotamiento a pesar de las reglas, reducir el volumen de alertas o contratar más ingenieros.
Paso 5: Documentar los Manuales y los Contactos de Escalada
Crea una guía de referencia rápida para la guardia:
# On-Call Quick Reference ## Emergency Contacts - **Engineering Manager**: Alice Smith, +1-555-0100 - **CTO**: Bob Johnson, +1-555-0200 - **Security Team**: security@company.com, +1-555-0300 - **Cloud Provider Support**: AWS Support Case Portal ## Common Runbooks - [Database Connection Pool Exhaustion](https://wiki/runbook-db-pool) - [High API Latency](https://wiki/runbook-api-latency) - [Disk Space Full](https://wiki/runbook-disk-full) - [SSL Certificate Expiration](https://wiki/runbook-ssl-renewal) ## Access & Credentials - **Production AWS**: SSO via company.okta.com - **Kubernetes**: `kubectl --context production` - **Database**: Read-only access via Bastion host - **Secrets**: 1Password vault "On-Call Production" ## Escalation Decision Tree - **P1 (Service Down)**: Immediate response, escalate to manager after 30min - **P2 (Degraded)**: Response within 15min, escalate if not resolved in 1 hour - **P3 (Warning)**: Acknowledge, resolve during business hours - **Security Incident**: Immediately escalate to Security Team, don't investigate alone
Esperado: El ingeniero de guardia puede encontrar cualquier información necesaria en menos de 2 minutos.
En caso de fallo: Si los ingenieros preguntan repetidamente "¿dónde está X?", centralizar la documentación.
Paso 6: Programar Retrospectivas Regulares de Guardia
Revisa la experiencia de guardia mensualmente:
## On-Call Retrospective Agenda (Monthly) ### Metrics Review (15 min) - Total alerts: [X] (target: <50/week) - Nighttime pages: [Y] (target: <5/week) - Mean time to acknowledge: [Z] (target: <5 min) - Incidents by severity: P1: [A], P2: [B], P3: [C] ### Qualitative Feedback (20 min) - What was the most challenging incident? - Which alerts were noisy/low-value? - Were runbooks helpful? Which need updates? - Any gaps in monitoring or alerting? ### Action Items (10 min) - Fix noisy alerts identified - Update runbooks that were incomplete - Adjust rotation schedule if needed - Plan alert tuning work ### Recognition (5 min) - Shout-outs for excellent incident response - Share learnings from interesting incidents
Rastrea la mejora a lo largo del tiempo:
# Generate monthly on-call report cat > oncall_report_2025-02.md <<EOF # On-Call Report: February 2025 ## Key Metrics - **Total Alerts**: 38 (down from 52 in January) - **Nighttime Pages**: 4 (within target) - **P1 Incidents**: 1 (database outage, 45min MTTR) - **P2 Incidents**: 3 (all resolved <1 hour) ## Improvements Made - Tuned CPU alert threshold (reduced false positives by 40%) - Added runbook for Redis cache failures - Implemented log rotation (prevented disk full alerts) ## Upcoming Changes - Migrate to follow-the-sun rotation (Q2) - Add Slack alert integration (in progress) EOF
Esperado: La experiencia de guardia mejora mes a mes, el volumen de alertas disminuye.
En caso de fallo: Si las métricas no mejoran, escalar al liderazgo. Es posible que sea necesario pausar el trabajo de características para solucionar los problemas operacionales.
Validación
- El horario de rotación cubre todas las horas requeridas (24/7 u horas de oficina)
- La política de escalada probada (enviar alertas de prueba)
- El procedimiento de traspaso documentado y compartido con el equipo
- Las reglas de gestión de la fatiga codificadas
- La guía de referencia de guardia completa y accesible
- Las retrospectivas mensuales programadas
- La compensación de guardia aprobada (si aplica)
Errores Comunes
- Muy pocos ingenieros: 3 o menos significa guardia cada 2-3 semanas, insostenible. Mínimo 5 para rotación semanal.
- Sin retrasos de escalada: La escalada inmediata al gerente desperdicia el tiempo senior. Dar al guardia principal 15 minutos para responder.
- Omitir los traspasos: La falta de transferencia de contexto lleva a errores repetidos. Hacer los traspasos obligatorios.
- Ignorar la fatiga de alertas: Si los ingenieros ignoran las alertas por el ruido, los problemas críticos se pierden. Ajustar agresivamente.
- Sin compensación: La guardia sin pago ni tiempo libre genera resentimiento. Presupuestar para ello.
Habilidades Relacionadas
- reducir el ruido de alertas que causa fatigaconfigure-alerting-rules
- crear manuales referenciados durante los turnos de guardiawrite-incident-runbook