Octobrain 0.7.0: La memoria de tu IA ahora duerme, olvida y se enfoca

Una memoria que solo crece no es una memoria. Es un cajón de trastos.

Cada herramienta de memoria IA hasta ahora ha sido aditiva: guarda, guarda, guarda. El montón crece, tus búsquedas se vuelven más ruidosas, y lo que de verdad necesitas queda enterrado bajo cinco notas casi duplicadas que escribiste sobre ello el martes pasado. Más recuerdos deja de significar mejor recall.

Los cerebros no funcionan así. Consolidan mientras duermes. Dejan que lo no usado se desvanezca. Se organizan alrededor de lo que intentabas hacer, no del orden en que pasaron las cosas. Esa poda no es un bug de la memoria humana — es justo la razón de que el recall se mantenga afilado.

0.6.0 iba sobre qué podía encontrar Octobrain — leer documentos completos, hacer grep sobre contenido indexado. 0.7.0 va sobre qué hace la memoria de Octobrain cuando no estás mirando. Deja de ser un registro pasivo y empieza a comportarse como un cerebro.


Sleep Consolidation — Memoria que se ordena sola

Este es el titular. Octobrain ahora corre una pasada de "sueño" que encuentra clusters de recuerdos recientes y similares, y funde cada cluster en un único insight consolidado.

Digamos que a lo largo de una semana tu agente guardó cinco notas separadas mientras perseguía el mismo bug de rate-limiting. Antes de 0.7.0, una búsqueda devolvería cinco aciertos difusos y solapados, dejando el ranking a la suerte. Tras una pasada de sueño, esos cinco colapsan en un único insight limpio y con mayor confianza — y los originales no se borran, se atenúan y se conservan como procedencia, así que el rastro de vuelta a las notas crudas sobrevive.

La parte importante: es autónoma. Sin cron job. Sin ninguna herramienta que tu agente tenga que acordarse de llamar. Se dispara sola de forma perezosa — la próxima vez que Octobrain arranque, si ha pasado un día desde la última pasada, se ejecuta y se quita del medio en silencio. Una pasada lenta o fallida nunca bloquea nada.

[memory]
sleep_consolidation_enabled        = true   # opt-out, not opt-in
sleep_consolidation_interval_hours = 24     # once a day
sleep_consolidation_threshold      = 0.85   # how similar memories must be to cluster
sleep_consolidation_min_cluster_size = 3    # need at least 3 to bother
sleep_consolidation_max_age_days   = 7      # only recent memories

Si quieres forzar una pasada — para pruebas, o justo antes de una recuperación grande — el override por CLI sigue ahí:

octobrain memory sleep-consolidate

Pero por defecto nunca lo tocas. La memoria se mantiene limpia sola.


Half-Life Decay — Olvidar, a propósito

Octobrain ahora aplica una curva del olvido. La importancia de cada recuerdo decae con el tiempo según un calendario de half-life — pero en el momento en que accedes a un recuerdo, se refuerza. Los recuerdos recordados con frecuencia se mantienen fuertes; los que nada toca se desvanecen suavemente.

Esto es la curva del olvido de Ebbinghaus, tomada directamente de cómo funciona la memoria humana. El efecto es que el ranking mejora solo. No curas nada. Los recuerdos que de verdad usas flotan hacia arriba; los que guardaste una vez y nunca necesitaste se hunden — sin que jamás se descarten.

Aquí importan dos salvaguardas:

  • Nada se pone a cero. Hay un suelo de importancia; un recuerdo de bajo acceso se desvanece hacia el fondo pero nunca desaparece. El decay es una señal de re-ranking, no un borrado.
  • El decay persiste. Los conteos de acceso y las marcas de tiempo del último acceso se almacenan y sobreviven a los reinicios. El sentido de tu memoria de "qué está caliente" no se reinicia en cada sesión.
[memory]
decay_enabled       = true
decay_half_life_days = 90   # higher = memories stay relevant longer

También puedes ajustar el decay por recuerdo — a una nota volátil se le puede decir que se desvanezca el doble de rápido, a una decisión fundacional el doble de lento — pero para casi todo el mundo el valor por defecto simplemente funciona.


Goal-Anchored Consolidation — Memoria que tiene un sentido

Esta es la idea sobre la que la investigación de memoria de agentes no para de girar: consolidar por objetivo, no por reloj. Los recuerdos no deberían resumirse solo porque pasó el tiempo — deberían colapsar alrededor de aquello que intentabas lograr.

0.7.0 lo convierte en un flujo de primera clase. Hay un nuevo tipo de memoria Goal y un ciclo de vida real para cada recuerdo — Working → Consolidated → Archived. Los recuerdos que contribuyen a un objetivo se enlazan a él con una relación achieves. Cuando el objetivo está hecho, lo cierras, y Octobrain funde cada recuerdo que contribuyó en un único insight consolidado: importancia elevada por encima de sus fuentes, las fuentes atenuadas y enlazadas por debajo como el registro de cómo llegaste ahí.

# Five scattered findings, one closed goal → one durable insight
octobrain memory consolidate goal_4f2a -s "Shipped rate limiting: token bucket, 429 + Retry-After"

Omite el resumen y Octobrain sintetiza uno a partir de los títulos de las fuentes. En cualquier caso, lo que eran cinco notas sueltas se convierte en un recuerdo que significa algo — anclado a la intención que lo produjo.

Y esta es la misma maquinaria sobre la que corre la sleep consolidation por debajo: cada cluster recibe un objetivo sintético, y el pipeline de objetivos hace el resto. Un motor de consolidación, dos formas de dispararlo — a mano cuando terminas algo, automáticamente mientras duermes.


El recall se volvió más listo — HyDE-lite, activado por defecto

Las consultas vagas son donde la búsqueda semántica suele fallar. "Eso de los reintentos" no embebe en ningún sitio cerca de la nota que realmente escribiste.

0.7.0 trae expansión de consultas HyDE-lite y la activa por defecto. El mecanismo es simple: haz una primera búsqueda, toma los mejores resultados, prómedialos en un centroide, y mezcla eso de vuelta en tu consulta original antes de la búsqueda real. La consulta efectivamente aprende cómo lucen sus propias respuestas y apunta mejor.

En la práctica eso es +10–30% de recall en consultas de cola larga e infraespecificadas — justo las que los humanos teclean de verdad. Cuesta una búsqueda vectorial extra por consulta, no necesita LLM (es pura matemática), y remember la incluye automáticamente. La mitad por palabras clave (BM25) de la búsqueda sigue usando tu texto literal, así que las consultas de coincidencia exacta no se ven afectadas.

No configuras nada. Las preguntas vagas simplemente encuentran el recuerdo correcto más a menudo.


Una superficie de herramientas más ligera — de 8 herramientas MCP a 5

Cada herramienta que expones por MCP le cuesta contexto a tu agente en cada turno — unos 500–2000 tokens de schema que tiene que leer antes de hacer nada. Una superficie de herramientas inflada es un impuesto sobre cada petición.

Así que recortamos la superficie MCP de Octobrain de ocho herramientas a cinco verbos distintos:

memorize     store a memory   (now with optional related_to[])
remember     recall           (HyDE expansion + 1-hop neighbors, automatic)
forget       delete           (with confirmation)
consolidate  close a goal     (fold N memories into 1 insight)
knowledge    documents        (index, read, match, search)

Tres herramientas dejaron MCP porque ya no justificaban su coste de schema:

  • sleep_consolidate — ahora autónoma, así que el agente nunca necesita llamarla.
  • relate — plegada dentro de memorize. Puedes pasar related_to[] y enlazar un recuerdo con otros en la misma llamada que lo almacena. Contribuir a un objetivo es ahora un único round-trip: guarda el hallazgo y márcalo como que achieves el objetivo de una vez.
  • memory_graphremember ya devuelve los vecinos inmediatos de un recuerdo, lo que cubre el caso común.

