Files
molecule-core/docs/architecture/memory.md
T
hongming be9190e57a
Block internal-flavored paths / Block forbidden paths (push) Waiting to run
ci-arm64-advisory / fast-checks (push) Waiting to run
CI / Python Lint & Test (push) Waiting to run
CI / Detect changes (push) Waiting to run
CI / Platform (Go) (push) Blocked by required conditions
CI / Canvas (Next.js) (push) Blocked by required conditions
CI / Shellcheck (E2E scripts) (push) Blocked by required conditions
CI / Canvas Deploy Reminder (push) Blocked by required conditions
E2E API Smoke Test / detect-changes (push) Waiting to run
E2E API Smoke Test / E2E API Smoke Test (push) Blocked by required conditions
E2E Chat / detect-changes (push) Waiting to run
E2E Chat / E2E Chat (push) Blocked by required conditions
E2E Staging Canvas (Playwright) / detect-changes (push) Waiting to run
E2E Staging Canvas (Playwright) / Canvas tabs E2E (push) Blocked by required conditions
Handlers Postgres Integration / detect-changes (push) Waiting to run
Handlers Postgres Integration / Handlers Postgres Integration (push) Blocked by required conditions
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (push) Waiting to run
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (push) Waiting to run
publish-workspace-server-image / Production auto-deploy (push) Blocked by required conditions
Secret scan / Scan diff for credential-shaped strings (push) Waiting to run
CI / all-required (push) Has been cancelled
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (push) Successful in 10s
publish-workspace-server-image / build-and-push (push) Has been cancelled
docs: #1753 sweep awareness namespace mentions across narrative docs (#1758)
CTO-bypass merge 2026-05-24: CI/all-required green at 05:00:25Z, persona acks in place.
2026-05-24 05:20:43 +00:00

5.2 KiB

Memory Architecture (HMA)

Molecule AI's memory model is built around one principle:

memory boundaries should follow organizational boundaries.

That is the purpose of HMA: Hierarchical Memory Architecture.

The Three Scopes

Scope Meaning Intended use
LOCAL visible only to the current workspace private scratch facts and local recall
TEAM visible to the local team boundary handoffs between a parent and its direct children, or siblings under the same parent
GLOBAL readable across the tree; writable only from the root side org-wide guidance, standards, shared institutional knowledge

These are the scopes exposed through the runtime memory tools:

  • commit_memory(content, scope)
  • search_memory(query, scope)

What Exists In The Current Implementation

There are multiple memory surfaces, and the distinction matters.

1. Scoped agent memory (agent_memories)

This is the HMA-facing storage used by:

  • POST /workspaces/:id/memories
  • GET /workspaces/:id/memories
  • runtime tools commit_memory / search_memory

It stores durable facts with a LOCAL, TEAM, or GLOBAL scope.

2. Workspace key/value memory (workspace_memory)

This is the simpler key/value surface used by the canvas Memory tab:

  • GET /workspaces/:id/memory
  • POST /workspaces/:id/memory
  • DELETE /workspaces/:id/memory/:key

It is useful for structured per-workspace state and optional TTL entries. It is not the same thing as scoped HMA memories.

GET /workspaces/:id/session-search provides a thin recall surface over recent activity rows and memory rows. It is for “what just happened in this workspace?” rather than long-term semantic storage.

4. Memory v2 plugin (memory_records / memory_namespaces)

This is the production-direction backend, behind the RFC #2728 HTTP contract. The plugin runs as a sidecar on each tenant EC2 (auto-spawned by entrypoint-tenant.sh when MEMORY_PLUGIN_URL is set), owns its own tables under the memory_plugin schema, and serves:

  • POST /workspaces/:id/v2/memories (canvas MemoryInspectorPanel)
  • GET /workspaces/:id/v2/memories
  • DELETE /workspaces/:id/v2/memories/:id
  • runtime tools commit_memory_v2, search_memory, commit_summary, forget_memory
  • legacy MCP tool names commit_memory / recall_memory via the scope→namespace shim in mcp_tools_memory_legacy_shim.go

Capability negotiation (FTS, embedding, TTL, pin, propagation) is declared by the plugin via GET /v1/health; workspace-server adapts the tool surface to what the plugin actually supports. See memory-plugin-v1.yaml for the full wire contract.

Access Model

Molecule AI's memory rules follow the same hierarchy logic as communication rules:

  • LOCAL belongs to one workspace
  • TEAM follows the immediate team boundary
  • GLOBAL is readable widely but writable only from the root side

The platform-side memory handlers still apply reachability checks for shared/team reads instead of trusting callers blindly.

Current Schema Reality

The current agent_memories migration is intentionally simple:

CREATE TABLE IF NOT EXISTS agent_memories (
    id           UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    workspace_id UUID REFERENCES workspaces(id),
    content      TEXT NOT NULL,
    scope        VARCHAR(10) NOT NULL CHECK (scope IN ('LOCAL', 'TEAM', 'GLOBAL')),
    created_at   TIMESTAMPTZ DEFAULT now(),
    updated_at   TIMESTAMPTZ DEFAULT now()
);

pgvector is not enabled by default in the shipped migration. The repo keeps vector support as an optional future extension, not as a current hard dependency. The docs should reflect that explicitly.

Why This Architecture Matters

Flat shared memory model Molecule AI HMA
easy to over-share scopes align to hierarchy
unclear ownership each memory belongs to a workspace and a scope
recall and procedure blur together memory stores facts, skills store repeatable procedure
hard to govern org structure and memory rules reinforce each other

Memory To Skill Promotion

Molecule AI intentionally separates:

  • durable fact storage
  • repeatable operational procedure

The documented promotion path is:

  1. a durable workflow is captured in memory
  2. repeated success becomes a signal
  3. the workflow is promoted into a skill package
  4. the runtime hot-reloads that skill

This is why memory and skills are presented as adjacent systems, not one merged blob.

Practical Summary

If you need:

  • private agent recall: use LOCAL
  • shared team handoff knowledge: use TEAM
  • org-wide guidance: use GLOBAL
  • simple UI-visible structured state: use workspace_memory
  • recent decision/task recall: use session-search
  • semantic / FTS search across memories: use the v2 plugin endpoints (/v2/memories?q=…); they go through the plugin's pgvector + tsvector indexes when the plugin declares the capability