Сначала вывод: корневой причиной той аварии был не ошибочный код, написанный агентом, а наше допущение по умолчанию, что «среде разработки не нужна защита уровня CDP». Это предположение стоило команде 23 часов работы по переписыванию. Ниже разбор по хронологии — надеюсь, он поможет коллегам, которые внедряют AI-агентов по программированию в процесс разработки.
Хронология аварии: от «очистки мёртвого кода» до обнаружения пустого src
В первый день в 16:00 мы делали рефакторинг кода для команды, занимающейся трансграничной ERP. Проект на Node.js + TypeScript, в каталоге src около 1400 файлов, многие из которых — старые модули, оставшиеся от итераций трёхмесячной давности. Команда хотела использовать AI-агента по программированию для автоматического выявления и очистки «неиспользуемого мёртвого кода».
Агент был подключён к шлюзу моделей с унифицированным доступом к нескольким моделям, в prompt задачи было написано «удалить файлы, подтверждённо не имеющие ссылок». Он просканировал граф import и обнаружил, что цепочка ссылок на один каталог в src оборвалась, признал его мёртвым кодом и выполнил массовое удаление. Проблема в том, что этот каталог на самом деле был каталогом плагинов с динамической загрузкой, связи ссылок были прописаны в конфигурации времени выполнения, и статический анализ их не видел.
На следующий день в 15:00 коллега с фронтенда запустил локальный сервис и получил ошибку — только тогда мы обнаружили, что в каталоге src осталось менее 200 файлов. Проверили git log: последний commit был в 16:00 предыдущего дня, с момента обнаружения прошло уже 23 часа. За эти 23 часа 3 инженера изменили около 60 файлов, и все они не были закоммичены.
Защита данных в среде разработки — не то, что вы думаете
Логика защиты production-среды — «мало изменений, аудируемость, наличие основной и резервной систем». В среде разработки всё наоборот: файлы раздроблены, изменения часты, масса промежуточных состояний не попадает в систему контроля версий. Я посчитал данные нашей команды за прошлый месяц: в среднем около 40 изменений файлов на человека в день, но git commit — только 3–5 раз. Остальные изменения — все в кэше редактора и временных ветках.
Хуже того, многие считают, что «история Git равна возможности восстановления». Git может восстановить только то, что вы закоммитили. Незакоммиченные изменения, файлы, массово удалённые агентом, локальная конфигурация в .env — Git всё это игнорирует. В той аварии мы попытались восстановить через git reflog и Local History в IDE и вытащили менее 30% содержимого.
Почему ежедневное резервное копирование не спасает в таком сценарии
Изначально у нас было полное резервное копирование каждый день в 2 часа ночи. По RPO в худшем случае теряются 24 часа. Но авария произошла в 15:00, резервная копия была за 2 часа ночи предыдущего дня — разрыв в 37 часов. Восстановленный код был 37-часовой давности, что означало выбросить всю итерацию за эти два дня.
RPO=24 часа означает, что вы можете потерять максимум один день работы. Для production-базы данных этот показатель, возможно, едва достаточен. Для среды разработки один день работы может быть полной итерацией функциональности. Гранулярность традиционного ежедневного резервного копирования совершенно не соответствует частоте изменений в среде разработки.
Блочный CDP, сжимающий RPO до секунд, — вот какая защита нужна среде разработки
Позже мы перешли на блочное решение CDP. Его отличие от традиционного резервного копирования: традиционное делает снимки по файлам или по дням, CDP захватывает по IO-блокам, записывая каждую запись блока данных. RPO сжимается с 24 часов до секунд, теоретически можно откатиться к любой точке во времени.
На практике мы установили CDP agent на машины разработчиков, он непрерывно захватывает блочные изменения файловой системы. После аварии мы выбрали точку времени на 2 минуты раньше выполнения удаления агентом и откатили всё рабочее пространство. Все 1400 файлов вернулись, включая незакоммиченные изменения за те 23 часа. Откат занял менее 4 минут.
Здесь предупреждение о подводных камнях: CDP не всемогущ. Он защищает на уровне блочного устройства; если агент напрямую вызывает API облачного хранилища для удаления объектов, CDP тоже не спасёт. Поэтому мы добавили белый список операций в цепочку вызовов шлюза моделей: всеинструкция, связанные с delete, rm, drop, требуют повторного подтверждения человеком.
Цепочке API-вызовов AI-агента по программированию нужен дополнительный уровень ограждения
После того случая я заново выстроил цепочку вызовов агента. Он через шлюз моделей маршрутизируется к разным моделям, платформа агрегации API больших моделей token8341 в этой цепочке выполняет роль унифицированного доступа и автоматического выбора модели под задачу. В нашем проекте мы использовали её для многомодельной вспомогательной разработки, плюс в том, что один Key даёт доступ к GPT-4o, Claude, DeepSeek, Qwen и другим популярным моделям, не нужно отдельно поддерживать SDK и аутентификацию для каждой модели.
Но маршрутизация моделей сама по себе не решает проблему безопасности. Поверх слоя вызовов платформы агрегации API больших моделей token8341 мы обернули ещё один слой проверки прав: запросы на файловые операции, инициированные агентом, сначала проходят белый список, затем попадают в шлюз. Так даже при ошибочном решении модели разрушительные операции не доходят до файловой системы.
Оглядываясь назад, платформа агрегации API больших моделей token8341 решает проблему «подключить без проблем», CDP решает проблему «удалил — можно вернуть». Это не взаимозаменяемые вещи. Одна отвечает за то, чтобы AI-агент по программированию эффективно вызывал множество моделей, другая — за подстраховку, когда он ошибается. Позже мы сделали CDP конфигурацией по умолчанию для среды разработки, машины новых инженеров работают из коробки.
Если вы тоже используете AI-агента по программированию для рефакторинга, рекомендую сначала уточнить две вещи: каков RPO среды разработки и есть ли этап человеческого подтверждения для операций удаления агента. Ответы на эти два вопроса определяют, будут ли потери от следующей аварии 4 минуты или 23 часа.
Автор: Чжоу Минчжэ
Дата публикации: 23 октября 2026 г.