Skip to content

ADR — Captura de Memory Intent y ampliación de memoria corporativa continua

Fecha: 2026-09-06
Estado: Accepted (con 3 condiciones obligatorias incorporadas — ver §6bis) GO: Carlos, 2026-09-06
Ámbito: wetopi-memory Hermes plugin
Backend: Hindsight 0.9.2
Relacionado con: arquitectura mixta de memoria Wetopi


1. Contexto

El sistema actual utiliza dos caminos de memoria diferenciados:

  1. Provider nativo Hindsight de Hermes
  2. single-bank;
  3. bank personal user-u_carlos;
  4. auto-recall;
  5. auto-retain del turno completo;
  6. tools explícitas hindsight_retain, hindsight_recall, hindsight_reflect.

  7. Plugin general wetopi-memory

  8. corporate-only;
  9. banks wetopi-platform y wetopi-business;
  10. routing determinista;
  11. ScopeACL;
  12. EvidenceBuffer;
  13. batch-retain;
  14. política conservadora de retención;
  15. recall mediante hooks y prefetch.

La separación actual establece:

personal = memoria abundante y poco filtrada
company  = memoria curada y compartida

El provider nativo es dueño del bank personal, mientras que wetopi-memory tiene ACL corporate-only.

Actualmente el pipeline corporate evalúa señales como durabilidad, seguridad, verificación y scope antes de hacer retain, con un máximo de un batch por scope y turno.

Este enfoque ha demostrado ser seguro, pero excesivamente conservador para el objetivo deseado de memoria organizacional.


2. Problema

La memoria corporativa no debe limitarse únicamente a:

  • root causes importantes;
  • decisiones arquitectónicas;
  • procedimientos consolidados;
  • aprendizajes excepcionales.

Wetopi necesita además disponer de una memoria operativa continua que represente:

  • el estado actual de la plataforma;
  • cambios realizados;
  • servicios creados o retirados;
  • hosts apagados o puestos en mantenimiento;
  • despliegues;
  • operaciones realizadas;
  • procedimientos utilizados;
  • decisiones;
  • descubrimientos;
  • pendientes;
  • resultados de investigaciones.

Ejemplos:

pve04 se apagó por mantenimiento.
BookStack quedó desplegado y operativo.
El servicio usa HTTPRoute; el DNS ya queda cubierto por wildcard.
Se migró X al nuevo cluster.
Infisical quedó configurado como backend de secretos.

Estas informaciones pueden no ser permanentemente durables, pero son muy relevantes para entender:

qué existe
qué estado tiene
qué ocurrió
cómo se operó
por qué se hizo
qué queda pendiente

El incidente anterior con BookStack mostró precisamente que información útil podía terminar únicamente en la memoria personal mientras wetopi-platform no capturaba el aprendizaje correspondiente.


3. Hallazgo adicional: intención explícita del modelo

El provider nativo Hindsight expone:

hindsight_retain
hindsight_recall
hindsight_reflect

y estas llamadas explícitas del modelo son distintas del auto-retain automático.

En el sistema actual:

👁️ Hindsight — saving to memory

corresponde al mecanismo automático del provider.

Mientras:

⚙️ hindsight_retain(...)

indica que el propio modelo decidió explícitamente que cierta información merece ser retenida.

Esta llamada constituye una señal semántica de alta calidad que wetopi-memory actualmente no utiliza de forma especial.


4. Decisión

Se ampliará wetopi-memory con dos cambios principales:

4.1 Captura amplia, almacenamiento compacto

La filosofía de corporate memory pasa de:

retain only exceptional durable learnings

a:

capture broadly
store compactly

Una interacción operativa relevante debe producir normalmente uno o varios candidatos de memoria corporativa, aunque no contenga un root cause o una decisión arquitectónica.

No se almacenará la conversación completa.

El plugin transformará la actividad del turno en información operacional compacta.


4.2 Capturar hindsight_retain como Memory Intent

Cuando el modelo llame explícitamente a:

hindsight_retain

wetopi-memory deberá tratarlo como una señal:

explicit_memory_intent

de alta prioridad.

La señal NO implica copiar automáticamente el contenido al bank corporativo.

Debe pasar igualmente por:

ScopeACL
SecurityPolicy
CorporateRelevance
ScopeRouter
RetainPolicy

Flujo:

LLM
 │
 ├── hindsight_retain
 │       │
 │       ├── provider nativo
 │       │      └── user-u_carlos
 │       │
 │       └── wetopi-memory observa la intención
 │                │
 │                ▼
 │         MemoryIntent signal
 │                │
 │                ▼
 │       corporate relevance?
 │          │            │
 │         NO           YES
 │                       │
 │                       ▼
 │                 scope routing
 │                ┌──────┴──────┐
 │                ▼             ▼
 │            platform       business

5. Nuevo componente: MemoryIntent

Añadir al modelo interno:

MemoryIntent

Ejemplo:

{
  "type": "explicit_memory_intent",
  "source": "native_hindsight_retain",
  "strength": 1.0,
  "content": "...",
  "tool_call_id": "...",
  "timestamp": "...",
  "session_id": "..."
}

El evento puede formar parte del TurnEvidenceBuffer existente o almacenarse en un sub-buffer específico.

Recomendación inicial:

TurnEvidenceBuffer
├── tool_evidence[]
├── operational_signals[]
└── memory_intents[]

6. Hooks

pre_tool_call

Detectar intención antes de ejecutar la tool, si Hermes expone de forma fiable:

  • tool name;
  • arguments;
  • session context.

Si la tool es:

hindsight_retain

registrar:

MemoryIntent

con el contenido solicitado por el modelo.


post_tool_call

Confirmar que la operación explícita se ejecutó.

No realizar corporate retain directamente.

Registrar:

tool_success
tool_result

en el buffer.


post_llm_call

Evaluar conjuntamente:

conversation
+
EvidenceBuffer
+
MemoryIntent
+
final result

y decidir si se genera memoria corporativa.


7. Protección contra loops

Debe impedirse que las operaciones generadas por wetopi-memory creen nuevos MemoryIntent.

Regla obligatoria:

memory operations originating from wetopi-memory
MUST NOT generate memory-intent signals

El detector solo debe considerar explícitamente las tools del provider nativo:

hindsight_retain

y no:

memory_retain

del propio plugin.

Idealmente identificar además el origin/call namespace.


8. Nuevo modelo de Corporate Learning

La memoria corporativa se clasificará inicialmente en:

STATE
EVENT
DECISION
PROCEDURE
LEARNING

STATE

Representa estado operativo conocido.

Ejemplos:

pve04 is offline for maintenance.
BookStack is operational.
Infisical is the active secrets backend.

Puede ser temporal.

No debe requerir durabilidad permanente.


EVENT

Representa algo que ocurrió.

Ejemplos:

pve04 was powered off for maintenance.
BookStack was deployed.
Service X was migrated to RKE2.

Debe preservar timestamp/contexto temporal.


DECISION

Representa una decisión explícita.

Ejemplos:

Wetopi will use Argo CD for GitOps.
The native Hindsight provider owns personal memory.

Debe exigir señal explícita o alta confianza.


PROCEDURE

Representa una forma comprobada de operar.

Ejemplo:

To deploy BookStack:
- deploy using Argo CD
- create HTTPRoute
- no additional DNS record is required because wildcard DNS already covers it

Debe exigir verificación suficiente.


LEARNING

Representa:

  • root causes;
  • gotchas;
  • restricciones;
  • fixes;
  • relaciones descubiertas.

Ejemplo:

Service X requires Secret Y to exist before rollout.

Debe exigir evidencia/verificación.


9. Cambio de policy

Eliminar como condición universal:

require_durable = true

La condición principal pasa a ser:

corporate_relevant = true

La durabilidad se convierte en propiedad del candidato.

Ejemplo:

memory_policy:

  state:
    retain: true
    temporal: true
    verification: medium

  event:
    retain: true
    temporal: true
    verification: medium

  decision:
    retain: true
    verification: explicit_or_high

  procedure:
    retain: true
    verification: required

  learning:
    retain: true
    verification: required

  speculation:
    retain: false

  chatter:
    retain: false

  raw_output:
    retain: false

10. Señales de retención

Crear un sistema determinista de señales.

Ejemplo conceptual:

SIGNAL                                  STRENGTH

explicit hindsight_retain              VERY HIGH
explicit user "remember this"           VERY HIGH
successful infrastructure mutation     VERY HIGH
successful deployment                  HIGH
explicit decision                      HIGH
verified root cause                    HIGH
service state change                   HIGH
operational procedure executed         MEDIUM/HIGH
ordinary operational discussion        MEDIUM
speculative discussion                 LOW
chatter                                ZERO
secret detected                        HARD REJECT

No es obligatorio implementar inicialmente un score numérico exacto.

Puede utilizarse un sistema de reglas/flags.


11. Operational Activity Detector

Añadir detección amplia de actividad corporativa.

Ejemplos de señales:

Mutación

created
deployed
installed
changed
migrated
updated
deleted
powered off
powered on
restarted
configured
moved

Estado

running
offline
degraded
ready
pending
maintenance
completed
failed

Decisión

decided
will use
selected
rejected
from now on

Descubrimiento

root cause
discovered
requires
fails when
works because
constraint

El router debe soportar equivalentes ES/EN.


12. Batch retain

Se mantiene la política actual:

maximum 1 retain / scope / turn

El turno puede producir varios LearningRecord, pero deben agruparse antes de llamar a Hindsight.

Ejemplo:

Turn
 │
 ├── STATE
 ├── EVENT
 ├── PROCEDURE
 └── LEARNING
       │
       ▼
platform batch
       │
       ▼
one Hindsight retain

Esto preserva el control de backpressure ya implementado actualmente mediante semaphore, cola limitada y batch por scope.


13. Uso del LLM

No añadir inicialmente un LLM classifier dentro de wetopi-memory.

El plugin realizará:

detection
classification
security
routing

mediante reglas.

Hindsight seguirá realizando:

fact extraction
entity extraction
graph generation
observation consolidation

server-side, como ya ocurre en la arquitectura actual.


14. Input enviado a Hindsight

No enviar toda la conversación indiscriminadamente.

Crear un batch compacto como:

Wetopi platform operational activity.

Timestamp:
2026-09-06T...

User/agent activity:
- pve04 was intentionally powered off for maintenance.

Evidence:
- workloads had already been evacuated.
- shutdown completed successfully.

Current outcome:
- pve04 is offline.
- offline state is intentional and temporary.

Hindsight será responsable de extraer los facts individuales.


15. retain_mission revisado para wetopi-platform

Actualizar el bank mission a:

Extract concise operational knowledge about the Wetopi platform.

Retain relevant CURRENT STATE:
- status of hosts, services, clusters and infrastructure
- online/offline/degraded/maintenance states
- deployed, removed or pending services
- important configuration currently in effect

Retain EVENTS:
- deployments
- shutdowns and startups
- migrations
- upgrades
- service creation or removal
- infrastructure changes
- incidents and recoveries

Retain DECISIONS:
- architecture decisions
- operational decisions
- selected or rejected technologies
- changes in platform policy

Retain PROCEDURES:
- verified ways of operating, deploying, recovering or maintaining systems
- repeatable operational sequences

Retain LEARNINGS:
- root causes
- discovered constraints
- validated fixes
- gotchas
- important dependencies and service relationships

Preserve:
- entity names
- timestamps and temporal context
- current outcome
- reason when known
- whether the state is temporary, pending or final

Supersede rule:
- when a resource changes state, the new observation SUPERSEDES
- the old one for the same resource (pve04 online kills pve04 offline)

Ignore:
- greetings
- conversational filler
- raw command output
- failed hypotheses
- speculation without operational consequence
- duplicate restatements
- credentials and secrets

16. wetopi-business

Aplicar el mismo concepto con otro dominio.

Tipos:

STATE
EVENT
DECISION
PROCEDURE
LEARNING

Ejemplos:

STATE:
Managed Hermes is currently the primary product direction.
EVENT:
Pricing model X was changed.
DECISION:
Wetopi will initially offer Hermes as a managed service.
PROCEDURE:
New customer onboarding follows process X.
LEARNING:
Customer segment Y reacts negatively to requirement Z.

17. Estado versus evento

Cuando una acción modifica estado, conservar conceptualmente ambas dimensiones.

Ejemplo:

pve04 was powered off.

Debe permitir que Hindsight extraiga:

EVENT:
pve04 was powered off on 2026-09-06.

STATE:
pve04 is currently offline.

Posteriormente:

pve04 was powered on.

produce:

EVENT:
pve04 was powered on.

STATE:
pve04 is currently online.

La historia se conserva mientras el estado actual puede consolidarse/supersederse.


18. Tags

Añadir tags informativos, nunca como mecanismo de seguridad.

Ejemplos:

type:state
type:event
type:decision
type:procedure
type:learning

y opcionalmente:

entity:host
entity:service
entity:cluster
entity:network

Más identificador:

host:pve04
service:bookstack
system:rke2

ACL y aislamiento continúan dependiendo de:

IdentityResolver
ScopeACL
StoreRegistry

no de tags.


19. Memory Intent de otras tools

En V1 de este ADR:

hindsight_retain

será la señal explícita principal.

Opcionalmente registrar telemetría de:

hindsight_recall
hindsight_reflect

pero NO utilizarlos inicialmente como triggers de retain.

Interpretación futura:

hindsight_retain
→ persistence intent

hindsight_recall
→ past context considered relevant

hindsight_reflect
→ memory synthesis required

20. Métricas nuevas

Añadir:

wetopi_memory_intent_total
wetopi_memory_intent_promoted_total
wetopi_memory_intent_rejected_total

wetopi_memory_learning_candidate_total
wetopi_memory_learning_retained_total

wetopi_memory_learning_type_total

wetopi_memory_operational_activity_total

Labels permitidos:

agent
scope
type
reason
status

Nunca incluir contenido sensible en labels.


21. Métricas de eficacia

Durante el experimento medir:

turns_total
corporate_relevant_turns
turns_with_learning
turns_without_learning

native_hindsight_retain_calls
native_intents_promoted
native_intents_personal_only

platform_retains
business_retains

policy_rejects

Objetivo inicial:

la mayoría de interacciones operativas relevantes
deben generar al menos un LearningRecord corporativo

sin aumentar significativamente:

noise
duplicates
false memories
secret exposure

22. Riesgos

Sobre-retención

El cambio amplía considerablemente la superficie de captura.

Mitigación:

compact batch
scope routing
Hindsight retain_mission
dedupe
observations

Estados obsoletos

Una memoria como:

pve04 is offline

puede dejar de ser correcta rápidamente.

Mitigación:

  • timestamp obligatorio;
  • clasificar como temporal;
  • conservar eventos;
  • permitir consolidación/supersession;
  • recall preferente de observations.

Promoción incorrecta personal → corporate

Un hindsight_retain explícito puede contener información exclusivamente personal.

Mitigación:

explicit intent != automatic promotion

Siempre ejecutar corporate relevance + scope policy.


Loops

Mitigación:

no considerar como MemoryIntent operaciones originadas por wetopi-memory.


Backpressure

Se mantiene:

BoundedSemaphore(1)
queue limit
batch per scope
async retain
fail-open

23. No decisiones

Este ADR NO decide todavía:

  • utilizar router semántico LLM;
  • construir promoter histórico personal → corporate;
  • sustituir el provider nativo;
  • modificar la ACL corporate-only;
  • crear nuevos banks;
  • eliminar la memoria personal abundante.

La arquitectura mixta se conserva.


24. Fases de implementación

M1 — Memory Intent bridge

Implementar:

detect hindsight_retain
record MemoryIntent
prevent loops
metrics
tests

No cambiar aún la policy global.


M2 — Corporate Activity Detector

Añadir reglas para:

state changes
events
decisions
procedures
learnings

y producir:

LearningRecord

M3 — Revised PolicyEngine

Cambiar:

durable?

como requisito global por:

corporate_relevant?

manteniendo verificación específica según tipo.


M4 — Hindsight mission update

Actualizar declarativamente:

wetopi-platform
wetopi-business

mediante el bootstrap GitOps existente.


M5 — Observación

Medir comportamiento real antes de introducir:

LLM gate
semantic router
historical promoter

25. Acceptance Criteria

El cambio se considera correcto cuando se verifican al menos estos casos.

Caso 1 — estado operativo

Entrada:

He apagado pve04 por mantenimiento.

Resultado esperado:

wetopi-platform contiene memoria temporal
sobre el shutdown y estado offline.

Caso 2 — nuevo servicio

Entrada:

BookStack ya está desplegado y funcionando.

Resultado esperado:

EVENT: deployment
STATE: operational

en wetopi-platform.


Caso 3 — procedimiento

Entrada:

Para BookStack solo hizo falta crear HTTPRoute
porque DNS ya estaba cubierto por wildcard.

Resultado esperado:

información compacta de procedimiento/configuración en wetopi-platform.


Caso 4 — hindsight_retain técnico

El modelo llama:

hindsight_retain(...)

con una conclusión técnica de plataforma.

Resultado esperado:

personal retain:
YES

MemoryIntent:
YES

corporate candidate:
YES

wetopi-platform:
YES if policy passes

Caso 5 — hindsight_retain personal

El modelo llama:

hindsight_retain(
  "Carlos prefers..."
)

Resultado:

personal:
YES

MemoryIntent:
YES

corporate:
NO

Caso 6 — secreto

Se detecta:

credential/API key/password

Resultado:

corporate retain:
HARD REJECT

aunque exista hindsight_retain.


Caso 7 — hipótesis falsa

Una hipótesis de debugging posteriormente descartada.

Resultado:

no LEARNING durable

Puede existir evidencia temporal local durante el turno, pero no debe convertirse en memoria corporativa.


26. Resultado esperado

Después del cambio:

PERSONAL
capture broadly
store broadly

mientras:

COMPANY
capture broadly
store compactly

La memoria corporativa debe evolucionar desde una colección de aprendizajes excepcionales hacia una representación continua de:

STATE
EVENTS
DECISIONS
PROCEDURES
LEARNINGS

de Wetopi.

El resultado esperado es que wetopi-platform y wetopi-business funcionen progresivamente como una memoria viva de:

qué tenemos
qué estado tiene
qué hicimos
cómo lo hicimos
por qué lo hicimos
qué aprendimos
qué cambió

sin almacenar el ruido completo de las conversaciones personales.