SSD Nodes Learn 🎉 VPS dès $5.50/mois
Guides Matt ConnorPar Matt Connor

Compartment : mémoire d’agent chiffrée hors ligne

Compartment chiffre la mémoire des agents sur votre machine, sans réseau. Découvrez ce que couvre ce modèle de menace et ce qui arrive si vous perdez la clé.

Ce que Compartment fait différemment

Compartment est un magasin de mémoire pour agents. Il conserve chaque enregistrement chiffré sur la machine qui l’a créé et ne communique jamais avec un service réseau. Deux choix le distinguent du reste des solutions de mémoire pour agents. Le coffre est un fichier scellé unique que seule votre phrase secrète permet d’ouvrir. L’étape de génération des embeddings s’exécute localement. Le texte d’une mémoire n’est donc jamais envoyé ailleurs pour être converti en vecteur. La version 4.6.0 a été publiée le 10 August 2026. La licence est Apache-2.0. L’installation se fait depuis PyPI.

Il s’agit d’une affirmation concernant le modèle de menace. Ce guide la traite donc comme telle. Le chiffrement au repos et la conception hors ligne protègent une liste précise d’éléments. Ils en laissent d’autres exposés. C’est dans cet écart que se trouvent les problèmes qui apparaissent après la mise en service.

Ce guide s’appuie sur la documentation et les notes de version du projet, consultées le 11 August 2026. Compartment fournit une application de bureau, un élément de barre des menus sur macOS et une icône dans la zone de notification sur Windows, en plus de son outil en ligne de commande. Une invite de phrase secrète ne peut pas être pilotée depuis un conteneur automatisé. Considérez ce qui suit comme un comportement documenté, et non comme un comportement mesuré ici. Exécutez-le sur une machine de test avant de lui confier des données réelles.

Ce que le chiffrement au repos protège réellement

Le coffre est protégé par XChaCha20-Poly1305, un chiffrement AEAD (authenticated encryption with associated data), et les keyslots qui contiennent la clé maître sont protégés par Argon2id, une fonction de hachage de mots de passe conçue pour être lente et consommer beaucoup de mémoire. Deux conséquences en découlent. Une copie du fichier présente sur un disque volé, dans une ancienne sauvegarde ou jointe à un ticket de support ne contient plus que des octets inutilisables. De plus, le basculement d’un seul bit échoue lors de l’authentification à l’ouverture du fichier. Une corruption devient donc une erreur explicite, et non une réponse erronée.

Les vecteurs d’embedding sont également chiffrés, ce qui est plus important qu’il n’y paraît. Un embedding n’est pas un hash. Des travaux sur l’inversion des embeddings ont permis de récupérer des fragments lisibles du texte original à partir du seul vecteur. Un index de vecteurs en clair placé à côté d’une base de données chiffrée revient donc presque à laisser la base ouverte. Compartment n’écrit aucun index en clair sur le disque.

La suppression est effective. Chaque enregistrement possède sa propre clé, et compartment forget --shred détruit cette clé. Le ciphertext restant ne peut donc être déchiffré par personne, y compris vous. À l’inverse, une ligne supprimée d’un fichier de base de données reste généralement lisible dans les pages libres, jusqu’à ce qu’une autre donnée les écrase.

Le fonctionnement offline constitue l’autre moitié de la protection. Rien n’est téléversé. Aucun compte fournisseur ne contient donc vos souvenirs, et aucune clé API ne peut les exposer.

Ce que Compartment ne protège pas

La protection s’arrête à la limite du vault, et cette limite est plus proche qu’il n’y paraît.

L’agent lit le texte en clair. Recall déchiffre une mémoire et transmet le texte à l’agent. Si cet agent est un modèle hébergé, la mémoire est envoyée au fournisseur du modèle dans le prompt suivant, exactement comme le reste du contexte. Le chiffrement au repos protège le fichier. Il ne protège pas la retrieval. Les règles de ne pas transmettre de secrets aux agents IA ne s’assouplissent donc pas parce que le store est chiffré : un mot de passe enregistré comme mémoire est un mot de passe que vous avez configuré pour être automatiquement collé dans un prompt.

Un vault déverrouillé sur une machine en fonctionnement est ouvert. Les notes de sécurité du projet l’indiquent clairement. Tant que le vault est déverrouillé, la clé principale et l’ensemble de travail se trouvent dans la RAM, Python ne peut pas garantir qu’un buffer est effacé, et le swap ou une image d’hibernation peut écrire cette mémoire sur le disque. Un malware exécuté avec votre compte n’a jamais besoin de casser le chiffrement, car il peut interroger le vault déjà déverrouillé.

