Ir al contenido

Proyectos

Latet tiene una sola configuración para todo, config.yaml. Un proyecto puede añadirle cosas de dos maneras:

Dónde Compartido Qué puede hacer
El archivo del proyecto, latet.yaml en el repositorio del proyecto con todas las personas que trabajan en él solo añadir protección
Tus ajustes para el proyecto en tu config.yaml, bajo projects: no cualquier cosa, incluso desactivar Latet ahí

El primero es para lo que necesita todo el equipo: los formatos de los códigos propios del proyecto, los países de sus clientes, un perfil más estricto. El segundo es para lo que es tuyo: los nombres de tus clientes, los valores que para ti no son sensibles, un proyecto en el que no quieres Latet en absoluto.

En un equipo conectado a un servidor Latet, el archivo del proyecto no se aplica: el servidor no lee ningún archivo del equipo, y aplica tus propios ajustes y los que comparte. En un proyecto así, latet doctor y latet claude lo dicen. Para usar allí sus reglas, importa el latet.yaml en tu panel, en Reglas con Importar reglas. Consulta Lo que queda en el equipo.

Las reglas de un proyecto en el panel, en las pestañas de las reglas globales: su Resumen, con lo que está en vigor allí y tus propios ajustes para él en conjunto Las reglas de un proyecto en el panel, en las pestañas de las reglas globales: su Resumen, con lo que está en vigor allí y tus propios ajustes para él en conjunto
Las reglas de un proyecto: Reglas, con el proyecto elegido arriba.

Lo decide la carpeta en la que trabaja el agente.

  • Claude Code: el plugin se la indica a Latet.
  • Un agente que lanza Latet (latet claude, latet codex, latet opencode, latet gemini, latet copilot): se la indica su clave de lanzamiento, donde el agente lleva una.
  • Codex, OpenCode y Gemini CLI: indican la carpeta en sus peticiones.
  • Cualquier otro cliente: puede enviar la cabecera x-latet-project: <folder>.

Una sesión cuya carpeta se desconoce usa tus ajustes globales.

El proyecto de una carpeta es la carpeta del latet.yaml más cercano, subiendo desde la carpeta hasta la raíz de su repositorio git. Si no hay ninguno, es el repositorio; fuera de un repositorio, la propia carpeta. Solo se aplica el archivo más cercano: una subcarpeta con su propio archivo es un proyecto aparte, y los dos no se combinan.

Latet solo considera de confianza el proyecto de una sesión cuando lo conoce por sí mismo:

  • Por el plugin de Claude Code, para una carpeta que Latet conoce como proyecto (una con un latet.yaml, o con tus propios ajustes para ella). El plugin vincula la sesión a ese proyecto; cada una de sus llamadas a Latet mantiene el vínculo, que termina tras 30 minutos sin ninguna.
  • Por una clave de lanzamiento, para un agente que Latet lanzó en esa carpeta.

Una carpeta que solo nombra la petición (la cabecera x-latet-project, o la carpeta de trabajo que Codex, OpenCode y Gemini CLI escriben en sus peticiones) está declarada. Las reglas de un proyecto declarado que añaden protección se aplican: sus términos, sus reconocedores, un perfil más estricto. Sus relajaciones no: valores y patrones que nunca se enmascaran, reglas de secretos desactivadas, un perfil o una política más débiles, data_tools, las indicaciones y las imágenes del revisor local. Un proyecto declarado en el que Latet está desactivado se rechaza igualmente, y una excepción de petición para un proyecto solo se aplica donde su proyecto es de confianza. El panel muestra para cada petición si su proyecto era de confianza o declarado (Proyecto declarado), y cómo se decidió su lanzamiento.

  • Antes de que el plugin vincule una sesión. Claude Code hace algunas llamadas al arrancar, antes de la primera llamada del plugin a Latet: su lista de modelos, y en Bedrock sus primeras peticiones. Se deciden solo con tus propias reglas, ni con las reglas añadidas del proyecto ni con sus relajaciones.
  • Lo que deja entrar el vínculo. Un vínculo es con el id de una sesión: una petición de Anthropic Messages que lleva el id de una sesión tuya activa vinculada por el plugin se decide con ese proyecto, relajaciones y excepciones incluidas, sea cual sea el programa tuyo que la envíe. La sigue leyendo la comprobación final y nunca se reescribe, y las peticiones de otra persona nunca lo alcanzan. Una sesión que arrancó latet claude necesita en cambio su clave de lanzamiento: su id por sí solo no obtiene ninguna relajación del proyecto.

