Configuración

Idioma

Construyendo una Production AI Platform con Claude Code en 30 días: La historia honesta

L
LemonData
·27 de febrero de 2026·3576 vistas
Construyendo una Production AI Platform con Claude Code en 30 días: La historia honesta

Eran las 2 AM de un martes cuando me di cuenta de que el sistema de facturación estaba cobrando el doble a los usuarios. El bug había estado en producción durante seis horas. Claude Code había generado la lógica de conciliación de pagos esa tarde, y yo la había revisado, probado y desplegado. El código se veía perfecto. Pasó cada test. Y estaba fundamentalmente roto.

Esta es la historia de la construcción de LemonData: 274 API routes, 46 database models y más de 100,000 líneas de código con un AI coding assistant. No es la historia pulida de "mira qué tan productivo te hace la AI". Es la real, con los fallos, las sesiones de depuración a las 3 AM y los momentos en los que me cuestioné si el desarrollo asistido por AI era realmente una buena idea.

La promesa vs. la realidad del desarrollo asistido por AI

La promesa de los AI coding assistants es seductora: describes lo que quieres, la AI lo escribe, tú lo revisas y lo despliegas. En teoría, un solo desarrollador puede ahora hacer el trabajo de un equipo completo.

¿En la práctica? Las primeras dos semanas fueron increíbles. Claude Code entendía mi base de código, generaba funcionalidades completas, hacía refactored entre archivos. Estaba desplegando más rápido que nunca en mi carrera. El subidón de dopamina de cerrar issues tan rápido era embriagador.

Luego empezaron a aparecer las grietas.

La misma función aparecía en tres archivos diferentes con implementaciones ligeramente distintas. Los valores de configuración estaban hardcoded en lugares aleatorios. Las Type definitions se contradecían entre paquetes. La base de código crecía rápido, pero también se estaba convirtiendo en un laberinto de código que "funciona pero no estoy seguro de por qué".

¿Y aquel bug de facturación? Claude había generado una función de conciliación con un aspecto perfectamente razonable. Pero no tuvo en cuenta una race condition en nuestro flujo de confirmación de pagos async. La AI no tenía forma de saber sobre ese edge case porque yo no se lo había dicho explícitamente, y el test suite, que también era en parte generado por AI, tampoco lo había cubierto.

Los siete patrones que seguían fallando

Después de un mes construyendo con Claude Code, empecé a llevar una lista. No de bugs exactamente, sino de patrones. Seguían ocurriendo los mismos tipos de fallos, y no eran culpa de Claude, o al menos no del todo. Eran el resultado predecible de una AI optimizando para "código que funciona ahora" en lugar de "código que funcionará mañana".

1. El problema de la consistencia

Claude implementaba la misma lógica de forma diferente dependiendo del archivo en el que estuviera trabajando, de los ejemplos que hubiera visto recientemente o, aparentemente, por simple variación aleatoria. Un API endpoint devolvía { data: users }, otro devolvía { users }. Ambos funcionaban. Ninguno coincidía con el otro. Depurar se convirtió en arqueología.

2. El problema de copiar y pegar

¿Por qué una AI crearía una shared utility cuando duplicar código es más rápido y no corre el riesgo de romper la funcionalidad existente? Cada vez que pedía una nueva funcionalidad que se parecía a una existente, obtenía una implementación nueva en lugar de una solución compartida refactored. Después de tres semanas, tenía cinco funciones diferentes de "formatear moneda" dispersas por la base de código.

3. El problema del Type Drift

Se añadía un nuevo valor de estado a un archivo pero no a la enum definition. Un campo era opcional en la respuesta de la API pero requerido en el frontend type. TypeScript detectaba algunos de estos, pero no los desajustes semánticos, los casos en los que los tipos eran técnicamente correctos pero lógicamente inconsistentes.

4. El problema de la dispersión de la configuración

