
Года два моя кухня держалась на трёх системах. Полка для специй, доставшаяся вместе с квартирой, прикрученная к стене над плитой. Ящик, который я разобрал сам, когда полка переполнилась. И полка в кладовке — для всего, что не влезло ни туда, ни туда.
Во всех трёх лежала паприка. Знаю, потому что покупал её трижды.
Это не катастрофа; с этим живут. Меня сломала суббота, когда у меня готовил друг, а я весь вечер простоял у него за спиной — нет, хорошая сковорода под мойкой, эта соль крупная, бери вдвое меньше, духовка греет сильнее, чем показывает. Он готовит лучше меня. Просто он не мог работать на моей кухне без меня внутри неё.
Две недели назад я понял, что наши репозитории ровно в таком состоянии.
Три полки, одна кухня
OwlMeans Common — это библиотека, на которой стоит каждый проект, что мы строим, и каждый из этих проектов строит агент. Поэтому репозиторий здесь держит не только код — он держит инструкции, которые агент читает самыми первыми: как мы всё раскладываем, чего нельзя делать никогда, какой скрипт за что отвечает.
Мы поддерживали двух агентов, Claude Code и GitHub Copilot, и каждый хотел свою полку. Поэтому каждое правило писалось дважды — один раз как .claude/skills/<имя>/SKILL.md, второй — как .github/instructions/<имя>.instructions.md. Два всегда загруженных файла контекста, почти копии друг друга. Две карты репозитория. Один и тот же shell-скрипт, лежавший байт в байт в двух каталогах. Две папки памяти, тихо расходившиеся.
Налог видно прямо в истории: один коммит того периода трогает двенадцать файлов навыков и одиннадцать их зеркальных близнецов. Никто не решал, что это хорошая идея. Оно наросло — так же, как нарастает третья полка для специй.
Одна полка, одна карточка
Так что я это выдрал. Всё переехало в одну папку — .agents/, где лежат навыки, правила, скрипты и память, — а всё, что агент обязан прочитать перед стартом, собралось в один файл в корне: AGENTS.md. В OwlMeans Common это удалило двести тринадцать дублированных файлов инструкций. CLAUDE.md, в котором раньше было восемьдесят шесть строк всего на свете, теперь весит шестьсот байт.
Полку придумал не я. Я взял ту, на которой все уже сошлись, — и то, как именно они сошлись, и есть причина, почему я ей доверяю.
В мае 2025-го Amp предложил один файл под названием AGENT.md, в единственном числе. Потом OpenAI выбрала для Codex множественное — и множественность тут главное, потому что один файл делят между собой много агентов. Amp мог биться за своё название. Вместо этого они написали: «вместо того чтобы настаивать на том, что придумали мы, мы решили, что лучше иметь один стандарт» — при условии, что OpenAI закрепит за собой домен agents.md. OpenAI это сделала, и Amp перешёл.
От двадцати тысяч репозиториев в августе 2025-го это выросло до более чем шестидесяти тысяч сегодня, а в декабре стандарт передали Agentic AI Foundation под крылом Linux Foundation. Двадцать три инструмента читают его нативно — Codex, Cursor, Copilot, Gemini CLI, Zed, Windsurf, Devin, Jules, Aider.
Вторая половина полки пришла с противоположной стороны. Agent Skills — формат SKILL.md — принадлежал Anthropic и был открыт как публичная спецификация в декабре 2025-го, под опекой того же фонда. Он точно описывает, как выглядит папка навыка, и не говорит ни слова о том, где эта папка должна лежать. Поэтому каждый вендор выбрал родительский каталог сам. Codex сканирует .agents/skills. Copilot принимает .agents/skills. Это и решило дело за меня.
Гость, который приходит со своими ножами

Один агент карточку на дверце не читает.
Claude Code читает CLAUDE.md — и только CLAUDE.md. Просьба читать ещё и AGENTS.md открыта с марта: issue #34235 в репозитории Claude Code, в кластере с тысячами голосов, — и она открыта до сих пор. Что немного смешно, учитывая, что формат навыков из второй половины этой же папки написали в Anthropic.
Соблазнительный ответ — вторая копия. Все, кто пробовал, рассказывают один и тот же финал: два файла, которые правят руками, всегда расходятся, а файл инструкций, разошедшийся с реальностью, хуже отсутствия файла, потому что агент ему верит.
Поэтому мы сделали мостик. CLAUDE.md выжил — шестьсот десять байт, байт в байт одинаковые в каждом репозитории, — и его первая строка это @AGENTS.md. Остальное — заметка о том, что навыки живут в .agents/skills/ и писать их где-либо ещё нельзя никогда. Дальше небольшой shell-скрипт создаёт по одному симлинку на каждый навык в игнорируемый гитом .claude/skills/, а хук сессии пересоздаёт их каждый раз. По одному на навык, а не на каталог: Claude Code принимает засимлинченную запись навыка, но не засимлинченную папку навыков — такое узнаёшь только тогда, когда попробуешь.
Рецепты моей рукой
Вторая перемена весит больше, чем папка.
Кулинарная книга говорит: печь двадцать пять минут при ста восьмидесяти. Карточка внутри моего шкафа говорит: двадцать две минуты, задняя левая, эта духовка греет сильнее. Обе верны; только одна — про мою кухню.
Проекты OwlMeans не ставят универсальных навыков — каждый выращивает свои. В нашем репозитории платформы их девятнадцать, в соседнем репозитории агента — двадцать три, и там, где имена совпадают, содержимое уже нет: execution в одном означает абстракцию, во втором — её использование на стороне платформы. Это не дублирование. Это две разные кухни.
Беда с карточкой на дверце в том, что духовки меняются. Поэтому харнес теперь замыкает петлю. Утвердить план — значит одновременно утвердить проход, который идёт следом: когда работа завершена, агент возвращается к навыкам, которых она коснулась, переписывает те, что перестали быть правдой, а финальный отчёт обязан нести таблицу — что обновлено, что создано, а что не потребовало ничего, и почему. Отчёт без этой таблицы считается незавершённым.
И ещё одно правило, которое понравилось мне больше, чем я ожидал: навык описывает действующие правила, а не то, что изменилось. Никаких датированных бюллетеней, никакого раньше X, теперь Y. Проверка простая: готовый навык должен читаться так, будто функция всегда была именно такой.
Полки по блюдам, а не по дате покупки
Третья перемена — та, с которой я расстался бы последней.
У агентов теперь есть память, и, оставленные сами по себе, они ведут её как дневник. Наша так и выглядела — файлы, названные по событиям, вроде slot-status-reconciler.md или null-error-investigation.md, каждый начинался с того, что мы делали на той неделе. Это список покупок. Он отлично фиксирует, когда ты что-то купил, и ничего не говорит о том, что нужно сегодняшнему ужину.
Так что мы перегруппировали полки по блюдам. Узел памяти теперь называется по реальной части проекта — подсистеме, теме вроде роутинга или переводов, внешнему сервису или самому репозиторию — и никогда по событию, дате или задаче. Его тело делится на то, что является правдой, что обязано выполняться, что больно кусается и где искать, а даты разрешены ровно в одной секции — для работы, которая ещё идёт.
Настоящую работу делает индекс. Максимум пятьдесят строк, по одной на узел, в каждой — пути, которые этот узел покрывает. Агент читает его в начале сессии и больше ничего; когда приходит задача, он сопоставляет её пути с этими строками и открывает тот один-два узла, что совпали. Он никогда не читает всё хранилище.
А записи — это слияния. Когда что-то меняется, ты переписываешь строку на месте и никогда не дописываешь под ней датированную поправку, иначе файл тихо снова становится дневником. Наш репозиторий платформы прошёл путь от двадцати хронологических файлов к одиннадцати структурным узлам, и поиск чего угодно перестал быть раскопками.
Это можно просто иметь
Отойди на шаг — и ничего экзотического тут нет. Одна папка вместо трёх. Карточка на дверце, объясняющая, как здесь всё устроено. Рецепты своей рукой, которые держат в актуальном состоянии. Полки, сгруппированные по тому, что ты действительно готовишь.
И всё равно это стоило двух недель, большая часть которых ушла на вещи, которых не нагуглишь: что стандарт существует и какой именно победил; что засимлинченная папка навыков не работает там, где работают отдельные симлинки на навыки; что память, привязанная к событиям, гниёт, а привязанная к структуре — нет.
Так что вот честное предложение.
Если ты строишь с агентом что-то настоящее, ты в это упрёшься. Ты добавишь второго агента и начнёшь писать всё дважды. Ты вырастишь папку памяти, которая читается как дневник, который никто не хочет открывать. Можно сделать как я и сжечь две недели. Мне это было того стоило — это моя работа.
Это не твоя работа.
Именно это OwlMeans и поставляет. Каждый проект, который строит Платформа, выходит с харнесом уже внутри — .agents/, AGENTS.md, навыки, скроенные под этот проект, граф памяти в форме его собственного кода, — а OwlMeans Services прилаживает то же самое к кодовой базе, которая у тебя уже есть. Всё это принадлежит тебе. Никакого вендор-локина и никакого «домашнего» агента: Codex, Copilot, Claude Code, что бы ни вышло в следующем квартале — все они читают одну и ту же полку.
Любой повар, любая кухня. Пропусти мои две недели — это можно просто иметь.
OwlMeans строит полностековые TypeScript SaaS-приложения из ваших пользовательских историй — типизированные, готовые к SSO, ваши для дальнейшего развития с любым агентом. Посмотрите, на что он способен →