SSD Nodes Learn Hosting plans →
Guías Matt ConnorPor Matt Connor

Como funciona el cifrado local en Compartment

Analizamos la seguridad de Compartment para memoria de agentes offline. Entiende el modelo de amenazas, el cifrado en reposo y qué ocurre si pierdes tu clave de acceso.

Qué hace Compartment de otra manera

Compartment es un almacén de memoria para agentes que mantiene cada registro cifrado en la máquina que lo creó y nunca se comunica con un servicio de red. Dos decisiones lo diferencian del resto del ámbito de la memoria para agentes. El almacén es un único archivo sellado que sólo abre la frase de paso, y el proceso de generación de embeddings se ejecuta localmente, por lo que el texto de una memoria nunca se envía a otro lugar para convertirlo en un vector. La versión 4.6.0 se publicó el 10 de agosto de 2026, la licencia es Apache-2.0 y se instala desde PyPI. Después se han publicado versiones más recientes y, a fecha de 12 de octubre de 2026, la última disponible en PyPI es la 4.11.0, del 30 de septiembre de 2026. Esta guía se mantiene fijada en la 4.6.0.

Eso es una afirmación sobre el modelo de amenazas, por lo que esta guía la trata como tal. El cifrado en reposo y el diseño sin conexión protegen una lista concreta de elementos. Dejan otros expuestos, y ahí aparecen los problemas del segundo día.

Esta guía sigue la documentación del propio proyecto para la versión 4.6.0, revisada por última vez el 12 de octubre de 2026. Compartment incluye una aplicación de escritorio, un elemento de la barra de menús en macOS y un icono del área de notificaciones en Windows, además de su herramienta de línea de comandos, y un aviso de frase de paso no se puede controlar desde un contenedor automatizado. Considere lo siguiente como comportamiento documentado, no como comportamiento medido aquí. Ejecútelo en una máquina de prueba antes de confiarle datos reales.

Qué protege realmente el cifrado en reposo

El almacén está sellado con XChaCha20-Poly1305, un cifrado AEAD (cifrado autenticado con datos asociados), y las ranuras de claves que contienen la clave maestra están protegidas con Argon2id, una función de hash de contraseñas diseñada para ser lenta y requerir mucha memoria. De esto se derivan dos consecuencias. Una copia del archivo en un disco robado, en una copia de seguridad antigua o adjunta a un ticket de soporte son solo bytes y nada más. Además, un solo bit alterado provoca un fallo de autenticación al abrir el archivo, por lo que la corrupción se convierte en un error evidente en lugar de un resultado incorrecto.

Los vectores de incrustación (embedding vectors) también están cifrados, lo cual es más importante de lo que parece. Una incrustación no es un hash. Las investigaciones sobre la inversión de incrustaciones han logrado recuperar fragmentos legibles del texto original a partir de su vector. Por tanto, un índice de vectores en texto plano junto a una base de datos cifrada equivale casi a dejar la base de datos abierta. Compartment no escribe ningún índice en texto plano en el disco.

El borrado es un borrado real. Cada registro lleva su propia clave y compartment forget --shred destruye esa clave, por lo que el texto cifrado resultante no puede ser descifrado por nadie, ni siquiera por usted. Compare esto con una fila eliminada de un archivo de base de datos, que normalmente permanece legible en las páginas libres hasta que algo la sobrescribe.

El funcionamiento sin conexión (offline) es la otra mitad de la ecuación. No se sube nada, por lo que no existe una cuenta de proveedor que almacene sus recuerdos ni una API key que pueda filtrarlos.

Lo que Compartment no protege

La protección termina en el límite del almacén, y ese límite está más cerca de lo que parece.

El agente lee texto plano. Recall descifra una memoria y entrega el texto al agente. Si ese agente es un modelo alojado, la memoria viaja al proveedor del modelo dentro del siguiente prompt, exactamente igual que todo lo demás en la ventana de contexto. El cifrado en reposo protege el archivo. No protege la recuperación. Por lo tanto, las reglas en mantener secretos fuera de los agentes de IA no se relajan porque el almacén esté cifrado: una contraseña guardada como memoria es una contraseña que usted ha configurado para pegarse automáticamente en un prompt.

