← back to Wallco Ai

data/yolo-overnight/titles-20260525-0527.md

114 lines

# Title Audit — 20 Random Published Designs

**Generated:** 2026-05-25 05:27 PT
**Working dir:** `/root/Projects/wallco-ai` (read-only data dir; source lives at `/root/public-projects/wallco-ai`)
**Source:** `spoon_all_designs` (PG `dw_unified`), `is_published=TRUE AND user_removed=FALSE`
**Population:** 212 published rows
**Sample:** 20 (random)
**Action:** Audit only — no auto-fix per task spec.

---

## Method

PG row → derive title two ways:

1. **JSON-side title** — looked up by `id` in `/root/public-projects/wallco-ai/data/designs.json` (the file the live `wallco-ai` service at `127.0.0.1:9905` actually serves from).
2. **Computed title** — `titleFor(category, dominant_hex, id)` from `server.js:655-658` using the current `NOUNS` table + `hueName()` from `lib/color.js`.

`spoon_all_designs` has **no `title` column** — titles are runtime-derived. So a "title" only fails by being computed wrong (missing/null source data) or stored stale (designs.json out of sync with current `titleFor` mapping).

### Dud heuristics

- `'undefined'` literal → never occurred in the sample (titleFor returns finite strings)
- `'wallco-####'` literal → never occurred as a **title**, but **every** published row has `handle='wallco-{id}'` (153/153 in designs.json) — that's the handle, not the title
- `Bone <Noun> No.<id>` → `dominant_hex` is `NULL`, `hueName()` falls through to `'Bone'`. Color half of the title is empty.
- `Noir <Noun> No.<id>` → low-sat hex (<6%). Often correct for charcoals but worth surfacing. Did not appear in this sample.

---

## Results

**Duds: 6 / 20 (30%)** — all `Bone` color-fallback. **Drift: 11 / 20 (55%)** — designs.json title disagrees with current `titleFor()` output (older NOUNS table).

| id | category | dominant_hex | kind | JSON title | Computed title | Status | Reason | Proposed |
|---|---|---|---|---|---|---|---|---|
| 99 | `coordonn-` | ∅ | best_seller_seed | ∅ | Bone Folio No.99 | **DUD** | hex missing | **Coordonné No.99** |
| 103 | `phillipe-romano` | ∅ | best_seller_seed | ∅ | Bone Studio No.103 | **DUD** | hex missing | **Phillipe Romano No.103** |
| 106 | `phillipe-romano` | ∅ | best_seller_seed | ∅ | Bone Sketch No.106 | **DUD** | hex missing | **Phillipe Romano No.106** |
| 121 | `koroseal` | ∅ | best_seller_seed | ∅ | Bone Studio No.121 | **DUD** | hex missing | **Koroseal No.121** |
| 131 | `coordonn-` | ∅ | best_seller_seed | ∅ | Bone Edit No.131 | **DUD** | hex missing | **Coordonné No.131** |
| 136 | `designer-wallcoverings` | ∅ | best_seller_seed | ∅ | Bone Sketch No.136 | **DUD** | hex missing | **Designer Wallcoverings No.136** |
| 10125 | `cactus-11ft-mural` | ∅ | seamless_tile | Slate Atelier No.10125 | Bone Folio No.10125 | ok (JSON), drift | recolor-family; hex null in PG | Tile No.10125 |
| 10164 | `cactus-pine-scenic` | `#392e1e` | seamless_tile | ∅ | Amber Atelier No.10164 | ok | — | Amber Tile No.10164 |
| 10166 | `cactus-pine-scenic` | `#984514` | seamless_tile | ∅ | Amber Origin No.10166 | ok | — | Amber Tile No.10166 |
| 38847 | `cactus-11ft-mural` | `#896d53` | mural | Amber Origin No.38847 | Amber Folio No.38847 | ok | drift | Amber No.38847 |
| 38862 | `cactus-11ft-mural` | `#6b5c46` | mural | Honey Origin No.38862 | Amber Atelier No.38862 | ok | drift | Amber No.38862 |
| 38883 | `cactus-11ft-mural` | `#664b37` | mural | Amber Folio No.38883 | Amber Folio No.38883 | ok | — | Amber No.38883 |
| 38886 | `cactus-11ft-mural` | `#564831` | mural | Honey Studio No.38886 | Amber Atelier No.38886 | ok | drift | Amber No.38886 |
| 38889 | `cactus-11ft-mural` | `#63643b` | mural | Olive Reverie No.38889 | Olive Folio No.38889 | ok | drift | Olive No.38889 |
| 38894 | `cactus-11ft-mural` | `#454536` | mural | Olive Reverie No.38894 | Olive Origin No.38894 | ok | drift | Olive No.38894 |
| 38897 | `cactus-11ft-mural` | `#ac8f6c` | mural | Amber Origin No.38897 | Amber Edit No.38897 | ok | drift | Amber No.38897 |
| 38919 | `tree-mural` | `#b9a986` | mural_panel | Honey Reverie No.38919 | Honey Folio No.38919 | ok | drift | Honey Scenic No.38919 |
| 38924 | `tree-mural` | `#9e9d68` | mural_panel | Olive Reverie No.38924 | Olive Origin No.38924 | ok | drift | Olive Scenic No.38924 |
| 38930 | `tree-mural` | `#4b3a27` | mural_panel | Amber Atelier No.38930 | Amber Origin No.38930 | ok | drift | Amber Scenic No.38930 |
| 39054 | `cactus-pine-scenic` | `#7d6a4f` | mural_panel | Honey Reverie No.39054 | Amber Atelier No.39054 | ok | drift | Amber Scenic No.39054 |

