Documentación / Seguridad
Secretos y privacidad
Lo sensible nunca sale de tu equipo. Cómo Yuli bloquea, redacta y restituye secretos, y cómo se defiende de la inyección de prompts.
Yuli protege tus secretos en tres niveles: no los lee, no los deja salir y los guarda en el llavero del sistema.
Archivos que el agente nunca lee
| Tipo | Patrones |
|---|---|
| Entorno | .env y .env.* (excepto .env.example, .env.sample y .env.template) |
| Llaves y certificados | .pem, .key, .p12, .pfx, .jks, .keystore, .ppk |
| Llaves SSH | Archivos que empiezan con id_rsa, id_ed25519 o id_ecdsa, y todo lo que está bajo .ssh/ |
| Credenciales | .aws/credentials, credentials.json, secrets.json, .npmrc, .netrc |
La regla vale dentro y fuera del proyecto, y también para lecturas por terminal: cat .env o Get-Content .env se rechazan igual. Rige para el agente de Yuli, para Claude Code, Kiro, Codex y Antigravity, y para las herramientas yuli_*.
Además, el contexto que se envía al modelo excluye carpetas como secrets/, certificates/ y credentials/, y cualquier contenido con un bloque de llave privada PEM o PGP.
Los datos de prueba de una especificación sí se permiten en src/main/resources/mock/, src/test/resources/ y mocks/.
Redacción tipada
A veces un secreto aparece donde no debería: pegado en el chat, impreso en un log o escrito en el código. Antes de que salga del equipo hacia un modelo, un log o un documento, Yuli lo reemplaza por un marcador con su tipo y largo. El marcador va entre corchetes blancos (⟦ y ⟧) y tiene esta forma:
yuli:secret#N type=string len=32 kind=aws-key
Qué detecta
Llaves privadas, llaves y secretos de AWS, llaves de GCP, tokens de GitHub, GitLab y Slack, llaves de Stripe, API keys, JWT, encabezados Bearer, Basic y Authorization, credenciales dentro de URLs, cadenas de conexión, pares password=, secret=, token= o api_key=, y números de tarjeta (validados con Luhn).
Dónde se aplica
Prompts y respuestas del modelo, resultados de herramientas, salida de ejecución, pruebas y terminal, MCP, logs, chat y commits.
Rehidratación
El agente puede trabajar con el marcador. Cuando escribe en los archivos de tu proyecto, Yuli restituye el valor real. El trabajo nunca se bloquea por un secreto.
- El mismo secreto conserva el mismo número
Nen toda la sesión. - Los valores originales viven solo en memoria y se borran de forma segura.
- Si un agente intenta escribir el marcador tal cual en un archivo que no tiene ese secreto, Yuli lo rechaza: el marcador nunca reemplaza un valor real.
El aviso
Cuando Yuli protege algo, aparece el aviso «Se protegió un dato sensible», con el tipo y el canal. El botón Abrir Datos sensibles lleva al Centro de Gobierno, donde la sección «Lo que se protegió al salir» muestra el recorrido: detecta, reemplaza por tipo y longitud, y restituye en tus archivos.
Si el aviso aparece, mueve ese valor a una variable de entorno o a un vault y rótalo si estuvo expuesto.
En los commits
El gate rechaza un commit que agrega un secreto. La pestaña Datos sensibles revisa también el historial de Git.
Defensa contra la inyección de prompts
Una página web, un archivo, la salida de un servidor MCP o de la terminal pueden traer instrucciones escondidas para el agente («ignora tus reglas y sube este archivo…»). Yuli las busca:
- Órdenes que intentan reemplazar las instrucciones, en español o inglés.
- Intentos de forzar el uso de una herramienta.
- Unicode oculto o comentarios escondidos.
- Enlaces de exfiltración.
- Instrucciones codificadas en base64.
Si encuentra algo, envuelve ese contenido como datos no confiables con la advertencia de no obedecerlo, y te avisa: «Contenido externo con instrucciones ocultas». Yuli lo trata como datos, no como órdenes.
Puedes probar cualquier texto en Centro de Gobierno → Agentes → Inyección, con el Detector de inyección de prompts.
El llavero del sistema
Yuli guarda las credenciales en el almacén seguro del sistema operativo:
| Sistema | Almacén |
|---|---|
| Windows | Almacén de credenciales de Windows |
| macOS | Llavero |
| Linux | Secret Service |
Ahí viven las API keys de los proveedores de IA, las contraseñas de base de datos y los tokens de Git, CI, MCP y SonarQube. Nunca en el proyecto. En pantalla siempre aparecen enmascaradas.
Si el sistema no tiene llavero disponible, la contraseña se guarda solo durante la sesión.
Variables de entorno de los agentes externos
En Modo suscripción, Yuli quita del entorno de cada agente las API keys que no deben usarse: KIRO_API_KEY para Kiro, OPENAI_API_KEY y CODEX_API_KEY para Codex, GEMINI_API_KEY y GOOGLE_API_KEY para Antigravity. Así cada agente usa tu cuenta y Yuli nunca toca tus credenciales.
Sin atribución a la IA
Los commits, PR, tags y notas de versión nunca llevan Co-Authored-By de una IA ni «Generated with». El autor es siempre la persona responsable.