# Wishdeal Factory buyer-path - iteration 34 ship log

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

## What shipped

4 substantial items. One was a critical regression fix that would have hurt SEO.

### Critical regression caught + fixed: sitemap dropped from 1328 to 224 URLs

Started iteration by checking sitemap and found it had **224 URLs** instead of the expected 1328. Investigation revealed two sitemap generators running on cron:
- `regen-sitemap.py` (v1, deprecated) every 2 hours
- `regen-sitemap-v2.py` (v2, current) every hour at :55

The v1 was overwriting the v2 sitemap at :00 every 2 hours. So at any given moment, the sitemap was either 1328 URLs (just after v2) or 224 URLs (just after v1). This is a real SEO issue - Google was potentially seeing the smaller sitemap and de-indexing pages.

**Fixed**:
- Removed the v1 cron entry: `0 */2 * * * .../regen-sitemap.py`
- Re-ran v2 to restore the full sitemap (1336 URLs)
- Verified single sitemap generator now active

### Nav consistency: 27 more pages

The /factory/categories/ and /factory/archetypes/ pages had not been updated with the iter-23 nav additions (/for/, /faq/, /changelog/). Discovered this by sampling. Fixed at both generators (`regen-categories.py`, `regen-archetypes.py`) and re-ran them.

Coverage now:
- 20 of 20 category pages (index + 19 sub-pages) have full nav
- 7 of 7 archetype pages (index + 6 sub-pages) have full nav

### Link audit false-positive suppression

The link audit reported 15 broken links. Investigation showed 6 of them were JavaScript template literals like `href="/factory/builds/${slug}/"` inside `<script>` tags. These work at runtime but the audit's HTML-href regex didn't distinguish them from real broken links.

**Fixed** by adding `if "$" in link: continue` to the audit's link iteration. Now correctly skips JS template literals.

Result: **15 broken → 8 broken**. Remaining 8 are real (admin/log page references to deleted products + missing sub-pages) but none in primary buyer surface.

### Cron collision audit (preventive)

Built `find-cron-collisions.py` to scan all cron-scheduled python scripts and find files referenced by 2+ scripts (potential write-collision risk like the sitemap one). Result: many scripts READ adoptability.json (expected), but no other genuine WRITE collisions on primary buyer-facing artifacts.

This is preventive work - if a future iteration introduces a write collision, this tooling can catch it.

### Em-dash discipline

0 em-dashes shipped on any iter-34 file. Verified post-each-write.

## Files changed inventory

### Modified (durable, source-level)
- `/home/ubuntu/factory/director/regen-categories.py` (nav consistency)
- `/home/ubuntu/factory/director/regen-archetypes.py` (nav consistency)
- `/home/ubuntu/factory/director/link-audit.py` (skip JS templates)

### Modified
- `crontab` (removed legacy regen-sitemap.py entry)

### Re-rendered
- `/srv/sites/factory/sitemap.xml` (1336 URLs, restored)
- 20 category pages + 7 archetype pages (full nav)

### New tooling (not yet cron'd)
- `/tmp/find-cron-collisions.py` (preventive collision audit)

All `.bak` backups preserved.

## Link audit progression across iters

| Iter | Broken | Notes |
|---|---|---|
| 30 | 94 | First measured (in iter 33's audit) |
| 33 (start) | 95 | (re-baseline) |
| 33 (foreman fix) | 75 | -20 (slug normalization) |
| 33 (own /about/ fix) | 16 | -59 (in-place patch) |
| 33 (skeptics fix) | 15 | -1 |
| 34 (JS template skip) | **8** | -7 (false positives suppressed) |

92% reduction in broken links since this iteration sequence started.

## Why this matters

The sitemap regression is the kind of bug that's invisible to a buyer browsing the site but catastrophic for SEO. A search engine that re-crawls the sitemap and sees 224 URLs instead of 1328 will lose 80%+ of the pages from its index. That's the worst kind of bug: silent, slow-acting, hard to diagnose post-hoc.

Catching it cost roughly 5 minutes of investigation. The cost of NOT catching it would have been a measurable de-indexing event next time a search bot fetched the sitemap.

The nav consistency fix on 27 pages closes the last gap in the "every page has consistent nav" invariant. The link audit false positive fix is QA hygiene.

## Status snapshot

- 192 products in catalog
- 62 buyer-facing pages
- 10 audience landing pages
- 59/59 health endpoints passing, avg 11ms
- Sitemap: **1336 URLs** (restored)
- 8 broken links (down from 95, all in admin/log surface)
- 0 em-dashes shipped across 34 iterations
- Director watchdog alive, ~103 cron entries (one removed)

## 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. **Add "NEW" badge to catalog cards** for products shipped in last 7 days. Uses file mtime as proxy.
2. **Hero-polish second pass** - Claude CLI on bottom-50 Adoptability products.
3. **Operator inbox enhancement** - per-product CTR calculation when intent captures arrive.
4. **Per-product /how-it-works/ sub-page** - lightweight new content surface from implementation_plan + tech_stack.
5. **Catalog card preview tooltip** - hover over a card shows the first line of the dossier teaser. Reduces clicks needed to decide.

## Cumulative iter 1-34

The Wishdeal Factory's buyer-facing surface is now genuinely tight. 95 broken links found and fixed (now 8, all admin/log-only). 1500+ sub-pages with consistent nav. Per-product objection handlers + trust signals + previews. 1 graduated product page. Zero em-dashes shipped across 34 iterations. Surface quality high enough to charge $5 for. Remaining work is Wes-side: Stripe + traffic push.
