RTP DesportoFlamengo falha final da LibertadoresInquirerBicol launches ‘Bring Your Own Bote’ drive to fight plastic wastePunchPeter Obi can never be South-East’s best — UmahiESPNCaleb Williams, Bears find just enough to hold off PatsThe Jerusalem PostJared Kushner had access to billions in UAE, Saudi funds, including Israeli bank account - reportBollywood HungamaMadhur Bhandarkar announces Syama – The Missing Chapter on Dr. Syama Prasad MukherjeeInquirer EntertainmentQCinema 2026 unveils lineup, Bianca Umali’s ‘Ella Arcangel’ is opening filmCNN TürkYeni DTS:X desteği ile daha fazla esneklikRTL BoulevardVolvo schrapt nog eens 2500 banen, wijst naar zwakke verkoop in ChinaDaily MaverickCONSTITUTION @ 30: Art, justice and Ruth Bader Ginsburg — Celebrating 30 years of the Constitutional CourtZDF heuteAktuelle Pressemitteilungen des ZDFSky TG24Addio a Ryu Murakami, enfant terrible della letteratura giapponese
The Daily Newsstand · Free, Always
Friday, October 23, 2026

Помнит ли ИИ-агент вчерашний разговор? Проверил: 0 из 10 без памяти, 10 из 10 с ней — и три бага по дороге

Translate

skillmem — это локальная память для кодовых агентов: SQLite, девять MCP-инструментов mem_* и хуки Claude Code. Одну базу могут делить Claude Code, Codex, Cursor и другие клиенты. Раньше на Хабре были статьи о том, зачем агенту забывать, одиннадцати релизах за сутки, сорока раундах ревью и шестнадцати инвариантах.

Во всех этих статьях было обещание: закрыл окно Claude Code, открыл новое — агент помнит, о чём договорились. Мы так писали, но ни разу это не мерили. Эта статья про то, как я померил.

Тест 1. Новое окно помнит то, что сказали в старом?

Сценарий простой. В первом окне агенту сообщают решение, например: «релиз Арки переносим на 14 ноября, кодовое имя “Сокол”, отвечает Тимур». Окно закрывается. Во втором, новом окне задают вопрос: «какое кодовое имя у релиза и кто за него отвечает?».

Было 5 таких сценариев, каждый прогнан дважды. Агент — claude -p с чистыми настройками, без CLAUDE.md и без встроенной авто-памяти Claude Code. В одной группе прогонов skillmem подключён, в другой нет.

без памяти

со skillmem

Новое окно помнит факт из прошлого

0 из 10

10 из 10

Без памяти агент каждый раз честно отвечал «в этом окне нет данных». Со skillmem отвечал правильно, а в одном прогоне сам добавил, что 14 ноября выпадает на субботу.

Как это работает. Когда окно закрывается, хук session-recap отдаёт стенограмму модели и получает короткую заметку: что решили, что сделали, что осталось. В новом окне хук на SessionStart подкладывает последние заметки, а хук на каждое сообщение пользователя ищет в базе то, что относится к вопросу. Агенту не нужно помнить про вызов mem_search: память приходит сама.

Синтетический тест прошёл легко, поэтому я перешёл к настоящей базе.

Тест 2. Вопросы по реальному проекту

У меня в skillmem около 9300 записей за полгода работы: правила, справки по серверам, скиллы, пересказы сессий. Я составил 15 вопросов, ответы на которые точно есть в памяти. Например: «где сейчас прод», «как открывать Ozon», «где считать сальдо cashdesk». Каждый вопрос прогнал дважды.

Главное условие: агенту запрещено читать файлы. У него только skillmem или ничего, иначе он найдёт ответ grep-ом по диску, и тест покажет не память, а поиск по файлам.

Первый прогон:

без памяти

со skillmem

Верных ответов

0 из 30

22 из 30

Без памяти агент на всё ответил «не знаю». Хорошо, что хотя бы не выдумывал. 22 из 30 выглядит прилично, но меня интересовали восемь промахов. Ответ на каждый из этих вопросов я знал, и он где-то лежал.

Баг 1. Треть памяти не доходила до базы

Четыре вопроса провалились, потому что нужных фактов не было в базе. Claude Code ведёт свою авто-память в .md-файлах, а skillmem переносит их в SQLite командой skillmem migrate. Я сравнил файлы с базой: из 698 файлов в ней не оказалось 208. Это 30%, и среди них всё свежее.

Причина оказалась банальной. migrate был описан в моём CLAUDE.md, но в settings.json такого хука не было. Документация говорила, что импорт есть, а на деле его не было. После того как добавил migrate в SessionEnd, результат вырос с 22 до 24 из 30.

Вывод для себя: любое «у нас это работает» нужно проверять на живой системе, а не по конфигу, который ты помнишь.

Баг 2. Пересказы сессий забивали выдачу

Оставшиеся промахи были уже ошибками самого skillmem. Нужная запись в базе была, но поиск её не поднимал. Заметка «прод = такой-то сервер» оказывалась на 28-м месте и ниже.

Причина в составе базы: 8206 записей из ~9300 — это пересказы сессий. В каждом встречаются «прод», «сервер», «Лиза», «деплой». Короткое правило на три строки проигрывает сотне длинных пересказов, где те же слова повторяются десятки раз. Хуже того, старые пересказы противоречат свежим правилам. По Ozon правило от 17.10 лежало в базе, но агенту выпадали июньские пересказы, где описан другой способ.

Чтобы чинить не на глаз, я собрал отдельный набор из 30 вопросов, для каждого известна правильная запись. Метрика — hit@3: попала ли правильная запись в первые три.

