Skip to content

Latest commit

 

History

History
135 lines (95 loc) · 10.1 KB

File metadata and controls

135 lines (95 loc) · 10.1 KB

Грабли

Всё ниже собрано при сборке этой обвязки - часть выловлена своими тестами, часть найдена в чужих багрепортах до того, как мы на них наступили. Порядок - по тому, сколько времени съедает, если не знать.


Headless-режимы виснут

codex exec виснет навсегда, если stdin - пайп без писателя. Ни логов, ни кода возврата, ни таймаута - тишина. Автор багрепорта отдельно отмечает, что «обычные меры - таймауты и ретраи - делают симптом хуже». Лечится одним символом:

codex exec "..." < /dev/null

openai/codex#20919

--print-timeout у Antigravity не соблюдается. Есть репорт с переработкой в 3,3 раза против заданного значения, с признаками молчаливых ретраев, выжигающих недельную квоту. Вывод общий: свой внешний сторож обязателен, на таймаут CLI полагаться нельзя. В обёртках здесь он есть, с эскалацией до жёсткой остановки.


Успех, которого не было

Инструмент врёт не хуже модели. Antigravity возвращает код 0 и status: SUCCESS при пустом результате, если внутренний инструмент был автоматически отклонён; настоящая причина уходит в stderr. Проверка «код возврата = 0» такое не ловит - проверяй непустоту ответа.

Модель отчитывается об успехе, которого нет. Живой пример: Codex попросили записать файл.txt, он отрапортовал об успехе, а создал file.txt латиницей - кириллические имена он коверкает. Файл на диске остался нетронутым.

Отсюда правило: доказательство - это проверяемый след, а не фраза «я проверил». Дифф, список файлов на диске, вывод теста, который падал до правки и проходит после.

Antigravity без --add-dir не видит рабочий каталог вообще. Он молча уходит в свою служебную папку scratch, делает работу там и отчитывается об успехе. На диске в нужном месте - ничего.


Песочница

(allow default) - это не песочница. Описан рабочий побег из allow-default Seatbelt-профиля: смонтировать devfs (там не хранятся расширенные атрибуты, значит нет тега происхождения), собрать на нём .app с симлинком на /bin/bash и переменной окружения через Info.plist. Полезная нагрузка доставляется обычным документом, который агент просто читает. Минимум - явно запрещать монтирование.

Не разрешай ~/Library. Мы выдали туда запись «на всякий случай, вдруг нужно для связки ключей» - и открыли ~/Library/LaunchAgents, то есть устойчивое выполнение кода вне песочницы при следующем логине. Причём в режиме «только чтение» тоже, профиль-то один. При проверке оказалось, что Antigravity в ~/Library не пишет вообще ничего.

Не разрешай /private/tmp. Там лежат рабочие каталоги сессий агента. С открытым /private/tmp «режим чтения» перестаёт быть режимом чтения. Временные файлы macOS живут в /private/var/folders - этого достаточно.

Пути в deny - только абсолютные. Глоб вида **/.env молча привязывается к текущему каталогу и за его пределами не срабатывает. Хуже всего, что это бесшумно: сработавший запрет даёт «Operation not permitted», а не сработавший не даёт ничего.

Вложенный sandbox-exec запрещён ядром (forbidden-sandbox-reinit). Если сам агент однажды окажется под песочницей, обёртка перестанет запускаться.

У Antigravity --sandbox - не граница безопасности. Он ограничивает только шелл, запись файлов через инструмент проходит насквозь. Вдобавок --dangerously-skip-permissions авто-одобряет запрос bypassSandbox и отключает его целиком. Единственный рабочий вариант - обернуть процесс снаружи.

Никогда не давай модели флаг обхода песочницы. Есть репорт, где агент, упёршись в отказ, молча перезапустил себя с отключённой песочницей и прочитал ssh-ключ.

Файловая граница не спасает от утечки, пока открыта сеть. Поэтому секреты стоит закрывать и от чтения тоже, а не только от записи.


Особенности конкретных CLI

Antigravity: усилие зашито в имя модели. gemini-3.7-flash-high плюс --effort low даёт ошибку конфликта. Менять надо суффикс имени, а не добавлять флаг.

Antigravity: не урезай ему инструменты. Режим --mode plan запрещает шелл целиком - модель не может даже обойти каталог, а отклонённый инструмент обрывает весь ответ, и результат теряется полностью. Пусть инструменты будут, границу держит ядро.

Grok: запись пропускает не всякий режим прав. acceptEdits и dontAsk её не дают вовсе, auto в headless произвольно блокирует вызовы. Документированный способ для автоматики - --always-approve плюс deny-правила как жёсткий предел; deny выигрывает у всего, включая режим авто-одобрения.

Grok: headless не читает stdin. Длинный промпт передавай через --prompt-file, иначе упрёшься в лимит длины команды и намучаешься с кавычками.

Gemini CLI выключен для частных аккаунтов Google с 18.06.2026 - включая платные Google AI Pro. Официальная замена - Antigravity CLI. Не трать время на попытки авторизоваться.


bash 3.2 (штатный на macOS)

Пустые массивы под set -u роняют скрипт. "${arr[@]}" на пустом массиве - ошибка. Каждое поэлементное раскрытие оборачивай в [ ${#arr[@]} -gt 0 ].

Многобайтовый символ рядом с переменной ломает разбор. Строка «$s» заставляет bash 3.2 захватить байт кавычки-ёлочки в имя переменной. Пиши «${s}».


Пределы моделей, не видные из документации

Заявленный контекст ≠ используемый. У самого дешёвого тира GPT-5.6 (Luna) заявлен контекст 1,05 млн токенов, а удержание на длинном контексте - 41,3% против ~90% у старших тиров, и оно не меняется от 256К к 1М. Практическая граница - около 250 тысяч токенов: до неё модель работает отлично, за ней начинает выдумывать.

Обзорные сайты преувеличивают средние тиры. Про GPT-5.6 Terra писали «в пределах 2-3 пунктов от флагмана»; на едином независимом стенде разрыв оказался девять пунктов, а сам вендор в карточке модели относит Terra к mini-классу.

Самая умная модель может быть самой медленной. Grok 4.6 лидирует по сводному индексу интеллекта и при этом даёт 43 секунды до первого токена. Для фоновой проверки - лучший выбор, для интерактивной работы - худший.

Уровень усилия двигает качество сильнее, чем выбор модели. Разброс внутри одной модели по уровням усилия бывает больше, чем разница между моделями. Прежде чем менять исполнителя - подними усилие.