v2.14.0 Latest
April 1, 2026
Why this matters

Two silent correctness bugs fixed. The synthesis sync job was running a full knowledge-table sync up to 30 times per agent cycle — once per topic, without scoping to that topic. It should run once. Separately, checkpoint_hours_ago could produce negative values on systems where SQLite stores UTC and the local clock is offset, making health reports untrustworthy. Both are fixed with tests. The release also adds four new operational fields to stats.py --json so you can see skill version, open proposal count, last background job, and pending synthesis topics in a single call.

memory-agent.py Redundant synthesis sync loop. The synthesis.sync job looped over up to 30 topics and called synthesize.py sync --quiet once per topic — without passing --topic, so each call synced the entire knowledge table. Fix: call synthesize.py sync exactly once per agent run. The command is idempotent and already handles all topics internally.
stats.py checkpoint_hours_ago timezone fragility. Previous code stripped the timezone offset from a stored timestamp then subtracted it from datetime.now() (local time). On any system where SQLite stores UTC and the local clock is offset, the result was wrong — potentially negative. Fix: use datetime.utcnow() consistently on both sides, treating stored timestamps as naive UTC.
stats.py Four new operational fields in --json output. skill_version — read live from setup.py, catches version drift immediately. open_proposals — count of pending review items. last_background_job — most recent agent run result. pending_synthesis_topics — knowledge topics with no synthesis yet; null if the synthesis engine hasn't been initialized. Human-readable header also now shows Skill: vX.Y.Z.
tests/ 15 new tests, 152 total passing. test_synthesis_sync.py verifies the sync job calls subprocess exactly once and never passes --topic. test_stats.py covers UTC correctness for checkpoint freshness and all four new JSON fields including schema-guarded pending_synthesis_topics.
setup.py SKILL_VERSION corrected to "2.14.0". The version string was left at "2.10.0" across the v2.11.0–v2.13.0 releases. setup.py is now the declared canonical version source — stats.py --json reads from it directly so version drift is immediately visible.
SKILL.md Dashboard section updated. Replaced the stale "Local web dashboard — coming in v3" roadmap line with accurate documentation: dashboard.py already ships at http://localhost:5000, separate from the Command Center on port 8080.
v2.13.0
March 13, 2026
Why this matters

v2.12.0 built the full retrieval learning stack — pathway signatures, outcome tracking, score updates, the works. But the pipeline was silently disabled on every installation. The flag that turned it on existed; it just never got set. This release closes that gap: the learning pipeline activates automatically on every fresh install and upgrade, no manual configuration required. Memory that was designed to improve itself now actually does.

memory-agent.py Critical: stale lastrowid in record_job(). With INSERT OR IGNORE, SQLite can leave cursor.lastrowid set to a value from a previous successful insert even when the current statement was skipped. This caused every context.build.projects run to fail with FOREIGN KEY constraint failed — the job ID being written to context_packs.created_by_job_id didn't exist. Fix: use SELECT changes() to detect whether the insert actually wrote a row; if not, query the existing row by idempotency_key to get a valid ID.
memory-agent.py get_config_bool() — reads a boolean key from memory_config with a safe fallback. Allows runtime flags to be stored in the database and toggled without editing cron jobs or source code.
memory-agent.py --disable-inference-jobs flag — mirror of --enable-inference-jobs. Lets a single cron invocation force-disable the learning pipeline without touching memory_config, useful for debugging or maintenance windows.
migrate.py Migration v14 — inserts memory.learning.enabled = true into memory_config on install or upgrade. This is the default-on switch. Running python3 migrate.py on any existing install activates the learning pipeline immediately.
memory-agent.py Inference jobs now default-on. The extract, canonicalize, and conflicts jobs previously required the --enable-inference-jobs flag. Now they run by default, controlled by memory_config.memory.learning.enabled. CLI flags can still override per-run.
setup.py The auto-checkpoint cron job registered during install now passes --enable-inference-jobs as a belt-and-suspenders guarantee that learning runs even on installs where the DB migration hasn't been applied yet.
retrieval_logger.py · memory_learning.py · pathway_learning.py · memory_relations.py Replaced datetime.utcnow() (deprecated, breaks in Python 3.14) with datetime.now(timezone.utc) throughout all four files. Timestamps remain in the same ISO format; no data migration needed.
v2.12.0
March 11, 2026
Why this matters

