Aller au contenu

Projets

Latet a une seule configuration pour tout, config.yaml. Un projet peut la compléter de deux façons :

Où Partagé Ce qu’il peut faire
Le fichier du projet, latet.yaml dans le dépôt du projet avec tous ceux qui y travaillent seulement ajouter de la protection
Vos réglages pour le projet dans votre config.yaml, sous projects: non tout, y compris y désactiver Latet

Le premier sert à ce dont toute l’équipe a besoin : les formats des codes propres au projet, les pays de ses clients, un profil plus strict. Le second sert à ce qui vous appartient : les noms de vos clients, les valeurs qui ne sont pas sensibles pour vous, un projet où vous ne voulez pas du tout de Latet.

Sur une machine connectée à un serveur Latet, le fichier du projet ne s’applique pas : le serveur ne lit aucun fichier de la machine, et applique vos propres réglages et ceux qu’il partage. Dans un tel projet, latet doctor et latet claude le disent. Pour y utiliser ses règles, importez le latet.yaml dans votre tableau de bord, dans Règles avec Importer des règles. Voir Ce qui reste sur la machine.

Les règles d'un projet dans le tableau de bord, dans les onglets des règles globales : sa Vue d'ensemble, avec ce qui y est en vigueur et vos propres réglages pour ce projet dans leur ensemble Les règles d'un projet dans le tableau de bord, dans les onglets des règles globales : sa Vue d'ensemble, avec ce qui y est en vigueur et vos propres réglages pour ce projet dans leur ensemble
Les règles d'un projet : Règles, avec le projet choisi en haut.

Tout dépend du dossier dans lequel travaille l’agent.

  • Claude Code : le plugin l’indique à Latet.
  • Un agent que Latet lance (latet claude, latet codex, latet opencode, latet gemini, latet copilot) : sa clé de lancement l’indique, là où l’agent en porte une.
  • Codex, OpenCode et Gemini CLI : ils nomment le dossier dans leurs requêtes.
  • Tout autre client : il peut envoyer l’en-tête x-latet-project: <folder>.

Une session dont le dossier est inconnu utilise vos réglages globaux.

Le projet d’un dossier est le dossier du latet.yaml le plus proche, en remontant du dossier jusqu’à la racine de son dépôt git. S’il n’y en a pas, c’est le dépôt ; hors d’un dépôt, le dossier lui-même. Seul le fichier le plus proche s’applique : un sous-dossier qui a son propre fichier est un projet à part entière, et les deux ne sont pas combinés.

Latet ne considère le projet d’une session comme de confiance que lorsqu’il le connaît par lui-même :

  • Par le plugin de Claude Code, pour un dossier que Latet connaît comme projet (un dossier avec un latet.yaml, ou avec vos propres réglages pour lui). Le plugin lie la session à ce projet ; chacun de ses appels à Latet maintient le lien, qui prend fin après 30 minutes sans appel.
  • Par une clé de lancement, pour un agent que Latet a lancé dans ce dossier.

Un dossier que seule la requête nomme (l’en-tête x-latet-project, ou le dossier de travail que Codex, OpenCode et Gemini CLI écrivent dans leurs requêtes) est déclaré. Les règles d’un projet déclaré qui ajoutent de la protection s’appliquent : ses termes, ses reconnaisseurs, un profil plus strict. Ses assouplissements non : valeurs et motifs à ne jamais masquer, règles de secrets désactivées, un profil ou une politique plus faible, data_tools, les consignes et les images du relecteur local. Un projet déclaré où Latet est désactivé est refusé quand même, et une exception de requête pour un projet ne s’applique que là où son projet est de confiance. Le tableau de bord montre pour chaque requête si son projet était de confiance ou déclaré (Projet déclaré), et comment son lancement a été jugé.

  • Avant que le plugin lie une session. Claude Code fait quelques appels au démarrage, avant le premier appel du plugin à Latet : sa liste de modèles, et sur Bedrock ses premières requêtes. Ils sont jugés avec vos seules règles, ni les règles ajoutées par le projet ni ses assouplissements.
  • Ce que le lien laisse entrer. Un lien porte sur l’identifiant d’une session : une requête Anthropic Messages qui porte l’identifiant d’une de vos sessions actives liée par le plugin est jugée avec ce projet, assouplissements et exceptions compris, quel que soit votre programme qui l’envoie. Elle est quand même lue par la vérification finale et jamais réécrite, et les requêtes d’une autre personne ne l’atteignent jamais. Une session lancée par latet claude demande au contraire sa clé de lancement : son identifiant seul n’obtient aucun assouplissement du projet.

