External Brain ahora enlaza memorias de IA automáticamente
Nueva feature en External Brain: cada memoria que un agente escribe se enlaza sola a las que menciona por título, sin revisión manual.
En resumen: External Brain (la memoria compartida y grafo de conocimiento para agentes de IA que construyo) acaba de sumar auto-linking: cuando un agente crea una memoria nueva, el sistema la enlaza solo a cualquier otra memoria del mismo proyecto cuyo título aparezca mencionado en el contenido. Sin revisión manual, sin que nadie tenga que acordarse de hacerlo.
El problema que resuelve
External Brain es un panel donde asistentes como Claude Code, Cursor o Codex guardan y recuperan decisiones, arquitectura e historial de un proyecto vía Model Context Protocol (MCP). Todo eso vale poco si las memorias quedan sueltas: un grafo de conocimiento sin conexiones es, en el fondo, una lista. Y como los agentes escriben memoria de forma autónoma (no hay un humano completando un formulario cada vez), pedirles que además recuerden enlazar cada memoria relacionada es pedir que un paso opcional se cumpla siempre. En la práctica, no pasaba: quedaban memorias huérfanas.
Cómo funciona
El matching es deliberadamente simple: substring case-insensitive del título de una memoria dentro del contenido de otra, con un largo mínimo de 4 caracteres para evitar falsos positivos con palabras cortas.
def find_lexical_matches(
content: str,
candidates: list[tuple[UUID, str]],
min_len: int = 4,
) -> list[UUID]:
"""Ids de `candidates` cuyo título aparece como substring (case-insensitive) en `content`."""
if not content:
return []
content_lower = content.lower()
return [
candidate_id
for candidate_id, title in candidates
if title and len(title) >= min_len and title.lower() in content_lower
]
Nada de embeddings ni de un LLM juzgando relevancia: matching léxico puro, testeable sin base de datos, rápido y predecible. memory_service.create() corre esta función después de guardar la memoria y crea el link con relación "mentions" por cada coincidencia dentro del mismo proyecto.
Lo que costó más no fue el matching, fue el cableado
El auto-link solo sirve si corre en todos los caminos por los que puede nacer una memoria. Había tres: la API REST, el servidor MCP y las corridas del agente autónomo. Los dos primeros ya pasaban por MemoryService; el tercero, agent_runner_service.py, se había armado su propio MemoryService sin link_repo, así que las memorias que escribía el agente autónomo quedaban sin enlazar pese a que el resto del sistema sí lo hacía. El fix real fue unificar los tres puntos de entrada para que compartan la misma composición, no agregar una función nueva.
De paso, el agente autónomo empezó a guardar metadata de trazabilidad en cada memoria que escribe (agent_role, run_id, run_trigger, iteration), tomada de la tabla de agentes y de la corrida en curso. Antes esa metadata quedaba siempre vacía.
Por qué esto no es un detalle menor
Lo vengo forzando manualmente en mis propios proyectos: en este mismo repo, el CLAUDE.md tiene una regla explícita: “tras cada add_memory, crear SIEMPRE el add_memory_link… nada de memorias huérfanas”. Es una disciplina que funciona si alguien (o algo) la hace cumplir siempre, no la mayoría de las veces. Automatizarla en el producto es sacar esa responsabilidad de la memoria de corto plazo del agente y ponerla en el sistema, que es exactamente el tipo de decisión de arquitectura que separa “funciona en la demo” de “funciona en producción, sin supervisión, todos los días”.
Si estás construyendo algo donde varios agentes de IA escriben estado de forma autónoma y te preocupa que ese estado se vuelva inconsistente con el tiempo, hablemos.