2026 OpenClaw на фронтенде:
жизненный цикл SW и дифф ключей Cache Storage на удалённом Mac → сводка в PR
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
- Скрытый waiting: ревьюер видит активный воркер, а клиенты неделями сидят на старом кэше до жёсткого обновления.
- Шум ключей без смысла: после каждого деплоя меняется
caches.keys(), но никто не фиксирует, какие префиксы безопасно удалять вactivate. - Отладка «в чат»: без NDJSON и привязки к
GIT_SHAневозможно сравнить два прогона одного и того же PR.
03 Матрица: куда вкладывать автоматизацию
| Подход | Сила | Слабость | Когда выбирать |
|---|---|---|---|
| Ручной Web Inspector | Точечные breakpoint | Не масштабируется на каждый PR | Разведка инцидента |
| Playwright-страница-зонд | Чтение жизненного цикла из скрипта | Нужны дисциплинированные ожидания | Базовый путь для OpenClaw |
| Клиентские RUM-маяки | Реальные пользователи | Грубая гранулярность и приватность | Мониторинг после мержа |
Выбирайте зонд, если PR трогает sw.js, список precache или таблицу маршрутов. Дополняйте матрицу политиками skipWaiting и clients.claim из чек-листа по Safari.
04 Пять воспроизводимых шагов владельца
- Забронируйте runner: SSH на удалённый Mac, каталог
~/openclaw-runs/$PR_NUMBER, экспортBASE_URLпревью и закреплениеGIT_SHA. - Браузеры один раз:
npx playwright install webkit, чтобы все прогоны делили один пакет WebKit. - Двойной прогрев: два лёгких GET к
$BASE_URLс паузой около восьми секунд, затем запуск Playwright — так чаще проявляютсяinstallиactivate. - Дельта на диск:
.openclaw/reports/sw_cache_delta.jsonс лексикографически отсортированнымиaddedKeysиremovedKeysотносительноbaseline/sw_cache_baseline.jsonсmain. - Сводка наружу: файл
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 под доказательную базу по Service Worker
Linux-only CI не воспроизводит паритет Safari. Держите OpenClaw на выделенном Mac, сверяйтесь с инструкциями SSH и VNC, смотрите тарифы без входа и оформляйте аренду или покупку, когда жизненный цикл SW становится воротами релиза.