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.
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?+
Ya tengo un codebase. ¿Esto es un rewrite completo?+
¿Esto reemplaza el code review?+
¿Y las vulnerabilidades de Cursor en sí?+
Una licencia. Dos formas de tenerla.
CORE
Founder
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
LATEST + UPDATES
Lifetime
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.