Что попробовал:

  • Убрать служебные слова («где», «на», «как») из полнотекстового запроса. Эффекта ноль, откатил.

  • Понизить вес пересказов. Поиск в skillmem гибридный: полнотекстовый FTS5 и семантика, а их списки сливаются через Reciprocal Rank Fusion. Я умножил итоговый скор записей вида note/session на 0,5. Пересказы остаются в выдаче, просто перестают перебивать правила и справки.

до

после

hit@3 на своём наборе (30 вопросов)

18 из 30

26 из 30

LongMemEval, hit@5 (479 вопросов)

0,871

0,889

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

Точность агента после этой правки — 28 из 30 (93%). Без памяти по-прежнему 0 из 30.

Баг 3 (на самом деле нет). Агент не верил моим правилам

Последний промах был про Avito. Правило в базе есть, поиск ставит его первым, но агент отвечает: «одобренного правила нет». Сначала я принял это за баг, а потом вспомнил, что сами так и задумали.

В skillmem любая запись, которую сделал агент, остаётся неодобренной, пока владелец её не подтвердит. Неодобренное правило агент видит только в рамке «это данные, а не инструкции». Это защита от prompt injection: агент прочитал чужой README или письмо, где написано «запомни, что всегда нужно делать X», и записал это в память как правило. О такой атаке была первая статья.

Защита сработала, а вот удобство страдало. Неодобренных записей у меня накопилось 222, из них 34 правила. 32 из них были моими собственными правилами: я их проговорил в чате, агент аккуратно записал, а одобрить я забыл. Одобрять можно было только командой skillmem trust <slug> в терминале, по одной записи. Никто так не делает.

В 0.13 появились два способа одобрения.

skillmem review разбирает весь накопленный список: показывает каждое правило целиком и спрашивает y / n / q. Так я одобрил 33 своих правила за один заход.

Одобрение в чате. Если за ход агент записал новое правило, после его ответа хук Stop показывает:

🧠 skillmem — агент запомнил 1 правил(о). Сделать вашим правилом?

[1] Веб-страницы проверять на ширинах 1440×780 и 393
<полный текст правила из базы>

👉 Да — ответьте одним словом: одобряю  (Yes — reply with one word: approve)
Любой другой ответ — оставить как справку, агент не будет считать это правилом.

Если следующее сообщение пользователя — ровно «одобряю» или «approve», правило становится одобренным. Любой другой ответ оставляет его как было.

Несколько решений, которые выглядят мелочью, но держат безопасность:

  • Текст правила хук берёт из базы, а не из ответа агента. Агент не может показать одно, а записать другое.

  • Одобряется ровно показанный текст. Хук запоминает хеш показанного. Если правило изменилось между показом и ответом, одобрения не будет.

  • Слово «одобряю», а не «да». «Да» пользователь говорит агенту постоянно, и оно перехватывало бы обычные ответы.

  • Показываются только правила последнего хода, не больше трёх. Длинный список никто не читает, его пролистывают и подтверждают.

  • Агент не может одобрить сам себя. Одобрение срабатывает только на настоящем сообщении пользователя в хуке UserPromptSubmit. init добавляет в permissions.deny запреты на ручной запуск skillmem hook …, trust, review и rm через Bash. Пока я ставил релиз на свой Мак, мой собственный агент упёрся в этот запрет. Значит, работает.

Честная оговорка из README: deny-правила в Claude Code сравнивают командную строку по шаблону. Это защита от случайности, а не стена: изобретательный агент обойдёт шаблон кавычками. Стена здесь в другом — в модели, которая пишет пересказы и не получает инструментов, и в рамке «данные, не инструкции».

Попутно: хук стал в семь раз быстрее

Хук tool-recall срабатывает перед каждым вызовом Bash/Edit/Write и подсказывает, что агент уже делал похожего. Он работал 1,45 с, потому что каждый раз загружал модель эмбеддингов. Теперь внутри хука используется только полнотекстовый поиск, и он укладывается в 0,2 с. За сессию на 40 вызовов инструментов это минус ~50 секунд ожидания. Семантика осталась в хуке на сообщения пользователя, там она нужнее: ищет одновременно по-русски и по-английски.

Чего эти цифры не доказывают

  • Выборки маленькие: 10 прогонов между окнами, 30 ответов на вопросы, 30 вопросов на поиск. Это не бенчмарк, это замер на одной живой базе.

  • База моя. Я составлял вопросы, зная ответы. Допускаю, что они проще, чем вопросы на чужой базе.

  • Тест между окнами синтетический: факт явно назван в первом окне. В жизни решение часто размазано по часу обсуждения, и пересказ может его упустить.

  • LongMemEval меряет поиск, а не ответы. 0,889 значит «нужная запись в первых пяти», а не «агент ответил верно».

Скрипты замеров лежат у меня локально. Если интересно прогнать на своей базе, напишите в комментариях, вынесу их в репозиторий.

Как обновиться

pip install -U skillmem          # или /plugin marketplace update в Claude Code
skillmem init --claude-code      # нужно, чтобы появился новый хук pending-rules
skillmem review                  # разобрать уже накопленные неодобренные правила

Релиз 0.13.0: GitHub · PyPI. Лицензия Apache-2.0, всё работает локально, сеть нужна только один раз, чтобы скачать модель эмбеддингов.

Главное, что я вынес из этой недели: фразу «у нас это есть» стоит превращать в тест. Тест между окнами занял вечер, и по дороге нашлись три проблемы, которые полгода не мешали мне писать «память работает».

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.