Communitygithub.com

Pruebas de Regresión para IA

Estrategias de pruebas de regresión para desarrollo asistido por IA. Pruebas de API en modo sandbox sin dependencias de base de datos, flujos automatizados de verificación de errores y patrones para detectar puntos ciegos de la IA donde el mismo modelo escribe y revisa código. Úsalo al agregar cobertura de regresión a código asistido por IA, o cuando el mismo modelo escribió y revisó un cambio.

¿Qué es Pruebas de Regresión para IA?

Este skill proporciona un conjunto de reglas y patrones específicos para realizar pruebas de regresión en proyectos de desarrollo asistido por IA, como aquellos que usan Claude Code, Cursor o Codex. Está diseñado para abordar el problema fundamental de que, cuando un modelo de IA escribe código y luego lo revisa, tiende a pasar por alto los mismos errores debido a sus propios sesgos o puntos ciegos. La estrategía central escribe pruebas automatizadas que capturen exactamente los fallos que se han detectado previamente, especialmente los relacionados con la inconsistencia entre los modos sandbox y producción, omisiones en cláusulas SELECT, o fugas de estado de error. El skill recomienda un flujo de trabajo de 'bug-check' que ejecuta las pruebas primero, seguido de una compilación de TypeScript, y solo luego una revisión de código por IA. Además, incluye ejemplos concretos de código para configurar un entorno de pruebas con Vitest y Next.js, helpers para crear solicitudes HTTP simuladas, y directrices claras sobre qué probar y qué no, priorizando la prevención de regresiones sobre la cobertura del código.

Compatible con✓Claude Code✓Codex CLI✓Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/ai-regression-testing

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Pruebas de Regresión para IA?

Patrones de prueba diseñados específicamente para el desarrollo asistido por IA, donde el mismo modelo escribe código y lo revisa, creando puntos ciegos sistemáticos que solo las pruebas automatizadas pueden detectar.

Cuándo activarlo

  • El agente de IA (Claude Code, Cursor, Codex) ha modificado rutas de API o lógica de backend
  • Se encontró y corrigió un error, y se necesita evitar que vuelva a aparecer
  • El proyecto tiene un modo sandbox/mock que se puede aprovechar para pruebas sin base de datos
  • Se está ejecutando /bug-check o comandos de revisión similares después de cambios en el código
  • Existen múltiples rutas de código (sandbox vs producción, feature flags, etc.)

El problema central

Cuando una IA escribe código y luego revisa su propio trabajo, lleva las mismas suposiciones a ambos pasos. Esto crea un patrón de fallo predecible:

La IA escribe una corrección → La IA revisa la corrección → La IA dice "parece correcto" → El error aún existe

Ejemplo real (observado en producción):

Corrección 1: Se añadió notification_settings a la respuesta de la API
  → Se olvidó añadirlo a la consulta SELECT
  → La IA lo revisó y no lo detectó (mismo punto ciego)

Corrección 2: Se añadió a la consulta SELECT
  → Error de compilación de TypeScript (columna no está en los tipos generados)
  → La IA revisó la Corrección 1 pero no detectó el problema del SELECT

Corrección 3: Se cambió a SELECT *
  → Se arregló la ruta de producción, se olvidó la ruta sandbox
  → La IA lo revisó y NO LO DETECTÓ OTRA VEZ (4ª ocurrencia)

Corrección 4: La prueba lo detectó al instante en la primera ejecución. PASÓ:

El patrón: la inconsistencia entre la ruta sandbox/producción es la regresión número 1 introducida por IA.

Pruebas de API en Modo Sandbox

La mayoría de los proyectos con arquitectura amigable para IA tienen un modo sandbox/mock. Esta es la clave para pruebas de API rápidas y sin base de datos.

Configuración (Vitest + Next.js App Router)

// vitest.config.ts
import { defineConfig } from "vitest/config";
import path from "path";

export default defineConfig({
  test: {
    environment: "node",
    globals: true,
    include: ["__tests__/**/*.test.ts"],
    setupFiles: ["__tests__/setup.ts"],
  },
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "."),
    },
  },
});
// __tests__/setup.ts
// Forzar modo sandbox — no se necesita base de datos
process.env.SANDBOX_MODE = "true";
process.env.NEXT_PUBLIC_SUPABASE_URL = "";
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY = "";

Helper de prueba para rutas de API de Next.js

// __tests__/helpers.ts
import { NextRequest } from "next/server";

