← back to Wallco Ai
data/yolo-overnight/dedupe-skull-20260525-1136.md
92 lines
# Dedupe scan — face-skull-damask (overnight)
- **Run**: 2026-05-25 04:36 PDT (2026-05-25T11:36Z)
- **Endpoint**: `POST http://127.0.0.1:9905/api/dedupe/scan`
- **Algorithm**: dHash (8x8 difference hash, 64-bit) + union-find clustering
- **Working dir**: `/root/Projects/wallco-ai` (app at `/root/public-projects/wallco-ai`, PM2 `wallco-ai` pid 1890751)
---
## 1. Literal request — `{status:'published', category:'face-skull-damask', threshold:6, limit:500}`
```
HTTP 200 · scanned=0 · clusters=0 · time_ms=0 · threshold=6
{"ok":true,"clusters":[],"scanned":0,"time_ms":0}
```
**Finding — category does not exist.** `face-skull-damask` is not a value in `spoon_all_designs.category` for any row (published or unpublished). The closest match is bare `damask`, which has **31 rows, all `is_published=FALSE`** — so even relaxing the status filter to `unpublished` would yield no skull/face composite. No `%skull%` or `%face%` categories exist at all in the wallco.ai brand slice.
| Token searched | Categories matched | Published count |
|---|---|---|
| `%skull%` | — | 0 |
| `%face%` | — | 0 |
| `%damask%` | `damask` | 0 (31 unpublished) |
| literal `face-skull-damask` | — | 0 |
This looks like a stale category name in the overnight prompt (or a category that was planned but never landed). Recommend confirming the intended slug.
---
## 2. Fallback — same params, **no category filter** (the only actionable signal in scope)
```
HTTP 200 · scanned=202 · clusters=11 · time_ms=6832 · threshold=6
```
Top 10 clusters (sorted by dupe count, keeper = lowest id):
| # | Keeper id | Keeper category | Pattern | Dupes | Cluster size |
|---|---|---|---|---|---|
| 1 | **10123** | `cactus-11ft-mural` | Olive Sketch — 15 tonal recolors of parent p38890 | 10124–10136, 10150*-not-here | 15 |
| 2 | **10137** | `tree-mural` | Honey Reverie — 15 tonal recolors of parent p38909 | 10138–10150, 10146*-not-here | 15 |
| 3 | **10152** | `cactus-11ft-mural` | Noir Atelier neutral/charcoal + parent 38900 photo | 10153, 38900 | 3 |
| 4 | **39055** | `cactus-pine-scenic` | Sonoran cactus pass-3 + Gracie-language recolors | 39103, 39105 | 3 |
| 5 | **39101** | `cactus-pine-scenic` | Gracie celadon + ivory-on-black + eucalyptus | 39106, 39107 | 3 |
| 6 | **125** | `thibaut` | Norfolk Stripe Charcoal vs. Chocolate (DWTT-80162 vs -80151) | 127 | 2 |
| 7 | **140** | `thibaut` | Japanese Garden Wedgewood vs Navy (DWTT-80798 vs -80799) | 141 | 2 |
| 8 | **10151** | `cactus-11ft-mural` | Honey Folio charcoal + parent 38868 photo | 38868 | 2 |
| 9 | **10154** | `monterey-mural` | Ash Reverie neutral vs. charcoal | 10155 | 2 |
| 10 | **10161** | `cactus-pine-scenic` | Honey Reverie Bottega+Hermès recolor + fix-of-10159 | 10166 | 2 |
### Notes on the clusters
- **#1, #2** are the dominant signal — two full **13-colorway tonal sets** (`recolor_..._{family}` files) that hash-identical because the recolor preserves luminance/composition. dHash by design treats tonal variants as the same image, so this is expected and *not* a deletion candidate. Soft-archive policy should keep one keeper per parent (10123, 10137) and flag the colorway siblings as `parent_design_id` instead of standalone publishes. ~28 of 202 published rows (≈14%) are duplicates of this kind.
- **#3, #8** pair a tonal child against the **original photo parent** (38900, 38868). That *is* a publishing bug — the original generator output shouldn't be live alongside its recolor. Worth a manual look.
- **#6, #7** are Thibaut wallpaper sample swatches where the only thing changing is color tone on a stripe/floral pattern; dHash can't distinguish color. Don't dedupe — these are legitimate distinct SKUs.
- **#10** flags the `fix_10159` patch image alongside the Bottega recolor — confirms the fix worked (visually identical to source). Safe to archive the fix once verified, but not destructive without approval.
---
## 3. Recommended next actions (no destructive ops taken — soft-archive default per YOLO rules)
1. **Confirm category slug.** Is the intended target `damask` (31 unpublished)? Or a not-yet-landed `face-skull-damask`? If the latter, the overnight prompt needs updating once the category exists.
2. **Re-link orphaned tonal recolors** in clusters #1 and #2 — set `parent_design_id` on the 28 sibling rows pointing at 10123/10137, so the gallery groups them.
3. **Manual review on clusters #3 and #8** — the original raw-generator output (id 38868, 38900) is live next to its polished tonal recolor. One should be unpublished.
4. **Do NOT** dedupe Thibaut sample pairs (#6, #7) — color-only variants are real product distinctions.
5. **Re-run with `threshold=8`** to surface composition-similar (different-colorway) duplicates beyond the strict ≤6 Hamming-distance cutoff, once the right category exists.
---
## 4. Raw response (full)
```json
{
"ok": true,
"clusters": [
{ "keeper_id": 10123, "dupes": [10124,10125,10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10150] },
{ "keeper_id": 10137, "dupes": [10138,10139,10140,10141,10142,10143,10144,10145,10146,10147,10148,10149] },
{ "keeper_id": 10152, "dupes": [10153,38900] },
{ "keeper_id": 39055, "dupes": [39103,39105] },
{ "keeper_id": 39101, "dupes": [39106,39107] },
{ "keeper_id": 125, "dupes": [127] },
{ "keeper_id": 140, "dupes": [141] },
{ "keeper_id": 10151, "dupes": [38868] },
{ "keeper_id": 10154, "dupes": [10155] },
{ "keeper_id": 10161, "dupes": [10166] }
],
"scanned": 202,
"time_ms": 6832,
"threshold": 6
}
```