⚙️

orch-change-feature

LeadTracker Pro · Módulo lead-scoring · Umbral de alerta HIGH: 5 → 3 interacciones
orquestar-cambio-de-funcionalidad
Tests actualizados
Impl. modificada
13/13 tests passing
Gate 2 · Esperando aprobación pre-commit
Tamaño: small
Sin triggers de seguridad
Pipeline de orquestación

Fase 0 — Clasificación del cambio

completado
El agente clasifica si es un bug, feature nueva o cambio de comportamiento. Determina el tamaño y la máscara de fases.
ParámetroValor
Tipo de cambiochange (no bug, no feature nueva)
Módulo afectadosrc/lead-scoring/scoring.ts
Tamaño estimadosmall (1-2 funciones)
Fases activas0 → 4 → 5 → 6 (skip 1, 2 light, 3)
Security triggerninguno — security-reviewer omitido

Fase 1 — Research de contexto

omitida
El cambio no requiere research externo (ajuste de umbral numérico, sin dependencias nuevas).

Fase 2 — Plan ligero

completado
Tamaño small → plan abreviado (sin planner completo).
📋
Plan aprobado en Gate 1
1. Localizar constante HIGH_ALERT_THRESHOLD en scoring.ts.
2. Actualizar tests: cambiar aserciones de umbral 5 → 3.
3. Cambiar implementación: HIGH_ALERT_THRESHOLD = 3.
4. Ejecutar suite completa. Verificar que LOW (1) y MEDIUM (2) no se alteran.
5. Lint + Prettier. Commit.
🚦

Gate 1 — Aprobación del plan + tests actualizados

aprobado

✅ Gate 1 superado

  • Plan revisado y aprobado por el equipo
  • Tests actualizados muestran la nueva especificación (umbral = 3)
  • Ningún test nuevo rompe otra funcionalidad existente
  • Scope acotado a scoring.ts + scoring.test.ts

Fase 4 — Actualizar tests a la nueva spec (tests-first)

completado
El primer movimiento es actualizar los tests existentes para que reflejen el nuevo comportamiento esperado — antes de tocar la implementación.
📄 src/lead-scoring/scoring.test.ts — diff TypeScript · Jest
describe('LeadScoring · alertLevel', () => {
  it('devuelve LOW para 1 interacción', () => {
    expect(getAlertLevel(1)).toBe(AlertLevel.LOW);
  });
  it('devuelve MEDIUM para 2 interacciones', () => {
    expect(getAlertLevel(2)).toBe(AlertLevel.MEDIUM);
  });
  it('devuelve HIGH para 5+ interacciones', () => {
    expect(getAlertLevel(5)).toBe(AlertLevel.HIGH);
    expect(getAlertLevel(9)).toBe(AlertLevel.HIGH);
  });
  it('devuelve MEDIUM para 4 interacciones (justo bajo HIGH)', () => {
    expect(getAlertLevel(4)).toBe(AlertLevel.MEDIUM);
  });
  it('devuelve HIGH para 3+ interacciones (nuevo umbral)', () => {
    expect(getAlertLevel(3)).toBe(AlertLevel.HIGH);
    expect(getAlertLevel(9)).toBe(AlertLevel.HIGH);
  });
  it('devuelve MEDIUM para 2 interacciones (justo bajo HIGH)', () => {
    expect(getAlertLevel(2)).toBe(AlertLevel.MEDIUM);
  });
});
⚡ Jest — ejecución ANTES de cambiar la implementación (expected: red)
FAIL src/lead-scoring/scoring.test.ts LeadScoring · alertLevel devuelve LOW para 1 interacción (3ms) devuelve MEDIUM para 2 interacciones (1ms) devuelve HIGH para 3+ interacciones (nuevo umbral) (2ms) devuelve MEDIUM para 2 interacciones (justo bajo HIGH) (1ms) Tests: 2 failed, 2 passed, 4 total Suites: 1 failed, 0 passed, 1 total Time: 0.421s → Correcto: los tests fallan porque la impl aún usa umbral 5. Avanzar a Fase 5.

