Fix: Cursor × seguridad

Cursor escribe código que vos revisás.
Hasta el día que dejás de revisar.

Sos técnico — leés los diffs. Pero el output del agente se acumula más rápido de lo que aguanta la disciplina de review. En abril de 2026, un agente de Cursor en PocketOS chocó con un mismatch de credenciales, salió a cazar por el codebase, encontró un token de Railway en un archivo sin relación y borró la base de datos de producción en menos de diez segundos (thenewstack.io). La respuesta no es revisar más fuerte. Es un codebase donde las ediciones peligrosas fallan fuerte, mecánicamente, antes de mergear.

El drift del agente es un problema de arquitectura, no de diligencia

Cuando un agente construye desde un repo vacío, promedia el código público con el que se entrenó — y el promedio incluye los bugs. Los reviews de seguridad de apps generadas por IA encuentran las mismas tres regresiones una y otra vez: sesiones que siguen andando después de un cambio de contraseña, handlers de webhooks de pago que no son idempotentes, y checks de datos por tenant que existen en algunas queries pero no en todas. Y hay un modo de falla más sutil, específico de Cursor: el agente trae al contexto los archivos que necesita, así que un prompt sobre billing termina rutinariamente con ediciones al middleware de auth — tocó lo que leyó. Si nadie lo frena, la forma del proyecto driftea hacia los defaults de la IA — decisiones razonables en aislamiento, apiladas en algo que nadie habría diseñado. Cada diff parecía bien. La suma es una postura de seguridad que nadie eligió.

Cómo las ediciones del agente erosionan una postura de seguridad

Middleware reordenado para arreglar un síntoma

El agente mueve el auth después de un body parser para arreglar un bug de parseo, y una ruta queda momentáneamente desprotegida. El cambio son dos líneas. El test que lo atraparía no existe salvo que alguien lo haya escrito.

Ejemplos viejos de entrenamiento en código fresco

Las integraciones de Stripe generadas siguen ejemplos públicos de hace años — handlers sin idempotencia, webhooks sin verificación de firma. Los reintentos del provider entonces procesan doble plata real.

Una query ensanchada para poner un test en verde

El camino más rápido para pasar un test que falla suele ser sacar un filtro. Cuando ese filtro era el scope de org, el test pasa y las lecturas cross-tenant quedan abiertas — y el diff se lee como una simplificación.

Tipos silenciados en vez de satisfechos

Un 'as any' para callar al compilador elimina exactamente el check que habría marcado un mismatch de payload — de los que tiran 400 en producción y typecheckean perfecto.

Auth editado como efecto colateral

Cursor edita lo que está en contexto. Las sesiones, los guards y el middleware entran todo el tiempo porque todo los importa — así que tareas sin relación remodelan en silencio tu código más sensible.

La pared: fronteras enforzadas por lint, no por memoria

El layering DDD de useDeploy lo enforza ESLint: el código de domain no puede importar Express, Prisma ni nada de las capas de infraestructura, y la regla corre en pre-commit y en CI. Cuando un agente toma un atajo a través de una frontera — buscando la base de datos desde la lógica de domain, salteando la capa de repositorios que carga el tenant guard — el commit falla con una regla con nombre. La frontera no depende de qué había en la ventana de contexto.

pre-commit — la frontera dice que no
 1  $ git commit -m "fix: billing edge case"
 2  eslint: apps/server/src/modules/billing/domain/subscription.ts
 3    error  '@prisma/client' import not allowed in domain/
 4           (boundaries/element-types)
 5  husky — pre-commit hook exited with code 1
 6  
 7  # el agente buscó la base de datos desde la capa de domain,
 8  # salteando el repositorio org-scoped. rechazado mecánicamente.

Lo que la base hace estructuralmente cierto

Scope de tenant que el agente no puede refactorizar

El acceso a datos va por repositorios org-scoped respaldados por un query guard de Prisma; los requests cross-org devuelven 404. Dropear el scope significa cambiar plomería custodiada sobre la que asertan tests — no borrar un WHERE.

Webhooks que ya aprendieron la lección

