Transparencia operacional · blameless RCA

Postmortems incidentes

Cada incidente > 5 minutos downtime termina con un postmortem público. Timeline · causa raíz · acciones correctivas. Cultura blameless desde el día 0 · pre-revenue · sin contratos NDA que ocultar.

Principios postmortem

Inspirados en Google SRE Book + Stripe engineering culture + Linear incident response. Aplicados desde el primer incidente · documentados en doctrine repo público.

Blameless culture
Postmortems analizan procesos y sistemas · nunca personas. Errores humanos son síntoma de procesos débiles. Si un único humano puede romper producción, el sistema está mal diseñado.
RCA · 5 Whys mínimo
Cada postmortem aplica 5 Whys hasta llegar a causa sistémica. 'Founder cometió error' no es causa raíz · es 'no había guardrail técnico que previniera el error'.
Acciones correctivas accionables
Cada postmortem termina con 3-5 acciones correctivas concretas · con owner · deadline · ticket asociado. Sin acción correctiva = postmortem incompleto.
Transparencia pública
Todo incidente >5min downtime con impacto cliente real se publica aquí. Pre-revenue publicamos también internos demos para crear hábito de transparencia desde el día 0.

Archivo postmortems

3 incidentes documentados

Todos los incidentes pre-revenue 2026 listados abajo. Cuando llegue tráfico real, mantendremos archivo cronológico inverso (más reciente arriba) sin borrar histórico.

Severity P12026-04-22
13min downtime

Cold-start Cloudflare Worker tras deploy v1.12.0

Impacto: 0 clínicas reales (pre-revenue) · 2 demo internas

Causa raíz

Tras deploy v1.12.0, Worker cold-start tardó 13 minutos en estabilizarse por nueva dependency (zod v4 schema parse en startup). Health endpoint respondió 504 durante ese tiempo.

Timeline
  1. 16:32 UTC · wrangler deploy v1.12.0 ejecutado
  2. 16:32 UTC · UptimeRobot detecta 504 health endpoint
  3. 16:33 UTC · Sentry alerta + email founder + Slack
  4. 16:34 UTC · Founder valida deploy nuevo · monitoriza
  5. 16:45 UTC · Worker estabilizado · 2 polls consecutivos verdes
  6. 16:48 UTC · Postmortem iniciado
Acciones correctivas
  • Mover zod schema parse de startup a primera request (lazy init)
  • Añadir warmup ping post-deploy en CI/CD (3 requests sintéticos)
  • Documentar cold-start expected window en runbook deploys
Severity P02026-01-23
32min downtime

Meta WhatsApp token expirado · 32min downtime mensajería

Impacto: 1 demo clínica interna · 0 producción real

Causa raíz

Meta permanent token rotó silenciosamente tras Meta Business Verification expirar. Sistema no detectó hasta primer envío fallido. Sin cron de health-check pre-emptive del token.

Timeline
  1. 11:14 UTC · Primer envío WhatsApp test devuelve 401 Meta API
  2. 11:14 UTC · Sentry captura error · alerta inmediata
  3. 11:18 UTC · Founder reproduce · identifica token issue
  4. 11:25 UTC · Rotación manual token Meta Business Manager
  5. 11:38 UTC · wrangler secret put META_TOKEN · deploy
  6. 11:46 UTC · Test envío verde · servicio restaurado
Acciones correctivas
  • Cron diario meta-token-healthcheck (alerta 7d antes expiración)
  • Documentar runbook rotación Meta token paso a paso
  • Issue tracking calendar Meta Business Verification renewal
  • ADR-027 actualizado · breaker Meta opt-in para limit blast radius
Severity P12026-01-19
15min downtime

QStash retry loop bug · 15min queue backup

Impacto: 1 demo clínica · 0 producción real

Causa raíz

Bug en handler outbound-message · response 500 sin signal de no-retry. QStash interpretó como retriable · 4 retries × 12 mensajes = 48 jobs en queue. Backup visible 15min hasta drainage.

Timeline
  1. 09:48 UTC · Deploy contiene bug handler outbound-message
  2. 09:50 UTC · Primer error 500 capturado Sentry
  3. 09:52 UTC · QStash inicia retries (backoff 30s)
  4. 09:58 UTC · Founder detecta backlog en Upstash dashboard
  5. 10:01 UTC · Hotfix deploy con response 422 explícito
  6. 10:03 UTC · Queue drainage completa
Acciones correctivas
  • Standard responses pattern · 422 explícito en validation errors
  • QStash dead-letter queue (DLQ) monitorizado en /status
  • Test integration QStash retry behavior añadido
  • ADR-008 actualizado · 422 vs 500 retry semantics

Cómo escribimos un postmortem

  1. Detección · timestamp exacto primer signal + canal (UptimeRobot · Sentry · cliente report)
  2. Triage · severity asignada (P0 todo down · P1 parcial · P2 cosmético)
  3. Mitigación · cómo se restauró servicio (rollback · hotfix · workaround)
  4. Causa raíz · 5 Whys hasta encontrar gap sistémico (no humano)
  5. Acciones correctivas · 3-5 mejoras concretas con owner + deadline
  6. Publicación · esta página actualizada <48h tras incidente resuelto

Slash command interno · `/incident-rca` automatiza este flow · referenciado en `.claude/commands/incident-rca.md` repo público.

¿Buscas evidencia operacional pre-Enterprise?

Si tu compliance officer quiere ver cómo gestionamos incidentes antes de firmar, esta página es el evidence pack. Si necesitas RCA específico de algún incidente o quieres revisar runbooks internos, lo compartimos bajo NDA.