# Seguridad y Privacidad

> Cómo el Race Engineer protege tus datos mediante aislamiento de sandbox, verificaciones de propiedad y autenticación OAuth.

El Race Engineer está diseñado con seguridad en cada capa. Tus datos de carrera están protegidos por aislamiento de sandbox, verificación de propiedad por consulta y autenticación estándar de la industria.

## Aislamiento del Sandbox

El código de la IA se ejecuta en **isolated-vm**, un aislado V8 sin acceso a:

- **Red**: No puede hacer peticiones HTTP ni conectarse a servicios externos
- **Sistema de archivos**: No puede leer ni escribir archivos
- **Entorno**: No puede acceder a variables de entorno ni secretos
- **Módulos**: No puede hacer `require()` ni `import` de paquetes externos

El sandbox está restringido a:

| Límite | Valor |
|--------|-------|
| Timeout de ejecución | 10 segundos |
| Memoria | 32 MB |
| Llamadas API por ejecución | 20 |
| Tamaño de código | 10 KB |
| Tamaño de salida | 100 KB |

Si se excede cualquier límite, la ejecución termina inmediatamente.

## Propiedad de Datos

Cada función verifica que el usuario autenticado es dueño de los datos solicitados:

- `assertSessionOwnership(userId, sessionId)` antes de cualquier consulta de sesión
- `assertRaceOwnership(userId, raceEventId)` antes de operaciones de calendario
- `assertNotepadOwnership(userId, notepadId)` antes de acceso a notepads

No hay forma de consultar datos de otro usuario — incluso si conoces sus IDs de sesión. La única excepción es una vuelta pública del leaderboard que dueles explícitamente con `compareTraces`, que solo es legible porque su dueño eligió compartirla públicamente.

## Validación de Entrada

Todas las funciones usan **esquemas Zod** con validación estricta:

- Las funciones **MUTATING** y **CREATIVE** usan `.strict()` — campos desconocidos causan errores
- Cada parámetro tiene una anotación `.describe()` explicando su propósito
- La coerción de tipos está deshabilitada — la IA debe pasar los tipos correctos
- El flag `_validateOnly: true` permite validar mutaciones sin escribir

Esto previene ataques de inyección de prompts donde una IA podría intentar pasar parámetros inesperados.

## Autenticación

El servidor usa **OAuth 2.0 con PKCE** (Proof Key for Code Exchange):

1. **Registro dinámico de cliente** — Los clientes IA se registran automáticamente
2. **Flujo de código de autorización** — El usuario concede acceso explícitamente vía página de consentimiento
3. **PKCE obligatorio** — Previene interceptación del código de autorización
4. **Tokens JWT** — Los access tokens se firman y verifican en cada petición
5. **Refresh tokens** — Renovación automática de tokens sin re-autorización

### Endpoints de Descubrimiento

El servidor sigue RFC 8414 y RFC 9728 para descubrimiento automático:

| Endpoint | Estándar | Propósito |
|----------|----------|-----------|
| `/.well-known/oauth-authorization-server` | RFC 8414 | Descubrimiento de metadata OAuth |
| `/.well-known/oauth-protected-resource` | RFC 9728 | Metadata de recurso con 401 WWW-Authenticate |

Los clientes IA que siguen estos estándares pueden conectarse sin configuración manual.

## Política CORS

El servidor permite peticiones desde plataformas IA conocidas:

- `https://claude.ai`
- `https://chatgpt.com`
- `https://chat.openai.com`
- Más orígenes personalizados configurados por el operador del servidor

## Manejo de Datos

- **Sin entrenamiento**: Tus datos de telemetría nunca se usan para entrenar modelos de IA
- **Sin compartir**: Los datos están limitados a tu cuenta autenticada
- **Soft deletes**: La mayoría de datos usan timestamps `deleted_at` — eliminaciones accidentales se pueden recuperar
- **Limpieza de nulls**: La salida se limpia de valores null para reducir uso de tokens

## Qué No Almacenamos

El Race Engineer no almacena:

- Historial de conversaciones con IA
- El código que la IA escribe (se ejecuta y descarta)
- Respuestas del modelo de IA
- Claves API o credenciales de tu cliente IA
