All notable changes to MemClaw are documented in this file. Format follows Keep a Changelog and the project adheres to Semantic Versioning. Subsequent releases are produced by release-please from Conventional Commits.
2.26.0 (2026-07-29)
- interviewer: async submit — persist window, accept fast, synthesize in the scheduler sweep (#667) (b66f82f)
- core-api: reserved-id guard as a storage-boundary chokepoint + episode-path regression test (#670) (41f1152)
2.25.0 (2026-07-28)
- plugin: interviewer task-trail capture — mirror OpenClaw task_runs into the interview buffer (#658) (ba5f4b7)
- client-ci: pin ruff to the 0.15 line so client CI stops floating into 0.16 (#655) (24a137a)
- embedding: make batch-failure re-embed fallback durable (#653) (b489c8f)
- logging: route uvicorn parent-supervisor lines through structlog (#661) (b61fcb5)
2.24.1 (2026-07-27)
- lifecycle: pin the crystallize spend gate to literal status='active' (#628) (0f0ae91)
- storage: count missing embeddings instead of len()-ing a LIMITed fetch (#631) (469678b)
- storage: provision test DB via migrations; accept omitted tenant_id on /count (#630) (b5fa7f8)
2.24.0 (2026-07-26)
- agent-digest: stop over-filtering agents — floor, episode-fallback, subagent rollup (#624) (1df326f)
- client: memclaw-interviewer --harness cursor — Cursor adapter (Interviewer Phase 3) (#612) (efe2ff1)
- search: unified relevance-dominant ranking formula behind score_formula flag (#622) (c721c6d)
- skills-inbox: scan findings on the card + truncated page flag (Phase B backend) (#587) (dce9e59)
- common: guard ddtrace call in the structlog processor (#615) (cad8287)
- core-api: bulk unknown memory_type → per-item 207 (stacked on #619) (#621) (5d80392)
- interviewer: preserve exact figures in synthesis + document list-limit cap (#623) (ebc4bbb)
- logging: correlate structlog output with Datadog APM traces (#614) (dbd0742)
- mcp: allow own-fleet list/stats reads at trust 1 (#617) (1a6fe9f)
- actions: bump actions/checkout from 4 to 7 (#435) (63cb824)
- actions: bump actions/stale from 9.1.0 to 10.4.0 (#593) (db1f8cb)
- actions: bump the actions group with 8 updates (#591) (39b8d09)
- bump @playwright/test from 1.59.0 to 1.61.1 (#499) (a6ddf1f)
- core-api: bump the uv-minor-patch group in /core-api with 16 updates (#605) (dde9cac)
- core-api: update redis[hiredis] requirement from <9,>=5.0 to >=8.0.1,<9 in /core-api (#609) (5e16fb9)
- core-api: update sentry-sdk[fastapi] requirement from <3,>=2.0 to >=2.66.0,<3 in /core-api (#608) (3739f62)
- core-api: update setuptools requirement from >=75 to >=83.0.0 in /core-api (#607) (a55e120)
- core-api: update uvicorn[standard] requirement from <1,>=0.34 to >=0.51.0,<1 in /core-api (#606) (fa4b8b8)
- core-operations: bump the uv-minor-patch group in /core-operations with 6 updates (#595) (2d40ecf)
- core-operations: update setuptools requirement from >=75 to >=83.0.0 in /core-operations (#597) (60ffa11)
- core-operations: update uvicorn[standard] requirement from <1,>=0.34 to >=0.51.0,<1 in /core-operations (#596) (197d25a)
- core-storage-api: bump the uv-minor-patch group in /core-storage-api with 10 updates (#598) (ef60419)
- core-storage-api: update setuptools requirement from >=75 to >=83.0.0 in /core-storage-api (#602) (c6a35d0)
- core-storage-api: update sqlalchemy[asyncio] requirement from <3,>=2.0 to >=2.0.51,<3 in /core-storage-api (#453) (1b87d82)
- core-storage-api: update uvicorn[standard] requirement from <1,>=0.34 to >=0.51.0,<1 in /core-storage-api (#600) (25c2eb8)
- core-worker: bump sentence-transformers from 3.4.1 to 5.6.0 in /core-worker (#601) (b4c7df2)
- core-worker: bump setuptools from 81.0.0 to 83.0.0 in /core-worker (#604) (afb07b1)
- core-worker: bump the uv-minor-patch group in /core-worker with 8 updates (#599) (e4c1fbe)
- core-worker: update uvicorn[standard] requirement from <1,>=0.34 to >=0.51.0,<1 in /core-worker (#603) (7b89597)
- group Dependabot minor/patch bumps per ecosystem (#588) (49ccc11)
- plugin: bump @types/node from 25.4.0 to 26.1.1 in /plugin (#546) (caa2659)
- plugin: upgrade TypeScript to 7 (supersedes #547) (#611) (081551e)
- update argon2-cffi requirement from >=23.1 to >=25.1.0 (#443) (309b785)
- update cachetools requirement from >=5.3 to >=7.1.4 (#440) (516b81f)
- update google-genai requirement from >=0.3 to >=2.12.1 (#590) (e274048)
- update mcp requirement from <2,>=1.26 to >=1.28.1,<2 (#592) (8963d0b)
- update sentry-sdk requirement from <3,>=2.0 to >=2.66.0,<3 (#594) (cc4d6be)
- OSS-side fixes from the 2026-07-26 product-coordination audit (#625) (71debfd)
- readme: document the Interviewer feature (#613) (62c21e7)
2.23.0 (2026-07-20)
- auth: read gateway-plumbed X-Org-Role into AuthContext (Skills Inbox A2, reader side) (#583) (5680c7c)
- client: memclaw-interviewer — Claude Code disk-parser adapter (Interviewer Phase 2) (#581) (bef753c)
- memories: list filters — created_after/before + exclude_memory_types (#573) (fd597c7)
- search: cosine-dominant candidate pool selection (A49), off by default (#579) (1ce740a)
- ci: publish semver image tags for component-prefixed release tags (#580) (5918ed8)
- clients: raise on unexpected search() response shape (#510) (#539) (5af356e)
- core-api: map unhandled upstream 5xx/429 to a retryable 503 (#575) (0ecc274)
- fleet: dedup the outdated-plugin heartbeat warning (#574) (b912f71)
- interview: latency budgets for realistic submit windows (real-LLM pilot finding) (#572) (740505d)
- mcp: add warning when top_k is capped and document search limit (#516) (df259cf)
- skills-inbox: converge the inbox card contract with the dashboard UI (A1) (#582) (3ab73b4)
- document TESTING=1 env var with production-danger warning (#544) (13a256c)
- fix agent install reference (#542) (30d9bc9)
- Skills Inbox REST API reference (Skill Factory GA prep) (#578) (6625bd1)
2.22.0 (2026-07-18)
- interview: Interviewer Phase 1 — server side (submit endpoint, worker, scheduler) (#558) (ca82758)
- memories: attribute broker bulk writes to the originating agent (#556) (42c76f9)
- memories: enforce broker-write ownership boundary on the MCP write path (#565) (3e8bbaa)
- memories: enforce per-agent approval gate on MCP writes (#568) (f2cabcd)
- memories: extend broker-write ownership boundary to evolve/insights (#566) (6c1b742)
- memories: extend broker-write ownership boundary to ingest/stm (#569) (12c1cd9)
- memories: extend broker-write ownership boundary to single writes (#562) (e81f9f1)
- memories: surface agent display_name on memory responses (#559) (809bb2b)
- memories: verify broker-write agent ownership (lenient) (#560) (730fc19)
- plugin: Interviewer Phase 1 — OpenClaw plugin side (durable buffer + interview_request handler) (#564) (5e2d5e7)
- agent-digest: drop placeholder rows + stop 'thin memories' narratives (#557) (9c39fd0)
- logging: emit Datadog
statusfield so log levels survive intake (#561) (75672dc) - logging: format-stabilize the severity set for the vendored copy (#563) (5c88870)
- recall: don't inflate recall_count on agentless recalls (A26) (#549) (c2ea3df)
- reports: salvage empty-narrative digests + period-scaled activity floor (#545) (84459e9)
2.21.0 (2026-07-09)
- insights: give the nightly insights run a dedicated registered identity (#540) (e74413d)
- reports: weekly agent-digest cron tick [CAURA-222] (#543) (2adad51)
2.20.0 (2026-07-08)
- plugin: opt-in recall-gating + cross-agent recall (F2/A44) (#530) (a68b3d0)
- reports: agent-activity digest — Phase 1 (inert read slice) [CAURA-222] (#533) (d0d458f)
- reports: agent-activity digest generation — Phase 2 [CAURA-222] (#537) (4595284)
- search: tenant-wide default search profile (agent > tenant > constant) (#534) (09faf6a)
- reports: count agent-private durable writes in report aggregates (#535) (f8c7914)
- scoring: cap freshness at 1.0 for future ts_valid_start (A43) (#529) (b128553)
2.19.0 (2026-07-05)
- core-api,plugin: self-identify MCP writes when the verified id is reserved "main" (#507) (1bc00c1)
- core-api: governed daily/weekly agent activity report (GET /api/v1/reports) (#514) (d6c569d)
- core-api: reserve agent_id "main" on the write path (Phase 1) (#505) (1d313f9)
- observability: log auto /search recalls behind a separate flag (#503) (f411db2)
- observability: sample below-floor near-misses on the /search recall log (#506) (9b18bd9)
- core-api: don't 422 the whole heartbeat on an oversized observability blob (#497) (77bfcbe)
- core-api: stop passing removed positional db to log_action on write path (#495) (3f89218)
- core-operations: configure logging at import so uvicorn startup lines aren't tagged ERROR (#523) (ff88064)
- logging: floor ddtrace trace/LLMObs writer loggers at CRITICAL (#522) (a878d84)
2.18.0 (2026-06-25)
- core-api: delete direct DB pool, route all DB access via core-storage-api (Fix 2 final cleanup) (#491) (9e6d7f8)
2.17.0 (2026-06-24)
- audit: tamper-evident per-tenant hash chain for audit_log (eToro governance) (#397) (baaa493)
- core-api: cross-worker settings-cache invalidation (CAURA-571) (#418) (86bbe9e)
- core-api: fast business/personal pre-gate before enrichment (opt-in) (#403) (095c360)
- core-api: install-skill ?skill= selector + company-brain import path (#483) (a2a764e)
- core-api: route documents + fleet residuals through core-storage-api (Fix 2 Phase 3) (#431) (ad2a2d9)
- core-api: route mcp_server's 9 ready tools through core-storage-api (Fix 2 Phase 4) (#432) (dc0b674)
- core-api: route memory REST surface through core-storage-api (Fix 2 Phase 2) (#429) (1e39c59)
- core-api: route organization_settings through core-storage-api (Fix 2 Phase 0) (#427) (4450ec0)
- core-api: route tenant-discovery through core-storage-api (Fix 2 Phase 1) (#428) (f05f498)
- core-storage-api: crystallizer entity-coverage + audit-usage reads (Fix 2 final-cleanup PR3a) (#486) (0737b6a)
- core-storage-api: recall/capability/ingest endpoints for Fix-2 final cleanup (PR1) (#484) (d8b18d0)
- core-storage-api: route entity-linking pipeline through storage (Fix 2 Ph6) (#477) (74a18d7)
- core-storage-api: route evolve through storage + delete _mcp_session (Fix 2 Ph5b, PR2) (#472) (44743e1)
- core-storage-api: route insights_service through storage (Fix 2 Ph5b, PR1 — insights) (#471) (2655b84)
- core-storage-api: route the skill-factory pipeline through storage (Fix 2 Ph5a) (#470) (81e79be)
- governance: ingestion-boundary PII + business/personal gate (eToro) (#398) (12860af)
- plugin: additive-mode skill reconcile with ownership marker (PR2) (#417) (3d970ef)
- plugin: auto-register additive skill dirs on OpenClaw's load path (PR3b) (#425) (819a77f)
- plugin: per-target reconcile observability (PR3a) (#424) (04120f2)
- recall: opt-in logging of agent-chosen recalls (#480) (953ec33)
- skills: refresh canonical + plugin memclaw skills, add company-brain (#482) (aa03c03)
- audit: idempotent bulk flush via client_event_id — stop dropping audit rows (#407) (bf87e64)
- core-api: cut prod connect-timeout + rate-limit-Redis log noise (#426) (a082f3f)
- core-api: harden business/personal pre-gate (timeout, audit truth, fail-closed, audit durability) (#416) (aa4be8e)
- core-api: keep-alive pool + bounded entity-context fan-out (VPC-connector ConnectTimeout residual) (#434) (0ba51b4)
- core-api: per-tenant embed concurrency cap (noisy-neighbor-search) (#464) (043c02e)
- core-api: re-route third-party loggers from the ASGI lifespan startup (#473) (8f8f39e)
- core-api: resolve home fleet on omitted fleet_id for MCP writes (#465) (56db1f5)
- core-api: route recall/capability writes through storage (Fix-2 cleanup PR2) (#485) (592b231)
- core-api: self-heal storage pool + cancellation-safe requests (CAURA-000) (#415) (5889e3f)
- core-api: stamp version into image so /api/v1/version stops serving "dev" (CAURA-000) (#414) (4d1c486)
- core-api: surface write-pipeline step failures instead of masking as KeyError (#474) (5d359b2)
- core-storage-api: 404 (not silent 200) on wrong-tenant embedding write (#468) (bec8229)
- core-storage-api: 422 on missing/non-list embedding in /entities/set-embeddings (#478) (6268725)
- core-storage-api: followers skip the migration lock once schema is at head (#487) (8a7ac37)
- core-storage-api: tenant-guard by-id memory UPDATEs (#467) (4248b4d)
- extraction: re-fold split-off subject discriminators (A33) (#412) (ab0d2d6)
- http-retry: widen connection-phase retry to ride out storage cold starts (#406) (5bbede7)
- logging: demote handler-less reroute 'no-op' to DEBUG (records aren't lost) (#488) (9bdbe44)
- prompts: stop brace-escaping content before str.format (#404) (ba94a54)
- rate-limit: fail open on Redis outage instead of 500 (view_rate_limit AttributeError) (#410) (53b467d)
- recall: tighten recall-brief grounding to stop invented details (#489) (6794f3e)
- search: dampen recall_boost so it can't hijack rankings (A26) (#411) (1de219c)
- search: rank entity-lookup fan-out cap by query-match count (A30) (#409) (8f809c0)
- storage: harden migration advisory-lock so a slow migration can't crash booting writers (#408) (54cbe1a)
- core-api: clarify memclaw_recall top_k is soft-capped, not rejected (#481) (6938f08)
- core-api: document LLM free-form PII recall limit (recommend a capable enrichment model) (#419) (36b1b30)
- point all memclaw.dev links to memclaw.net (#475) (a6f9ad1)
- core-storage-api: consolidate router validation guards into _validation (#479) (e9dd9ca)
- plugin: configurable skill-reconcile targets (PR1 — refactor + config plumbing) (#413) (57e5e96)
2.16.0 (2026-06-15)
- compose: stop shadowing .env provider keys with empty "${VAR:-}" passthroughs (#346) (8ab95d8)
- core-api: make the CAURA-602 startup guard FastAPI-0.137-proof (#364) (65de110)
- deps: cap fastapi <0.137 to unbreak CI (#359) (561d5c9)
- fleet: cap auto-upgrade re-queue with a per-(node,target) attempt budget (CAURA-000) (#351) (22a3ac0)
- keystones: let the standalone operator author keystones out-of-the-box (F-7) (#354) (d62c36a)
- plugin: send X-Bulk-Attempt-Id header on bulk memory writes (#355) (a4515ed)
- search: return raw cosine in similarity, not the ranking composite (F-14) (#392) (3865600)
- search: surface conflicted memories that exactly match the query (#357) (c00a3f7)
- add top-level BENCHMARKS.md as a citable benchmark asset (#349) (fc6d563)
- comparison table — "PII detection & flagging", not "quarantine" (#345) (3bb7b1c)
- core-api: document the redis<9 cap rationale (review follow-up) (#395) (cd5420c)
- lead Quick Start with a no-key, no-signup local quickstart (#348) (91ee613)
- README write-response field names match payload (#361) (2ecc098)
2.15.0 (2026-06-13)
- skills: gate the OpenClaw install path to active-only skills (#317) (50488fc)
- skills: per-node skill-reconcile observability on the heartbeat (#325) (d806114)
- api: close cross-tenant and caller-asserted-identity authz gaps (#320) (fcf96c7)
- api: default agent_id to "mcp-agent" on standalone POST /memories (#339) (4d2d6ef)
- core-worker: retry connection-phase failures on storage calls — shared policy in common/http_retry (#334) (43b3d81)
- cross-links: single multi-VALUES insert — executemany cannot RETURN rows (#337) (8bbdeed)
- cross-tenant search widening, non-default LLM structured-output kwargs, event deploy safety (#322) (f161607)
- embedding: fall back to default model when OPENAI_EMBEDDING_MODEL is empty (#336) (d1f1f5a)
- entities: scope-filter relations in get_entity and drop the per-memory agent lookup (#321) (e355f87)
- entity-linking: bind reinforce weight directly — LEAST over untyped params coerced to text (#341) (b4a5712)
- entity-linking: synchronize_session=False on the entity-embedding backfill bulk update (#342) (c310ecf)
- events: publisher candidate cleanups also called the nonexistent close() (#331) (610fe8e)
- events: pubsub shutdown never flushed the publisher — final batches silently lost (#330) (1c2aba5)
- llm: explicit httpx per-phase timeouts — 5s connect too tight behind VPC connector (#332) (ea89a61)
- logging: reroute idempotency guard mis-keys on captured handlers (#328) (352689d)
- mcp: enforce gateway perimeter on the /mcp header-trust path (#319) (109d837)
- mcp: memclaw_tune crashed with 'dict' object has no attribute 'id' (#338) (30e3cff)
- plugin: point agents at the memclaw skill by name, not by filesystem path (CAURA-000) (#323) (ec3fcaf)
- release: keep plugin/src/version.ts in sync on release-please PRs (#335) (e26a3c5)
- search: consume the inflight embedding future's exception when no joiner awaits it (#340) (a06ec53)
- search: skip entity hop-boost when classifier declined the entity match as over-broad (#327) (4744732)
- storage-client: retry POSTs on connection-phase failures — never-sent requests cannot double-insert (#333) (2d91e33)
- add eToro proof, comparison table, FAQ, and star ask to README (#326) (e6395b5)
- bump eToro memory count 21,500 → 26,500 + social card (#329) (ea0e52b)
- correct Claude Code MCP setup — claude mcp add -s user, not settings.json (#343) (fc6324b)
- fix README/AGENT-INSTALL inaccuracies (PII, health shape, write response) (#344) (2dea567)
2.14.0 (2026-06-10)
- skills: auto-approve clean Forge candidates (skip HITL inbox) (#313) (6f3452d)
- skills: MCP-direct delivery — agents discover only active skills (#315) (1ac4f1f)
- skills: wire Forge into the lifecycle cron fanout (#311) (0523ed0)
2.13.0 (2026-06-08)
- embedding: let the platform singleton target a self-hosted endpoint (#291) (0991cef)
- graph-build: drop literal/attr entity nodes, block suffix-distinct merges, rerank entity_lookup by query overlap (#304) (f3a0f7c)
- skills: Skill Factory · Phases 0, 1, and 2 (partial — backend only) (#293) (f654ddb)
- events: drop cross-environment Pub/Sub fan-out messages (#297) (4f03679)
- events: env-scoped topic prefix for PubSubEventBus (no-op default) (#295) (0864274)
- evolve: pass weight_adjustment_skipped_reason from MCP evolve path (#299) (b7d0f2f)
- fleet: bound deploy-queue runaway when a previous deploy is acked (CAURA-000) (#305) (a94d0ab)
- plugin: bound resolveTenantId fetch with AbortSignal timeout (CAURA-000) (#292) (a3532a4)
- plugin: don't create plugins.allow from nothing on autoFix (CAURA-000) (#307) (2aab828)
- plugin: memoize bootstrap at process level (CAURA-000) (#303) (3bbb559)
- plugin: schedule restart AFTER result POST resolves (CAURA-000) (#306) (fe8ad26)
- plugin: suppress bootstrap agent-id warn + swallow afterTurn 409 (CAURA-000) (#300) (6705315)
- return real columns from cross-link insert instead of nonexistent id (#298) (7ddb78b)
- search: bound graph BFS frontier to prevent unbounded IN-clause (CAURA-000 F4) (#301) (b7d73d4)
2.12.1 (2026-06-07)
2.12.0 (2026-06-03)
- api: reject server-reserved memory_types at write boundary (C3, C8) (#261) (0abd727)
- api: surface near_duplicate_of in default-mode write metadata (A21) (#266) (e7f9bc8)
- core-api: add fleet-scoped hard-purge endpoint (#275) (cd9e2a6)
- core: deletion-preview counts (CAURA-696 PR A — OSS half) (#246) (454a233)
- core: OSS suppression mirror + boundary guard (CAURA-694) (#244) (64cf3e4)
- evolve: surface weight-adjustment skip reason (A15) (#257) (5f314d9)
- lifecycle: align all lifecycle crons to a fixed UTC hour, not boot-relative intervals (#278) (6b73bba)
- lifecycle: run insights cron at a fixed UTC hour, not a boot-relative interval (#277) (bca3ddd)
- plugin: bump MEMCLAW_KEYSTONES_TOKEN_CAP default 500 → 1500 (CAURA-000) (#249) (6c3b021)
- storage: purge_org_data primitive for org hard-delete (CAURA-689) (#241) (f3d896b)
- api: accept metadata_mode as a query param on PATCH /memories/{id} (C7) (#265) (808f4c5)
- mcp: extend mcp-agent default refusal to all read tools (A29) (#263) (1cccbe3)
- mcp: extend mcp-agent default refusal to all write tools (A14) (#256) (887c702)
- plugin: context-engine auto-recall, smoke cleanup & post-upgrade allowlist drift (#274) (573857c)
- plugin: tolerate undefined config in ContextEngine constructor (CAURA-000) (#247) (78e10fb)
- recall: add items alias key to /recall response (C4) (#262) (88ca5a8)
- search: dedup per-tenant storage_search slot on entity-lookup fall-through (C10) (#264) (905db5c)
- search: include EMBEDDING_QUERY_INSTRUCTION in embedding cache key (C9) (#259) (595300a)
- search: per-task timeout for parallel_embed_entity_boost (D7) (#260) (68f1977)
- search: share entity tokenizer between FTS-weight + entity-FTS gates (A27) (#258) (71fd841)
- security: block agent credentials from agent-management & settings (trust self-escalation) (#252) (8475901)
- security: enforce fleet/agent scope on by-id memory access (#250) (fde5ceb)
- security: enforce fleet/agent scope on entity reads + document deletes (#253) (dab6b71)
- security: gateway-shared-secret gate on the X-Tenant-ID auth path (CRITICAL-1, app side) (#254) (045039f)
- security: require admin-trust for bulk/whole-tenant memory deletes (#251) (9fcac01)
- version-compat: bump MIN_RECOMMENDED_PLUGIN_VERSION to 2.7.0 (#279) (7238180)
2.11.0 (2026-05-28)
- events: subscription manifest to guard infra provisioning (#240) (6332c25)
- lifecycle: add insights daily cron (#238) (b17482d)
- plugin-manifest: include min_auto_deploy_plugin_version (#225) (09bac0a)
- storage-api: add /_debug/pg_locks endpoint for live lock investigation (CAURA-686) (#219) (80b2eed)
- core-api: bump storage_client httpx pool limits 100/50 -> 200/150 (CAURA-682) (#224) (240e0b3)
- logging: propagate stdlib logger extras into structlog JSON (#209) (43240ca)
- mcp: wire read-only scope gate and reset ContextVars per request (#210) (7f21f14)
- plugin: delegate compaction to OpenClaw runtime SDK to unwedge over-budget groups (CAURA-000) (#234) (6e70d3f)
- plugin: wire keystones into WhatsApp system prompts end-to-end (CAURA-000) (#212) (cb54bda)
- storage-api: bulk-insert memory_entity_links with ON CONFLICT DO NOTHING (CAURA-686) (#220) (7ab127a)
- storage: drop name_embedding/search_vector from entity payloads (#206) (731ec6c)
- version-compat: bump MIN_RECOMMENDED_PLUGIN_VERSION to 2.6.3 (#226) (bf9021c)
- version-compat: bump MIN_RECOMMENDED_PLUGIN_VERSION to 2.6.4 (#242) (f5668f6)
- write: skip embedding-cache lookup when embedding is deferred (CAURA-682) (#216) (195176d)
- contradiction: collapse N+1 status updates into batch_update_status per path (P2) (#236) (2c8942c)
- crystallizer: collapse archive-sweep N+1 storage HTTPs (P5) (#239) (751108c)
- ingest: route ingest_commit through create_memories_bulk (#227) (245b947)
- mcp: close DB session before evolve LLM round-trip (#232) (d652777)
- mcp: close DB session before insights LLM round-trip (#231) (a8af687)
- mcp: close DB session before recall brief LLM round-trip (#228) (13f09b6)
- recall: add stampede guard to query-embedding cache (#213) (677032f)
- recall: close DB session before LLM brief on REST /recall (#233) (21f8434)
- stats: collapse compute_memory_stats into one GROUPING SETS query (#214) (63310a1)
2.10.0 (2026-05-25)
2.9.0 (2026-05-24)
- contradiction: back-channel idempotency on detection entry (A4 #14) (#188) (f370fad)
- contradiction: Path C re-judges and retracts wrong Path A verdicts (A4 #13) (#187) (1669690)
- contradiction: widen _llm_contradiction_check to (verdict, confidence) (A4 #12) (#186) (0c332a3)
- dedup: add two-tier dedup threshold constants (A1 #15) (#190) (dcc41ae)
- dedup: backend review queue for ambiguous decisions (A1 #18) (#194) (bf6dce7)
- dedup: identifier pre-filter in CheckSemanticDuplicate (A1) (#195) (a578a35)
- evolve: surface rule-synthesis skip reason on every path (A10) (#199) (b16de2b)
- storage: find_entity_overlap_candidates surfaces conflicted supersedes_of target (A4 #11) (#185) (f120f55)
- enrichment: action/episode few-shot disambiguation (A9) (#198) (81ec08f)
- enrichment: tighten tag generation prompt + normalising validator (A8) (#197) (6bea431)
- plugin: conform to OpenClaw MemoryFlushPlan contract (CAURA-000) (#191) (ea750c7)
- search: query classifier recall on entity-token queries (A7) (#196) (670549b)
- storage: invert A4 #11 include_supersedes filter direction (#189) (831897d)
- config: delete legacy embed/enrich_on_hot_path flags + asymmetric branch (F3 Phase 3) (#183) (9116e80)
2.8.0 (2026-05-20)
- config: add deployment_mode setting alongside legacy flags (F3 Phase 1) (#173) (1cc30b0)
- entity-extraction: plumb tenant_config through worker → extractor (A5c) (#170) (62bdee9)
- entity-extraction: prompt + schema overhaul (A5b) (#169) (7c0d862)
- storage: support retracting supersedes_id verdicts (A4 #10) (#171) (ccebcb5)
- widen cross-tenant credential reads across all surfaces + audit emission + /whoami scope (#164) (0afacdb)
- entity-extraction: deterministic seed + first-seen canonical preservation (A5a) (#167) (0a27e66)
- mcp: disable auto-generated output schema on tool registrations (#180) (61d19a4)
- mcp: MISSING_AGENT_ID error no longer points at deprecated mca_ keys (#161) (c7525bf)
- plugin: close install-script alsoAllow drift + manifest version drift (CAURA-444) (#181) (28f22aa)
- release-please: correct openclaw.plugin.json path under the plugin package (#182) (630653c)
- tests: make rate-limit burst tests reliable + defensively unset MEMCLAW_API_KEY (#177) (bc5e144)
- memory_service: migrate 7 legacy flag reads onto deployment_mode (F3 Phase 2c) (#178) (17d8635)
- pipeline: migrate parallel_embed_enrich onto deployment_mode (F3 Phase 2 batch 1) (#174) (1a36481)
2.7.0 (2026-05-18)
2.6.0 (2026-05-17)
- core-api: install-credential auth context + http:// ID-token bypass (#146) (160e143)
- ingest: 3 MB body cap + POST /ingest/file + text/csv support (#130) (eb1e3ce)
- ingest: parent Document per batch + run_id index + undo migration (#134) (f2e0204)
- memories: add run_id query filter to /api/memories (#145) (1063590)
- plugin: decouple plugin release cadence from backend (#131) (ac6c0f2)
- ingest: preserve uploaded filename in source_uri (#133) (b25e609)
- search: trust has_embedding sentinel in post-filter for FTS-only rows (#150) (cc1d311)
- write: close fast-branch coverage holes + add always-fire detection logs (#152) (ffb26fd)
- write: make ParallelEmbedEnrich deferral write_mode-aware (#151) (f2236ad)
2.5.0 (2026-05-11)
- core-storage: keystone-rule CRUD on _keystones collection (CAURA-000) (#109) (bd94a9e)
- fleet-stats: include agent trust_level in per-agent records (#116) (1c0e6e7)
- ingest: harden URL fetch (Content-Type allowlist + size cap + SS… (#115) (9a36656)
- ingest: strong-mode writes + pre-loop dedup + parallel commit (P… (#117) (8359df1)
2.4.0 (2026-05-10)
- fleet-stats: add memory-status totals to fleet_summary (#107) (866c5ac)
- recall: exclude superseded memories from default search results (#106) (dc03047)
- stats: add include_deleted option to memclaw_stats / /memories/stats (#105) (d8121f6)
- cache: include VECTOR_DIM in qemb query-embedding cache key (CAURA-644) (#69) (761161c)
- core-api: align write/query embedding surface (CAURA-222) (#104) (9ff97cd)
- release-please: add signoff so release PRs pass DCO (#101) (50369b0)
2.3.0 (2026-05-06)
2.2.0 (2026-05-06)
2.1.0 (2026-05-06)
- add security.session_idle_timeout_minutes org setting (CAURA-652) (#89) (d264cfe)
- core-operations: scaffold OSS service for cron/scheduled jobs (CAURA-653) (#82) (838a54d)
- crystallize + entity-link Pub/Sub fanout (CAURA-657) (#87) (966f1a5)
- lifecycle ops Pub/Sub fanout via core-operations (CAURA-655) (#84) (193b0a7)
- mcp: add memclaw_stats — aggregate memory counts on MCP (#64) (cb6d29a)
- memory retention purge on top of lifecycle Pub/Sub fanout (CAURA-656) (#86) (7e05ee4)
- skills as documents (Phase B) — drop dedicated tools/routes (#85) (d2bdf3b)
- skills: agent-to-agent skill sharing across the fleet (#68) (e95b1d0)
- core-worker: bundle Vertex SDK + improve retry log (CAURA-648) (#78) (85e54af)
- core-worker: init platform LLM singleton on lifespan startup (CAURA-647) (#74) (8cc74dd)
- crystallizer: /latest 404→200 null on empty (CAURA-646) (#71) (a8a63c9)
- deps: bump google-cloud-aiplatform>=1.80, drop standalone vertexai (CAURA-650) (#80) (74c2092)
- plugin-install: fetch openclaw.plugin.json instead of baking a HEREDOC (#81) (aedbd47)
- plugin: auto-fill target_fleet_id on skill share/unshare (#72) (35d7202)
- plugin: make install_on_fleet skill flow actually work end-to-end (#77) (97da9fa)
- scripts: backfill_embeddings — str-cast + add openai to core-storage-api deps (#65) (e77a256)
- vertex: raise typed error on non-dict JSON response (CAURA-651) (#90) (ece0081)
- remove security.session_idle_timeout_minutes from OSS organization_settings (CAURA-660) (#91) (094d785)
2.0.0 (2026-05-03)
⚠️ BREAKING CHANGE — local embedder + 1024-dim schema migration. v2.0.0 introduces a self-hosted embedder profile (BAAI/bge-m3via HuggingFace TEI sidecar — seedocs/local-embedder.md) and migrates the pgvector schema from 768-dim to 1024-dim (alembic012_vector_dim_1024). Existing installations must opt in viaMEMCLAW_RUN_DESTRUCTIVE_MIGRATIONS=trueand re-embed afterward — see README "Upgrading from v1.x" for the procedure. Fresh installs are unaffected.
- agents: split agent_id (opaque, stable) from display_name + plugin install_id (CAURA-000) (#55) (edc79e3)
- enrichment: consolidate memory-type vocabulary as single source of truth (CAURA-000) (#60) (223601a)
- errors: standardize error contract across REST and MCP (#58) (6d33caf)
- events: EVENT_BUS_PUBSUB_MAX_MESSAGES override (CAURA-636) — v2 (#48) (5fb90a1)
- events: EVENT_BUS_PUBSUB_MAX_MESSAGES override (CAURA-636) (#46) (fb0104a)
- infra: docker-compose pulls published images by default (#28) (3d30d97)
- scripts: preflight_012 — DB readout before migration 012 (#59) (049ee0c)
- standardize on POSTGRES_* env vars + README/CONTRIBUTING pre-launch cleanup (#26) (8a9d017)
- stats: real public counters + /api/v1/status + trust soft-pass (CAURA-000) (#54) (075aefc)
- api: include visibility in GET /memories/{memory_id} response (#40) (9562a79)
- audit: batch + async ingest via in-memory queue (CAURA-628) (#36) (404f064)
- audit: per-tenant slot in batch flusher to stop bulk_write contention (CAURA-631) (#44) (dde839a)
- bulk: per-attempt idempotency + 207 Multi-Status (CAURA-602) (#23) (d2e7c1c)
- contradiction: preserve direction invariant on re-fired detection (#41) (78a993b)
- contradiction: scope candidate fetch by writer visibility (#38) (6e31348)
- core-storage: exclude soft-deleted from public /stats counters (#27) (f1581a8)
- idempotency: close concurrent-claim race with pending-row pattern (#32) (a58a719)
- infra: point docker-compose.dev at per-service Dockerfiles (CAURA-111) (#37) (b093536)
- llm,embedding: explicit httpx.Limits on OpenAI-compatible providers (CAURA-627) (#34) (1e2e799)
- logging: route uvicorn / fastmcp / mcp / slowapi to root formatter (CAURA-588) (#32) (f4cc494)
- memories: apply visibility scoping to memory count endpoints (CAURA-000) (#42) (6e26dcb)
- memories: per-phase storage timeout for bulk-create (CAURA-599) (#33) (6ac1ca5)
- memories: wire GET /memories/:id/contradictions to detector results (CAURA-604) (#31) (85b4a54)
- memory: drop unused unscoped indexes ix_memories_status + ix_memories_visibility (CAURA-629) (#35) (9b2e071)
- memory: restore ix_memories_status + ix_memories_visibility (CAURA-632) (#45) (4be9017)
- noisy-neighbor: per-tenant asyncio.Semaphore on /search + writes (#33) (1ce87b5)
- noisy-neighbor: per-tenant storage-roundtrip bulkhead (draft, gated on #23 loadtest) (#24) (f934d73)
- noisy-neighbor: widen per-tenant Semaphore caps so bench loop fits (#30) (f52d4b5)
- search: drop UUID/hex fragments before entity FTS roundtrip (#29) (320d9ac)
- stats: defensive fallback to storage-api on DB pool exhaustion (#31) (293bd42)
- storage: align core-storage-api DB pool defaults with platform-storage (5+5) (#25) (061155e)
- storage: unblock migrations that use
autocommit_block(#27) (835e1a7) - worker: per-tenant storage slot to stop noisy-neighbor PATCH-back contention (CAURA-636) (#53) (98ae9d9)
- write: str() subject_entity_id before storage POST (#39) (7b232f5)
Initial public release. The public API surface and stability scope are declared in README.md § Public API & Stability.