Quand Latet lance un agent, il ouvre un lancement pour le dossier : une clé secrète tirée pour ce seul lancement, liée au projet du dossier et à vous. L’agent l’envoie avec ses requêtes dans un en-tête, x-latet-launch-key, que Latet vérifie et retire avant que quoi que ce soit soit transmis, enregistré ou journalisé ; Latet n’en garde qu’un hachage à clé. La clé prend fin avec le lancement : quand l’agent se termine, ou quand la commande qui l’a lancé est arrêtée.

Commande Comment la clé voyage
latet claude ANTHROPIC_CUSTOM_HEADERS, dans le fichier de réglages privé de cette session
latet codex env_http_headers d’un fournisseur de model_providers, à partir de Codex 0.115 ; aucune sur les fournisseurs intégrés de Codex (connecté avec ChatGPT, ou le fournisseur d’OpenAI)
latet opencode options.headers de chaque fournisseur qu’il redirige
latet gemini GEMINI_CLI_CUSTOM_HEADERS
latet copilot COPILOT_PROVIDER_HEADERS, vers un fournisseur compatible OpenAI par Chat Completions ; aucune par Responses, l’API d’Anthropic ou un WebSocket
latet run aucune : un programme qu’il lance n’a aucun moyen d’en porter une

La clé s’ajoute aux en-têtes que l’agent envoie déjà : les vôtres restent tels que vous les avez écrits, et demandent quand même une exception à eux. Un agent qui démarre sans clé en apprend la raison en une phrase, comme 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., et son projet est déclaré. Un dossier qui n’est pas l’un de vos projets ne demande pas de clé.

  • Un secret pour Latet. Dans la sortie d’un outil ou dans un message, une clé valide est masquée comme le jeton de Latet ; là où Latet ne peut pas la masquer (une requête qu’il ne fait que vérifier), la requête est refusée, avec des mots qui disent de revenir en arrière ou de commencer une nouvelle conversation.
  • Détenue, pas liée à un processus. Tout programme qui détient la clé compte comme ce lancement. Il tourne sous le même utilisateur, et Latet ne prétend pas distinguer les programmes.
  • Inconnue, terminée ou celle d’un autre. Une requête avec une clé que Latet ne connaît pas (son daemon a redémarré, par exemple) est jugée déclarée, jamais refusée pour cela. Une clé dont le lancement a pris fin, ou envoyée pour un autre projet ou par une autre personne, est refusée.
  • Dans l’adresse. Sur un ordinateur, Latet accepte aussi la clé au début du chemin de l’adresse, une forme qu’aucune commande de lancement n’utilise ; un serveur Latet la refuse.

Le tableau de bord montre comment le lancement de chaque requête a été jugé : Lancé par Latet, clé vérifiée, Lancé par Latet, clé manquante (un agent lancé par Latet dont la requête est arrivée sans une clé que Latet peut vérifier : jugé déclaré), Lié par le plugin Claude Code (un Claude Code configuré durablement) ou Non lancé par Latet (déclaré). latet doctor nomme chaque agent lancé par Latet vu sans sa clé, avec sa version.

latet project init en écrit un pour démarrer, à la racine du dépôt. La page Règles du tableau de bord l’écrit aussi : choisissez le projet dans le sélecteur en haut. Ses termes, reconnaisseurs et politiques sont des lignes des tableaux Termes, Reconnaisseurs et Politiques, marquées latet.yaml, et se modifient dans leur panneau ; un nouveau va dans le fichier quand le Enregistrer dans de son panneau dit latet.yaml. L’onglet Fichier du dépôt contient le reste du fichier, et le crée.

# 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}

Une valeur ne remplace la vôtre que si elle est plus stricte :

  • profile : secrets, puis balanced, puis max (qui y active le mode données strict, sauf si data est défini) ;
  • policies : allow, puis mask, puis redact, par rapport à la politique en vigueur (celle d’un reconnaisseur comprise) ;
  • include_private_ips : seulement true ;
  • ner : seulement auto ;
  • data : seulement strict ; images : seulement moins d’images, mask puis block ; ocr : seulement auto ; dump_guard : seulement plus bas (voir Données de production) ;
  • llm_review : off, puis background, puis inline, quand le relecteur est activé (voir Relecteur local).

Une liste s’ajoute à la vôtre : pii, id_regions, phone_regions, terms, recognizers, data_files, data_hosts et fields (seulement les règles qui masquent). Un reconnaisseur de vos réglages pour le projet dont le nom ou le type est déjà utilisé par un des vôtres globaux est désactivé. Un reconnaisseur du fichier portant le nom ou le type d’un des vôtres, global ou pour le projet, s’applique tout de même, sous un nom ou un type qui lui est propre (badge-repo, BADGE_REPO) : les deux s’appliquent ; à type égal, les deux types prennent la plus stricte des deux politiques ; et la page du projet l’indique, avec le nom et le type utilisés. Pour un champ, la plus stricte de votre règle et de celle du fichier s’applique, la vôtre à égalité.