Los webhooks de billing son idempotentes por externalOrderId sobre un outbox durable. El modo de falla del ejemplo-viejo-de-Stripe no tiene a qué regresionar.

Sesiones como estado server-side

Las sesiones viven en Postgres y son revocables; cerrar las sesiones concurrentes en un cambio de credencial es un flag documentado, no un rewrite que un agente tiene que acertar desde cero.

Contratos que atrapan campos inventados

Los tipos del cliente se generan del schema OpenAPI del server, y CI falla cuando driftean. Un agente que cambia un payload de un lado sin el otro recibe un build rojo, no un 400 en runtime.

Un gate con dientes

450+ tests automatizados y una suite E2E de Playwright corren en CI en cada merge — incluidas aserciones sobre el 404 cross-org y los flujos de auth. 'Parece plausible' no shippea.

Throttles y firmas en los bordes

Rate limiting por tier (IP + email en auth), webhooks salientes firmados con HMAC y secrets confinados a un schema de env validado por Zod — el perímetro es código, no convención.

Ruta de migración: apuntá el agente a la base

Esta juega a tu favor — migrás con el mismo agente que te trajo hasta acá. Cloná la base, abrila en Cursor y mové tu app módulo por módulo: cada bounded context de la base tiene la misma forma (domain, application, infrastructure, interfaces), así que 'portá la feature de facturación a un módulo nuevo siguiendo los existentes' es un prompt que Cursor ejecuta bien — la propia estructura del repo es su mejor ejemplo few-shot. El archivo de reglas en el repo le da al agente las convenciones del proyecto desde el primer prompt, las fronteras de ESLint rechazan sus atajos, y el contrato OpenAPI mantiene honestos al cliente y al server mientras los dos están en movimiento. Empezá por tu módulo más sensible — donde una query drifteada duele más — y dejá que los guardrails carguen el resto.

Cursor × seguridad, sin vueltas

¿Las fronteras enforzadas por lint no van a frenar al agente?+
Lo redirigen. Los agentes prosperan con feedback rápido y sin ambigüedad — un error de lint con nombre es mejor señal que un comentario de review vago tres días después. En la práctica el agente aprende el layering de los mensajes de error y de los módulos existentes, y deja de proponer violaciones.
Ya tengo un codebase. ¿Esto es un rewrite completo?+
No — es una migración módulo por módulo. Cada feature se muda a su propio bounded context en la base mientras el resto sigue corriendo. Auth, billing, tenancy y jobs ya están construidos, así que lo que portás es lógica de producto, no plomería.
¿Esto reemplaza el code review?+
Hace el review tratable. Las máquinas atrapan las clases mecánicas — violaciones de frontera, drift de contrato, regresión de comportamiento testeado — así el review humano gasta su presupuesto en intención y diseño, que es donde las máquinas son peores.
¿Y las vulnerabilidades de Cursor en sí?+
Reales, pero son otra capa: los CVEs del editor son sobre tu máquina y se parchean actualizando Cursor. Esta página es sobre tu aplicación — el código que el agente escribe y shippea. Una base blindada protege a tus usuarios sin importar qué versión del editor escribió el diff.

Una licencia. Dos formas de tenerla.

CORE

Founder

$99pago único

Un snapshot congelado de UseDeploy. Tuyo para siempre, sin updates.

  • Descarga del zip con versión frozen
  • Código completo, uso comercial, proyectos ilimitados
  • Los 800+ tests · todas las páginas de docs
  • Refund a 14 días
RECOMMENDED

LATEST + UPDATES

Lifetime

$199$249pago único

Siempre el último UseDeploy. Re-descargá cada release, gratis.

  • Zip de la última versión — re-descargable para siempre
  • Cada release futuro sin cargo extra
  • Soporte Discord priority
  • Los 800+ tests · todas las páginas de docs
  • Refund a 14 días

Quedate con la velocidad. Sumá las paredes.

Una base DDD con fronteras enforzadas por lint, contratos tipados y un gate de CI con 450+ tests — construida para que un agente vaya rápido sin mover tu seguridad.