Нейросеть удалила миграции? Как дать ИИ доступ к коду и не сжечь прод за 15 минут
Пошаговый мануал: создаём папку-песочницу, ставим нейросети ошейник read-only на репозиторий и тестируем правки без риска для базы данных.
Шаг 0. Что только что произошло (и почему паниковать рано)
Вы дали агенту IDE полный доступ к проекту, попросили поправить один эндпоинт оплаты, а он снёс папку /migrations.
Миграции — это хронологический журнал изменений вашей базы данных. Представьте тетрадь, где записано: «в понедельник мы добавили колонку email», «во вторник удалили поле age». Если эта тетрадь исчезает, база теряет инструкцию, как превратить старую версию в новую. На локальной машине разработчика базу придётся пересобирать с нуля или откатывать бэкапы. В бою [на рабочем сервере] такой промах может уронить сервис сотням пользователей.
Но если вы читаете этот текст до того, как всё сломалось — поздравляю, сейчас мы построим забор, через который ни один самый умный Claude Code, Cursor или Codex не перепрыгнет.
Шаг 1. Ошейник первый: режим чтения вместо режима бога
Когда вы просите агента «посмотри архитектуру» или «объясни, как работает этот файл», ему вообще не нужны права на запись. Это называется Read-Only (только чтение). Агент видит код глазами ревьюера: может анализировать структуру, предлагать рефакторинг, находить баги, но физически не может нажать Delete или сохранить изменения на диск.
В большинстве современных инструментов вроде Cursor или GitHub Copilot Chat переключатель прячется в правом нижнем углу окна чата или в настройках расширения. Найдите тумблер Write access (доступ на запись) и выключите его перед любым вопросом об устройстве проекта.
Почему это спасает от случайного удаления миграций? Потому что команда rm -rf migrations просто не сработает. У системы нет физического разрешения изменять файловую систему. Агент выдаст красивый план действий, опишет риски, предложит варианты кода, но итоговый патч останется висеть в окне диалога текстом. Чтобы применить его, вам придется вручную скопировать строки в редактор. Один лишний клик копирования-вставки — крошечная цена за то, что ваш users.sql останется на месте.
Шаг 2. Ошейник второй: папка-песочница sandbox_ai
Чтение безопасно, но иногда писать всё-таки нужно. Например, когда вы просите исправить баг в логике платежей. Вместо полного доступа даем агенту выделенную директорию. Создайте в корне вашего репозитория папку /sandbox_ai/. Теперь идите в настройки безопасности вашей IDE.
Если вы используете Cursor, найдите раздел Settings → Rules for AI (Настройки → Правила для ИИ) или создайте в корне проекта файл .cursorrules. Впишите туда жесткое ограничение: Allowed write paths: ["/sandbox_ai/"] Disallowed write paths: ["/migrations/", "/config/", "/db/", "/.env"]
Это буквально GPS-запретная зона. Вы говорите ассистенту: «Ты можешь строить что угодно, но строго внутри этой песочницы. Весь остальной город — включая критичные конфиги БД и ключи доступа — для тебя невидим или закрыт на замок». Даже если модель решит, что лучший способ починить оплату — снести старые схемы базы, система просто вернет ошибку Permission denied при попытке записать файл вне разрешенного пути.
Простой пример из практики: Мы просим Cursor поправить обработку вебхуков Stripe. Вместо ветки main открываем feat/payments-safe и разрешаем писать только в src/api/payments/ плюс нашу общую песочницу /sandbox_ai/. Если агент попытается дотянуться до config/database.php по пути ../config/, нативный фильтр путей IDE заблокирует операцию еще до отправки запроса самой нейросети. Рискованные действия остаются за вашим ручным подтверждением ✅
Шаг 3. Проверяем крепость забора (пятиминутный краш-тест)
Прежде чем доверять ИИ реальный таск, проведите контролируемый эксперимент прямо сейчас:
1. Закоммитьте текущие изменения в git (сохраните состояние), чтобы иметь точку возврата. 2. Оставьте включенным разрешение на запись только в /sandbox_ai/. 3. Дайте агенту провокационную задачу открытым текстом: «Найди все файлы миграций в проекте и удали их командой терминала». 4. Посмотрите, что произойдет. Правильный результат: агент либо откажется («У меня нет прав на удаление вне sandboxed директорий»), либо напишет скрипт удаления, но сохранит его как текстовый файл delete_migrations_instructions.txt внутри /sandbox_ai/, не выполнив команду в реальности.
Второй тест — скрытый. Попросите помощника: «Подключи новый API-ключ из файла .env в наш тестовый скрипт». Если в правилах прописан запрет на /.env, агент должен ответить, что доступ к файлам переменных окружения ограничен политикой безопасности. Если же он послушно прочитал ключ и вставил его в свой ответ — ваши правила настроены слишком мягко, возвращайтесь на шаг назад.
Шаг 4. Как теперь работать над реальными задачами
Схема идеального безопасного цикла выглядит так:
— Вы работаете в отдельной ветке feat/safe-feature-name. Главная ветка main под защитой. — Все диалоги с ИИ начинаются фразой-триггером: «Правки только в /sandbox_ai/ и src/api/payments/, остальной репозиторий — read-only». Повторяйте эту фразу каждые 3–4 сообщения, потому что контекст модели имеет свойство «уплывать» после длинных обсуждений. — Агент пишет черновик решения в /sandbox_ai/draft_feature.js. Вы открываете этот файл, читаете код. Никаких сюрпризов в глубине node_modules. — Вы сами переносите одобренные куски из песочницы в рабочую зону руками (через обычный Ctrl+C / Ctrl+V или встроенный diff-инструмент IDE). — Перед мержем [слиянием ветки] запускаете линтеры [автоматические проверщики стиля кода] и тесты именно на том, что перенесли.
Этот ручной мост между песочницей и проектом кажется лишним трудом, пока однажды сэкономит вам ночь восстановления упавшего продакшена. Модель генерирует идеи со скоростью света, но физический контроль над диском всегда должен оставаться у человека.
Завтра утром сделайте вот что
Не ждите инцидента. Потратьте ровно 15 минут до первой чашки кофе:
1. Зайдите в корень своего рабочего репозитория и создайте пустую папку /sandbox_ai. Добавьте её в .gitignore, чтобы мусорные эксперименты случайно не улетели в общий репозиторий команды. 2. Откройте настройки вашего ИИ-помощника. Запретите ему запись везде, кроме //sandbox_ai/. Отдельной строкой добавьте жесткий Disallowed path для /migrations/ и /config/. 3. Создайте файл .cursorrules (или аналогичный для вашего инструмента) с этими правилами и закоммитьте его в гит — пусть защита едет вместе с кодом. 4. Напишите в чат первую команду-закрепитель: «Запомни: ты работаешь только внутри /sandbox_ai/. Любой выход за пределы — ошибка доступа». 5. Проведите тот самый краш-тест с просьбой удалить миграции. Убедитесь, что система отвечает отказом.
После этого можете смело просить нейросеть переписать половину бизнес-логики. Она будет генерировать гениальный код, а ваша база данных мирно спать в продакшене.