aiedit прячет от ИИ-агента отдельные строки кода: 5 уровней и 857 тестов

Автор open-source редактора aiedit, который учит Python с сентября 2026 года, сделал настольную IDE на PySide6/PyQt6, где ИИ работает со всем проектом, но не видит закрытые участки кода. Скрыть можно не только файл, но и отдельные строки. Проверка выполняется кодом редактора: закрытое просто не попадает в запрос к модели, а не прячется просьбой в промпте. Цена такой защиты проявилась в тесте на Flask-приложении. Фильтр секретов принял тестовый "password": "secret123" за настоящий пароль, в песочнице строка превратилась в raise NotImplementedError, и 13 из 22 запусков упали. Модель не поняла причину и написала ещё шесть файлов с тестами в обход. Теперь заменяется только значение, а файл остаётся валидным Python. • Пять уровней доступа: hidden, interface, readonly, confirm, explain • Команды идут в bubblewrap на копии проекта без закрытого кода, без сети и ключей • Около 11 тыс. строк кода, около 10 тыс. строк тестов, лицензия MIT

AI-обработка оригинала Habr AI; редакция Hamidun News
aiedit прячет от ИИ-агента отдельные строки кода: 5 уровней и 857 тестов
Источник: Habr AI. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникHabr AI ↗
Главный редактор
Пять уровней доступаhidden, interface, readonly, confirm, explain
Ключевой факт #2Команды идут в bubblewrap на копии проекта без закрытого кода, без сети и ключей
Ключевой факт #3Около 11 тыс. строк кода, около 10 тыс. строк тестов, лицензия MIT

Редактор aiedit закрывает от ИИ-агента не файлы, а конкретные строки, и делает это на уровне кода, а не просьбы в промпте. Проект написал начинающий разработчик: Python он учит с конца сентября 2026 года, а код писал Claude под его руководством. В итоге получилось около 11 тысяч строк кода, около 10 тысяч строк тестов и 857 тестов, которые проходят и на PySide6, и на PyQt6. Лицензия MIT, к моделям идут обычные HTTPS-запросы без SDK, так что подходят Anthropic, OpenAI и любые OpenAI-совместимые серверы.

Почему ignore-файлы не защищают

Идея выросла из слабости существующих инструментов. Cursor в документации прямо пишет, что команды терминала и MCP-инструменты «могут прочитать» файлы из .cursorignore. Cline вообще убрал .clineignore: файл, по словам проекта, «никогда не задумывался как запрет доступа», а ложное чувство безопасности авторы давать не хотят. К тому же такие файлы работают только с целыми файлами. Если разделить проект на «можно ИИ» и «нельзя», агент работает вслепую. aiedit оставляет проект целым и закрывает точечно: формулу расчёта цены или работу с платежами, остальное модель видит и правит.

Пять уровней и цепочка из пяти защит

Строки закрываются прямо в поле с номерами строк. Уровни доступа такие:

  • hidden: модель получает только метку вроде <<ai-hidden:0:5 lines>>, то есть знает, что здесь что-то есть и сколько строк;
  • interface: имена и сигнатуры без тел функций (для Python);
  • readonly: весь код виден, но любая правка отклоняется;
  • confirm: весь код виден, правки только с одобрения автора;
  • explain: модель объясняет этот код.

Поверх уровней работает цепочка проверок:

  • у модели нет терминала, только инструменты редактора (читать, искать, править), а закрытые папки для неё не существуют;
  • каждая правка проверяется diff-ом, при задетой закрытой строке она отклоняется, на диск ничего не пишется без одобрения;
  • тесты и программа запускаются под bubblewrap на копии проекта, где закрытого кода физически нет, без сети, домашней папки и ключей. Даже вывод всех файлов в base64 ничего не покажет;
  • фильтр исходящего ищет ключи, слова из списка и закрытые строки, вставленные в чат, и предлагает замаскировать, отправить или отменить;
  • локальный журнал фиксирует, какие файлы ушли, сколько строк скрыто и сколько символов отправлено, а любую применённую работу ИИ можно откатить.

Отдельно есть мультимодельный конвейер: одна модель пишет код, редактор сам гоняет тесты в песочнице, модель другого производителя ищет ошибки и дыры. Автор видит изменения только после этого, вместе с реальным результатом тестов, а не словами «всё работает».

Как защита сломала код, который писала модель

Сравнение с Claude Code автор приводит без прикрас. На задаче «простое приложение на Flask» код писал Claude Opus 5.5 и в aiedit, и в Claude Code, но в aiedit правки дополнительно проверял GLM 5.3, и результат оказался хуже. Причину нашёл журнал. Модель написала в тестах "password": "secret123", фильтр секретов принял это за настоящий пароль, и в песочнице строка превратилась в raise NotImplementedError прямо внутри словаря. Файл перестал быть корректным Python. Из 22 запусков в песочнице 13 упали, pytest ни разу не добрался до самих тестов. Модель не поняла причину и написала ещё шесть файлов с тестами в обход.

Исправление: теперь заменяется только значение, "password": "<hidden>", и синтаксис сохраняется. Повторный прогон на живых моделях автор не делал, фикс подтверждён тестом, воспроизводящим случай. С локальными моделями тоже неровно: qwen2.5-coder 7B не удержала формат вызова инструментов, версия 32B справилась с простыми задачами, но многофайловую не доделала за 14 шагов.

При чтении кода нашлись и две дыры, обе закрыты. Если файл переименовывали или копировали не в редакторе, зоны терялись, и теперь закрытый код узнаётся по хешам строк. А проект, установленный в собственный .venv через pip install ., лежал там целиком, и команда в песочнице могла его прочитать, поэтому такие копии теперь скрыты.

Где граница защиты и что взять на вооружение

Автор честно перечисляет ограничения. Фильтр ловит только то, что может сравнить: шаблоны ключей, слова из списка и дословно вставленные закрытые строки, а пересказанный секрет уйдёт. Сигнатура вроде calc_discount_for_client_x() в зоне interface уже раскрывает смысл. Всё незакрытое уходит провайдеру модели. Изменённую копию закрытого кода редактор не узнает. Хеши в *.aimarks.json без соли, поэтому короткую строку вроде rate = 0.15 можно подобрать перебором, и публиковать эти файлы в открытом репозитории нельзя. Песочница полноценно работает на Linux, на macOS она экспериментальная и не проверялась на настоящем Mac, на Windows только через WSL.

Практический вывод для команд, которые пускают агентов в коммерческий код: защита должна жить в слое инструментов, а не в тексте промпта. Лишение агента терминала, песочница с копией без секретов, diff-проверка правок и исходящий фильтр дают проверяемые гарантии. Побочный эффект тоже виден: чем агрессивнее маскирование, тем выше шанс сломать валидность кода, и логи запросов становятся главным инструментом отладки. Код доступен на GitHub и GitFlic, а автор просит присылать способы обхода защиты.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: почему ignore-файлы не защищают?

Идея выросла из слабости существующих инструментов. Cursor в документации прямо пишет, что команды терминала и MCP-инструменты «могут прочитать» файлы из .cursorignore. Cline вообще убрал .clineignore: файл, по словам проекта, «никогда не задумывался как запрет доступа», а ложное чувство безопасности авторы давать не хотят. К тому же такие файлы работают только с целыми файлами. Если разделить проект на «можно ИИ» и «нельзя», агент работает вслепую. aiedit оставляет проект целым и закрывает точечно: формулу расчёта цены или работу с платежами, остальное модель видит и прави

Что известно по теме: пять уровней и цепочка из пяти защит?

Строки закрываются прямо в поле с номерами строк. Уровни доступа такие: hidden: модель получает только метку вроде <<ai-hidden:0:5 lines>>, то есть знает, что здесь что-то есть и сколько строк; interface: имена и сигнатуры без тел функций (для Python); readonly: весь код виден, но любая правка отклоняется; confirm: весь код виден, правки только с одобрения автора; explain: модель объясняет этот код. Поверх уровней работает цепочка проверок: у модели нет терминала, только инструменты редактора (читать, искать, править), а закрытые папки для неё не существуют; каждая правка п

Что известно по теме: как защита сломала код, который писала модель?

Сравнение с Claude Code автор приводит без прикрас. На задаче «простое приложение на Flask» код писал Claude Opus 5.5 и в aiedit, и в Claude Code, но в aiedit правки дополнительно проверял GLM 5.3, и результат оказался хуже. Причину нашёл журнал. Модель написала в тестах "password": "secret123", фильтр секретов принял это за настоящий пароль, и в песочнице строка превратилась в raise NotImplementedError прямо внутри словаря. Файл перестал быть корректным Python. Из 22 запусков в песочнице 13 упали, pytest ни разу не добрался до самих тестов. Модель не поняла причину и напис

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Практика · Hamidun Academy

Соберите рабочего ИИ-агента или сервис своими руками без ручного кода

В Академии Жемала Хамидуна (academy.hamidun.com) открыт бесплатный 72-часовой тест-драйв: интерактивные скетч-уроки по Claude Code и Cursor, живой Tech Radar и готовые шаблоны агентов.

Открыть 72ч бесплатный доступ →Интенсив по Вайб-кодингу
Что вы думаете?
Загружаем комментарии…