Zielgruppe: Build- und Asset-Owner, die Android-.9.png aus Design-Tools in einen Export-Inbox-Ordner legen und auf einem dedizierten Remote Mac (Apple Silicon) deterministisch abnehmen wollen — ohne manuelles Öffnen jeder Datei.
Kernidee: OpenClaw fungiert als lang laufender Helfer mit Gateway: Dateisystem-Events werden nicht „sofort blind“ verarbeitet, sondern in entprellte Jobs mit trace_id übersetzt, durch eine kleine Queue geschickt und gegen Schwarz/Transparent-Regeln am äußeren Ring, Benennungs-Regex und Byte-Obergrenzen geprüft. Vertiefung: Nine-Patch-Liefer-Checkliste, PNG-QA im Stapel, Watch, Retry & Log-Archiv sowie Install & Batch-Validierung.
Inhaltsverzeichnis
Daemon-Denke: Watch vs. sofortige Aktion
Ein Ordner-Watch ist nur die Antenne. Produktionsreif wird die Pipeline, wenn drei Schichten getrennt bleiben: (1) Ereignis-Sammler schreibt nur Job-Metadaten (Pfad, mtime, Größe). (2) Scheduler wendet Ruhefenster und Single-Flight an, damit Burst-Exporte zu einem Job kollabieren. (3) Worker liest PNG, prüft Geometrie und den 1-Pixel-Steuerrand, schreibt strukturierte Zeilen nach logs/jobs.jsonl und verschiebt Artefakte nach out oder quarantine. OpenClaw exponiert über das Gateway narrow Scopes (Lesen unter $JOB_ROOT, feste ImageMagick/identify-Snippets aus Git), damit Remote-Sessions nicht beliebiges Shell improvisieren.
Retries gehören nur transienten Klassen: Timeouts beim Lesen, kurzzeitige Dateisperre, volles /tmp. Jede Verletzung der Nine-Patch-Spezifikation (Grauwerte 1–254 im Ring, falsche Ecken, falsches Suffix) ist permanent — dort kein Backoff-Loop, sondern Manifest + Ticket. Logs werden append-only JSONL pro Tag; nach erfolgreicher Rotation landen komprimierte Archive unter archive/YYYY-MM-DD/, damit CI und Support dieselbe Spur lesen können.
Reproduzierbare Schritte
- Job-Wurzel auf NVMe:
~/jobs/ninepatch/{inbox,work,out,failed,quarantine,logs,archive}anlegen, keine iCloud-/Dropbox-Sync-Pfade. - Namensvorlage dokumentieren: z. B.
^[a-z0-9_]+\\.9\\.png$plus optionaler Präfixdrawable-[a-z]+/im relativen Pfad — alles andere wird ignoriert oder hart abgelehnt. - Ruhefenster: 25–45 Sekunden nach letztem stabilen
SIZE-Signal, Temp-Endungen wie.tmp,~ausschließen. - Ring-Audit implementieren: oberste/unterste Zeile und linke/rechte Spalte einlesen; Pixel müssen
(R,G,B,A) ∈ {(0,0,0,255), (*,*,*,0)}im Sinne von „schwarz deckend oder komplett transparent“ erfüllen — präzise Definition im Team-README fixieren (keine „fast schwarz“-Hexes). - Volumen: pro Datei
stat -f%zgegen Bucket-Tabelle (siehe unten); zusätzlichdf -g .vor Batch-Start — unter freiem Speicher-Schwellwert keine neuen Jobs starten. - Promotion: bei grünem Gate nach
out/<build_id>/…kopieren,sha256ins Manifest; rot markierte Files nachquarantinemit JSON-Sidecar (reason_codes). - Gateway: OpenClaw an
127.0.0.1binden, Token aus nicht-interaktiver Shell identisch zumlaunchd-Plist testen — sonst wunderbare 401er bei Nachtläufen.
Platzhalter-Kommandos (anpassen, nicht copy-paste-blind)
Die folgenden Zeilen sind Baugerüste: Pfade, Regex und Schwellen müssen zu eurer Dichte-Matrix passen. Sie zeigen die Minimal-Sonden, die sich hinter OpenClaw-Tool-Allowlists gut eignen.
# 0) Verzeichnisvertrag
export JOB_ROOT="$HOME/jobs/ninepatch"
mkdir -p "$JOB_ROOT"/{inbox,work,out,failed,quarantine,logs,archive}
# 1) Ruhe + Größe prüfen (Beispiel: letzte 30s stabil)
# PLACEHOLDER: eigenes watch-Skript ersetzt fswatch/launchd-Aggregation
fswatch -o "$JOB_ROOT/inbox" | while read -r _; do sleep 35; echo "debounced tick"; done
# 2) Kandidatenliste (nur .9.png)
find "$JOB_ROOT/inbox" -type f -name '*.9.png' -print0 | xargs -0 -I{} echo "QUEUE {}"
# 3) Byte-Größe (Schwellen extern in YAML/CI)
stat -f '%z %N' "$JOB_ROOT/inbox"/*.9.png 2>/dev/null || true
# 4) Schnelle Geometrie-Sonde (ImageMagick)
magick identify -format '%w %h %f\n' "$JOB_ROOT/inbox"/*.9.png 2>/dev/null || true
# 5) Log-Zeile append-only (trace_id von eurem Orchestrator setzen)
TRACE="trace_$(date +%s)"
printf '{"trace_id":"%s","event":"queued","path":"%s"}\n' "$TRACE" "relpath/example.9.png" >> "$JOB_ROOT/logs/jobs-$(date +%F).jsonl"
# 6) Archiv-Rotation (täglich via launchd/cron)
gzip -c "$JOB_ROOT/logs/jobs-$(date +%F).jsonl" > "$JOB_ROOT/archive/jobs-$(date +%F).jsonl.gz" || true
magick-Komposition improvisieren.
Abnahme-Schwellen (Tabelle)
Die Werte sind Startpunkte für HUD-/Panel-Chrome; verschärft sie erst, wenn die False-Positive-Rate gegen null geht.
| Gate | Akzeptanz | Bei Verletzung |
|---|---|---|
| Suffix & Regex | Pfad matcht dokumentierte drawable-*-Vorlage, Dateiname endet auf .9.png |
quarantine + NAME_POLICY — kein Retry |
| Ring-Pixel | Am äußeren 1-px-Rand nur #000000 deckend oder Alpha 0; Ecken transparent | quarantine + RING_COLOR — kein Retry |
| Innenabstand | RGB-Inhalt beginnt ≥ 1 px innerhalb des Rings (kein Antialiasing unter den Saum) | Warnung oder Fail je nach Produktpolitik |
| Bytes mdpi | typisch < 120 KB pro Platte; harte Obergrenze Team-YAML | Fail Build / manuelle Review |
| Bytes xhdpi | HUD oft < 180 KB; schweres Chrome ≤ 400 KB | Fail oder Eskalation an Design |
| Freier Speicher | ≥ 20 GB frei auf dem Volume von work vor Dequeue |
Queue pausieren, Alarm an Infra |
| Tool-Timeout | Lesen/Identify < 5 s pro Datei (P95) | Retry max. 3× mit exponentiellem Backoff (2s, 8s, 32s) |
Go-Live-Checkliste (kurz)
- Pfade:
JOB_ROOTlokal, keine Cloud-Sync-Unterordner. - Single-Flight: pro inkrementellem Export nur ein aktiver Worker auf dem Zielbaum.
- Logs: JSONL mit
trace_id,sha256,bytes,reason_codes[]. - Retries: Cap und Jitter gesetzt; permanente Spec-Fehler nie backoffen.
- Gateway: Token-Pfad für
launchdund SSH identisch; rekursive Deletes außerhalbJOB_ROOTdeaktiviert. - Doku: Regex, Ruhefenster und Schwellen in
README.job.mdversioniert — gleiche Datei referenziert OpenClaw-Skills.
FAQ
Warum sehe ich intermittierend graue Pixel im Ring, obwohl Figma „schwarz“ zeigt?
Export mit Farbprofil- oder Anti-Alias-Kette. Pipeline auf eine Raster-Engine fixieren und den Checkliste-Abschnitt zu ICC in Nine-Patch PNG Remote M4 befolgen; danach erneut durch den Ring-Audit schicken.
Wie vermeide ich Doppeljobs bei schnellen Speichern?
Ruhefenster + Mutex auf relativem Pfad. Optional auf ein Done-Marker-File des Export-Tools warten, falls vorhanden.
Wo schneidet OpenClaw ein vs. eigenes launchd?
launchd startet den Agenten deterministisch beim Boot; OpenClaw bündelt Tool-Zugriff und Policy hinter Auth und Allowlists. Kombination: Daemon startet lokal, sensibler Schritt ruft nur Gateway-Snippets — siehe CLI-Ketten & Retry-Templates.
Fazit
Nine-Patch ist eine Bitmap-API — deshalb lohnt sich ein Watch-gestützter Vertrag auf dem Remote Mac: derselbe Ring-Decoder wie in Android, dieselben Byte-Schwellen wie in CI, dieselben Logs für Support und Design. Wer Watch, Queue, Retries und Archiv trennt, bekommt keine „magische Ordnerbox“, sondern eine nachweisbare Pipeline.
Nächster Schritt: Tarife und Knoten ohne Anmeldung prüfen, Remote Mac anbinden und die Job-README mit eurer Regex + Schwellentabelle versionieren — dann ist jeder Nachtlauf reproduzierbar.