[object Object]

← back to Wallco Ai

seam-wave: retire 54076+54266 (glassware-dominant, unrescuable) — exclude list auto-subtracted + animal-forward pre-filter documented

1dc9a01b38d81439eb2536ed28c5dc061d30cf93 · 2026-06-11 18:37:23 -0700 · Steve Abrams

Files touched

Diff

commit 1dc9a01b38d81439eb2536ed28c5dc061d30cf93
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jun 11 18:37:23 2026 -0700

    seam-wave: retire 54076+54266 (glassware-dominant, unrescuable) — exclude list auto-subtracted + animal-forward pre-filter documented
---
 SEAM-WAVE-RUNBOOK.md       |  9 +++++++++
 data/seam-wave-exclude.txt | 12 ++++++++++++
 scripts/seam-wave.sh       | 16 ++++++++++++++--
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/SEAM-WAVE-RUNBOOK.md b/SEAM-WAVE-RUNBOOK.md
index 0f8e1d7..0a2a7ba 100644
--- a/SEAM-WAVE-RUNBOOK.md
+++ b/SEAM-WAVE-RUNBOOK.md
@@ -40,6 +40,15 @@ The 85 roots already in the curator each have a PASS candidate — they're **don
 Generate the list from a seam scan of published roots, then write the FAIL ids
 (one per line), excluding any root that already has a PASS candidate in
 `data/seam-fix-queue.jsonl`:
+
+> **Pre-filter for ANIMAL-FORWARD roots (proven, 2026-06-12).** The
+> ControlNet-anchored pipeline only rescues roots where the animal is the
+> *dominant* structure. Glassware-dominant / animal-minority roots are
+> unrescuable — every clean-seamless roll loses the animal (subject-gate=NO over
+> 24+ attempts on 54076 orangutan + 54266 frog, now retired). When building the
+> manifest, drop roots where the animal isn't the dominant element. Retired roots
+> live in `data/seam-wave-exclude.txt` and `seam-wave.sh` auto-subtracts them, but
+> pre-filtering at manifest-build time saves wasted waves.
 ```bash
 # example — confirm the right scanner + exact output format next session
 python3 scripts/edges-batch-scan.py        # or fuzzy_seam_scan.py / seam_break_scan.py
diff --git a/data/seam-wave-exclude.txt b/data/seam-wave-exclude.txt
new file mode 100644
index 0000000..08fd18c
--- /dev/null
+++ b/data/seam-wave-exclude.txt
@@ -0,0 +1,12 @@
+# seam-wave-exclude.txt — roots RETIRED from the seam-fix redo set.
+# scripts/seam-wave.sh subtracts these from the manifest before every wave.
+# One root id per line; '#'-comments and blanks ignored.
+#
+# WHY these are here: the ControlNet-anchored pipeline can only rescue roots
+# where the ANIMAL is the dominant structure. These roots are glassware-dominant
+# / animal-minority — the canny anchor locks onto the glassware, so every
+# clean-seamless roll loses the animal (subject-gate=NO across 24+ attempts).
+# Steve retired them 2026-06-12. See SEAM-WAVE-RUNBOOK.md "Build the manifest".
+
+54076   # orangutan — wine-glass-dominant; best roll PASS-seamless but no animal
+54266   # tree frog — champagne-coupe-dominant; best roll PASS-seamless but no animal
diff --git a/scripts/seam-wave.sh b/scripts/seam-wave.sh
index 96972c7..a598691 100755
--- a/scripts/seam-wave.sh
+++ b/scripts/seam-wave.sh
@@ -33,6 +33,7 @@ cd "$(dirname "$0")/.."
 WAVE_SIZE="${WAVE_SIZE:-20}"
 GEN="${SEAM_GENERATOR:-scripts/controlnet-anchored-redo.py}"
 MANIFEST="data/seam-wave-roots.txt"          # one root id per line; '#'-comments ok
+EXCLUDE="data/seam-wave-exclude.txt"         # retired roots — subtracted from manifest
 STATE="data/seam-wave-state.json"            # {"nextIndex":N} — how far we've gotten
 LEDGER="data/seam-wave-ledger.jsonl"         # append-only audit of every wave
 FLAG="data/seam-sample-approved.flag"        # you create this after curating the sample
@@ -45,9 +46,19 @@ read_roots() {
   [ -f "$MANIFEST" ] || return 0
   grep -vE '^\s*(#|$)' "$MANIFEST" | tr -d ' \t' || true
 }
+# retired roots to subtract (glassware-dominant / unrescuable — see exclude file)
+declare -A EXCL=()
+if [ -f "$EXCLUDE" ]; then
+  while IFS= read -r e; do [ -n "$e" ] && EXCL["$e"]=1; done < <(grep -vE '^\s*(#|$)' "$EXCLUDE" | sed 's/[[:space:]]*#.*//' | tr -d ' \t')
+fi
 ALL_ROOTS=()
-while IFS= read -r r; do [ -n "$r" ] && ALL_ROOTS+=("$r"); done < <(read_roots)
+while IFS= read -r r; do
+  [ -z "$r" ] && continue
+  [ -n "${EXCL[$r]:-}" ] && continue   # skip retired roots
+  ALL_ROOTS+=("$r")
+done < <(read_roots)
 TOTAL="${#ALL_ROOTS[@]}"
+EXCL_N="${#EXCL[@]}"
 
 NEXT=0
 [ -f "$STATE" ] && NEXT="$(node -e 'try{process.stdout.write(String((require("./'"$STATE"'").nextIndex)||0))}catch(e){process.stdout.write("0")}' 2>/dev/null || echo 0)"
@@ -58,7 +69,8 @@ if [ "$MODE" = "--status" ]; then
   echo "seam-wave status"
   echo "  generator    : $GEN"
   echo "  wave size    : $WAVE_SIZE"
-  echo "  manifest     : $MANIFEST ($TOTAL roots)"
+  echo "  manifest     : $MANIFEST ($TOTAL roots after exclude)"
+  echo "  retired      : $EXCL_N roots excluded ($EXCLUDE)"
   echo "  done so far  : $NEXT"
   echo "  remaining    : $REMAINING"
   echo "  waves left   : $(( (REMAINING + WAVE_SIZE - 1) / WAVE_SIZE ))"

← 46f0778 TODO: reroll-2 STOP/REPORT — 54076+54266 structurally unreco  ·  back to Wallco Ai  ·  seam-wave: bash-3.2 compat — replace declare -A (unsupported d08b86e →