Предыдущий пост утверждал, что CLAUDE.md — только для инвариантов. Тогда что класть в memory? Я открыл все 5 файлов memory, работающих сейчас в этом проекте, и проаудитировал их один за другим — что остаётся, что стоит удалить и где на самом деле проходит граница между CLAUDE.md и memory.
Предыдущий пост утверждал, что в CLAUDE.md должно быть только то, что Claude не может увидеть, читая код. Читатель тут же спросил: а как же memory? Memory — это тоже контекст, так в чём реальная разница?
Многие со временем начинают относиться к memory как к «резервному расширению» CLAUDE.md — сваливают туда всё, что приходит в голову. Со временем memory разбухает, Claude читает его каждую сессию, и решения принимаются на устаревшей информации.
Этот пост пропускает абстрактные определения. Я открыл все 5 файлов memory, которые сейчас живут в этом проекте, и проаудитировал их один за другим — что остаётся, что идёт в мусор, а что вообще не стоило писать. По ходу вопрос CLAUDE.md vs memory отвечает сам на себя.
Полезный вопрос — не «куда это положить», а «сколько живёт эта информация и кто её обновляет».
feedback_commits — ждать, пока я скажу "commit", и только тогда коммитить
feedback_article_authenticity — практические статьи нельзя выдумывать
project_i18n_strategy — решение «выпустить все языки одновременно»
project_howdev_plan — незавершённый план для how2claude.dev
project_article_workflow — пайплайн публикации статей
Сгруппируем по типу.
Тело короткое: "don't auto-commit, wait for user to confirm."
Самый высокий ROI среди типов memory. Одна поправка → постоянна в каждой будущей сессии.
Почему не в CLAUDE.md? Это не правило проекта — это моя личная рабочая привычка. Если к проекту подключится другой контрибьютор, ему не обязательно следовать тому же правилу. CLAUDE.md — на уровне команды. Memory — «между мной и Claude».
Почему не повторять в начале каждого разговора? Потому что memory сохраняется между сессиями. Когда Claude будет помогать мне на следующей неделе, он всё ещё будет это помнить.
Триггер чистый: я поправил один раз и хочу, чтобы поправка сохранялась вечно.
Тело этого memory необычно конкретно:
2026-04-16, когда я писал финал серии multi-agent, я выдумал историю о «трёх Agent'ах, строящих webhook-фичу»... всё выдумано. Пользователь спросил «это реально или придумано?» — это другой уровень ожиданий, чем у двух предыдущих (методологических) статей...
Суть: поле Why не абстрактный принцип — это конкретное событие + дата + что произошло.
Почему так написано? Через полгода «практическим статьям нужен реальный материал» как абстрактное правило меня озадачит — когда это зафиксировали, почему? А «4-16, выдумал историю про agent и попался» вызывает мгновенное воспоминание и позволяет на месте судить, применимо ли правило.
Это самая «тяжёлая» запись из моих 5. Это не просто правило — это дело об инциденте, к которому могут обращаться и Claude, и я.
Содержание: почему этот проект агрессивно запустил все языки одновременно — стоимость перевода через Claude ~$0, и английская официальная документация — ключевое окно возможностей.
Этого не видно из кода. Код показывает только 19 файлов локали. Почему 19, почему одновременно, почему японский и корейский в приоритете — всё это живёт у меня в голове.
Memory кристаллизует это «решение в голове» в нечто устойчивое, чтобы Claude, когда позже будет предлагать фичу, мог спросить: конфликтует ли это со стратегией i18n?
Это не операционное правило (не в CLAUDE.md). Это стратегический фон (в memory).
Самый временный из всех: план реализации из 9 файлов для сайта разработчиков how2claude.dev, заканчивается словами «продолжить в следующей сессии».
Самый опасный тип memory — легко превращается в зомби-memory. Закончил работу, забыл удалить; в следующий раз Claude считает его актуальным и советует на основе устаревшего плана («вы ещё не сделали step 3»).
Таким memory нужен явный механизм выхода: в момент, когда how2claude.dev будет запущен, мне придётся удалить эту запись вручную.
У этой самая высокая плотность информации. Сначала думал, это самая полезная — пока не прочитал внимательно:
/write-article и /publish-article → посмотреть .claude/commands/, готовоdocs/drafts/ делает это очевидным.claude/publish-config.jsonClaude может вывести всё это, читая код.
Единственное, что memory действительно даёт, — последний блок: "Accounts (production): zh → @how2claude, en → @howtoclaude" — и это уже устарело. В прошлой сессии оказалось, что в продакшене на самом деле zh=@howtoclaude. Memory зафиксировал снимок нескольких дней назад; он уже разъехался с реальностью.
Вывод: 90 % этого memory должно уйти. Часть, которую стоит сохранить («использовать kamal, чтобы опрашивать аккаунты вживую»), лучше подходит для CLAUDE.md — или, ещё лучше, нигде, потому что захардкоженные в memory аккаунты всё равно снова разъедутся.
1. Настоящая задача memory — открывать комнаты, в которые Claude не может войти.
2. Если Claude может прочитать это в коде, не помещай это в memory.
Тот же принцип, что и в предыдущей статье про CLAUDE.md. Пути к файлам, URL API, структура каталогов — всё это вопросы, на которые отвечает код. Запихивать в memory, чтобы не делать grep ещё раз, — это ставка на то, что информация никогда не изменится.
3. Memory ветшает.
project_article_workflow — доказательство: написано пару дней назад, информация об аккаунтах уже неверна. Чем старше memory, тем меньше ей можно доверять. Регулярный аудит > бесконечные добавления.
4. Поле Why — это то, что вас спасает.
Сравните два моих feedback'а:
feedback_article_authenticity: «4-16, я выдумал историю в статье multi-agent» → через полгода я могу мгновенно оценить, применимо ли правило.feedback_commits: только «user wants to review» → через полгода я не уверен, какая конкретная поправка его породила.Второй заметно слабее. Абстрактные принципы не выживают — никто не помнит, зачем их вводили.
Когда появляется новая информация, задайте три вопроса:
Третий вопрос — ловушка. Большинство «неизменных» вещей, которые хочется записать, на самом деле выводимы из кода — просто не хочется, чтобы Claude снова делал grep.
После прохода несколько вещей бросаются в глаза:
project_article_workflow выводимо из кода. Этой записи нужна самая серьёзная операция.project_howdev_plan — временная передача; в теории у неё должен быть механизм выхода.project_i18n_strategy — стратегическое решение; стоит пересмотреть через пару месяцев.feedback_commits слабый; привязать конкретное событие сделает его устойчивее.Побочное наблюдение: моё распределение типов — feedback×2 + project×3, и ноль типов user или reference. Значит, я ещё не сказал Claude, «кто я» или «из каких внешних систем я считываю состояние». Вероятно, это следующая партия к написанию.
Главная ловушка memory — не «что я должен был записать, но не записал». А «что я записал, и оно теперь устарело». При 5 записях достаточно одного смещения — Claude молча использует устаревшую информацию для решений и не сообщит вам о смещении.
В моих 5 я уже вижу несколько вещей, которые хочется подвинуть. А в ваших?