Un almacén desbloqueado en una máquina en ejecución está abierto. Las notas de seguridad del proyecto lo indican claramente. Mientras el almacén está desbloqueado, la clave maestra y el conjunto de trabajo residen en la RAM, Python no puede garantizar que un búfer sea borrado, y el swap o una imagen de hibernación pueden escribir esa memoria en el disco. El malware que se ejecuta como su usuario nunca tiene que romper el cifrado, porque puede solicitar información al almacén ya desbloqueado.

La identidad del llamador es declarativa. Los espacios de nombres pueden restringirse por llamador, pero el nombre del llamador proviene del proceso anfitrión, por lo que un anfitrión que miente sobre su nombre recibe los permisos que reclama. Los permisos de espacio de nombres son una organización, no un límite de seguridad contra un programa local hostil.

La destrucción de datos no alcanza a las copias. forget --shred destruye la clave dentro del archivo actual. Una copia de seguridad realizada antes de la destrucción aún contiene ese registro, y aún se abre con la frase de contraseña de ese día.

Una frase de contraseña débil termina la discusión. Argon2id hace que cada intento de adivinanza sea costoso. No protege una frase de contraseña que aparece en una lista de palabras.

Instalar Compartment desde una versión fijada

Compartment necesita Python 3.11 o una versión posterior. El proyecto avanza rápido: hubo 23 versiones en PyPI entre el 26 de julio y el 10 de agosto de 2026, y 35 hasta el 12 de octubre de 2026. Por eso, fije la versión en lugar de instalar la que esté disponible el día de la instalación.

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

compartment --version debe mostrar la versión fijada. Si el shell responde compartment: command not found, el directorio de instalación no está en su PATH y, en la mayoría de los sistemas, ese directorio es ~/.local/bin. pipx install compartment==4.6.0 y uv tool install compartment==4.6.0 evitan ese problema gestionando sus propias rutas.

compartment init solicita la frase de paso dos veces y no muestra ningún carácter al escribirla. Esa frase de paso es la única clave. El proyecto no genera ninguna contraseña ni frase de recuperación, de forma intencionada: el software no conserva ninguna credencial que usted no tenga.

Compruebe el resultado antes de conectarlo a cualquier elemento.

compartment status

Un almacén correcto informa de que está desbloqueado. Si informa de que está bloqueado, ejecute compartment unlock e introduzca la frase de paso. Un reinicio vuelve a bloquearlo, porque la credencial que lo mantiene abierto depende de un secreto específico de cada arranque. En macOS, compartment unlock --keychain permite conservarlo desbloqueado tras un reinicio mediante el almacenamiento de esa credencial en el llavero del sistema.

Dónde se almacena realmente la información

El almacén predeterminado es ~/.compartment/memory.vault. Apunte a otra ubicación con --vault PATH en cualquier comando, o mediante la variable de entorno COMPARTMENT_VAULT.

Ese único archivo constituye todo el almacenamiento. Se abre con una cabecera que contiene la versión del formato y los slots de claves Argon2id, seguidos de la carga útil cifrada y, finalmente, las entradas del diario que se añaden a medida que llegan nuevos recuerdos. Cada entrada del diario está delimitada por su longitud y un CRC (verificación de redundancia cíclica) de dicha longitud, de modo que una escritura interrumpida por un fallo se reconoce como una entrada truncada en lugar de leerse como datos. La compactación serializa el almacén, escribe un archivo temporal, ejecuta un fsync y luego lo renombra en su ubicación final; esto garantiza que un lector nunca vea un almacén escrito a medias.

La consecuencia útil: un script de copia de seguridad solo necesita copiar una ruta. La consecuencia incómoda: no puede usar grep sobre él ni repararlo en un editor de texto. Si desea recuerdos que pueda leer con cat y enviar a git, los archivos de memoria local en texto plano de Memmy representan el compromiso opuesto. Ambos son razonables, dependiendo de si su mayor temor es el robo de un portátil o una herramienta que se corrompe.

compartment uninstall elimina el software pero conserva el almacén. Utilice --purge solo cuando esté seguro de querer hacerlo.

Integración en un agente

Un solo comando integra un cliente compatible.

compartment integrate --list
compartment integrate claude

Para Claude Code, que escribe una entrada de servidor MCP (model context protocol) y un hook de PostToolUse en ~/.claude/settings.json, realizando primero una copia de seguridad del archivo, instala una skill de /compartmentalize bajo ~/.claude/skills/ y añade un bloque gestionado a ~/.claude/CLAUDE.md indicando al agente que Compartment reemplaza la memoria basada en archivos que utilizaba. Confirme ambas partes:

compartment hook status
compartment recent

Para registrar el servidor manualmente:

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

Cualquier otro host compatible con MCP acepta el mismo servidor con su propio nombre de invocador.

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

Asigne a cada host un valor de --caller distinto. Es la etiqueta que registra el log de auditoría y la clave bajo la cual se otorgan los permisos de namespace, por lo que un nombre compartido inutiliza ambos.

Si Claude Code ya ha estado escribiendo hechos en sus propios archivos de memoria, compartment import-claude --dry-run muestra qué se movería antes de realizar cualquier cambio. Lea qué guarda Claude Code en sus archivos de memoria primero, ya que importar un año de notas a un vault nuevo es la forma en que un almacén de memoria se llena de elementos que nadie pretendía conservar.

¿Qué tan rápido es un vault local?

Estas son las cifras que el proyecto publica para un vault de tamaño personal. Provienen de su documentación, no de una ejecución realizada aquí.

GráficoCompartment published local latency, milliseconds
Los datos de este gráfico
[
  {
    "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
  }
]

El almacenamiento de una memoria se estima en 40 ms, y una búsqueda vectorial en veinte mil registros en 0.68 ms para el percentil 95. El argumento del proyecto para mantener la memoria local es aritmético: un solo viaje de ida y vuelta a través de la red hacia una API de memoria alojada a menudo cuesta más que la mediana de 11.6 ms de una búsqueda híbrida completa aquí.

Dos detalles de diseño explican las cifras de búsqueda. Por debajo de veinte mil registros, Compartment compara la consulta contra cada vector, por lo que la recuperación es exacta por construcción en lugar de aproximada. Por encima de esa cifra, cambia a HNSW (hierarchical navigable small world), un índice aproximado que sacrifica un poco de precisión por velocidad. El vault también registra el hash SHA-256 del modelo de embedding y se niega a abrirse bajo uno diferente, ya que los vectores de dos modelos distintos pueden compararse sin que aparezca ningún error, y las puntuaciones resultantes no tienen significado alguno.

Copias de seguridad y la copia que podrá abrir el próximo año

Una caja fuerte bloqueada es un único archivo portátil, por lo que moverla es simplemente copiarla.

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

Bloquéela primero. Copiar mientras el agente está escribiendo puede capturar una entrada del diario a mitad de su escritura y, aunque el marco CRC permite al lector omitir ese fragmento final, la memoria contenida en él se pierde. compartment lock --sign sella el archivo con un manifiesto Ed25519, de modo que la máquina receptora puede verificar que la copia llegó intacta sin necesidad de poseer la contraseña.

Debido a que el archivo ya está sellado, el almacenamiento en la nube convencional es un lugar aceptable para guardarlo. Ese es el punto donde el cifrado en reposo le compensa directamente: el destino de la copia de seguridad nunca ve una memoria.

Dos advertencias. El borrado seguro (shredding) no llega a las copias de seguridad, por lo que un registro que usted destruyó criptográficamente hoy sigue siendo legible en la copia de la semana pasada para cualquiera que tenga la contraseña de esa semana. Además, compartment export --plaintext escribe toda la caja fuerte sin cifrar, lo cual es la herramienta correcta para migrar a otro sistema, pero es el archivo incorrecto para dejar en ~/Downloads.

Mantenga pocas copias y asígneles una fecha. Un almacén de memoria se convierte en un riesgo una vez que nadie lo depura, que es el argumento en por qué las memorias obsoletas del agente corrompen silenciosamente la recuperación.

Gestión, rotación y segundo factor de claves

compartment rekey
compartment 2fa enable
compartment 2fa status

rekey cambia la frase de contraseña volviendo a cifrar la clave maestra en el keyslot del archivo actual. Las copias antiguas conservan la contraseña anterior, ya que esos bytes se sellaron antes del cambio y no es posible editarlos retrospectivamente. Rote también las copias o acepte que una contraseña retirada sigue abriendo el archivo.

2fa enable añade un archivo de clave como segundo factor, combinado con la frase de contraseña durante la derivación de la clave, por lo que ambos son necesarios para abrir el almacén. Esto también duplica la cantidad de elementos que puede perder. Mantenga el archivo de clave fuera de la máquina que contiene el almacén.

Para scripts y CI (integración continua), la frase de contraseña puede recibirse a través de la variable de entorno COMPARTMENT_PASSPHRASE, y unlock --passphrase-stdin la lee desde una tubería (pipe). Prefiera la tubería. Una variable de entorno puede ser leída por otros procesos propiedad del mismo usuario y suele terminar en los registros de los trabajos.