---

## Patterns

### 1. `Bone` color-fallback cluster (6 duds, all `best_seller_seed`)

All six dud rows are `kind=best_seller_seed` — legacy DW Shopify seed imports (`/root/public-projects/thesetdecorator/public/img/seed/*.jpg`). They have:

- `dominant_hex = NULL`
- No JSON entry (PG-only — never made it into `designs.json`)
- Hyphen-suffixed categories like `coordonn-` (trailing hyphen — probably truncated upstream)

**Root cause:** `dominant_hex` extraction never ran for `best_seller_seed` rows. They were imported as raw catalog seeds (mfr SKUs DWDC-330668, etc.) without going through the wallco generator color pipeline.

**Fix path (not applied — read-only audit):**
- Run dominant-hex extraction on the 6 `best_seller_seed` source images
- OR override `titleFor()` for `kind=best_seller_seed` to use vendor/category instead of color: `<VendorName> No.<id>` (proposed column above)
- Strip trailing hyphen from category strings (`coordonn-` → `coordonn` → `Coordonné`)

### 2. designs.json title drift (11 rows)

Every JSON title that exists was generated under an **older `NOUNS` table** or against a hex value that has since changed. Examples:

- `38886`: JSON says `Honey Studio` but current `titleFor(#564831)` → `Amber Atelier`. Hex `#564831` is HSL hue ≈ 27° → Amber, not Honey. JSON is stale.
- `38889`: JSON says `Olive Reverie` (Reverie isn't even in `NOUNS.mixed` anymore — it's in `damask`/`drunk-animals`/`mural-animals`)
- `39054`: JSON `Honey Reverie`, current `Amber Atelier`. Category `cactus-pine-scenic` falls through to `NOUNS.mixed` (not in dict) — JSON title was generated when `cactus-pine-scenic` mapped to a different pool

**Implication:** designs.json titles are **frozen snapshots**, not live. If you regenerate titles tomorrow, half the catalog gets renamed. Worth deciding whether titles should be:
- (a) **stored** at design-creation time and never recomputed (current de-facto behavior in JSON), or
- (b) **computed** on every render from current hex/category (current behavior for PG-only rows)

Mixing the two is what produces the drift.

### 3. The `wallco-{id}` handle pattern is universal (not a title bug)

153/153 published JSON rows have `handle: 'wallco-{id}'`. That's the URL slug — not the title. If a UI is showing `wallco-10123` as a title to the user, the bug is "fell back to handle when title was missing", not "title is wrong". Worth a grep for `d.title || d.handle` if that's the actual concern.

---

## Proposed title rules (forward-looking, not applied)

1. **For `kind=best_seller_seed` rows**: title = `<CategoryDisplay> No.<id>` (skip the color half — these have no hex). Six current duds get human names immediately.
2. **For `dominant_hex IS NULL` after extraction attempt**: title = `<CategoryDisplay> No.<id>` (drop `Bone`).
3. **For categories not in `NOUNS`** (`cactus-*`, `tree-*`, `coordonn-*`, vendor names, etc.): either (a) add them to `NOUNS`, or (b) skip the abstract noun and use `<Hue> <CategoryDisplay> No.<id>` — gives "Olive Tree Mural No.38924" instead of "Olive Reverie No.38924" which doesn't tell the customer it's a mural.
4. **Freeze policy**: persist title to a `title` column on first generation; never recompute. Eliminates drift.

---

## Auto-commit

Skipped — `/root/Projects/wallco-ai` is not a git repo (no `.git/`), same as prior overnight reports. The source repo at `/root/public-projects/wallco-ai` is git-tracked but no source files were modified by this audit (read-only PG + JSON inspection).

## Artifacts

- Sample (TSV, PG raw): `/tmp/wallco-20-sample.tsv`
- Evaluation (JSON): `/tmp/title-eval.json`
- This report: `data/yolo-overnight/titles-20260525-0527.md`