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 закрывает от ИИ-агента не файлы, а конкретные строки, и делает это на уровне кода, а не просьбы в промпте. Проект написал начинающий разработчик: 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, а автор просит присылать способы обхода защиты.
- 28 окт. 2026 г.Goodfire: агентный анализ расшифровал нейроны, которые считали хаосом
- 28 окт. 2026 г.OpenAI выпустила GPT-6.1 Terra: вдвое дешевле и вдвое точнее в коде
- 28 окт. 2026 г.AWS запустила Multi-Turn RL в SageMaker: gpt-oss-20b вырос с 15 до 69% за $339
- 28 окт. 2026 г.Gemma 26B дообучили на MacBook с 24 ГБ: офлайн-помощник дал 703 из 766
Вопросы и ответы по материалу
Что известно по теме: почему 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 ни разу не добрался до самих тестов. Модель не поняла причину и напис
Соберите рабочего ИИ-агента или сервис своими руками без ручного кода
В Академии Жемала Хамидуна (academy.hamidun.com) открыт бесплатный 72-часовой тест-драйв: интерактивные скетч-уроки по Claude Code и Cursor, живой Tech Radar и готовые шаблоны агентов.
Главное из мира ИИ — раз в неделю
7 ключевых событий недели, отобранных вручную. Без шума, репостов и пресс-релизов.
Готово! Проверьте почту — мы отправили подтверждение.