Для кого: команды, которые держат экспорт дизайна в каталоге, синхронизируемом через Dropbox (или аналог) на удалённом Mac, и подключают OpenClaw к приёмке PNG. Боль: появляются конфликтные копии, меняются байты во время дописывания, ломается альфа, а дежурный не понимает, какой файл канонический. Ниже — границы мониторинга, правила детектора, связка шлюза с локальным bash, журналы и повторы. Смежные runbook: «мониторинг PNG: повторы и архив логов» и «merge, launchd и ротация логов»; наборы входящих файлов — «наблюдение за наборами PNG».
Содержание
Границы мониторинга каталога в облаке
Слой синхронизации не гарантирует мгновенный локальный байт-в-байт: файл может кратковременно существовать под временным именем, а затем переименовываться в финальное asset.png. Наблюдатель файловой системы на удалённом Mac должен смотреть только на локальный путь, который Dropbox уже материализовал на APFS, а не на веб-ярлык. Практический корень (подставьте свой логин): WATCH_ROOT="$HOME/Library/CloudStorage/Dropbox" либо устаревший ~/Dropbox — зафиксируйте один канонический путь в plist launchd и в конфиге Gateway, иначе половина событий уйдёт в «тишину».
Задайте параметры, которые можно повторить в тикете: DEBOUNCE_SEC=60 (допустимо 45–90), STABLE_MS=2000 — не открывать PNG, пока три подряд проверки stat не дали одинаковый размер; MIN_BYTES=512 для отсечения пустых заготовок. Игнорируйте *.tmp, .~*, промежуточные слои Figma/Sketch, если они не входят в контракт поставки. Если дизайнер использует «онлайн-only», вынесите рабочий inbox на локальный диск и синхронизируйте только итоговую папку outbox/ — иначе OpenClaw будет ловить полупустые файлы.
Правила обнаружения конфликтных копий
Dropbox помечает коллизии разными шаблонами имени в зависимости от языка ОС и версии клиента: подстроки вроде conflicted copy, конфликтующая копия, хвост (1) рядом с базой. Соберите регулярное выражение под вашу оргполитику, например CONFLICT_REGEX='(conflicted copy|конфликтующая копия|\([0-9]+\)\.png$)', и отдельно храните список «чистых» basename, для которых нашлась более одной физической кандидатуры.
Для каждой группы кандидатов пишите в events.jsonl объект с полями basename, paths[], stat_size, mtime_iso, alpha (да/нет из magick identify -format '%[channels]'), merge_hint. Политика по умолчанию в 2026 году: не удалять автоматически ни одну копию; выставляйте decision_pending и прикладывайте краткое резюме для оператора или Skill-слияния. Если одна копия явно новее и строго больше по байтам при той же размерности холста — можно предложить prefer_larger_mtime как подсказку, но финальное решение оставьте за человеком или за явным чеклистом бренда.
| Поле инспекции | Команда / порог | Интерпретация |
|---|---|---|
| Объём на диске | stat -f%z; MAX_BYTES по SKU в манифесте |
Всплеск без изменения размеров изображения — сигнал двойной записи или конфликта метаданных |
| Прозрачность | magick identify -format '%[alpha]' |
Ожидали Blend для UI-иконки, получили Undefined — вероятен flatten при экспорте одной из копий |
| Цветность | pngcheck -v (при наличии) или magick identify -verbose |
Расхождение color-type между копиями — не объединять без перекодирования |
OpenClaw и локальные скрипты: разделение ответственности
Локальный bash/python остаётся источником детерминированных измерений: размер, время модификации, каналы, дайджест (например shasum -a 256 после стабилизации). OpenClaw Gateway на loopback агрегирует эти факты, прикладывает политику Skills и решает, создавать ли тикет, дергать уведомление или класть карантин. Контракт вызова: наблюдатель кладёт мини-пакет payload.json рядом с файлом, шлюз читает его только когда ready=true.
Токены и путь к модели держите в том же окружении, что описан в материале по установке Gateway; после merge конфигурации соблюдайте порядок «диск → reload Gateway → вооружение watch», как в чеклисте по launchd. Не смешивайте в одном процессе тяжёлый magick compare на паре конфликтов и интерактивный LLM-тур: вынесите сравнение пикселей в фон с лимитом CPU, иначе синхронизация Dropbox и очередь OpenClaw начнут упираться в теплотвод Apple Silicon.
Повторы при сбое, журналы и ротация
Классифицируйте ошибки: retry_class=transient для таймаута чтения или кратковременной блокировки файла, policy для отказа в доступе, data для битого PNG. Для transient используйте экспоненциальный бэкофф с джиттером, потолок MAX_RETRY=5. Для policy немедленно останавливайте цепочку и пишите в errors.jsonl без повторов — иначе вы заспамите Unified Log и потеряете сигнал.
Разведите потоки: подробный stdout наблюдателя и узкий errors.jsonl с полями trace_id, job_id, skill_revision. Ротацию настраивайте раздельно, чтобы «успешный» шум экспорта не вытеснил строки инцидента; ориентир по размеру stdout — тот же порядок, что в runbook по merge, то есть порядка 50–200 МБ или суточный rollover. Любой автоматический merge-кандидат обязан логировать исходные пути обеих копий до удаления или переименования.
Воспроизводимые шаги HowTo
- Инварианты: создайте
WATCH_ROOT, каталогиlogs/,quarantine/,reports/; экспортируйтеMANIFEST.csvс колонкамиsku,max_bytes,expect_alpha. - Наблюдатель: plist launchd с
WatchPathsнаWATCH_ROOT/outbox, переменнымиDEBOUNCE_SEC,STABLE_MS,CONFLICT_REGEX; запускайте воркер под тем же пользователем, который владеет файлами Dropbox. - Стабилизация: воркер ждёт «тихое окно», затем заполняет
payload.jsonи вызывает curl кhttp://127.0.0.1:<PORT>/…Gateway с заголовком корреляции. - Инспекция: bash-шаги измеряют
stat,magick identify; отклонения от манифеста помечаютqc_fail; конфликтные имена —decision_pending. - OpenClaw: Skill читает агрегированный JSON, формирует рекомендации merge (текстом), не трогая диск без явного флага оператора.
- Закрытие инцидента: оператор выбирает канонический PNG, вторичная копия уезжает в
quarantine/; в JSONL фиксируетсяresolved_byи время UTC.
Итог: облачный inbox без дисциплины превращает приёмку PNG в лотерею; связка стабилизированного watch, детектора конфликтов, локальных измерений и OpenClaw возвращает предсказуемость. Выделенный удалённый Mac снимает с дизайнерских ноутбуков нагрузку синхронизации и демонов. Публичные страницы без входа: главная MacPng, раздел технических идей, аренда узла, тарифы, помощь по SSH и VNC. Если ночной экспорт и облако неизбежны, отдельный арендованный хост с прозрачными логами дешевле ручного разбора конфликтных копий под дедлайном.