Сборка проходит, но команда не может доказать, что исправление действительно устраняет найденную проблему, а рабочая среда продолжает хранить старые токены и промежуточные файлы.
Самое быстрое решение — не копировать всю OpenAI Defense Factory, а сначала запустить один воспроизводимый процесс: обнаружение, динамическое подтверждение, создание патча, независимый повторный тест и архивирование доказательств. Универсальные задачи отправляйте в эластичный исполнительный пул, а проверки с Xcode, macOS или Apple-инструментарием — в изолированный облачный Mac.
Эта статья предназначена для платформенных инженеров, которые строят среду динамической проверки находок Codex Security. Она также пригодится командам безопасности, ограничивающим права Agent, сетевые выходы и операции записи, а также DevSecOps-руководителям, планирующим ресурсы для iOS-, macOS- и кроссплатформенных проектов.
Последнее обновление: 4 сентября 2026 года. Сведения о Defense Factory, Codex Security, рекомендуемом жизненном цикле и границах доступа сверены с официальной страницей OpenAI Defense Factory, объявлением Daybreak и документацией Codex Security.
Рамки первого рабочего процесса
Начинайте не с попытки построить «фабрику» для всех репозиториев, языков и типов уязвимостей, а с одной часто повторяющейся цепочки. Подход OpenAI описывает Defense Factory как референсную архитектуру и непрерывный защитный процесс, но это не обязательный стандарт, который обычная команда должна внедрить целиком. Официальные материалы также подчёркивают постепенное расширение от отдельного рабочего процесса, изоляцию и уничтожение временных сред после задания.
Для пилота подходят следующие ограничения:
- один репозиторий с понятным владельцем;
- один класс находок, для которого уже существует тест или детерминированный сценарий воспроизведения;
- обратимое изменение, которое можно быстро отменить;
- отдельный исполнительный контур, не совпадающий с рабочим местом разработчика;
- ручное подтверждение перед записью в репозиторий, созданием внешней задачи или изменением развёртывания.
Сразу разделите состояния. «Кандидат» означает, что статический анализ или Agent указал на возможную проблему. «Воспроизведённая уязвимость» требует запуска разрешённого защитного теста в контролируемом приложении. «Патч ожидает проверки» означает, что изменение создано, но ещё не прошло независимый прогон. «Исправление подтверждено» допустимо только после повторной сборки, проверки исходного дефекта и обычной функциональной регрессии.
Для каждого перехода сохраните:
- исходный коммит и ветку;
- список зависимостей и конфигурацию сервиса;
- идентификатор шаблона окружения;
- точку входа теста и ожидаемый результат;
- фактический вывод сборки и проверки;
- отметку ответственного специалиста или другой ручной след одобрения.
Codex Security нельзя приравнивать к системе управления рабочими задачами. Он может помогать искать и анализировать проблемы, но состояние тикета, решение о публикации патча и доказательство исправления должны оставаться отдельными объектами контроля. Статический маршрут к опасному участку кода сам по себе не равен подтверждённой уязвимости.
Контуры управления и исполнения
В первый рабочий цикл разделите два контура. Контрольный контур отвечает за планирование, политики, временную идентичность, выдачу разрешений и проксирование секретов. Исполнительный контур запускает код, сборку и тесты в среде, которую можно удалить без ущерба для контрольных данных.
Такое разделение предотвращает несколько скрытых проблем. Если планировщик одновременно имеет доступ к исходникам и выполняет код, компрометация задания может дать ему лишние полномочия. Если журнал хранится внутри рабочего каталога, уничтожение окружения уничтожит и доказательства. Если один долгоживущий токен записан в образ, любой последующий запуск получает доступ, который не связан с конкретной задачей.
Для репозитория, хранилища артефактов и системы задач задайте отдельные минимальные роли. Исполнительному процессу обычно достаточно прочитать фиксированный коммит и отправить результат в специально разрешённое хранилище. Запись в основную ветку, создание публичного комментария, изменение тикета и вызов внешнего сервиса должны идти через независимое одобрение.
Для временной идентичности полезна модель короткоживущего обмена, а не секрет в переменной окружения на весь срок жизни проекта. В средах автоматизации можно изучить документацию GitHub об OIDC и временной идентичности, но конкретные разрешения должны соответствовать вашей системе и политике поставщика.
Сетевую политику задайте до запуска Agent:
- доступ к исходному репозиторию — только через разрешённый прокси;
- загрузка зависимостей — из утверждённого зеркала или заранее подготовленного кэша;
- внешние вызовы — запрещены по умолчанию;
- отправка результатов — только в аудит и назначенное хранилище;
- операции записи — отключены до отдельного подтверждения.
Не называйте изоляцию абсолютной безопасностью. Она сокращает область воздействия, но не устраняет ошибки конфигурации, уязвимости образа, утечки через разрешённый канал или риск неверной классификации результата.
Схема выбора исполнительного пула
Пулы следует различать не по удобству команды, а по требованиям задачи. Универсальный пул подходит для воспроизведения, тестов и сборок, не зависящих от Apple-инструментария. Отдельный Mac-пул нужен там, где среда выполнения является частью проверяемого результата.
| Вариант исполнения | Подходящие задачи | Основной риск | Оценка для пилота |
|---|---|---|---|
| Общий эластичный пул | Анализ исходников, серверная сборка, тесты зависимостей, повторяемые проверки | Пересечение кэшей и слишком широкие роли | Высокая при чистом рабочем каталоге |
| Временная изолированная среда | Подтверждение находки, сборка патча, независимый повторный тест | Потеря доказательств при неправильном завершении | Высокая при внешнем аудите |
| Изолированный облачный Mac | Xcode, Apple SDK, подпись, упаковка и проверка macOS или iOS | Дороже и сложнее в управлении доступом | Высокая только для Apple-зависимых задач |
| Постоянная среда разработчика | Локальная диагностика и ручная подготовка | Остаточные секреты, кэш и нерепродуцируемое состояние | Низкая для приёмки исправления |
Не отправляйте весь конвейер на Mac только потому, что конечный продукт может быть мобильным. Сначала выполняйте общий анализ и серверные проверки, затем передавайте в Mac-пул только тот этап, который действительно зависит от Xcode, Apple SDK, подписи или поведения платформы. Командные инструменты Xcode подтверждают, что часть операций можно выполнять через автоматизируемый инструментальный контур, но это не отменяет требования к реальному Apple-окружению для платформозависимых результатов.
Воспроизводимый запуск
После выбора пула создайте не «копию рабочего места», а описание среды. Минимальный шаблон должен включать фиксированный коммит, lock-файл зависимостей, версии системных инструментов, переменные конфигурации без секретных значений, входную команду, ожидаемые артефакты и правила сетевого доступа.
Практическая последовательность выглядит так.
- Получите из контрольного контура идентификатор задачи и временную роль. Не передавайте в среду личный постоянный токен разработчика.
- Зафиксируйте исходный коммит и проверьте, что рабочий каталог пуст. Если исполнительный раннер используется повторно, удалите остатки предыдущего задания до получения исходных файлов.
- Соберите окружение из утверждённого образа или шаблона. Запишите его идентификатор, версию загрузочного сценария и итог инициализации.
- Установите зависимости из зафиксированного списка. Ошибки сети, несовместимую версию пакета и ошибку самого приложения сохраняйте как разные категории.
- Соберите приложение и запустите обычный функциональный тест без импортированной находки.
- Только после успешной базовой проверки добавьте сценарий, связанный с кандидатом, и сохраните исходный вывод.
- Передайте результат в аудит, затем отзовите временные права и уничтожьте рабочий каталог.
Пятый шаг принципиален: если приложение не собирается до проверки находки, команда не знает, что именно сломано — код, зависимость, конфигурация или предполагаемый дефект. Базовая успешная сборка не доказывает отсутствие уязвимости, но создаёт точку сравнения для последующих прогонов.
При сбое не повторяйте задание вслепую. Сначала классифицируйте причину: недоступный артефакт, ошибка шаблона, отказ разрешения, несовместимость зависимости, сбой приложения или ошибка теста. Затем либо пересоздайте окружение из того же описания, либо остановите задачу и отправьте её владельцу. Подмена незафиксированной зависимостью ради «успешного» результата разрушает воспроизводимость.
Динамическое подтверждение и границы записи
На этапе проверки Agent должен получить ровно те файлы и команды, которые нужны для авторизованного защитного сценария. Не расширяйте область до произвольного сканирования внешних систем и не используйте этот процесс для неразрешённых испытаний. В статье не приводятся эксплуатационные нагрузки: для приёмки достаточно безопасного теста, который демонстрирует условие до исправления и исчезновение этого условия после него.
Результат динамической проверки должен отвечать на конкретные вопросы:
- какой коммит проверялся;
- какое условие воспроизводится;
- какие входные данные и настройки необходимы;
- какой вывод подтверждает результат;
- какие версии затронуты;
- что изменилось после патча;
- какие обычные функции проверены дополнительно.
Состояние «не подтверждено» должно оставаться допустимым исходом. Если тест не даёт устойчивого результата, не повышайте находку до уязвимости только ради красивой статистики закрытия. Аналогично, отсутствие срабатывания после изменения ещё не доказывает исправление: причина могла исчезнуть из-за другого кода, изменённой конфигурации или ошибки теста.
Ограничьте внешние записи. Agent может подготовить отчёт или патч в изолированном хранилище, но создание задачи, публикация комментария, изменение ветки и вызов системы развёртывания должны требовать независимого решения. В журнале фиксируйте не содержимое секретов, а факт обращения, субъект, разрешение, результат и связь с идентификатором задания.
Независимая проверка патча
Патч нельзя считать принятым в той же сессии, которая его создала. В исходной среде остаются кэш компилятора, изменённые файлы, контекст Agent и результаты предыдущих команд. Поэтому положительный вывод может быть связан с состоянием процесса, а не с исправлением.
Создайте новую задачу с отдельным идентификатором и выполните её в новом окружении:
- получите исходный коммит и патч как входные артефакты;
- восстановите среду по сохранённому шаблону;
- соберите приложение без использования рабочего каталога генератора;
- запустите тест, который ранее подтверждал дефект;
- выполните нормальные функциональные и регрессионные проверки;
- сравните результат с базовой линией;
- передайте заключение человеку, который не подписывал создание патча.
Если исходный сценарий больше не срабатывает, но регрессия появилась в другой части приложения, итог должен быть «патч требует доработки», а не «исправлено». Если среда не собирается, итог — «проверка прервана», с указанием причины. Закрытие задачи в системе управления работами не заменяет доказательство фактического развёртывания и последующей проверки.
Для macOS и iOS добавьте отдельный маршрут. Когда проверка зависит от Xcode, подписи, Apple SDK, упаковки или запуска на платформе, передайте патч в облачный Mac с отдельной ролью, сетевой политикой и рабочим каталогом. Рекомендации Apple по созданию подписанного кода для macOS показывают, почему подпись и сборка нельзя свести к абстрактной проверке исходников. При этом сам анализ серверной логики и часть тестов могут оставаться в общем пуле.
Частые вопросы
Нужно ли создавать отдельную среду для каждого Agent в Defense Factory?
Постоянная машина для каждого Agent не требуется. Границей изоляции лучше сделать задачу: отдельные рабочий каталог, временная роль, сетевой маршрут и журнал. Общий пул допустим, если после каждого запуска состояние очищается, а задания не видят чужие артефакты. Apple-зависимые операции всё равно следует направлять в отдельный Mac-пул с собственной политикой.
Как сохранить воспроизводимые доказательства после находки Codex Security?
Сохраняйте коммит, зависимости, конфигурацию, шаблон среды, команду теста и полный релевантный вывод. Отдельно отмечайте динамическую проверку и статическое предположение. Архив размещайте вне исполнительной среды, добавляйте связь с задачей и ручным решением. Не переносите в аудит секреты или лишние копии исходников.
Почему исправление от безопасного Agent нельзя принять в той же сессии?
Потому что генератор уже изменил состояние среды. Кэш, промежуточные файлы и контекст команд способны повлиять на результат. Новый исполнитель должен получить патч как вход, заново собрать проект, повторить тест исходного дефекта и выполнить регрессию. Только так можно отделить эффект исправления от побочных признаков предыдущей сессии.
Всегда ли для проверки исправлений iOS и macOS нужен настоящий Mac?
Нет, не для каждого этапа. Статический анализ и независимые серверные тесты можно выполнять в общем пуле. Настоящий Mac нужен, когда проверяемый результат зависит от Xcode, Apple SDK, подписи, упаковки или поведения приложения на macOS и iOS. Поэтому правильная схема — не «всё на Mac», а выборочная передача Apple-зависимого шага.
Какие журналы оставить после завершения временной среды?
Внешнее хранилище должно получить сведения о коммите, шаблоне, зависимостях, запуске, разрешённых действиях, сборке, проверке, регрессии, ручном одобрении и уничтожении среды. Секреты и персональные токены сохранять нельзя. Для остановленных задач добавьте причину сбоя и точку восстановления, чтобы повторный запуск не зависел от памяти предыдущего исполнителя.
Завершение задачи и восстановление
Уничтожение среды — не формальная последняя команда, а отдельный проверяемый этап. Сначала сохраните минимальный набор доказательств во внешнем аудите, затем отзовите временную роль, удалите рабочий каталог, очистите привязанные кэшированные секреты и подтвердите освобождение исполнительного ресурса.
Проверьте восстановление на безопасном тестовом задании:
- остановите процесс во время сборки;
- запустите повтор из сохранённого состояния;
- намеренно сделайте недоступным один разрешённый артефакт;
- убедитесь, что задача завершается с понятной классификацией;
- проверьте, что незавершённый запуск не сохраняет право записи;
- сравните итоговые доказательства с первоначальной контрольной точкой.
Вам нужна не идеальная непрерывность, а предсказуемое поведение при сбое. Если после прерывания невозможно понять, какой коммит проверялся, или временный токен остаётся действительным, процесс ещё не готов к расширению.
После нескольких реальных прогонов соберите эксплуатационную картину без выдуманных нормативов: время подготовки среды, длительность задания, долю Apple-зависимых запусков, частоту повторов, причины остановок и периоды ожидания. На основании этих наблюдений выбирайте сочетание общего пула, эластичного пула для пиков и временного выделения Mac. Публичные материалы OpenAI следует использовать как описание архитектурного направления, а не как обещание конкретной производительности обычной команды; ограничения и модель рисков также стоит сверять с системным документом Codex.
Итоговая проверка перед расширением
Перед подключением следующего репозитория пройдите этот список. Если хотя бы один критический пункт не выполнен, остановите расширение и вернитесь к пилотной задаче.
- [ ] Для кандидата, подтверждённой проблемы, ожидающего патча и принятого исправления определены разные состояния.
- [ ] Каждый статус связан с коммитом, зависимостями, конфигурацией, тестом и доказательством решения.
- [ ] Контрольный контур не выполняет код и не хранит рабочие файлы задания.
- [ ] Исполнитель получает временную роль вместо личного постоянного токена.
- [ ] Репозиторий, хранилище артефактов и система задач имеют раздельные минимальные разрешения.
- [ ] Внешние записи и изменения веток требуют независимого одобрения.
- [ ] Базовая сборка выполняется до импорта сценария проверки находки.
- [ ] Патч повторно проверяется в новом окружении другим заданием.
- [ ] Apple-зависимые операции имеют отдельный облачный Mac-маршрут и собственные метки планировщика.
- [ ] Аудит сохраняется вне исполнительной среды до её уничтожения.
- [ ] Прерывание, восстановление и отзыв временных прав проверены на тестовом запуске.
- [ ] Для неизвестного результата предусмотрен статус «не подтверждено», а не принудительное повышение до уязвимости.
Эта схема не заменяет полноценную программу управления уязвимостями. Её задача уже: дать команде узкий, проверяемый контур, в котором можно доказать, что конкретный патч собран, проверен отдельно и не принят только на основании отчёта Agent.
Если текущий процесс держится на постоянных рабочих местах, общих токенах и ручной передаче сборки между разработчиками, у него есть три реальные слабости: состояние среды трудно воспроизвести, права часто живут дольше задания, а Apple-зависимые проверки конкурируют с обычными задачами за один ресурс. В такой ситуации аренда облачного Mac через zekmac имеет смысл не как замена всей платформе, а как изолируемый ресурс для пиковых Xcode- и macOS-проверок: задачу можно отделить от общего пула, не оставлять простаивающее оборудование в постоянной эксплуатации и заранее включить требования к восстановлению и уничтожению среды.
Сначала составьте перечень задач, которым действительно нужны Xcode или macOS, укажите их пиковую параллельность, длительность изоляции и требования к повторному запуску. Затем сопоставьте этот перечень с возможностями аренды облачного Mac в zekmac. Для стабильной постоянной нагрузки и обязательных физических интерфейсов собственное оборудование может оказаться рациональнее; для временной проверки патчей, тестового окна или нерегулярного Apple-контура облачный Mac обычно проще включить в жизненный цикл задания без долгого простоя.
Частые вопросы
Нужно ли создавать отдельную среду для каждого Agent в Defense Factory?
Не обязательно выделять постоянную машину каждому Agent. Надёжнее создавать временную среду на уровне задачи или короткоживущего рабочего процесса, где отдельно выдаются права, сетевой маршрут и секреты. Общий исполнительный пул допустим для совместимых задач, но рабочие каталоги, журналы и токены между заданиями смешивать нельзя. Для Apple-инструментария используйте отдельный пул с собственными правилами доступа.
Как сохранить воспроизводимые доказательства после находки Codex Security?
Сохраните исходный коммит, файл зависимостей, конфигурацию запуска, версию шаблона окружения, команду теста, вывод процесса и результат ручного подтверждения. Отдельно фиксируйте, что именно было проверено динамически, а что осталось статическим предположением. Доказательства должны храниться вне уничтожаемой среды, иметь связь с задачей и позволять другому исполнителю повторить тот же сценарий.
Почему исправление от безопасного Agent нельзя принять в той же сессии?
Та же сессия уже содержит изменённое состояние, кэш, промежуточные файлы и контекст, повлиявший на создание патча. Поэтому положительный вывод может отражать не исправление, а особенности текущего процесса. Независимый повторный тест запускается из нового окружения с исходным патчем, заново собирает приложение, проверяет исходный дефект и выполняет регрессионные тесты.
Всегда ли для проверки исправлений iOS и macOS нужен настоящий Mac?
Для обычного анализа исходного кода Mac не обязателен. Он становится необходимым, когда результат зависит от Xcode, Apple SDK, подписи, упаковки или поведения приложения на macOS и iOS. В таком случае передавайте задачу в изолированный облачный Mac-пул, а универсальные проверки оставляйте в общем исполнительном пуле. Это не делает весь процесс зависимым от Mac.
Какие журналы оставить после завершения временной среды?
Оставьте идентификаторы коммита и шаблона окружения, версии зависимостей, параметры запуска, сетевые и разрешённые действия Agent, результаты сборки, тестов и повторной проверки, классификацию ошибок, отметки одобрения и сведения об уничтожении среды. Секреты, персональные токены и лишние копии исходников в аудит не переносите. Отдельно отметьте незавершённые задачи и причину остановки.
Удалённый узел zekmac M4
Проверьте исправления в изолированной среде zekmac
Арендуйте удалённый Mac в zekmac для безопасной проверки патчей и воспроизведения сценариев тестирования.