L’identité de l’appelant est déclarative. Les namespaces peuvent être restreints par appelant, mais le nom de l’appelant provient du processus hôte. Un hôte qui ment sur son nom reçoit donc les droits qu’il déclare. Les permissions des namespaces organisent les accès, mais ne constituent pas une limite de sécurité contre un programme local hostile.

Le shredding ne peut pas atteindre les copies. forget --shred détruit la clé présente dans le fichier courant. Une sauvegarde effectuée avant le shredding contient toujours cet enregistrement et s’ouvre encore avec la passphrase utilisée ce jour-là.

Une passphrase faible met fin à la discussion. Argon2id rend chaque tentative coûteuse. Il ne protège pas une passphrase présente dans une liste de mots.

Installer Compartment depuis une version figée

Compartment nécessite Python 3.11 ou une version ultérieure. Le projet évolue rapidement : au 10 août 2026, PyPI compte déjà trente versions. Épinglez donc la version au lieu d’installer celle qui sera disponible le jour de l’installation.

python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment init

compartment --version doit afficher la version que vous avez épinglée. Si le shell répond compartment: command not found, le répertoire d’installation n’est pas présent dans votre PATH. Sur la plupart des systèmes, ce répertoire est ~/.local/bin. pipx install compartment==4.6.0 et uv tool install compartment==4.6.0 évitent ce problème en gérant eux-mêmes leurs chemins.

compartment init demande une phrase secrète deux fois et n’affiche rien pendant la saisie. Cette phrase secrète est l’unique clé. Le projet ne génère ni mot de passe ni phrase de récupération. C’est volontaire : le logiciel ne détient aucun identifiant que vous ne détenez pas vous-même.

Vérifiez le résultat avant de le connecter à quoi que ce soit.

compartment status

Un coffre-fort fonctionnel indique qu’il est déverrouillé. S’il indique qu’il est verrouillé, exécutez compartment unlock et saisissez la phrase secrète. Un redémarrage le verrouille de nouveau, car l’identifiant qui le maintient ouvert dépend d’un secret propre à chaque démarrage. Sous macOS, compartment unlock --keychain permet de conserver cet état après un redémarrage en stockant cet identifiant dans le trousseau système.

Où les données sont réellement stockées

Le vault par défaut se trouve dans ~/.compartment/memory.vault. Utilisez --vault PATH avec n’importe quelle commande pour indiquer un autre emplacement, ou définissez la variable d’environnement COMPARTMENT_VAULT.

Ce fichier constitue l’intégralité du store. Il commence par un en-tête contenant la version du format et les keyslots Argon2id, suivi du payload scellé, puis des entrées de journal ajoutées au fur et à mesure de l’arrivée de nouvelles mémoires. Chaque entrée de journal contient sa longueur et un CRC (cyclic redundancy check) de cette longueur. Ainsi, une écriture interrompue par un crash est identifiée comme une entrée tronquée et non comme des données. La compaction sérialise le vault, écrit un fichier temporaire, exécute fsync, puis le renomme pour le mettre en place. Un lecteur ne voit donc jamais un vault partiellement écrit.

Conséquence pratique : un script de sauvegarde ne copie qu’un seul chemin. En contrepartie, vous ne pouvez pas utiliser grep dessus et vous ne pouvez pas le réparer dans un éditeur de texte. Si vous voulez une mémoire lisible avec cat et versionnable dans git, les fichiers de mémoire locaux en texte brut de Memmy offrent le compromis inverse. Les deux approches sont raisonnables, selon que vous craignez surtout le vol d’un laptop ou une panne de l’outil.

compartment uninstall désinstalle le logiciel et conserve le vault. Utilisez --purge uniquement si c’est bien votre intention.

Intégration dans un agent

Une commande suffit pour configurer un client pris en charge.

compartment integrate --list
compartment integrate claude

Pour Claude Code, cette commande ajoute une entrée de serveur MCP (model context protocol) et un hook PostToolUse dans ~/.claude/settings.json, après avoir sauvegardé le fichier. Elle installe une skill /compartmentalize dans ~/.claude/skills/ et ajoute un bloc géré dans ~/.claude/CLAUDE.md pour indiquer à l’agent que Compartment remplace la mémoire basée sur les fichiers qu’il utilisait. Vérifiez les deux parties :

compartment hook status
compartment recent

Pour enregistrer le serveur manuellement :

claude mcp add --scope user compartment -- \
    compartment --vault ~/.compartment/memory.vault --caller claude-code serve

Tout autre hôte compatible avec MCP utilise le même serveur avec son propre nom d’appelant.

