2026-05-11 Корни рабочей области OpenClaw, белые списки репозиториев и ограждения монорепо на безголовом арендованном облачном Mac Apple Silicon (HK / JP / KR / SG / US)
Безголовые шлюзы кажутся невидимыми, пока инструмент не выйдет за пределы репозитория, который вы собирались править. На арендованных Mac mini M4 в Гонконге, Токио, Сеуле, Сингапуре и США один UID часто совмещает OpenClaw, полосы xcodebuild и долгоживущие артефакты подписи — значит «рабочая область» это свойство безопасности, а не настроение. Этот гайд 2026-05-11 связывает политики путей передачи файлов, гигиену окружения и секретов launchd, дисциплину checkpoint сессии и изоляцию параллельных полос в явные разрешённые корни, корректно разрешённые симлинки и учения операторов с fail-closed, когда ассистент тянется к ~/Library или соседним CI-деревьям.
Почему ограждения рабочей области задают радиус поражения на общих арендованных хостах
Неверно заданный корень превращает безобидное чтение в сюрпризы рядом с цепочкой ключей: модель идёт по относительному пути, shell под launchd иначе раскрывает ~, или устаревший симлинк ведёт из «разрешённого» поддерева в checkout другого арендатора. Производственные шлюзы публикуют позитивные списки корней ФС — не полагайтесь только на «здравый смысл модели». Привяжите списки к тикетам автоматизации, чтобы каждый merge инфраструктурных конфигов проверял политики OpenClaw и соседние CI-обёртки.
Анатомия: 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 оркестрации |
| Ветка срочного хотфикса | Временное расширение без плана отката | Тикеты списка с дедлайном + автоматическое истечение |
Восьмишаговый запуск управления рабочей областью
- Инвентаризировать все пути, к которым ассистенты прикасались за 30 дней, по аудит-логам.
- Закодировать минимальные белые списки; расширения — с VPEng и security review.
- Слить политики в Git; прикрепить checksum к пакету автоматизации.
- Развернуть plist/env по регионам с health-curl.
- Запустить скриптовые deny-тесты, включая побег через симлинки.
- Обучить дежурных быстро откатывать PR списков.
- Согласовать скрипты уборки с контрактами TTL scratch.
- Ежеквартально публиковать ретроспективные метрики отказов и разрешений.
Сигналы 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