Skip to content

Latest commit

 

History

History
89 lines (59 loc) · 13 KB

File metadata and controls

89 lines (59 loc) · 13 KB

🇬🇧 English version — каноническая версия, она может быть новее.

Память

Память - то, что копится. Большинство агентов забывают вас в тот момент, когда переполняется контекстное окно - 131k токенов улетают быстро. Iva складывает всё в vault из обычного markdown, наводит в нём порядок, пока вы спите, и достаёт только то, что нужно конкретному вопросу. Вы говорите - она раскладывает.

Как Iva помнит: лист - день, ветви - недели и месяцы, годовые кольца - годы вокруг CORE.md

Дерево памяти

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.

Brain

В 05:00 scripts/memory/brain.ts проводит механическое обслуживание - без LLM, всё детерминированно - запуская скрипты autograph из scripts/autograph/ через uv:

  1. enforce - страховка схемы: приводит алиасы типов к канону, чинит невалидные статусы, дозаполняет системные поля на карточках, записанных мимо write_card
  2. graph.health - пересобирает граф связей, дописывает в историю health score от 0 до 100
  3. decay - обновляет уровни релевантности, чтобы залежавшиеся карточки тонули
  4. moc.generate - перегенерирует тематические индексы MOC
  5. supersede, 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 инициализируется из 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 надстроены сверху.