{ "mcpServers": { "compartment": {
    "command": "compartment",
    "args": ["--vault", "/path/to/memory.vault",
             "--caller", "your-agent-name", "serve"] } } }

Attribuez une valeur --caller différente à chaque hôte. C’est le libellé enregistré dans l’audit log et la clé utilisée pour les autorisations d’espace de noms. Un nom partagé rend ces deux mécanismes inutiles.

Si Claude Code a déjà enregistré des faits dans ses propres fichiers mémoire, compartment import-claude --dry-run affiche ce qui serait transféré avant tout déplacement. Lisez d’abord ce que Claude Code conserve dans ses fichiers mémoire, car importer un an de notes dans un vault vierge suffit à le remplir d’informations que personne ne voulait conserver.

À quelle vitesse fonctionne un vault local

Voici les chiffres publiés par le projet pour un vault de taille personnelle. Ils proviennent de sa documentation, et non d’une exécution effectuée ici.

ChartCompartment published local latency, milliseconds
The data behind this chart
[
  {
    "label": "Store one memory, end to end",
    "latency_ms": 40
  },
  {
    "label": "Embed one memory, bundled model",
    "latency_ms": 25
  },
  {
    "label": "Hybrid search, median",
    "latency_ms": 11.6
  },
  {
    "label": "Vector search at 20k records, p95",
    "latency_ms": 0.68
  }
]

L’enregistrement d’une mémoire est annoncé à 40 ms. Une recherche vectorielle sur vingt mille enregistrements atteint 0.68 ms au 95e percentile. L’argument du projet en faveur du stockage local tient au calcul suivant : un seul aller-retour réseau vers une API de mémoire hébergée coûte souvent plus que la médiane de 11.6 ms d’une recherche hybride complète effectuée ici.

Deux choix de conception expliquent ces résultats de recherche. En dessous de vingt mille enregistrements, Compartment compare la requête à chaque vecteur. Le rappel est donc exact par construction, et non approximatif. Au-delà, il utilise HNSW (hierarchical navigable small world), un index approximatif qui échange une légère perte de rappel contre un gain de vitesse. Le vault enregistre également le hash SHA-256 du modèle d’embedding et refuse de s’ouvrir avec un autre modèle. En effet, des vecteurs issus de deux modèles différents peuvent être comparés sans qu’aucune erreur ne soit signalée, alors que les scores obtenus ne veulent rien dire.

Sauvegardes et copie encore ouvrable l’année prochaine

Un coffre verrouillé tient dans un seul fichier portable. Le déplacer revient donc à le copier.

compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlock

Verrouillez-le d’abord. Une copie effectuée pendant que l’agent écrit peut capturer une entrée de journal en plein ajout. Le framing CRC permet au lecteur d’ignorer ce fragment final, mais le contenu qu’il contient est perdu. compartment lock --sign scelle le fichier avec un manifeste Ed25519. La machine de destination peut ainsi vérifier que la copie est arrivée intacte sans disposer de la phrase secrète.

Le fichier étant déjà scellé, un stockage cloud standard convient. C’est là que le chiffrement au repos est directement utile : la cible de sauvegarde ne voit jamais de mémoire.

Deux avertissements. L’effacement cryptographique n’atteint pas les sauvegardes. Un enregistrement effacé cryptographiquement aujourd’hui reste donc lisible dans la copie de la semaine dernière par toute personne qui possède la phrase secrète de la semaine dernière. Et compartment export --plaintext écrit l’intégralité du coffre sans chiffrement. C’est l’outil adapté pour migrer vers une autre solution, mais le mauvais fichier à laisser dans ~/Downloads.

Conservez peu de copies et datez-les. Un magasin de mémoire devient un risque dès que personne ne le purge. C’est l’argument présenté dans pourquoi les anciennes mémoires d’agent dégradent discrètement la recherche.

Gestion des clés, rotation et second facteur

compartment rekey
compartment 2fa enable
compartment 2fa status

rekey modifie la phrase secrète en réenveloppant la clé maître dans le keyslot du fichier actuel. Les anciennes copies conservent l’ancienne phrase secrète, car ces octets ont été scellés avant la modification et rien ne permet de les modifier rétroactivement. Faites également tourner les copies, ou acceptez qu’une phrase secrète retirée permette encore d’ouvrir un fichier.

2fa enable ajoute un keyfile comme second facteur. Il est combiné à la phrase secrète lors de la dérivation de clé. Les deux sont donc nécessaires pour ouvrir le coffre. Cela double aussi le nombre d’éléments que vous pouvez perdre. Conservez le keyfile sur une autre machine que celle qui héberge le coffre.

