# Wishdeal Factory buyer-path - iteration 35 ship log

**Date:** 2026-05-10 (continued autonomous /loop)

## What shipped

5 substantial items. Catalog UX upgrade: visible freshness signals + recency sort.

### NEW badge on catalog cards

The catalog had no visible signal showing which products were recently shipped. A buyer returning to the page couldn't tell which ideas were new this week vs which had been there for days.

**Shipped**: a `NEW` badge that appears on the 42 catalog cards for products first-shipped in the last 48 hours. Threshold is configurable.

Recency derived from the OLDEST file mtime across stable per-product files:
- `financials.json`
- `elevator.mp3`
- `agent-spec.md`
- `outreach-ready.md`
- `screenshot.png`

These files are rarely re-touched by injectors, so their oldest mtime approximates "first shipped" better than `index.html` (which is touched hourly by injectors).

Threshold chosen: 48 hours. At 24h we had ~23 products marked NEW (12% of catalog). At 48h we have 42 (21%). 21% is enough to feel fresh, not so many it dilutes the signal.

### "Recently shipped" sort option

Added to the catalog's sort dropdown alongside Adoptability, Year-1 take-home, Year-1 ARR, and A-Z.

Implementation:
- Each card gets a `data-shipped="<unix-ts>"` attribute computed from `_first_shipped_ts(slug)` helper
- JS sort handler compares `data-shipped` values
- Patched at generator source (`regen-catalog-v2.py`) so the change survives regenerations

### Helper + CSS

New `_first_shipped_ts(slug)` helper inside catalog generator. Reusable for future features (e.g. dedicated /factory/fresh/ improvements or a "this week" cluster).

`.badge-new` CSS class: muted gold (#fff3b8 background, #9a6f00 text, subtle border). Distinct from existing badge colors. Doesn't compete with the Adoptability score in visual hierarchy.

### Em-dash discipline

0 em-dashes shipped on catalog or any iter-35 file.

## Files changed inventory

### Modified (durable, source-level)
- `/home/ubuntu/factory/director/regen-catalog-v2.py`
  - Added `_first_shipped_ts(slug)` and `_is_new(slug)` helpers
  - Added "Recently shipped" option to sort dropdown
  - Added `data-shipped` attribute to card
  - Added `.badge-new` CSS class
  - render_card now emits `<span class="badge badge-new">NEW</span>` when `_is_new(slug)` returns True

### Re-rendered
- `/srv/sites/factory/catalog/index.html` (195 cards, 42 with NEW badges, new sort option, data-shipped on all cards)

All `.bak` backups preserved.

## Why this matters

Returning visitors are a high-conversion-intent audience. Someone who's visited the catalog 3 times and seen no new content thinks the studio is dormant. A visible NEW badge on cards shipped this week signals "active, alive, worth bookmarking."

The Recently-shipped sort option lets ops-type buyers find the freshest ideas first (they tend to assume new = differentiated, even if false).

These are small UX wins individually but compounding for retention.

## Status snapshot

- 195 products in catalog (up 3 since iter 34 - Director still ticking)
- 62 buyer-facing pages
- 10 audience landing pages
- 59/59 health endpoints passing, avg 20ms
- Sitemap: 1341 URLs
- Link audit: 10 broken (1 admin/log surface; up 2 from iter 34 because Director shipped new products and some sub-pages haven't been generated yet)
- 0 em-dashes shipped across 35 iterations
- Director watchdog alive, ~103 cron entries

## What still needs work

Same Wes-side as before:
1. Stripe wiring (30 min)
2. Email-send for auto-fulfill
3. First real traffic push

## Next 5 recommended autonomous tasks

1. **Hero-polish second pass** - Claude CLI on bottom-50 Adoptability products.
2. **Per-product /how-it-works/ sub-page** - lightweight new content from implementation_plan + tech_stack.
3. **Catalog card hover preview** - hover shows first line of dossier teaser.
4. **Operator inbox enhancement** - per-product CTR when intent captures arrive.
5. **Sticky "shortlist" widget** on catalog - currently shortlist is a button on each card but no floating widget showing count.

## Cumulative iter 1-35

The Wishdeal Factory is now a tight marketplace with active freshness signals, ~1500 sub-pages with consistent nav, 192 products with full buyer-path artifacts, 10 audience landing pages, per-product trust signals + objection handlers + previews + graduated proof page, 59 of 59 health endpoints green, link audit at 10 broken (all admin/log surface). 0 em-dashes shipped across 35 iterations.

The product reads as a real marketplace, not a template generator. Remaining work is Wes-side: Stripe + traffic push.