Ce qui y laisserait des valeurs en clair est mis de côté : un reconnaisseur qui laisse passer ce qu’il trouve (policy: allow), et un reconnaisseur, un terme ou une règle de champ d’un type laissé en clair dans ce dossier, par vos politiques ou vos réglages pour le projet. latet project check et le tableau de bord disent lequel, et où le mettre à la place : dans vos réglages pour le projet, où une modification qui réduit la protection attend votre approbation. Le tableau de bord n’écrit pas une telle entrée dans le fichier ; celle que le fichier contient déjà reste, pour qui ne laisse pas passer son type.

Ce qu’un fichier de dépôt ne peut pas régler est ignoré : les valeurs et les motifs à ne jamais masquer, les règles de secrets désactivées, les outils que couvre le mode données strict (data_tools), Latet désactivé, le Relecteur en direct, les consignes pour le relecteur local, le fait qu’il voie les images, et les réglages de l’ensemble de Latet (port, history, identity…). latet project check et latet project show listent ce qui est ignoré et pourquoi. Un dépôt que vous clonez ne peut pas réduire votre protection.

À savoir sur ce fichier :

  • Il peut contenir jusqu’à 500 termes et 100 reconnaisseurs, en 256 Ko au plus.
  • Un fichier de plus de 20 000 éléments YAML (clés, valeurs, et les listes et tables qui les entourent ; environ quatre fois ce que contient un fichier complet de 500 termes et 100 reconnaisseurs) n’est pas valide : rien de ce qu’il contient ne s’applique, et latet project check le dit.
  • Un fichier illisible n’a aucun effet, et Latet continue de fonctionner.
  • Latet relit le fichier quand il change : il n’y a rien à recharger.
  • Les termes du fichier sont lisibles par tous ceux qui lisent le dépôt. Mettez plutôt les noms de vos clients dans vos propres réglages.

latet project check se termine avec le code 1 quand quelque chose dans le fichier est ignoré ou qu’un exemple échoue, et avec le code 2 quand il n’y a pas de fichier ou qu’il ne peut pas être lu : une tâche de CI peut ainsi garder le fichier propre. Son JSON Schema (aussi latet config schema --project) permet aux éditeurs de le compléter et de le vérifier.

Dans config.yaml :

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

Latet garde le dossier sous une forme canonique : sous Windows avec des barres obliques inverses et une lettre de lecteur en majuscule, et sans séparateur final (C:/work/shop/ est gardé comme C:\work\shop). L’identifiant du projet ne change pas.

Ils s’appliquent après le fichier du projet, et peuvent aussi l’assouplir, dans une session dont Latet considère le projet comme de confiance :

  • les valeurs et les motifs à ne jamais masquer ;
  • les règles de secrets désactivées ;
  • un profil ou une politique plus faible que le réglage global ;
  • des champs laissés en clair en mode données strict, le mode données strict désactivé (data: normal), des images envoyées, le garde-fou anti-extraction relevé ou désactivé.

Le texte des images non lu dans le projet (ocr: off) y arrête toute requête qui porte une image.

Seuls vos propres réglages activent ou désactivent le Relecteur en direct dans un projet (live_review), et y donnent des consignes au relecteur local (review_guidance, voir Vos consignes).

Une entrée s’applique à son dossier et à tout ce qu’il contient ; quand deux entrées correspondent, le dossier le plus proche l’emporte. latet rules add FILE --project FOLDER y ajoute des reconnaisseurs.

Sur la page Règles du projet dans le tableau de bord, chaque liste (termes, reconnaisseurs, valeurs à ne jamais masquer, politiques) est un tableau de toutes les règles qui s’appliquent dans le projet, et chaque ligne dit d’où elle vient : les vôtres, pour le projet, latet.yaml, ou globale. Une règle se modifie là où elle naît : les vôtres dans les tableaux du projet, les globales dans les règles globales (le panneau d’une ligne globale est en lecture seule, avec un lien vers elles). Ajouter écrit dans vos propres réglages pour le projet.

Secrets uniquement, ou Latet désactivé, dans un projet

Section intitulée « Secrets uniquement, ou Latet désactivé, dans un projet »

Sur la page Règles du projet dans le tableau de bord, dans l’onglet Protection, Protection vaut Activée, Secrets uniquement ou Désactivée. Secrets uniquement y masque les secrets et vos termes, et laisse passer les données personnelles et votre identité : c’est le profil secrets, dans vos propres réglages pour le projet.

