Всё ниже собрано при сборке этой обвязки - часть выловлена своими тестами, часть найдена в чужих багрепортах до того, как мы на них наступили. Порядок - по тому, сколько времени съедает, если не знать.
codex exec виснет навсегда, если stdin - пайп без писателя. Ни логов, ни кода
возврата, ни таймаута - тишина. Автор багрепорта отдельно отмечает, что «обычные меры -
таймауты и ретраи - делают симптом хуже». Лечится одним символом:
codex exec "..." < /dev/null--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-ключ.
Файловая граница не спасает от утечки, пока открыта сеть. Поэтому секреты стоит закрывать и от чтения тоже, а не только от записи.
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. Не трать время на попытки авторизоваться.
Пустые массивы под 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 секунды до первого токена. Для фоновой проверки - лучший выбор, для интерактивной работы - худший.
Уровень усилия двигает качество сильнее, чем выбор модели. Разброс внутри одной модели по уровням усилия бывает больше, чем разница между моделями. Прежде чем менять исполнителя - подними усилие.