OPENCLAW_2026.4.x
SESSION_
OAUTH_CRON_FIX.

OpenClaw Gateway

После быстрых релизов OpenClaw 2026.4.x накладываются три симптома: канал ведёт себя как «новый пользователь», Control UI предупреждает об отрезанной истории при низком контексте, в логах всплывает refresh_token_reused, а cron падает по схеме без шума. Этот ранбук ставит бэкап, минимальную правку sessions.json, серийный OAuth без гонок refresh, гигиену jsonl с матрицей владельцев и поэтапную проверку doctor→probe→logs, в том числе на удалённом Mac: plist launchd и интерактивная оболочка должны видеть одинаковые OPENCLAW_*. Для команд с персональными данными фиксируйте цель обработки, поручение и место выгрузок cron — лучше объектное хранилище с политикой жизненного цикла, чем бесконечно растущие локальные каталоги.

1. Режимы отказа после быстрой итерации 4.x

Во-первых, старые session-override могут зафиксировать modelOverride или providerOverride на учётные данные, которых уже нет: один канал «забывает», остальные живы. Во-вторых, параллельные refresh с ноутбучного CLI и удалённого шлюза бьются об один OAuth refresh и дают 401 вперемешку вместо чистого offline. В-третьих, тяжёлые cron создают тысячи крошечных jsonl; холодный старт шлюза тратит секунды на перечисление файлов, что ощущается как общая вялость. В-четвёртых, разные EnvironmentVariables в launchd и в интерактивной shell выглядят как дрейф конфигурации, хотя это две правды. Назвать эти корзины до правки файлов — значит избежать разрушительного «снести всё».

В-пятых, чекпоинты уплотнения в sessions.json разрастаются, когда UI жалуется на вырезанную историю; часть команд винит модель, хотя нагрузка на диск, агрессивный pruning и слишком большие одиночные сообщения работают вместе. В-шестых, мультиагентные деревья с разными подкаталогами sessions упрощают удаление не того дерева без карты «владелец бизнеса → каталог». В-седьмых, reverse-proxy без WebSocket-заголовков имитирует порчу сессии: Control UI отваливается, а пробы канала на loopback зелёные. В-восьмых, антивирус на Windows или macOS иногда блокирует jsonl на записи и оставляет частичный JSON — всегда контрольные суммы до и после правок.

Телеметрия должна показывать версию шлюза, при необходимости git SHA для сборки из исходников, версию Node и свободное место на одном дашборде с ошибками OAuth. Без этих измерений команды гоняются за призраками между средами. Стандартизация на образах MACGPU для удалённого Mac фиксирует эти измерения на срок контракта; финансам проще линия «почасовой Mac», чем непрозрачные GPU-счета с ежемесячной сменой региона. Перечитайте материалы MACGPU про breaking-апгрейды с doctor и про управление MEMORY.md, чтобы не путать долговременные знания и эфемерное состояние сессии.

2. Матрица симптом → корень

Видно пользователюПодозреваемый путьПервая улика
Один канал «обнулил тон»Отравленный блок в sessions.jsongrep modelOverride, openclaw logs --follow
Диск занят, CPU спокоенВзрыв cron jsonldu -sh подкаталоги sessions, счётчик файлов
OAuth дёргается после смены моделиrefresh_token_reusedконсоль провайдера, openclaw models status
Схема cron отвергнутаНесовпадение payload agentTurnopenclaw cron runs --limit 20

Матрица «платный канал × персональные данные» снижает усталость от изменений. Поля тикета для корневой категории (сессия, OAuth, cron, сеть, часы) ускоряют постмортемы и не дают каждой эскалации закончиться «полным ресетом», пока не обсудили откат на diff.

3. Пять шагов восстановления

Шаг 01 Заморозить и сохранить

Остановить шлюз, скопировать sessions.json в sessions.json.bak, заархивировать всё дерево sessions вместе с openclaw.json в tarball. Не править на месте без пути восстановления. Хэш и метку времени в тикет, чтобы ревизия и mtime файловой системы потом сошлись.

Шаг 02 Минимальная JSON-хирургия

Найти наименьший битый объект для сломанного ключа канала и удалить только его. Весь индекс — только если руководство принимает полную цену re-pairing. Перед коммитом показать diff -u к резервной копии и получить подтверждение второго инженера.

cp ~/.openclaw/agents/main/sessions/sessions.json{,.bak}

Шаг 03 Сериализовать OAuth