latet project off désactive Latet dans le projet du dossier courant (ou du dossier indiqué). Protection : Désactivée fait de même. Latet n’envoie alors aucune requête du projet :

  • chacune est refusée, en HTTP et par un WebSocket, que le projet soit de confiance ou déclaré, avec des mots qui disent comment y réactiver Latet ou joindre directement le fournisseur (Passer à la 0.11) ;
  • latet project off et l’interrupteur du tableau de bord le disent avant de le désactiver ;
  • le tableau de bord marque ces échanges Latet désactivé.

Pour laisser passer les données personnelles dans un projet, choisissez Secrets uniquement : ses requêtes continuent de partir, leurs secrets masqués.

latet project on le réactive. Seuls vos propres réglages peuvent le désactiver, jamais un fichier de projet. Si c’est un agent qui le désactive, ou vous à la main dans config.yaml, le changement attend d’abord votre approbation dans le tableau de bord (voir Les agents et vos réglages).

Latet se souvient des dossiers des 2 000 derniers dépôts dotés de leur propre latet.yaml qu’il a vus, dans repositories.json dans son dossier de données. Ainsi, une modification de config.yaml qui réduirait la protection seulement là où le fichier d’un projet est plus strict attend votre approbation, même dans un dépôt qu’aucune conversation n’a atteint depuis le démarrage du daemon. Leurs fichiers sont relus :

  • à un rechargement (latet reload, ou une commande qui modifie vos réglages) dont la modification pourrait réduire la protection dans un dépôt ;
  • à un démarrage qui trouve config.yaml modifié de cette façon depuis les réglages que vous avez approuvés en dernier ;
  • à une importation dans le tableau de bord.

Une modification de ce qui ne protège rien dans un projet (le port, l’historique et sa durée de conservation), ou une qui ne fait qu’ajouter de la protection (un terme), n’en lit aucun. Un processus auxiliaire les lit, avec 10 secondes pour tous et 2 pour chacun. Un dépôt qui ne peut pas être lu pour le moment (sur un partage réseau qui ne répond pas, ou un fichier que vous n’avez pas le droit de lire) n’est jamais pris pour un dépôt vide : une modification qui pourrait en réduire la protection ne s’applique pas et n’attend pas non plus votre approbation, et le rechargement le dit.

Pour trouver un tel dépôt, et le retirer de la liste :

Fenêtre 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 présente chacun comme read (lu), nothing to weigh (rien à peser : absent pour le moment, pas un fichier ordinaire, pas valide) ou unavailable (indisponible : illisible pour le moment, pas lu à temps), jamais ce que contient son fichier. latet repositories forget réduit la protection : il refuse donc de s’exécuter dans un agent, et vous demande confirmation avant d’en oublier un. Lancez-le vous-même, dans un terminal à vous. Le dépôt est de nouveau retenu, et pesé, dès qu’une conversation l’atteint.

Quand repositories.json lui-même ne peut pas être lu (un dossier, un lien ou un fichier plus grand que la liste ne peut l’être se trouve à sa place), un changement qui pourrait baisser la protection dans un dépôt ne s’applique pas et ne vous attend pas non plus, et latet repositories le dit. Si cela dure, déplacez repositories.json ailleurs, dans un terminal à vous : Latet retient alors de nouveau les dépôts à mesure que les conversations les atteignent.

Commande Ce qu’elle fait
latet project init [FOLDER] [--suggest] Écrit un latet.yaml pour démarrer ; --suggest ajoute des brouillons de reconnaisseurs pour les formats qu’aucune règle n’y couvre
latet project show [FOLDER] [--json] Ce qui s’applique dans un projet, et ce qui est ignoré
latet project check [FOLDER] Vérifie le fichier du projet, reconnaisseurs compris
latet project off / on [FOLDER] Désactive Latet dans un projet, où ses requêtes sont alors refusées, ou le réactive
latet repositories Les dépôts dont Latet se souvient, chacun avec son état
latet repositories forget FOLDER En retire un de la liste (à vous seul : refuse un agent)
latet rules add FILE --repo FOLDER Ajoute des reconnaisseurs au fichier du projet au lieu de config.yaml (--project : à vos réglages pour le projet)
latet config schema --project Affiche le JSON Schema du fichier du projet
  • Le coffre-fort est le même pour tous les projets. Une valeur masquée une fois, dans n’importe quel projet, est ensuite masquée partout où elle apparaît.
  • Certains réglages restent globaux : le port, l’historique, votre identité et le relecteur du mode auto de Claude Code.
  • latet rules add --repo réécrit latet.yaml : seules ses premières lignes de commentaires sont conservées.
  • Dans Docker :
    • vos propres réglages fonctionnent, d’après le chemin du dossier ;
    • le fichier du projet n’est lu que si le dossier du projet est monté dans le conteneur au même chemin.