Stop-хук skillmem за сутки сработал 4083 раза, хотя днём раньше — шесть. Механизм оказался простым: хук на Stop просит модель сделать выжимку сессии через claude -p, а дочерний процесс — это полноценная сессия Claude Code, которая на своём Stop дёргает тот же хук. Дна у этой воронки нет. За сутки накопилось 3901 фантомная сессия, гигабайт транскриптов на диске и около 286 млн кэш-токенов подписки. Мусорные выжимки вида «сессия пуста, пришлите текст» лезли в контекст при следующем старте.

Самое неприятное — этот баг уже был 09.09 и был закрыт тремя предохранителями. При переименовании проекта модуль хуков перенесли, и потерялись все три: env-флаг в потомке, слот-семафор и --strict-mcp-config. Автор вернул сначала один, потом, разобравшись, все. Отсюда правило: любой хук, запускающий агента, обязан глушить себя в потомке, а при переписывании модуля с предохранителями переносить все, а не те, что помнишь.

ВерсияЧто исправлено
0.9.3Анти-рекурсия: env с флагом отказа в дочерний процесс плюс тест на доставку флага
0.9.4Частотный лимит, метка на попытку, проверка кода возврата, слот-семафор, --no-session-persistence
0.9.5Четыре тихих дефекта: recall для NotebookEdit, привязка 7793 заметок к сессии, страж MCP, леджер в /tmp
0.9.6Гонки за финальную выжимку, привязка заметки к объёму транскрипта, честный бюджет SessionEnd
0.9.7Граница доверия, команды skillmem recap и skillmem hooks-status
0.9.8Пропущенный ход больше не читает транскрипт
0.9.9Публикация выжимки стала compare-and-swap
0.10.0Граница доверия: происхождение записи, skillmem trust, рамка «данные, не инструкции», суммаризатор без инструментов
0.10.1Три манифеста, включая server.json для MCP Registry, всё ещё рекламировали 0.9.2

Дальше — по релизам. В 0.9.3 добавили анти-рекурсию через env с флагом отказа в дочерний процесс и тест на то, что флаг реально доезжает. Старый тест проверял только «если флаг выставлен снаружи — молчим», поэтому регрессия и прошла зелёные тесты. В 0.9.4 появился частотный лимит: Stop в Claude Code срабатывает после каждого ответа, а не при закрытии сессии, то есть в обычный рабочий день это вызов модели на каждый ход и куча почти одинаковых заметок. Метку стали ставить на попытку, а не на успех, проверять код возврата — иначе текст ошибки «usage limit reached» длиной больше 100 символов записывался как память и затирал хорошую выжимку, — и вернули слот-семафор. Там же дочерний claude -p начал запускаться с --no-session-persistence, и фантомные транскрипты перестали появляться вообще.

Предохранители от рекурсии существовали с 09.09, но потерялись при переименовании проекта: env-флаг в потомке, слот-семафор и --strict-mcp-config.

В 0.9.5 внешнее ревью нашло четыре тихих дефекта. Recall для NotebookEdit был мёртв: хук читал file_path, а Claude Code для ноутбуков присылает notebook_path. Все 7793 заметки из 7793 лежали без привязки к сессии: писатель кладёт в frontmatter source_session, а импортёр знал только originSessionId. Страж MCP врал цифрой: считал все серверы, а не пересечение с эталоном, и мог сказать «12 из 10 подключено». Леджер показанных записей жил в общем /tmp, где сосед по машине может создать файл заранее и заглушить чужой recall.

В 0.9.6 закрыли гонки за финальную выжимку: медленный Stop и SessionEnd за ним перекрывались, и старый результат затирал финальный. Заметка теперь хранит, по какому объёму транскрипта она сделана, и тот, кто прочитал меньше, не пишет поверх. Плюс честный бюджет: Claude Code поднимает бюджет SessionEnd до таймаута хука, но не выше 60 секунд — значит финальный вызов должен просить у модели меньше. В 0.9.7 появилась граница доверия, а также команды skillmem recap и skillmem hooks-status. Второе — из наблюдения, что хуки по дизайну глушат свои ошибки, чтобы не ломать сессию, а значит тихо умерший хук выглядит ровно как хук, которому нечего делать. Теперь есть команда, показывающая запуски, пропуски, падения и последнюю строку каждого.

В 0.9.8 пропущенный ход перестал читать транскрипт: проверка лимита стояла после подсчёта строк файла, то есть на каждом пропущенном ходу весь транскрипт прочитывался впустую. На машине автора это файлы до 59 МБ и 840 МБ суммарно. В 0.9.9 публикация выжимки стала compare-and-swap: проверка свежести и замена файла были двумя шагами, и Stop, прошедший проверку до того, как SessionEnd записал финал, затирал его после. Базис перечитывается внутри короткого лока — миллисекунды, не вызов модели.

В 0.10.0 появилась граница доверия — самый большой кусок. У каждой записи есть происхождение (owner/agent/imported/derived), доверие даёт только владелец командой skillmem trust, правка текста одобренной записи снимает одобрение, а всё неодобренное подмешивается агенту внутри помеченной рамки «данные, не инструкции». Суммаризатор транскриптов запускается вообще без инструментов (--tools "" + --strict-mcp-config), а если CLI этих флагов не знает — выжимка не делается совсем. Это закрывает путь «чужой README → память агента → правило пользователя».

В 0.10.1 выяснилось, что три манифеста, включая server.json для официального MCP Registry, всё ещё рекламировали версию 0.9.2 — то есть кто поставил бы skillmem через реестр, получил бы версию с той самой рекурсией. 0.10.2 и 0.10.3 закрыли два кон... (в источнике текст обрывается).

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