Cuando Latet lanza un agente, abre un lanzamiento para la carpeta: una clave secreta generada solo para ese lanzamiento, ligada al proyecto de la carpeta y a ti. El agente la envía con sus peticiones en una cabecera, x-latet-launch-key, que Latet comprueba y quita antes de reenviar, registrar o anotar en un log cualquier cosa; Latet solo guarda un hash con clave de ella. La clave termina con el lanzamiento: cuando el agente sale, o cuando se detiene el comando que lo arrancó.

Comando Cómo viaja la clave
latet claude ANTHROPIC_CUSTOM_HEADERS, en el archivo de ajustes privado de esa sesión
latet codex env_http_headers de un proveedor de model_providers, desde Codex 0.115; ninguna en los proveedores integrados de Codex (con la sesión de ChatGPT, o el proveedor de OpenAI)
latet opencode options.headers de cada proveedor que redirige
latet gemini GEMINI_CLI_CUSTOM_HEADERS
latet copilot COPILOT_PROVIDER_HEADERS, hacia un proveedor compatible con OpenAI por Chat Completions; ninguna por Responses, la API de Anthropic o un WebSocket
latet run ninguna: un programa que arranca no tiene forma de llevar una

La clave se añade a las cabeceras que el agente ya envía: las tuyas se quedan como las escribiste, y siguen necesitando una excepción propia. A un agente que arranca sin clave se le dice por qué, en una frase como Latet: Codex older than 0.115 has no way to carry a launch key, so this session's project settings only add protection: their loosenings do not apply., y su proyecto queda declarado. Una carpeta que no es uno de tus proyectos no necesita clave.

  • Un secreto para Latet. En la salida de una herramienta o en un mensaje, una clave vigente se enmascara como el token de Latet; donde Latet no puede enmascararla (una petición que solo comprueba), la petición se rechaza, con palabras que dicen que vuelvas atrás o empieces una conversación nueva.
  • En manos de alguien, no ligada a un proceso. Cualquier programa que tenga la clave cuenta como ese lanzamiento. Funciona con el mismo usuario, y Latet no pretende distinguir entre programas.
  • Desconocida, terminada o de otro. Una petición con una clave que Latet no conoce (su daemon se reinició, por ejemplo) se decide como declarada, nunca se rechaza por eso. Una clave cuyo lanzamiento terminó, o enviada para otro proyecto o por otra persona, se rechaza.
  • En la dirección. En un equipo, Latet también acepta la clave al principio de la ruta de la dirección, una forma que ningún comando de lanzamiento usa; un servidor de Latet la rechaza.

El panel muestra cómo se decidió el lanzamiento de cada petición: Iniciado por Latet, clave verificada, Iniciado por Latet, falta la clave (un agente lanzado por Latet cuya petición llegó sin una clave que Latet pueda comprobar: decidido como declarado), Vinculado por el plugin de Claude Code (un Claude Code configurado de forma permanente) o No iniciado por Latet (declarado). latet doctor nombra cada agente lanzado por Latet que se vio sin su clave, con su versión.

latet project init escribe uno del que partir, en la raíz del repositorio. La página Reglas del panel también lo escribe: elige el proyecto en el selector de arriba. Sus términos, reconocedores y políticas son filas de las tablas Términos, Reconocedores y Políticas, marcadas latet.yaml, y se cambian en su recuadro lateral; uno nuevo va al archivo cuando el Guardar en de su recuadro dice latet.yaml. La pestaña Archivo del repositorio contiene el resto del archivo, y lo crea.

# yaml-language-server: $schema=https://docs.latet.ai/project.schema.json
profile: max
id_regions: [DE, FR]
terms:
- {value: Project Falcon, type: PROJECT}
recognizers:
- name: badge
description: Badge numbers, two letters, a dash and six digits
pattern: '\bBD-\d{6}\b'
examples:
match: ['badge BD-381904']
no_match: ['BD-12']
policies: {EMAIL: redact}

Un valor sustituye al tuyo solo cuando es más estricto:

  • profile: secrets, después balanced, después max (que ahí activa el modo de datos estricto, salvo que data esté definido);
  • policies: allow, después mask, después redact, frente a la política en vigor allí (incluida la propia de un reconocedor);
  • include_private_ips: solo true;
  • ner: solo auto;
  • data: solo strict; images: solo menos imágenes, mask y después block; ocr: solo auto; dump_guard: solo más bajo (consulta Datos de producción);
  • llm_review: off, después background, después inline, cuando el revisor está activado (consulta Revisor local).

Una lista se suma a la tuya: pii, id_regions, phone_regions, terms, recognizers, data_files, data_hosts y fields (solo las reglas que enmascaran). Un reconocedor de tus ajustes para el proyecto cuyo nombre o tipo ya usa uno de los tuyos globales se desactiva. Uno del archivo con el nombre o el tipo de uno de los tuyos, global o para el proyecto, se aplica de todos modos, con un nombre o un tipo propio (badge-repo, BADGE_REPO): se aplican los dos; a igualdad de tipo, ambos tipos toman la más estricta de las dos políticas; y la página del proyecto lo indica, con el nombre y el tipo en uso. Para un campo se aplica la más estricta entre tu regla y la del archivo, la tuya a igualdad.

