Оглавление: префлайт · идентичность воркера · ретраи и 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 | Отладка с ноутбука | Забытый туннель |
Три типовых провала
- Вне allowlist: шлюз отклоняет, а workflow ретраит как транзиент — растёт нагрузка.
- Короткий heartbeat_timeout: Temporal перевыбирает задачу, пока шлюз ещё в HTTP.
- Сырой текст в ошибке: ретраи дублируют побочные эффекты.
Матрица ответственности слоёв
| Слой | Инвариант | Цена пропуска |
|---|---|---|
| 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.
Оформление узла: закрепите профиль памяти через покупку и аренду и сверьте цену на тарифах до прод-включения воркера.