Documentación para desarrolladores
De cero a memoria viva: instalar, migrar el conocimiento que ya tienes, conectar a tus agentes y auditar el cerebro en vivo.
Instalación
Sin permisos de administrador, sin GUI, sin servidores que montar. El paquete (wheel) se descarga desde tu panel de cliente; la clave pública de verificación de licencia va embebida.
$ pip install dendrita_engine.whl $ dendrita init --key TU-CLAVE --client mi-proyecto --vault D:\proyectos\mi-proyecto\cerebro $ dendrita doctor
--key: tu clave de suscripción, emitida desde el panel (se muestra una sola vez).--host(opción global, va antes deinit): elige el agente y dónde escribir su configuración MCP. Por defectoclaude(Claude Code, por proyecto). Para otro:dendrita --host claude-desktop init …(ocursor·windsurf·generic).--vault: la carpeta donde vivirán tus notas (markdown + git recomendado). Si no la indicas:~/.brain/<cliente>. Es tuya: te la llevas cuando quieras.
doctor refresca la licencia contra el control plane, la verifica en local y diagnostica vault y embeddings. La primera ejecución descarga el modelo de embeddings (una vez; después todo es local, CPU, sin APIs externas).
Requisitos de máquina
- Python ≥ 3.10 en Windows, macOS o Linux. Sin GPU: los embeddings corren en CPU (ONNX).
- Disco: ≈250 MB para el modelo de embeddings (descarga única) + tu vault (markdown: megas, no gigas).
- RAM: el índice estándar trabaja en memoria y va sobrado hasta decenas de miles de notas; a partir de ~100.000, el backend de escala (
BRAIN_INDEX_BACKEND=lance) saca las notas de la RAM. - Red: solo licencia y conteos (qué sale, exactamente). Para entornos cerrados hay modalidad air-gap con licencia anual sin red.
Migrar el conocimiento que ya tienes
Ningún proyecto empieza de cero: hay markdown en repos, un Obsidian, apuntes y PDFs. dendrita migrate los ingiere en lote y depurados — cada documento pasa por el mismo pipeline que una ingesta de agente: deduplicación semántica, cuarentena y registro de auditoría.
# pon lo que quieras migrar en una carpeta y:
$ dendrita migrate .\docs-a-migrar
$ dendrita migrate .\docs-a-migrar --domain backend --confidence probable
| Formato | Cómo se trata |
|---|---|
.md | Si trae frontmatter (type:, category:…) se respeta su estructura — un vault Obsidian entra tal cual. Sin frontmatter, entra como concepto con el dominio de su carpeta. |
.txt | Troceado por párrafos en notas de ~1.500 caracteres, tituladas por fichero. |
.pdf | Igual que txt; requiere el extra de instalación: pip install "dendrita_engine.whl[migrate]" (las comillas importan en algunas shells). |
unverified y no se sirve a los agentes hasta que se corrobora — en el ciclo de curación, o de inicio con --confidence probable si confías en la fuente (p. ej., tu propio repo). La frecuencia no fabrica verdad; la migración tampoco.¿Cuánto tarda? El coste es el embedding local (CPU): cientos de documentos en minutos; miles, en decenas de minutos. Se puede relanzar sin miedo: es idempotente (lo ya migrado se refuerza, no se duplica).
migrate es el onboarding de documentación externa. Un vault que ya es Dendrita está en formato nativo: para moverlo o duplicarlo, copia la carpeta de notas tal cual — la carga directa lo mantiene íntegro. Re-migrarlo lo pasaría por la compuerta de ingesta: descartaría notas operativas (log/project) y recalcularía confianzas ya curadas. El comando lo detecta y se niega (existe --force para el caso deliberado).Cómo lo usan tus agentes
Tras init, tu agente ve 5 herramientas vía MCP y las usa con la disciplina consulta antes → trabaja → ingiere la lección al cerrar:
| Herramienta | Para qué |
|---|---|
brain_query | Contexto antes de cada tarea (solo devuelve lo que pasa el gating de confianza). Si responde weak: true, la mejor coincidencia es débil: pista a verificar, no verdad. |
brain_ingest | Guardar una decisión/lección al cerrar la tarea (entra en cuarentena hasta corroborarse). |
brain_dream | Consolidación: propone fusiones y caducidades; solo auto-aplica lo reversible. |
brain_promote | Subir conocimiento de un cliente al ámbito global, sanitizado. |
brain_stats | Estado del cerebro (incluye versión del motor y si hay actualización disponible — tu agente puede avisarte). |
Para sistemas no-MCP existe la API HTTP con tokens por agente y scopes. Varios agentes pueden compartir el mismo cerebro: el motor serializa las escrituras entre procesos (v0.2.0).
¿En qué hosts funciona, y con cuánta garantía?
Las herramientas son las mismas en cualquier host MCP; lo que cambia es cómo se instala y cuánta garantía de uso conserva cada plataforma (que el agente tenga la memoria no es lo mismo que la use siempre):
| Host | Conexión | Instalación | Garantía de uso |
|---|---|---|---|
| Claude Code | MCP (5 tools) | dendrita init | Total, por infraestructura: hooks de Dendrita — la consulta se inyecta en cada turno y la captura corre sola antes de perder contexto, sin depender de la disciplina del modelo. |
| Claude Desktop | MCP (5 tools) | dendrita --host claude-desktop init | Disciplina por instrucciones del Proyecto. El conocimiento viaja en cada respuesta de brain_query (la app no necesita acceso al vault); sin hooks ni transcripción local, la captura depende del agente. |
| Cursor / Windsurf | MCP (5 tools) | dendrita --host cursor init · dendrita --host windsurf init | Disciplina por reglas del agente. |
| Devin y sistemas no-MCP | API HTTP (tokens por agente) o CLI | wheel en su workspace + Playbook | Disciplina por Playbook + patrón de subagente curador. Atención a la soberanía: si el vault vive en la VM del proveedor, tu memoria reside en esa nube. |
El prefijo brain_ es el espacio de nombres estable del motor (como las variables BRAIN_* y el paquete brain-engine); la marca del producto es Dendrita. Los nombres de las herramientas no cambian entre versiones: tus agentes no se reconfiguran.
API HTTP (sistemas no-MCP)
Mismas operaciones que las herramientas MCP, sobre HTTP/JSON con tokens Bearer por agente y scopes (brain:read / brain:write / brain:curate). Para conectar lo que no habla MCP: CI, bots, otros agentes.
$ python -m brain.http_server # escucha en 127.0.0.1:8088 (BRAIN_HOST / BRAIN_PORT)
| Endpoint | Cuerpo | Respuesta | Scope |
|---|---|---|---|
POST /query | {"task", "domains"?, "types"?, "k"?, "expand_hops"?, "with_content"?, "max_chars"?} — domains es jerárquico (personal incluye personal/familia); expand_hops: -1 automático, 0 desactivado, ≥1 forzar N saltos por enlaces | {gated, weak, reason, hits[]} — cada hit incluye title y body (el conocimiento viaja en la respuesta; with_content: false para solo punteros) | brain:read |
POST /ingest | {"id","type","domain","title","body","source","authority"?,"verified"?,"related"?,"tags"?,"contradicts"?,"replace"?} — contradicts declara que esta nota contradice a otras: se guarda pero en cuarentena, y el conflicto pasa a la cola humana. replace: true reescribe la nota que ya tenga ese id en vez de deduplicar por parecido (ver abajo) | {action, note_id, reason, links_added, tags_added} — si la nota ya existía, sus relaciones y etiquetas se suman a las que ya tenía, y se dice cuántas entraron | brain:write |
POST /notes/update | {"updates":[{"note_id","domain"?,"related"?,"tags"?}]} — reorganiza notas que ya existen, en lote. domain reemplaza; related y tags se unen (idempotente). Cualquier otro campo es un error: el cuerpo, la confianza y las fuentes no se tocan por aquí | {updated, unchanged, errors, results[]} — por nota: el dominio antes/después, cuántos enlaces entraron y qué enlaces no resuelven a ninguna nota | brain:curate |
POST /dream | {"today"} | {auto_applied[], proposals[], warnings[]} — warnings dice qué NO se pudo revisar (p. ej. un dominio demasiado grande): conviene leerlo | brain:write |
GET /stats | — | {client, notes, by_type} | brain:read |
GET /list | ?state=&domain=&limit=&offset= (también POST) | {notes[]} — nodos por estado de confianza (p. ej. la cuarentena unverified), con procedencia | brain:read |
GET /graph | ?domains=&types=°ree_min=&limit=&offset= (sin parámetros, el grafo entero) | {nodes[], edges[], dangling[], stats} — el grafo interno del vault (enlaces related y [[wikilinks]] resueltos). Los nodos salen por número de conexiones descendente; stats dice cuántos hay en total y si la respuesta está recortada | brain:read |
GET /events | ?since=&limit= | {events[]} — actividad del vault (consultas y mutaciones), solo metadatos | brain:read |
GET /proposals | ?state=&op=&limit=&offset= (también POST) | {proposals[], total, counts} — la cola de curación pendiente entre ejecuciones, con su estado y quién la resolvió | brain:read |
POST /proposals/resolve | {"id","action","by"?} (accept/reject/reopen) | {ok, state_antes, state_despues} — registra la decisión humana; no modifica notas (eso es /curate) | brain:curate |
POST /curate | {"note_id","action"} (approve/reject/downgrade) | {ok, confidence_antes, confidence_despues} | brain:curate |
GET /health | — | {status, license} — license.state: ok · grace (venció, opera durante la cortesía, con grace_expires_in) · expired · invalid · missing · dev. Nunca deja de responder | — |
Cada petición lleva Authorization: Bearer <JWT> con sus permisos en el claim scope. El aislamiento es por instancia (BRAIN_CLIENT): un servidor sirve UN cerebro. Operar con un solo worker: la exclusión entre procesos sobre el vault ya la garantiza el motor.
Si la licencia deja de estar vigente, las operaciones responden 402 con {"error", "kind": "license"} — no un error genérico: el problema es la suscripción, no la petición. El motor la revalida en cada operación y renueva su token solo, así que un servicio de larga vida con la suscripción al día no se ve afectado.
Varios cerebros en un solo proceso (multi-vault)
Un producto con jerarquías de agentes puede necesitar un cerebro por agente. Arrancando con dendrita serve --multi --registry <fichero>, un único proceso sirve N vaults aislados compartiendo un solo modelo de embeddings en RAM. Las mismas operaciones de arriba se direccionan por ruta, nunca de forma implícita:
POST /vaults/<id>/query GET /vaults/<id>/graph GET /vaults/<id>/proposals POST /vaults/<id>/ingest GET /vaults/<id>/events POST /vaults/<id>/curate POST /vaults/<id>/dream GET /vaults/<id>/list GET /vaults/<id>/health
| Endpoint | Cuerpo | Qué hace | Scope |
|---|---|---|---|
GET /vaults | — | Los vaults montados, con su cliente, permisos y número de notas | brain:read |
POST /vaults | {"id","path","client"?,"seat"?,"scopes"?} | Monta un vault en caliente, sin reiniciar. scopes es un tope para ese vault: los permisos efectivos son los del token ∩ el tope (así se concede la curación al cerebro del padre y no al del hijo). Se persiste en el registro | brain:admin |
DELETE /vaults/<id> | — | Desmonta un vault; los demás no se enteran | brain:admin |
GET /health | — | Salud global: licencia del proceso + mapa de vaults montados | — |
Aislamiento: cada vault es un cerebro con su propio cliente, el mismo prefiltro que hace imposible la fuga entre clientes. Un vault que falla degrada solo sus peticiones. Cada vault publica su punto de entrada para el descubrimiento automático. La licencia es del proceso (una suscripción), y el asiento puede ser por vault.
Auditoría en vivo
$ dendrita watch
Abre en tu navegador (solo 127.0.0.1, nada se expone) el grafo del cerebro con la consumición real: qué notas se sirven, a qué consultas y cuándo — según ocurre. Es la respuesta visual a "¿qué está haciendo el motor?": auditable por cualquiera del equipo, sin tocar logs.
Privacidad: qué sale de tu máquina, exactamente
El motor y tu conocimiento corren en tu infraestructura; los embeddings se calculan en tu CPU. La nube de Dendrita solo gestiona la suscripción. Este es todo el tráfico que el motor genera:
| Cuándo | Qué viaja | Qué vuelve |
|---|---|---|
| Refresco de licencia (periódico) | Tu clave de suscripción | Un token de operación firmado (RS256) con las cuotas de tu plan |
| Conteos de uso (máx. cada 5 min, best-effort) | Clave de suscripción + dos números: consultas en 24 h y total de notas | — |
| Primera ejecución | Petición de descarga del modelo de embeddings (≈250 MB, una sola vez) | El modelo, que queda en local |
Nunca viajan: el contenido de tus notas, los textos de tus consultas, los embeddings, ficheros de tu máquina ni identidades de tus usuarios. Como en cualquier petición HTTPS, nuestro servidor ve la IP de salida — y nada más. Si la red falla, el motor sigue operando (gracia offline = la vida del último token) y los conteos simplemente no se envían: nunca bloquean una consulta.
El benchmark anti-poisoning, con sus datos
OWASP sitúa el memory poisoning (ASI06) entre los principales riesgos de los sistemas agénticos. No lo prometemos: lo medimos con un harness reproducible y determinista que puedes ejecutar en tu máquina. Estas cifras solo valen acompañadas de su contexto — aquí está.
Modelo de amenaza (el atacante no edita tu disco; inyecta por los caminos realistas): ingesta de cebos con la consulta objetivo, auto-corroboración repitiendo el mismo veneno desde varias fuentes, veneno plantado desde otro cliente, y contradicción de notas establecidas. El baseline es ranking semántico puro — lo que hace una memoria RAG sin defensas.
| Métrica (12 temas · 24 notas-veneno · k=3) | Baseline RAG | Dendrita |
|---|---|---|
| Veneno servido como verdad (top-3) | 100% | 0% |
| Nota legítima servida (sanidad de recall) | 67% | 92% |
| Consultas vagas cortadas (nada antes que ruido) | 0% | 80% |
Honestidad sobre el fallback: si ninguna nota de confianza responde, el motor puede mostrar una nota sin verificar marcada «verificar antes de confiar» (nunca peor que buscarlo a mano) — el agente sabe que no es verdad, por eso no cuenta como veneno servido como verdad. En el harness de prueba (embedder determinista, no el de producción) eso ocurre en ≈1 de 12 consultas; con el embedder real tiende a 0.
Por qué: lo ingerido nace en cuarentena y el suelo de confianza lo excluye del retrieval hasta que una fuente verificable lo corrobora (la frecuencia no fabrica verdad); el veneno de otro cliente lo corta el prefiltro de aislamiento antes del ranking; la contradicción no pisa la nota establecida — va a revisión humana.
Límite residual, medido y documentado: si un atacante consigue que el agente marque dos fuentes con autoridad reconocida (prompt-injection sobre el agente), el veneno pasa. No es cerrable solo en el motor; se mitiga con allowlist de autoridades por vault y el ciclo de curación. Está pinado como test en la suite — preferimos que lo sepas por nosotros.
Lo corres tú mismo: instala el wheel y ejecuta dendrita benchmark — reproduce estas cifras en tu propia máquina (deterministas), con el corpus, el embedder y los caveats incluidos. El harness viaja en el propio motor; no hay que creernos nada.
Referencia CLI
| Comando | Qué hace |
|---|---|
dendrita init | Conecta el motor a tu agente (config MCP) y valida la licencia. |
dendrita doctor | Diagnóstico: licencia, conexión, vault, embeddings. |
dendrita migrate <carpeta> | Ingesta en lote del conocimiento existente (md/txt/pdf), depurada. |
dendrita recall "<texto>" | Memoria relevante en markdown listo para inyectar en el contexto de un agente (hooks). Usa el servidor de la sesión si hay uno vivo (milisegundos); si la consulta gatea, no imprime nada. |
dendrita watch | Auditoría en vivo del cerebro (grafo + consultas reales). |
dendrita report [--month] | Informe KPI del cerebro (solo metadatos): qué conocimiento trabaja. |
dendrita ingest | Guarda una nota desde la línea de comandos (el camino habitual es tu agente, por MCP o HTTP). --replace reescribe la nota que ya tenga ese identificador en vez de compararla por parecido — para conocimiento que vive al día, como el estado de un proyecto; la nota reescrita no hereda las fuentes ni la credibilidad del texto anterior. --forced deja entrar tipos de bajo valor de entrada (log, reference) directamente a la bandeja de revisión. |
dendrita update-notes | Reorganiza notas ya existentes: les cambia el dominio y les añade relaciones o etiquetas, de una en una o en lote con --file. Es la operación que permite que el conocimiento viejo se reordene y que el grafo se teja también hacia atrás. No puede tocar el contenido ni la confianza. |
dendrita proposals | Cola de curación pendiente entre ejecuciones: lo que la consolidación propuso revisar y nadie ha resuelto. --resolve <id> --action accept|reject registra la decisión (con quién la tomó); lo rechazado no vuelve a proponerse. |
dendrita run | Arranca el servidor MCP a mano (normalmente lo lanza tu agente). |
dendrita serve --http | Daemon HTTP/JSON para productos que consumen el cerebro sin un cliente MCP. Valida la licencia al arrancar y la mantiene vigente mientras vive (no sirve si deja de serlo), y publica su puerto para el descubrimiento. Por defecto solo escucha en local (127.0.0.1). |
dendrita serve --multi --registry <fichero> | Un solo proceso sirve varios vaults aislados compartiendo un único modelo de embeddings en RAM (en vez de un proceso y un modelo por vault). Para productos con jerarquías de agentes, donde cada agente tiene su propio cerebro. Los vaults se montan y desmontan en caliente, cada uno con su aislamiento, sus permisos y su asiento; el registro sobrevive a un reinicio y un vault roto no afecta a los demás. |
dendrita update | Actualiza el motor a la última versión publicada (lo decides tú; nunca solo). |
dendrita version | Versión instalada. |
dendrita benchmark | Reproduce el benchmark anti-poisoning en tu máquina (determinista). Mide el veneno servido como verdad (0%) frente al baseline. |
brain funciona como alias de dendrita en todos los comandos.
Solución de problemas
Primero, siempre: dendrita doctor — diagnostica licencia, vault y embeddings, y te dice qué falla.
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
| La primera ejecución tarda minutos | Descarga única del modelo de embeddings (≈250 MB) | Esperar; después todo es local. En air-gap, el modelo se entrega junto al paquete. |
doctor falla en licencia / 403 al refrescar | Clave mal copiada, suscripción inactiva o tope de seats del plan alcanzado | Revisar clave y seats en tu panel (la clave puede rotarse; se muestra una sola vez). |
Mis consultas devuelven vacío (gated) | El conocimiento sigue en cuarentena (unverified) — comportamiento por diseño, no fallo | Corroborar/curar; si la fuente es tuya y respondes por ella, migrar con --confidence probable. |
Respuestas con weak: true | La mejor coincidencia no llega a la zona de relevancia fuerte (consulta vaga o solo adyacente al tema) | Es información, no error: tratar el resultado como pista y reformular la consulta con más contexto. |
migrate no procesa PDFs | Falta el extra de instalación | pip install "dendrita_engine.whl[migrate]" (las comillas importan). |
migrate dice "esa carpeta ya parece un vault Dendrita" | La carpeta contiene notas en formato nativo: migrarlas perdería log/project y confianzas curadas | Copiar la carpeta de notas tal cual (es el camino correcto para mover un vault). --force solo si de verdad quieres re-pasarlo por el pipeline. |
| Varios agentes/procesos sobre el mismo vault | — | Soportado: el motor serializa las escrituras con un lock del sistema operativo que se libera solo aunque un proceso muera. |
| Edité notas a mano (Obsidian) y el motor no las ve | El refresco automático no está activo en ese proceso | Arrancar el motor con BRAIN_WATCH=1, o reiniciar el proceso. |
Soporte: support@dendrita.dev. Los clientes con plan de servicio, por su canal acordado (con el SLA de su contrato).
Actualizar y desinstalar
Actualizar: un comando. El motor pide a la nube de licencias la última versión publicada y se reinstala — tu vault no se toca (las notas son tuyas en markdown estable; los índices derivados se regeneran solos si hace falta).
$ dendrita update # compara, descarga e instala la última versión $ dendrita doctor # verifica que todo sigue en pie
¿Cómo te enteras de que hay versión nueva? El motor lo sabe por su refresco de licencia y lo avisa donde ya miras: en dendrita doctor y en brain_stats — tu propio agente puede decírtelo. Nunca se actualiza solo: en tu infraestructura, el cambio de versión lo decides tú. Alternativa manual: descarga el wheel desde tu panel y pip install --upgrade dendrita_engine.whl.
Cada versión publicada se conserva: si necesitas volver atrás, pide la anterior a soporte y reinstala (mismo procedimiento).
Desinstalar: pip uninstall brain-engine, y borra la entrada MCP que init escribió en la configuración de tu agente. Tu vault queda intacto: markdown legible, tuyo, donde tú lo pusiste — sin Dendrita sigue siendo tu documentación.
Changelog del motor
0.2.16a1 — 2026-08-01 · Las notas de trabajo se mantienen frescas: hay conocimiento cuyo valor está en estar al día — el estado de un proyecto, un tablero, un resumen que se rehace cada semana. Hasta ahora el motor no podía actualizarlo: al guardar comparaba por parecido, y una versión nueva de un estado se parece muchísimo a la anterior, así que la tomaba por repetida y se quedaba con el texto viejo. Ahora una nota se puede reescribir por su identificador (replace: true al guardar, o dendrita ingest --replace): pides reescribirla y se reescribe, siempre, sin que el resultado dependa de cuánto haya cambiado el texto. · Reescribir no hereda credibilidad: la nota reescrita no conserva las fuentes ni las corroboraciones del texto anterior — respaldaban lo que ponía antes, no lo que pone ahora. Vuelve a partir de cero y sube de nivel por el mismo camino que cualquier otra. Así, reescribir un cuerpo nunca te regala el "verificado" del anterior. · Acotado a propósito: reescribir no mueve una nota de dominio (eso redistribuye permisos y sigue exigiendo el permiso de curación), no cruza la frontera de aislamiento y no revive notas que una persona había rechazado en la revisión. Cada caso da un error explicado, no un silencio. · Corregido — guardar con un identificador ya usado: hasta ahora, en ciertos casos, sustituía la nota anterior sin decirlo e informaba de que había creado una nueva. Ahora es un error claro que indica cómo hacerlo a propósito. Si tu integración dependía de ese comportamiento, añádele replace: true. · Corregido también que reorganizar una nota de tipo log (0.2.15a1) no llegara a escribirse en el markdown.
0.2.15a1 — 2026-07-27 · El conocimiento viejo también se reordena: hasta ahora una nota ya guardada no podía cambiar de dominio ni ganar relaciones — el vault crecía, pero no se reorganizaba, y el grafo solo se tejía hacia delante. Si en julio descubrías que dos notas de marzo estaban relacionadas, no había forma de decirlo. Ahora sí: reorganización por lotes de notas existentes (dendrita update-notes / POST /notes/update) que cambia el dominio y añade relaciones y etiquetas — en cientos de notas de una vez, repetible sin ensuciar (volver a lanzarla no duplica nada) y registrada en la auditoría. · Deliberadamente acotada: no puede tocar el contenido, la confianza ni las fuentes. Reorganizar no es reescribir, y reescribir conocimiento desde un cliente sigue siendo imposible; intentarlo da error, no un silencio. Cambiar el dominio redistribuye permisos (mueve la nota dentro o fuera del alcance de quien tuviera concedida una rama), así que exige el permiso de curación, no el de escritura. · Guardar una nota que ya existía deja de perder sus relaciones: se suman a las que tenía, y la respuesta dice cuántas entraron. · Si al guardar aparece algo casi idéntico en otra rama del mismo dominio, no se fusiona por su cuenta: se propone en la cola de curación para que decida una persona.
0.2.14a1 — 2026-07-25 · Licencia siempre vigente en servidores de larga vida: un motor arrancado como servicio permanente renueva su licencia solo, sin reiniciar y sin generar tráfico si todo está en orden. Antes capturaba la licencia al arrancar y no volvía a mirarla, con dos consecuencias que hemos cerrado: /health podía informar de una licencia caducada en una instalación perfectamente sana (falsa alarma), y —más importante— la comprobación de licencia solo ocurría al arrancar, de modo que un servicio ya en marcha seguía operando aunque la suscripción hubiera terminado. Ahora se comprueba en cada operación. · /health se vuelve diagnosticable: nuevo estado grace (la licencia venció pero el motor sigue operando durante una ventana de cortesía, con la cuenta atrás en grace_expires_in) para que tu monitorización avise antes del corte, y un campo cached_token que distingue "la suscripción terminó" de "este proceso no ha renovado". /health nunca deja de responder, justamente para que puedas diagnosticar cuando algo falla. · Cortesía según el tipo de licencia: con suscripción en línea, 24 h de margen para absorber una caída de la nube de licencias; con licencia offline/air-gap, la caducidad corta en seco (ahí la fecha de expiración es el contrato entero). Ajustable con BRAIN_LICENSE_GRACE_SECONDS. · Las operaciones sobre HTTP devuelven 402 (no un error genérico) cuando hace falta renovar. · Corregido también que una licencia ilegible dejara de aplicar los límites del plan.
0.2.13a1 — 2026-07-25 · Dominios con jerarquía, y una bandeja que no se olvida: los dominios admiten ahora ruta (trabajo/decisiones, personal/familia) y una consulta por personal recupera todo lo que cuelga de él — pero nunca personalidad: la frontera es el separador, no el texto. Eso permite conceder a un agente una rama de tu conocimiento sin entregarle las hermanas. Los dominios sin barra funcionan exactamente igual que antes. · Las propuestas de consolidación ya no se pierden: lo que el motor propone revisar (casi-duplicados, notas rancias, contradicciones) queda en una cola persistente con su estado y su historial de quién resolvió qué — y lo que ya rechazaste no vuelve a aparecer mañana. · Nuevo mecanismo de contradicciones: al guardar conocimiento puedes declarar que contradice a otra nota; se conserva pero queda en cuarentena, sin servirse como verdad mientras el conflicto siga abierto, y pasa a la cola humana. · Escala: la consolidación nocturna deja de consumir memoria proporcional al cuadrado del dominio (antes podía agotar la RAM en vaults grandes) y avisa cuando decide no revisar algo, en vez de fallar en silencio; y el grafo se puede pedir por páginas y filtrado (por dominio, tipo o número de conexiones) para dibujar vaults de miles de notas por niveles. · La consulta por HTTP acepta ya expand_hops y types. Todo aditivo: sin tocar nada, el motor se comporta igual que antes.
0.2.12a1 — 2026-07-18 · El interior del cerebro, visible: dos lecturas nuevas para construir visualizaciones sobre el motor — GET /graph devuelve el grafo interno de un vault (todas sus notas y los enlaces entre ellas, resueltos y con su estado de confianza) y GET /events la actividad reciente (qué se consultó, qué se guardó, qué se curó — solo metadatos, nunca el contenido de tus consultas). Disponibles también por vault en el daemon multi-vault (/vaults/<id>/…). Lectura pura: no tocan el recall ni el gating. Aditivo y retrocompatible.
0.2.11a1 — 2026-07-16 · Un daemon, N cerebros: dendrita serve --multi sirve varios vaults aislados desde UN solo proceso con UN solo modelo de embeddings en RAM — pensado para productos con jerarquías de agentes donde cada agente tiene su propio cerebro. Los vaults se montan y desmontan en caliente (sin reiniciar el daemon ni afectar al resto), cada uno con su aislamiento, sus permisos y su asiento propios. El modo de siempre (un vault por proceso) no cambia.
0.2.10a1 — 2026-07-16 · Salud con estado de licencia: el /health del servidor embebido (dendrita serve) informa ahora del estado real de la licencia (ok / expired / invalid / missing / dev, con plan y caducidad) — tu monitorización detecta una licencia caída sin esperar al error de la primera consulta. El chequeo es pasivo (no genera tráfico a la nube de licencias) y retrocompatible.
0.2.9a1 — 2026-06-29 · Curación de la cuarentena: nuevas operaciones para montar una bandeja de "conocimiento por revisar" sobre el motor — listar lo que está sin verificar (brain_list) y aprobarlo o rechazarlo (brain_curate, con su propio permiso). El conocimiento investigado entra en cuarentena y solo se sirve como verdad cuando un humano lo aprueba. Aditivo y sin regresión.
0.2.8a1 — 2026-06-29 · Benchmark reproducible por ti: dendrita benchmark ejecuta en tu propia máquina el test anti-envenenamiento (0% de veneno servido como verdad, determinista). El harness viaja en el motor: no hay que creernos las cifras.
0.2.7a1 — 2026-06-28 · Asientos por usuario: los productos que empaquetan el motor con una única clave de suscripción compartida pueden ahora identificar a cada usuario (variable BRAIN_SEAT_SUB) para aislarlo y medir su uso por separado. Opcional y retrocompatible: si no se configura, todo funciona exactamente como antes.
0.2.6a1 — 2026-06-16 · Robustez de licencia: el cerebro ya no se queda sin memoria por un desajuste de reloj entre tu máquina y la nube de licencias (un margen de tolerancia evita el bloqueo transitorio tras renovar el token) · dendrita serve --http: modo servidor HTTP de primera clase para productos que embeben el motor (valida la licencia antes de servir) · dendrita init añade la configuración con tu clave al .gitignore por defecto, para que no acabe en un repositorio por accidente.
0.2.5a1 — 2026-06-16 · Uso automático del cerebro en un comando: dendrita hooks install deja a tu agente consultando solo en cada turno y guardando solo al compactar, sin depender de que se acuerde — y ahora rápido (el cerebro se mantiene caliente, respuesta en milisegundos) · dendrita init te pregunta si quieres cablearlos · dendrita hooks status/remove para verlos o quitarlos.
0.2.4a1 — 2026-06-15 · dendrita capture: guarda por tu cuenta lo que decides recordar (reuniones, decisiones, notas) y lo recuperas al instante — lo que dictas tú es de fiar de inicio · nunca pierdes lo que metiste: si algo aún no está curado, el cerebro lo devuelve marcado como pista a verificar (nunca peor que buscarlo a mano) · dendrita review: repasa y aprueba lo que el cerebro capturó solo · dendrita init --hooks: deja el uso del cerebro cableado en tu agente en un comando · captura automática más fina (no duplica y enlaza notas relacionadas).
0.2.3a5 — 2026-06-13 · dendrita init --host claude-desktop: conexión a la app de escritorio de Claude en un comando (config global, respeta otros servidores MCP) · matriz de hosts soportados documentada arriba.
0.2.3a4 — 2026-06-13 · Hooks de uso del cerebro para Claude Code (dendrita recall --hook y dendrita curate --hook): consulta inyectada en cada turno y captura automática antes de perder contexto, sin depender de la disciplina del agente · brain_query devuelve título y cuerpo de cada nota (el conocimiento viaja en la respuesta) · dendrita update seguro en Windows · el servidor MCP/HTTP exige licencia por defecto · migrate detecta un vault Dendrita y se niega (se copia, no se migra) · una nota con BOM de Windows ya no se cae del índice.
0.2.3a1 — 2026-06-12 · Aviso de versión nueva en doctor y brain_stats (tu agente puede avisarte) · dendrita update: actualizar en un comando, decidido por ti — nunca solo.
0.2.2a1 — 2026-06-12 · Gating por margen: con un top fuerte, lo muy por debajo no acompaña al resultado · señal weak cuando la mejor coincidencia es débil (se sirve como pista, no como verdad) — en MCP, HTTP y CLI.
0.2.1a1 — 2026-06-11 · Suelo de relevancia calibrado por embedder (ajustable con BRAIN_REL_FLOOR) · migrate --confidence probable viaja como fuente verificada · refresco de licencia más robusto (validación de forma + reintento).
0.2.0a1 — 2026-06-11 · Concurrencia multi-proceso (varios agentes sobre el mismo vault, sin pisarse) · dendrita migrate (onboarding de conocimiento existente) · dendrita watch (auditoría en vivo) · alias dendrita y marca en la CLI.
0.1.0a1 — 2026-06-09 · Primera alfa: motor (gating + refuerzo + dream), MCP, licencia RS256 con clave pública embebida, cuotas, metering, backend de escala LanceDB opcional.