> 🇬🇧 [English version](../memory.md) — каноническая версия.

# Память

Ива хранит память в vault из обычного Markdown. Дословные разговоры остаются в `daily/`, устойчивая правда живёт в типизированных Card, а выжимки сворачиваются от дней к неделям, месяцам и годам. Маленький `CORE.md` входит в каждый промпт.

## Ночь

По умолчанию в 04:00 по локальному времени один TypeScript Schedule запускает `scripts/memory/night.ts`. Код отвечает за чтение, проверку, файловые правки, коммиты, повторы и пределы. Настроенная модель только возвращает предложения: инструкция шага описывает ответ словами и одним коротким примером, модель отвечает JSON-объектом в тексте, ночь разбирает его мягко — одинаково у всех провайдеров.

Время меняется одной настройкой `MEMORY_NIGHT_TIME=HH:mm` в `.env` и сборкой: `iva update --force` (в чекауте — `npm run build` и `iva restart`). Правка `.env` без сборки не двигает Schedule или догон: `/menu` → ⏰ показывает действующее время и ожидающую настройки. Ночь по-прежнему исключает текущий локальный день. Откат возвращает время той сборки; старые сборки без настройки работают в 04:00.

Ночь собирает поток текста до проверки ответа, в том числе у подписки ChatGPT, где поток обязателен. Перед следующим вызовом она учитывает итоговый расход; обрыв потока означает отказ шага. Вызов Codex ночью просит низкое усилие рассуждения, не меняя настройку чата.

У ночи четыре шага:

1. Извлечь из сырого дня выжимку, ссылки на Card и факты с доказательствами.
2. Дописать датированные факты в Card и предложить новый Compiled Truth целиком.
3. Записать двусторонние связи, только если существуют оба файла.
4. Предложить ограниченные правки `CORE.md` из собственных цитат владельца.

Большой вход режется по границам реплик. Предел всей ночи: 40 вызовов и 300 000 оценочных входных токенов. Если провайдер не вернул полный числовой usage, следующий вызов запрещён. День готов после общего коммита выжимки и совместимой отметки в сыром дне для путей, разрешённых политикой git владельца. Новые файлы, исключённые через `.gitignore`, `.git/info/exclude` или глобальные правила git, остаются на диске и не останавливают ночь; журнал явно перечисляет их как находящиеся вне git-бэкапа. Уже отслеживаемые файлы продолжают коммититься, даже если родительский каталог позже исключили. Если все пути исключены, готовность дня сохраняется локально, без бэкапа этих файлов.

Кэш дня в `data/memory/night/` делает перезапуск идемпотентным. При совпавшем префиксе поздний хвост отправляет модели только новые реплики. Если изменилась старая разобранная реплика, ночь ничего не пишет и просит владельца явно удалить кэш перед переразбором.

Ошибка подключения к провайдеру, таймаут заголовков или оборванный поток завершают запуск с ошибкой. Незавершённый день не становится готовым, попытка отказа схемы не расходуется. Следующая ночь продолжает сохранённый шаг: принятые факты остаются в Card, день ждёт завершения. Автоматического транспортного повтора внутри ночного вызова и подмены модели нет. Восстановите настроенного провайдера; прежде чем заявлять потерю данных, проверьте `iva jobs`, журнал задания, сырой день и его кэш. Сохраните эти файлы: удаление кэша ради таймаута уничтожает прогресс продолжения, а `iva jobs ack memory-night` только подтверждает прочтение сбоя. Если байты сырого дня или Card действительно пропали, сохраните историю Git и диагностический пакет для разбора.

Для фоновой работы пользователя Watch/Brief уже проверяют сбои пользовательских таймеров и установленных плагинных/MCP-служб. Произвольный отвязанный скрипт или живой зависший процесс вне этих проверок; о сбое сообщается, автоматического перезапуска нет. Прочитайте статус юнита и журнал, сохраните checkpoint и исправьте причину до продолжения. Совпадающие имена входных файлов требуют отдельных временных путей самого задания. Постоянная способность живёт в плагине, регулярная задача — в Routine, а не в дополнительном watchdog ядра Ивы.

Неделя ждёт состояния всех семи дней, включая явное отсутствие данных. Месяц берёт полные недели внутри месяца и только дни месяца из краевых недель. Год ждёт двенадцать месяцев.

## Card и CORE

Принятый факт дописывается без перезаписи:

```text
- YYYY-MM-DD: факт · [[daily/YYYY-MM-DD]] HH:MM
```

Доказательство должно идти из собственной реплики владельца. Модель возвращает новый Compiled Truth целиком; ночь заменяет его, только если файл Card совпадает с хешем, прочитанным для вызова. Вытесненная правда уходит в архив Card; одновременная ручная правка владельца побеждает и оставляет `truth_pending`. `write_card` поддерживает явные операции `fact`, `truth` и подтверждённый владельцем `merge`. Обычный `write_file` не пишет память (`daily/`, `summaries/`, выжимки периодов, `cards/`); остальные пути vault, например `library/`, пишутся и коммитятся, а `CORE.md` проходит через отдельный писатель с капом и коммитом.

`write_card` показывает минимальный JSON-вызов каждой операции до исполнения и повторяет нужный пример, когда обязательные поля операции отсутствуют или неверны. Ошибки проверки схемы тоже содержат форму исправленного вызова, сведения о поле и типе и подсказку исправить аргументы вместо повторения неверного вызова или поиска в исходниках. Подставь данные Card, опускай незаданные optional-поля, а `tags` и `aliases` передавай массивами строк. Пример `merge` показывает форму вызова и не подтверждает согласие владельца. Проверки и существующий предел повторяющихся отказов продолжают действовать.

## Brain и поиск

В 05:00 `scripts/memory/brain.ts` выполняет детерминированное обслуживание на TypeScript: коммитит оставшиеся ручные правки, пересобирает `.graph/vault-graph.json`, проверяет размер CORE и отправляет vault в remote, если он настроен. Модель не вызывается, Card не переписываются.

`memory_search` использует FTS5 из SQLite в Node и отдельный файл графа. При настройке hybrid-режим дополнительно объединяет результаты эмбеддингов.

## Git и чистка

Vault — отдельный git-репозиторий. Ночные изменения, прямые операции Card, правки CORE и чистка оставляют узкие коммиты. Потоковый чистильщик `scripts/vault-cleanup.ts` схлопывает повторный рост `description` и ограничивает раздутые старые описания, не загружая повреждённый vault целиком в память. Один TypeScript-вход используют `/menu` и обновлятор.

Весь код памяти и промпты лежат в `scripts/memory/`; в vault находятся только данные. Старые `.claude/` и `MOC.md` можно оставить, но ночь их больше не читает и не обновляет.