Autoglia now moves from passive persistence to measurable retrieval learning. Memory selection is logged, ranked, evaluated against outcomes, and continuously improved with deterministic rules. This release also ships the benchmark scaffold used to prove retrieval quality gains rather than relying on subjective claims.

retrieval.py Centralized retrieval and ranking engine. Collects candidates across memory tables, scores with explainable components, and assembles context-aware bundles with explicit quotas.
retrieval_logger.py Instrumentation writer. Logs retrieval runs, candidate scores, selected/injected items, and outcome events for full observability.
memory_learning.py Deterministic learning updater. Applies outcome events to per-item counters and recomputes utility, stability, and decay scores.
pathway_learning.py Pathway signatures and bounded boosts. Learns repeated successful retrieval routes without allowing runaway score inflation.
memory_relations.py Safety relation layer. Supports contradiction/supersession/support links and applies retrieval penalties for stale or disputed memory.
benchmarks/ Benchmark scaffold. Replay, score, and compare runners for baseline vs upgraded memory behavior, including category-level evaluation outputs.
docs MEMORY_INTELLIGENCE_SPEC.md freezes canonical names, scoring semantics, relation types, and benchmark contract before rollout.
migrate.py Added migrations 11-13 for retrieval telemetry tables, learned score columns, pathways, bundle metadata, and memory relations. Existing databases at version 0 now correctly bootstrap and continue migrations.
recover.py Recovery now executes ranked retrieval selection, logs a retrieval run, and records pathway usage for every session briefing.
memdb.py New observability commands for outcomes, retrieval runs/items, pathways, promoted memories, stale memories, and relation management.
memory-agent.py Startup context pack generation now uses quota-based retrieval bundles. Inference-heavy jobs are explicitly optional and non-blocking by default.
dashboard.py + stats.py Added retrieval/pathway/staleness observability endpoints and memory intelligence metrics to health reports.
tests Expanded test suite to 137 passing tests, including memory intelligence integration and benchmark scaffold smoke tests.
v2.11.0
March 9, 2026

OpenClaw compatibility update. Session paths updated from ~/.clawdbot/sessions/ to ~/.openclaw/agents/main/sessions/. Cron commands updated from clawdbot cron to openclaw cron. The skill now auto-detects whether OpenClaw or Clawdbot is installed and uses the correct CLI and state directory. Backward-compatible with existing Clawdbot installs.

  • sync-sessions.pyAuto-detects gateway directory: prefers ~/.openclaw, falls back to ~/.clawdbot. Supports OPENCLAW_DIR env var.
  • setup.pyUses openclaw cron when OpenClaw is installed, clawdbot cron otherwise. Manifest path follows the same auto-detect logic.
  • VersionBumped to 2.11.0.
v2.10.0
March 8, 2026
Why this matters

Every previous version was foreground-only: the agent recorded things when it remembered to, and the cron jobs cleaned up what it missed. But the database itself was passive — it never improved on its own. v2.10.0 adds a background maintenance layer that runs while you're away: normalizing entity names, building precomputed context snapshots, detecting stale loops, scoring health, and staging extraction proposals into a review queue. Non-deterministic extractions don't go directly to canonical tables — they land in memory_proposals for you to accept or reject. The system is now self-improving, not just self-recording.

