EN

Quote Guard: FSM на PreToolUse ловит незакрытую кавычку до зависания Bash

Опубликовано: 2026-10-29 · Автор: AI Release · @ai_release1 · Tech · Релиз / Официально
Quote Guard: FSM на PreToolUse ловит незакрытую кавычку до зависания Bash

⚡ Главное за 5 секунд

🔍 Что случилось

Инженер под ником SkyAngels20 разобрал на Хабре кейс: LLM-агент собирает команду для терминала, теряет закрывающую кавычку — и рантайм встаёт. Bash, а по словам автора и PowerShell, решает, что ввод многострочный, печатает >> и ждёт закрывающую кавычку из stdin. Агент читает процесс синхронно через пайп, EOF не приходит, таймаут сессии выгорает, процесс падает.

Решение автор назвал Quote Guard. Это конечный автомат на хуке PreToolUse: строка проверяется до того, как уйдёт в ОС. Лексер ведёт её через состояния NORMAL, IN_DOUBLE_QUOTES, IN_SINGLE_QUOTES, ESCAPE и держит три изолированные грамматики — posix, powershell, cmd. Регулярки выброшены.

Почему не считать кавычки через count % 2 == 0? Автор показывает матрицу изоморфности. Строка dir "C:\" в PowerShell безопасна: обратный слэш там обычный разделитель пути. В Bash тот же \ экранирует закрывающую кавычку — и шелл ждёт вечно. Второй пример: echo "a"b"` — в PowerShell бэктик экранирует, в Bash запускает command substitution. Угадывать шелл по хостовой ОС бесполезно: в контейнерах Windows крутится Bash, в WSL — PowerShell.

Для неизвестных инструментов автор сделал Strict Intersect, «двойной замок». Команда гоняется сразу по posix и powershell. safe + safe — пропуск, unsafe + unsafe — блок. Расхождение — самый интересный случай: Exit 2 и машиночитаемая подсказка модели вроде [quote-guard BLOCKED]:... Строка безопасна в PowerShell, но вешает POSIX. Лечение: задайте QUOTE_GUARD_MAP=MyTool=powershell. Отдельно автор рассказывает, как закрыл дыру с heredoc, которая молча пропускала незакрытые кавычки, и зачем 122 состязательных теста на Python и Node.js.

🧠 Наш разбор

Агенты всё чаще дёргают терминал сами, а не сидят в чате. Пока агент один и под присмотром, зависание — досада. Когда их десяток в CI, это уже простой. Наша оценка: новость не про кавычки, а про то, что доверие к выводу модели переезжает из промпта в инфраструктуру, в хук перед исполнением. Просьба «пожалуйста, проверяй кавычки» гарантий не даёт. Автомат даёт.

Для тех, кто строит агентов, это готовый паттерн: валидировать не текст, а грамматику целевой среды. И отказывать структурированно, чтобы модель исправилась со второй попытки. Мы считаем, что главное здесь — формат ошибки. Не «invalid input», а инструкция с переменной окружения, которую агент реально прочитает.

Выигрывают те, кто катит агентов в прод. Проигрывают наивные валидаторы на регулярках: их либо обходят ложным срабатыванием, либо они не ловят настоящий дедлок. Логика автора проста — инженер отключает защиту после первого false positive. Это и есть цена плохой проверки.

⚠️ Чего мы не знаем

В поводе нет ссылки на репозиторий — только описание архитектуры. Нет цифр по накладным расходам лексера, нет данных, как часто агенты реально теряют кавычки в проде. Утверждение, что PowerShell тоже уходит в многострочный режим, я бы проверил руками: поведение зависит от версии и режима запуска. И это один голос, кейс из песочницы, а не независимая проверка.

💬 О чём спорить

  • Чинить это хуком перед запуском или внутри самого шелла — обёрткой с таймаутом и принудительным EOF?
  • Блокировать команду, которая безопасна в PowerShell, но вешает POSIX, или отдавать решение человеку?
  • 122 состязательных теста — достаточная гарантия для предохранителя, который стоит на пути у всех команд агента?

Прогноз: в течение квартала похожие грамматические валидаторы появятся в готовых агентных фреймворках — при условии, что кейс подхватят и откроют код.

Дисклеймер: официально не подтверждено, один источник — разбор инженера на Хабре, независимых проверок нет.

Источник: Хабр

🤖 Кратко для ИИ
#AI-агенты#Bash#FSM#безопасность#AI#ClaudeCode#DevTools#разработка
← ПредыдущаяClaude Code сливает 16% токенов на строку статуса: как это выключить

Источник: habr.com · пост в Telegram