Las URLs de bases de datos, API keys, feature flags y rate limits terminaban donde fuera conveniente para la tarea actual. A veces en environment variables, a veces en un config file, a veces hardcoded. Encontrar todos los lugares donde se definía un valor se convirtió en una búsqueda del tesoro.

5. La ilusión de la cobertura de pruebas

Los tests generados por AI tienden a probar el happy path a fondo y omiten los edge cases por completo. El bug de facturación fue un ejemplo perfecto: el test suite cubría los flujos de pago normales maravillosamente. Nunca probó qué sucede cuando llegan dos confirmaciones de pago en el mismo milisegundo.

6. El problema del fallo silencioso

Claude añadía bloques catch (error) { console.log(error) } que se tragaban las excepciones. En desarrollo, esto se veía bien porque los errores aparecían en la consola. En producción, los fallos críticos se registraban silenciosamente y se olvidaban.

7. La brecha de documentación

Claude escribe excelentes comentarios de código. Escribe una documentación arquitectónica terrible. Puede explicar qué hace una función, pero no puede explicar por qué el sistema está estructurado de esa manera, o qué limitaciones llevaron a una decisión de diseño particular.

La solución CLAUDE.md

El punto de inflexión llegó en la tercera semana, cuando creé CLAUDE.md, un archivo en la raíz del proyecto que contiene cada convención, restricción y decisión arquitectónica que Claude necesita saber.

No es documentación para humanos. Es documentación para la AI.

## API Response Format
Always use: { success: true, data: T } or { success: false, error: string }
Never return raw data without the wrapper.

## Currency
Internal storage: USD. Display: formatCurrency(amount, currency, rate).
Never hardcode exchange rates. Never store CNY directly.

## Error Handling
Never use catch(e) { console.log(e) }.
Always use the logger: logger.error('context', { error }).

El efecto fue inmediato. Claude empezó a seguir las convenciones de forma consistente. Cuando generaba código que violaba una regla, yo podía señalar la línea específica en CLAUDE.md y él se autocorregía.

Pero CLAUDE.md por sí solo no era suficiente. Necesitaba una aplicación automatizada.

Construyendo la red de seguridad: CI Gates para código generado por AI

Construimos un pipeline de CI con gates que parecerían paranoicas en una base de código tradicional porque existen para detectar bugs generados por AI antes que los usuarios:

  • Type checking en todo el monorepo
  • Auditorías SSOT que verifican que no existan implementaciones duplicadas
  • Enum sync checks entre las enums de la base de datos y las de TypeScript
  • Validación del API response format
  • Security gates para el código de facturación, permisos y autenticación

La idea clave es simple: Claude es un amplificador, no un reemplazo. Amplifica tu productividad, pero también amplifica tus errores. Si no tienes convenciones sólidas, Claude inventará las suyas propias, y no serán consistentes. Si no tienes comprobaciones automatizadas, los bugs de Claude llegarán a producción más rápido de lo que los errores humanos podrían jamás.

El bug de facturación ya no podría ocurrir. No porque Claude se volviera más inteligente, sino porque el pipeline ahora requería un manejo explícito de async race conditions, verificado por un gate que comprobaba el locking adecuado en los flujos de pago.

Qué significa realmente el "Desarrollo Nativo de AI"

Cuando digo que LemonData es "Infraestructura Nativa de AI", no me refiero a que añadimos funciones de AI a un producto existente. Me refiero a que todo el proceso de desarrollo fue moldeado por la realidad de trabajar con un AI coding partner.

Nuestra documentación es más detallada de lo que sería de otro modo porque Claude necesita un contexto explícito que un compañero humano podría inferir. Nuestro sistema de tipos es más estricto de lo necesario porque Claude explotará cualquier ambigüedad. Nuestro pipeline de CI tiene gates que parecerían paranoicas en una base de código tradicional porque existen para detectar bugs generados por AI antes que los usuarios.

