OpenClaw · Service Worker · Cache Storage · Удалённый Mac · PR · 2026

2026 OpenClaw на фронтенде:
жизненный цикл SW и дифф ключей Cache Storage на удалённом Mac → сводка в PR

15.04.2026 PWA и релизная автоматизация 10 мин чтения
Slug: 2026-openclaw-service-worker-pr-summary-remote-mac.html

Аудитория: команды, где service worker и Cache Storage ломают приёмку из‑за тихого дрейфа ключей между билдами. Ниже — воспроизводимый сценарий на удалённом Mac в связке с OpenClaw: зафиксировать границы жизненного цикла, снять отсортированный список caches.keys(), записать sw_cache_delta.json, оформить Markdown для PR и вернуть результат через шлюз с журналами уровня продакшена. Связки: чек-лист Safari и Chromium по SW, цепочка Netlify Deploy Hook, метрики сборки в PR. Англоязычная версия: English article.

01 Зачем парсить service worker с удалённого Mac

Истина по WebKit и таймингам install / waiting надёжнее на Apple Silicon, чем на обезличенном Linux. Удалённый Mac держит те же версии Safari, что у заказчиков, и не засыпает, пока OpenClaw опрашивает navigator.serviceWorker.

Каждый проход складывайте в .openclaw/reports/ небольшой JSON: CI, чат и GitHub тогда делят один контракт фактов, а не скриншоты из мессенджера.

02 Три боли, которые снимает этот runbook

  1. Скрытый waiting: ревьюер видит активный воркер, а клиенты неделями сидят на старом кэше до жёсткого обновления.
  2. Шум ключей без смысла: после каждого деплоя меняется caches.keys(), но никто не фиксирует, какие префиксы безопасно удалять в activate.
  3. Отладка «в чат»: без NDJSON и привязки к GIT_SHA невозможно сравнить два прогона одного и того же PR.

03 Матрица: куда вкладывать автоматизацию

Подход Сила Слабость Когда выбирать
Ручной Web Inspector Точечные breakpoint Не масштабируется на каждый PR Разведка инцидента
Playwright-страница-зонд Чтение жизненного цикла из скрипта Нужны дисциплинированные ожидания Базовый путь для OpenClaw
Клиентские RUM-маяки Реальные пользователи Грубая гранулярность и приватность Мониторинг после мержа

Выбирайте зонд, если PR трогает sw.js, список precache или таблицу маршрутов. Дополняйте матрицу политиками skipWaiting и clients.claim из чек-листа по Safari.

04 Пять воспроизводимых шагов владельца

  1. Забронируйте runner: SSH на удалённый Mac, каталог ~/openclaw-runs/$PR_NUMBER, экспорт BASE_URL превью и закрепление GIT_SHA.
  2. Браузеры один раз: npx playwright install webkit, чтобы все прогоны делили один пакет WebKit.
  3. Двойной прогрев: два лёгких GET к $BASE_URL с паузой около восьми секунд, затем запуск Playwright — так чаще проявляются install и activate.
  4. Дельта на диск: .openclaw/reports/sw_cache_delta.json с лексикографически отсортированными addedKeys и removedKeys относительно baseline/sw_cache_baseline.json с main.
  5. Сводка наружу: файл pr_sw_cache_summary.md и POST в шлюз с Idempotency-Key: $GIT_SHA:sw-cache:$PR_NUMBER, чтобы хуки не плодили дубликаты в PR.

05 Скрипт-заготовка и зонд (плейсхолдер)

Сохраните как scripts/openclaw/sw-cache-probe.mjs и вызывайте из задачи OpenClaw; селекторы и origin подставьте под продукт.

import { webkit } from 'playwright';
const b = await webkit.launch();
const p = await b.newPage();
await p.goto(process.env.BASE_URL, { waitUntil: 'networkidle' });
const s = await p.evaluate(async () => {
  const r = await navigator.serviceWorker.getRegistrations();
  const k = (await caches.keys()).sort();
  return { r: r.map(x => ({ scope: x.scope, a: x.active?.state, w: x.waiting?.state, i: x.installing?.state })), k };
});
console.log(JSON.stringify(s));
await b.close();

Оборачивайте вызов shell-обёрткой: экспорт OPENCLAW_RUN_ID, вывод в tee -a .openclaw/reports/sw_probe.ndjson, чтобы облом оставлял след даже при обрыве SSH.

06 Поля NDJSON, повторы при сбоях и заметки оператора

Одна строка NDJSON на попытку; ключи согласуйте с раннером Netlify-hook, чтобы дашборды не ветвились.

  • ts, level, openclaw_run_id, git_sha, pr_number, phase из набора warmup, probe, diff, callback.
  • attempt, duration_ms, browser равный webkit или chromium, cache_key_count, булево waiting_worker_present.
  • error_class одно из timeout, quota, assert, http; плюс last_http_status, trace_path к артефакту Playwright.

Повторы: читайте только зонд и дифф при 502, 503, 429 или сбросе TLS — backoff от двух секунд, джиттер двадцать процентов, максимум пять попыток. Комментарий в GitHub без идемпотентного ключа не дублируйте.

07 Структурированные данные и план внутренних ссылок

В <head> уже заданы BlogPosting, BreadcrumbList, HowTo и FAQPage — это сигнал для расширенных сниппетов и единый контракт с английской версией slug.

  • Входящие: добавьте ссылку на этот slug из списка блога и из статей про деплой, когда меняется precache.
  • Локали: одинаковый slug на языках; hreflang публикуйте только при наличии переведённого HTML.
  • Якоря: стабильные id секций облегают регрессионные проверки и ручной аудит.

Цифры для отчёта: целевой SLA сбора артефактов до трёх минут на превью; не более пяти попыток callback; хранить не менее трёх последних sw_cache_delta.json на ветку.

08 FAQ: квота хранилища и opaque-ответы

Симптом Причина Митигация
QuotaExceededError в cache.put Бюджет origin исчерпан или много крупных opaque записей. Логируйте quotaEstimateMb, режьте версии precache, удаляйте устаревшие префиксы RELEASE_ID до конца activate.
В отчёте «0 байт» у шрифтов CDN Opaque no-cors скрывает размер в Cache API. Ведите opaqueEntryCountHint отдельно; не суммируйте байты opaque с same-origin бандлом.
POST сводки падает циклично Область токена или вторичный rate limit. Backoff с джиттером, ротация OPENCLAW_GATEWAY_TOKEN, в тело PR только URL артефактов.

По возможности переводите критичные ассеты на same-origin или явный CORS, чтобы opaque не раздувал бюджет непредсказуемо.

Удалённый Mac · честные сигналы WebKit · постоянные прогоны

Арендуйте Mac под доказательную базу по Service Worker

Linux-only CI не воспроизводит паритет Safari. Держите OpenClaw на выделенном Mac, сверяйтесь с инструкциями SSH и VNC, смотрите тарифы без входа и оформляйте аренду или покупку, когда жизненный цикл SW становится воротами релиза.

WebKit-зонды Дифф кэша Сводки в PR
Mac под SW / кэш QA