Dez exemplos para níveis de severidade, canais de comunicação e um checklist dos primeiros 15 minutos - a base que toda rotação de plantão do Expo SDK 57 precisa antes de um pico de crashes, OTA ruim ou deslistagem da loja. Combine com Noções Básicas de Observabilidade para a taxonomia de sinais e Runbook de Rollback para contenção de OTA.
Sua equipe já deve enviar com identidade de lançamento em cada crash e log - veja Sentry para React Native. Estes exemplos assumem que os canais do EAS Update e o Sentry Release Health estão configurados para produção.
Ferramentas: Estes exemplos visam o Expo SDK 57 (expo ~57.0.4), React Native 0.86.0 e React 19.2.3.
Rótulos P1/P2 no estilo web falham em dispositivos móveis porque a adoção da loja, a propagação de OTA e os usuários offline expandem o raio de propagação. Use severidade baseada no impacto:
// docs/incident-severity.ts - copie para o seu repositório de runbooksexport 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 inutilizável para a maioria OU removido da loja OU violação de dados", revenuePath: true, example: "Suspensão da Play Store; autenticação indisponível para todos os usuários no build ativo", }, { sev: "SEV2", userImpact: "Caminho crítico quebrado para >25% dos usuários ativos", revenuePath: true, example: "Crash no checkout no lançamento faseado do iOS 2.4.0", }, { sev: "SEV3", userImpact: "Regressão com solução alternativa; rollout parcial ou plataforma única", revenuePath: false, example: "Crash na aba Configurações no canal de pré-visualização do Android", }, { sev: "SEV4", userImpact: "Apenas interno, aviso de política ou desvio de métrica abaixo do limiar", revenuePath: false, example: "Ruído no Sentry no perfil de desenvolvimento; prazo de metadados da App Store", },];
SEV1 aciona executivos, jurídico e comunicação - não apenas engenharia
SEV2 é o pico de crash de produção padrão com envolvimento de pagamento ou autenticação
SEV3 pode esperar o horário comercial se houver um kill switch
Reavalie a severidade a cada 30 minutos - a propagação de OTA pode escalar SEV3 → SEV2 rapidamente
Incidentes móveis abrangem engenharia, suporte, executivos e status da loja de aplicativos. Separe os canais por público:
## Mapa de comunicação| Canal | Público | Regras de conteúdo ||---|---|---|| `#incidente-YYYYMMDD` | Engenharia + IC | Fatos técnicos, comandos executados, hipóteses || `#incidente-comms` | Suporte + PM + Comunicação | Apenas linguagem aprovada para o cliente || PagerDuty / Opsgenie | Plantão | Alerta → reconhecer → entrar no canal do incidente || Página de status | Clientes | Sem causa raiz até confirmada; sem culpa || Email executivo | C-suite | Impacto no negócio, faixa de ETA, o que estamos fazendo agora |
# Interno (engenharia) - OKSuspeita de OTA grupo abc123 publicado às 14:02 UTC. Taxa de crash caiu de 99.4% para 96.1%.Executando eas channel:view production. IC: @jane.# Externo (página de status) - OKEstamos investigando relatos de que o ShopApp está fechando inesperadamente em alguns dispositivos.Próxima atualização em 30 minutos ou antes.# Externo - NUNCACausado pelo deploy do @bob. Revertendo agora.
O canal de engenharia é barulhento - tudo bem; o canal de comunicação é curado
Macros de suporte devem corresponder à redação da página de status - mensagens inconsistentes criam tempestades de tickets
Contenção antes da causa raiz. Este checklist cabe em uma tela:
## T+0 a T+15 (produção móvel)- [ ] **Reconhecer** alerta; IC atribuído (nome único no tópico do canal)- [ ] **Confirmar escopo:** plataforma(s), número do build, ID da atualização OTA, canal, % de usuários- [ ] **Correlacionar tempo:** publicação OTA, % de rollout da loja, deploy de backend, mudança de feature flag- [ ] **Conter o raio de propagação:** - [ ] Pausar release faseado do iOS / parar rollout percentual do Play - [ ] Desativar kill switch remoto para a superfície suspeita - [ ] Iniciar rollback OTA se o bundle JS for suspeito - [Rollback de Emergência OTA](./ota-emergency-rollback.md)- [ ] **Abrir dashboards:** Sentry Release Health, sucesso de pagamento, erros de autenticação, taxa de aplicação de OTA- [ ] **Notificar** comunicação + executivos se SEV1/SEV2- [ ] **Não** mesclar hotfix para main até que o IC confirme o caminho de contenção
# Comandos de confirmação de escopo (executar em paralelo)eas channel:view productioneas update:list --branch production --limit 3# Sentry: filtrar por release + dist (ID da atualização OTA)
Se você não conseguir nomear o ID da atualização OTA ou o número do build em 5 minutos, as lacunas de observabilidade são o incidente - corrija a marcação primeiro
Contenção em T+10 é melhor que RCA perfeito em T+45
Picos móveis muitas vezes parecem interrupções de backend até que você segmente por versão do cliente.
// Registrar no início da sessão - incidentes e suporte dependem dissoimport * 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", };}
Atualizações estruturadas reduzem trabalho duplicado e evitam que o IC responda à mesma pergunta repetidamente.
## Modelo de status (postar a cada 15–30 min)**SEV:** SEV2**IC:** @jane**Impacto:** Crash no checkout no build iOS 240012 (~18% de usuários faseados)**Contenção:** Lançamento faseado pausado; flag `newCheckout` desativada**Próximo:** Bisect OTA vs nativo - veja Triagem de Pico de Crash**ETA:** Próxima atualização às 15:45 UTC
Fixe a última mensagem de status no canal do incidente
Link para a URL do cluster do problema no Sentry - não capturas de tela de stack traces
Use @channel apenas para mudanças de severidade ou confirmação de contenção - não para cada hipótese
Nem todo crash justifica um e-mail para o CEO. Use gatilhos explícitos:
## Gatilhos de notificação para executivos / jurídico| Gatilho | Notificar ||---|---|| App removido da App Store ou Play Store | Executivos + Jurídico imediatamente (SEV1) || Exposição de PII ou alegação de violação regulatória | Jurídico imediatamente || Sucesso de pagamento abaixo de 5% abs por mais de 15 min | Executivos + Finanças || Autenticação indisponível para >25% de usuários | Executivos || Crash de recurso opcional SEV3 | Apenas Engenharia |
Atualizações para executivos precisam de impacto no negócio e status visível ao cliente - não stack traces
O jurídico revisa qualquer e-mail ao cliente sobre incidentes de dados antes do envio
Antes que a equipe se disperse, capture o suficiente para o pós-mortem de amanhã:
## Captura no mesmo dia (escriba é o responsável)- [ ] Início/fim do incidente UTC- [ ] Severidade final- [ ] Lançamentos afetados: builds nativos + IDs de OTA- [ ] Ações de contenção com timestamps- [ ] Duração visível para o cliente- [ ] Link para o cluster do Sentry / grupo de atualizações EAS- [ ] Agendar pós-mortem em até 5 dias úteis (SEV1/SEV2)
"Vamos escrever depois" perde a lógica da decisão - notas do escriba são melhores que a memória
O engenheiro móvel de plantão ou gerente de lançamento com autoridade para pausar rollouts da loja e aprovar rollback de OTA. O IC não precisa ser a pessoa que escreveu o código com bug - ele precisa de autoridade de decisão e calma sob o ruído dos alertas.
Um pico de crash é sempre SEV2?
Não. Um pico em uma aba opcional afetando <1% das sessões com um kill switch disponível pode ser SEV3. Regressão de pagamento ou autenticação no build de produção ativo é SEV2 ou SEV1 dependendo do escopo. Use a matriz de severidade no Exemplo 1, não apenas o volume de alertas.
E se não conseguirmos distinguir OTA de nativo?
Filtre o Sentry por dist (ID da atualização OTA) e release (versão+build nativo). Se os crashes abrangerem todos os IDs de OTA em um build nativo, suspeite do nativo. Se isolado em um ID de atualização, suspeite do bundle JS. Veja Triagem de Pico de Crash.