Разработчица создала Crossweft для проверки ИИ-агентов
Автор потратила более $9000 и миллиард токенов на ИИ-агентов, но столкнулась с рассогласованием слоёв защиты в приложении. В ответ она сделала Crossweft — инструмент проверки того, что агенты ломают между файлами.
Разработчица приложения для ретуши с плагином к Photoshop и локальной нейросетью потратила более $9 000 на подписки ИИ-агентов (по её оценке, свыше миллиарда токенов) в попытке выстроить безопасность продукта. Программа работала, но десять слоёв защиты — от шифрованного канала между плагином и системной службой до водяных знаков — не сходились между собой. Каждая граница между компонентами, написанными на C++ и Go и живущими в разных процессах, держится на договорённостях: одно имя службы, одна версия протокола, один набор маршрутов.
По словам автора, сейчас 54 связи на таких границах удерживают 188 сравнений значений (468 мест в коде) и 105 сравнений множеств. Компилятор не видит ни одного из них, поскольку стороны написаны на разных языках. Эти точки она называет швами — местами, где разные компоненты должны точно совпадать, но проверка обычно держится лишь на памяти разработчиков.
Показательны три случая. Имя службы определялось в трёх почти одинаковых функциях: исправление одной копии оставляло две сломанными, а на чистой машине установщик останавливался с кодом 76. Сборка брала библиотеку из одного каталога, а связанные инструменты — из другого, и конфигурация лишь предупреждала. Валидатор одного из правил безопасности из-за ошибки в пути несколько недель проверял ноль файлов и каждый раз сообщал OK.
Значительную часть кода пишут агенты, в основном Claude Code и Codex, и с межкомпонентными связями они справляются хуже людей. Типичный сценарий: агент меняет Go-структуру, тесты зелёные, он пишет «Готово» — и не открывает TypeScript-интерфейс на другой стороне. Причины — локальность правок, ограниченный контекст и узкое понимание «готово»: для агента это означает, что прошли все проверки, которые он видит.
Решением стал открытый плагин Crossweft для Claude Code и Codex. Связи описываются в JSON рядом с кодом: блоки — программы, сервисы, хранилища, конфиги — и связи между ними (HTTPS, named pipe, файлы, генерация кода, переменные окружения). Каждое утверждение карты привязано якорем к конкретному литералу в коде, поэтому при переезде кода карта не продолжает молча описывать прошлое, а проверка падает.
Сторожа намеренно простые — регулярные выражения и сравнение значений или множеств, проверка занимает миллисекунды и не требует сборки. Поддерживаются три вида: join (значение совпадает везде), set (совпадает состав, например поля TypeScript-интерфейса и JSON-теги Go-структуры) и pair (дублированная логика без единого значения, вроде округления цены на Go и TypeScript). Намеренные различия вносятся в allow с причиной, а ставшая ненужной запись allow сама роняет проверку.
Инструмент встраивается в цикл работы агента: в начале сессии он получает описание карты швов, после каждой правки — вторую сторону и сторожа, а перед завершением хук crossweft check не даёт закончить, если шов расходится. Репозиторий может добавлять свои виды проверок плагинами — у автора их 13, включая сверку 916 мест обращения Go-сервера к SQL со 161 таблицей и 276 триггерами схемы и проверку 185 маршрутов сервера. Плагин, который не импортировался, упал или ничего не сравнил, считается ошибкой, а не зелёным результатом.
Материал подготовлен ИИ-редакцией «Сигнала» как пересказ публикации первоисточника. Фактическую точность и подробности проверяйте по оригиналу.