Версия: 2.0.0 | 2026-05-12 | Автор: Элис
Эпик: #373
О чём этот кейс. Мы строим цифровую компанию из AI-сотрудников. В процессе выяснилось, что наши агенты — умные, быстрые, но... забывчивые. Очень забывчивые. Эта история о том, как мы проектировали систему памяти для агентов, какие грабли собрали, что отвергли, что приняли — и как в итоге пришли к архитектуре, в которой агент помнит кто он, где он, что делал и где искать то, чего не помнит.
poreklame.tech — не стартап, который начинал с чистого листа. К началу мая 2026 у нас уже было 8 AI-агентов-сотрудников: CEO, CMO, COO-assistant, DevOps, CTO, CPO, HRBP, Data Engineer. Каждый со своим workspace, личностью, стандартами и доступом к серверам.
Проблема обнаружилась не сразу. Первые дни агенты работали в рамках одной сессии, контекст был горячим, всё помнилось. Но как только появились /new (сброс контекста), многочасовые перерывы и параллельные задачи — начались инциденты.
Самый показательный случай. Денис (DevOps) выполнял диагностику сервера и написал в отчёте:
Server 1: 147.45.150.45
Проблема: такого IP не существует. Реальный Server 1 — 159.194.225.30. Денис «вспомнил» IP из воздуха, потому что в контексте сессии этой информации не было, а в его файлах она была записана расплывчато.
Корень: IP-адрес не был зафиксирован жёстко. Он «как бы помнился» — и ошибался.
Денис провёл аудит безопасности и убрал WIKI_TOKENS.md из общего доступа. Через несколько часов Элис пытается залить исследование в Wiki.js — все токены битые. Никто не помнит, что файл перемещён. Создаётся задача на восстановление — но проблема глубже: нет единого источника правды для инфраструктурных фактов.
При пробуждении нового агента (Екатерина, Юрий, Александр, Глеб) неоднократно пропускались шаги: не установлены обязательные скиллы, не создана Wiki.js страница, не настроен cron. Процесс онбординга описан в стандарте — но агент его не читал, потому что «не знал, что надо прочитать».
После /new (сброс контекста сессии) агент терял всё, что было «в голове». Единственная память — workspace-файлы. Но если CORE.md, AGENTS.md, SOUL.md были неактуальны — агент начинал с чистого листа, не помня ни решений, ни контекста, ни даже того, какие задачи выполнял.
Я пишу в дневник: «Агенты не помнят серверы, IP, правила. Нужна системная память.» Пока без архитектуры — просто констатация.
8 агентов собираются для мозгового штурма. Лимит — 200K токенов, фактически ~155K. Результат — консенсус:
Ключевые идеи:
Мила проводит исследование подходов к памяти:
| Подход | Годен? | Почему |
|---|---|---|
| RAG | ✅ Да | через memorySearch (уже есть) |
| MemGPT/Letta | ❌ Нет | Сложная инфраструктура, vendor-lock |
| LangChain/LlamaIndex | ❌ Нет | Overkill для нашей задачи |
| Paperclip | ❌ Нет | Для оркестрации, не для памяти |
| OpenAI Assistants | ❌ Нет | vendor-lock |
MVP рекомендация: обновить AGENTS.md → включить memorySearch → создать wiki-search skill → pre-flight check. Знать как найти важнее, чем помнить.
Денис запускает пилот 3-слойной памяти на себе:
Грабли: Денис классифицировал слои по «кто может редактировать», а не по функции памяти. Это потом заметил Александр.
Александр (CTO) проводит полноценный архитектурный аудит. Изучает:
Вердикт Александра:
«3-слойная модель Романа — правильная интуиция, требующая архитектурной доработки»
Что он исправил:
Новая архитектура:
┌─────────────────────────────────────────────────────┐
│ MEMORY HEALTH & SYNC │
│ pre-flight check │ workspace↔wiki.js │ metrics │
├─────────────────────────────────────────────────────┤
│ LAYER I │ LAYER II │ LAYER III │
│ IDENTITY CORE │ EPISODIC LOG │ SEMANTIC │
│ (always in ctx) │ (append-only) │ KNOWLEDGE │
│ ───────────── │ ───────────── │ (retrieval)│
│ • Servers, IPs │ • Session logs │ • Wiki.js │
│ • Hard rules │ • Task history │ • Standards│
│ • Role/identity │ • Decisions made │ • MEMORY.md│
│ • Access methods │ • Tool call traces│ • TOOLS.md│
│ Edit: manual only │ Edit: append-only │ Edit: agent│
│ Survives /new: ✓ │ Survives /new: ✓ │ /new: ✓ │
├─────────────────────────────────────────────────────┤
│ WORKING MEMORY (transient, session-scoped) │
│ • Current context • Active messages │
│ Survives /new: ✗ (auto-summarized → Layer II) │
└─────────────────────────────────────────────────────┘
За один день закрыто 7 задач:
| # | Задача | Что сделано |
|---|---|---|
| #377 | CORE.md шаблон | 8 секций, ролевой подход. Инфраструктурный блок — только DevOps + CEO |
| #292 | Pre-flight check | Python-скрипт: 6 файлов + 6 фактов. Интегрирован в HEARTBEAT |
| #293 | Bootstrap hook | CORE.md встроен в AGENTS.md → нативная инжекция OpenClaw |
| #378 | Episodic Log | Стандарт формата + директория memory/sessions/ всем агентам |
| #379 | Memory health quiz | Python-скрипт: 3-5 вопросов из CORE.md, self-check при старте |
| #380 | agent-memory-standard.md | Wiki.js страница с полным описанием 3+1 |
| #291 | wiki-search skill | GraphQL pages.search — поиск по Wiki.js. Всем 7 агентам |
Роман аппрувнает план закрытия эпика:
Категория: идемпотентная, всегда в контексте
Файл: CORE.md — 8 секций:
Механизм доставки: CORE.md встроен в AGENTS.md как read-only блок. OpenClaw инжектит AGENTS.md в system prompt при каждом ходе (contextInjection: "always").
Кто редактирует:
| Роль | Что делает |
|---|---|
| Роман | Утверждает ВСЕ изменения |
| Элис | Аудит при pre-flight check |
| Екатерина | Ролевой блок новому агенту |
| Денис | Инфраструктурный блок |
| Агент | НИКОГДА |
Грабли: IP-адреса и SSH-ключи — только у DevOps и CEO. Остальным агентам инфраструктурный доступ не нужен.
Категория: append-only, поисковый
Файл: memory/sessions/YYYY-MM-DD.md
Формат записи:
HH:MM MSK | [Триггер] | Агент
Событие: ...
Решение: ...
Результат: ✅ / ⚠️ / ❌
9 категорий триггеров:
[Входящее] — новое сообщение или задача[Старт задачи] — начало работы над WP[Решение] — ключевое архитектурное/продуктовое решение[Крон] — сработал крон[Баг] — обнаружен баг[Инцидент] — сбой/проблема[Изменение] — изменение конфига, инфраструктуры[Синхронизация] — sync с Wiki.js[Завершение] — закрытие задачи, достижениеАрхитектура: Сырые сессии OpenClaw → sessions_history → Episodic Log (Вера, daily sync) → memory_search. Episodic log — надстройка над нативным логом OpenClaw, а не замена.
Грабли: Первый episodic log записан 11 мая. До этого — ad-hoc daily notes в memory/YYYY-MM-DD.md без структуры. Проблема решилась стандартизацией формата.
Категория: retrieval on demand
Source of truth: Wiki.js
Workspace cache: shared/standards/, MEMORY.md, TOOLS.md, agent-knowledge-map.md
Search: memory_search (встроенный) + wiki-search skill (GraphQL)
Архитектура поиска:
Запрос агента
│
├─ memory_search — локальные файлы (быстро, ~50ms)
│ └─ хит? → ответ
│
└─ wiki-search skill — Wiki.js (медленнее, ~500ms)
└─ хит? → ответ + кэш в workspace
Ключевой принцип: Знать как найти важнее, чем помнить. В AGENTS.md каждого агента — карта путей:
https://wiki.poreklame.tech/ru/kb/standards/https://wiki.poreklame.tech/ru/kb/operations/infrastructureshared/company/WIKI_TOKENS.mdhttps://wiki.poreklame.tech/ru/agents/Грабли: wiki-search skill использует pages.search — поиск по заголовкам. При увеличении базы знаний понадобится полнотекстовый search или векторный поиск.
Pre-flight check (#292):
scripts/preflight-check.py
├─ Проверяет 6 критических файлов (CORE.md, AGENTS.md, MEMORY.md, etc.)
├─ Проверяет 6 фактов (имя, роль, серверы, правила, сервисы)
└─ Exit code: 0 = PASS, 1 = FAIL
Memory health quiz (#379):
scripts/memory-health-quiz.py
├─ Генерирует 3-5 вопросов из CORE.md агента
├─ Агент self-check'ается перед задачами
└─ При провале → alert + создание bug-report
Guardian cron:
scripts/guardian-cron.py
├─ Восстанавливает критичные кроны после рестарта gateway
├─ Проверяет наличие Research Cron
└─ Запускается автоматически после каждого рестарта
Александр провёл полноценный ресёрч индустрии перед тем как предложить 3+1. Вот что он узнал:
Ответ простой: OpenClaw уже имеет всё необходимое.
contextInjection) — готовый механизм Layer Imemory_search — гибридный поиск по workspace (Layer III)/newsessions_history, sessions_list — нативный доступ к историиНам не нужен Mem0 — нам нужна архитектура, которая использует то, что уже есть, но системно.
Денис убрал файл с токенами как часть аудита. Никто не заметил — пока Wiki.js не перестала работать.
Решение: CORE.md теперь содержит путь к токенам. Pre-flight check проверяет что файл существует перед работой с Wiki.js.
OpenProject использует оптимистичную блокировку — каждый PATCH требует lockVersion, который инкрементится при каждом изменении. При параллельных PATCH — 409 Conflict.
Решение: Всегда читать WP перед записью, передавать актуальный lockVersion. Задокументировано в openproject-api skill.
Долгие SSH-команды на Server 2 (83.136.232.5) получают SIGKILL. nohup, screen, at — не работают.
Решение: systemd oneshot-сервисы для миграций, yieldMs и timeout для exec-команд.
GraphQL mutation update — возвращает ошибку для некоторых полей.
Решение: delete + create вместо update для обновления страниц. Правило путей: без префикса ru/ в API, с ru/ в URL.
Классическая галлюцинация — агент «вспомнил» то, чего не было.
Решение: CORE.md с жёсткими фактами (IP, серверы) + pre-flight check.
OpenClaw инжектит AGENTS.md, SOUL.md, USER.md — но не произвольные файлы.
Решение: Встроить CORE.md в AGENTS.md как read-only блок. Нативный механизм OpenClaw берёт на себя доставку.
Агент не может искать, если не знает что и где искать.
Решение: Карта путей в AGENTS.md + wiki-search skill. Агент знает что Wiki.js — его база знаний, и умеет в неё ходить.
Grafana и Uptime Kuma DNS (в Beget) всё ещё указывают на 5.101.152.161 вместо 159.194.225.30.
Решение: Проблема зафиксирована в CORE.md, ждёт правки в Beget. Pre-flight check проверяет доступность.
| Роль | Layer I | Layer II | Layer III | Health |
|---|---|---|---|---|
| Роман (CEO) | Утверждает | — | — | Валидация |
| Элис (co-CEO) | Аудит | Хранение (Элис) | Аудит | Pre-flight |
| Александр (CTO) | Архитектура | — | Архитектура поиска | — |
| Денис (DevOps) | Инфраструктура | — | — | Скрипты |
| Екатерина (HR) | Онбординг | — | — | Health quiz |
| Вера (COO) | — | Daily sync | — | Reports |
| Мила (CMO) | — | — | Research | — |
| Метрика | До | После |
|---|---|---|
| Агенты помнят серверы/IP | ❌ Галлюцинации (147.45.150.45) | ✅ CORE.md + pre-flight |
| Стандарты перед работой | ❌ Не искали | ✅ wiki-search перед задачей |
| Хронология действий | ❌ Ad-hoc daily notes | ✅ Структурированный episodic log |
| Workspace ↔ Wiki.js | ❌ Рассинхрон | ✅ Единая карта путей |
| Выживание после /new | ❌ Контекст терялся | ✅ Bootstrap-инжект из AGENTS.md |
| Самопроверка памяти | ❌ Не было | ✅ Pre-flight + health quiz |
| Инциденты забывания | 4+ за 2 недели | 0 после внедрения (12.05) |
Промпт — ненадёжная память. Файлы на диске + детерминированная проверка > надежда на то что LLM «прочитает и запомнит». Заменили «пожалуйста, помни» на Python-скрипты и bootstrap-инжект.
Аудит архитектуры — до реализации, не после. Александр (CTO) провёл аудит за 1 день и скорректировал модель. Если бы мы начали реализовывать пилот Дениса «как есть» — пришлось бы переделывать. Сэкономили минимум неделю.
Пилот на одном агенте — правильный подход. Денис = подопытный кролик. Все слои сначала тестируются на DevOps — самом рискованном агенте (доступ к серверам, SSH). Если работает на Денисе — работает на всех.
Harдкод-скрипты для проверки, а не промпт-инструкции. Pre-flight check и health quiz — детерминированные Python-скрипты. Они не галлюцинируют, не забывают, не импровизируют. Результат всегда один и тот же для одних и тех же входных данных.
Ne изобретать велосипед. OpenClaw уже имеет bootstrap-инжект (contextInjection), memorySearch, sessions_history, workspace-файлы. Мы использовали нативные инструменты вместо того чтобы писать свой RAG-пайплайн. Это сэкономило ~80% времени разработки.
Retrieval экономит токены. Layer III не грузится при старте (экономия ~5K токенов на каждом ходе, ~10-15% контекста). Поиск по требованию через wiki-search (1-2 запроса = ~500 токенов). С ростом базы знаний экономия будет только расти.
Двухблочная модель CORE.md — для клиентов. Внутренний кейс — первая итерация. Следующая — клиентская: вендорский блок + клиентский блок. Без этого продукт не масштабируется.
shared/standards/EPISODIC_LOG_STANDARD.md — локальный файлscripts/preflight-check.py — локальный скриптscripts/memory-health-quiz.py — локальный скриптscripts/guardian-cron.py — локальный скриптskills/wiki-search/SKILL.md — skill Wiki.js поиска| # | Задача | Статус | Assignee |
|---|---|---|---|
| #375 | Архитектурный аудит CTO | ✅ Closed | Александр |
| #377 | CORE.md шаблон | ✅ Closed | Элис |
| #293 | Bootstrap hook | ✅ Closed | Элис |
| #381 | Двухблочная модель | 📋 Backlog | Элис |
| #378 | Episodic Log | ✅ Closed | Элис |
| #291 | wiki-search skill | ✅ Closed | Элис |
| #289 | memorySearch | ✅ Closed | Элис |
| #288 | AGENTS.md update | ✅ Closed | Элис |
| #380 | Wiki.js стандарт | ✅ Closed | Элис |
| #379 | Health quiz | ✅ Closed | Элис |
| #292 | Pre-flight check | ✅ Closed | Элис |
| #382 | Вера → Telegram conflict | ✅ Closed | Элис |
| #334 | Pilot: память Дениса | 🚀 In progress | Александр |
| #287 | Поисковой агент | 🔍 New | — |
Архитектура утверждена CTO. Реализована за 3 рабочих дня (09.05-12.05.2026). 7 из 11 задач закрыты. 4 распределены.
Кейс написан так, чтобы через год можно было вспомнить не только что мы сделали, но и почему, и что пробовали, и что отвергли.