← back to Designer Wallcoverings
onboarding/sangetsu-lilycolor/scripts/sangetsu-enrich-guarded.sh
45 lines
#!/bin/bash
# Per-PATTERN Sangetsu enrichment (styles/color-hex/material/patterns/imageType)
# on the local representative-image cache — same swap-guarded, memory-safe pacing
# as the Lilycolor runner so it never forces inference under pressure.
# 623 rep images (one per pattern) → ~4h. Pillow hex + ollama vision, $0 local.
# Resumable (seeds off rows already in the output). Reversible (JSONL only).
set -u
PROJ="$HOME/Projects/Designer-Wallcoverings/onboarding/sangetsu-lilycolor"; cd "$PROJ" || exit 1
ST="$PROJ/staging"
CACHE="$HOME/dw-sangetsu-images-local"
OUT="$ST/sangetsu-enrichment.jsonl"
CONT_ABOVE_MB=1800 # box has headroom now; resume when swap free > this
STOP_BELOW_MB=800 # pause when swap free < this
log(){ echo "[sg-guard $(date '+%H:%M:%S')] $*" >> "$ST/sangetsu-enrich-guard.log"; }
swap_free_mb(){ sysctl -n vm.swapusage 2>/dev/null | sed -E 's/.*free = ([0-9.]+)M.*/\1/' | cut -d. -f1; }
[ -d "$CACHE" ] || { log "FATAL cache missing $CACHE"; exit 1; }
log "start. cache=$(ls -1 "$CACHE"/*.jpg 2>/dev/null | wc -l | tr -d ' ') imgs done=$(wc -l < "$OUT" 2>/dev/null | tr -d ' ')"
# wait for headroom before launching
while true; do
fm=$(swap_free_mb); fm=${fm:-0}
[ "$fm" -gt "$CONT_ABOVE_MB" ] && break
log "waiting for headroom (swap free ${fm}M < ${CONT_ABOVE_MB}M)"; sleep 30
done
log "headroom OK (swap $(swap_free_mb)M) — launching"
ENRICH_HENRY_DIR="$CACHE" ENRICH_SANGETSU_DIR="/nonexistent" ENRICH_SHARD_COUNT=1 \
ENRICH_OLLAMA_URL=http://127.0.0.1:11434 ENRICH_VL_MAX=768 ENRICH_DONE_SEEDS="$OUT" \
python3 -u scripts/enrich-full.py "$OUT" >> "$ST/sangetsu-enrich-guard.log" 2>&1 &
DPID=$!
log "driver PID $DPID launched (swap-paced)"
paused=0
while kill -0 "$DPID" 2>/dev/null; do
fm=$(swap_free_mb); fm=${fm:-0}
if [ "$paused" -eq 0 ] && [ "$fm" -lt "$STOP_BELOW_MB" ]; then
kill -STOP "$DPID" 2>/dev/null; paused=1; log "PAUSE (swap ${fm}M)"
elif [ "$paused" -eq 1 ] && [ "$fm" -gt "$CONT_ABOVE_MB" ]; then
kill -CONT "$DPID" 2>/dev/null; paused=0; log "RESUME (swap ${fm}M)"
fi
sleep 5
done
log "driver exited. rows=$(wc -l < "$OUT" 2>/dev/null | tr -d ' ')"; touch "$ST/SANGETSU-ENRICH-DONE"; log "DONE"