Self-Healing CI/CD Pipeline

Tests fallan en CI → architect los arregla automáticamente → crea PR con el fix.

El problema

El patrón más frustrante de CI/CD: un developer pushea, los tests fallan por un edge case, y el pipeline se bloquea esperando atención humana. A las 3am nadie está mirando. A las 9am hay 5 PRs bloqueados y el equipo empieza el día resolviendo tests rotos en vez de construir features.

En 2026 esto tiene nombre: el “Pipeline Doctor” o “Interceptor pattern”. Un fallo no es una señal de stop — es un trigger para un agente de reparación. GitHub, GitLab y las principales plataformas están convergiendo hacia este modelo.

Dónde encaja architect

Architect se posiciona como el Repair Agent entre el fallo de tests y la creación de un PR con el fix. Su Ralph Loop es exactamente el primitivo que este patrón necesita: fix→test→verify en bucle hasta que pase o se agote el budget.

Diagrama

flowchart TD
    A["👨‍💻 Developer Push"] --> B["GitHub Actions / GitLab CI"]
    B --> C{"🧪 Tests"}
    C -->|"✅ Pass"| D["Deploy / Merge"]
    C -->|"❌ Fail"| E["architect loop\n--check 'pytest'\n--budget 0.50"]

    E --> F{"Ralph Loop"}
    F --> G["LLM analiza\nerror logs"]
    G --> H["Aplica fix\n(guardrails activos)"]
    H --> I{"pytest pasa?"}
    I -->|"❌ No"| G
    I -->|"✅ Sí"| J["Genera report JSON"]

    J --> K["git commit + push\nnueva branch"]
    K --> L["Crea PR automático\ncon report adjunto"]
    L --> M["👨‍💻 Code Review humano"]
    M --> D

    F -->|"Budget agotado\no max_iterations"| N["❌ Escalación\nNotifica equipo"]

    style E fill:#2563eb,color:#fff,stroke:#1d4ed8
    style F fill:#2563eb,color:#fff,stroke:#1d4ed8
    style H fill:#7c3aed,color:#fff,stroke:#6d28d9
    style J fill:#059669,color:#fff,stroke:#047857
    style N fill:#dc2626,color:#fff,stroke:#b91c1c

Implementación

GitHub Actions workflow

# .github/workflows/self-healing.yml
name: Self-Healing Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Run tests
        id: tests
        run: pytest tests/ -q
        continue-on-error: true

      - name: Auto-fix con architect
        if: steps.tests.outcome == 'failure'
        run: |
          pip install architect-ai-cli
          architect loop "Corrige los tests que fallan. \
            Lee el output de pytest para entender qué falla \
            y aplica el fix mínimo necesario." \
            --check "pytest tests/ -q" \
            --config .architect.yaml \
            --confirm-mode yolo \
            --budget 0.50 \
            --max-iterations 5 \
            --report-file fix-report.json \
            --exit-code-on-partial 1
        env:
          OPENAI_API_KEY: ${{ secrets.LLM_KEY }}

      - name: Crear PR con fix
        if: steps.tests.outcome == 'failure' && success()
        uses: peter-evans/create-pull-request@v6
        with:
          title: "[architect] Auto-fix: tests corregidos"
          body-path: fix-report.json
          branch: architect/auto-fix-${{ github.sha }}
          commit-message: "fix: auto-remediation via architect Ralph Loop"

Configuración architect

# .architect.yaml
llm:
  model: openai/gpt-4.1
  api_base: https://api.openai.com/v1
  api_key_env: OPENAI_API_KEY

guardrails:
  protected_files:
    - ".env"
    - "*.pem"
    - "*.key"
    - "docker-compose.yml"
    - "Dockerfile"
    - ".github/**"
  max_files_modified: 10
  code_rules:
    - pattern: 'eval\('
      severity: block
    - pattern: 'exec\('
      severity: block

costs:
  budget_usd: 0.50

Features de architect usadas

FeatureRol en esta arquitectura
Ralph LoopCore: ciclo fix→test→verify hasta que pytest pase
GuardrailsProtege archivos de CI/CD, secrets, y Dockerfiles
BudgetHard limit para evitar costes descontrolados a las 3am
ReportsJSON adjunto al PR como evidencia de qué se cambió
Exit codes--exit-code-on-partial para que el CI sepa si fue exitoso
.architect.mdConvenciones del proyecto respetadas en el fix

Flujo de escalación

Si architect no puede arreglar los tests (budget agotado o max_iterations alcanzado), el workflow debe escalar:

      - name: Notificar fallo
        if: steps.tests.outcome == 'failure' && failure()
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {
              "text": "⚠️ Auto-fix falló en ${{ github.repository }}. Tests siguen rotos después de 5 intentos ($0.50 budget). Necesita intervención manual.",
              "blocks": [...]
            }

Valor diferencial

Sin architect, implementar este patrón requiere:

  • Loop de reintentos custom
  • Parsing de errores de pytest
  • Ejecución segura de código con sandboxing
  • Tracking de costes por iteración
  • Límites de iteraciones con fallback
  • Generación de reports para el PR

Architect lo empaqueta en un solo comando con guardrails incluidos. El workflow de GitHub Actions pasa de ~100 líneas de script custom a ~15 líneas.