Поисковый интент: связать LaunchDarkly webhook с префлайтом зависимостей на удалённом Mac и вернуть в SCM один блок: подпись, openclaw gateway status, openclaw doctor, коды префлайта. Ниже: openclaw@2026.5.x, Node 24, loopback или SSH, минимальные токены LD, повторы 2 / 4 / 8 с, три попытки POST. См. Node 24, токен шлюза, иной webhook, главная, блог.

Три системных узких места до первого успешного merge:

  1. Разрыв между подписью и парсингом. Если обработчик читает JSON до проверки HMAC по сырому телу, любое преобразование пробелов или кодировки ломает сравнение с секретом LaunchDarkly и даёт ложные отказы либо принимает подделку.
  2. Дублирование сигналов без приоритета. Отдельный лог префлайта и отдельный дамп gateway status в разных артефактах не позволяют ревьюеру понять, блокирует ли merge именно регресс зависимостей или неготовность шлюза OpenClaw на этом раннере.
  3. Смешение таймаутов. Код 408 на исходящем вызове к API часто трактуют как ошибку префлайта; без раздельных таймеров на сеть и на локальный скрипт невозможно отличить узкое место на стороне Git-платформы от медленного резолва пакетов на Apple Silicon.

Подготовка среды и фиксация версий

Node 24 и документация OpenClaw 2026.5.x: одинаковый node -v для SSH и launchd. Установка npm install -g openclaw@2026.5.x, артефакт openclaw --version. Цепочка openclaw onboard, openclaw onboard --install-daemon, затем openclaw doctor и машиночитаемый openclaw gateway status для слияния JSON. Каталоги chmod 700; расхождение SSH и демона — plist и токен шлюза.

LD: для префлайта — API-токен с минимальным read; секрет подписи webhook отдельно, не как bearer в SDK.

Шлюз на loopback либо SSH-туннель наружу

По умолчанию шлюз на 127.0.0.1; наружу — reverse-proxy или TLS и allowlist IP LD. Без ingress на раннер — SSH LocalForward на порт приёмника. Расширение bind — только после матрицы угроз и статьи про токен; не смешивайте контуры секретов.

Матрица: подпись webhook, токены LD и контур ответов

Компонент Минимальная поверхность Контроль на удалённом Mac
Подпись LaunchDarkly HMAC по raw body и секрету из консоли LD; заголовок подписи сверяется до парсинга JSON Секрет только в файле с правами 600 на том же томе что OPENCLAW_HOME; запрет логирования полного тела в stdout shared runner
API-токен чтения флагов Роль read для нужных проектов и окружений без admin Переменная CI с ограничением scope job; ротация без простоя через вторую переменную и короткое окно overlap
Исходящий POST сводки в SCM Токен Git-платформы с правом комментария к merge request или обновления статуса check Повторы с паузами 2 / 4 / 8 с, не более трёх попыток; отдельный connect-timeout чтобы отличать 408 транспорта от логики префлайта
Сборка отчёта Единый JSON или текст не длиннее типового лимита комментария Включите поля gateway_status_timestamp, doctor_exit, preflight_failed, первые строки stderr префлайта без секретов

Маршрут webhook LaunchDarkly и проверка подписи

В LD укажите URL до вашего обработчика за proxy или туннелем. Первым делом — сырое тело, HMAC с signing secret, сравнение константного времени; затем JSON и поля флага. При отказе подписи не вызывайте шлюз. Отладка — отдельные тестовые события; прод-секрет не в VCS.

# Псевдологика: сначала байты тела, затем JSON
RAW="$(cat)"
echo "$RAW" | openssl dgst -sha256 -hmac "$LD_SIGNING_SECRET" -binary | xxd -p
# сравнить с заголовком подписи из документации LaunchDarkly для вашего типа webhook

Объединение health-пробы и префлайта в один комментарий PR

После подписи — префлайт из того же checkout что основная сборка. Добавьте openclaw gateway status и при политике команды — выдержку openclaw doctor. Объект ld_event, openclaw, preflight; красный итог если любой блок блокирует merge. Наружу — усечённый stderr и хеш артефакта без полных путей.

Операционный конвейер не менее семи шагов

Шаг 1. Проверить Node 24 и закрепить npm install -g openclaw@2026.5.x с записью версии в артефакт.

Шаг 2. Выполнить openclaw onboard и openclaw onboard --install-daemon; убедиться что демон активен через openclaw doctor.

Шаг 3. Сохранить базовый снимок openclaw gateway status в машиночитаемом виде как эталон перед включением webhook.

Шаг 4. Настроить ingress или SSH-туннель к приёмнику и выписать allowlist источников LaunchDarkly согласно их документации по диапазонам.

Шаг 5. Реализовать проверку подписи по сырому телу и связать успешное событие с триггером префлайта зависимостей.

Шаг 6. Объединить JSON статуса шлюза и результат префлайта; при ошибке префлайта не отправлять «зелёный» статус во внешнюю систему даже если шлюз формально готов.

Шаг 7. Отправить сводку в SCM с повторами 2 / 4 / 8 с, потолком три попытки и отдельным журналом для кодов 401 и 408.

Три опорные цифры для отчёта руководству: доля событий LD прошедших проверку подписи с первого раза; p95 длительности префлайта на Apple Silicon; число ложных блокировок merge устранённых после разделения таймаутов сети и скрипта.

FAQ: типичные 401 и 408 в этом контуре

Почему шлюз отвечает 401 при том что LaunchDarkly уже принят?

401 на шлюзе: чаще всего OPENCLAW_GATEWAY_TOKEN не совпал между launchd и curl или отсутствует Authorization. Сверка plist и SSH через openclaw doctor.

Откуда берётся 408 при отправке сводки если префлайт локально успешен?

408 при отправке сводки: отделите connect-timeout SCM от budget префлайта; backoff три попытки прежде чем звать инфраструктуру.

Нужно ли заново гонять doctor после каждого события LD?

Достаточно doctor по расписанию и статуса при ошибках префлайта; каждое событие LD — только при отладке нового обработчика.

Следующие шаги: блог, тарифы и помощь без входа

Откройте список статей блога без авторизации, перейдите на тарифы узла Apple Silicon и оформите аренду; справка по доступу и SSH — в центре помощи. Для обзора платформы начните с главной страницы MacPull.

Удалённый Mac под webhook-колодцы и префлайт зависимостей

Закрепите узел рядом с вашим egress и повторите цепочку OpenClaw без обязательного входа на маркетинговые страницы MacPull.