Почему память агента для программирования должна содержать только изменения и как их хранить.
Память агента кодирования должна хранить только то, что модель не может угадать. Четыре теста на каждую запись, три требования к хранилищу и почему markdown хорошо подходит в git.
Источники: Why Your Agent Needs Memory, and How to Organize It
Представьте хранилище личных воспоминаний, предназначенное для агента-программиста и расположенное на одном устройстве. В нем хранятся 181 файл по темам под индексом из 134 строк, причем почти ничто из этого не является знаниями в обычном смысле. Агент уже понимает механизмы Express middleware, структуру тестов Playwright и функции Dockerfile, прочитав обо всем этом гораздо больше, чем сможет прочитать любой человек. Каждая строка в этом хранилище существует по противоположной причине: она обозначает момент, когда тот или иной аспект отклоняется от среднего значения в данной области.
Два примера иллюстрируют эту идею. Механизм проверки развертывания блокирует выпуск, если проверка не может быть выполнена, и это сделано намеренно. Механизм автоматического одобрения в процессе развертывания считывает значение поля .status, а не .conclusion — деталь, которая стоила полдня, прежде чем была записана в одну строку файла.
Вот как должна выглядеть хорошая память агента. Это не копия того, что знает агент. Это дельта, оставшаяся часть. Все согласны, что агенту нужна память, но никто не определил, какая именно, поэтому дальнейшее рассмотрение включает два шага: сначала объясняется, зачем агенту вообще нужна память, а затем — как её организовать. Вторая часть делится на четыре раздела: необходимость простоты, требования к каждой единице памяти и к самому хранилищу, хранилище, соответствующее этим требованиям, и правила работы с ним.
Память агента — это не человеческая память
Естественным инстинктом является рассуждение по аналогии. Люди запоминают вещи, значит, и агенты должны это делать. Однако аналогия терпит неудачу уже на первом шаге. Человек начинает с нуля, поэтому человеческая память должна хранить как средние значения, так и исключения. Модель же поступает с уже загруженными средними значениями, в масштабах, превосходящих возможности любого отдельного человека. Рассказ о том, что такое промежуточное программное обеспечение, не добавляет никакой информации — он лишь добавляет токены.
Токены стоят денег, и именно здесь многие делают ошибку. Контекст, который не нужен, не является нейтральным — это чистая потеря. В одном исследовании исследователи подсчитывали, с какой частотой модель правильно выполняла запросы к API. Когда модель получала документацию к API, которые она уже хорошо знала, и получение информации было неточным, её процент правильных запросов снижался на 39 процентных пунктов. Получение подобной документации для редких API, которые модель раньше не видела, напротив помогало, увеличивая точность на девять пунктов. Тот же контент и тот же алгоритм обработки, но эффект менялся на противоположный.
Если смотреть с этой точки зрения, файл памяти представляет собой различия по отношению к существующим предположениям модели. Каждая строка, повторяющая известную конвенцию, конкурирует за внимание с той единственной строкой, которая действительно важна, а внимания всегда не хватает.
Записывайте только то, что модель не могла бы угадать.
Если пропустить реальные контекстные файлы через этот фильтр, большая часть их содержимого исчезнет. Правила номенклатуры, принцип «композиции вместо наследования» и структура папок с шаблонами — это обычные знания, с которыми справляется инструмент проверки кода, и которые уже содержатся в модели. Остаётся обычно что-то неудобное: временное решение, заброшенный путь или что-то, что верно только в этом кодовом базисе и нигде больше.
В примерном магазине, длина которого составляет около 3 700 строк (3 831, если учесть индекс), ни в одной строке не указано, какой используется промежуточный сервис или как структурировать тест. Строки, посвящённые описанию известного инструмента, удаляются, поскольку модель уже знала об этом, и тем самым тратились ресурсы без всякой пользы при каждом запросе.
Самая дешёвая память — это та, которая вам не нужна
Если память меня не подводит, то размер этой разницы зависит от того, насколько проект отклоняется от общего шаблона. Следуя стандартной архитектуре, агенту практически ничего не нужно, поскольку он хорошо знает данную среду. Если же создать собственную систему модулей, каждое из её правил превращается в правило, которое необходимо записать, соблюдать и оплачивать при каждом запросе.
Для ощущения эффекта не требуется никаких тестов. В традиционных технологических стеках агент просто выполняет свою работу. В нишевых языках или собственных внутренних фреймворках он останавливается, делает предположения или задаёт вопросы. Чтобы сократить эту разницу, необходимо самостоятельно хранить контекст: записывать его, версионировать и постоянно обновлять.
Для подтверждения этого утверждения не существует чистого теста типа A/B, и было бы нечестно притворяться обратного. Приведённые здесь исследования подтверждают существование соответствующего механизма, в то время как файлы одного человека подтверждают лишь наличие определённой практики, что само по себе не является доказательством механизма. Однако результаты остаются стабильными: новая работа в обычных стеках выполняется быстро, а работа в крупных старых системах, где большая часть контекста никогда не записывалась, выполняется медленнее, иногда даже медленнее, чем вручную.
Таким образом, выбор архитектуры превращается в выбор способа управления памятью. Выберите скучный, широко используемый шаблон — и вам не придётся вечно заботиться о чём-то дополнительном. Любое отклонение от общепринятого шаблона требует, чтобы кто-то записывал соответствующие правила и поддерживал их в актуальном состоянии, а индивидуальный подход увеличивает затраты при каждом последующем запросе, а не только при том, который его создал.
Самая сложная часть — оставаться небольшим
Вот в чём причина. Способ решения начинается с неприятного факта: то, что разрушает системы памяти в реальных условиях, — это не забывчивость, а накопление.
Полезность отстаёт от объёма. Удвоение объёма памяти не означает удвоения ценности, поскольку хаос накапливается быстрее, чем полезные сигналы, и после определённой точки более большой объём памяти даёт худшие результаты, чем меньший, даже при решении тех же задач, для которых он и предназначался.
Конфликты растут быстрее, чем объём. Любой новый факт может противоречить любому существующему, поэтому количество возможных конфликтов увеличивается гораздо быстрее, чем количество файлов. Конфликт также стоит гораздо дороже, чем пропуск информации. Когда отсутствует какой-то факт, агент находится в состоянии неопределённости, и такое состояние допустимо: он либо задаёт вопросы, либо терпит неудачу там, где это видно людям. Когда два факта противоречат друг другу, агент уверен, но ошибается, и поскольку ничто в работе системы не выглядит неправильным, никто этого не замечает.
Что ещё хуже, большинство продуктов для хранения данных не способны распознать проблему. Метод векторного сходства отмечает два предложения на одну тему, но не фиксирует, что одно из них гласит «да», а другое — «нет». В результате значения становятся однородными, конфликты усиливаются, и при превышении определённого размера система хранения данных ухудшает работу агента.
Хранилище данных редко демонстрирует явные сбои. Оно выдаёт ошибочные ответы, оставаясь при этом функциональным при любых запросах.
Следовательно, сложность заключается не в накоплении данных, поскольку любой продукт с радостью это делает, а в том, чтобы сохранять небольшие объёмы данных при их достаточности. Для этого необходимо удалять данные, а удалять — значит оценивать собственные предыдущие записи.
Люди склонны сначала искать структуру. Сталкиваясь с хаотичным набором данных, они вводят таксономию иерархий, категорий, графов или формальных схем знаний. Однако это обычно приводит к обратному эффекту. В одной оценке 2026 года была протестирована возможность добавления дополнительной глубины в индекс контекста по запросу с использованием той же модели и инструментов, и точность снизилась с 0,91 до 0,64. Простая структура всегда превосходила иерархическую во всех тестах. Сложная структура не устраняет сложность — это лишь второй уровень сложности, добавленный к первому, и теперь оба требуют технического обслуживания.
Поэтому организация памяти заключается не столько в создании лучшей диаграммы, сколько в установлении критерия, который должен быть выполнен каждой единицей данных, а также в создании механизма, позволяющего легко его достичь.
Четыре критерия для каждой единицы памяти
Этот критерий относится к самой единице памяти, а не к всей системе. В команде это также то, что проверяет рецензент.
- Простота и насыщенность. Только информация о семенах. Нет предложений, существующих лишь для того, чтобы казаться полными. Фраза, которая не влияет на действия агента, является декоративной, и декоративные элементы имеют свою цену.
- Отсутствие противоречий. Нет двух фактов, которые не могли бы быть одновременно истинными. Для этого требуется активные усилия, поскольку противоречия накапливаются медленно и никогда не возникают умышленно.
- Измеримая польза. Память не делает агента умнее. Она делает его быстрее и дешевле при сохранении того же качества, позволяя получать те же ответы без необходимости их повторного поиска. Файл, который не снижает заметно время выполнения или количество ресурсов в реальной задаче, не оправдывает затрат на его поддержание.
reference_, установленные правила — в 50 файлах с расширением feedback_, а временные состояния — в 14 файлах с расширением project_. Читатель знает, что содержит файл, ещё до того, как откроет его.Один опубликованный результат, кажется, подрывает третий тест, но на самом деле его поддерживает. Исследователи из ETH Zurich провели сравнение файлов контекста хранилищ с ситуацией, когда файлов вообще нет. Было установлено, что это не приносит общего улучшения в успехе выполнения задач, а добавляет более двадцати процентов к затратам на выводы; к тому же файлы, созданные машиной, показали незначительно худшие результаты по сравнению с ситуацией, когда файлов вообще нет. Если внимательно прочитать правило дельты, становится ясно, что это не противоречащий результат. Файл, содержащий средние знания, именно то, что, согласно правилу, приведёт к определённым затратам без какой-либо выгоды. Выводы исследования не говорят о том, что файлы контекста неэффективны, а лишь о том, что файлы, содержащие средние сведения, неэффективны, что относится к большинству из них.
Следовательно, дисциплина означает меньше написания текста и больше упрощения: каждая строка должна оставаться насыщенной, и ни одна пара строк не должна противоречить друг другу.
В августе Эдди Османи также затронул эту проблему с точки зрения технического обслуживания, утверждая, что файлы агентов устаревают по мере совершенствования моделей (его пост называется «Аудит файлов агентов»), поэтому они требуют периодической очистки и пересоздания, а не бесконечного накопления. Память, которая только растет, находится в режиме обратного отсчёта.
Затем разделите то, что осталось, по задачам, как вы это делаете при воспоминании информации. То, что загружается для написания текста, отличается от того, что загружается для отладки процесса сборки.
Никому не нужна единая память. Необходима лишь наименьшая корректная часть информации для текущей задачи.
Три требования к хранилищу
Эти четыре теста ничего не говорят о том, где находятся файлы, что является второй половиной процесса организации данных.
Подсказка исходит из того, что уже существующие инструменты имеют общего. AGENTS.md — это обычный файл в формате Markdown, находящийся по предсказуемому пути, и его читают более двадцати инструментов, несмотря на то, что их создатели конкурируют почти во всем остальном. Конкурирующие производители никогда не реализовывали один и тот же API памяти.
Опрос инструментов для обработки кода (опубликованный на Substack) показал, что семь из них пришли к одному дизайну независимо друг от друга: небольшой файл Markdown всегда находится в контексте, а более крупный архив на диске открывается тогда, когда это требуется задачей. Ни один из них не использовал векторный поиск. Хотя у них нет общего критерия оценки, все семь соответствуют трем одинаковым требованиям.
Возможность поиска без установки каких-либо компонентов. Под понятием «поиск» обычно подразумевается семантический поиск, хотя это даже не является стандартным случаем. Собственный инструмент хранения данных от Anthropic позволяет просматривать, создавать, заменять, вставлять, удалять и переименовывать данные, но не предусматривает никаких операций по поиску. Агент просто перечисляет содержимое каталога и считывает там имеющиеся данные. Хранилище данных, которое функционирует только тогда, когда построен индекс, эмбеддинги актуальны и сервис поставщика работает, создаёт слабую зависимость от этих факторов. Оно должно продолжать работать даже в ситуации, когда всё это перестаёт функционировать.
Изменения происходят при наблюдении за процессом. Именно память, которая обновляется сама по себе, становится причиной проблем. По результатам аудита 10 134 записей, автоматически сгенерированных в рамках эксплуатации, 97,8% из них были признаны бесполезными. В другом исследовании модели сохраняли в памяти результаты своих успешных операций, но результаты оказались хуже, чем при отсутствии памяти, во всех четырех тестированных агентах. Самописная память изменяется резко, а не постепенно, поэтому любые изменения должны быть видны в виде различий, подлежащих отклонению и откату.
Обслуживание возможно с использованием уже существующих инструментов. Повреждения редко приводят к сбою системы хранения данных. Небрежность — да: файл записывается один раз, к нему больше никто не обращается, и он постепенно становится некорректным. Согласно отчету о одном исследовании 2026 года, половина файлов контекста так и не подвергалась изменениям после первой записи, а 6% файлов, которые продолжали редактироваться, принадлежали пользователям, отмечавшим реальную пользу от данного инструмента. Обслуживание должно осуществляться в редакторе, системе поиска и контроля версий, которые люди используют ежедневно.
Это полное описание требований. Остается лишь определить, какое хранилище их удовлетворяет.
Почему файлы в формате Markdown подходят для git
Идея использования файлов не является новой. Авторы на Medium не менее шести раз за прошлый год утверждали, что «markdown превосходит векторные базы данных для хранения информации агентов», а темы на Hacker News постоянно содержат шутки, сводящиеся к использованию обычного текста. Однако редко приводятся обоснования для этих утверждений.
За три месяца три поставщика баз данных для хранения информации опубликовали материалы против использования файлов, в то время как два поставщика ведущих агентов уже выбрали файлы. В данном случае речь идет не о продажах, а лишь о папке для хранения данных.
Что хранит эта область
То, что хранит система, определяет всё дальнейшее.
- Mem0 хранит предложение, извлеченное ИИ-моделью, вместе с его векторным представлением — одну строку в векторном индексе. В результате возвращается не оригинальный документ, а перефразирование, сделанное инструментом извлечения, и его невозможно открыть.
- Zep хранит отдельную введённую рукой грань графа для каждого факта и отслеживает две временные шкалы для каждого факта, поэтому у каждого из них есть окно действительности. Исправления вносятся путём замены: старая грань помечается как недействительная вместо того, чтобы её редактировать.
- Стартап, специализирующийся на векторной памяти многие годы использовал векторные архивы. В начале 2026 года он заменил стандартное хранилище для своих кодирующих агентов на дерево файлов формата markdown в репозитории git, сохраняя изменения один раз после каждой правки.
- Anthropic предоставляет инструмент памяти, который выполняет только операции с файлами в каталоге
/memoriesи работает через собственный клиент пользователя. Его API хранилищ памяти, находящегося на сервере и всё ещё находящегося в бета-версии, именует элементы по пути в стиле файловой системы и разрешает одновременные записи с помощью хэша содержимого, что по сути является моделью данных git с HTTP-интерфейсом. - Помощники для потребителей содержат краткое изложение, которое пользователи могут просматривать только в том виде, в котором оно отображается. По состоянию на сентябрь 2026 года для ни одного из них не существует документированного формата для экспорта в формате, читаемом машиной.
Настоящая разделительная линия заключается в возможности чтения памяти, а подход, основанный на различии между файлами и базами данных, её упускает. У всех вариантов, отличных от файлов, есть одна общая черта: память невозможно сравнивать в двух разных моментах времени. Исправления вносятся с помощью переключателя, а не коммита.
Каждая группа предлагает свой решение, и каждая отчасти права
В марте 2026 года MatrixOrigin заявила, что статический Markdown устаревает и ничего не обеспечивает. Через пять недель Mem0 опубликовала пост под названием «Память вашего ИИ-агента — это просто файл? Вот в чем проблема», в котором говорилось, что текстовые файлы повторяют ошибки эпохи до появления баз данных 1970-х годов: отсутствие семантического поиска, отсутствие временных рассуждений, отсутствие безопасного одновременного записи данных и невозможность их удалять. В июне Zep добавила, что «Markdown — это не память агента», подчеркнув ключевую мысль: файл Markdown показывает только то, что было написано, но никогда не указывает, что он заменил или почему.
Тем временем собственный кодинг-агент компании Anthropic хранит свою память в виде обычного Markdown на диске, а документация Windsurf тихо советует перемещать всё, что стоит сохранить, из его хранилища памяти в формат Markdown под контролем версий. Стоит обратить внимание на то, кто что продаёт.
У поставщиков баз данных действительно есть два весомых аргумента. Векторные методы работают эффективно, когда в вопросе и записи отсутствует общий словарный запас, как, например, при запросе о «признаках выгорания» и записи, в которой никогда не упоминается выгорание. Только метод вкладки слов способен преодолеть эту проблему с постоянной скоростью при обработке миллионов строк. Утилита Grep не может найти то, что невозможно назвать.
Графовые методы превосходят по времени обработки. Чтобы ответить на вопрос о том, во что кто-то верил в прошлый вторник и что заменило это убеждение, необходимы факты с указанием дат начала и окончания, а коэффициент сходства не позволяет определить, какой из двух противоречащих фактов является актуальным. По сообщениям, повторная обработка временных вопросов в рамках одного теста на долговременную память показала результат 63,8% для графовой системы против 49,0% для векторной. Файлы проигрывают в обоих случаях.
Доказательства и их ограничения
Результаты поиска в 2026 году удивили всю область. Агенты, которые использовали простые инструменты вроде grep, find и прямого чтения файлов, показали лучшие показатели, чем любые методы на основе ключевых слов, встраивания информации или переранжирования. Один из тестов поиска с участием агентов показал, что отказ от использования механизмов встраивания информации и прямое чтение файлов агентами повысили точность с 69% до 80%, при этом затраты снизились примерно на треть. Другое исследование вопросов, связанных с долгосрочной памятью, показало, что простой поиск по ключевым словам превосходил семантический поиск во всех конфигурациях с использованием встроенных инструментов. Однако когда результаты возвращались в виде файлов, порядок сравнения менялся в половине случаев, поскольку вопросы требовали нахождения точных данных, таких как дата, количество, идентификатор или строка с ошибкой.
В статье об агентном поиске также прямо указано важное ограничение: если увеличить объем данных с 100 000 до 400 000 документов, точность того же метода снижается с 80% до менее 40%, причем количество вызовов инструмента увеличивается в три раза. Grep работает в определенных пределах объема данных и не является законом природы; в этих пределах он превосходит другие методы по качеству и стоимости, но за их пределами его эффективность резко падает.
Поэтому правильный вопрос заключается не в том, какой подход в целом лучше, а в том, в какой части диапазона работает конкретная система. Набор из 181 файла в сотни раз меньше объема данных, при котором, по сообщениям, возникают проблемы. Однако система хранения данных в крупной компании вроде LinkedIn не соответствует таким масштабам, и никто не утверждает, что для нее следует использовать markdown.
Таблица сравнения: файлы против альтернатив
По сравнению с этими тремя требованиями файлы в формате Markdown выполняют каждое из них практически без затрат. Grep служит альтернативой: любые изменения представляют собой различия (обратимые коммиты внутри репозитория), а инструменты для технического обслуживания уже доступны на рабочем столе.
Ещё два преимущества достигаются бесплатно. Противоречия проявляются потому, что два противоречивых факта представлены в виде двух строк текста, а не двух массивов, и сохраняемый формат одновременно служит форматом экспорта.
Этот компромисс следует назвать открыто, а не скрывать. Файлы уступают эмбеддингам тогда, когда требуется нечеткое восстановление информации из большого количества документов. Решение заключается в том, чтобы создать индекс поверх файлов, который можно воссоздать в любой момент, вместо того чтобы заменять ими файлы сами. Реализации на базе баз данных типа SQLite используют этот подход, memsearch — на основе Milvus, а идея Карпати с композитными вики обходится всего лишь индексной страницей без каких-либо эмбеддингов. Когда индекс служит средством хранения, приходится жертвовать возможностями просмотра, сравнения, определения владельца и переносимости ради восстановления информации, которое и так было доступно.
Если вы не можете выполнить поиск по тексту, сравнить его и удалить из него строку, это не ваша память. Это кэш кого-то о вас.
Как выглядит работающая система
Принципы реализации дешевы, поэтому вот одна рабочая конфигурация.
- Уровни указателей без какого-либо манифеста. Первый файл, который открывает агент, состоит из 21 строки. Он функционирует как карта с тремя верхними уровнями, каждый из которых представлен одной строкой, указывающей на более глубокие файлы. На уровень ниже находится файл проекта, в котором хранится по-настоящему личная информация: активный репозиторий по сравнению с тем, что был удален в результате переименования, версии, к которым привязано всё, правила общения, которым необходимо следовать. В дереве проектов расположено двадцать восемь таких файлов; все они написаны вручную, и каждый загружается только тогда, когда работа требует этого.
- Хранилище, в которое пишет агент, и подтверждение от человека. Рядом с ним находится автоматическая память, включающая 181 файл тем под индексом из 134 строк. Индекс загружается только при начале сессии, а файл темы открывается в тот момент, когда для выполнения задачи он становится необходимым.
Слои для загрузки, а не для рассуждений
Посчитайте уровни выше — их четыре, что соответствует глубине, против которой предупреждает ранее полученный результат от 0,91 до 0,64. Однако в том исследовании переменной была глубина, а индекс оставался неизменным во всех конфигурациях. Лучшей оказалась конфигурация с плоским индексом для каждой задачи: агент считывает информацию за один проход, прежде чем решить, что открыть, что позволяло почти удвоить точность по сравнению с простым навигированием при примерно вдвое меньших затратах. Результаты ухудшались лишь тогда, когда у индекса появлялись ветви, по которым модели приходилось спускаться, определяя на основе только меток, какая из них содержит ответ.
Индекс этой структуры представляет собой линейный порядок: один уровень, который читается полностью при начале сессии. В нем 134 строки, примерно по одной на тему; каждая из них указывает на файлы, к которым она относится, с кратким кратким описанием. Нет никаких разветвлений, поэтому не требуется никаких догадок. Это небольшая роутинг-таблица, ведомая вручную, а не таксономия, с помощью которой модель могла бы делать выводы; к тому же она может быть неполной: одиннадцать из 181 файла в ней отсутствуют. Файлы по темам небольшие, имеют линейную структуру и читаются полностью; уровень открывается потому, что работа переместилась в его область, а не потому, что какой-то запрос искал информацию. Это и есть принцип постепенного раскрытия информации.
Тест прост: если модели приходится догадываться, в какой ветви находится ответ, опираясь только на метки, значит, была построена деревянная структура, и показатель составит 0,64. Если же модель читает весь индекс и открывает файл по имени, это означает, что используется порядок загрузки.
Структура существует для того, чтобы определять, что загружать. Она не предназначена для того, чтобы модель через неё рассуждала.
Мера защиты от отклонений
Агент предлагает изменения, они отображаются в виде различий, после чего человек может их принять или нет. Файлы, хранящиеся в репозиториях, имеют собственную историю, что позволяет ответить на вопрос о том, почему агент что-то считает истинным, путем прочтения этих записей — чего не могут предоставить ни базы векторных данных, ни страницы памяти поставщиков. Память, которую никто не проверял, — это слух с именем файла.
Иногда проводится рутинная процедура очистки: удаляются строки, которые были истинны в июне, файлы, которые модель затем включила в свою структуру, а также правила, заменённые более совершенными. Объём хранилищ сокращается чаще, чем предполагают люди.
На локальном диске всё представлено в виде обычного Markdown, и он работает без ассистента, который помогал с его созданием. Когда в следующем году появится более мощный инструмент, направьте его на ту же папку и продолжайте работу.
Проверка, которую можно провести сегодня
Вся структура помещается на одну карточку: четыре теста для каждой сохраняемой строки, три требования к месту хранения и человек, находящийся между агентом и файлом.
Чтобы определить свою роль, откройте файл с контекстом проекта — будь то CLAUDE.md, AGENTS.md или любой другой формат, который использует инструмент — и удалите все строки, которые модель могла бы угадать самостоятельно. Реалистичный результат — уменьшение объёма вдвое. Затем передайте отредактированный файл на выполнение следующей реальной задачи и посмотрите, ухудшится ли что-либо. После этого, каждый раз, когда агент допускает ошибку по причине отсутствия у него информации, добавьте одну строку и предложите её к рассмотрению как код. Вот такая дисциплина, и она не расширяется путём добавления большего количества элементов.
Агент уже знает среднее значение. Единственная задача — вычислить дельту.
Связанные статьи
- Почему тесты памяти агентов вводят в заблуждение и как оценивать их на собственных данных — В общедоступных топ-листах по памяти имеются ошибочные ключи ответов и критерии оценки. Необходимо разделить процесс поиска информации и формирование ответов, добавить проверки на последовательность, свежесть данных, отсутствие ответов и эффект забывания, а также отслеживать затраты.
- Внедрение промптов и смертельная тройка угроз: защита ИИ-агентов — Почему агенты не могут отличить ваши инструкции от инструкций злоумышленника, как работали атаки EchoLeak и GitHub MCP, и какие методы защиты остаются эффективными.