El historial de auditoría está encadenado mediante hashes, y compartment audit verify lo recorre e informa del primer enlace roto. Ejecútelo después de cualquier restauración, ya que es el momento en que un archivo truncado silenciosamente se hace evidente.

Qué sucede cuando se pierde la frase de contraseña

No sucede nada, y ese es el diseño. No existe restablecimiento, ni frase de recuperación, ni dirección a la cual escribir, porque no hay ninguna copia de la clave fuera de su memoria y su archivo de clave opcional. El vault sigue siendo un archivo de bytes que parecen aleatorios.

Por lo tanto, el plan de recuperación no es un plan para el vault. Es un plan para la frase de contraseña. Regístrela en un gestor de contraseñas el día que ejecute compartment init. Luego pruébela: bloquee el vault, desbloquéelo usando solo lo que anotó y deje que un agente comience a llenarlo después de que eso funcione.

Compartment o un servidor de memoria

Compartment está diseñado para una sola máquina. Compartir datos entre máquinas implica copiar el archivo bloqueado, o exportarlos e importarlos. Varios agentes de la misma máquina pueden usar un almacén simultáneamente, porque un bloqueo de archivo consultivo serializa sus escrituras. La documentación no describe ningún mecanismo para que dos máquinas escriban en un mismo archivo. Por tanto, no conecte un portátil y una estación de trabajo al mismo almacén mediante un recurso compartido de red o una carpeta sincronizada.

Cuando varias máquinas necesitan la misma memoria al mismo tiempo, se trata de un problema de servidor. Un servidor de memoria Mem0 autohospedado en un VPS lo resuelve: un endpoint, muchos clientes y una memoria que sobrevive al portátil. El coste debe expresarse claramente. Ese servidor ejecuta un proceso que puede leer los datos que almacena, por lo que el modelo de amenazas incluye ahora el VPS y a cualquiera que pueda acceder a su API.

Elija según la pérdida que realmente le preocupe. Si teme el robo de un portátil o que un proveedor lea sus notas, el almacén local cifrado es la opción más sólida. Si le preocupa que un agente olvide todo al cambiar de máquina, el servidor lo resuelve.

FAQ

¿Qué protege realmente el cifrado de Compartment?

Protege el archivo. El almacén está sellado con XChaCha20-Poly1305, sus ranuras de claves están protegidas con Argon2id y los vectores de embeddings también están cifrados. Por tanto, un disco robado o una copia de seguridad antigua sólo contienen bytes que no se pueden leer. No protege un almacén desbloqueado en una máquina en ejecución, porque la clave maestra permanece en la RAM mientras el almacén está abierto. Tampoco controla lo que hace un agente con una memoria después de recuperarla como texto sin formato.

Si Compartment funciona sin conexión, ¿mis memorias son privadas frente al proveedor de mi modelo?

Sólo hasta que se recuperan. El almacenamiento y las búsquedas se realizan sin red, y el modelo de embeddings se ejecuta localmente, por lo que nada sale de la máquina durante la escritura. Al leer, el agente recibe texto sin formato. Si ese agente usa un modelo alojado, la memoria entra en el prompt y viaja al proveedor como el resto de la ventana de contexto. Nunca almacene una credencial como memoria.

¿Qué ocurre si pierdo la frase de paso de Compartment?

El almacén no se puede recuperar, de forma intencionada. Compartment no genera ninguna semilla ni frase de recuperación y no conserva ninguna credencial que usted no tenga, por lo que no hay nada que restablecer. Guarde la frase de paso en un gestor de contraseñas, mantenga cualquier archivo de claves 2FA fuera de la máquina que almacena el almacén y confirme que puede desbloquear una copia antes de guardar en el almacén algo que echaría de menos.

¿Pueden dos máquinas compartir un almacén de Compartment?

No al mismo tiempo. Un almacén bloqueado es un único archivo portátil. El procedimiento documentado consiste en bloquearlo, copiarlo y desbloquearlo en la otra máquina con --vault. La documentación sólo cubre el bloqueo de archivo consultivo que serializa las escrituras entre agentes de una misma máquina. No cubre que dos máquinas escriban en un mismo archivo. Por tanto, considere esa configuración una forma de perder memorias. Use un servidor de memoria cuando necesite esa capacidad.

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