Append-only события каждого агента, детерминированный канон без LLM и Postgres с pgvector по 11 тысячам чанков диалогов и заметок.
vault/ Agents/<agent>/events.md append-only Canon/TODO · FACTS · DECISIONS read-only _System/consolidate.py единственный писатель warehouse/ migrations/*.sql mem_documents, mem_chunks, mem_search tools/mem_search.py вектор + FTS, RRF
Файлы остаются истиной, база только индекс. Любой сбой лечится пересборкой из Markdown.
732 диалога ChatGPT и Gemini плюс 130 файлов заметок, 126 МБ.
events.md под флагом uappnd: перезапись отклоняет сама ОС. Канон собирает консолидатор.
Прошлое не редактируется, ошибка исправляется новым событием со ссылкой.
HNSW cosine и русский FTS, слияние RRF, фильтры по сфере, источнику и дате.
Дамп меньше 10 МБ или пустой ответ эмбеддера считаются ошибкой, ротация не трогает старое.
Две независимые части: общая память агентов на файлах и склад с индексом на Postgres.
flowchart LR
subgraph vault
A1[Agents/openclaw/events.md] --> C[consolidate.py<br/>id, дедуп, канон, chmod, git]
A2[Agents/hermes/events.md] --> C
C --> K[Canon/TODO · FACTS · DECISIONS]
end
subgraph warehouse
C --> PG[(Postgres 17 + pgvector)]
AR[экспорты ChatGPT, Gemini] --> IM[import_archive.py<br/>маскирование секретов] --> PG
K --> BV[mem_backfill_vault.py] --> PG
PG --> BA[mem_backfill_archive.py<br/>чанки + Ollama 768d] --> PG
Q[mem_search.py<br/>вектор + FTS, RRF] --> PG
end
AG[агенты] --> QКаждый пишет только в свою папку дозаписью, Canon read-only, консолидатор детерминированный.
Стартовый скрипт считал «already running» успехом. Теперь каждый ночной скрипт обязан вернуть ненулевой код при сбое.
Один локальный Ollama embeddinggemma обслуживает и склад, и память агента, без облака.