Sitelet https://github.com/plazasgiovanny/novapay-functions/pull/17
Skip to content

fix: cerrar el punto ciego de rechazos 400 en el guardrail de la rampa - #17

Merged
plazasgiovanny merged 1 commit into
mainfrom
fix/guardrail-rejection-rate-blindspot
Aug 18, 2026
Merged

plazasgiovanny merged 1 commit into
mainfrom
fix/guardrail-rejection-rate-blindspot

Conversation

@plazasgiovanny

Copy link
Copy Markdown
Owner

Resumen

  • HALLAZGO REAL (auditoría de rigor arquitectónico, 2026-08-17, ver PLAN.md §3.5 y ADR-03): el guardrail de observe_and_guard solo filtraba success == false — ciego a una regresión de negocio real (un bug de despliegue que rechace con 400 solicitudes antes válidas). ValidatePayment maneja esos casos sin lanzar excepción, así que Application Insights los marca success=true sin importar el código HTTP. Verificado con 230+ solicitudes reales que nunca dispararon el guardrail pese a ser errores reales.
  • Fix: compara la tasa de 400 de la instancia en rampa contra la del otro rol en la misma ventana de 5 min (misma mezcla real de tráfico) — diferencia >10 puntos porcentuales con piso mínimo de 3 solicitudes rechazadas dispara el mismo rollback ya existente.
  • Brecha reconocida y documentada, no cerrada en este PR: la alerta asíncrona de Azure Monitor (rollback-canary, novapay-iac-terraform) mantiene la misma limitación (solo 5xx) — su propósito es cubrir el caso en que el job de CD no está disponible, escenario distinto.

Test plan

  • bash -n sobre el script — sintaxis válida.
  • Revisión manual de la lógica contra el caso real que la motivó (el mismo tipo de tráfico forzado con ERROR_RATE_PCT=100 del load-generator ahora sí sería detectado, dado que produce una diferencia de tasa de rechazo entre roles).
  • Próximo ciclo de rampa real end-to-end con esta lógica activa (pendiente, no bloqueante para este fix).

🤖 Generated with Claude Code

HALLAZGO REAL (auditoría de rigor arquitectónico, 2026-08-17): el
guardrail de observe_and_guard solo miraba success == false — ciego a
una regresión de negocio real, la más probable en un despliegue de
código: un bug que empiece a devolver 400 en masa para solicitudes que
antes eran válidas. ValidatePayment maneja esos casos sin lanzar
excepción, así que Application Insights los marca success=true sin
importar el código HTTP (ver PLAN.md §3.5, 230+ solicitudes reales que
nunca dispararon el guardrail).

Fix: compara la tasa de 400 de la instancia en rampa contra la del
otro rol en la misma ventana de 5 minutos (ambas reciben la misma
mezcla real de tráfico) — una diferencia mayor a 10 puntos
porcentuales, con un piso mínimo de 3 solicitudes rechazadas para no
disparar sobre muestras chicas, dispara el mismo rollback que ya
existía para success == false.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@plazasgiovanny
plazasgiovanny merged commit 5ab0333 into main Aug 18, 2026
2 checks passed
@plazasgiovanny
plazasgiovanny deleted the fix/guardrail-rejection-rate-blindspot branch August 18, 2026 19:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant