Diez ejemplos de niveles de severidad, canales de comunicación y una lista de verificación de los primeros 15 minutos - la base que cada rotación de guardia de Expo SDK 57 necesita antes de un pico de bloqueos, una mala OTA o una supresión de tienda. Combina con Conceptos básicos de observabilidad para la taxonomía de señales y Runbook de reversión para la contención de OTA.
Tu equipo ya debe enviar con identidad de lanzamiento en cada bloqueo y registro - ver Sentry para React Native. Estos ejemplos asumen que EAS Update canales y Sentry Release Health están conectados para producción.
Herramientas: Estos ejemplos se dirigen a Expo SDK 57 (expo ~57.0.4), React Native 0.86.0 y React 19.2.3.
Las etiquetas al estilo web P1/P2 fallan en móvil porque la adopción de tienda, la propagación de OTA y los usuarios sin conexión extienden el radio de explosión. Usa severidad basada en impacto:
// docs/incident-severity.ts - copiar en tu repositorio de runbookexport type IncidentSeverity = "SEV1" | "SEV2" | "SEV3" | "SEV4";export type SeverityCriteria = { sev: IncidentSeverity; userImpact: string; revenuePath: boolean; example: string;};export const MOBILE_SEVERITY_MATRIX: SeverityCriteria[] = [ { sev: "SEV1", userImpact: "App no utilizable para la mayoría O eliminada de la tienda O filtración de datos", revenuePath: true, example: "Suspensión de Play; autenticación inactiva para todos los usuarios en compilación en vivo", }, { sev: "SEV2", userImpact: "Ruta crítica rota para >25% de usuarios activos", revenuePath: true, example: "Bloqueo de pago en iOS 2.4.0 lanzamiento escalonado", }, { sev: "SEV3", userImpact: "Regresión con solución alternativa; lanzamiento parcial o plataforma única", revenuePath: false, example: "Bloqueo de pestaña de configuración en canal de vista previa de Android", }, { sev: "SEV4", userImpact: "Solo interno, advertencia de política o cambio de métrica por debajo del umbral", revenuePath: false, example: "Ruido de Sentry en perfil de desarrollo; Plazo de metadatos de App Store", },];
SEV1 notifica ejecutivos, legales y comunicaciones - no solo ingeniería
SEV2 es el pico de bloqueo de producción predeterminado con implicaciones de pago o autenticación
SEV3 puede esperar horario comercial si existe un interruptor de emergencia
Re-evalúa severidad cada 30 minutos - la propagación de OTA puede escalar SEV3 → SEV2 rápidamente
Una persona decide; todos los demás ejecutan. Los hilos de Slack paralelos sin un IC desperdician los primeros 15 minutos.
## Asignación de roles (pegar en #incident-YYYYMMDD)| Rol | Propietario | Responsabilidad ||-----|-------------|-----------------|| **Comandante de incidente (IC)** | @oncall-mobile | Severidad, línea de tiempo, go/no-go en reversión || **Líder técnico** | @mobile-lead | Triaje, bisección, rama de revisión rápida || **Comunicaciones** | @support-lead | Página de estado, macros de soporte, redes sociales || **Escriba** | voluntario | Registro de decisiones con marcas de tiempo || **Operaciones de tienda** | @release-mgr | Pausar lanzamiento escalonado, detener Play - [Respuesta a incidentes de tienda](../store-operations/store-incident-response.md) |
IC no necesita ser el mejor depurador - necesita autoridad para pausar lanzamientos
El escriba captura: decisión, quién aprobó, marca de tiempo UTC, enlace a captura de pantalla del panel
Rota IC después de 4 horas en SEV1 - la fatiga causa decisiones malas de reversión
Los incidentes móviles abarcan ingeniería, soporte, ejecutivos y tienda de aplicaciones. Separa canales por audiencia:
## Mapa de comunicaciones| Canal | Audiencia | Reglas de contenido ||-------|-----------|---------------------|| `#incident-YYYYMMDD` | Ingeniería + IC | Hechos técnicos, comandos ejecutados, hipótesis || `#incident-comms` | Soporte + PM + Comunicaciones | Solo lenguaje aprobado orientado al cliente || PagerDuty / Opsgenie | En guardia | Alerta → reconocer → unirse al canal de incidente || Página de estado | Clientes | Sin causa raíz hasta confirmación; sin culpables || Correo de ejecutivos | C-suite | Impacto comercial, rango de ETA, qué estamos haciendo ahora |
# Interno (ingeniería) - OKSospechoso de grupo OTA abc123 publicado 14:02 UTC. Crash-free bajó 99,4% → 96,1%.Ejecutando eas channel:view production. IC: @jane.# Externo (página de estado) - OKEstamos investigando reportes de ShopApp cerrándose inesperadamente en algunos dispositivos.Próxima actualización en 30 minutos o antes.# Externo - NUNCACausado por el lanzamiento de @bob. Revirtiendo ahora.
El canal de ingeniería es ruidoso - eso está bien; el canal de comunicaciones es curado
Las macros de soporte deben coincidir con la redacción de la página de estado - mensajes no coincidentes crean tormentas de tickets
Contención antes de causa raíz. Esta lista de verificación cabe en una pantalla:
## T+0 a T+15 (producción móvil)- [ ] **Reconocer** alerta; IC asignado (nombre único en tema de canal)- [ ] **Confirmar alcance:** plataforma(s), número de compilación, id de actualización OTA, canal, % usuarios- [ ] **Correlacionar tiempo:** publicación OTA, % lanzamiento de tienda, despliegue de backend, cambio de bandera de características- [ ] **Contener radio de explosión:** - [ ] Pausar lanzamiento escalonado de iOS / detener lanzamiento escalonado de Play - [ ] Cambiar interruptor de emergencia remoto para superficie sospechosa - [ ] Iniciar reversión de OTA si el paquete JS es sospechoso - [Reversión de emergencia de OTA](./ota-emergency-rollback.md)- [ ] **Abrir paneles:** Sentry Release Health, éxito de pagos, errores de autenticación, tasa de aplicación de OTA- [ ] **Notificar** comunicaciones + ejecutivos si SEV1/SEV2- [ ] **No** fusionar revisión rápida con main hasta que IC confirme ruta de contención
# Comandos de confirmación de alcance (ejecutar en paralelo)eas channel:view productioneas update:list --branch production --limit 3# Sentry: filtrar por lanzamiento + dist (id de actualización OTA)
Si no puedes nombrar el id de actualización OTA o número de compilación en 5 minutos, las brechas de observabilidad son el incidente - fija el etiquetado primero
La contención en T+10 vence a RCA perfecto en T+45
Los picos móviles a menudo se ven como interrupciones de backend hasta que segmentas por versión del cliente.
// Registrar al inicio de sesión - soporte e incidentes dependen de estoimport * as Application from "expo-application";import * as Updates from "expo-updates";export function getIncidentCorrelationTags() { return { nativeRelease: `${Application.nativeApplicationVersion}+${Application.nativeBuildVersion}`, otaUpdateId: Updates.updateId ?? "embedded", channel: Updates.channel ?? "none", runtimeVersion: Updates.runtimeVersion ?? "unknown", };}
Las actualizaciones estructuradas reducen trabajo duplicado e impiden que IC re-responda la misma pregunta.
## Plantilla de estado (publicar cada 15-30 min)**SEV:** SEV2**IC:** @jane**Impacto:** Bloqueo de pago en compilación de iOS 240012 (~18% usuarios escalonados)**Contención:** Lanzamiento escalonado pausado; bandera `newCheckout` desactivada**Siguiente:** Biseccionar OTA vs nativo - ver Triaje de pico de bloqueo**ETA:** Próxima actualización 15:45 UTC
Anclar el mensaje de estado más reciente en el canal de incidente
Enlazar a URL de clúster de problema de Sentry - no capturas de pantalla de pilas
@channel solo para cambios de severidad o confirmación de contención - no cada hipótesis
No cada bloqueo justifica correo del CEO. Usa desencadenantes explícitos:
## Desencadenantes de notificación ejecutiva/legal| Desencadenante | Notificar ||---|---|| App eliminada de App Store o Play | Ejecutivos + Legales inmediatamente (SEV1) || Exposición de PII o alegación de incumplimiento regulatorio | Legales inmediatamente || Éxito de pago down >5% abs durante >15 min | Ejecutivos + Finanzas || Autenticación down >25% usuarios | Ejecutivos || Bloqueo de característica opcional SEV3 | Solo ingeniería |
Las actualizaciones de ejecutivos necesitan impacto comercial y estado orientado al cliente - no pilas
Legales revisa cualquier correo al cliente sobre incidentes de datos antes de enviar
Antes de que el equipo se disperse, captura suficiente para el post-mortem de mañana:
## Captura del mismo día (escriba es propietario)- [ ] Inicio/fin de incidente UTC- [ ] Severidad final- [ ] Lanzamientos afectados: compilaciones nativas + ids OTA- [ ] Acciones de contención con marcas de tiempo- [ ] Duración visible del cliente- [ ] Enlace a clúster de Sentry / grupo de actualización EAS- [ ] Programar post-mortem dentro de 5 días hábiles (SEV1/SEV2)
"Lo escribiremos más tarde" pierde la justificación de decisión - las notas del escriba vencen a la memoria
El ingeniero móvil en guardia o gerente de lanzamiento con autoridad para pausar lanzamientos de tienda y aprobar reversión de OTA. IC no necesita ser la persona que escribió el código defectuoso - necesita autoridad de decisión y calma bajo ruido de alerta.
¿Es un pico de bloqueo siempre SEV2?
No. Un pico en una pestaña opcional que afecta <1% de sesiones con interruptor de emergencia disponible puede ser SEV3. Regresión de pago o autenticación en la compilación de producción en vivo es SEV2 o SEV1 dependiendo del alcance. Usa la matriz de severidad en Ejemplo 1, no solo volumen de alerta.
¿Qué si no podemos distinguir OTA de nativo?
Filtrar Sentry por dist (id de actualización OTA) y release (versión nativa + compilación). Si los bloqueos abarcan todos los ids OTA en una compilación nativa, sospecha nativo. Si está aislado en un id de actualización, sospecha paquete JS. Ver Triaje de pico de bloqueo.