Отозвать устаревшие refresh у провайдера, подключать хосты по одному, держать вторичные узлы остановленными, пока первичный refresh не завершён. refresh_token_reused почти всегда означает параллельные refresh, а не вредоносное ПО. Зафиксируйте, какой хост первым держит токен, чтобы ротации были аудируемы.

Шаг 04 Гигиена cron jsonl

Инвентаризировать каталоги с владельцем и политикой хранения; удалять только подтверждённо лишние истории cron; сверить указатели в sessions.json с реальными путями на диске. Затем cron list и выборка cron runs. Если задания пропали после уборки, восстановить registry JSON из бэкапа вместо ручного угадывания полей.

Шаг 05 Слоистая валидация

Запустить openclaw doctor, channels status --probe, поднять шлюз, отправить пробные сообщения. На удалённом Mac сравнить EnvironmentVariables plist с тем shell, из которого вы отлаживали; после правок — kickstart. Синхронизировать время до разрастания OAuth-ошибок.

4. Числовые пороги

Если sessions.json больше двадцати мегабайт и скан при холодном старте превышает восемь секунд p95, планируйте структурированный архив вместо бесконечного роста. Если блок канала жёстко задаёт модель, отличную от дефолтов, и сочетается с двумя ошибками OAuth, удалите блок до глобального ресета. Если jsonl больше полутора тысяч файлов и рост за семь дней тридцать процентов, переносите вывод cron в объектное хранилище или ротируйте по дате. Если смещение часов больше ста двадцати секунд — сначала чините NTP.

5b. Инструментирование (фрагменты)

Добавьте ночной cron вне OpenClaw — иронично, но полезно — который пишет du -sh по каждому поддереву sessions в метрик-файл, который уже скрейпит ваш стек. Алерт, если недельный рост к прошлой неделе выше двадцати процентов без релиза фичи. В CI — однострочник jq, ломающий сборку, если фикстуры раздувают sessions.json выше политики. Это минуты внедрения и часы экономии на инциденте, отделяя органический трафик от сбойного задания. Тегируйте измерения semver шлюза, чтобы пики автоматически совпадали с окнами деплоя. Каждая ручная правка JSON требует записи в changelog с ID тикета.

5. Кейс: тревога ИБ, причина — старый override

SOC подняли из-за подозрения на взлом; на деле блок Telegram direct всё ещё форсировал офлайн-профиль Codex. Блок убрали, OAuth прошли серийно, сервис зелёный за два часа с подписанным diff.

Пятеро инженеров обновились до 2026.4.11 и увидели WebChat и Telegram с предупреждениями об отрезанной истории при низком контексте. Инцидент закипел, пока кто-то не прогрепал sessions.json и не нашёл быстрые циклы ротации плюс устаревший modelOverride. После удаления блока и серийного OAuth симптомы исчезли. Выгрузки cron ушли в объектное хранилище, квартальная гигиена jsonl стала обязательной. Урок: JSON-diff с хэшами бьют нарративную панику и укорачивают согласование с legal.

На ретро добавили шаблоны коммуникации для руководства, которое видит только скриншоты Telegram. Договорились о тренировочном дне: в staging внедряют синтетический блок, второго дежурного пейджат и меряют время до задокументированного отката на diff. Клиенты MACGPU могут запросить образы с заранее настроенным упражнением, чтобы новички не учились на проде.

В долгую это ушло в планирование ёмкости: каждый сохранённый jsonl стоит inode и записей каталога при перечислении. Даже на APFS метаданные дороги при крошечных payload. Архивы с префиксом даты в сжатые бандлы бьют бесконечные мелкие файлы. Удалённые хосты с NVMe и плановыми окнами обслуживания делают это реальным без будильника в три часа на ноутбуке.

6. FAQ и таймбоксы

Не удаляйте весь каталог sessions без принятия полной цены re-pairing. Если Control UI требует pairing при зелёных пробах — очистите данные сайта или приватное окно и проверьте gateway.bind за reverse-proxy. doctor лучше на остановленном шлюзе, чтобы блокировки файлов не дали ложноотрицательных результатов.

Docker Desktop меняет пути: volume mount может скрыть ту же sessions.json, которую якобы правил редактор на хосте — проверяйте home внутри контейнера. Tailscale MagicDNS может путать pairing: логируйте точный URL Control UI и сравнивайте с gateway.remote.url. Апгрейд Node без перезапуска launchd часто оставляет полустарые бинарники — обновите ProgramArguments или kickstart после toolchain.

