You’re building an agentic system. Code flows through your pipelines, tasks complete, and then… your agent forgets everything tomorrow. Sound familiar? That’s where OpenClaw’s three-tier memory system comes in, and honestly, it’s the unsung hero of sustainable AI agent architecture.
Here’s the thing: memory in agent systems isn’t one size fits all. You need durable decision records, session-specific context, and immediate working memory—all operating at different timescales. OpenClaw solves this elegantly with a tiered approach that feels almost obvious once you see it working. Let’s dig in.
Why Memory Matters in Agent Systems
Before we break down the tiers, let’s establish why this even matters. Traditional applications have databases. Human teams have institutional knowledge. Agents? They get a context window that resets. Without proper memory architecture, every conversation starts from zero, every decision repeats, and you’re paying token costs for context you should only pay once.
Here’s the real cost of forgetting: imagine your agent is helping with a codebase. Day 1, it spends 2,000 tokens learning the repository structure. Day 2, it spends another 2,000 tokens re-learning the same facts. Day 5? Another 2,000 tokens. Over a month, you’re burning 40,000+ tokens on repetitive context loading. That’s money. More importantly, it’s latency. Your agent spends time re-understanding instead of solving problems.
This isn’t just theoretical waste. Think about what happens in practice: your agent gets asked the same architectural question three times in a week because it never wrote the answer down. A human team member would write a wiki entry. Your agent? It re-thinks from first principles every single time. Or worse, it hallucinates slightly different answers because it’s reconstructing context from hints instead of reading established fact.
The economic argument is compelling. But the practical argument is stronger: without memory, agents can’t genuinely learn. They can’t improve over time. They can’t develop institutional understanding. They’re smart within a conversation but amnesiac between conversations. That’s not just inefficient—it’s fundamentally limiting.
OpenClaw’s three-tier system is designed to solve this across different temporal scales:
- Long-term memory (MEMORY.md) handles facts and decisions that shouldn’t change—stable across weeks and months
- Daily logs (memory/YYYY-MM-DD.md) capture session-specific learnings and state—relevant for days or weeks
- Context window (system prompt + conversation) manages immediate conversational state and runtime decisions—active only for this session
The clever part? They work together. Your context window pulls from the other two, avoiding redundancy while maintaining accessibility. You’re not reloading MEMORY.md every message (that would be wasteful). You’re loading it once per session, extracting what matters, and keeping it in focus. Daily logs stay searchable but compressed. The conversation itself stays fresh and immediate.
Think of it like an office filing system. Long-term memory is the filing cabinet—pull from it once per day, extract what you need. Daily logs are your desk—active workspace, cleaned up weekly. Context window is your laptop—immediate, fast, but can’t hold everything. The efficiency comes from knowing which information lives where and pulling it at the right time.
Here’s where it gets sophisticated: the three tiers aren’t just storage locations. They’re temporal abstractions. MEMORY.md contains facts that are true across weeks and months. Daily logs capture things that matter right now but will become historical. Context window is the immediate working space. This temporal separation is what lets your memory system stay lean. You’re not forcing current session context to live in a filing cabinet where it’ll decay. You’re not storing temporary decisions in permanent memory where they’ll clutter future sessions. Everything lives where it makes sense for how quickly it changes.
This layering also protects against a common mistake: treating memory as infinite storage. It’s not. Context windows are bounded. Daily logs should rotate. Even MEMORY.md should be maintained—outdated facts need to be replaced or marked as archived. The three tiers force you to ask “where does this belong?” which is actually asking “how long is this useful?” That constraint is a feature, not a limitation.
Tier 1: Long-Term Memory (MEMORY.md)
Think of MEMORY.md as your agent’s institutional memory. This is where facts live—the stuff that’s true yesterday, today, and tomorrow.
What Goes Here
Stable facts and preferences: If your agent learns that “the API endpoint changed to v3” or “the user prefers concise responses,” that’s Tier 1 material. This information is durable, applies across sessions, and shouldn’t be rediscovered.
Decision records: When your agent makes a significant choice—”we standardized on Pydantic for validation” or “the team decided on async/await over threads”—that goes to MEMORY.md. Future sessions inherit these decisions without needing to re-debate them.
Configuration facts: API keys (never—see security below), but definitely: standard ports, repository paths, team guidelines, established naming conventions. These are the facts that make your agent coherent across time.
Learned behaviors: If your agent discovers that “user prefers step-by-step explanations” or “this project needs explicit test evidence,” those behaviors stick in MEMORY.md.
Structure (Typical)
# Long-Term Memory Registry
## Facts & Preferences
- API v3 endpoint: https://api.example.com/v3
- Repository root: /home/team/projects/main-repo
- Default logging level: INFO
- Supported Python versions: 3.9+, 3.10, 3.11
## Decision Records
- **ADR-001**: Use Pydantic v2 for validation
- Date: 2026-02-15
- Reasoning: Type safety, performance, ecosystem support
- Status: Active
- **ADR-002**: Async-first architecture
- Date: 2026-01-20
- Reasoning: Concurrency requirements, I/O bound workloads
- Status: Active
## Team Preferences
- Code review: Always require 2 approvals
- Testing: Minimum 80% coverage threshold
- Documentation: Docstrings + inline comments
## Learned Behaviors
- This team prefers evidence-backed claims
- Pull requests require detailed description
- Risk callouts needed for destructive actions
When Memory.md Gets Updated
You update MEMORY.md when:
- New permanent facts emerge – discovered configurations, standards, paths
- Decisions are finalized – when a debate ends and consensus solidifies
- Behaviors prove effective – patterns that work repeatedly get recorded
- Critical lessons learned – mistakes that shouldn’t happen twice
You don’t update it for temporary states, session-specific decisions, or speculative ideas. That’s what Tier 2 handles.
The key question when deciding to promote something to MEMORY.md is always: “Will this still be true in six months?” If yes, it belongs here. If “maybe,” it goes to daily logs for observation. If “no,” it stays in context window. This simple heuristic prevents MEMORY.md from becoming a dumping ground of historical facts that aren’t actually useful anymore. You’re building a reference manual, not an archive. A reference manual has maybe 50-100 entries. An archive has thousands and becomes useless. So be ruthless about what makes MEMORY.md. It should be dense with signal—every entry earning its place through relevance and durability.
Security Note
Never—and I mean never—store secrets in MEMORY.md. This is long-term, accessible storage. Credentials, tokens, API keys belong in secure vaults. MEMORY.md holds the locations of secrets (e.g., “key stored in ~/.openclaw/secrets”), never the secrets themselves.
Tier 2: Daily Logs (memory/YYYY-MM-DD.md)
Now we’re in session territory. Daily logs are where you capture context that’s specific to a particular day or working session—facts that matter right now but might not be relevant next month.
What Goes Here
Session distillations: After a complex work session, you extract key learnings. “Spent 2 hours debugging async context managers; the issue was missing await in three places” gets logged, so if the agent hits similar issues, it has recent context.
Temporary state: “User is currently debugging the authentication module” or “We’re in the middle of refactoring the data layer.” These matter for coherence within sessions but evolve quickly.
Errors and solutions: “Got connection timeout on API endpoint; retried with exponential backoff; worked on third attempt.” This is gold for the next session with similar issues.
Task progress: Tracking what’s done, what’s in progress, what’s blocked. Tomorrow this might be old news, but today it’s essential context.
Discovered patterns: “Noticed that test failures cluster in the ORM layer” or “User tends to ask for recursive implementations.” These feed into agent decisions during the session.
Structure (Typical)
# Daily Log: 2026-03-17
## Session Summary
- Focus: Memory system documentation and validation
- Duration: ~4 hours
- Status: In progress
## Key Learnings
- Three-tier memory system is actually about temporal scale, not storage type
- Evidence requirements drive confidence assessment
- Memory updates need to be part of the validation gate
## Task Progress
### Completed
- [ ] Wrote deep dive on three-tier memory system
- [ ] Documented MEMORY.md best practices
- [ ] Created examples for each tier
### In Progress
- [ ] Full configuration reference article
- [ ] Integration examples
### Blocked
- (none currently)
## Errors & Solutions
- Issue: Attempted to write article without understanding gateway config
- Solution: Created separate research session to map openclaw.json
- Lesson: Always verify file format before documentation
## Discovered Patterns
- Articles in this cluster benefit from code→explain rhythm
- Intermediate difficulty requires 3500+ word depth
- -iNet voice needs casual interjections every 3-4 paragraphs
## Context for Next Session
- User values evidence-backed claims
- Articles should include annotated examples
- Configuration deep-dives need both theory and practice
Lifecycle of Daily Logs
Daily logs accumulate during active work. At the end of a session or day, distill the most valuable learnings and migrate them to either MEMORY.md (if they’re durable) or context window compression (if they’re session-specific).
After ~30 days, these logs become historical. Some teams archive them; some keep them searchable. The point is they’re not active working memory anymore—they’re reference material if you need to understand “what were we doing last month?”
In practice, here’s what happens: Day 1-3, you’re actively referencing the daily logs from the previous days. Day 4-7, you’re mostly reading MEMORY.md but occasionally checking “what did I discover about the build system last Wednesday?” By day 30, these logs are purely historical—interesting for retrospectives or debugging “when did we start using this pattern?” but not useful for current work. That’s the right place for them to transition to archive storage. You keep them (compliance often requires it), but you stop paying the cost of loading them into active memory.
A smart strategy is to schedule a Friday afternoon ritual: spend 20 minutes reviewing the week’s daily logs and promoting anything durable to MEMORY.md. This weekly curation is what prevents your memory system from becoming bloated. Without it, you end up with 180 daily logs and your agent spends 30 seconds just loading memory on every session startup.
Tier 3: Context Window (System Prompt + Conversation History)
Your context window is live, immediate, and fast. It includes everything needed for the current conversation: system prompts, conversation history, and compressed summaries of recent decisions.
System Prompts
This is where immediate operational instructions live. “When writing code, always include docstrings” or “Use Oxford commas in written content.” These rules are active for the current conversation but might change between sessions (and that’s okay—context is ephemeral).
Conversation History
The actual messages in your current session. This is how the agent maintains coherence within a single conversation thread. It’s high-fidelity but short-lived—once the conversation ends, you’ll extract the valuable bits and move them down to daily logs if needed.
Compressed Summaries
Here’s a clever pattern: if your context window is getting full, you compress older conversation sections into high-level summaries. Instead of storing every message from the first 30 minutes, you keep: “User requested feature X. We discussed three approaches. User chose approach B because of constraint C.”
This is where softThresholdTokens comes in.
The Memory Flush: softThresholdTokens at 40k
Okay, so you’re having a long conversation. Context is accumulating. At some point, you hit softThresholdTokens, typically set to 40,000 tokens. What happens?
A memory flush event triggers. Here’s the sequence:
- Identify flush candidates: The system looks at conversation history that’s older, less central to current work
- Extract value: Important information gets distilled into compressed summaries
- Move to daily log: Session learnings migrate to memory/YYYY-MM-DD.md
- Compress context: Old conversation history gets summarized or truncated
- Maintain working state: Recent conversation, active decisions, and immediate context stay in the window
The beauty of this? You don’t lose information; you compress it. A 2,000-token conversation becomes a 200-token summary, and if you need those details later, they’re in the daily log.
Example Flush Scenario
Let’s say you’re working through a debugging session:
Time 1:00 PM – Conversation starts fresh. Context: ~2k tokens
Time 1:30 PM – Working through code issues. Context: ~15k tokens
Time 2:15 PM – Found first bug, fixed it. Context: ~28k tokens
Time 2:45 PM – Working on second bug. Context: ~38k tokens
Time 3:00 PM – Approaching softThresholdTokens (40k)
At 3:00 PM, the flush triggers:
FLUSH EVENT:
├─ Extract: "First bug was missing await in async function; fixed in line 42"
├─ Move to daily log: Session learnings section
├─ Compress: Earlier context (1:00-1:30) → "User debugging async context managers"
├─ Retain: Current code being edited, recent conversation
└─ New context window: ~18k tokens (with full working information)
The conversation continues seamlessly. You’ve just optimized token usage while keeping working memory intact.
How the Tiers Work Together
Here’s where the architecture becomes elegant. Imagine a multi-day project:
Day 1, Session 1: Agent learns facts about the codebase, makes decisions, hits issues. At day’s end, key learnings move from context → daily log.
Day 2, Session 1: Agent wakes up. MEMORY.md loads (durable facts), daily log from Day 1 loads (recent context). New session starts with full coherence.
Day 3, Session 1: Day 1 and 2 daily logs are now historical reference. MEMORY.md still active. New daily log starts. Agent is working with durable facts + recent session context, not carrying all of history.
This is the critical insight: you’re not keeping everything in active memory; you’re keeping the right information at the right temporal scale.
The memsearch Pattern
There’s also a pattern called memsearch, where the agent can query across memory tiers. If a problem seems familiar, the agent searches:
- First: Current context (immediate, high relevance)
- Then: Daily logs from last 7 days (recent patterns)
- Then: MEMORY.md (durable facts and decisions)
- Finally: Archived daily logs (historical reference, if needed)
This search pattern keeps you from losing institutional knowledge while avoiding the bloat of storing everything in active context.
Common Pitfalls & How to Avoid Them
Pitfall 1: Everything Goes to MEMORY.md
Syndrome: Your MEMORY.md file grows to 50KB because you’re logging every decision and fact.
Reality check: If something’s time-bound or session-specific, it’s probably daily log material. MEMORY.md should be focused, durable, and referenced frequently.
Pitfall 2: Daily Logs Never Get Distilled
Syndrome: 180 days of daily logs, and you’re storing all of them in active memory.
Reality check: Most agents implement a distillation schedule. Day 7 rolls up into a weekly summary. Month-end creates a monthly summary. Old daily logs move to archive.
Pitfall 3: Context Window Never Flushes
Syndrome: Conversation gets bloated, token count climbs, responses slow down.
Reality check: If you disable or set softThresholdTokens too high, you lose the benefit of the tiered system. Typically, 40k tokens is the sweet spot—high enough for meaningful context, low enough that flushing happens before you hit actual context limits.
Pitfall 4: Secrets in MEMORY.md
Syndrome: You store API keys in long-term memory for “convenience.”
Reality check: That’s a security incident waiting to happen. Durable facts are durable; secrets aren’t. Store the location of secrets, not the secrets themselves.
Practical Implementation: What This Looks Like
Let’s make this concrete with a real scenario.
You’re building an ML training pipeline. Day 1, your agent discovers:
- The training data lives in
/data/raw/training_v3 - You’re using PyTorch with distributed training
- Validation failures if batch size exceeds 32 on your hardware
At end of Day 1:
MEMORY.md gets:
## Project: ML Training Pipeline
- Data path: /data/raw/training_v3
- Framework: PyTorch (v2.0+)
- Max batch size: 32 (hardware constraint)
daily log (2026-03-17.md) gets:
## Session Summary: Initial Setup
Discovered hardware constraints. First training run failed with batch size 64.
Resolved by reducing to 32. Need to document in training script.
Day 2, you resume work. MEMORY.md loads instantly (you already know the paths and constraints). Daily log reminds you of yesterday’s discovery. Your context window includes the system prompt (“Always include batch size validation in training scripts”).
When Day 2’s session ends, if Day 1’s daily log taught lessons that apply across multiple days, you migrate them to MEMORY.md. Historical daily logs might get archived.
By Day 30, MEMORY.md is concise, historical logs are archived, and your current context window only carries what’s needed for today’s work.
Deep Dive: Memory Promotion in Practice
Here’s something that gets overlooked: promoting information from one tier to another isn’t just administrative. It’s where your agent actually learns. Let me walk you through a realistic example.
You’re working on a project. Day 1, your agent discovers: “The build script fails if GOARCH isn’t set.” This goes to daily log. Day 2, same issue pops up. Day 3, again. By Day 4, you notice the pattern and think: “This constraint is going to stick around for a while. This should go to MEMORY.md.”
That’s promotion. And here’s the subtle power: once it’s in MEMORY.md, future sessions load it automatically. Your agent doesn’t have to rediscover it. It doesn’t have to fumble with GOARCH again. The intelligence compounds.
But here’s where most people get it wrong. They think promotion is just copy-paste. It’s not. When you promote something from daily log to MEMORY.md, you’re doing semantic compression. You’re extracting the lasting principle from the temporary context.
Daily log (transient):
## Day 4 Discovery
Noticed GOARCH=arm64 required for builds on M1 Mac.
Previous three days had same failure.
Set GOARCH in .env, builds now pass.
MEMORY.md (durable):
## Build Configuration
- GOARCH must be explicitly set on ARM64 systems
- Standard value: arm64 (auto-detect works in most cases)
- Override only if cross-compiling
- Location: Environment or build script
See the difference? The daily log captures the incident. MEMORY.md captures the principle. Future sessions inherit the principle without the incident history cluttering context.
This distinction—incident vs. principle—is what separates agents that learn from agents that accumulate noise. You’re not storing “what went wrong yesterday.” You’re storing “here’s how the system actually works.”
The Promotion Review Cycle
Here’s a rhythm that works: every Friday, spend 20 minutes reviewing the week’s daily logs and asking: “What’s genuinely surprising here? What would future-me need to know?” Anything that passes both filters gets promoted.
This weekly review is where your memory system becomes intelligent. Without it, daily logs grow unbounded. With it, you’re continuously distilling signal from noise. After six weeks, MEMORY.md contains the working model of your system. New team members read it once and understand what took you weeks to discover.
Advanced Pattern: Context Window Compression
Now let’s talk about something most documentation glosses over: how your agent actually manages token constraints in real time.
You’re in a long conversation. Context is accumulating. You’ve got 35k tokens in the window and you’re approaching softThresholdTokens at 40k. What happens isn’t magic—it’s systematic.
The compression algorithm looks at conversation segments and scores them:
Recency score: How recent is this conversation?
Relevance score: How central is this to current work?
Completeness: Is this a fully-resolved topic?
Density: Signal-to-tokens ratio
Older, tangential, completed topics get compressed. Recent, active, high-signal topics stay expanded.
Example: you spent 30 minutes debugging a problem at 1 PM. Now it’s 3 PM and you’ve moved on to new work. That 1 PM conversation might score like this:
- Recency: 2 hours old = medium score
- Relevance: Debugging finished, issue resolved = low current relevance
- Completeness: Full problem-solution cycle = high
- Density: 2,000 tokens for “found missing import, added it” = low density
Verdict: compress. The system creates a summary: “Spent 1-2 PM debugging import errors in auth module. Root cause: missing __init__.py in credentials package. Fixed by adding file.”
That 500-token summary replaces 2,000 tokens. You’ve freed 1,500 tokens without losing information.
At the same time, other parts of the conversation stay full-fidelity. If you’re actively working on something, it stays in the window intact.
This is the hidden sophistication of the three-tier system. It’s not just “move stuff around.” It’s continuous, intelligent compression based on what matters right now vs. what matters overall.
Tuning Compression Aggressively
Here’s a practical tip: if you find your agent is always at softThresholdTokens and doing frequent flushes, you can tune compression more aggressively. In your configuration, you might adjust how much older content gets compressed:
memory:
soft_threshold_tokens: 40000
compression:
aggressive: true
age_factor: 2 # Older content gets priority for compression
relevance_decay: 0.9 # Relevance drops 10% per message
keep_recent_n_messages: 20 # Always keep last 20 messages uncompressed
Higher age_factor means older content disappears from context faster. Higher relevance_decay means tangential content vanishes quicker. Adjusting these based on your workflow is where fine-tuning happens.
For most people, defaults work fine. For power users running long sessions (6+ hours of continuous work), tweaking these numbers can be the difference between smooth operation and constant compression events.
Tuning Memory for Your Workflow
Once you’ve got the basic three-tier system working, optimization comes next. Different workflows have different memory patterns, and tuning them saves tokens and improves responsiveness.
Load Pattern Optimization
Not every session needs to load everything. A design-focused session doesn’t need architectural decision records from six months ago. A bug-fix session needs recent errors but not long-term vision docs.
You can configure OpenClaw to load memory selectively:
memory_loading:
# Load strategy: "minimal", "standard", "full"
strategy: adaptive
minimal:
# Single focused session
- MEMORY.md (durable facts only, filtered by context)
- today's daily log
- last 5 messages of context
load_time: ~500ms
standard:
# Multi-session day with context switching
- MEMORY.md (full)
- last 7 days of daily logs (summaries only)
- recent context (last 20 messages)
load_time: ~2s
full:
# Deep project work, team onboarding
- MEMORY.md (full)
- daily logs from last 30 days
- full conversation history
- archived decision records
load_time: ~5s
# Auto-select based on session type
session_types:
quick_task: minimal
daily_work: standard
project_deep_dive: full
team_discussion: full
research: minimal
Most of the time, you’re in “standard” mode. But if you know you’re about to do a quick task, running “minimal” mode boots your agent 4x faster. For complex project work, “full” mode gives you complete context.
This is where the hidden efficiency of OpenClaw comes from: not just organizing memory, but loading the right memory at the right time.
Daily Log Compression Schedules
Daily logs grow. But they don’t have to bloat your system if you compress them on a schedule.
Compression Tiers:
- Active (last 3 days): Full access, searchable, in-memory
- Recent (4-14 days): Compressed summaries, searchable by tag, on disk
- Historical (15-60 days): Monthly summaries only, archived, indexed
- Archive (60+ days): Cold storage, searchable but slow, kept for compliance
Here’s a practical schedule:
compression_schedule:
daily:
- run_at: "23:00"
- action: compress_old_messages_from_daily_log
- keep_full: messages from last 72 hours
- compress_to: 200-token summaries for older messages
weekly:
- run_at: "sunday 22:00"
- action: distill_daily_log_to_summary
- output: memory/summaries/week-YYYY-WW.md
- compress_original: gzip and move to archive
monthly:
- run_at: "1st of month, 22:00"
- action: consolidate_weekly_summaries
- extract_durable_facts: promote to MEMORY.md if applicable
- archive_old_summaries: move to cold storage
With this schedule, you’ve got fresh daily logs for recent work but don’t carry the weight of months of history in active memory.
Tag-Based Memory Organization
As you accumulate memory, retrieval becomes an issue. MEMORY.md with 100 items is harder to search than MEMORY.md with 20 well-organized items.
Tags solve this. As you create decision records or facts, tag them:
## Decision Records
### ADR-042: Async-First Architecture
- **Status**: Active
- **Tags**: #architecture #infrastructure #async #performance
- **Applies To**: backend services, data pipeline, API layer
- **Supersedes**: ADR-025 (thread-based approach)
When your agent searches memory for “what’s our approach to concurrency?”, tags let it find ADR-042 instantly instead of scanning 100 records.
Memory Validation Gates
Here’s something overlooked: memory needs maintenance. Facts become outdated. Decisions get superseded. You need validation gates to keep MEMORY.md honest.
memory_validation:
quarterly:
- review_decision_records
- mark_superseded: check if newer decisions exist
- mark_inactive: check if decision is still applied
- consolidate_redundancies: merge similar facts
- verify_accuracy: spot-check facts against current reality
validation_score:
# Mark each record with confidence
fact_accuracy: 1-5 (how confident are we this is still true?)
relevance: 1-5 (how often does this come up?)
completeness: 1-5 (do we have the full picture?)
# Archive records below confidence threshold
archive_if_score: < 2.5
A fact that’s marked as “low confidence” might be archived or flagged for research. This prevents MEMORY.md from becoming a collection of outdated assumptions.
Performance Considerations
Memory management has performance implications. Here’s what matters:
Load Time: MEMORY.md loaded every session. Keep it under 50KB for sub-second loads. Large files = slower sessions. With the tiered loading strategy above, you rarely load everything at once.
Search Performance: memsearch queries run across all tiers. Indexed daily logs (tagged properly) are faster than full-text search. With tag-based organization, search time drops from minutes to seconds.
Storage: Each daily log is ~100-500KB. 365 days = 36-180MB. Archive compression helps (gzip reduces by 70-80%). With automated compression schedules, active storage stays under 5MB.
Token Cost: Pulling memories into context costs tokens. Minimize by loading only relevant tiers through the adaptive loading strategy. A “minimal” load costs ~200 tokens. A “full” load costs ~2000 tokens. Choose wisely.
Query Efficiency: If you’re searching memory 50+ times per session, that’s expensive. Batch queries when possible. “Find all customer-related decisions” is cheaper as a single search than five separate searches for individual customers.
Next Steps
Understanding the three tiers is half the battle. The other half is properly configuring how memory flows through your system, which brings us to gateway configuration, skill updates, and the full lifecycle of memory in OpenClaw.
But that’s its own deep dive.
For now, remember: temporal scale matters. Different information needs different treatment. OpenClaw’s tiers make this explicit and operational.
When you’re ready to connect this memory system to actual gateway configurations and skill pipelines, the next article walks through openclaw.json—your system’s nervous system that controls how all these pieces talk to each other.
The memory system is elegant in theory. In practice, it’s even better—because it lets you build agents that genuinely learn from experience, not just from the current conversation.
-iNet