---
title: "Revisión de creencias: invalidar no es borrar"
description: "Expansión, revisión y contracción en las memorias de ALLAN, leídas contra AGM y contra la bitemporalidad de TSQL2. Qué garantiza el código hoy, qué prometió el diseño, y dónde los dos ejes temporales están colapsados en uno."
allan.topic: foundation
allan.service: allan-org-memory
allan.date: 08/04/2026
allan.fuente: [Platform Server/internal/memory/graph_model.go, Platform Server/internal/memory/consolidation.go, Platform Server/internal/memory/maintenance.go, Platform Server/internal/memory/retrieval.go, Platform Server/internal/memory/collective.go, Platform Server/internal/memory/graph_store_memory.go, Platform Server/internal/memory/graph_store_dfly.go, Platform Server/internal/memory/extraction.go, Platform Server/internal/app/tenant_mcp.go, Platform Server/internal/app/memory_v2.go, Platform Server/internal/app/app.go, Responses API/responses_api/cmem/curation.py, Responses API/responses_api/cmem/consensus.py, Responses API/responses_api/cmem/store.py, Responses API/responses_api/cmem/models.py, Responses API/responses_api/cmem/judge.py, Responses API/responses_api/cmem/service.py, Org Memory/org_memory/services/curation.py, Org Memory/org_memory/services/conflicts.py, Org Memory/org_memory/services/search.py, Org Memory/org_memory/db/models.py]
allan.audiencia: [desarrollador]
allan.madurez: emergente
---

Un sistema que aprende de una conversación acaba, antes o después, creyendo algo falso. No es un defecto del extractor: es la condición normal de cualquier agente que recoge información de un mundo que cambia y de un interlocutor que se corrige. La pregunta no es cómo evitarlo, sino qué operación se ejecuta cuando llega la corrección. La respuesta obvia —`DELETE`— destruye tres distinciones a la vez.

La primera es entre *el mundo cambió* y *nos equivocamos*. Si el presupuesto pasó de treinta mil a cuarenta mil euros en marzo, «el presupuesto es de treinta mil» fue verdadera hasta marzo y lo sigue siendo como afirmación fechada: ha caducado su vigencia, no su verdad. Si en cambio el extractor invirtió una negación y el presupuesto nunca fue de treinta mil, la afirmación no caduca: nunca debió existir. Un borrado deja ambos casos idénticos.

La segunda es entre *quién dejó de creerlo*. Un hecho sale de circulación porque otro lo contradijo, porque su evidencia se evaporó, o porque una persona dijo «esto no es así». Las tres salidas producen el mismo silencio en el prompt y exigen políticas distintas: la contradicción es reversible por evidencia nueva; la retirada humana no debe serlo por el mismo camino que la produjo.

La tercera es entre *creencia de quién*. Un mismo enunciado puede estar en la partición privada de tres agentes, en la capa colectiva del tenant y en el catálogo normativo de la organización. Borrar «el hecho» presupone un sujeto único que no existe.

Este ensayo trata de la operación que ALLAN pone en lugar del borrado, de la teoría que la describe desde 1985, y de los puntos —varios, algunos graves— donde el código no hace lo que el modelo dice.

## El marco que ya existía

La formulación canónica es de Alchourrón, Gärdenfors y Makinson. Su artículo de 1985 abre distinguiendo los tres movimientos que un sistema de memoria necesita. Expansión: «The simplest and best known form of theory change is *expansion*, where a new proposition (axiom), hopefully consistent with a given theory A, is set-theoretically added to A, and this expanded set is then closed under logical consequence». Contracción: «One form is theory *contraction*, where a proposition x, which was earlier in a theory A, is rejected». Revisión: «Another kind of change is *revision*, where a proposition x, inconsistent with a given theory A, is added to A under the requirement that the revised theory be consistent and closed under logical consequence».

Los tres nombres no son sinónimos elegantes. Expansión y revisión añaden; contracción solo quita. Y la relación entre ellas es la identidad de Levi, que el artículo enuncia: «the revision of A by x, denoted A + x, can be defined as Cn((A ÷ ¬x) ∪ {x}), where Cn is a given consequence operation». Revisar es contraer por la negación y después expandir. Conviene tener presente la consecuencia de ingeniería: quien sabe contraer sabe revisar; a quien solo sabe expandir e invalidar por contradicción le falta la mitad del álgebra.

