Sphinx — проверка понимания кода перед push
📂 Исходный код на GitHubSphinx добавляет проверку понимания к работе с ИИ-агентами: перед push в защищённую ветку git ждёт, пока вы ответите на вопросы о своём же изменении. Вопросы задаёт отдельная модель-рецензент, которая видит только коммит и не видит переписку с агентом.
Sphinx — это Node.js-инструмент, который превращает push в защищённую ветку в короткий экзамен. Когда вы отправляете изменения в main или master, git останавливается и ждёт. Вам показывают вопросы о том, что именно делает ваш код. Вы отвечаете, и только после правильного ответа push продолжается.
Главная идея проекта записана в его слогане: отдавайте агенту мышление, но не понимание. Если код пишет ИИ-агент, у вас нет обычного ревью, на которое можно опереться. Ревьюер смотрит на диффы и ловит стиль, но не проверяет, понимаете ли вы логику. Sphinx закрывает именно эту дыру.
Как это работает
Вопросы задаёт отдельная модель-рецензент. Она читает сделанный коммит через инструменты Git только для чтения. Переписку, в которой код писался, она не видит вообще. Это принципиально: агент не может подсказать вам ответ, потому что он не участвует в проверке.
Вот как выглядит типичный обмен для изменения, которое добавляет очередь фоновых задач:
Вопрос. Воркер фиксирует операцию, но падает до того, как подтвердит задачу. После повторной доставки может ли операция выполниться дважды? Ответьте коротко.
Ваш ответ. Нет, задача помечается выполненной в момент фиксации операции.
Sphinx. Не совсем. Задача помечается выполненной только при подтверждении, а оно происходит после фиксации. Падение между этими двумя шагами оставляет задачу неподтверждённой, поэтому очередь доставит её снова, и операция выполнится второй раз.
Новый сценарий. Воркер завис дольше таймаута видимости, и ту же задачу получил второй воркер. Оба зафиксировали операцию до того, как кто-то подтвердил. Что мешает дубликату, если вообще что-то мешает?
Вопросы касаются поведения, отказов и инвариантов, а не имён файлов и функций. Проверка открытая: во время ответа можно читать код или попросить агента показать нужное место.
Что нужно до установки
Автор честно перечисляет ограничения, и их стоит прочитать до установки.
- Требования. Node.js 22.19 или новее, git и macOS, Linux или WSL. Нативный Windows пока не поддерживается.
- Настройка действует на всю машину.
sphinx installпрописывает глобальную настройку gitcore.hooksPath. Ваши собственные хуки продолжают выполняться первыми. Сразу после установки проверяются пуши вmainилиmasterв любом репозитории. Дальшеsphinx initпозволяет настроить каждый репозиторий отдельно. - Git блокируется. Подходящий push ждёт, пока вы пройдёте проверку, поставите её на паузу или пропустите. Максимум — 25 минут. Оболочка вашего кодинг-агента может завершиться раньше.
- Нужен доступ к модели-рецензенту. Это может быть авторизованный Codex или Claude Code CLI, который тратит лимит вашего тарифа. Также подходит ключ OpenRouter (он оплачивается отдельно и нужен даже для бесплатных моделей) или любой OpenAI-совместимый адрес. У самого Sphinx нет ни аккаунта, ни своего сервиса.
- Код покидает вашу машину. Провайдер рецензента получает изменённый код, ваши ответы и файл
.sphinxcontext.md. Файлы из списка игнора не читаются,.env, приватные ключи и распространённые файлы с секретами исключены по умолчанию. Свои чувствительные пути нужно добавить в.sphinxignoreдо первой проверки. Правила игнора смотрят только на путь файла. Поэтому секрет, вставленный в обычный исходник, они не поймают. - Потолка на число вызовов модели нет. Типичная проверка делает примерно 5–8 запросов плюс около одного на каждый ответ. Потолок можно задать, а для платных провайдеров лимиты расходов лучше выставить у самого провайдера.
- Это практика, а не защита. Любой, у кого есть локальный доступ, включая кодинг-агента, может обойти хуки. Успешная проверка не доказывает, кто написал код. Экзаменатор — это тоже LLM, и он может ошибиться.
Быстрый старт
Установка глобальная:
npm install -g sphinx-understand
sphinx install
Мастер спрашивает, какими агентами вы пользуетесь и какую модель взять рецензентом. Дальше он предлагает готовые наборы проверок (пуши в main или master на стандартной глубине) или пункт Customize, где выбираются события, ветки, удалённые репозитории и глубина. Без вопросов:
sphinx install --yes --preset claude-economy --agents claude
Затем Sphinx нужно подключить в вашем агенте, если вы им пользуетесь. Для Codex нужно открыть /hooks и доверять хукам — сделать это за вас Sphinx не может. Для Claude Code достаточно начать новую сессию: в /mcp должен появиться подключённый sphinx. Для Pi, Cursor и OpenCode есть отдельные заметки в документации по интеграциям.
Дальше настройка репозитория:
cd your-repo
sphinx init
Команда создаёт три файла и не перезаписывает существующие:
.sphinxconfig— политика репозитория..sphinxignore— пути, которые никогда не читаются. Отредактируйте его сразу, если в проекте есть приватные или генерируемые файлы..sphinxcontext.md— короткое описание того, что делает проект. Его получают все запросы рецензенту. Секретов там быть не должно.
Проверка установки:
sphinx doctor
В конце должно быть ✓ Configured integrations are in place.
И первый push:
git push origin main
Git печатает адрес локальной страницы и ждёт:
Sphinx: understanding check needed for refs/heads/main (medium change).
Sphinx: Git is waiting for your answers in the local Sphinx questionnaire.
Sphinx questionnaire: http://127.0.0.1:56114/fSdZM7yg…
На macOS страница открывается фоновой вкладкой, ваше рабочее окно остаётся на месте. На Linux, WSL и по SSH git вместо этого печатает open the local URL above to answer, и адрес нужно открыть вручную. На странице видно, как идёт работа рецензента, какие файлы изменились, сколько строк добавлено и удалено, сам дифф и места в коде, которые рецензент прочитал для конкретного вопроса. После правильного ответа:
Sphinx: understanding check complete. Continuing this Git operation.
To github.com:you/your-repo.git
* [new branch] main -> main
Повторный push того же изменения вопросов не задаёт. Результат держится 24 часа, если не поменялись код, адрес назначения или политика.
Во время проверки
- Неверный ответ. Вы получаете объяснение и новый сценарий по той же теме. Спорные и ошибочные ответы зачтёнными не считаются.
- Объяснить. Показывает суть и задаёт новый вопрос.
- Оспорить вопрос. Нужно, если в вопросе неверная или неоднозначная посылка. Плохой вопрос исправляется до того, как тема будет засчитана.
- Пауза. Сохраняет прогресс и останавливает push. Позже тот же
git pushпродолжит с того места. - Закрытие вкладки ничего не отменяет. Git продолжает ждать, адрес работает до истечения 25 минут.
- Пропустить. Пуск происходит сразу, даже пока рецензирование ещё идёт. Пропуски зачтёнными не считаются.
sphinx yolo. Отключает проверки в текущем репозитории, а если запустить вне репозитория — глобально. Повторный запуск включает обратно. Настройка репозитория сильнее глобальной. Флаг--reason "prod hotfix"необязателен.sphinx check. Прогоняет ту же проверку в терминале, без браузера.
Ваши ответы идут со страницы прямо в Sphinx. Ваш кодинг-агент видит только статус проверки, прогресс и расход, но никогда — сами ответы. Каждый пропуск и каждое переключение yolo пишутся в журнал вместе с причиной, sphinx status показывает последние.
Стоимость
Число вопросов зависит от размера изменения и выбранной глубины. На стандартной глубине маленькое изменение получит один вопрос, а большое — до трёх. После коммитов Sphinx готовит вопросы в фоне, так что к моменту push они часто уже готовы. Сколько вызовов модели, токенов и денег потрачено, видно прямо на странице.
sphinx config --max-model-calls 30 # необязательный потолок на проверку (1–100)
sphinx config --preset openrouter-value --allow-paid
Размер изменения определяется детерминированно, без запросов к модели: считаются добавленные и удалённые строки, число файлов и подозрительные пути. Путь считается подозрительным, если содержит auth, permission, migration, billing, payment, crypto, security или terraform. Даже крошечный патч с таким путём будет отнесён к большому изменению.
| Размер | relaxed |
standard |
thorough |
|---|---|---|---|
| Малый | 1 | 1 | 1 |
| Средний | до 2 | до 2 | до 3 |
| Большой | до 2 | до 3 | до 5 |
Глубина задаётся в .sphinxconfig и отвечает за характер вопросов. На relaxed рецензент спрашивает про наблюдаемое поведение и самый важный крайний случай. На standard — про поведение, отказы и взаимодействие с другими частями системы. На thorough добавляются допущения о выкатке, откате и совместимости.
Это верхние границы, а не квота. Если код не даёт материала на пять разных вопросов, рецензент не будет их выдумывать.
Команды
| Команда | Для чего |
|---|---|
install |
Настроить глобальные хуки git и интеграции с агентами |
init |
Создать файлы политики, игнора и контекста репозитория |
doctor |
Проверить, что хуки и интеграции на месте |
status |
Показать политику репозитория, незаконченные проверки и пропуски |
check |
Начать или продолжить проверку в терминале (--staged для коммитов) |
pending |
Список незаконченных проверок |
yolo |
Переключить отключение проверок |
config |
Сменить модели-рецензенты и лимиты |
auth |
Сохранить ключ OpenRouter или OpenAI-совместимый адрес |
prepare |
Запустить фоновую подготовку (--retry после сбоя) |
activate |
Открыть настроенных агентов без переустановки |
uninstall |
Убрать интеграции Sphinx, не трогая чужие настройки |
У каждой команды есть своя справка: sphinx <command> --help. Флаг --json даёт машинный вывод, NO_COLOR=1 отключает цвет.
Чего Sphinx не делает
Версия 0.1 проверяет только локальные коммиты и пуши. Веб-слияния, обязательные CI-проверки и деплои не охвачены. Содержимое бинарных файлов не читается. Инструмент проверяет понимание, а не качество кода. Результаты оценки качества собраны на синтетических изменениях и не являются сертификатом для произвольных репозиториев.
Проект распространяется под лицензией MIT. Требования, архитектура и приёмы работы описаны подробнее в документации по архитектуре, а цена и лимиты моделей — в разделе про конфигурацию.
Источник: https://github.com/parthh01/sphinx