Мультирегиональные команды фиксируют, какой часовой пояс владеет определениями cron и подавляет ли heartbeat.quietHours тихие сбои; выведите эти окна на дашборд дежурства. Документируйте цепочки fallback моделей: когда Anthropic отвергает длинный контекст, агент может переключить модель и переписать метаданные сессии — этот скачок должен быть в логах до удаления блоков.

Коробка ответа: ноль–пятнадцать минут только чтение, пятнадцать–сорок пять минут воспроизвести удаления на копии, глобальный ресет только с обоснованием в тикете. Ночные изменения — четыре глаза. Квартальный стол-топ: инъекция синтетического блока, пейдж второго дежурного, замер времени до отката на diff.

7. Отрасль и вынос на Mac

В 2026 конкурентоспособных агентов будут мерить governance хранилища сессий, а не числом каналов. Относитесь к sessions.json как к версионируемой инфраструктуре рядом с MEMORY.md для долгой памяти. Удалённым Mac-шлюзам нужны снапшоты и правда plist, совпадающая с shell — иначе ноутбуки засыпают на половине OAuth. Чистые ноутбуки хватает для соло-итераций; команды с подписанными изменениями и SLA 24/7 часто переносят шлюз на хостинг Apple Silicon вроде узлов MACGPU с зафиксированными образами и мониторингом дисков.

Если вы проверили OpenClaw на Windows или Linux, но упёрлись в длительную стабильность, смежные мультимедиа-скиллы или совместимость toolchain, удалённый Mac разделяет эксперименты и всегда доступный контур управления с предсказуемым питанием. Это дополняет гигиену, а не заменяет. Чтобы владеть меньше железа и держать устойчивый шлюз, арендуйте мощность MACGPU и оставьте локальные CLI лёгкими.

Комплаенс всё чаще просит доказательства ретенции разговорных данных. Когда дампы cron лежат в объектном хранилище с lifecycle, аудитору показывают bucket policy, а не разросшийся каталог на ноутбуке. Юристы смотрят на экспорт: арендованный Mac Studio в нужной юрисдикции по DPA защитить проще, чем прыгающие GPU-регионы. Инженерия выигрывает воспроизводимость: зафиксированные образы MACGPU дают одинаковый вывод doctor в staging и prod и сужают окно обвинений после апгрейдов.

Наблюдаемость должна оборачивать старт и стоп шлюза структурными логами вне машины. Еженедельно отслеживайте холодный старт, число jsonl, размер sessions.json, таксономию ошибок OAuth и долю падений cron. Вешайте алерты на пороги из этой статьи, а не на случайные дефолты. Связывайте метрики с читаемыми тикетами, ссылающимися на хэши JSON-diff, чтобы постмортемы не скатывались в мнения.

Заметка по ёмкости: каждый сохранённый jsonl стоит inode и записей каталога; APFS платит за метаданные даже на микроскопических payload. Поэтому архивные бандлы с датой в имени бьют бесконечные мелкие файлы. Удалённые NVMe-хосты с окнами обслуживания делают архивацию практичной без ночных будильников на ноутбуках. MACGPU может включить окна в описание сервиса и снизить нагрузку на пейджер.

Итоговое сравнение: «снести всё» быстро эмоционально, дорого по контракту. Слоистая триаж, бэкапы, серийный OAuth и аккуратная чистка jsonl сохраняют аудиторский след и доверие клиентов. Если организации нужна apple-нативная стабильность без собственных стоек, аренда удалённого Mac у MACGPU — практичное дополнение к этому ранбуку. Ручные правки JSON сопровождайте ID тикета и mtime файла, чтобы ревизия и ФС совпали.

Команды комплаенса требуют еженедельные отчёты с p95 холодного старта, долей ошибок cron и классами OAuth; выход за порог открывает тикеты платформе. Ежеквартально инъектируйте синтетические отравленные блоки в staging и ведите score дежурного для отката на diff. Аварийные контакты обновляйте вместе с документацией.

Дополнительная эксплуатация: версионируйте снапшоты sessions.json тем же тегом, что и релиз шлюза, чтобы откаты не гадали, какое состояние соответствует какой бинарной версии. Назначьте каждому каналу технического и продуктового владельца, чтобы споры маркетинг–платформа не тормозили удаления. Используйте read-only диагностические учётки, которым разрешены только doctor и logs, чтобы любопытные ноутбуки не дернули OAuth случайно. Явно задокументируйте, какие переменные окружения shell действуют в интерактиве и что выставляет launchd, включая PATH и HOME при быстром переключении пользователей. Если на хосте несколько экземпляров OpenClaw, жёстко разделите рабочие каталоги и запретите общие пути sessions в документации и CI-линте. Для смешанных EU/US команд держите часовые пояса и сроки хранения в одном календаре, чтобы гигиена cron не уехала случайно за пределы окна обслуживания и не ломала пейджер.