El requisito de cambio mínimo, la razón entera por la que estas operaciones son difíciles, está en los postulados: «(÷2) A ÷ x ⊆ A (inclusion)», «(÷3) If x ∉ Cn(A), then A ÷ x = A (vacuity)», «(÷6) A ⊆ Cn((A ÷ x) ∪ {x}) whenever A is a theory (recovery)». Inclusión prohíbe inventar creencias al retirar una; vacuidad, tocar nada si la creencia no estaba; recuperación exige que retirar y volver a poner devuelva al estado anterior. Hansson lo resume en la *Stanford Encyclopedia*: «The epistemic agent should give up beliefs only when forced to do so, and should then give up as few of them as possible».

AGM opera sobre conjuntos cerrados bajo consecuencia lógica, y ahí está su distancia con cualquier sistema real. La misma entrada define la alternativa: «A belief base is a set of sentences that is not (except as a limiting case) closed under logical consequence». ALLAN almacena una base: aristas con sujeto, relación, objeto, evidencia y confianza (`Platform Server/internal/memory/graph_model.go:149-169`). Nada calcula clausuras. Esa pobreza formal hace que «retirar esta afirmación» sea barato y esté bien definido: no hay consecuencias derivadas que perseguir, porque el sistema nunca derivó nada. El precio es simétrico: tampoco detecta incompatibilidades salvo entre afirmaciones con sujeto y relación exactos.

## El segundo eje: validez frente a transacción

AGM tiene un eje. Las bases de datos temporales tienen dos, con los nombres asentados desde hace décadas. Jensen, Snodgrass y Soo los definen en el capítulo del modelo TSQL2: «*Valid time* concerns the time when a fact is true in reality» frente a «*Transaction time* concerns the time the fact was present in the database as stored data». Y añaden lo que impide que sean redundantes: «Note that these two time dimensions are orthogonal».

Con los dos ejes, las tres razones de salida dejan de ser indistinguibles. *El mundo cambió* es un movimiento en tiempo de validez: se cierra el intervalo de verdad y el registro sigue siendo cierto sobre su intervalo. *Nos equivocamos* es un movimiento en tiempo de transacción: el sistema deja de creerlo, sin afirmar nada nuevo sobre el mundo. Un hecho falso del pasado sigue siendo cierto como hecho histórico porque el eje de transacción lo registra: «entre enero y marzo este sistema creyó X» es una verdad sobre el sistema, y no la invalida que X fuera falso. De ahí que la auditoría exija no borrar, y que el eje de transacción sea de solo-añadir: «As the database state evolves, transaction times grow monotonically, and successive transactions have successive transaction times associated». Reescribirlo es falsificar el registro de lo que se creyó.

El diseño de ALLAN toma el modelo de cuatro sellos de Zep/Graphiti: «Consistent with our bi-temporal modeling approach, the system tracks four timestamps: t′created and t′expired ∈ T′ monitor when facts are created or invalidated in the system, while tvalid and tinvalid ∈ T track the temporal range during which facts held true». Su mecanismo de invalidación es preciso en un detalle que resultará importante: «When the system identifies temporally overlapping contradictions, it invalidates the affected edges by setting their tinvalid to the tvalid of the invalidating edge». El instante en que el mundo cambió es aquel en que empieza a valer el hecho nuevo, no aquel en que corre el proceso.

Una tercera frase del mismo artículo marca la diferencia entre tener dos ejes y usarlos: «The system extracts temporal information about facts from the episode context using tref. This enables accurate extraction and datetime representation of both absolute timestamps (e.g., "Alan Turing was born on June 23, 1912") and relative timestamps (e.g., "I started my new job two weeks ago")». Sin ese paso, el eje de validez existe en el esquema y está vacío.

## Lo que ALLAN hace hoy

La estructura está en el tipo. `Edge` lleva los cuatro sellos y el comentario que los ordena —«TValid / TInvalid when the fact was true IN THE WORLD», «TCreated / TExpired when the SYSTEM believed it», «we never delete a fact»— en `graph_model.go:140-169`. El predicado de lectura `EdgeValidAt` (`graph_model.go:186-194`) exige las dos condiciones: que el sistema siga creyéndolo y que siga siendo cierto. La causa de salida es un campo con tres valores, ninguno vacío por accidente: `contradiction`, `decay`, `manual` (`graph_model.go:92-96`).

