Temporal задаёт ретраи и дедлайны, OpenClawallowlist и failure summary до побочных эффектов; на удалённом Mac их нужно сшить явно, иначе ретраи активности и HTTP к шлюзу разъедутся по времени.

Оглавление: префлайт · идентичность воркера · ретраи и heartbeat · секреты · loopback и туннель · риски · матрица · JSON · шаги · чек-лист · FAQ

Для команд, которые поднимают Python worker Temporal на арендованном удалённом Mac и зовут LLM-инструменты только через OpenClaw с allowlist: ниже runbook по очереди и identity воркера, ретраям и heartbeat_timeout, секретам вне истории, loopback и SSH-туннелю, JSON failure summary. Связка с другими гайдами: Agno и allowlist, ретраи и схема, префлайт и health. Публично: главная, блог, покупка.

Префлайт до первой активности с шлюзом

Зафиксируйте версию temporalio, образ Python и коммит политики инструментов. На хосте воркера выполните openclaw doctor --json, сохраните артефакт в logs/preflight/, проверьте диск логов и лимиты launchd. Синхронизируйте NTP с кластером. На узле LlmMac не смешивайте soak и тяжёлые IDE на одном пуле unified memory.

Идентичность воркера Temporal и изоляция сред

Очередь задач — одна на среду и домен нагрузки; не смешивайте staging и prod. Задайте identity воркера и build id в деплое, чтобы в UI было видно, какой Mac обслуживает какую версию политики. Разные репозитории — разные venv и процессы воркера, иначе переменные окружения пересекутся. Проверьте точное имя namespace и DNS frontend кластера.

Политика ретраев, heartbeat и согласование с шлюзом

На workflow — умеренные retry policies с джиттером и списком неповторяемых ошибок. На активности с OpenClaw разведите start_to_close_timeout, schedule_to_close_timeout и heartbeat_timeout так, чтобы сервер не оборвал задачу раньше структурированного ответа шлюза. В длинных вызовах шлите heartbeat без секретов и без сырого пользовательского текста. HTTP-клиент к loopback должен укладываться в бюджет активности с запасом на JSON failure summary.

Инъекция секретов без попадания в историю workflow

Bearer и ключи провайдера подавайте через env процесса воркера или секрет-хранилище на Mac; файл токена chmod 0600, вне git. Не кладите секреты в аргументы workflow и search attributes. Для параметров используйте opaque handle, который воркер резолвит локально. Scratch и запись — только выделенный каталог, код — read-only как в гайде IDE-моста.

Шлюз OpenClaw: loopback на узле и SSH-туннель для отладки

Прод: OpenClaw на 127.0.0.1, воркер бьётся локально. Отладка с ноутбука: ssh -L …:127.0.0.1:порт_шлюза, без постоянного демона и с idle-timeout на бастионе. Egress к модели — только разрешённый маршрут шлюза.

Режим Когда применять Риск если пропустить
Loopback Воркер, soak, ночные джобы Лишний exposure в LAN
SSH -L Отладка с ноутбука Забытый туннель

Три типовых провала

  1. Вне allowlist: шлюз отклоняет, а workflow ретраит как транзиент — растёт нагрузка.
  2. Короткий heartbeat_timeout: Temporal перевыбирает задачу, пока шлюз ещё в HTTP.
  3. Сырой текст в ошибке: ретраи дублируют побочные эффекты.

Матрица ответственности слоёв

Слой Инвариант Цена пропуска
Temporal Очередь, ретраи, heartbeat, дедлайны Зависшие run, дубли
OpenClaw Allowlist и лимиты времени Побочные эффекты
Логи failure summary и request_id с run_id Разбор без цепочки

Фрагменты JSON политики и ответа

Без секретов; tools_policy_version одинаково в git, шлюзе и логах воркера.

{ "tools_policy_version": "2026-05-06", "allowed_tools": [ { "name": "read_repo_file", "side_effect": "read", "max_payload_bytes": 65536 }, { "name": "http_get_allowlisted", "side_effect": "network", "hosts_allowlist": ["api.internal.example"] } ] }

Таймаут шлюза чуть выше HTTP-клиента воркера.

{ "gateway_timeouts": { "first_token_soft_ms": 45000, "full_completion_hard_ms": 120000, "single_tool_execution_ms": 25000 } }

Failure summary — в результат активности или ApplicationFailure без сырого completion.

{ "outcome": "failed", "request_id": "req_01JZ...", "stage": "tool_execute", "code": "TOOL_TIMEOUT", "hint": "retry_idempotent_after_sec=30" }

Воспроизводимые шаги

1) Каталог. Пользователь воркера, ~/temporal-openclaw с config logs policies, код read-only, scratch с квотой.

2) Loopback шлюз. OpenClaw на 127.0.0.1, порт в launchd, openclaw doctor --json в logs/preflight/.

3) Allowlist. JSON имён в шлюз, отказ до исполнения вне списка, TOOLS_POLICY_VERSION в env воркера.

4) Воркер. Активности только на http://127.0.0.1:<порт>/v1; в CI запретите обход шлюза.

5) Время. heartbeat_timeout больше двух интервалов heartbeat; HTTP клиента короче schedule_to_close_timeout с запасом на JSON.

6) Ретраи. Policy и schema отказы — неповторяемые; сеть и 429 — backoff с джиттером на workflow.

7) Сводка. На ошибке шлюза верните компактный JSON в workflow или ApplicationFailure; дублируйте в лог с run_id.

Чек-лист перед нагрузкой

  • Версия политики совпадает в git, шлюзе и env воркера.
  • Heartbeat, HTTP и schedule_to_close согласованы в runbook.
  • Идемпотентность записей проверена повторной доставкой.
  • Сбой коррелируется по request_id и run_id, в сводке нет секретов.
  • Soak ≥2 ч на выделенном Mac без IDE на том же пуле памяти.

Краткие ответы

Дубль allowlist в Python? Опционально; канон — шлюз.

400 от шлюза? Маппите на неповторяемые ошибки Temporal в адаптере активности.

Нагрузочный прогон? Выделенный узел: покупка и аренда.

Без логина: главная, блог, документация, тарифы, покупка.

Итог: отдельная очередь и identity воркера, согласованные heartbeat и HTTP таймауты, секреты в env, OpenClaw на loopback, allowlist на шлюзе и JSON failure summary дают воспроизводимый контур Temporal на удалённом Mac.

Оформление узла: закрепите профиль памяти через покупку и аренду и сверьте цену на тарифах до прод-включения воркера.