# Привязка к файлам и Stop-хук

> Как mmw-agent связывает факты с локальными файлами, замечает их изменение при поиске и напоминает сохранить итог хода в Claude Code.

Факт в памяти часто взят из файла: договора, заметки, конфигурации. Если файл потом исправили, а запись в памяти осталась прежней, агент будет уверенно повторять старое. Сервер MMW ваших файлов не видит, поэтому эту проверку делает локальный агент **mmw-agent 0.1.4** и новее.

На этой странице:

1. как привязать факт к файлу, ничего не вычисляя вручную;
2. как поиск замечает, что файл изменился;
3. как Stop-хук не даёт Claude Code закончить работу, не сохранив итог.

## Привязка при remember

Укажите путь к файлу в `source_id`, и всё. Агент сам вычислит SHA-256 файла и передаст его в `source_hash`:

```text
Запомни в MMW: оператор — физическое лицо. Источник: site-audit/RKN-NOTIFICATION.md
```

```json title="что уходит на сервер"
{
  "content": "оператор — физическое лицо",
  "source_id": "site-audit/RKN-NOTIFICATION.md",
  "source_hash": "sha256:5f1c…"
}
```

- Путь считается **относительно корней источников**: по умолчанию это папка, в которой клиент запустил агента (для Claude Code — папка проекта). Свои корни задаёт переменная `MMW_SOURCE_ROOTS` (несколько путей через `:` в Linux и macOS, через `;` в Windows).
- Файлы вне корней не читаются и не хешируются. Абсолютный путь тоже подходит, если он внутри корня.
- Идентификаторы, не похожие на путь (`session:…`, `https://…`, `owner-note`), не трогаются.
- Если `source_hash` уже указан, агент его не меняет.
- **Содержимое файла с компьютера не уходит**, отправляется только хеш.

## Проверка при search

При каждом поиске агент заново хеширует файлы-источники найденных записей и добавляет поле `local_source`:

| `local_source` | Что значит | `status` |
| --- | --- | --- |
| `unchanged` | файл тот же, что при сохранении | без изменений |
| `changed` | файл изменился после сохранения | `stale` |
| `missing` | файла больше нет | `stale` |

Статус `conflict` важнее и не заменяется на `stale`. Записи без файла-источника остаются как есть.

Проверка работает только через mmw-agent на том компьютере, где лежат файлы. В claude.ai, ChatGPT и других клиентах без агента поле `local_source` не появится. Чтобы изменение было видно и там, сохраните исправленный факт заново с тем же `fact_key`: новая версия встанет в выдаче первой, а у старой появится `superseded_by`. Подробнее: [Конфликты и сводки](/memory/conflicts-and-summaries/).

## Stop-хук для Claude Code

Команда `mmw-agent hook-stop` — хук события Stop. Когда Claude Code собирается закончить ход, хук смотрит, менялись ли в этой сессии файлы рабочей копии git **после последнего вызова `remember`**. Если менялись, ход не завершается: Claude получает список файлов и просьбу сохранить решения и факты, указав путь в `source_id`, а для исправлений использовать прежний `fact_key`.

1. Откройте `~/.claude/settings.json` (для всех проектов) или `.claude/settings.json` в проекте.

2. Добавьте хук:

   ```json
   {
     "hooks": {
       "Stop": [
         {
           "hooks": [
             {
               "type": "command",
               "command": "uvx --from https://app.mmwhub.ru/downloads/mmw-agent/mmw_agent-0.1.4-py3-none-any.whl mmw-agent hook-stop"
             }
           ]
         }
       ]
     }
   }
   ```

3. Перезапустите Claude Code.

Как ведёт себя хук:

- **Блокирует не больше одного раза подряд.** Если Claude решил, что сохранять нечего, второй Stop проходит (флаг `stop_hook_active`), зацикливания нет.
- **Учитывает только эту сессию.** Файлы, изменённые до начала сессии или до последнего `remember`, не считаются.
- **Вне git-репозитория ничего не делает.**
- **Ничего не отправляет.** Проверка локальная: git и файл истории сессии Claude Code.
- Отключить на время: переменная окружения `MMW_STOP_HOOK=off`.

## Чего это не делает

- Не следит за файлами в фоне: изменение замечается при поиске или в конце хода, а не в момент сохранения файла.
- Не исправляет запись само: хук просит агента сохранить новую версию, решение остаётся за агентом и человеком.
- Не проверяет факты, сохранённые без `source_id`. Указывайте источник всегда, когда факт взят из файла.

## Что дальше
