Самообучающийся агент за три секунды: паттерн decisions.md + mistakes.md

AI снова повторил ту же ошибку? Это не баг модели. Это отсутствие инженерии. Как добавить persistent memory агенту за три минуты — и почему это работает лучше RAG.

Самообучающийся агент за три секунды: паттерн decisions.md + mistakes.md

Разработчики жалуются, что AI повторяет одни и те же ошибки. «Я уже пять раз объяснял, что у нас нет Redux». «Он снова предлагает FTP вместо очереди». «Забывает про наш стиль именования».

Это не баг модели. Это отсутствие инженерии.

Почему агент «не учится»

Каждая новая сессия агента — чистый лист. Модель не помнит предыдущих разговоров. Всё, что она знает о вашем проекте — это то, что вы положили в контекст. Если не положили ничего специфичного — получите среднюю температуру по интернету.

Без доменного контекста агент опирается на массив обучающих данных, где production-grade архитектурные решения встречаются в разы реже, чем туториалы для начинающих. Результат: FTP вместо event-driven, глобальный стейт вместо локального, переименование переменных по паттерну «camelCase» там, где у вас давно snake_case.

Проблема не в том, что AI «не учится». Проблема в том, что никто не дал ему, чему учиться.

Механика: два файла

Любой агент, который автоматически подтягивает файл правил в контекст каждой сессии, можно превратить в накапливающую систему двумя строками.

Для Claude Code это CLAUDE.md. Для Cursor — .cursorrules или .mdc-файлы. Принцип одинаковый: инструкции в репозитории загружаются агентом автоматически при каждом запуске.

Добавить в файл правил две строки:

- Если принял решение, которое оказалось правильным и стоило усилий — запиши в decisions.md (паттерн + почему сработало, не более 3 предложений).
- Если допустил ошибку, которая привела к проблеме — определи корневую причину (не симптом) и запиши в mistakes.md.

Вот и всё. Два текстовых файла в корне проекта.

С первой же сессии агент начинает пополнять оба файла. Каждая следующая сессия открывается с ними в контексте. Агент видит, что в этом проекте:

  • dual write запрещён (и почему),
  • Redis-кеш не подходит для этого типа данных,
  • в прошлый раз так сделали — упало вот это.

Ошибки перестают повторяться — в инструмент закодирован доменный контекст, которого по умолчанию нет ни у одной модели.

Принцип, который за этим стоит

Есть правило, которое я проверял в разных контекстах — от AI-enablement в Askona, где я проводил воркшопы для 100–200 инженеров за сессию, до небольших командных проектов: правило, которого нет в инструменте, не соблюдается.

Встреча раз в квартал не помогает, документ в Confluence — тоже. Работает только то, что агент читает при каждом запуске. Документ, который никто не открывает, не существует для AI так же, как не существует для людей.

Это же правило работает в более сложных setup'ах. В репозитории github.com/dobryakov/cursor-rules — архитектурные стандарты как .mdc-файлы в git. Новый разработчик в команде наследует те же guardrail'ы с первого коммита, не с третьего месяца. AI-ассистент не предложит нарушить ни одно архитектурное правило, потому что оно у него в контексте, а не в корпоративной вики. Именно оттуда и вырос паттерн decisions/mistakes — как облегчённая версия того же подхода для личных и небольших командных проектов.

Failure modes

Паттерн прост. Но есть несколько мест, где он ломается, если не предусмотреть их заранее.

Файлы растут бесконтрольно. Без ограничения формата через несколько месяцев mistakes.md превращается в 300 строк, где 200 — вариации одного корневого паттерна. Решение: ограничить запись — не более 3 предложений, корневые причины не дублировать, не писать симптомы («была ошибка с API»), только механизм провала.

Корневая причина не определена. Агент пишет «была ошибка при работе с API» — это симптом, не причина. Причина: «попытка читать из Redis до завершения инициализации соединения». Добавить в инструкцию явное требование: корневая причина = конкретный технический механизм, не описание симптома.

Контекстное окно съедается. Если оба файла большие, они конкурируют с рабочим кодом за место в контексте. Решение: периодически просить агента сжать файлы, оставив только уникальные паттерны. Одна корневая причина — одна запись, независимо от количества случаев.

Записи устаревают после рефакторинга. После смены стека часть entries описывает уже несуществующую реальность. Добавить метку даты к каждой записи — устаревшие видны сразу при ревью.

Масштаб

Паттерн не ограничен личными проектами.

Личный проект: один файл CLAUDE.md, два файла памяти. Агент помнит, что вы уже пробовали, что не зашло, какой паттерн у вас «правильный».

Команда: файлы в git — decisions.md и mistakes.md как командный артефакт. Новый разработчик получает накопленный опыт с клонированием репозитория. Агент у каждого члена команды работает с одинаковым доменным контекстом.

Enterprise: модульная структура — отдельные .mdc-файлы по доменам (архитектура, безопасность, стиль API), decisions/mistakes разбиты по сервисам или командам. При этом механика та же — файлы в репозитории, автозагрузка в контекст.

Почему RAG здесь лишний

При слове «memory для агента» обычно начинается разговор о векторных базах, RAG-пайплайнах и fine-tuning'е. Всё это рабочее — но для большинства проектов оверинжиниринг.

RAG нужен, когда документов тысячи и нужна семантическая фильтрация — не всё в контекст, только релевантное. Decisions.md нужен, когда паттернов десятки и все они должны быть в контексте всегда. Это разные задачи.

Когда файл правил помещается в контекстное окно полностью — простое текстовое хранилище эффективнее и надёжнее RAG. Нет embedding-дрейфа, нет версионирования индекса, нет задержки на поиск. Просто markdown, который агент читает целиком при старте.


Паттерн работает с любым агентом, который автоматически подтягивает правила в контекст сессии. Конкретные пути под ваш инструмент — выбирайте сами. Механика одна.

Leave a Reply

Your email address will not be published. Required fields are marked *