AppIcon.appiconset の PNG と Contents.json の不一致は、深夜ビルドで噴きやすい火種です。リモート Mac 上の OpenClaw で実測ピクセルと JSON を 一括突き合わせ、Markdown 修正レポートを残す 2026 再現手順です。監視または launchd に繋げば デザイン納品の自動検収が安定します。pt/スケール対照は iOS アイコン納品マトリクス と併読してください。
ズレが起きる典型原因
- スケール計算ミス(コピーのみでピクセル未再計算)
- JSON 未更新(リネーム後の filename 不整合・孤児 PNG)
- 静かな 1px 変化(最適化・余白で辺長だけズレる)
マージ前ゲートでレポート 1 行に閉じ込め、直前炎上を防ぎます。
自動化の形の選び方
| モード | 向いている場面 | トレードオフ |
|---|---|---|
| 手動 CLI | 申請直前のスポット監査 | 軽いが忘れやすい |
| OpenClaw + 監視 | 共有 リモート Mac の inbox 投入 | デバウンスで部分書き込みを避ける |
OpenClaw + launchd |
定時バッチ | 次実行までわずかに遅延 |
インストール・設定・実行(5 手順)
- OpenClaw 導入、
jq、sipsの寸法取得を確認。 APPICON_DIR/REPORT_PATHを環境変数化。レポート先頭にgit rev-parse HEAD。plutil -lint Contents.jsonで構文を先に潰す。images[]のfilename行からsize×scale(整数倍率)で期待 px を算出。sips実測と diff、不一致は Markdown に追記し終了コード非 0 でゲート。
監視フックとバッチ用スクリプト例
監視:inbox 静止後に work→検証→out/failed。バッチ:*.appiconset をループしレポート連結。
#!/usr/bin/env bash
set -euo pipefail
DIR="${1:?path to AppIcon.appiconset}"
REPORT="${2:-./appicon_validation_report.md}"
JSON="$DIR/Contents.json"
{
echo "# AppIcon validation"
echo "- host: $(hostname)"
echo "- path: $DIR"
echo ""
echo "| filename | expected | actual | status |"
echo "|---|---:|---:|---|"
} > "$REPORT"
while read -r name w h; do
[[ -z "${name:-}" ]] && continue
fp="$DIR/$name"
if [[ ! -f "$fp" ]]; then
echo "| $name | ${w}x${h} | missing | FIX: ファイル追加 |" >> "$REPORT"
continue
fi
read -r aw ah < <(sips -g pixelWidth -g pixelHeight "$fp" \
| awk '/pixelWidth/ {w=$2} /pixelHeight/ {print w, $2}')
if [[ "$aw" -eq "$w" && "$ah" -eq "$h" ]]; then
echo "| $name | ${w}x${h} | ${aw}x${ah} | OK |" >> "$REPORT"
else
echo "| $name | ${w}x${h} | ${aw}x${ah} | FIX: 再書き出し |" >> "$REPORT"
fi
done < <(jq -r '.images[] | select(.filename!=null)
| [.filename,
((.size|split("x")[0]|tonumber) * (.scale|sub("x";"")|tonumber)),
((.size|split("x")[1]|tonumber) * (.scale|sub("x";"")|tonumber))]
| @tsv' "$JSON")
echo "Wrote $REPORT"
jq フィルタは ipad 専用行や scale 欠落に応じて拡張し、期待値は常に JSON から導出します。寸法が揃った後は PNG 一括 QA でアルファ・ICC・バイト上限を積み上げます。
倍率は 1×/2×/3× → 辺長に 1・2・3。監視は 30〜60 秒デバウンス、レポートは logs/ に履歴を残すと diff しやすいです。
FAQ:よくあるエラー
jq/JSON パースエラー
plutil -lint、コンフリクト記号・BOM 除去。
sips 失敗
0 バイト・誤拡張子・書き込み途中。静止ウィンドウと .done 併用。
寸法 OK だが Xcode が怒る
idiom/1024 アルファ/ターゲット要件は別。幾何ゲートは第一段。
検証を リモート Mac に寄せ、ノートの夜間占有を避けます。