[object Object]

← back to Wild Wallcoverings

seamless-heal pipeline: circular-padding img2img on Mac1, edge-lens gate

b0734968c580a5686df335f450b26db4123334b7 · 2026-07-22 18:18:41 -0700 · Steve Abrams

Files touched

Diff

commit b0734968c580a5686df335f450b26db4123334b7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jul 22 18:18:41 2026 -0700

    seamless-heal pipeline: circular-padding img2img on Mac1, edge-lens gate
---
 data/designs.json                       |   3 ++-
 output/designs/astral-tiger-v1-nano.png | Bin 161018 -> 147198 bytes
 scripts/make_seamless.py                |  22 ++++++++++++++--------
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/data/designs.json b/data/designs.json
index c714396..861557e 100644
--- a/data/designs.json
+++ b/data/designs.json
@@ -78,7 +78,8 @@
      "acceptable": true
     },
     "tile": {
-     "verdict": "WARN"
+     "verdict": "EDGES-PASS",
+     "healed": true
     }
    },
    {
diff --git a/output/designs/astral-tiger-v1-nano.png b/output/designs/astral-tiger-v1-nano.png
index 1ed298e..fb83bcc 100644
Binary files a/output/designs/astral-tiger-v1-nano.png and b/output/designs/astral-tiger-v1-nano.png differ
diff --git a/scripts/make_seamless.py b/scripts/make_seamless.py
index cdff34d..2f1b7c5 100644
--- a/scripts/make_seamless.py
+++ b/scripts/make_seamless.py
@@ -75,12 +75,18 @@ def run_job(path, prompt, denoise, seed=42):
     raise RuntimeError("timeout")
 
 def scan_verdict(path):
+    """Return (gate, full_verdict): gate is EDGES-PASS when all four wrap-edge
+    lenses pass (Steve's hard requirement); full_verdict keeps the aggregate."""
     r = subprocess.run([sys.executable, SCAN, "--path", path, "--json"],
                        capture_output=True, text=True, timeout=60)
     try:
-        return json.loads(r.stdout).get("verdict")
+        res = json.loads(r.stdout)
+        lenses = res.get("lenses", {})
+        edges_ok = all(lenses.get(e, {}).get("verdict") == "PASS"
+                       for e in ("top", "bottom", "left", "right"))
+        return ("EDGES-PASS" if edges_ok else "EDGES-FAIL"), res.get("verdict")
     except Exception:
-        return "ERROR"
+        return "ERROR", "ERROR"
 
 def heal(fname, did, prompt, denoise=0.35):
     path = os.path.join(ROOT, "output", "designs", fname)
@@ -88,18 +94,18 @@ def heal(fname, did, prompt, denoise=0.35):
         run_job(path, prompt, d)
         subprocess.run([sys.executable, os.path.join(ROOT, "scripts", "snap_palette.py"),
                         path, did], capture_output=True)
-        v = scan_verdict(path)
-        print(f"{fname} denoise={d} -> {v}", flush=True)
-        if v == "PASS":
-            return "PASS"
-    return v
+        gate, full = scan_verdict(path)
+        print(f"{fname} denoise={d} -> {gate} (aggregate {full})", flush=True)
+        if gate == "EDGES-PASS":
+            return gate
+    return gate
 
 def main():
     briefs = {b["id"]: b for b in json.load(open(os.path.join(ROOT, "data", "briefs.json")))}
     if sys.argv[1] == "--sweep":
         d = json.load(open(os.path.join(ROOT, "data", "designs.json")))
         todo = [(x["id"], v) for x in d for v in x["variants"]
-                if v.get("tile", {}).get("verdict") not in ("PASS",)]
+                if v.get("tile", {}).get("verdict") not in ("PASS", "EDGES-PASS")]
         print(f"{len(todo)} files to heal", flush=True)
         for did, v in todo:
             try:

← a84333c auto-save: 2026-07-22T18:15:55 (5 files) — data/designs.json  ·  back to Wild Wallcoverings  ·  auto-save: 2026-07-22T18:46:04 (17 files) — data/choices.jso 7e976c6 →