Pour les scripts et la CI (intégration continue), la phrase secrète peut être transmise via la variable d’environnement COMPARTMENT_PASSPHRASE, et unlock --passphrase-stdin la lit depuis un pipe. Préférez le pipe. Une variable d’environnement est lisible par les autres processus exécutés par le même utilisateur et finit souvent dans les journaux des jobs.

L’historique d’audit est constitué par chaînage de hash, et compartment audit verify le parcourt pour signaler le premier lien rompu. Exécutez-le après toute restauration, car c’est à ce moment qu’un fichier tronqué silencieusement se révèle.

Que se passe-t-il si vous perdez la passphrase

Rien ne se passe, et c’est le principe. Il n’existe ni réinitialisation, ni phrase de récupération, ni adresse à laquelle écrire, car aucune copie de la clé n’existe en dehors de votre mémoire et de votre fichier de clé facultatif. Le coffre reste un fichier composé d’octets qui semblent aléatoires.

Le plan de récupération ne concerne donc pas le coffre. Il concerne la passphrase. Enregistrez-la dans un gestionnaire de mots de passe le jour où vous exécutez compartment init. Testez-la ensuite : verrouillez le coffre, déverrouillez-le en utilisant uniquement ce que vous avez noté, puis laissez un agent commencer à le remplir une fois cette étape réussie.

Compartment ou serveur de mémoire

Compartment est conçu pour une seule machine. Le partage consiste à copier le fichier verrouillé, ou à l’exporter puis à l’importer. Il n’y a donc aucun accès concurrent en écriture. Un laptop et une workstation qui utilisent le même fichier peuvent écraser les modifications de l’autre.

Lorsque plusieurs machines doivent utiliser la même mémoire simultanément, il s’agit d’un problème de serveur. Un serveur de mémoire Mem0 auto-hébergé sur un VPS répond à ce besoin : un endpoint, plusieurs clients et une mémoire qui persiste au-delà du laptop. Il faut toutefois exposer clairement le coût. Le serveur exécute un processus qui peut lire les données qu’il stocke. Votre modèle de menace inclut donc désormais le VPS et toute personne pouvant accéder à son API.

Choisissez en fonction de la perte que vous cherchez réellement à éviter. S’il s’agit du vol d’un laptop ou de la lecture de vos notes par un fournisseur, le coffre local chiffré est la meilleure réponse. S’il s’agit d’un agent qui oublie tout dès que vous changez de machine, le serveur est la solution.

FAQ

Que protège réellement le chiffrement de Compartment ?

Il protège le fichier. Le vault est scellé avec XChaCha20-Poly1305, ses keyslots sont protégés avec Argon2id et les vecteurs d’embedding sont également chiffrés. Ainsi, un disque volé ou une ancienne sauvegarde ne contient que des octets illisibles. Le chiffrement ne protège pas un vault déverrouillé sur une machine en fonctionnement, car la master key reste en RAM tant que le vault est ouvert. Il ne contrôle pas non plus ce qu’un agent fait d’une mémoire après que la fonction de rappel la lui a renvoyée en texte brut.

Si Compartment est hors ligne, mes mémoires restent-elles privées vis-à-vis de mon fournisseur de modèle ?

Seulement jusqu’à leur rappel. Le stockage et la recherche s’effectuent sans réseau, et le modèle d’embedding s’exécute localement. Rien ne quitte donc la machine au moment de l’écriture. Lors de la lecture, l’agent reçoit le texte brut. Si cet agent utilise un modèle hébergé, la mémoire entre dans le prompt et est transmise au fournisseur comme le reste de la context window. Ne stockez jamais un credential comme mémoire.

Que se passe-t-il si je perds ma passphrase Compartment ?

Le vault est irrécupérable, volontairement. Compartment ne génère ni seed ni recovery phrase et ne conserve aucun credential que vous ne déteniez pas vous-même. Il n’y a donc rien à réinitialiser. Conservez la passphrase dans un password manager, gardez tout 2FA keyfile hors de la machine qui stocke le vault et vérifiez que vous pouvez déverrouiller une copie avant d’y stocker quoi que ce soit d’important.

Deux machines peuvent-elles partager un vault Compartment ?

Pas simultanément. Un vault verrouillé est un fichier portable unique. La procédure documentée consiste à le verrouiller, à le copier, puis à le déverrouiller sur l’autre machine avec --vault. Il n’y a aucun accès concurrent. Si deux machines écrivent dans le même fichier, des mémoires seront perdues. Utilisez un memory server lorsque vous en avez besoin.

#agent-memory#compartment#encryption#offline#privacy