Ninguna se ha ido — todas siguen viviendo en la CLI para administración y depuración. Simplemente ya no se comen el contexto de tu agente por funciones que rara vez usa. Cinco herramientas, cinco verbos, sin flags de modo sobrecargadas.


Empezamos a medir la calidad de la memoria — LongMemEval

No puedes mejorar lo que no mides. 0.7.0 añade un harness de benchmarking LongMemEval — con checkpointing para corridas largas — para poder puntuar el recall a largo plazo de Octobrain entre releases sobre un benchmark real en vez de a ojo. Es fontanería que nunca correrás, pero es por lo que las afirmaciones de recall y consolidación de arriba son afirmaciones que podemos sostener, y cómo lo serán también las próximas.


Por debajo del capó

Un puñado de cambios más silenciosos mantienen las luces encendidas a medida que la memoria crece:

  • Mantenimiento periódico de LanceDB corre automáticamente para mantener el vector store compacto y rápido con el tiempo.
  • Auto-linking y recuperación de grafo asíncronos — los recuerdos relacionados se conectan en segundo plano sin ralentizar la escritura que los disparó.
  • Un módulo SQL consolidado con escapado de literales centralizado y endurecido — menos aristas, un único sitio donde razonar sobre las consultas.

No notarás ninguno de estos directamente. Ese es el punto.


Cómo se ve 0.7.0 en la práctica

Una semana en la vida de un recuerdo, de principio a fin:

  1. Lunes. Tu agente guarda tres notas mientras depura un webhook inestable — cada una vía memorize, una de ellas marcada como que achieves el objetivo "fix webhook retries" en la misma llamada.
  2. Toda la semana. Sigues preguntando sobre ello. Cada remember refuerza los recuerdos que tocas y desvanece en silencio los que no.
  3. Viernes. Lanzas el fix y haces consolidate del objetivo. Tres notas se convierten en un insight duradero: "Webhook retries: exponential backoff, idempotency keys, dead-letter after 5."
  4. Por la noche. La sleep consolidation barre las observaciones casi duplicadas que nunca enlazaste explícitamente y también funde esas.
  5. El mes siguiente. Alguien pregunta "¿cómo manejamos los fallos de webhook?" — una consulta vaga que HyDE expande, aterrizando en el insight consolidado en vez de en cinco fragmentos medio recordados.

Nadie curó nada. La memoria se organizó sola.


Actualizar

Desde 0.6.x, la migración es pequeña:

Config — un único renombrado. Si tu sección [embedding] define text_model, renómbralo a model. Es el único cambio de config que rompe.

[embedding]
model = "fastembed:nomic-ai/nomic-embed-text-v1.5"   # was: text_model

Clientes MCP — tres herramientas se movieron a solo-CLI. Si tu config de cliente o tus prompts de agente llaman a sleep_consolidate, relate o memory_graph por MCP, actualízalos:

  • Elimina las llamadas a sleep_consolidate por completo — ahora es autónoma.
  • Reemplaza relate con el related_to[] de memorize para enlazar mientras almacenas (o usa octobrain memory relate en la CLI para enlaces entre existentes).
  • El caso común de memory_graph lo cubren los resultados de vecinos de remember; el recorrido más profundo se queda en octobrain memory graph.
  • consolidate_goal se renombra a consolidate — mismo schema, verbo más limpio.

Storage — nada que hacer. Las nuevas columnas de ciclo de vida y seguimiento de acceso se añaden en el primer arranque, y los recuerdos heredados quedan por defecto como totalmente activos. Sin migración manual, sin downtime.

Defaults — sleep consolidation y HyDE están ahora activados. Si quieres el comportamiento antiguo, pon sleep_consolidation_enabled = false o [search.hyde] enabled = false. La mayoría debería dejarlos activados.

Código y binarios en github.com/muvon/octobrain. Si algo se rompe, abre un issue — los leemos.