За время работы в Cascade накапливаются memories - короткие заметки, которые агент создаёт сам, когда решает, что контекст стоит запомнить. Со временем их становится много, они выглядят как база знаний проекта, и возникает соблазн положиться на них как на надёжную память команды. Именно этот соблазн и подводит при переходе на Devin Local.
Наивный ход - считать, что раз memories накопились, знание уже сохранено и переносить ничего не нужно: новый агент подхватит их так же, как старый. В этой картине memory - это общий, разделяемый и вечный факт о проекте, и достаточно просто продолжить работать.
Ломается это на трёх свойствах memories, которые документированы прямо. Они создаются автоматически и привязаны к workspace - в другом рабочем пространстве их нет. Они хранятся локально в ~/.codeium/windsurf/memories и живут только на вашей машине. Они не под контролем версий и не попадают в репозиторий. И, по прямому предупреждению документации, могут быть неполными - полагаться на авто-memory как на единственный источник не стоит.
Отсюда принцип переноса: повторяемое знание переводят из авто-memory в проверяемую форму - reviewable rule или skill. Разница в том, что rule и skill живут в репозитории, проходят ревью, версионируются и видны всей команде, тогда как memory остаётся частной догадкой одного агента на одной машине. Reviewable - ключевое слово: rule и skill можно прочитать, обсудить в pull request и откатить как любой код, а memory возникает и меняется незаметно, вне чьего-либо ревью. Переносят не текст ради текста, а именно это свойство проверяемости - оно и отличает командное знание от личной догадки. Перенос - это превращение личной заметки в общий контракт.
Дом для правил тоже изменился, и оба адреса стоит знать. Современный предпочтительный путь - .devin/rules/.md; legacy-путь .windsurf/rules/.md всё ещё читается, поэтому старые правила не исчезают в один день. AGENTS.md обрабатывается тем же движком правил и удобен как общий переносимый минимум: корневой файл действует always-on, вложенные подхватываются по мере обращения агента к файлам своей директории. Тонкость здесь важна: по докам файлы правил из .devin/rules и из legacy .windsurf/rules читаются оба сразу, поэтому старое правило не отменяется новым, а действует рядом с ним - и при совпадении темы вы получаете два конкурирующих правила. Поэтому при переносе legacy-копию стоит либо удалить, либо привести в соответствие, а не оставлять как забытый дубль.
Не всякую memory нужно переносить, и часть - удалить. Полезно разложить содержимое по типу и назначить каждому свой дом заранее, а не решать в момент миграции. Ниже такая раскладка: что за знание в memory и куда его вести.
| Содержимое memory | Новый дом |
|---|---|
| Короткое постоянное ограничение | AGENTS.md / rule |
| Многошаговая процедура | Skill |
| Секрет или token | Не переносить; secret manager |
| Временная гипотеза | Issue/plan, затем удалить |
Отдельная строка в этой таблице - про то, что не переносят вовсе. Секрет или token из memory не переезжает ни в rule, ни в skill, ни в AGENTS.md: репозиторий и переносимый файл - неподходящее место для секрета, ему дорога в secret manager. Временная гипотеза тоже не заслуживает постоянного дома - её место в issue или плане, после чего memory удаляют.
Цена неверного переноса двусторонняя. Оставить знание только в авто-memory - значит потерять его при смене машины, workspace или агента и получить Devin Local, который "забыл" то, что команда считала известным. Перенести в repo лишнее - секрет, устаревшую гипотезу, разовое замечание - значит замусорить always-on контекст и, в случае секрета, вынести его за границу безопасности. Ошибка в обе стороны стоит либо потерянного знания, либо утечки. Особенно опасен always-on: правило, помеченное как всегда активное, попадает в контекст каждого turn, поэтому туда переносят только по-настоящему постоянные ограничения, а всё ситуативное оформляют как skill с триггерами или как glob-правило для своей директории.
Проверять перенос стоит не по факту "скопировал", а по свойствам нового дома. Открыт ли rule в репозитории и прошёл ли ревью. Лежит ли он по актуальному пути .devin/rules, а не только в legacy. Не утёк ли секрет в текст правила - это ловят тем же grep по diff, что и любой секрет перед коммитом. Пуста ли исходная memory после переноса, чтобы знание не двоилось в двух источниках с разной судьбой.
Типичный провал - принять авто-memory за перенесённое знание. "Devin Local не знает правило" - потому что оно осталось memory и не стало rule. "Правило не читается" - потому что лежит в legacy-пути, а рядом есть приоритетный .devin/rules с другим содержимым. "Секрет попал в git" - потому что memory перенесли дословно, вместе с token. Признак один: знание считают общим, хотя оно всё ещё живёт локально и приватно. Сначала спросите, где физически лежит факт и кто его видит - ответ обычно там же.