memory-agent.py Background memory maintenance worker. Runs every 15 minutes as a cron job. Pipeline stages: sync sessions → auto-checkpoint → health check → entity normalization → extraction → conflict detection → context pack build. Lockfile-protected (no overlapping runs). Run UUID for traceability. --dry-run, --jobs, and --scope flags.
extractors.py Typed extraction interface with two implementations. Defines DecisionProposal, EntityProposal, OpenLoopProposal dataclasses and an Extractor protocol. HeuristicExtractor: regex + keyword baseline, zero API calls. ModelExtractor: feature-flagged, works with any OpenAI-compatible endpoint — enable via AUTOGLIA_MODEL_EXTRACT=1 plus AUTOGLIA_MODEL, AUTOGLIA_API_BASE, AUTOGLIA_API_KEY. Same typed output either way.
table background_jobs — job queue with cross-run idempotency. Each entry records job_type, idempotency_key, run_id, status, result_json, and timestamps. Stable work-item keys (e.g. extract.all:session:{sk}:window:{ts}) prevent re-processing across cron runs.
table memory_proposals — non-deterministic extraction staging table. Decisions, entities, and open loops land here first. Status: pending → accepted/rejected → promoted. Pending proposals surfaced in recover.py session briefing. Accepted proposals promoted to canonical tables by the next background run.
table context_packs — precomputed context snapshots. Two types: startup (identity, active projects, open tasks, recent contacts) and project (per-project summary). Built by the background agent, freshness-validated on read, invalidated when underlying data changes.
table entity_aliases — alias registry for entity normalization. Maps variant forms to a canonical name. Populated by the background agent via case-folding, whitespace normalization, and punctuation cleanup. High-value entity aliases can be pinned explicitly.
memdb.py New proposals subcommand: proposals list, proposals accept <id>, proposals reject <id>. Scope-filtered if MEMORY_SCOPE env var is set.
stats.py New health_metrics() function — 5 bounded metrics: duplicate entity risk, stale open tasks, unsummarized session backlog, orphan task rows, and checkpoint freshness. Included in both JSON and human-readable full_report() output.
tests/ 2 new test files, 129 total tests. test_extractors.py: 16 tests with labeled segment fixtures and recall thresholds — quality gate for heuristic extraction. test_promotion.py: 13 tests covering accepted proposal → canonical write, duplicate prevention, bad payload handling, and promotion idempotency.
sync-sessions.py Content-hash dedup. Each transcript row now carries a content_hash (SHA-256, 16-char prefix). Unique index changed from (session_key, timestamp, role) to (session_key, role, content_hash, timestamp) — eliminates timestamp collisions while allowing legitimate repeated messages at different times.
auto-checkpoint.py Per-segment checkpointing. Each conversation segment now produces its own checkpoint.py call immediately after segmentation, rather than one merged summary. Topic and summary are scoped to the correct segment. Recovery is now precise.
recover.py Session briefing now surfaces: stale tasks (open tasks not updated in >7 days), open loops (unanswered questions, pending follow-ups), and pending memory proposals requiring review. Scope-filtered via MEMORY_SCOPE env var.
migrate.py Migrations v9 and v10. v9: adds content_hash to conversation_transcripts, backfills existing rows, rebuilds unique index. Creates background_jobs, context_packs, entity_aliases, memory_proposals. v10: adds scope TEXT DEFAULT 'default' to knowledge, conversation_log, contacts, tasks, projects, memory_proposals, context_packs. Schema now at version 10.
all scripts SQLite concurrency hardening. PRAGMA busy_timeout=5000 applied in every get_conn() call across all scripts. WAL journal mode enforced. Background agent checks for foreground activity before running write-heavy stages.
v2.9.1
March 7, 2026

The reliability gap this closes: even with the session startup protocol in place, a bot waking up in a new conversation had no proactive context. It knew its personality but nothing about who it was talking to, what projects were active, or what had been discussed recently — unless the user explicitly asked. The always-on briefing means the bot arrives oriented, not blank. No new commands, no new scripts, no new instructions to follow or forget. The existing startup path just does more.

Changed
recover.py Always-on session briefing. Previously only provided meaningful output when compaction was detected — on a fresh session it emitted "No action needed" and the bot moved on. Now always outputs a full SESSION BRIEFING: user name, timezone, businesses, recent contacts, active projects, open tasks, recent checkpoints, reminders, personality profiles, and key knowledge. The bot is oriented from the first message of every session.
recover.py User identity block. New get_user_identity() pulls name, timezone, and preferences from user_preferences (or preferences as fallback), active ventures from businesses, and recent contacts from contacts. The bot now knows who it's talking to at session start without being told.
memwrap.sh Replaced hardcoded home path with dynamic detection via $(eval echo ~"$(whoami)"). Works correctly for any user on any system.
sync.sh Stronger personal data guard: hardcoded home paths and owner-specific strings added to the forbidden pattern list and sanitization pass. Build pipeline now catches path leakage that was previously invisible.
v2.9.0
March 6, 2026
Why this matters

