Anthropic тихо тестирует урезанный effort в Claude Code: я проверил свой AI-конвейер и залатал дыру
С Claude Code 2.1.236 часть сессий Fable 5 попадает под серверный A/B-тест: запрошенный effort 'high' бэкенд читает как 10 из 100 - ровно как раньше 'low'. Anthropic подтвердила эксперимент, но отрицает просадку качества. Заметить подмену можно по шапке сессии; зафиксировать effort надёжно - переменной CLAUDE_CODE_EFFORT_LEVEL, она приоритетнее остальных настроек.
Разработчик поймал Claude Code 2.1.237 на тихом A/B-тесте, сжимающем effort до уровня low. Разбираю находку, апрельский прецедент Anthropic и как я закрыл эту дыру в своём AI-конвейере статей.

Что за история с effort в Claude Code
Anthropic втихую тестирует сжатие шкалы effort в Claude Code - часть сессий получает уровень "high", который бэкенд на самом деле читает как 10 из 100, то есть ровно как раньше читался "low". Обнаружил это разработчик под ником argofowl в версии 2.1.236+, а Anthropic подтвердила: это A/B-тест, не баг, и не все его увидят. Дальше - как это заметить у себя и как зафиксировать effort вручную, чтобы не зависеть от чужих экспериментов.
Я гоняю статьи вот через этот самый конвейер - тот, что пишет и этот текст - через headless-вызовы claude -p без единого явного effort. Пока читал историю с argofowl, проверил свои cron-обёртки. Дыра оказалась настоящей, ниже расскажу, что нашёл.
Что такое effort-левел в Claude Code
Effort - это параметр, который управляет тем, сколько токенов Клод тратит на ответ: от "low" (быстро и дёшево, годится для простых задач) до "max" (без ограничений, для самых сложных). Всего пять уровней - low, medium, high, xhigh, max, - и они влияют не только на объём рассуждений, но и на текст ответа, аргументы вызовов инструментов и число самих вызовов.
По умолчанию Claude Code берёт "high" для всех моделей, которые поддерживают effort, кроме Opus 4.7 и Opus 4.8 - для них дефолт "xhigh". Указать "high" явно и вообще не указывать effort - одно и то же поведение, это подтверждено в официальной документации Anthropic. Разница между уровнями калибруется отдельно под каждую модель, так что "medium" у Sonnet 4.6 и "medium" у Opus 5 - не одно и то же число токенов.
Что нашёл argofowl в версии 2.1.236+
Разработчик заметил: начиная с Claude Code 2.1.236, часть сессий Fable 5 попадает под серверный эксперимент, который сжимает шкалу effort - без строчки в чейнджлоге. По его наблюдениям, с версии 2.1.237 запрошенный уровень "high" на бэкенде превращался в число 10 из 100 - именно то значение, которое раньше соответствовало "low". Более старые версии CLI и модель Opus 5 эксперимент не затронул, из чего argofowl сделал вывод, что это A/B-тест на части трафика, а не общий откат.
Публичный чейнджлог 2.1.236-2.1.237 (релиз 19 августа 2026 года) перечисляет 35 изменений - 4 новые фичи, 3 фикса безопасности, 11 улучшений и 17 багфиксов, включая переменную ANTHROPIC_DEFAULT_MODEL и стиль вывода Concise. Ни одного пункта про effort там нет - находка ушла в паблик только через твит, не через официальные заметки о релизе.
Когда история разлетелась, за Claude Code в Anthropic ответил инженер Тарик Шихипар: поменялась только логика маппинга значений effort, а не сам эффект. По его словам, шкала не буквально 0-100, число само по себе ничего не значит, и выбранный вами уровень effort - это именно тот уровень, который вы получаете; внутренние эвалы якобы не показали просадки качества. Проверить это со стороны нельзя - ни трасс, ни цифр Anthropic не публиковала, только текстовый ответ в треде.
Это уже было в апреле - и тогда деградация была настоящей
Ссылаться на "нам не о чем беспокоиться" от Anthropic сложно ещё и потому, что ровно за четыре месяца до этого компания сама признала: с 4 марта по 23 апреля 2026 года Claude Code реально терял качество из-за трёх наложившихся друг на друга изменений.
Сначала 4 марта дефолтный effort понизили с "high" до "medium" для Sonnet 4.6 и Opus 4.6 - боролись с задержками, из-за которых интерфейс казался подвисшим. Пользователям это не понравилось больше, чем задержки, и 7 апреля откат вернул "xhigh" для Opus 4.7 и "high" для остальных моделей.
Параллельно 26 марта в код добавили очистку истории рассуждений для простаивающих больше часа сессий - и по багу она срабатывала на каждом ходу вместо одного раза. Клод "забывал" контекст, повторялся и делал странный выбор инструментов; чинили это до 10 апреля, версия фикса - 2.1.101. Побочный эффект бага - лимиты сгорали быстрее из-за промахов кэша.
Третье изменение легло 16 апреля прямо в системный промпт Opus 4.7: ограничение "не больше 25 слов между вызовами инструментов, финальный ответ - не больше 100 слов". Итог - минус 3% к качеству кода сразу у нескольких моделей. Откатили 20 апреля в версии 2.1.116.
23 апреля Anthropic опубликовала постмортем и сбросила недельные лимиты всем подписчикам как компенсацию. То есть претензия "втихую урезали effort и не сказали" - это не гипотеза одного твита, а уже подтверждённый прецедент с датами, версиями и официальным разбором причин.
Как заметить деградацию, если промпт и код не менялись
Прямых логов, которые бы кричали "effort понижен", у Claude Code нет - но есть один встроенный индикатор: текущий уровень effort показывается в шапке сессии рядом с названием модели, например "with low effort", и коротко мелькает в футере при старте и при смене уровня. Это единственное официально задокументированное место, где effort виден без сторонних инструментов.
Дальше - поведенческие сигналы, тот же список, что называла Anthropic в апрельском разборе: агент стал более терсным, меньше объясняет план перед действием, схлопывает несколько операций в один вызов инструмента вместо нескольких. Если задача та же, а Клод внезапно перестал читать соседние файлы перед правкой или сократил тестирование - это тот же почерк, что у пониженного effort.
Разово почувствовать это тяжело, потому что effort - поведенческий сигнал, а не жёсткий бюджет токенов: модель всё равно подумает на действительно сложной задаче, просто меньше, чем на более высоком уровне. Надёжнее не гадать по ощущениям, а держать пару контрольных задач для регулярного прогона и сравнивать результат по неделям - если объём рассуждений или число вызовов инструментов на одной и той же задаче вдруг просело, это повод проверить effort явно, а не списывать на "нейронка стала тупее".
Проверил свой конвейер статей - дыра оказалась настоящей
У меня headless-часть пайплайна дёргает claude -p из cron четырьмя разными скриптами - генерация черновика, правки по комментам, сбор тем в беклог и фактчек со скорингом. Прогнал grep по всем cron/run-*.sh - ни в одном из четырёх вызовов claude -p нет флага --effort:
claude -p "/blog-draft $TOPIC_ID" --permission-mode acceptEdits
claude -p "/blog-edit $id" --permission-mode acceptEdits
claude -p "/blog-backlog" --permission-mode acceptEdits
claude -p "/blog-check $DID" --permission-mode acceptEditsТо есть все четыре точки входа в конвейер живут на дефолтном effort аккаунта - каким бы он ни был в моменте, хоть высоким, хоть случайно попавшим под чей-то A/B-тест. Ни один прогон за последние месяцы не жаловался на явную деградацию текста в логах, но это не доказательство, что effort всё время был "high" - просто некому было это заметить: сравнивать не с чем, эвалов на свои же черновики я не гонял. Собственно поэтому и полез проверять после истории с argofowl - не потому что уже поймал баг, а потому что понял: у меня нет ни одного способа его поймать, если он случится.
Как зафиксировать effort вручную
Способов задать effort explicit несколько, и они не равны по надёжности. Флаг --effort при запуске фиксирует уровень только на текущую сессию - для разового прогона хватит, для cron-скрипта нет, потому что при перезапуске он не сохранится сам по себе, если не прописан в самой команде. Настройка effortLevel в settings-файле принимает low, medium, high или xhigh (max и ultracode через неё не задать) и держится между сессиями. Во фронтматтере скилла или сабагента тоже можно явно указать effort - он переопределит уровень сессии, но не переменную окружения.
Самый весомый рычаг - переменная окружения CLAUDE_CODE_EFFORT_LEVEL: она приоритетнее флага --effort, настроек и фронтматтера скилла, и именно она может снять зависание на "дефолте новой модели", когда Claude Code держит эффорт модели даже поверх ваших прошлых настроек. Для headless-cron это и есть самая надёжная точка фиксации - один export в обёртке перед вызовом claude, и весь пайплайн больше не зависит от того, что там сейчас крутит Anthropic на бэкенде.
Тут есть отдельная ловушка именно для headless-запусков: команда /effort, вызванная в non-interactive режиме с флагом -p, применяется только к текущему прогону и не сохраняется как дефолт - если полагаться на неё внутри cron-скрипта, настройка слетит на следующем же запуске. Рабочий вариант для -p - передавать уровень через --effort прямо в команде запуска или через CLAUDE_CODE_EFFORT_LEVEL, а не через /effort как первую строку промпта. И ещё нюанс: смена effort между запросами сбрасывает кэш промпта предыдущих реплик, потому что effort меняет сам рендер запроса под капотом - для длинных сессий с кэшированием контекста уровень лучше выставлять один раз в начале и не дёргать.
Для себя решил так: в ближайшую правку добавляю --effort high в каждый из четырёх вызовов claude -p в cron-скриптах, а не полагаюсь на дефолт аккаунта - благо экономить на effort в статьях, которые потом читают живые люди, смысла нет, а токены на этом объёме не главная статья расходов. Дефолт хорош, пока Anthropic не решит его тихо подвинуть - а решала уже дважды за один только 2026 год.
Что в сухом остатке
История с argofowl - не первый и, скорее всего, не последний случай, когда слой между вашим промптом и моделью меняется без предупреждения: то же самое уже ломало скиллы после переезда на Opus 5, то же самое стоит за жалобами на то, что субагенты неожиданно жрут недельный лимит. Единственная защита от такого - не полагаться на дефолт там, где у вас автоматический конвейер без человека в цикле, а прибивать effort явно и держать пару контрольных задач для сравнения по времени. Дёшево, делается один раз, и снимает вопрос "мне кажется или агент правда стал тупее" одним взглядом в шапку сессии.
Частые вопросы
Как понять, какой effort сейчас применяется в сессии Claude Code?
Текущий уровень показан в шапке сессии рядом с названием модели, например 'with low effort', и коротко мелькает в футере при старте и смене уровня - это единственный встроенный индикатор, логи API его не показывают.
Что будет, если менять effort посреди диалога?
Смена effort между запросами сбрасывает кэш промпта предыдущих реплик, потому что effort меняет сам рендер запроса - для долгих сессий с кэшированием уровень лучше держать постоянным с самого начала.
Какой способ фиксации effort самый надёжный для headless-сценариев?
Переменная окружения CLAUDE_CODE_EFFORT_LEVEL - она приоритетнее флага --effort, настроек и фронтматтера скилла, поэтому в cron-обёртках надёжнее прописывать её, а не полагаться на /effort внутри промпта.
Как готовился материал: черновик собран моим AI-конвейером по темам и заметкам из практики, факты сверены с первоисточниками, финальный текст я прочитал, поправил и утвердил перед публикацией. Обложку к статье тоже рисует нейросеть. Про сам конвейер — в разделе обо мне.
