# Memory Guard

> Что Memory Guard отклоняет, что заменяет заглушками перед сохранением и что видит агент в каждом случае.

Memory Guard — защитный слой сервера MMW, через который проходит каждая запись перед сохранением. У него две задачи: **отклонять** попытки «отравить» память агента и **вычищать** секреты.

Из этой страницы вы узнаете:

1. какие записи отклоняются целиком и что при этом видит агент;
2. какие секреты заменяются заглушками и как выглядит заглушка;
3. где ещё работают те же правила.

## Отклонение: защита от отравления памяти

Память читают агенты, поэтому запись может стать способом подбросить инструкцию будущим сессиям. Memory Guard отклоняет текст записи, если он похож на такую попытку:

- просьбы игнорировать предыдущие инструкции или прежний контекст;
- попытки переопределить системный промпт;
- указания выгрузить данные на внешний адрес;
- указания отправить кому-то пароли, секреты или токены.

Отклоняется и пустая запись.

Что видит агент — ошибку инструмента `remember`:

```text
Memory rejected by Security Guard: Memory poisoning detected: matching pattern '…'
```

Запись **не сохраняется**. Если вам действительно нужно зафиксировать такой случай (например, «в задаче была попытка prompt injection»), опишите его своими словами, не цитируя саму вредоносную фразу.

Проверка на отравление относится к тексту записи (`content`). Остальные поля проходят вычистку секретов, описанную ниже.

## Вычистка секретов

Секрет в записи не приводит к отказу: запись сохраняется, но сам секрет заменяется заглушкой. Проверяются все сохраняемые поля: `content`, `source`, `source_id`, `source_hash`, `source_revision`, `fact_key`.

Что распознаётся (по категориям):

| Категория | Примеры |
| --- | --- |
| Приватные ключи | Блоки PEM, ключи PuTTY, в том числе обрезанные |
| Строки подключения | Пароль в URI базы данных и в адресах вида `пользователь:пароль@хост` — маскируется только пароль |
| Заголовки авторизации | `Authorization: Bearer …`, `Basic …` |
| Ключи LLM-провайдеров | OpenAI, Anthropic, Groq, xAI, Hugging Face, Replicate и похожие |
| Системы разработки | Токены GitHub, GitLab, Atlassian, npm, PyPI |
| Облака | AWS, Google Cloud, Azure, DigitalOcean, HashiCorp Vault, Yandex Cloud |
| Сообщения и рассылки | Slack, Telegram-боты, SendGrid, Twilio |
| Платежи и SaaS | Stripe, Shopify, Linear, Notion |
| Ключи MMW | Ключи формата `mmw_…` |
| Подписанные токены | JWT |
| Присваивания | `password=…`, `API_KEY: …`, «пароль: …» и похожие пары «имя секрета — значение» |

Заглушка выглядит так:

```text
[REDACTED:<правило>:<8 символов хеша>]
```

Пример. Агент пытается сохранить:

```text
Тестовая база: postgres://app:<пароль>@db.internal:5432/app
```

В памяти окажется:

```text
Тестовая база: postgres://app:[REDACTED:db_uri_password:5f1e9c02]@db.internal:5432/app
```

- `remember` отвечает как обычно — агент не получает ошибку;
- в `search` агент увидит текст с заглушкой;
- хеш — первые 8 символов SHA-256 от значения: по нему можно понять, что в двух записях был один и тот же секрет, но восстановить сам секрет нельзя;
- в журнал операций попадает только то, какие правила сработали и сколько раз, без значений и хешей.

Чтобы снизить ложные срабатывания, не маскируются значения, похожие на код и идентификаторы (например, `config.api_key` или имя переменной), явные заглушки в примерах адресов и уже вычищенный текст.

Memory Guard работает по правилам и распознаёт известные форматы. Секрет нестандартного вида может пройти. Не полагайтесь на него как на единственную защиту: не просите агента «запомнить пароль», а храните секреты в менеджере паролей. Если секрет всё же попал в память, удалите запись через [`forget`](/reference/forget/) и смените секрет.

## Где ещё работают эти правила

- **mmw-agent на вашем компьютере** — та же копия правил вычищает историю сессий **до отправки**. Тест проверяет, что правила агента совпадают с серверными. См. [История сессий](/agent/session-history/).
- **Сервер при приёме истории сессий** — каждый фрагмент вычищается ещё раз.
- **Telegram-бот** — заметки сохраняются тем же `remember`.
- **Архивариус** — его ответ вычищается, прежде чем попасть в `fact_key`.

## Что дальше