Before v2.9.0, an entire session's history lived under one session key forever. If you talked Monday then again Thursday, auto-checkpoint merged both into one muddled summary. Segmentation fixes this — each gap becomes a boundary, each conversation gets its own checkpoint, topic, and analytics row. Recovery is now scoped to the right conversation. The topic index and watchwords make the whole system queryable in ways that weren't possible before. And for the first time, you can ask your bot to back up and email your entire database in one sentence.

auto-checkpoint Conversation segmentation — messages separated by more than N minutes (default 30) are treated as distinct conversations. Each segment gets its own topic and contributes a separate line to the summary. Configurable via --gap-minutes.
table conversation_topics — normalized topic registry. Every unique topic is stored once, deduplicated case-insensitively, with a use_count so frequently-discussed subjects surface naturally.
table conversation_topic_links — many-to-many join between conversation_log entries and conversation_topics. One checkpoint can now be tagged with multiple topics. Query "all sessions that discussed X" instead of guessing with substring search.
table watchwords — keyword trigger registry. Store phrases with associated actions (checkpoint, tag_topic, flag). Check a message for hits via memdb.py check-watchwords — returns matches and increments match_count. Implemented at the Python layer where natural language processing actually belongs.
table session_stats — per-session behavioral analytics written automatically after each checkpoint. Tracks message_count, user_messages, bot_messages, duration_minutes, avg_gap_minutes, and topics_json. Zero LLM involvement.
memdb.py New commands: topics — list all conversation topics ordered by use count. watchwords [--all] — list active or all watchwords. check-watchwords "<text>" — scan a message for hits. backup [dest.db] — binary database backup. export [dest.json] — JSON export.
export.py Binary backup & restore--backup dest.db uses SQLite's online backup API: safe while the database is open, lossless, complete. --restore src.db [--force] restores from a binary backup. --email-to address emails the backup file via mutt, sendmail, or smtplib (configurable via env vars). Users can ask their bot: "back up my database and email it to me."
import.py --overwrite flag for JSON restore — clears all tables in reverse FK order, then reinserts using INSERT OR REPLACE in dependency order. Tables now inserted in a defined FK-safe sequence (parents before children). Default behavior unchanged: merge via INSERT OR IGNORE.
tests/ pytest test suite — 5 test files covering memdb.py, recover.py, checkpoint.py, auto-checkpoint.py, and sync-sessions.py. Each test uses a fresh temporary DB via shared fixture. No personal data, no side effects on the real database.
auto-checkpoint run_checkpoint() now returns (success, log_id) so callers can link topics to the new conversation_log row immediately after creation.
auto-checkpoint derive_summary_segmented() replaces derive_summary(). Multiple segments produce a summary that lists each segment's time range, message count, and topic on a separate line.
stats.py Health report now includes top conversation topics and active watchwords. New tables appear in row-count table.
setup.py Version bumped to 2.9.0. New tables added to CORE_TABLES audit check. Fixed pre-existing NameError in cmd_check(). Added stats.py to required-file list.
migrate.py Migration v8 creates all four new tables with indexes on existing installs. Run python3 migrate.py to upgrade — existing data is untouched.
SKILL.md New "Backup & Export" section with conversational triggers, step-by-step commands, email delivery instructions, and a what-to-say-to-the-user script. Backup behavior added to Auto-Memory Rules.
v2.8.0
February 28, 2026
Why this matters

v2.7.0 ensured raw transcripts are always recorded. But conversation_log checkpoints — the structured summaries recover.py uses — still depended on the bot voluntarily running checkpoint.py at the right moment. Under load or after context loss, it simply didn't. auto-checkpoint.py + cron closes this loop: every conversation gets checkpointed on schedule, whether the bot cooperated or not.

auto-checkpoint.py Automatic conversation checkpointing with no LLM required. Finds sessions with unsummarized messages, generates topic and summary from actual message content, calls checkpoint.py atomically. Flags: --threshold N, --all, --dry-run, --session, --quiet, --no-sync.
setup.py Install now registers an hourly openclaw cron job (openclaw cron add) that runs auto-checkpoint.py --quiet automatically. Job ID stored in the manifest for clean uninstall.
SKILL.md "Auto-Save Behavior" and "Checkpoint Protocol" sections rewritten to reflect the fully automated pipeline. The "every message" manual exec requirement removed.
v2.7.0
February 27, 2026
Why this matters

