🇬🇧 English version — каноническая версия, она может быть новее.
Память - то, что копится. Большинство агентов забывают вас в тот момент, когда переполняется контекстное окно - 131k токенов улетают быстро. Iva складывает всё в vault из обычного markdown, наводит в нём порядок, пока вы спите, и достаёт только то, что нужно конкретному вопросу. Вы говорите - она раскладывает.
Iva значит ива, и память устроена как дерево:
| Слой | Что там живёт | Путь |
|---|---|---|
| 🍃 Листья | дословный транскрипт каждого дня, вместе с ответами Iva | daily/YYYY-MM-DD.md |
| 🌿 Ветви | сводки, свёрнутые вверх: день → неделя → месяц → год | summaries/daily/, weekly/, monthly/, yearly/ |
| 🪵 Ствол | CORE.md (≤1200 символов, в каждом промпте) + типизированные карточки: контакты, проекты, решения, идеи, заметки |
CORE.md, cards/ |
CORE.md едет в каждом системном промпте; всё остальное подтягивается под запрос ранжированным поиском. Недельная сводка весит примерно 1/35 своих семи сырых дней, так что вспоминать остаётся дёшево, как бы vault ни разрастался.
Один скрипт, четыре внутрипроцессных eve schedules, настроенное локальное время. scripts/memory/rollup.ts управляет работающим агентом через eve/client:
| Schedule | Когда | Читает | Пишет |
|---|---|---|---|
| daily | 04:00 | вчерашний сырой транскрипт | карточки, дневную сводку, CORE.md |
| weekly | пн, 04:15 | 7 дневных сводок | недельную сводку |
| monthly | 1-го числа, 04:20 | недельные сводки месяца | месячную сводку |
| yearly | 1 января, 04:25 | месячные сводки года | годовую сводку |
По умолчанию молча проходят все: vault пишется, чат молчит. Дневной и недельный прогоны умеют прислать отчёт в Telegram - включите его в /menu → 🔔 Уведомления → Отчёты памяти (memoryReports.enabled в data/settings.json, читается в конце каждого ночного прогона, поэтому тап срабатывает той же ночью и без перезапуска). Месячный и годовой молчат всегда. Включённый отчёт приходит одной короткой человеческой запиской на языке интерфейса: что Ива запомнила, 3-5 строк, без внутренних терминов. Почему выключено по умолчанию: ADR-0007.
Дневной проход вытаскивает сущности через write_card - инструмент, у которого enum'ы типов и статусов берутся из schema.json vault'а, так что модель не может выдумать тип карточки. Каждый факт получает одну операцию:
- ➕ ADD - новая карточка. Если такая карточка уже есть, вызов отклоняется: существующая сущность - это UPDATE или SUPERSEDE.
- ✏️ UPDATE - новый факт, не противоречащий Compiled Truth карточки (её фронтматтер плюс верх описания); ложится строкой в
## Logкарточки. - 🔁 SUPERSEDE - факт противоречит Compiled Truth: карточка переписывается на новый факт, а вытесненный уезжает в append-only
## Historyдатированной строкой (- 2026-07-31: TDI Group (held 2026-03→06)). Дата - собственная дата факта, а не день записи; строку без даты штампуют днём записи. - ⏭️ NOOP - уже известно, ничего не пишем.
У фактов есть тег confidence: - EXTRACTED (вы это сказали) или INFERRED (Iva сама вывела) - и в поздних ответах первое утверждается уверенно, а второе с оговоркой. Решения - главный выигрыш: карточка решения хранит, что вы выбрали, когда и почему, а её History фиксирует каждый разворот с датами. Вы всегда видите, что верно сейчас, плюс след, как к этому пришли.
Тот же проход разбирает конфликты, помеченные в .graph/supersede-candidates.json, и переписывает CORE.md: устойчивые факты, постоянные предпочтения, не больше 3 активных целей - плюс датированные поведенческие уроки из диалогов, где вы её поправили, чтобы ошибка, сделанная дважды, не стала привычкой.
memory_search работает на встроенном в Node 24 node:sqlite: BM25 поверх полнотекстового индекса FTS5. Ноль внешних зависимостей - ни векторной базы, ни поискового сервера, ничего лишнего на VPS за $5. Результаты переранжируются по расстоянию связей в .graph/vault-graph.json - карточки, которые ссылаются друг на друга, всплывают вместе - и взвешиваются по покрытию IDF, так что ранжирование не зависит от языка: русский, узбекский и английский работают одинаково.
Для нечёткой или межъязычной семантики включите гибридный режим (MEMORY_SEARCH_MODE=hybrid плюс один ключ для эмбеддингов - все переменные в configuration.md). Векторные результаты сливаются с BM25 через reciprocal rank fusion; ночной проход Brain пересобирает embedding-sidecar.
В 05:00 scripts/memory/brain.ts проводит механическое обслуживание - без LLM, всё детерминированно - запуская скрипты autograph из scripts/autograph/ через uv:
enforce- страховка схемы: приводит алиасы типов к канону, чинит невалидные статусы, дозаполняет системные поля на карточках, записанных мимоwrite_cardgraph.health- пересобирает граф связей, дописывает в историю health score от 0 до 100decay- обновляет уровни релевантности, чтобы залежавшиеся карточки тонулиmoc.generate- перегенерирует тематические индексы MOCsupersede,dedup,link_cleanup- сканы в режиме dry-run; находки встают в очередь на следующую свёртку и никогда не применяются автоматически
Потом коммитит и пушит vault. Remote ещё нет? Создаст приватный GitHub-репозиторий iva-vault через gh. В Telegram Brain стучится только когда нужен человек: упал шаг обслуживания, просел health score, CORE.md вылез за лимит в 1200 символов или не прошёл push (в том числе когда remote нет, а в gh никто не залогинен). Такой стук - это алерт: выключить его нельзя, поэтому каждый называет, что сломалось, чем это грозит и какой командой чинится, на вашем языке, и повторяется не чаще раза в неделю на одну проблему (ADR-0007).
Vault инициализируется из vault-template/ как отдельный приватный git-репозиторий, независимый от чекаута Iva:
vault/
├── CORE.md # always-on core
├── PERSONA.md # стиль общения ≤800 знаков, пишет тест из /menu, читается каждый ход
├── MOC.md # topic index, regenerated nightly
├── cards/ # contacts/ projects/ decisions/ ideas/ notes/
├── daily/ # raw transcripts, one per day
├── summaries/daily/ # day summaries
├── weekly/ monthly/ yearly/
├── attachments/ # originals, by date
├── schema.json # схема vault'а - типы, домены, decay
└── .graph/ # machine-owned graph + scan results
Vault - это чистые данные: код обслуживания и промпты обработки лежат в репозитории Iva (scripts/autograph/, scripts/memory/instructions/), поэтому обновление доставляет их сразу во все инсталляции. В vault'ах, созданных до 0.3.3, остаётся legacy-папка .claude/ - мёртвый груз, её больше никто не читает, можно оставить или удалить.
Всё это обычный markdown. Карточки, сводки и CORE.md можно спокойно править руками - enforce следующей же ночью приведёт frontmatter обратно к канону. MOC.md и .graph/ не трогайте (оба перегенерируются), а daily/ считайте append-only логом. Полистать удобнее всего в Obsidian - откройте папку vault'а: вики-ссылки, бэклинки и граф работают из коробки.
Над памятью я работаю дольше всего: сначала agent-second-brain - пайплайн из Telegram в Obsidian; потом autograph - движок типизированной граф-схемы, который Iva теперь возит с собой и гоняет по vault'у; Iva собирает оба. Стержневая идея - хранить дословную запись, сжимать вверх и никогда не терять след - идёт из пейпера LCM: Lossless Context Management (Ehrlich & Blackman, 2026), а граф карточек, семантика SUPERSEDE и проход Brain надстроены сверху.