**Expansión.** El camino de escritura es `applyFact` (`consolidation.go:356-423`). Un hecho cuyo (sujeto, relación) no tiene aristas vigentes, o las tiene hacia otros objetos con relación acumulativa, produce una arista nueva. Uno idéntico a otro vigente no duplica: refuerza la confianza y añade el episodio como evidencia (`consolidation.go:427-438`). Es expansión con puerta de novedad, no ciega.

**Revisión.** Aquí está la decisión más interesante del subsistema, y no está donde uno la buscaría. AGM resuelve la revisión con una función de selección que elige, entre los subconjuntos maximales que no implican lo que se retira, los «most important»; de esa elección depende todo. ALLAN no computa nada de eso. El extractor declara, por cada hecho, si la relación admite un solo objeto vigente: el campo `Singular` (`extraction.go:28-35`), «a property of the fact's meaning, decided without needing prior graph state» (`extraction.go:26-27`), y en el prompt: «"singular" es una propiedad del significado de la relación, no del estado previo» (`extraction.go:91`). Con esa bandera la revisión se reduce a una regla local: si el hecho es singular, toda arista vigente del mismo sujeto y relación hacia otro objeto se invalida por contradicción, y la nueva nace vigente (`consolidation.go:390-401`). La función de selección de AGM se ha sustituido por una declaración de cardinalidad. Es una aproximación pobre —no ve incompatibilidades entre relaciones distintas ni entre sinónimos, porque la comparación exige el `string` exacto (`consolidation.go:371`)— pero es determinista, testable sin *embeddings* y no consulta el grafo para decidir.

**Contracción.** En la memoria de agente no existe. La constante `ExpiredByManual` está declarada (`graph_model.go:95`) y sus dos únicas apariciones son valores por defecto dentro de los almacenes, para cuando el llamante no da motivo (`graph_store_memory.go:170-171`, `graph_store_dfly.go:276-277`); nadie la pasa. Los dos usos reales de `InvalidateEdge` son la contradicción (`consolidation.go:395`) y el decaimiento (`maintenance.go:148`). Las cuatro herramientas de memoria expuestas al agente —`memory/query`, `memory/propose`, `memory/promote`, `memory/recall` (`internal/app/tenant_mcp.go:37-40`)— no retiran nada.

Donde sí existe es en la capa colectiva. `CollectiveCurationService` implementa tres operaciones y explica por qué (`Responses API/responses_api/cmem/curation.py:1-32`): la capa colectiva se inyecta en cada conversación del tenant, así que un hecho equivocado se sigue diciendo hasta que algo lo contradiga, y puede que nunca llegue. `retract` marca el registro con `expired_by=manual` y lo deja como lápida (`curation.py:74-101`). `correct` escribe el sustituto heredando la corroboración pero no el *embedding* viejo, «which describes the old wording and would misplace the new one in every similarity comparison from here on» (`curation.py:103-190`). `restore` deshace la retirada: «Without this, every correction would be a one-way door, which is the same defect in a mirror» (`curation.py:18-19`).

`restore` es, casi literalmente, el postulado de recuperación. Y `retract` es más que una contracción AGM: la lápida añade una creencia de segundo orden —«esto no debe decirse»— que el sistema consulta antes de volver a promover. La razón está escrita: la corroboración que promovió el hecho sigue en las particiones privadas, así que la siguiente pasada derivaría el mismo identificador direccionado por contenido y desharía la corrección (`docs/arquitectura/collective-memory-design.md:250-258`). Por eso el consenso comprueba la retirada **por similitud, no por identificador**: «an extractor that rewords the same claim would otherwise walk straight around the retraction» (`cmem/store.py:122-150`; el bloqueo, en `consensus.py:395-418`). En AGM esto no se puede expresar: el lenguaje no tiene forma de decir «y no lo vuelvas a meter».

La memoria organizacional tiene su propia contracción, y es la única parte del sistema que separa de verdad los dos ejes. `reject` marca `t_expired` y `expired_by=review`, y **no toca** `t_invalid` (`Org Memory/org_memory/services/curation.py:138-148`): una propuesta rechazada nunca fue norma, así que el sistema deja de creerla sin afirmar que el mundo cambió. `supersede` marca los dos, porque una norma sustituida sí dejó de regir en un instante (`curation.py:167-181`). El esquema lo declara: «Nothing is ever deleted: invalidate and supersede» (`db/models.py:15-18`).

## El conflicto que no se normaliza

