目標人群:要把 Android .9.png 從「手動打開檢查」改成流水線閘門的遊戲/UI 交付與建置工程。做法:在遠端 Mac跑 OpenClaw 守護邏輯(或等價常駐編排器)監聽設計工具匯出目錄,事件進來後先防抖再原子搬移到工作區,對外圈 1px 做黑線像素(僅純黑標記與透明)掃描,並用命名模板與體積閾值表擋掉半成品與異常大檔;失敗走分類重試,稽核寫 JSONL 並歸檔輪轉日誌。規範細節可對照9-patch 像素與 M4 驗收清單;佇列與日誌骨架可併讀監聽、重試與日誌歸檔。
守護與資料夾監聽思路
重點不是「某個單一魔法指令」,而是契約化目錄:匯出器只寫入 inbox,守護行程負責穩定寫入檢測(例如連續兩次 stat 大小相同、間隔可設定),通過後以更名或硬連結移入 work,避免多 worker 同讀半成品。OpenClaw 一側把「目錄事件 → 步驟模板」寫死:觸發條件、校驗腳本路徑、閾值檔、重試政策都只允許版本庫內審過的片段,縮小工具權限面。安裝與隔離參考全平台安裝與PNG 批量 QA中的閘道習慣。
可複現步驟
- 凍結目錄樹:
inbox/work/ok/failed/quarantine/logs/archive;寫入與讀取權限僅給專用帳號。 - 對齊匯出路徑:在 Figma/Sketch 外掛或內部工具設定「完成後一律落地 inbox」,禁止直接寫 ok。
- 監聽入列:檔案關閉或靜默視窗達標後產生
trace_id,單飛鎖保證同一檔案佇列不重疊。 - 校驗鏈:先
file/pngcheck(若可用)確認 PNG 完整性,再跑外圈黑線掃描與檔名正則,最後比對體積閾值。 - 分流:全過進
ok;規則性錯誤進failed附manifest.json;疑似半寫入進quarantine可重試。 - 水位聯動:剩餘磁碟低於閾值時暫停從 inbox 出列,僅允許清理與歸檔。
驗收閾值表
下列數值為團隊可自行調整的契約範例;寫入 thresholds.yaml 供 OpenClaw 步驟模板讀取,避免對話裡臨改數字。
| 檢查項 | 建議閾值/規則 | 未過閘行為 |
|---|---|---|
| 外圈 1px 標記格 | 僅 RGBA(0,0,0,255) 或 Alpha=0;其餘外圈格 Alpha=0 | failed,不可自動重試 |
| 最小尺寸 | 寬與高均 ≥ 3 px | failed |
| 檔名模板(範例) | ^[a-z0-9_]+__(mdpi|hdpi|xhdpi|xxhdpi|xxxhdpi)\.9\.png$ |
failed |
| 單檔體積 | min_bytes 2048;max_bytes 依密度分桶(例:mdpi 80KiB、xxhdpi 512KiB) |
quarantine → 退避重試 3 次後 failed |
| 磁碟剩餘 | ≥ 8 GiB 才允許新任務入列 | 暫停出列並寫告警 JSONL |
| 單批併發 | 同時解碼 ≤ 4 張 9-patch | 佇列等待,避免記憶體尖峰 |
可執行占位命令
以下為 zsh 占位:把 /path/to/validate_ninepatch.py 換成團隊倉庫中的實作(建議用 Pillow/pngdecode 只讀外圈環帶,避免整圖載入過大素材時記憶體膨脹)。命名規範可與監聽後批量重命名銜接。
# 0) 環境變數(依實際使用者與卷調整)
export NINE_IN="${HOME}/design_export/9patch_inbox"
export NINE_WORK="${HOME}/png_jobs/9patch_work"
export NINE_OK="${HOME}/png_jobs/9patch_ok"
export NINE_FAIL="${HOME}/png_jobs/9patch_failed"
export NINE_LOGS="${HOME}/png_jobs/9patch_logs"
mkdir -p "$NINE_IN" "$NINE_WORK" "$NINE_OK" "$NINE_FAIL" "$NINE_LOGS/archive"
# 1) 手動單檔驗收占位(通過則 echo OK)
f="$NINE_IN/example__xhdpi.9.png"
test -f "$f" && /usr/bin/python3 /path/to/validate_ninepatch.py --config "$HOME/png_jobs/thresholds.yaml" --in "$f"
# 2) 批量掃描 inbox 占位(實際應由守護行程逐檔入列)
find "$NINE_IN" -maxdepth 1 -name '*.9.png' -type f -print0 | xargs -0 -n1 -I{} \
/usr/bin/python3 /path/to/validate_ninepatch.py --config "$HOME/png_jobs/thresholds.yaml" --in "{}"
# 3) 體積快速篩檢(bytes;閾值請對照 YAML)
/usr/bin/stat -f%z "$f"
# 4) 日誌行占位(JSONL;欄位可依稽核需求擴充)
/usr/bin/python3 -c 'import json,time; print(json.dumps({"ts":time.time(),"event":"ninepatch_ok","file":"'"$f"'"}))' >> "$NINE_LOGS/audit.jsonl"
# 5) 日誌歸檔占位(按大小輪轉示例;生產可改用 newsyslog/logrotate)
/usr/bin/tar -czf "$NINE_LOGS/archive/audit-$(date +%Y%m%d%H%M).tgz" -C "$NINE_LOGS" audit.jsonl && : > "$NINE_LOGS/audit.jsonl"
失敗重試與日誌歸檔
可重試:I/O 暫時失敗、校驗腳本逾時、體積在「疑似未完成寫入」區間——採指數退避(例如 2s/4s/8s 封頂 60s),並設最大嘗試。不可重試:外圈出現灰階半透明、檔名不符、結構非 PNG——直接 failed,避免無意義重試刷爆 CPU。每次嘗試寫一行 JSONL:trace_id、檔名、錯誤碼、第幾次嘗試、磁碟剩餘;舊檔按大小或按日壓縮進 archive,與批處理監聽與歸檔同一套運維節奏即可。
FAQ
為何強調遠端 Mac?筆電休眠會斷監聽;專用節點可長開機、固定路徑與 TCC 授權,利於審計。
OpenClaw 要寫哪些「不可變」設定?監聽根路徑、允許的 shell/Python 腳本指紋、閾值檔版本號、最大併發與退避參數。
9-patch 與普通 PNG 質檢差在哪?多一道外圈語意檢查:標記只能是離散的「黑/透明」,普通全圖對比度演算法不足以替代。
上線清單
- inbox→work 搬移是否原子、單飛鎖是否生效。
thresholds.yaml是否納入版本庫並與 CI 一致。- 黑線掃描對「角點透明」「四邊全空」等邊界樣本是否已單測。
- failed 目錄是否含可讀 manifest,方便美術回改。
- 磁碟水位與日誌輪轉是否在乾淨節點演練過。
- 守護行程開機自啟與崩潰自動拉起(例如 launchd)是否配置。