Ключевые выводы
- Плановым агентам нужны всегда включённое железо, перезапускаемые процессы и аудируемые логи — на спящем MacBook это ломается, на удалённом Mac M4 — естественная среда.
- launchd — нативная оркестрация macOS:
StartCalendarIntervalвместо cron,KeepAliveподнимает демоны,ThrottleIntervalгасит циклы падений. - MCP-триггеры строите через curated tools и webhook-шлюз n8n — не выставляйте каждый MCP-порт в интернет.
- Для параллельного кодинга см. руководство по параллельным worktree-агентам; для диска — управление диском и inode на Runner.
- Рекомендуемый путь: посуточный PoC (launchd + первый MCP job) → недельный спринт → месячная аренда при стабильных метриках.
- Message-шлюз OpenClaw Gateway и пакетный CLI по расписанию — разные задачи; развёртывание порта 18789 здесь не повторяем.

1. Зачем в 2026 выносить плановых агентов на удалённый Mac
Cursor Automations, оркестрация n8n + MCP и remote-control в Codex CLI в 2026 году превращают «запустить агента по расписанию» из демо в рабочую нагрузку. Исполнение всё равно остаётся на macOS: launchd планирует только локальные процессы, Seatbelt и Keychain блокируют необъявленный доступ инструментов, а домашний Mac теряет задания из‑за сна, переподключения Wi‑Fi и перезагрузок после обновлений.
Размещение планового агента на удалённом Mac M4 даёт три вещи: ① аптайм 7×24 с контролируемыми рестартами; ② меньший RTT к LLM/MCP API (APAC или восток США); ③ эластичную аренду посуточно / понедельно / помесячно, чтобы неудачный PoC не превращался в покупку железа.
Статья про триггеры по расписанию и событиям + оркестрацию MCP, а не про фермы git worktree (это в другом материале). OpenClaw gateway, холодный старт 18789 и tunnel+MCP — только граничные заметки, без повторения развёртывания.
2. SSH-продвижение и среда launchd/crnd: чек-лист на 30 минут
После выдачи удалённого Mac M4 закройте пункты ниже за 30 минут, прежде чем грузить первый LaunchAgent. Подробности SSH — в справочном центре.
- Вход по SSH с ключом;
uname -m— arm64; часовой пояс и NTP в порядке. - Установите Homebrew, Node 22 (типично для agent CLI) и
tmuxилиscreenдля разбора инцидентов. - Создайте
~/agent-runs/state,~/agent-runs/logs,~/agent-runs/scripts. - Ключи API — в
~/.config/agent/env(режим 600); подключайте черезEnvironmentVariablesв LaunchAgent — не вшивайте в plist. - Один ручной прогон
crnd scheduleили тестового launchd-задания; убедитесь, что логи пишутся на диск. curlк вашим LLM/MCP endpoint с машины, зафиксируйте RTT; проверьте firewall для входящих webhook.
Только после этого выбирайте длительность PoC-аренды. Если любой шаг падает — не переходите на неделю или месяц.
3. Топология LaunchAgent launchd
Пользовательские задания по расписанию — в ~/Library/LaunchAgents/, загрузка через launchctl bootstrap gui/$(id -u) (Ventura и новее; предпочитайте bootstrap, а не устаревший load).
| Режим | Когда уместен | Плюсы | Ограничения |
|---|---|---|---|
| launchd, прямой скрипт | Фиксированный интервал/календарь, один репозиторий | Без зависимостей, нативно, понятные логи | ThrottleInterval в plist вручную |
| crnd / agent-reveille | Много агентов, расписание «человеческим» языком | Удобный CLI, версионируемо | Всё равно опирается на launchd/cron |
| n8n + MCP webhook | Кросс-системные потоки, шаги согласования | Curated tools, ретраи, алерты | Доп. задержка; безопасность входа |
Типичные ключи LaunchAgent:
StartCalendarInterval: день/час/минута — замена crontab.KeepAlive: перезапуск при выходе; обязательно сThrottleIntervalпротив циклов падений.StandardOutPath/StandardErrorPath: без логов вы слепы.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.kvmboot.agent.codex-batch</string>
<key>ProgramArguments</key><array>
<string>/bin/zsh</string><string>-lc</string>
<string>source ~/.config/agent/env && ~/agent-runs/scripts/run-codex-batch.sh</string>
</array>
<key>StartCalendarInterval</key><dict>
<key>Minute</key><integer>0</integer><key>Hour</key><integer>*/1</integer>
</dict>
<key>ThrottleInterval</key><integer>300</integer>
<key>StandardOutPath</key><string>/Users/runner/agent-runs/logs/codex.out.log</string>
<key>StandardErrorPath</key><string>/Users/runner/agent-runs/logs/codex.err.log</string>
</dict></plist>Загрузка: launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.kvmboot.agent.codex-batch.plist. Снятие — bootout по тому же пути.
4. Цепочка MCP / n8n webhook и curated tools
MCP-триггеры обычно идут одним из двух путей: agent CLI подключается к MCP-серверу напрямую (внутри VPN или SSH-туннеля), либо n8n/Cursor Automations бьёт в webhook, который запускает скрипты на удалённом runner (когда нужны согласование, ретраи и алерты).
Границы безопасности:
- Только curated tools — белый список файлового I/O и фиксированных API. Не выставляйте неограниченный shell-MCP в интернет.
- Входящие webhook — HMAC или краткоживущие токены; ключи идемпотентности пишите в
state/runs. - Жёсткие таймауты на вызовы LLM; экспоненциальный backoff, иначе launchd + webhook устроят двойной шторм запусков.
Кейсы Mattermost + n8n + MCP в 2026 показывают: оркестрация в n8n, исполнение на macOS runner — совместимо с прямым вызовом launchd; выбирайте по тому, есть ли у вас уже n8n.
5. Шаблоны плановых задач Claude Code / Codex CLI
Claude Code и Codex CLI поддерживают неинтерактивные пакетные прогоны. Держите AGENTS.md, рабочий каталог и инъекцию env одинаковыми, чтобы launchd давал тот же результат, что и ручной SSH.
#!/bin/zsh set -euo pipefail cd ~/projects/my-repo export CODEX_API_KEY="$(grep CODEX_API_KEY ~/.config/agent/env | cut -d= -f2-)" /usr/local/bin/codex exec --prompt-file ~/agent-runs/prompts/nightly-review.md \ >> ~/agent-runs/logs/codex-$(date +%Y%m%d).log 2>&1
С agent-reveille / crnd: reveille add "0 9 * * 1-5" -- codex exec ... для быстрых экспериментов; после стабилизации экспортируйте plist в IaC.
Сочетайте с параллельным worktree-workflow: по расписанию — merge/review-пакеты; интерактивное кодирование — в worktree, без блокировки каталогов. Пики RAM — в материале про пики памяти и swap.
6. Логи, секреты и планирование хранилища
Долгоживущие агенты быстро заполняют state/runs, кэши моделей и хранилища npm/pnpm. Ориентиры (не SLA): лёгкие текстовые агенты могут неделями жить на 512 ГБ; локальный Ollama или тяжёлые артефакты — 2–4 недели на 512 ГБ.
- Ротация логов — посуточные файлы или logrotate — чтобы один файл не съел inode.
- Секреты только в Keychain или env с режимом 600; никогда не кладите токены в
ProgramArgumentsоткрытым текстом. - При 80% диска сначала чистите кэши прогонов, затем масштабируйте том или добавьте второй параллельный runner.
Память: агенты только по API часто укладываются в 16 ГБ; Ollama 7B+ или параллельный Claude Code требуют мониторинга swap и апгрейда до 24 ГБ или разделения нагрузок.
7. Частота задач × аренда: матрица и чек-лист миграции
| Нагрузка | Давление на диск | Рекомендуемая аренда | Когда повышать |
|---|---|---|---|
| Лёгкий MCP каждый час | Низкое (<5 ГБ/нед) | Посуточный PoC → месяц | 7 чистых дней, аудируемые логи |
| Ежедневный полный review Codex | Среднее (10–30 ГБ/нед) | Неделя → месяц | Диск <70%, стабильный RTT |
| Несколько агентов + локальные модели | Высокое (>50 ГБ/нед) | Неделя + 512→1 ТБ | Рассмотрите второй runner |
Цены — на странице тарифов и в консоли. Последовательность: посуточный PoC (1–3 дня, launchd + первый MCP job) → недельный спринт → месячная аренда после двух стабильных недель. Чек-лист PoC:
- LaunchAgent загружается и переживает перезагрузку.
- Хотя бы один webhook/MCP end-to-end с идемпотентным state.
- 24 ч логов без необработанных panic; приемлемый рост диска/inode.
- RTT API и доля ошибок в порогах команды (APAC или восток США под нагрузку).
8. Граница с OpenClaw Gateway (только контраст)
OpenClaw силён как message-шлюз: публичный 18789, tunnel+webhook, мультиканальный вход. Плановый агент в этой статье — пакетный CLI: триггеры launchd без постоянного HTTP-порта, идеально для cron-задач. Оба могут делить один удалённый Mac M4 с разными учётками и каталогами. Колонку OpenClaw смотрите для gateway; здесь не разворачиваем.
9. FAQ по устранению неполадок
Plist не грузится? plutil -lint; уникальный Label; на Ventura+ — bootstrap, не load.
launchctl bootstrap I/O error? Сначала bootout того же job; plist в LaunchAgents, пути без лишних пробелов.
Job идёт, логов нет? Проверьте, что родитель StandardOutPath существует и пользователь может писать.
Цикл KeepAlive? Увеличьте ThrottleInterval; ловушки до set -e; скрипт не должен мгновенно выходить.
Seatbelt / Keychain блокирует CLI? Один раз авторизуйте Keychain в интерактивном SSH; у LaunchAgent те же PATH и HOME, что у login shell.
Таймауты MCP? Ограничьте число tools, поднимите timeout, перенесите runner ближе к региону API.
Дубли webhook? Ключи идемпотентности в state/runs; dedupe в n8n.
Ollama OOM? Меньшая модель, лимит параллелизма, больше RAM или второй runner.
Когда второй параллельный runner? Диск 80%+ после чистки или CPU >85% устойчиво при шардируемых задачах.
Минимальная длина посуточного PoC? Один полный 24-часовой цикл расписания плюс один ручной webhook.
Чем отличается от статьи про worktree? Здесь — когда запускать; там — где и как параллелить кодинг.
OpenClaw или launchd? Сообщения/шлюзы → OpenClaw; cron/пакеты → launchd. Без обещаний SLA — валидируйте PoC-метриками.
Стабильные плановые агенты на облачной Mac mini
Выделенный M4, низкое потребление в простое и нативный macOS launchd лучше подходят цепочкам Claude Code / Codex CLI, чем Планировщик Windows или cron на Linux. Узлы APAC и восток США, SSH из коробки, работа 7×24 без зависимости от крышки ноутбука. Пройдите чек-лист PoC выше, прежде чем фиксировать срок аренды — совокупная стоимость часто ниже, чем рабочая станция плюс электричество и сопровождение.
Начните с посуточной аренды в целевом регионе, чтобы проверить launchd и первый MCP-триггер — сравнить тарифы, память и диск, SSH-доступ или главная; больше материалов в блоге.