export function createTestRequest(
  url: string,
  options?: {
    method?: string;
    body?: Record<string, unknown>;
    headers?: Record<string, string>;
    sandboxUserId?: string;
  },
): NextRequest {
  const { method = "GET", body, headers = {}, sandboxUserId } = options || {};
  const fullUrl = url.startsWith("http") ? url : `http://localhost:3000${url}`;
  const reqHeaders: Record<string, string> = { ...headers };

  if (sandboxUserId) {
    reqHeaders["x-sandbox-user-id"] = sandboxUserId;
  }

  const init: { method: string; headers: Record<string, string>; body?: string } = {
    method,
    headers: reqHeaders,
  };

  if (body) {
    init.body = JSON.stringify(body);
    reqHeaders["content-type"] = "application/json";
  }

  return new NextRequest(fullUrl, init);
}

export async function parseResponse(response: Response) {
  const json = await response.json();
  return { status: response.status, json };
}

Escribir pruebas de regresión

El principio clave: escribe pruebas para los errores que se encontraron, no para el código que funciona.

// __tests__/api/user/profile.test.ts
import { describe, it, expect } from "vitest";
import { createTestRequest, parseResponse } from "../../helpers";
import { GET, PATCH } from "@/app/api/user/profile/route";

// Define el contrato — qué campos DEBEN estar en la respuesta
const REQUIRED_FIELDS = [
  "id",
  "email",
  "full_name",
  "phone",
  "role",
  "created_at",
  "avatar_url",
  "notification_settings",  // ← Añadido después de que se encontrara un error por estar ausente
];

describe("GET /api/user/profile", () => {
  it("devuelve todos los campos requeridos", async () => {
    const req = createTestRequest("/api/user/profile");
    const res = await GET(req);
    const { status, json } = await parseResponse(res);

    expect(status).toBe(200);
    for (const field of REQUIRED_FIELDS) {
      expect(json.data).toHaveProperty(field);
    }
  });

  // Prueba de regresión — este error exacto fue introducido por IA 4 veces
  it("notification_settings no es undefined (regresión BUG-R1)", async () => {
    const req = createTestRequest("/api/user/profile");
    const res = await GET(req);
    const { json } = await parseResponse(res);

    expect("notification_settings" in json.data).toBe(true);
    const ns = json.data.notification_settings;
    expect(ns === null || typeof ns === "object").toBe(true);
  });
});

Probar paridad entre modo sandbox y producción

La regresión más común introducida por IA: arreglar la ruta de producción pero olvidar la ruta sandbox (o viceversa).

// Probar que las respuestas en modo sandbox coinciden con el contrato esperado
describe("GET /api/user/messages (lista de conversaciones)", () => {
  it("incluye partner_name en modo sandbox", async () => {
    const req = createTestRequest("/api/user/messages", {
      sandboxUserId: "user-001",
    });
    const res = await GET(req);
    const { json } = await parseResponse(res);

    // Esto detectó un error donde partner_name se añadió
    // a la ruta de producción pero no a la ruta sandbox
    if (json.data.length > 0) {
      for (const conv of json.data) {
        expect("partner_name" in conv).toBe(true);
      }
    }
  });
});

Integrar pruebas en el flujo de trabajo de verificación de errores

Definición de comando personalizado

<!-- .claude/commands/bug-check.md -->
# Verificación de Errores

## Paso 1: Pruebas automatizadas (obligatorio, no se puede omitir)

Ejecuta estos comandos PRIMERO antes de cualquier revisión de código:

    npm run test       # Suite de pruebas Vitest
    npm run build      # Verificación de tipos TypeScript + compilación

- Si las pruebas fallan → reporta como error de máxima prioridad
- Si la compilación falla → reporta errores de tipo como máxima prioridad
- Solo continúa al Paso 2 si ambos pasan

## Paso 2: Revisión de código (revisión por IA)

1. Consistencia entre ruta sandbox y producción
2. La forma de la respuesta de la API coincide con las expectativas del frontend
3. Integridad de la cláusula SELECT
4. Manejo de errores con rollback
5. Condiciones de carrera en actualizaciones optimistas

## Paso 3: Para cada error corregido, propón una prueba de regresión

El flujo de trabajo

Usuario: "バグチェックして" (o "/bug-check")
  │
  ├─ Paso 1: npm run test
  │   ├─ FALLA → Error detectado mecánicamente (no se necesita juicio de IA)
  │   └─ PASA → Continuar
  │
  ├─ Paso 2: npm run build
  │   ├─ FALLA → Error de tipo detectado mecánicamente
  │   └─ PASA → Continuar
  │
  ├─ Paso 3: Revisión de código por IA (teniendo en cuenta los puntos ciegos conocidos)
  │   └─ Hallazgos reportados
  │
  └─ Paso 4: Para cada corrección, escribe una prueba de regresión
      └─ La próxima verificación detectará si la corrección se rompe

Patrones comunes de regresión de IA

Patrón 1: Discrepancia entre ruta sandbox y producción

Frecuencia: Más común (observado en 3 de cada 4 regresiones)