Lo que allí dejaría valores en claro se deja aparte: un reconocedor que deja pasar lo que encuentra (policy: allow), y un reconocedor, un término o una regla de campo de un tipo que se deja en claro en esa carpeta, por tus políticas o tus ajustes para el proyecto. latet project check y el panel dicen cuál, y dónde ponerlo en su lugar: en tus ajustes para el proyecto, donde un cambio que reduce la protección espera tu aprobación. El panel no escribe una entrada así en el archivo; la que el archivo ya contiene se queda, para quien no deja pasar su tipo.

Lo que un archivo del repositorio no puede definir se ignora: los valores y los patrones que no se enmascaran nunca, las reglas de secretos desactivadas, las herramientas que cubre el modo de datos estricto (data_tools), Latet desactivado, el Revisor en directo, las indicaciones para el revisor local, si este ve las imágenes, y los ajustes de todo Latet (port, history, identity…). latet project check y latet project show enumeran lo que se ignora y por qué. Un repositorio que clonas no puede reducir tu protección.

Lo que conviene saber del archivo:

  • Puede contener hasta 500 términos y 100 reconocedores, en 256 KB como máximo.
  • Un archivo de más de 20.000 elementos YAML (claves, valores y las listas y los mapas que los rodean; unas cuatro veces lo que contiene un archivo completo de 500 términos y 100 reconocedores) no es válido: nada de lo que contiene se aplica, y latet project check lo dice.
  • Un archivo que no se puede leer no tiene efecto, y Latet sigue funcionando.
  • Latet vuelve a leer el archivo cuando cambia: no hay nada que recargar.
  • Los términos del archivo los puede leer cualquiera que lea el repositorio. Pon mejor los nombres de tus clientes en tus propios ajustes.

latet project check devuelve 1 cuando algo del archivo se ignora o un ejemplo falla, y 2 cuando no hay archivo o no se puede leer, así que un trabajo de CI puede mantener el archivo en orden. Su JSON Schema (también latet config schema --project) permite a los editores completarlo y comprobarlo.

En config.yaml:

projects:
- path: C:\Users\you\dev\acme
terms:
- {value: Acme Logistica, type: CLIENT}
allow_values: [acme-dev]

Latet guarda la carpeta en forma canónica: en Windows con barras invertidas y letra de unidad en mayúscula, y sin separador final (C:/work/shop/ se guarda como C:\work\shop). El id del proyecto no cambia.

Se aplican después del archivo del proyecto, y también pueden relajarlo, en una sesión cuyo proyecto Latet considera de confianza:

  • valores y patrones que no se enmascaran nunca;
  • reglas de secretos desactivadas;
  • un perfil o una política más débiles que los globales;
  • campos que se dejan en claro en el modo de datos estricto, el modo de datos estricto desactivado (data: normal), imágenes enviadas, la protección contra volcados más alta o desactivada.

El texto de las imágenes sin leer en el proyecto (ocr: off) detiene allí cada petición con una imagen.

Solo tus propios ajustes activan o desactivan el Revisor en directo en un proyecto (live_review), y dan ahí indicaciones al revisor local (review_guidance, consulta Tus indicaciones).

Una entrada se aplica a su carpeta y a todo lo que contiene; cuando coinciden dos entradas, gana la carpeta más cercana. latet rules add FILE --project FOLDER le añade reconocedores.

En la página Reglas del proyecto en el panel, cada lista (términos, reconocedores, valores que no enmascarar nunca, políticas) es una tabla de todas las reglas que se aplican en el proyecto, y cada fila dice de dónde viene: tuyas, para el proyecto, latet.yaml, o global. Una regla se cambia donde nace: las tuyas en las tablas del proyecto, las globales en las reglas globales (el recuadro de una fila global es de solo lectura, con un enlace a ellas). Añadir escribe en tus propios ajustes para el proyecto.

Solo secretos, o Latet desactivado, en un proyecto

Sección titulada «Solo secretos, o Latet desactivado, en un proyecto»

En la página Reglas del proyecto, en el panel, dentro de la pestaña Protección, Protección puede estar en Activada, Solo secretos o Desactivada. Solo secretos enmascara ahí los secretos y tus términos, y deja pasar los datos personales y tu identidad: el perfil secrets, en tus propios ajustes para el proyecto.

