← back to Wallco Ai
UNPUBLISHED-CENSUS-2026-06-01.md
86 lines
# Unpublished-Designs Census — 2026-06-01
Read-only census of `all_designs` on Mac2 `dw_unified` (the catalog-authoring DB).
Purpose: turn the vague "~15.4k unpublished pile" TODO into a data-backed
bulk-publish decision. **Nothing was published or modified — census only.**
> Numbers drift as the standing generator keeps producing. Re-run the SQL at the
> bottom for a fresh count.
## Headline
- **Total unpublished (`is_published IS NOT TRUE`): 40,107**
- **Publishable *right now*: 18** (quality-clean **and** has a TIF archive)
- The rest is either deliberately removed, gated by another surface, or **TIF-blocked**.
## Breakdown by reason (mutually-prioritized buckets)
| Reason | Count | Disposition |
|--------|------:|-------------|
| `user_removed` | 23,445 | Deliberately culled — **leave removed** (resurrecting needs explicit Steve OK) |
| `other_gateheld` (no flag) | 12,432 | Unpublished with no clear gate reason — **needs a "why" probe** before assuming publishable |
| `edges_fail` (notes `EDGES_FAIL`/`EDGES_SCAN_ERROR`) | 1,799 | Seam defects → `/admin/edges-review` |
| `bleed_ghost` (`settlement_verdict LIKE 'BLEED%'`, incl. OK+BLOCK) | 1,592 | Bleed/ghost quality verdict |
| `needs_fixing` (`needs_fixing_at` set) | 182 | Flagged for fix |
| `settlement_review` (BLOCK/REVIEW-VISION-ERROR/REVIEW) | 161 | Legal gate → CNCP Settlement panel |
| `clean_but_unpublished` | 496 | Passed everything in the prioritized pass, just unpublished |
## The real publish decision: a TIF bottleneck, not a publish toggle
Independent of the prioritized buckets, **1,553** designs are quality-clean
(`settlement_verdict` OK or `BLEED_GHOST_OK`, not `user_removed`, no
`needs_fixing_at`, no `EDGES_FAIL` note). But wallco's hard rule **refuses a NULL
`tif_path`** at publish (CLAUDE.md: "TIFs are full-size archives… the publish
gate refuses NULL tif_path"). So:
- **with TIF → publishable now: 18**
- **no TIF → TIF-blocked: 1,535**
So "bulk-publish the pile" decomposes into two very different asks:
1. **Publish the 18 ready-now** — small, safe; needs Steve's curation pick + deploy.
2. **Unlock the 1,535** — requires committing to a **TIF-archive generation run first**
(150 dpi, up to ~36000×19800 px / ~2 GB each — real time + storage), *then* publish.
### Top categories among the 1,553 quality-clean candidates
`drunk-animals` 304 · `damask` 135 · `stripe · forest-loden` 21 ·
`face-skull-damask · greenhouse-glass` 20 · `dogs · german-shorthaired-pointer` 20 ·
`face-skull-damask · saddle-mocha` 19 · `stripe · antique-brass` 19 · `dogs · dachshund` 19
## Caveats
- **Clean ≠ should-publish.** These passed the automated gates; they still need
Steve's curation eye + a TIF before going live. The 18 "ready-now" are the only
ones that clear the gate mechanically.
- **`user_removed` (23,445)** are intentional removals — do not bulk-resurrect.
- **`other_gateheld` (12,432)** is the biggest unknown — unpublished with no flag.
Could be never-curated, TIF-less, mural-misclassified, etc. Probe before acting.
- Gated surfaces (edges/bleed/settlement) own their own review queues.
## Reusable SQL (run with `PGHOST=/tmp PGUSER=stevestudio2 PGDATABASE=dw_unified psql -tAc "…"`)
```sql
-- total unpublished
SELECT count(*) FROM all_designs WHERE is_published IS NOT TRUE;
-- breakdown by reason
WITH u AS (SELECT * FROM all_designs WHERE is_published IS NOT TRUE)
SELECT reason, count(*) FROM (
SELECT CASE
WHEN user_removed THEN '1_user_removed'
WHEN settlement_verdict IN ('BLOCK','REVIEW-VISION-ERROR','REVIEW','NEEDS REVIEW') THEN '2_settlement_review'
WHEN settlement_verdict LIKE 'BLEED%' THEN '3_bleed_ghost'
WHEN notes LIKE '%EDGES_FAIL%' OR notes LIKE '%EDGES_SCAN_ERROR%' THEN '4_edges_fail'
WHEN needs_fixing_at IS NOT NULL THEN '5_needs_fixing'
WHEN settlement_verdict IN ('OK','BLEED_GHOST_OK') THEN '6_clean_but_unpublished'
ELSE '7_other_gateheld'
END AS reason FROM u
) x GROUP BY reason ORDER BY reason;
-- publishable-now (quality-clean AND has TIF)
SELECT count(*) FROM all_designs
WHERE is_published IS NOT TRUE AND user_removed IS NOT TRUE AND needs_fixing_at IS NULL
AND settlement_verdict IN ('OK','BLEED_GHOST_OK')
AND (notes IS NULL OR notes NOT LIKE '%EDGES_FAIL%')
AND COALESCE(tif_path,'') <> '';
```