Владелец теряет время не на сам обход, а на то, что узнаёт о слетевшем патче случайно, по невнятному отказу посреди работы. Установлено ревьюером: строки отказа в бинарнике нет — её присылает сервер, но отказывается работать клиент. Прокси не помогает, измерено на двух странах: ограничение привязано к аккаунту. Патчер владельца правит четыре байта машинного кода, подменять в настройках нечего. Хаб только читает и сообщает; действие остаётся за владельцем и выполняется его собственным средством. Патчить чужой бинарник хабу запрещено отдельным пунктом. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
12 KiB
Задание A58: хаб видит состояние проверки доступности agy
Дата поступления
2026-09-02
База
origin/main (e431e39).
git fetch origin --prune
git checkout -b antigravity/a58-agy-eligibility-state origin/main
В main напрямую не пушить.
Порядок исполнения
Два прохода: Flash реализует, Pro проводит аудит. Пункт P0-7 написан для аудитора.
Зона: обнаружение состояния agy. С кодом входа (A57) пересекается только чтением пути к исполняемому файлу.
Задача
Владелец не может пользоваться Antigravity: agy отвечает
Eligibility check failed: Your current account is not eligible for Antigravity,
because it is not currently available in your location.
Вход при этом проходит полностью: терминал открывается, каталог профиля верный, аккаунт опознан. Отказывает Google.
Владелец обходит это сторонним патчером, который держит у себя. После каждого обновления agy патч слетает, и владелец узнаёт об этом, только наткнувшись на отказ посреди работы. Задание закрывает именно это: хаб должен замечать смену состояния и говорить о ней, а не оставлять владельца выяснять причину заново.
Что проверено ревьюером — заново не выяснять
Проверка не в клиенте, но отказ выносит клиент
В бинарнике agy нет строки «not currently available in your location» — её присылает сервер. При этом есть перечисление EPD_ELIGIBILITY_NOT_ELIGIBLE_REGION_OUT_OF_SCOPE, ENDPOINT_AIM_ELIGIBILITY и AIM_ELIGIBILITY_FETCH_STATUS_*: клиент запрашивает право доступа у Google и отказывается работать сам.
Прокси не помогает — ограничение привязано к аккаунту
Измерено на сервере владельца: выход через Финляндию и через Данию даёт один и тот же отказ. Описание патчера это подтверждает — он снимает ограничение «без VPN и смены региона аккаунта Google», то есть обычные пути именно эти два.
Поддержку прокси, добавленную в fa7bbef, не удалять: она нужна и работает, просто эту задачу не решает.
Что делает патчер
Для CLI это правка машинного кода, а не настройка. Ищется последовательность байтов и переписывается так, чтобы ветвление всегда уходило по разрешённому пути:
было: test rax,rax ; je eligible ; cmp byte[rax+8],0 ; jne eligible ; call failure
стало: test rax,rax ; je eligible ; test rax,rax ; nop ; jne eligible
Четыре байта. В исходнике патчера это названо «единственный гейт начальной проверки». Есть подписи для x86-64 и для arm64.
Подменять в настройках нечего: проверка не в настройках.
Версии
У владельца Antigravity CLI 1.1.23. Патчер объявляет минимальные версии 2.5.5 и 2.9.1 — соответствие надо проверить, иначе подпись не найдётся. Обновление CLI выполняется командой agy update и перезаписывает файл, снимая патч.
P0-1. Хаб не патчит ничего сам
- Хаб не изменяет исполняемые файлы. Ни при каких условиях, ни по кнопке, ни автоматически.
- Хаб ничего не скачивает и не запускает из сети. Стороннего кода в хабе нет.
- Только чтение: состояние определяется чтением файла, который уже лежит на машине.
P0-2. Состояние определяется и показывается
- Признак патча — по наличию в файле изменённой последовательности байтов. Подписи для x86-64 и arm64. Чтение файла, ничего больше.
- Три состояния, а не два: «проверка снята», «проверка на месте», «определить не удалось» — с причиной. Не найдена подпись ни в исходном, ни в изменённом виде означает именно третье: другая версия CLI, а не «не пропатчен».
- Версия и отпечаток файла запоминаются. Смена любого из них после обновления — повод пересчитать состояние и сказать владельцу.
- Показывать в карточке аккаунта Antigravity и в «Состоянии системы».
P0-3. Владелец узнаёт о смене состояния
- Событие в журнале, когда состояние сменилось: было «снята» — стало «на месте».
- Заметное указание в интерфейсе, а не строчка в глубине: этот отказ останавливает работу целиком.
- Не опрашивать в цикле. Достаточно проверки при запуске, после обновления
agyи по кнопке. Опрос в цикле уже приводил к тому, что интерфейс сам себя кормил запросами.
P0-4. Кнопка запускает то, что владелец сам поставил
- Путь к сценарию владельца задаётся в настройках. Умолчания не выдумывать: не задан — кнопки нет, показывается
Н/Д: сценарий не указан. - Запуск только по нажатию. Никакого автоматического запуска при обновлении: владелец должен видеть, что и когда выполняется.
- Запуск в терминале, как вход в A57 — владелец видит ход и результат. Использовать существующий
find_terminal_emulator, заново не писать. - После выполнения состояние пересчитывается и показывается новое.
- Отказ запуска доходит текстом, с указанием пути и причины.
P0-5. Обновление CLI
- Показывать установленную версию
agy. Не удалось определить —Н/Дс причиной. - Кнопка обновления выполняет
agy updateв терминале. - Предупредить о порядке: обновление перезаписывает файл и снимает патч, поэтому сначала обновление, потом патч. Это подсказка в интерфейсе, а не комментарий в коде.
P0-6. Проверка исполнением
- Определить состояние на настоящем
agyвладельца и приложить вывод. - Проверить все три состояния, третье — на файле другой версии.
- Проверить, что хаб файл не изменил: контрольная сумма до и после определения состояния совпадает.
- Проверить кнопку на незаданном пути и на неверном.
P0-7. Аудит вторым проходом
- Убедиться, что хаб не пишет в исполняемый файл ни на одном пути.
- Проверить, что «определить не удалось» не выдаётся за «не пропатчен» — это разные вещи, и путать их нельзя.
- Проверить, что нет опроса в цикле.
- Побочные изменения объяснить.
- Пропущенный пункт назвать пропущенным.
Ограничения
- Хаб не изменяет чужие исполняемые файлы и не выполняет загруженный из сети код.
- Поддержку прокси из
fa7bbefне удалять. - Правки ревьюера из
mainне откатывать. - Фронтенд без npm, без сборки, без фреймворков — по
docs/web-api/CONTRACT.md§1. - Пути и версии в код не зашивать: определять и сообщать, что проверяли.
- Версию
0.1.3не понижать. - Правило честности без исключений: неопределённое —
Н/Дс причиной.
Критерии приёмки
- Ветка в
origin,git statusчист. - Состояние проверки определяется на настоящем
agy; вывод приложен. - Три состояния различаются; «определить не удалось» называет причину.
- Контрольная сумма исполняемого файла до и после определения совпадает.
- Смена состояния после обновления
agyпопадает в журнал и видна в интерфейсе. - Кнопка запускает указанный владельцем сценарий в терминале; путь не задан — кнопки нет.
- Показывается версия
agy; есть кнопкаagy updateс предупреждением о порядке. - Опроса в цикле нет.
ruff check .чисто; релизный гейт 10/10; тестов не меньше 704.- Отчёт:
START_HEAD,FINAL_HEAD,origin/main,git status,X passed / Y skipped / Z failed.
Главное
Владелец теряет время не на сам обход, а на то, что узнаёт о слетевшем патче случайно — посреди работы, по невнятному отказу. Хаб для того и нужен, чтобы состояние было видно заранее.
Поэтому хаб смотрит и говорит, а действие остаётся за владельцем и выполняется его собственным средством. Патчить чужой бинарник самому хабу нельзя: подпись привязана к версии, любое обновление её ломает, и отлаживать пришлось бы чужой код внутри своего.
Порядок сдачи
Передать точный FINAL_COMMIT_SHA.