Unity の SpriteAtlas から吐き出した PNG 図集を、納品前にPOT(幅・高さが 2 の冪)・RGBA 透過・max_bytesで機械検査する手順です。リモート Mac上で OpenClaw Gateway から狭いツール面だけを開き、監視とバッチを同じ README に固定します。
ディレクトリ監視戦略 · バッチコマンドテンプレート · 失敗時のリトライとログアーカイブ · トラブルシューティング FAQ
前提の整理は スプライト納品マトリクス、ログ形は 監視・リトライ・ログ保管、圧縮の別径は pngquant/zopflipng と接続してください。
ディレクトリ監視戦略
例として、Unity プロジェクト直下に Exports/SpriteAtlas/ を切り、Editor スクリプトで atlas_ui_512.png.tmp へ書き込み後に mv で .png に確定させます。監視対象は ローカル NVMe の絶対パスに限定し、クラウド同期フォルダ直書きは避けます。
brew install fswatch 後、イベントは 無音窓(例:12 秒間新規イベントなし)でまとめ、ジョブ ID を JSONL に載せます。単一フライトのロックファイルで、連続ビルドでも検査ワーカーは常に一本にします。Gateway から起動する場合は インストール手順でパスとトークンを非対話シェルと揃え、許可ツリーを Exports と logs に絞ります。
バッチコマンドテンプレート
下記は「列挙→寸法とチャンネル→バイト」の順に固定した最小例です。MAX_BYTES と透過契約(require_alpha=1 なら rgba 必須)を環境変数で渡します。
#!/usr/bin/env bash
set -euo pipefail
ROOT="${ATLAS_EXPORT_ROOT:?}"
MAX_BYTES="${MAX_BYTES:-1200000}"
REQUIRE_ALPHA="${REQUIRE_ALPHA:-1}"
is_pot() { local n="$1"; [[ "$n" =~ ^[0-9]+$ ]] && (( (n > 0) && (n & (n-1)) == 0 )); }
while IFS= read -r -d '' f; do
[[ "$f" == *.png ]] || continue
w=$(magick identify -format '%w' "$f")
h=$(magick identify -format '%h' "$f")
ch=$(magick identify -format '%[channels]' "$f")
bytes=$(stat -f%z "$f")
ok=1
is_pot "$w" || ok=0
is_pot "$h" || ok=0
[[ "$REQUIRE_ALPHA" == "1" && "$ch" != *rgba* ]] && ok=0
(( bytes <= MAX_BYTES )) || ok=0
printf '{"file":"%s","w":%s,"h":%s,"channels":"%s","bytes":%s,"ok":%s}\n' \
"$f" "$w" "$h" "$ch" "$bytes" "$ok" >> "${LOG_DIR:-./logs}/atlas-scan.jsonl"
done < <(find "$ROOT" -type f -name '*.png' -print0)
ok=0 の行は quarantine/ へ移し、Slack やメールは OpenClaw 側の通知スキルに任せます。ショートカット連携の骨格は Gateway×ショートカットを参照してください。
失敗時のリトライとログアーカイブ
I/O 一時障害のみ指数バックオフ(例:2s,4s,8s 上限 60s)で再試行し、POT 不一致やチャンネル違反は自動再試行せず隔離して人が Unity プリセットを直す流れに分けます。JSONL は日次で gzip し、archive/YYYY-MM-DD/ へ移動。成功ジョブは一行サマリのみ残し、失敗は reason_code(pot/alpha/size)を付与します。
トラブルシューティング FAQ
寸法は POT だが中身がぼやける:参照解像度と Pixels Per Unit の組合せ問題で、検査ゲートとは別レイヤです。README に期待 PPU を明記します。同一ファイルでサイズだけ日々変動:圧縮設定の揺れなので、ビルドターゲット固定と中央値ベースライン比較を YAML に追加します。夜間だけ失敗:ホストのスリープと外付けボリュームのマウント解除を疑い、launchd の ThrottleInterval とログローテを確認します。
まとめ:.tmp 完了リネーム、無音窓+単一フライト、magick identify と stat の二段ゲート、理由コード付き隔離と JSONL gzip。契約導線は 購入・レンタル・料金・接続ガイド(ログイン不要)。