tl;dr
Memory is not a fact-candidate factory. It is its own layer. Only claims that survive long enough — with reinforcement, and only on ecological topics — may later be proposed manually to the verification pipeline. This page is the map.
the shape
Episode → Memory — lives here, gets reinforced or decays, most just fade.
↓ only if it survives long enough
Fact candidate → real verification pipeline (create_candidate_fact → submit_verification) → Fact.
Memory is mutable, drifting, personal. Fact is hash-sealed, multi-pass verified, load-bearing. They live in different worlds and speak through a narrow, manual bridge.
phases
Phase 1 — separate memory from fact shipped 2026-07-28
- Added
Mem_Config { BRIDGE_ENABLED: false }. - Gated
nominate()andapprove_candidate()withBridgeRetired. - 1004 existing candidates preserved as historical data; nothing deleted.
- Rollback: flip
BRIDGE_ENABLEDtotrue. One click, no code change.
Phase 2 — wire the middle hop shipped 2026-07-28
The harvester now extracts :Mem_Fact from every episode via qwen2.5:14b on
local Ollama. Enforce mode is on, timer runs hourly, ~2,100 facts. All 10 agents have
ECOAGENT_MEMORY_PROVIDER=neo4j set; Neo4jMemoryProvider is live
and every narrator run prepends a memory block to its user message.
- Cafe Discourse ingestion — live (harvester timer).
- Recall wiring — 10/10 agents.
- Hermes ingestion — deferred; still returns nothing from that source.
Phase 3 — trigger + confidence lever shipped 2026-07-28
Memory is now a living scalar (Prism-style). Live components:
- Reinforce: every successful
recall()hit fires an asymptotic impulse (Δ = α × (ceiling − current), α=0.15, ceiling=1.0). Daily-idempotent per(mem_fact_id, source, day)via:Mem_ReinforceEventMERGE. - Bi-temporal: every
:Mem_Factnow carriesvalid_from,invalidated_at,last_reinforced_at,reinforce_count. Live queries filterinvalidated_at IS NULL. Supersede-not-overwrite. - Decay sweep:
ecoagent-memory-decay.timerruns daily at 03:00 UTC. Exponential decay with half-life 4 weeks, 3-day grace, floor 0.1. Below 0.2 → soft archive (never deleted). Facts withconsensus_score ≥ 0.75are skipped (external corroboration overrides internal-use signal). - Gate: decay stays OFF until
DECAY_ENABLEDis flipped on (safe default — no memories rot until you say so).
Phase 4 — ecology-scoped manual promotion next
Only ripe memories (survived decay + reinforced N times) on ecological topics may be proposed. Not automatic. Not LLM-driven. A session-level human action.
- Ripe = alive in memory ≥ N days AND reinforce_count ≥ K.
- Ecology filter: predicate/subject must resolve to an ecological entity (species, watercourse, biome…).
- On push, the claim enters the real verification pipeline from the top — no shortcut.
modules borrowed from
- Prism (ProsusAI) — reinforce/decay math, push vs pull channel split.
- Graphiti (getzep) — bi-temporal validity, superseded-not-deleted contradiction model.
- Letta (fka MemGPT) — the three-scope split (episodic / semantic / procedural).
- Mem0 — single-pass ADD-only extraction pattern (opposite of our current heavy triage).
full document
The complete plan lives in the repo as eco-memory-triggers-and-confidence-plan.md.
A copy is served at: