ИИ / Автоматизация 11 мая 2026

2026-05-11 Корни рабочей области OpenClaw, белые списки репозиториев и ограждения монорепо на безголовом арендованном облачном Mac Apple Silicon (HK / JP / KR / SG / US)

MacXCode Engineering Team 11 мая 2026 ~20 мин чтения

Безголовые шлюзы кажутся невидимыми, пока инструмент не выйдет за пределы репозитория, который вы собирались править. На арендованных Mac mini M4 в Гонконге, Токио, Сеуле, Сингапуре и США один UID часто совмещает OpenClaw, полосы xcodebuild и долгоживущие артефакты подписи — значит «рабочая область» это свойство безопасности, а не настроение. Этот гайд 2026-05-11 связывает политики путей передачи файлов, гигиену окружения и секретов launchd, дисциплину checkpoint сессии и изоляцию параллельных полос в явные разрешённые корни, корректно разрешённые симлинки и учения операторов с fail-closed, когда ассистент тянется к ~/Library или соседним CI-деревьям.

Почему ограждения рабочей области задают радиус поражения на общих арендованных хостах

Неверно заданный корень превращает безобидное чтение в сюрпризы рядом с цепочкой ключей: модель идёт по относительному пути, shell под launchd иначе раскрывает ~, или устаревший симлинк ведёт из «разрешённого» поддерева в checkout другого арендатора. Производственные шлюзы публикуют позитивные списки корней ФС — не полагайтесь только на «здравый смысл модели». Привяжите списки к тикетам автоматизации, чтобы каждый merge инфраструктурных конфигов проверял политики OpenClaw и соседние CI-обёртки.

Базовый fail-closed: если путь нельзя нормализовать к realpath из списка, отклонять до вызова нативных инструментов — логировать отказ с корреляционными ID структурированного логирования.

Анатомия: OPENCLAW_STATE_DIR, CI checkout и соседство DerivedData

Долговечное состояние ассистента — это хранилище плоскости данных: не смешивайте с эфемерными клонами /tmp и деревьями Xcode DerivedData, которые уборщики удаляют посреди задачи. Опишите три кольца — state (checkpoint + политики), workspace (разрешённые git-корни), scratch (одноразовые выгрузки) — и убедитесь, что cron уважает границы. Если CI и ассистенты делят UID, следуйте разделению из статей про параллельные полосы, чтобы не оставлять сиротские блокировки.

  • Кольцо state — версионируемые сниппеты для белых списков + запечатанный JSON при необходимости.
  • Кольцо workspace — одна или несколько абсолютных корней на линию репо/сервиса.
  • Кольцо scratch — каталоги с TTL под префиксами TMP на задачу.

Белые списки вместе с политиками передачи файлов и shell

Настройки плагина передачи от 2026-05-07 склоняются к отказу; корни рабочей области должны отражать это, чтобы fetch/список каталогов не поднимался к родителям, существующим только из-за прыжков симлинков. Кодируйте корни по средам (staging vs prod) и держите оба в Git — продвижение через PR, а не разовые правки по SSH. В монорепо с микросервисами — пространства имён на пакет, чтобы блокировать кросс-сервисное чтение под видом «просто смотрю».

Совет по аудиту: ежемесячные проходы readlink -f по каждому настроенному корню; firmlinks APFS и корпоративные VPN-монты могут перенаправлять пути без изменения текста конфигурации на диске.

Особые случаи монорепо: вложенный SwiftPM, workspace Xcode и git-субмодули

Крупные монорепо соблазняют несколькими манифестами Package.swift и гибридными проектами Xcode. Закрепляйте отдельные корни, если команды расходятся в границах владения — напр. /build/mobile/ios vs /platform/android — и запрещайте боковые прыжки без второй записи в списке. Субмодули наследуют родителя только после security review; иначе трактуйте вложенные .git как явные корни с более узкой областью.

# разрешить симлинки перед одобрением новых корней /usr/bin/python3 - <<'PY' import os roots = ["/var/ci/job123/acme"] for r in roots: print(os.path.realpath(r)) PY

Где CI клонирует рядом с интерактивными ассистентами

Эфемерный CI часто клонирует в хешированные папки под /var/tmp или на отдельные тома; ассистенты по SSH могут по умолчанию использовать ~/workspace. Выровняйте договорённости: экспортируйте ASSISTANT_WORKSPACE_ROOT по регионам и учите оркестраторы монтировать checkout только под авторизованными префиксами. Если self-hosted метки GitHub Actions ведут на тот же Mac, что и OpenClaw, разделите пути, чтобы очистка PR не удаляла scratch ассистента одновременно.

launchd: экспорт корней в неинтерактивные шлюзы

Интерактивные shell подгружают профили; демоны — нет. Зеркалируйте списки в EnvironmentVariables plist или внешнем env с проверкой контрольной суммы. Перезагружайте шлюзы контролируемым launchctl kickstart после обновлений и собирайте stdout по руководству health-проб — проверяйте HTTP readiness и файловые пробы к запрещённым путям.

Матрица решений: намерение пути vs слой принуждения

Сценарий Риск Предпочтительное смягчение
Ассистент читает репо и следует за ../ Утечка к секретам соседнего сервиса Позитивные проверки префикса + отказ сегментов .. после нормализации
Симлинк на Рабочий стол/Документы Разные ожидания TCC без головы и в GUI Разрешить цель ссылки; сверить с документацией приватности macOS
Общий UID CI + ассистент Гонки удаления на пересекающихся деревьях Раздельные пространства имён TMPDIR на ID оркестрации
Ветка срочного хотфикса Временное расширение без плана отката Тикеты списка с дедлайном + автоматическое истечение

Восьмишаговый запуск управления рабочей областью

  1. Инвентаризировать все пути, к которым ассистенты прикасались за 30 дней, по аудит-логам.
  2. Закодировать минимальные белые списки; расширения — с VPEng и security review.
  3. Слить политики в Git; прикрепить checksum к пакету автоматизации.
  4. Развернуть plist/env по регионам с health-curl.
  5. Запустить скриптовые deny-тесты, включая побег через симлинки.
  6. Обучить дежурных быстро откатывать PR списков.
  7. Согласовать скрипты уборки с контрактами TTL scratch.
  8. Ежеквартально публиковать ретроспективные метрики отказов и разрешений.

Сигналы SLO для управления рабочей областью

Сигнал Порог Действие
Попытки неодобренных путей > 3 в неделю на шлюз Заморозить изменения конфигурации; переиграть следы инцидента
Дрейф списка относительно Git Любое невыкатанное ручное изменение Откат хоста; принудить только PR-процесс
Сбои аудита симлинков > 0 критических находок Блокировать релиз; перестроить карту разрешённых корней

FAQ

Вопрос Практический ответ (2026-05-11)
Включать ли корни целиком /Users/ci? Нет — разбивайте по пайплайну или арендатору; целиком корень обнуляет смысл белого списка.
Могут ли ассистенты писать вне workspace для кэша? Только в объявленных scratch-префиксах с квотами и автоматическим выселением.

Почему аренда Mac mini M4 упрощает управление ФС

Быстрый NVMe и предсказуемая unified memory позволяют аудиты симлинков, тройные клоны и одновременные health-шлюзов без давления на swap — важно при итерациях списков во время инцидентов. Планируйте региональную ёмкость через цены; перед расширением корней направляйте сомневающихся инженеров в руководства SSH/VNC.

Арендуйте билдеры, где политику рабочей области можно применить

HK / JP / KR / SG / US · SSH / опционально VNC