Наконец, держите release notes и ранбук в том же VCS, что и infrastructure-as-code, чтобы rollforward был так же аудируем, как rollback. Короткие шаблоны постмортема с обязательными полями категории корневой причины, хэшами затронутых файлов и временем до первой зелёной пробы сокращают митинги и ускоряют онбординг новых инженеров.

Напоминание: бэкапы без теста восстановления — декор; раз в квартал планируйте контролируемый restore на одноразовый хост и меряйте время до доступного шлюза, явно фиксируя отклонения.

Расширенная практика эксплуатации: заведите отдельную ветку git только для артефактов диагностики (обезличенные вырезки sessions.json, вывод doctor, срезы логов) с политикой автоматического TTL, чтобы инженеры не таскали секреты в личные gist. Для гибридных сред с контейнером и нативным шлюзом держите чек-лист «две копии sessions.json» и проверяйте inode обеих перед удалением. Если вы используете несколько профилей браузера для разных рабочих пространств, явно укажите, какой профиль авторизован на Control UI, чтобы ночные OAuth не уходили в неверный профиль и не портили токены. Для команд с жёстким SLA добавьте синтетическую пробу раз в час, которая только читает health и пишет в отдельный jsonl с ротацией по дню — это дешёвый сигнал, что перечисление файлов не деградировало. При работе с удалённым Mac через Jump Host документируйте, какие порты и домены должны быть разрешены на каждом сегменте сети, чтобы инциденты не превращались в охоту за ACL. Если вы комбинируете OpenClaw с внешними очередями задач, фиксируйте идемпотентные ключи в отдельной таблице, чтобы повторные доставки не плодили дубли в sessions.json. Наконец, храните короткую «карту запахов»: какой запах лога соответствует какой корзине из раздела 1 — это ускоряет triage новичкам без чтения всего ранбука под давлением пейджера.

Ещё один слой защиты — согласованные имена резервных копий: включайте в имя файла semver шлюза и короткий хэш первых килобайт sessions.json, чтобы при откате не перепутать артефакты соседних инцидентов. Для плотно нагруженных каналов введите лимит на размер одного сообщения в политике агента и логируйте превышения отдельно, чтобы pruning не выглядел как «пропала память». Если вы используете внешний секрет-менеджер, фиксируйте в runbook, какие ключи читает только шлюз, а какие — только CLI, иначе ротация секрета превратится в гонку refresh. Для удалённого Mac арендуйте конфигурацию с заранее выделенным дисковым квотированием под jsonl и отдельным томом под логи, чтобы рост истории cron не забивал системный том и не маскировался как деградация модели. Периодически прогоняйте сравнение checksum всего дерева sessions между staging и prod на одинаковой версии — любое расхождение без объяснения должно открывать расследование, а не молчаливо копироваться. Включите в онбординг пять минут разбора реального diff из прошлого инцидента: это дешёвле любого внутреннего курса. Если команда распределена по странам, заранее определите язык тикетов и обязательные поля, чтобы постмортемы не терялись в переводе терминов OAuth.

Дополнительно полезно вести «температурный график» размера sessions.json: ежедневная точка с привязкой к числу активных каналов и среднему размеру сообщения. Резкий наклон без роста каналов почти всегда указывает на cron или на всплеск вложений, а не на модель. Для Mac Studio в аренде закрепите ответственного за обновление Xcode command line tools отдельно от обновления Node, чтобы launchd не подхватывал половинчатый runtime. Если вы используете прокси с буферизацией WebSocket, держите отдельный чек-лист заголовков и таймаутов idle, иначе «обрывы» Control UI будут маскировать реальные проблемы сессий. Внутренние чат-боты должны иметь отдельный префикс ключей в sessions.json, чтобы grep по каналам не смешивал личные и рабочие треды. Для долгих миграций между мажорными версиями OpenClaw фиксируйте двухфазный план: сначала только наблюдение и сбор метрик, затем правки — это снижает риск одновременного изменения бинарника и данных. Наконец, пусть каждый инцидент добавляет одну строку в таблицу «что сработало / что нет» по шагам ранбука: через квартал у вас появится кастомизированная версия под вашу организацию, не ломая исходный документ MACGPU.

Короткая фраза на память: сначала измерьте, потом режьте JSON, потом поднимайте шлюз — порядок дешевле любого срочного отката ночью.

Держите ссылку на этот ранбук в шаблоне инцидента как обязательное поле.