0.134.64

Fixed

  • Sandbox WARN для sandbox="none": при явном отключении sandbox через БД (permissions.exec.sandbox = "none") runner нормализует значение в security.SandboxNone (пустая строка). Раньше строка "none" напрямую кастилась в SandboxBackend и попадала в default-ветку WrapCommand, что приводило к спаму WARN: security: unknown sandbox backend, command runs unsandboxed, backend:"none" в логах. Команда при этом выполнялась unsandboxed, но лог вводил в заблуждение. Теперь WARN не пишется, поведение в system info / tool description не меняется (Sandbox=none).
  • Ложное срабатывание ExecGuard на rm -rf в пользовательских директориях: жадная регулярка (?i)\brm\s+-[rf]{1,2}\b.*\s*/ ловила ЛЮБОЕ появление rm -r[f], после которого где угодно в строке через &&/pipe шёл слэш. Например, легитимная команда rm -rf ~/.gitea-mcp && /Users/.../gitea-mcp блокировалась как «dangerous operation». Заменено на точную регулярку (?i)\brm\s+-(?:rf|fr|r|f)\s+/, которая блокирует ТОЛЬКО root-anchored пути (rm -rf /, rm -rf /*, rm -rf /etc/..., rm -rf /home/..., rm -r /, rm -f /, rm -fr /), а rm -rf ~/.cache && /usr/bin/foo и аналогичные легитимные команды проходят.
  • Текст ошибки ExecGuard уточнён: вместо абстрактного Error: Command blocked by safety filter (dangerous operation) теперь возвращается понятное для LLM сообщение, явно отличающее ExecGuard от sandbox. Раньше LLM-агенты атрибутировали блокировку к sandbox, что приводило к неверным выводам в финальных отчётах (например, «smoke-test заблокирован sandbox-фильтром» в задаче #144).

Tests

  • Добавлены TestExecGuard_RmRf_BlocksRootAnchoredPaths и TestExecGuard_RmRf_AllowsChainedUserDir — точная репродукция бага из agent 1 (2026-06-07), а также расширенное покрытие для root-anchored и пользовательских путей.
  • Добавлен TestExecGuard_RmRf_SSHSmokeTestRegression — точная команда из продакшн-инцидента с включённым SSH, проверяющая, что после фикса полный пайплайн (SSH → rm -rf в ~/.gitea-mcp → запуск бинарника) проходит.