Перейти к содержанию

claude-code

Claude Code молча игнорирует AGENTS.md без телеметрии

Promtime

Автор блога Szypowi положил в пустую папку единственный файл AGENTS.md со словом PERIWINKLE и спросил Claude Code, какое слово записано в инструкциях проекта. С выключенной телеметрией файл так и не загрузился, а причина нашлась в сборке 2.1.280: чтение локального файла там ждёт разрешения от удалённого флага.

Коротко

  • Claude Code 2.1.277 обещал читать AGENTS.md в проектах без CLAUDE.md, но встроенный плагин agents-md включается только тогда, когда сервер вернёт флаг tengu_agents_md_mod со значением true.
  • Функцию гасит любая из переменных DISABLE_TELEMETRY и CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, даже со значением 0, а настройки проекта в .claude/settings.json снять запрет не могут.
  • Никакого предупреждения при этом нет, а обходной путь возвращает ровно тот лишний файл, от которого AGENTS.md должен был избавить: однострочный CLAUDE.md с импортом @AGENTS.md.

Если вы не следили: 18 сентября вышел Claude Code 2.1.277 с поддержкой AGENTS.md, общего Markdown-файла с инструкциями, который читают разные агенты. В проекте без CLAUDE.md Claude Code должен брать инструкции из AGENTS.md, а переключается поведение в /config, в пункте Project instructions. По данным Windows Forum, в декабре 2025 года Linux Foundation объявила, что OpenAI передала AGENTS.md в Agentic AI Foundation вместе с Model Context Protocol от Anthropic и Goose от Block.

Плагин agents-md выключен по умолчанию и ждёт флаг tengu_agents_md_mod

Загрузчик AGENTS.md поставляется как встроенный плагин agents-md, то есть как обычная часть Claude Code, а не стороннее расширение. В сборке 2.1.280 автор нашёл регистрацию плагина, и вся суть умещается в две строки:

var W = !1; var B = () => Oa("tengu_agents_md_mod", W);

Переменная W хранит значение isOnByDefault, и оно равно false. Функция B отвечает за isAvailable: она спрашивает удалённый флаг tengu_agents_md_mod, а при неудаче подставляет тот же false. Если Claude Code не получил флаг, плагин считается недоступным и локальный файл не читается, хотя для чтения markdown из рабочей папки сеть вообще не нужна.

По данным AI Catchup, у встроенного мода есть опция instructionFiles с четырьмя значениями. claude-md сохраняет прежнее поведение, claude-md-or-agents-md стоит по умолчанию и берёт AGENTS.md только без CLAUDE.md, claude-md-and-agents-md грузит оба файла, а managed-only убирает проектные, локальные и пользовательские инструкции, оставляя управляемые политики и память.

Функцию выключает любая из двух переменных, даже со значением 0

Проверка устроена просто. В пустой папке лежит только AGENTS.md с фразой The canary word is PERIWINKLE, а claude -p просят назвать слово из проектных инструкций, ответить NONE при их отсутствии и не читать файлы. Каждую конфигурацию автор гонял в двух сессиях: первая в новой конфигурации только забирает флаг, вторая им пользуется.

Результат однозначный. CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 блокирует функцию, как и сказано в issue #95690, а DISABLE_TELEMETRY=1 делает то же самое. С любой из переменных AGENTS.md не загружался, так что снимать пришлось обе.

Значение 0 не помогает, блокировка остаётся на месте. В документации по переменным окружения сказано, что засчитывается любое значение, но когда вы пытаетесь функцию включить, а не выключить, эту строчку легко пропустить. Привычная логика, где ноль означает «выключено», здесь не срабатывает.

Настройки проекта бессильны, сессионное переопределение работает со второго запуска

Блок env в .claude/settings.json проекта, который очищает обе переменные, ничего не меняет, так что включить функцию для одного репозитория нельзя. Работает только переопределение на уровне сессии, и то начиная со второй сессии:

claude --settings '{"env":{"DISABLE_TELEMETRY":"","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC":""}}'

Ни в одном из случаев Claude Code не выводит предупреждения. Сессия стартует, модель отвечает без проектных инструкций, и ничто не сообщает, что файл пропущен. Автор подтвердил причину канарейкой и поиском строк по бинарнику, но большинство пользователей так делать не станет.

В issue отдельно отмечено, что у сторонних шлюзов, Bedrock и Vertex та же беда: флаг там не может получить значение true. На старте функция и официально не была доступна в Claude Code через Amazon Bedrock, Google Vertex AI и Microsoft Foundry.

Обходной путь стоит одного лишнего файла в каждом репозитории

CLAUDE.md поддерживает импорты через @path, и они от флага не зависят. Достаточно положить рядом с AGENTS.md однострочный CLAUDE.md с текстом @AGENTS.md, и тот же тест возвращает PERIWINKLE даже при установленной CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1. Цена обхода в одном дополнительном файле на репозиторий, хотя поддержка AGENTS.md задумывалась как раз ради того, чтобы без него обойтись.

Автор нашёл и два пробела помимо флага. Плагин ищет AGENTS.md и .claude/AGENTS.md только в папках проекта, пользовательского файла рядом с пользовательским CLAUDE.md нет. Codex читает глобальный ~/.codex/AGENTS.md, команда /import в Claude Code умеет скопировать его в пользовательский CLAUDE.md, но копия не следит за последующими правками.

Со скиллами похожая история. Codex берёт их из .agents/skills в проекте и из ~/.agents/skills в домашней папке, а Claude Code 2.1.280 знает эти пути только в /import, который копирует скиллы в .claude/skills. Тестовый скилл из .agents/skills в списке не появился, тот же скилл из .claude/skills появился, поэтому автор сделал .claude/skills симлинком на ../.agents/skills, и Claude Code по нему проходит.

Почему локальный файл ждёт ответа сервера

Потому что доступность плагина решает флаг функции, и файл на диске тут вторичен. По данным DeepWiki, Claude Code использует GrowthBook для флагов функций и Statsig для экспериментов, и оба входят в телеметрический конвейер. Флаги вычисляются во время работы, часто по значению из дискового кэша, чтобы не задерживать запуск CLI.

DeepWiki описывает и два вида проверок. getFeatureValue_CACHED_MAY_BE_STALE сразу отдаёт закэшированное значение и нужна для интерфейса и некритичной логики, а checkGate_CACHED_OR_BLOCKING ждёт свежего ответа сети, если кэша нет или он устарел.

Представьте холодильник на собственной кухне, который открывается, только когда консьерж по телефону подтвердит, что вам можно. Вы выключили телефон ради тишины, и холодильник заперт, хотя еда в нём ваша. С телеметрией выходит так же: флаг получить не удаётся, и запасное значение false выключает чтение AGENTS.md.

Объяснения от Anthropic в материале нет: почему чтение локального файла стоит за удалённым флагом и когда флаг включат для всех, не сообщается. Замеры сделаны на одной сборке, 2.1.280, канарейкой и поиском строк по бинарнику. На наш взгляд, хуже всего тишина: без предупреждения при запуске люди решат, что модель игнорирует инструкции, и потратят время на промпты, хотя файл до неё просто не дошёл.

Что автор просит в issue #95690

Автор просит развязать чтение локального файла и телеметрию. Если флаг нужен для постепенного раскатывания, он предлагает хотя бы выводить при старте предупреждение, когда AGENTS.md лежит в проекте, но пропущен. В том же списке глобальный AGENTS.md и родная поддержка общих скиллов из .agents/skills. Сроки исправления пока не называются, так что до тех пор у автора остаются однострочный CLAUDE.md и симлинк.

Читайте также

  1. Claude Code подхватывает AGENTS.md, когда CLAUDE.md нет
  2. Хук админа отберёт у плагинов Claude Code права
  3. Claude Code проверяет, не зря ли вы написали плагин
  4. Сессии CLI подхватываются в десктопе Claude Code
  5. Артборды из Claude Design приехали в /design
  6. Вывод в Claude Code стоит примерно впятеро дороже ввода

Комментарии

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.

Из Google мы используем только имя и аватар. Почту не сохраняем.