// FALLA: La IA añade el campo solo a la ruta de producción
if (isSandboxMode()) {
  return { data: { id, email, name } };  // Falta el nuevo campo
}
// Ruta de producción
return { data: { id, email, name, notification_settings } };

// PASA: Ambas rutas deben devolver la misma forma
if (isSandboxMode()) {
  return { data: { id, email, name, notification_settings: null } };
}
return { data: { id, email, name, notification_settings } };

Prueba para detectarlo:

it("sandbox y producción devuelven los mismos campos", async () => {
  // En el entorno de prueba, el modo sandbox está forzado a ON
  const res = await GET(createTestRequest("/api/user/profile"));
  const { json } = await parseResponse(res);

  for (const field of REQUIRED_FIELDS) {
    expect(json.data).toHaveProperty(field);
  }
});

Patrón 2: Omisión en la cláusula SELECT

Frecuencia: Común con Supabase/Prisma al añadir nuevas columnas

// FALLA: Nueva columna añadida a la respuesta pero no al SELECT
const { data } = await supabase
  .from("users")
  .select("id, email, name")  // notification_settings no está aquí
  .single();

return { data: { ...data, notification_settings: data.notification_settings } };
// → notification_settings siempre es undefined

// PASA: Usa SELECT * o incluye explícitamente las nuevas columnas
const { data } = await supabase
  .from("users")
  .select("*")
  .single();

Patrón 3: Fuga de estado de error

Frecuencia: Moderada — al añadir manejo de errores a componentes existentes

// FALLA: El estado de error se establece, pero los datos antiguos no se borran
catch (err) {
  setError("Error al cargar");
  // ¡las reservas aún muestran datos de la pestaña anterior!
}

// PASA: Limpiar el estado relacionado al ocurrir un error
catch (err) {
  setReservations([]);  // Limpiar datos obsoletos
  setError("Error al cargar");
}

Patrón 4: Actualización optimista sin rollback adecuado

// FALLA: Sin rollback en caso de fallo
const handleRemove = async (id: string) => {
  setItems(prev => prev.filter(i => i.id !== id));
  await fetch(`/api/items/${id}`, { method: "DELETE" });
  // Si la API falla, el elemento desaparece de la UI pero sigue en la DB
};

// PASA: Capturar el estado anterior y hacer rollback en caso de fallo
const handleRemove = async (id: string) => {
  const prevItems = [...items];
  setItems(prev => prev.filter(i => i.id !== id));
  try {
    const res = await fetch(`/api/items/${id}`, { method: "DELETE" });
    if (!res.ok) throw new Error("Error de API");
  } catch {
    setItems(prevItems);  // Rollback
    alert("Error al eliminar");
  }
};

Estrategia: Prueba donde se encontraron los errores

No apuntes a una cobertura del 100%. En su lugar:

Error encontrado en /api/user/profile     → Escribe prueba para la API de perfil
Error encontrado en /api/user/messages    → Escribe prueba para la API de mensajes
Error encontrado en /api/user/favorites   → Escribe prueba para la API de favoritos
Sin error en /api/user/notifications      → No escribas prueba (aún)

Por qué funciona con el desarrollo con IA:

  1. La IA tiende a cometer el mismo tipo de error repetidamente
  2. Los errores se agrupan en áreas complejas (auth, lógica de rutas múltiples, gestión de estado)
  3. Una vez probado, esa regresión exacta no puede volver a ocurrir
  4. El número de pruebas crece orgánicamente con las correcciones de errores — sin esfuerzo desperdiciado

Referencia rápida

Patrón de Regresión de IAEstrategia de PruebaPrioridad
Discrepancia sandbox/producciónAfirmar la misma forma de respuesta en modo sandboxAlta
Omisión en cláusula SELECTAfirmar todos los campos requeridos en la respuestaAlta
Fuga de estado de errorAfirmar limpieza de estado al ocurrir un errorMedia
Falta de rollbackAfirmar que el estado se restaura al fallar la APIMedia
Tipo de dato que enmascara nullAfirmar que el campo no es undefinedMedia

HACER / NO HACER

HACER:

  • Escribir pruebas inmediatamente después de encontrar un error (antes de corregirlo si es posible)
  • Probar la forma de la respuesta de la API, no la implementación
  • Ejecutar las pruebas como primer paso de cada verificación de errores
  • Mantener las pruebas rápidas (< 1 segundo en total con modo sandbox)
  • Nombrar las pruebas según el error que previenen (ej., "regresión BUG-R1")

NO HACER:

  • Escribir pruebas para código que nunca ha tenido un error
  • Confiar en la autorevisión de la IA como sustituto de las pruebas automatizadas
  • Omitir las pruebas de la ruta sandbox porque "son solo datos simulados"
  • Escribir pruebas de integración cuando las pruebas unitarias son suficientes
  • Apuntar a un porcentaje de cobertura — apunta a la prevención de regresiones

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills relacionados