Public : tech art et creative ops qui livrent des atlas PNG packés par SpriteAtlas sur un Mac distant (build farm ou worker loué), sans ouvrir Unity à chaque livraison. Résultat : une vigie qui transforme chaque drop de fichiers en job d’inspection : dimensions POT (puissances de deux) lorsque le moteur cible l’exige, alpha alignée sur le contrat (opaque vs détourage), octets sous plafond. Prérequis : OpenClaw installé comme sur le guide multiplateforme ; pour la chaîne retry et archives, calquez-vous sur le HowTo surveillance PNG, retry et logs.
Sommaire
Stratégie d’écoute de répertoire
1) Fixer le contrat de chemin côté Unity. Dans Project Settings → Editor → Sprite Packer (selon version), activez le mode Always Pack Atlas pour forcer la génération lors des builds ciblés. Créez un dossier de sortie stable sur le Mac distant, par exemple ~/unity_jobs/atlas_out/<projet>/<build_id>, référencé par un script de post-build ou un emplacement de cache partagé documenté dans le README du dépôt. Évitez iCloud Desktop : les écritures fantômes cassent le décompte.
2) Déclencher sur « calme fichier » plutôt que sur la première écriture. Unity réécrit souvent le même PNG en rafale. Pattern éprouvé : fswatch -o "$WATCH_DIR" (Homebrew) ou WatchPaths sous launchd, puis attente de 45–90 s sans mtime changeant sur le lot *.png du build_id courant. Ignorez .DS_Store, *.tmp, fichiers zéro octet.
3) Single-flight par build. Posez un verrou flock sur ~/unity_jobs/locks/atlas_${build_id}.lock avant d’appeler la compétence OpenClaw qui encapsule vos scripts — deux watchers sans mutex doublent les jobs et corrompent les JSONL. Pour une vue d’ensemble des vigies PNG, voir aussi Skills UI et vigie export.
Exemple minimal de variable d’environnement partagée :
export ATLAS_OUT="$HOME/unity_jobs/atlas_out/demo_proj/${BUILD_ID:?}"
export JOB_SPEC="$HOME/unity_jobs/jobs/${BUILD_ID}.yaml"
Modèles de commandes batch
Les contrôles ci-dessous supposent macOS avec sips (base) et, en option, ImageMagick magick identify -verbose pour lire les chunks PNG (tRNS, alpha un associé, profil ICC).
POT — vérifier que largeur et hauteur sont des puissances de deux (zsh, test bitwise fiable) :
is_pot() {
local n=$1
(( n > 0 && (n & (n - 1)) == 0 ))
}
pot_png() {
local w h
w=$(sips -g pixelWidth "$1" | awk '/pixelWidth/ {print $2}')
h=$(sips -g pixelHeight "$1" | awk '/pixelHeight/{print $2}')
is_pot "$w" && is_pot "$h"
}
Alpha — détecter la présence d’un canal alpha (heuristique rapide avec identify) :
magick identify -format '%[channels]' "$png" | grep -q 'a' && echo HAS_ALPHA || echo NO_ALPHA
Si vos sprites UI doivent être 100 % opaques, combinez la sonde ci-dessus avec une lecture de histogramme ou un test de pixels entièrement opaques sur un sous-échantillon pour éviter les faux négatifs sur PNG 8 bits avec tRNS.
Seuil octets — refuser les fichiers trop lourds pour le CDN :
max_bytes=5242880 # 5 MiB exemple
bytes=$(stat -f%z "$png")
[ "$bytes" -le "$max_bytes" ] || { echo "OVERSIZE $png $bytes"; exit 3; }
Emballez ces trois blocs dans un script atlas_inspect.zsh versionné ; la compétence OpenClaw n’exécute que ce script + un validateur de job.yaml (seuils max_file_bytes, max_total_bytes, drapeau require_pot: true, expect_alpha: optional|required|forbidden). Pour la compression aval, reliez à la matrice pngquant / zopflipng une fois les garde-fous structurels verts.
Exemple de job.yaml (lot 20260423.2, UI mobile WebGL) :
build_id: "20260423.2"
atlas_glob: "/Users/worker/unity_jobs/atlas_out/demo_proj/20260423.2/*.png"
require_pot: true
expect_alpha: "required"
max_file_bytes: 5242880
max_total_bytes: 25165824
debounce_seconds: 60
free_disk_gb_floor: 20
Échecs, nouvelles tentatives et archivage des journaux
Classification. Transient : fichier encore ouvert par Unity, verrou NFS court — backoff exponentiel + jitter, plafond 3 tentatives. Data : PNG non POT alors que require_pot: true, alpha interdite mais détectée — pas de retry aveugle : déplacez le lot vers ~/unity_jobs/quarantine/<build_id> et ouvrez un ticket avec le chemin exact.
JSONL minimal par tentative :
{
"ts":"2026-04-23T10:12:33Z",
"trace_id":"atlas-demo-7f3a",
"build_id":"20260423.2",
"png":".../atlas_ui.png",
"pot_pass":false,
"alpha_state":"HAS_ALPHA",
"bytes":6123456,
"class":"data",
"message":"width 1536 not POT"
}
Rotation quotidienne ~/unity_jobs/logs/$(date +%F).jsonl, gzip des fichiers > 14 jours, promotion des lots pass vers archive/AAAA-MM/build_id/ avec copie du YAML et du JSONL. Si df -g passe sous le plancher convenu, la vigie se met en pause avant tout nouvel atlas — même logique que sur la vigie séquence PNG.
FAQ de dépannage
Les dimensions dans l’inspecteur Unity sont POT mais mon script refuse le PNG : pourquoi ?
Le fichier exporté peut différer du sprite source (padding, mip strip, rescale plateforme). Fiez-vous au fichier sur disque lu par sips, pas à la prévisualisation d’éditeur.
Dois-je exiger POT pour tous les jeux ?
Non — encodez la règle dans job.yaml par cible (mobile WebGL strict vs desktop). L’inspection doit refléter le contrat produit, pas un dogme.
magick absent sur le worker : alternative ?
Restez sur sips pour la géométrie ; pour l’alpha, un petit outil Python avec Pillow figé dans un venv dédié suffit — référencez son chemin absolu dans la plist.
OpenClaw 401 uniquement depuis launchd ?
Harmonisez TOKEN_FILE, HOME et PATH (Homebrew) entre session SSH et EnvironmentVariables de la plist ; testez avec sudo -u worker zsh -lc 'curl …'.
Synthèse : figez le dossier d’export SpriteAtlas, débouncez, vérifiez POT/alpha/octets avec des scripts versionnés, tracez en JSONL et ne retentez que les fautes transitoires. Pages sans compte : louer ou acheter un worker, tarifs, aide SSH/VNC, autres articles sur le blog.
Automatiser l’inspection SpriteAtlas sur un Mac distant
Isolez la vigie des postes créatifs, figez OpenClaw et les scripts sur Apple Silicon, partagez les YAML de seuils entre équipes.