Cuando dos fuentes se contradicen, la tentación es fusionar. La regla de Dempster hace eso, y su punto débil está documentado desde hace cuarenta años. Sentz y Ferson lo describen sin rodeos: «The denominator in Dempster's rule, 1-K, is a normalization factor. This has the effect of *completely* ignoring conflict and attributing any probability mass associated with conflict to the null set». En el contraejemplo clásico, un médico da meningitis con 0,99 o tumor cerebral con 0,01, y el otro conmoción con 0,99 o tumor cerebral con 0,01; la regla concluye tumor cerebral con certeza. «Clearly, this rule of combination yields a result that implies complete support for a diagnosis that both physicians considered to be very unlikely». La lectura correcta no es «Dempster está mal», sino que el desacuerdo es información y desaparece al normalizar; los mismos autores llaman a la alternativa de Yager «an epistemologically honest interpretation of the evidence as it does not change the evidence by normalizing out the conflict».

ALLAN no normaliza el conflicto en ninguna de sus tres capas, y por tres razones distintas.

En la capa colectiva, la contradicción entre agentes se resuelve por recencia en tiempo de mundo —gana el `t_valid` más reciente (`consensus.py:269-302`)— pero el lado perdedor no desaparece: se emite un evento de discrepancia y **las particiones privadas no se tocan** (`consensus.py:463-490`). Cada agente conserva su creencia: «la contradicción entre agentes es señal, no ruido» (`collective-memory-design.md:216-222`).

En la memoria organizacional la negativa es más fuerte. El módulo de conflictos abre con tres reglas y la primera es: «The platform never picks a winner. Two norms in conflict are a business problem; resolving it by recency (the way collective memory resolves contradictions between agents) would be the platform inventing policy» (`Org Memory/org_memory/services/conflicts.py:11-13`). El conflicto se materializa como fila con ciclo de vida, y `dismissed` es un resultado legítimo: «two rules can look contradictory to a signature comparison and be perfectly compatible in the business» (`conflicts.py:39-42`). En la misma línea, la compuerta de cumplimiento devuelve advertencia y nunca veto, porque «un veto sobre el juicio de un modelo sería peor que el incumplimiento que vigila» (`docs/memoria-organizacional/organizational-memory-design.md:153-160`).

Y en el juez de consenso la abstención es explícita: su prompt lo limita a agrupar, canonizar y clasificar, y termina con «No juzgues si un hecho es verdadero: solo estructura» (`cmem/judge.py:51`). Dice qué enunciados hablan de lo mismo; nunca cuál es cierto.

## Decaimiento y la paradoja del hecho estable

La otra vía de salida es el olvido. MemoryBank es el referente conocido: incorpora «a memory updating mechanism, inspired by the Ebbinghaus Forgetting Curve theory, which permits the AI to forget and reinforce memory based on time elapsed and the relative significance of the memory». Decaer por tiempo transcurrido falla enseguida en un asistente de trabajo: los hechos más estables son los que menos se repiten. Nadie vuelve a decir su nombre, ni el idioma en que quiere que le respondan, ni que trabaja en Bilbao. El decaimiento por edad castiga lo correcto y perdona lo volátil, porque lo volátil se re-enuncia.

ALLAN corrige esto con otra señal: exime a los hechos que la lectura ha renderizado recientemente en un prompt. `Edge.LastRetrievedAt` se sella al leer, y el comentario dice para qué: «"decae lo no usado" means not-injected — not merely not-restated in conversation» (`graph_model.go:164-168`; la exención, `maintenance.go:138-145`). Por defecto, dos puntos de confianza por pasada y siete días de gracia desde que el hecho nace; la ventana de uso hereda ese valor salvo configuración explícita (`maintenance.go:53-59`). Un hecho estable que el agente sigue recordando no se apaga nunca; uno que nadie usa se apaga en semanas.

La capa colectiva añade una regla más dura: «la capa colectiva nunca sobrevive a su evidencia» (`collective-memory-design.md:232-236`). Si todas las aristas de origen salieron del conjunto vigente, el hecho colectivo se invalida por decaimiento (`consensus.py:530-556`). La retirada humana es lo único que el consenso se niega a deshacer; el resto vuelve si vuelve la evidencia.

## Invariantes, enunciados de forma falsable

Lo que sigue puede comprobarse ejecutando el sistema, y su negación es un defecto, no una opinión.

Ningún camino del código borra aristas ni hechos colectivos: toda salida del conjunto vigente pasa por `InvalidateEdge` o por una copia con `t_invalid`/`t_expired`, siempre con causa (`graph_model.go:92-96`, `cmem/models.py:20-30`). Un hecho invalidado no llega nunca al prompt como verdad presente: la pata de aristas fija `ValidOnly` incondicionalmente (`retrieval.go:193`) y la colectiva filtra por `ValidAt` antes de puntuar (`collective.go:118`); la memoria organizacional exige además estado `approved` y ambos sellos nulos (`services/search.py:183-185`).

La retirada humana gana al consenso y se comprueba por similitud: reformular la frase retirada no la resucita (`cmem/store.py:122-150`). Solo se deshace lo que fue retirado, no lo que el algoritmo invalidó: `restore` rechaza todo hecho cuyo `expired_by` no sea `manual` (`curation.py:199-205`), y rechaza revivir uno cuyo sustituto sigue vigente, para que un «deshacer» no ponga dos enunciados contradictorios en circulación (`curation.py:206-217`). Las particiones privadas no se tocan nunca: ni por contradicción entre agentes ni por retirada humana (`consensus.py:473-476`, `curation.py:28-31`).

## Lo que está roto, sin terminar o sin evidencia

**La bitemporalidad es degenerada, en el sentido técnico del término.** El capítulo de TSQL2 nombra el caso: «In such a *specialized* bitemporal database, termed *degenerate* [15], the valid and transaction times of a fact are identical». Es lo que ALLAN implementa hoy. Toda arista nace con `TValid: now, TCreated: now` (`consolidation.go:412-413`), porque el extractor no produce fechas: `ExtractedFact` no tiene campo temporal y el prompt no lo pide (`extraction.go:28-35`, `:68-91`) — la contrapartida exacta del paso que Zep sí da. Y `InvalidateEdge` sella los dos ejes con el mismo instante en los dos *backends* (`graph_store_memory.go:168-169`, `graph_store_dfly.go:274-275`). La memoria organizacional está igual: los tres puntos que escriben `t_valid` (`Org Memory/org_memory/services/curation.py:117-118`, `:335`, `services/worldmodel.py:283`) estampan `utcnow()`, ninguno acepta fecha del llamante, y el esquema de petición que tiene el campo (`api/schemas.py:454`) solo lo usa para devolverlo. No hay ruta alguna, en las tres capas, para declarar «esto fue cierto de enero a junio».

Tampoco hay consulta *as-of*. El instante de referencia está cableado de punta a punta —`RetrieveInput.At`, `EdgeValidAt(at)`, `is_valid_at(at)`— pero el único constructor de `RetrieveInput` no lo rellena nunca (`internal/app/memory_v2.go:128-133`), así que cae a `time.Now()` (`retrieval.go:126-128`).

Esto invalida una promesa explícita del diseño: «Como se invalida sin borrar, las consultas temporales pueden recuperar deliberadamente hechos históricos con sus fechas ("plan X, válido de enero a junio de 2026") — el agente distingue "lo que es" de "lo que fue"» (`docs/arquitectura/agent-memory-v2-design.md:118-123`). Hoy no puede hacer esa consulta. Quien sí lee la lápida es el inspector de la capa colectiva, que expone `include_invalid` y cuenta los retirados por usuario (`cmem/service.py:31-33`, `:82-93`); en la memoria de agente no hay equivalente. Lo único que llega al prompt es el «(desde 2026-01)» que `renderFact` añade a los hechos vigentes (`retrieval.go:363-371`), y esa fecha es la de ingesta, no la del mundo; Zep, con el mismo modelo de datos, renderiza «FACT (Date range: from - to)».

**El decaimiento escribe en el eje equivocado.** Cuando la confianza llega a cero, el trabajo nocturno invalida el hecho con `ExpiredByDecay` (`maintenance.go:146-154`), y `InvalidateEdge` estampa también `TInvalid`: el registro afirma que el mundo cambió la noche en que corrió el mantenimiento. Nadie hizo esa afirmación. Decaer es una declaración sobre la creencia del sistema —eje de transacción— y debería dejar `TInvalid` intacto. El mismo defecto está en la capa colectiva, en otro lenguaje: la invalidación por evidencia agotada escribe `t_invalid` y `t_expired` con el mismo `now` (`consensus.py:544`). Con el eje de validez degenerado no se observa; en cuanto se implemente la extracción temporal, cada hecho decaído mentirá sobre el mundo. La corrección es dar a `InvalidateEdge` la capacidad de expirar sin invalidar, que es lo que `reject` ya hace en la memoria organizacional.