El resultado es una base de código que es en realidad más mantenible que la mayoría en las que he trabajado. No porque la AI escriba mejor código que los humanos, sino porque construir para el desarrollo asistido por AI me obligó a hacer explícitas todas las convenciones y comprobaciones que normalmente viven solo en la cabeza de los desarrolladores senior.

Para más sobre lo que significa Nativo de AI como filosofía, consulta ¿Qué es Nativo de AI?

Si quieres el lado más práctico de “¿cómo empiezo a aplicar esto?”, las dos mejores lecturas complementarias son la guía de diseño de API centrada en agentes y la guía de migración. Una explica la forma de la API. La otra muestra qué tan rápido puede un equipo cambiar de dirección una vez que el workflow está diseñado para el cambio de modelos.

Lecciones para desarrolladores que construyen con AI Coding Assistants

Si estás empezando un proyecto con Claude Code, Cursor o cualquier AI coding assistant:

  1. Crea tu CLAUDE.md el primer día, no en la tercera semana como hice yo.
  2. Automatiza la aplicación de convenciones. No confíes en que la AI recordará las reglas.
  3. Revisa el código de la AI como si lo hubiera escrito un desarrollador junior. Es rápido y capaz, pero carece de contexto.
  4. Prueba los edge cases manualmente. Los tests generados por AI cubren happy paths, no race conditions.
  5. Centraliza la configuración desde el principio. El problema de la dispersión se agrava rápido.
  6. Usa TypeScript estricto. Es tu mejor defensa contra el Type Drift.
  7. Construye CI gates temprano. Se pagan solos en la primera semana.

¿Lo volvería a hacer?

Absolutamente. Pero empezaría con CLAUDE.md el primer día en lugar de la tercera semana. Y recordaría que el multiplicador de productividad de 10x incluye un multiplicador de 10x en las consecuencias de los errores.

La plataforma que construimos, más de 300 modelos de AI, una API unificada, facturación multimoneda e internacionalización en 13 idiomas, le habría tomado meses a un equipo tradicional. La lanzamos en 30 días. Los bugs fueron reales, pero la velocidad también lo fue.

El desarrollo asistido por AI no es magia. Es un nuevo tipo de disciplina de ingeniería. Y como todas las disciplinas, recompensa a quienes respetan sus restricciones.

FAQ

¿Puede realmente un solo desarrollador construir una plataforma de producción con Claude Code?

Sí, pero con matices. La AI maneja la generación de código y el refactored a una velocidad increíble, pero aún necesitas un juicio arquitectónico sólido, quality gates automatizados y la disciplina para revisar todo cuidadosamente. La velocidad de 10x incluye bugs 10x más rápidos si no tienes cuidado.

¿Qué es CLAUDE.md?

CLAUDE.md es un archivo de instrucciones a nivel de proyecto que los AI coding assistants leen para obtener contexto. Contiene convenciones de codificación, decisiones arquitectónicas y restricciones que la AI debe seguir. Piénsalo como documentación de onboarding para tu compañero de AI.

¿Cómo se previenen los bugs generados por AI en producción?

Los CI gates automatizados son esenciales: type checking, auditorías SSOT, verificación de Enum sync y security gates específicos del dominio. La idea clave es que la AI amplifica tanto la productividad como los errores, por lo que necesitas comprobaciones automatizadas para detectar los errores amplificados.

¿Es el desarrollo asistido por AI adecuado para sistemas de facturación y pago?

Sí, pero con precaución extra. El código de pagos necesita un manejo explícito de race conditions, un locking adecuado y pruebas exhaustivas de edge cases. Los tests generados por AI tienden a cubrir happy paths, por lo que debes probar manualmente los escenarios de fallo y las operaciones concurrentes.


LemonData te da acceso a más de 300 modelos de AI a través de una sola API. Empieza gratis y prueba la plataforma con $1 en créditos.

Share: