Claude Code 2.1.288 вернёт промпт, стёртый по Ctrl+C

Самое человечное исправление в Claude Code 2.1.288 спрятано в одной клавише. Если вы стёрли длинный запрос по Ctrl+C, нажмите стрелку вверх в пустой строке, и черновик вернётся вместе со вставленным текстом и картинками. Так сказано в списке изменений релиза на Github, и там же, через несколько строк, закрыта куда более серьёзная дыра в проверке опасного rm.
Коротко
- В режиме bypassPermissions или под разрешающим правилом для shell опасный rm на / или домашнюю папку внутри bash -c или sh -c запускался без вопроса, а в 2.1.288 перед ним появится запрос.
- /code-review принимает флаг --max-findings с числом или all и запоминает выбор до --max-findings default, а MCP-сервер, которому посреди вызова не хватило прав OAuth, вызовет запрос на повторную авторизацию.
- Цена мелкая: первый запрос в новом окружении или после смены модели может подождать до 1,5 секунды, пока Claude Code получает серверные значения лимита вывода и окна автокомпакции.
Если вы не следили: по данным Truefoundry, в декабре 2025 года пользователь попросил Claude Code почистить пакеты в старом репозитории и получил команду rm -rf tests/ patches/ plan/ ~/. Хвостовой ~/ оболочка развернула в домашнюю папку целиком, с файлами рабочего стола, паролями Keychain и данными приложений. Там же пишут, что историю подхватил Simon Willison, а пост на Hacker News набрал 197 баллов и больше 156 комментариев.
Опасный rm внутри bash -c в bypassPermissions запускался без вопроса
Запись в списке изменений короткая: rm на / или на домашнюю папку внутри скрипта bash -c или sh -c выполнялся без подтверждения в режиме bypassPermissions или под разрешающим правилом для shell. Исправление привязано к issue #96300. Снаружи такая команда выглядит как обычный вызов оболочки, а разрушительная часть сидит в строке аргумента.
Рядом закрыты ещё две щели в проверке Bash. Присваивание BASHPID, значение которого оболочка вычислила бы как арифметику, раньше проходило молча, сейчас перед ним появляется запрос. Хуки PreToolUse и PermissionRequest пропускались, если их сопоставление падало или вход инструмента не удавалось сериализовать в JSON; в 2.1.288 такой вызов блокируется.
Есть и одно послабление. Heredoc без кавычек вокруг разделителя, например python3 <<EOF, в песочнице с auto-allow просил одобрения на каждом запуске, даже когда в теле был только обычный текст и простые ссылки $VAR. Такие запуски проходят без лишних вопросов.
Как устроена проверка, мимо которой прошёл rm
По данным Codepointer, каждый вызов инструмента идёт через конвейер правил: внутренняя функция hasPermissionsToUseToolInner() выносит вердикт allow, deny или ask, а внешняя hasPermissionsToUseTool() разрешает его с учётом контекста. Правила deny проверяются раньше режима, поэтому срабатывают даже в bypassPermissions. Там же пишут, что пути вроде .git/ и .bashrc требуют подтверждения и с --dangerously-skip-permissions: изменённый .bashrc выполнится при следующем открытии оболочки.
Самым сложным случаем Codepointer называет Bash: у каждого инструмента своя checkPermissions(), и для Bash она разбирает команду в синтаксическое дерево в поисках инъекций. Представьте охранника, который проверяет сумку, но не вскрывает запечатанную коробку внутри неё; bash -c и есть такая коробка, где настоящая команда лежит строкой. Сам режим обхода Truefoundry объясняет усталостью от подтверждений: рефакторинг десяти файлов даёт больше 30 запросов, и их одобряют не читая.
Неинтерактивные сессии и сабагенты продолжают ответ после таймаута API
Таймаут API посреди ответа раньше проваливал весь ход. В 2.1.288 неинтерактивные сессии и сабагенты продолжают с частичного ответа, а ответы, где была только фаза размышления, отправляются повторно. Длинные разговоры падали с ошибкой «Prompt is too long» вместо автокомпакции, если последний ответ сообщил нулевой расход токенов; это тоже исправлено.
Отдельный блок касается --resume. Возобновление иногда теряло файлы и контекст, которые компакция только что вернула, не сохраняло последний ответ хода, читало обрезанный транскрипт, если сессия переписывала файл во время загрузки, и выбрасывало прежние размышления модели в разговорах, начатых на 2.1.286 или раньше. В issue на GitHub против версии 2.1.153 описан похожий сбой: пустые блоки размышлений с сохранённой подписью навсегда ломали возобновление ошибкой 400.
Для автономных запусков с CLAUDE_CODE_RETRY_WATCHDOG закрыт сценарий, когда после сбоя очень длинного стрима повторы шли часами: Claude Code стримит заново и сдаётся после трёх таймаутов. Лимит времени фоновых команд действует только в unattended-сессиях (-p, Agent SDK, CI, облако), в терминале, десктопном приложении и VS Code его нет.
Ответ MCP-сервера больше 16 МБ мог запустить инструмент дважды
Вызовы MCP-инструментов иногда выполнялись дважды, если результат удалённого сервера был больше 16 МБ или не разбирался. Если MCP-сервер посреди вызова просит расширить OAuth-права, Claude Code предложит авторизоваться заново. URL-запросы от серверов, которые не умеют сообщать о завершении, ждут кнопки «I'm done, continue», чтобы вы успели закончить в браузере.
Запросы к LSP висели бесконечно, если языковой сервер использовал динамическую регистрацию возможностей или переставал отвечать; сейчас они обрываются через 60 секунд, а requestTimeout задаётся для каждого сервера. /code-review получил --max-findings с числом или all, и выбор держится, пока вы не передадите --max-findings default. По данным Claude-world, MCP OAuth чинили и раньше: в v2.1.74 от 12 марта 2026 года исправляли зависания и обработку refresh-токенов.
В заметках не сказано, с какой версии rm внутри bash -c проходил без подтверждения и задело ли это кого-то на практике. Задержка до 1,5 секунды на первом запросе в новом окружении или после смены модели кажется мелочью, но в CI окружение каждый раз свежее, и платить её, вероятно, придётся на каждом прогоне. На наш взгляд, страннее всего молчаливая подмена: клиентский классификатор auto mode игнорирует закреплённые в ANTHROPIC_DEFAULT_SONNET_MODEL Sonnet 5.5 и Opus 5.5 и берёт Claude Sonnet 5, причину заметки не объясняют.
Когда исчезнет claude project purge
Команда claude project purge переименована в claude purge. Старое имя пока работает и печатает уведомление, но срок, после которого его уберут, в заметках не назван, так что скрипты лучше поправить заранее. После обновления стоит заглянуть и в /autocompact: окно автокомпакции хранится отдельно для каждой модели, и при переключении каждая модель сохраняет свою настройку.
Читайте также
- На модах Claude Code Anthropic собрала /diff и AGENTS.md
- Claude Code 2.1.286 считает стопку запросов на разрешение
- Claude Code научился собирать тесты для ваших приложений
- В проекте без CLAUDE.md Claude Code 2.1.277 читает AGENTS.md
- Шлюз узнает, какой агент Claude Code прислал запрос
- Плагины Claude Code теперь можно прогнать через тесты
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