Hay una segunda consecuencia del colapso, menos visible y peor: el decaimiento mide la antigüedad desde `TValid`, no desde `TCreated` (`maintenance.go:134`). Mientras los dos sellos coincidan es indistinguible; el día que el extractor sepa fechar el mundo, un hecho recién aprendido pero válido desde 2020 nacerá con trece años de antigüedad y podrá decaer en la primera pasada. El mecanismo correcto ya existe en la capa colectiva: la promoción hereda el `t_valid` más reciente de sus fuentes en lugar de estampar la hora del proceso (`consensus.py:434`). Esa línea es hoy inerte porque las fuentes son degeneradas, pero está escrita.

**`restore` reescribe el tiempo de transacción.** Al deshacer una retirada, el registro vuelve con `t_invalid=None` y `t_expired=None` (`curation.py:218-229`): que entre el martes y el jueves el sistema no creyera ese enunciado desaparece, y `curated_by`/`curated_at` quedan sobrescritos por el último actor. Contra la monotonía que cita TSQL2, «¿qué se le estaba diciendo al tenant el miércoles?» deja de tener respuesta. La lápida se defendió con el argumento de la auditoría y `restore` la borra.

**No hay contracción en la memoria de agente.** Es la brecha más grande. Un usuario puede pedir «olvida que dije eso» y no hay camino que lo cumpla: ninguna herramienta, ningún *endpoint*, ningún llamante de `ExpiredByManual`. La única salida es esperar a que decaiga o a que una afirmación singular lo desplace. Un detalle explica cómo se llegó aquí: el motor conserva un sustrato anterior, el `DragonflyLayerStore`, cuya interfaz sí tiene retirada (`internal/memory/store.go:19-24`). De las cuatro herramientas MCP, `memory/query` y `memory/propose` fueron recableadas al grafo v2 (`tenant_mcp.go:180-183`, `:192-195`), pero `memory/promote` sigue escribiendo en el sustrato viejo (`internal/app/app.go:4235-4239`), que la ruta de lectura del turno ya no consulta. La única contracción del motor —`Expire`— vive en ese sustrato abandonado y solo es alcanzable desde la línea de comandos (`cmd/allan/main.go:249`). No se descartó: se quedó en el lado equivocado de una migración.

**La retirada colectiva tiene un agujero por debajo.** `curation.py:28-31` es explícito: retirar un hecho colectivo dice «al tenant no se le debe decir esto», no «ningún agente lo creyó nunca». Pero la ruta de lectura mezcla la pata privada y la colectiva en una sola lista ordenada, deduplicando por similitud ≥0,90 (`retrieval.go:399`, `:462-487`), y la pata privada no sabe nada de retiradas. Consecuencia comprobable: retire un hecho colectivo cuyas aristas de origen sigan vigentes en alguna partición privada y el mismo enunciado seguirá inyectándose por la vía privada, indistinguible. La corrección humana funciona a medias, y a medias es peor que no funcionar, porque el curador cree haber cerrado el asunto.

**Consenso no es conocimiento, y ALLAN no marca la diferencia.** Conviene ser preciso con el vocabulario, porque la lógica epistémica lleva décadas con estas distinciones cerradas. Fagin, Halpern, Moses y Vardi fijan la frontera entre creer y saber: «This property, occasionally called the *Knowledge Axiom* or the *Truth Axiom* (for knowledge), has been taken by philosophers to be the major one distinguishing knowledge from *belief*. Although you may have false beliefs, you cannot know something that is false». Y Gettier mostró que ni siquiera la creencia verdadera y justificada basta: «I shall argue that (a) is false in that the conditions stated therein do not constitute a *sufficient* condition for the truth of the proposition that S knows that P», apoyándose en que «it is possible for a person to be justified in believing a proposition that is in fact false».

ALLAN llama «hecho» a todo. Una aserción del usuario, una arista con confianza 62 y un enunciado corroborado por dos agentes en dos sesiones se renderizan igual, y el digest colectivo se inyecta «rendered indistinguishably from the private one — the transparency the design asks for» (`retrieval.go:380-383`). La confianza 0-100 no es justificación: es un contador que sube al reforzar y baja al decaer. La corroboración es evidencia sobre agentes, no sobre el mundo.