latet project off desactiva Latet en el proyecto de la carpeta actual (o de la carpeta indicada). Lo mismo hace Protección: Desactivada. Latet no envía entonces ninguna petición del proyecto:

  • cada una se rechaza, por HTTP y por un WebSocket, sea el proyecto de confianza o declarado, con palabras que dicen cómo activar Latet ahí o llegar directamente al proveedor (Pasar a la 0.11);
  • latet project off y el interruptor del panel lo dicen antes de desactivarlo;
  • el panel marca esos intercambios como Latet desactivado.

Para dejar pasar los datos personales en un proyecto, elige Solo secretos: sus peticiones siguen saliendo, con los secretos enmascarados.

latet project on lo vuelve a activar. Solo tus propios ajustes pueden desactivarlo, nunca un archivo del proyecto. Si lo desactiva un agente, o lo haces a mano en config.yaml, primero espera tu aprobación en el panel (consulta Los agentes y tus ajustes).

Latet recuerda las carpetas de los últimos 2.000 repositorios con un latet.yaml propio que ha visto, en repositories.json en su carpeta de datos. Así, un cambio en config.yaml que reduciría la protección solo donde el archivo de un proyecto es más estricto espera tu aprobación, incluso en un repositorio al que ninguna conversación ha llegado desde que arrancó el daemon. Sus archivos se vuelven a leer:

  • en una recarga (latet reload, o un comando que cambia tus ajustes) cuyo cambio podría reducir la protección en un repositorio;
  • en un arranque que encuentra config.yaml cambiado de ese modo respecto a los ajustes que aprobaste por última vez;
  • en una importación en el panel.

Un cambio de lo que en un proyecto no protege nada (el puerto, el historial y cuánto tiempo se guarda), o uno que solo añade protección (un término), no lee ninguno. Los lee un proceso auxiliar, con 10 segundos para todos y 2 para cada uno. Un repositorio que no se puede leer ahora (en una carpeta compartida que no responde, o un archivo que no puedes leer) nunca se toma por uno sin nada dentro: un cambio que podría reducir su protección ni se aplica ni espera tu aprobación, y la recarga lo dice.

Para encontrar un repositorio así, y sacarlo de la lista:

Ventana de terminal
latet repositories # each repository remembered, with its state
latet repositories forget C:\dev\old-app # takes one out of the list

latet repositories muestra cada uno como read (leído), nothing to weigh (nada que pesar: no está ahora, no es un archivo normal, no es válido) o unavailable (no disponible: no se puede leer ahora, no se leyó a tiempo), nunca lo que contiene su archivo. latet repositories forget reduce la protección, así que se niega a ejecutarse en un agente y te pide confirmación antes de olvidar uno: ejecútalo tú, en un terminal tuyo. El repositorio se vuelve a recordar, y a pesar, en cuanto una conversación llega a él.

Cuando no se puede leer el propio repositories.json (en su lugar hay una carpeta, un enlace o un archivo más grande de lo que puede ser la lista), un cambio que podría reducir la protección en un repositorio ni se aplica ni espera tu aprobación, y latet repositories lo dice. Si sigue así, mueve repositories.json a otro sitio, en un terminal tuyo: Latet vuelve entonces a recordar los repositorios a medida que las conversaciones llegan a ellos.

Comando Qué hace
latet project init [FOLDER] [--suggest] Escribe un latet.yaml del que partir; --suggest añade borradores de reconocedores para los formatos que ahí no cubre ninguna regla
latet project show [FOLDER] [--json] Lo que se aplica en un proyecto, y lo que se ignora
latet project check [FOLDER] Comprueba el archivo del proyecto, incluidos los reconocedores
latet project off / on [FOLDER] Desactiva Latet en un proyecto, donde sus peticiones se rechazan entonces, o lo vuelve a activar
latet repositories Los repositorios que Latet recuerda, cada uno con su estado
latet repositories forget FOLDER Saca uno de la lista (te corresponde solo a ti: rechaza un agente)
latet rules add FILE --repo FOLDER Añade reconocedores al archivo del proyecto en lugar de a config.yaml (--project: a tus ajustes para el proyecto)
latet config schema --project Muestra el JSON Schema del archivo del proyecto
  • La caja fuerte es la misma para todos los proyectos. Un valor enmascarado una vez, en cualquier proyecto, se enmascara a partir de entonces dondequiera que aparezca.
  • Algunos ajustes siguen siendo globales: el puerto, el historial, tu identidad y el revisor del modo automático de Claude Code.
  • latet rules add --repo reescribe latet.yaml: solo se conservan sus primeras líneas de comentarios.
  • En Docker:
    • tus propios ajustes funcionan, según la ruta de la carpeta;
    • el archivo del proyecto solo se lee cuando la carpeta del proyecto está montada en el contenedor en la misma ruta.