The previous approach relied on the LLM voluntarily saving transcripts on every message. Under load, mid-task, or in fast-moving conversations, the LLM skips it — leaving conversation_transcripts empty and recover.py with nothing to reconstruct from. sync-sessions.py solves this at the infrastructure level. Context loss from compaction is now fully recoverable.

sync-sessions.py Infrastructure-level transcript sync. Reads OpenClaw/Clawdbot JSONL session files and imports new messages into conversation_transcripts. Automatic dedup via INSERT OR IGNORE. Flags: --status, --dry-run, --since 24h/7d, --agent NAME. Graceful if OpenClaw is not installed.
migrate.py v6 Deduplicates conversation_transcripts then adds UNIQUE INDEX on (session_key, timestamp, role) to enable safe INSERT OR IGNORE upserts.
v2.6.0
February 27, 2026
dashboard.py Local web dashboard at http://localhost:5000. Browse contacts, knowledge, projects, and conversations without writing SQL. Live updates via Server-Sent Events every 3 seconds. Tabs: Overview, Contacts, Knowledge, Projects, Conversations, Schema. --open flag auto-opens browser. Requires pip install flask.
v2.5.0
February 27, 2026
table _schema_log — permanent audit log for every user-created extension table. Stores action, object name, reason, session key, and timestamp.
memdb.py create-table — the only correct way to create extension tables. Atomically creates the table, logs it to _schema_log, and bumps user_schema_rev in _meta. Replaces raw exec CREATE TABLE.
memdb.py schema-log [limit] — view the full extension table audit trail.
v2.4.0
February 27, 2026
checkpoint.py Atomic checkpoint script — saves a conversation_log entry AND marks transcripts as is_summarized = 1 in one transaction. Keeps recover.py's compaction detection accurate.
memdb.py upsert command — insert-or-update by key column. Prevents duplicate contacts. Usage: memdb.py upsert contacts name '{"name": "...", "email": "..."}'.
  • Multiple migrate.py fixes: renamed project_progressprojects, ensured preferences and bot_skills exist on older installs
  • stats.py: Fixed incorrect timestamp column mappings on conversation_log, reminders, knowledge, meetings, and businesses
  • stats.py: Now warns when unsummarized transcripts exist and suggests running checkpoint.py
v2.3.0
February 26, 2026
setup.py Full installer / uninstaller with pre-flight check, schema migration, AGENTS.md injection, workspace indexing, and cron registration. --dry-run, --yes flags. Python version gate, idempotent injection, conflict detection, atomic file writes, automatic backup, and rollback manifest at ~/.openclaw/memory-db-install.json.
v2.2.0
February 27, 2026
import.py Complete rewrite — now a proper workspace indexer. Scans entire workspace recursively, tracks file hashes in memory_files for idempotent re-runs, smart-classifies files (dated → daily_log, known files → knowledge), stores source_file path on every entry. --dry-run and --force flags. Files are never deleted or modified.
v2.1.0
February 27, 2026
recover.py Compaction detection and full context restore. Detects lost sessions by comparing unsummarized transcripts, pulls recent checkpoints, open tasks, reminders, and key knowledge, and outputs a formatted MEMORY RESTORE block. Backward compatible with legacy DB schemas. Flags: --session, --hours, --json, --transcript-limit.
v2.0.0 Major
February 25, 2026
  • 8 new tables: businesses, personality, conversation_log, importance, memory_config, outreach, meetings, tasks
  • export.py — export entire DB to JSON or CSV
  • import.py — seed DB from existing markdown files
  • stats.py — memory health report with row counts and recent activity
  • migrate.py — versioned schema migration system
  • EXAMPLES.md — real command examples with context
  • Soft deletes on contacts and projects (deleted_at column)
  • Importance scoring on knowledge, ideas, daily_log, conversation_log
memdb.py becomes the required interface — parameterized queries only. No SQL injection possible. Schema version tracking via _meta table.
v1.0.0
February 24, 2026
  • Initial release
  • Core tables: contacts, knowledge, daily_log, projects, ideas, content, preferences, reminders
  • memdb.py — safe Python query wrapper
  • migrate.py — migration runner
  • init.sql — schema creation

Upgrading?

Pull the latest from GitHub, then run python3 migrate.py. Do not run setup.py install on an existing installation unless you intend a full reinstall.

View on GitHub →