Hay además un error de nombre que conviene no cometer. La capa colectiva no implementa conocimiento distribuido: «A group G has distributed knowledge of φ if the "combined" knowledge of the members of G implies φ», y la combinación se hace «by *intersecting* the sets of worlds that each of the agents in the group considers possible», de modo que el grupo concluye lo que ningún miembro concluye por separado — «knowledge that is distributed among the members of the group, without any individual agent necessarily having it». CMEM hace lo contrario: solo promueve enunciados que **al menos dos agentes ya sostenían por separado** (`cmem/config.py:32-36`). Es corroboración, no combinación, y por construcción no deriva nada nuevo. La decisión es defendible —derivar sería juzgar verdad— pero llamarla conocimiento del grupo sería inexacto. Y el conocimiento común, el estado que haría fuerte un «todos los agentes coinciden», es inalcanzable de todos modos: «We show that when communication is not guaranteed it is impossible to attain common knowledge».

La distinción que falta es de tres niveles: lo que alguien **afirmó** (con quién, cuándo, en qué sesión), lo que el sistema **cree con justificación** (evidencia trazable, umbral declarado) y lo que puede presentarse como **sabido**. Hoy los tres se rinden como una lista plana de frases fechadas. Nada lo impide —la procedencia está ahí, en `Evidence`, en `Corroboration`, en `curated_by`— pero nada la usa en el momento en que importa: cuando el texto entra en el prompt.

## Referencias

- Alchourrón, C. E., Gärdenfors, P. y Makinson, D. (1985). *On the Logic of Theory Change: Partial Meet Contraction and Revision Functions*. The Journal of Symbolic Logic 50(2), 510-530. <http://fitelson.org/piksi/piksi_22/agm.pdf> — «The simplest and best known form of theory change is *expansion*, where a new proposition (axiom), hopefully consistent with a given theory A, is set-theoretically added to A, and this expanded set is then closed under logical consequence.»; «One form is theory *contraction*, where a proposition x, which was earlier in a theory A, is rejected.»; «Another kind of change is *revision*, where a proposition x, inconsistent with a given theory A, is added to A under the requirement that the revised theory be consistent and closed under logical consequence.»; «the revision of A by x, denoted A + x, can be defined as Cn((A ÷ ¬x) ∪ {x}), where Cn is a given consequence operation.»; «(÷2) A ÷ x ⊆ A (inclusion).»; «(÷3) If x ∉ Cn(A), then A ÷ x = A (vacuity).»; «(÷6) A ⊆ Cn((A ÷ x) ∪ {x}) whenever A is a theory (recovery).»; «The intuitive idea is that the selection function γ picks out those elements in A ⊥ x which are "most important"».

- Hansson, S. O. *Logic of Belief Revision*. Stanford Encyclopedia of Philosophy. <https://plato.stanford.edu/entries/logic-belief-revision/> — «The epistemic agent should give up beliefs only when forced to do so, and should then give up as few of them as possible.»; «A belief base is a set of sentences that is not (except as a limiting case) closed under logical consequence.»

- Jensen, C. S., Snodgrass, R. T. y Soo, M. D. (1995). *The TSQL2 Data Model*, cap. 12 de *The TSQL2 Temporal Query Language*. <https://people.cs.aau.dk/~csj/Thesis/pdf/chapter12.pdf> — «*Valid time* concerns the time when a fact is true in reality.»; «*Transaction time* concerns the time the fact was present in the database as stored data.»; «Note that these two time dimensions are orthogonal.»; «As the database state evolves, transaction times grow monotonically, and successive transactions have successive transaction times associated.»; «In such a *specialized* bitemporal database, termed *degenerate* [15], the valid and transaction times of a fact are identical.»

- Rasmussen, P. et al. (2025). *Zep: A Temporal Knowledge Graph Architecture for Agent Memory*. arXiv:2501.13956. <https://arxiv.org/pdf/2501.13956> — «Consistent with our bi-temporal modeling approach, the system tracks four timestamps: t′created and t′expired ∈ T′ monitor when facts are created or invalidated in the system, while tvalid and tinvalid ∈ T track the temporal range during which facts held true.»; «When the system identifies temporally overlapping contradictions, it invalidates the affected edges by setting their tinvalid to the tvalid of the invalidating edge.»; «The system extracts temporal information about facts from the episode context using tref. This enables accurate extraction and datetime representation of both absolute timestamps (e.g., "Alan Turing was born on June 23, 1912") and relative timestamps (e.g., "I started my new job two weeks ago").»; plantilla de contexto: «These are the most relevant facts and their valid date ranges.» / «format: FACT (Date range: from - to)».