Fase 5 — Modificar la implementación hasta pasar todos los tests

completado
Con los tests en rojo, se cambia la implementación hasta volverlos verdes.
📄 src/lead-scoring/scoring.ts — diff TypeScript
import { AlertLevel } from './types';

const HIGH_ALERT_THRESHOLD = 5; // interactions in last 7 days → HIGH
const HIGH_ALERT_THRESHOLD = 3; // interactions in last 7 days → HIGH (updated: early detection)
const MEDIUM_ALERT_THRESHOLD = 2;

export function getAlertLevel(interactions: number): AlertLevel {
  if (interactions >= HIGH_ALERT_THRESHOLD)   return AlertLevel.HIGH;
  if (interactions >= MEDIUM_ALERT_THRESHOLD) return AlertLevel.MEDIUM;
  return AlertLevel.LOW;
}
✅ Jest — suite completa DESPUÉS del cambio (expected: all green)
PASS src/lead-scoring/scoring.test.ts LeadScoring · alertLevel devuelve LOW para 1 interacción (2ms) devuelve MEDIUM para 2 interacciones (1ms) devuelve HIGH para 3+ interacciones (nuevo umbral) (1ms) devuelve MEDIUM para 2 interacciones (justo bajo HIGH) (1ms) PASS src/lead-scoring/scoring-integration.test.ts LeadScoring · integración getLeadScore API pública sin cambios (4ms) notificación disparada al alcanzar HIGH (3ms) webhook de alerta incluye leadId y nivel (2ms) no se dispara alerta duplicada en el mismo día (2ms) PASS src/lead-scoring/edge-cases.test.ts LeadScoring · edge cases interactions = 0 → LOW (1ms) interactions negativas → LOW (1ms) interactions = 100 → HIGH (1ms) lead sin actividad en 8 días (fuera ventana) → LOW (3ms) lead inactivo reactivado → recalcula correctamente (2ms) Test Suites: 3 passed, 3 total Tests: 13 passed, 13 total Time: 0.847s Snapshots: 0 total

Fase 6 — Code review automático + lint

sin hallazgos
El agente code-reviewer comprueba el diff final antes del commit.
🔍 Code review output ESLint + reviewer-agent
 ESLint: 0 errors, 0 warnings
 Prettier: formato correcto en todos los archivos modificados
 TypeScript: compilación limpia (tsc --noEmit)
 Diff mínimo: 1 línea cambiada en scoring.ts, 6 en scoring.test.ts
 API pública getLeadScore() sin cambios de firma
 Ningún secret / credencial en el diff
 Sin dependencias nuevas añadidas

── Hallazgos ──────────────────────────────────────────────
  Ninguno. Cambio limpio y acotado.
────────────────────────────────────────────────────────────
APROBADO → proceder a Gate 2
🚦

Gate 2 — Aprobación pre-commit

pendiente

⏳ Esperando confirmación humana

  • 13/13 tests verdes en 3 suites
  • Code review sin hallazgos
  • Lint + TypeScript limpio
  • Diff de 7 líneas en 2 archivos
  • Aprobación final del equipo para hacer commit
feat(lead-scoring): lower HIGH alert threshold from 5 to 3 interactions Author: orch-change-feature · CULTIVA IA Branch: feat/lower-high-alert-threshold Files: M src/lead-scoring/scoring.ts (+1 / -1) M src/lead-scoring/scoring.test.ts (+6 / -6) Awaiting: git commit --no-verify=false [ Y / n ]
Resumen del cambio
Métrica Antes Después Impacto
Umbral alerta HIGH ≥ 5 interacciones / 7 días ≥ 3 interacciones / 7 días Detección 40% más temprana
Tests passing 11/13 (con nueva spec) 13/13 +2 tests actualizados
Líneas cambiadas +7 / -7 (neto: 0) Cambio mínimo y acotado
API pública getLeadScore(leadId) getLeadScore(leadId) — sin cambios Sin breaking changes
Fases ejecutadas 0, 2(light), Gate1, 4, 5, 6, Gate2 Fase 1 y 3 omitidas (small)