release-readiness-triage-mcp

Agrega fallos de CI y emite veredictos de lanzamiento GO/NO_GO

Documentación

🚦 release-readiness-triage-mcp

npm CI License: MIT

Deja de leer logs de CI. Empieza a obtener veredictos.

Servidor MCP que agrega fallos de pruebas, cruza referencias con el historial de flakiness y emite una decisión de lanzamiento GO / CONDITIONAL_GO / NO_GO / INVESTIGATE — para que tu agente de IA pueda diagnosticar una ejecución de CI rota en segundos, en lugar de pedirte que leas 3000 líneas de logs.


🤔 El problema

En cualquier codebase real, el CI siempre tiene algo que falla. La pregunta difícil no es "¿hay fallos?" — es "¿son estos fallos regresiones reales, o solo el ruido habitual?"

Responder eso requiere correlacionar tres señales a la vez:

  • 🔍 Firmas de error — ¿es el mismo fallo repetido 12 veces, o 12 problemas distintos?
  • 📊 Historial de flakiness — ¿se sabe que esta prueba es poco fiable?
  • 🔗 Cambios de código — ¿está realmente relacionada la prueba que falla con lo que cambió?

Un agente de IA no puede hacer esto sin herramientas estructuradas. Los logs crudos de CI son miles de líneas. Las bases de datos de flakiness son externas. El mapeo código→prueba requiere análisis de AST. Sin este MCP, el agente solo adivina.


🛠️ Herramientas

aggregate_suite_failures

Agrupa fallos por firma de error normalizada, deduplica errores repetidos y clasifica como assertion / timeout / network / crash. Pasa customInfraPatterns para errores específicos de la nube.

cross_reference_flakiness

Puntúa cada fallo contra tu historial de flakiness: KNOWN FLAKY, MILDLY FLAKY o NO HISTORY.

correlate_code_changes

Empareja archivos modificados con pruebas que fallan. Funciona de forma independiente o con listas de pruebas afectadas precalculadas desde ast-impact-mapper-mcp.

generate_release_recommendation

El paso final. Emite un veredicto ponderado por riesgo con puntuación de confianza y desglose completo. Admite format: "markdown" para comentarios en PRs de GitHub y Slack.

Niveles de veredicto:

  • NO_GO — regresión en un dominio crítico (payment, auth, billing, checkout, security)
  • CONDITIONAL_GO — regresión en un dominio de riesgo bajo/medio (analytics, docs, admin); revisar antes de lanzar
  • GO — todos los fallos son flakiness conocido o ruido de infraestructura
  • INVESTIGATE — demasiadas incógnitas para decidir

La salida incluye:

  • aggregate_risk_score — 0.0–1.0, unión de probabilidad de todas las contribuciones de riesgo de regresión
  • failing_tests_analysis[] — desglose por regresión con domain, severity (HIGH/MEDIUM/LOW), risk_contribution, blast_radius

detect_temporal_failure_patterns

Analiza fallos históricos con marcas de tiempo para identificar artefactos cronométricos — fallos que solo aparecen en la misma hora UTC, día de la semana, día del mes o durante transiciones de horario de verano. Cuando se encuentra un patrón, el fallo es un artefacto temporal, no una regresión de código.

La salida incluye:

  • temporal_pattern_detected — booleano
  • clusters[] — por prueba: pattern_type (hourly | daily | monthly | timezone_shift), cluster_times, confidence_score

analyze_rollback_readiness

Escanea un repositorio en busca de archivos de migración versionados (Flyway V*.sql, Prisma migration.sql, Liquibase XML/YAML) y clasifica cada operación como aditiva (segura para rollback) o destructiva (solo corrección hacia adelante).

Operaciones destructivas detectadas: DROP TABLE, DROP COLUMN, ALTER COLUMN TYPE, MODIFY COLUMN, TRUNCATE

La salida incluye:

  • rollback_eligible — booleano
  • blocking_migrations[] — cada una con file, line, operation, reason
  • deployment_strategystandard | forward_fix_only

🧪 Cómo se ve en la práctica

5 fallos en el CI. ¿Qué es real, qué es ruido?

failures:
  - Auth Suite > login with expired token   → "Expected status 200, got 401"
  - API Suite > health check                → "connect ECONNREFUSED 127.0.0.1:3000"
  - Button Suite > renders button correctly → "Expected null, got <button>Submit</button>"
  - Search Suite > debounce timing          → "Expected 42, received 43"
  - Storage Suite > upload avatar           → "GCP quota exceeded for this project"

changedFiles: ["src/components/Button.tsx"]
affectedTests: ["renders button correctly"]
customInfraPatterns: ["GCP quota exceeded"]
format: "markdown"

Salida:

## 🔴 Release Recommendation: NO_GO (75% confidence)

> 1 confirmed regression(s) in critical domain(s) [payment]. Do not release.

**Aggregate risk score:** 1.0

| Category            | Count |
| ------------------- | ----- |
| Total failures      | 5     |
| 🔴 Real regressions | 1     |
| 🟡 Known flaky      | 2     |
| ⚪ Infra blips      | 2     |
| ❓ Unknown          | 0     |

### Risk Breakdown

| Test                                   | Domain | Severity | Risk | Blast Radius |
| -------------------------------------- | ------ | -------- | ---- | ------------ |
| Button Suite::renders button correctly | core   | MEDIUM   | 0.5  | 1            |

### Blockers (must fix before release)

**Button Suite > renders button correctly**

- Test is directly affected by code changes in this commit
- `Expected null, got <button>Submit</button>`

### Safe to ignore

- ~~Auth Suite > login with expired token~~ — Historically flaky: 73% failure rate in history
- ~~API Suite > health check~~ — Error pattern matches infrastructure issues (network)
- ~~Search Suite > debounce timing~~ — Mildly flaky: 22% historical failure rate
- ~~Storage Suite > upload avatar~~ — Error pattern matches infrastructure issues (network)

Una llamada a herramienta. Un veredicto. Ve a arreglar Button.tsx.


⚡ Configuración

{
  "mcpServers": {
    "release-readiness-triage": {
      "command": "npx",
      "args": ["-y", "release-readiness-triage-mcp"]
    }
  }
}

🚀 Uso

"Aquí están los fallos de nuestra ejecución de CI, nuestra base de datos de flakiness y los archivos modificados en este PR. ¿Es seguro lanzar?"

El agente llama a generate_release_recommendation y devuelve un veredicto con un desglose completo — listo para pegar en un comentario de PR o en Slack.

Funciona de forma independiente, o como meta-orquestador sobre:


📦 Enlaces

Licencia

MIT