- Fagin, R., Halpern, J. Y., Moses, Y. y Vardi, M. Y. (1995). *Reasoning About Knowledge*. MIT Press. <https://www.cs.rice.edu/~vardi/papers/book.pdf> — p. 32: «This property, occasionally called the *Knowledge Axiom* or the *Truth Axiom* (for knowledge), has been taken by philosophers to be the major one distinguishing knowledge from *belief*. Although you may have false beliefs, you cannot know something that is false.»; p. 24: «A group G has distributed knowledge of φ if the "combined" knowledge of the members of G implies φ.»; p. 24: «In general, we combine the knowledge of the agents in group G by eliminating all worlds that some agent in G considers impossible. Technically, this is accomplished by *intersecting* the sets of worlds that each of the agents in the group considers possible.»

- Halpern, J. Y. y Moses, Y. (1990). *Knowledge and Common Knowledge in a Distributed Environment*. Journal of the ACM 37(3), 549-587 (versión revisada, arXiv:cs/0006009). <https://arxiv.org/pdf/cs/0006009> — «The weakest state of knowledge we discuss is *distributed knowledge*, which corresponds to knowledge that is distributed among the members of the group, without any individual agent necessarily having it.»; «We show that when communication is not guaranteed it is impossible to attain common knowledge.»

- Gettier, E. L. (1963). *Is Justified True Belief Knowledge?* Analysis 23(6), 121-123. <https://courses.physics.illinois.edu/phys419/sp2021/Gettier.pdf> — «I shall argue that (a) is false in that the conditions stated therein do not constitute a *sufficient* condition for the truth of the proposition that S knows that P.»; «it is possible for a person to be justified in believing a proposition that is in fact false.»

- Sentz, K. y Ferson, S. (2002). *Combination of Evidence in Dempster-Shafer Theory*. SAND2002-0835, Sandia National Laboratories. <https://www.stat.berkeley.edu/~aldous/Real_World/dempster_shafer.pdf> — p. 17: «The denominator in Dempster's rule, 1-K, is a normalization factor. This has the effect of *completely* ignoring conflict and attributing any probability mass associated with conflict to the null set.»; p. 17: «Clearly, this rule of combination yields a result that implies complete support for a diagnosis that both physicians considered to be very unlikely.»; p. 19: «Yager's rule can be considered as an epistemologically honest interpretation of the evidence as it does not change the evidence by normalizing out the conflict.»

- Zhong, W., Guo, L., Gao, Q., Ye, H. y Wang, Y. (2023). *MemoryBank: Enhancing Large Language Models with Long-Term Memory*. arXiv:2305.10250. <https://arxiv.org/abs/2305.10250> — «MemoryBank incorporates a memory updating mechanism, inspired by the Ebbinghaus Forgetting Curve theory, which permits the AI to forget and reinforce memory based on time elapsed and the relative significance of the memory, thereby offering a human-like memory mechanism.»

- **NO VERIFICADA** — Zadeh, L. A. (1984). *Review of «A Mathematical Theory of Evidence»*. AI Magazine 5(3). Se intentó recuperar en esta sesión por dos vías y ninguna devolvió texto: la *galley* abierta de AAAI (<https://ojs.aaai.org/aimagazine/index.php/aimagazine/article/view/452/388>) responde con cuerpo vacío —cero bytes— tras redirigir a su URL de descarga, y las copias de Wiley y ACM están tras pago. Lo mismo ocurre con el artículo posterior de 1986 (*A Simple View of the Dempster-Shafer Theory…*, AI Magazine 7(2)). En consecuencia, el contraejemplo de los dos médicos y las cifras 0,99/0,01 se toman **exclusivamente** de Sentz y Ferson (2002), p. 17, que sí se recuperó y que atribuye el hallazgo así: «The problem with conflicting evidence and Dempster's rule was originally pointed out by Lotfi Zadeh in his review of Shafer's book, *A Mathematical Theory of Evidence* [Zadeh, 1984]», citando «[Zadeh, 1984, p.82]». Zadeh no se usa como fuente independiente en el cuerpo del ensayo, y ninguna afirmación depende de haber leído su original.
