How high order memories such as insights, semantic facts, procedural skills are consumed? #633
-
|
Hello all,
|
Beta Was this translation helpful? Give feedback.
Replies: 6 comments 1 reply
-
|
Have about the same questions. I'm also new to agentmemory and there is a lack of information across the internet. I ran a couple of sessions but memories/crystals/lessons and so on are 0. Only function calls and token savings are updated. Should we instruct the model in any way to use agentmemory? Thank you. |
Beta Was this translation helpful? Give feedback.
-
|
@veyselberk @alxjzx100 — thanks for the careful read. Honest answers, one by one. 1. Where higher-order memories are consumedYou're right that there's a gap here. Today,
It does not currently read semantic facts ( This is a real bug, not a missing config. Filing it now — should ship in v0.9.25. The right cut is: small ranked block of high-confidence semantic facts + relevant crystals + active procedural triggers at the top of the context, sized so it fits in budget. 2.
|
Beta Was this translation helpful? Give feedback.
-
|
@alxjzx100, that's the bottom-up gate problem, not a v0.9.24 regression. Each tier has a minimum-count gate:
Graph populates first because it's per-observation. No gates there. A fresh install with 2 sessions and zero Quick triage:
Filing a tracking issue for UI: each tab should show why it's empty ( |
Beta Was this translation helpful? Give feedback.
-
|
Useful thread. One debug surface I’d add when the high-order memory path lands: a tiny “memory consumption receipt” for each injected context block. Not enforcement, just a low-cardinality trace that separates three failure modes users are already mixing together:
A minimal shape could be something like: {
"receipt_type": "agentmemory.memory_consumption_receipt.v1",
"source": "SessionStart|PreCompact|manual_recall|bridge_sync",
"budget_tokens": 1800,
"candidate_counts": { "lessons": 10, "facts": 24, "crystals": 3, "procedural": 2 },
"injected_counts": { "lessons": 5, "facts": 6, "crystals": 1, "procedural": 1 },
"withheld_reasons": ["below_confidence", "over_budget", "duplicate_bridge_memory"],
"acknowledged_before_plan": ["fact:api-auth-refresh", "lesson:db-migration-order"],
"unreferenced_before_first_edit": ["crystal:legacy-cache-policy"]
}The key is: don’t log raw memory text in the receipt. Just ids/types/counts/reasons. That gives users a way to tell whether “memory didn’t work” means retrieval/consolidation failed, injection/budgeting failed, or the agent simply didn’t attend to what was injected. This would also make the bridge-vs-hook duplication answer much easier to verify in practice. |
Beta Was this translation helpful? Give feedback.
-
|
The three failure modes @caioribeiroclw-pixel identified — dark memory (exists but not injected), ignored memory (injected but not referenced), hallucinated memory (referenced but fabricated) — are exactly the right decomposition. Most memory systems only solve for storage and retrieval, not for the feedback loop between "what was retrieved" and "what actually influenced the output." Two patterns from production that address the gap between "memories exist" and "memories influence behavior": 1. Access-frequency reinforcement: Every time a memory is successfully recalled AND the agent's output references it (detectable via simple substring or embedding similarity check), bump the memory's importance score. Memories that are recalled but never influence outputs are functionally dark — they take up retrieval slots without adding value. Decaying their importance naturally pushes them below the retrieval threshold over time, making room for memories that actually get used. 2. Consolidation with provenance: Rather than waiting for magical crystals/lessons to emerge, explicitly trigger consolidation passes that merge related low-level observations into higher-order summaries. The key is keeping provenance: the consolidated summary links back to its source memories, so you can trace WHY a summary exists and validate it against the originals if needed. The "memory consumption receipt" idea is the right direction for observability. We track this as importance score + access count + last_accessed_at per memory — the combination tells you whether a memory is alive (high importance, recently accessed), stale (decayed importance, old access), or dark (never accessed despite being stored at high importance). Python example showing the store → recall → analytics loop: https://github.com/Dakera-AI/dakera-py/blob/main/examples/analytics.py |
Beta Was this translation helpful? Give feedback.
-
|
I've moved my prior comment to its own thread (#980) since it's likely tangential, and I also don't want to hijack this thread besides. 😄 |
Beta Was this translation helpful? Give feedback.
@veyselberk @alxjzx100 — thanks for the careful read. Honest answers, one by one.
1. Where higher-order memories are consumed
You're right that there's a gap here. Today,
mem::context(the function theSessionStart/PreCompacthooks call to build the injected context block) reads:1.5 × confidenceif project-scoped else1.0 × confidence, top 10)It does not currently read semantic facts (
KV.semantic), procedural skills (KV.procedural), crystals (KV.crystals), insights (KV.insights),…