# Wishdeal Factory buyer-path - iteration 33 ship log

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

## What shipped

9 items. Major link-audit cleanup (95 broken to 15, 84% reduction) + SESSION-MASTER v4.

### Link audit deep-dive + fixes

Started iteration at 95 broken internal links. Ended at 15. **80 broken links fixed.**

#### Bug 1: foreman-feed slug normalization (20 links recovered)

`/srv/sites/factory/foreman-feed/index.html` had links like `/factory/builds/contract-ai/` (the URL-encoded full URL rendered as a slug). Source: `regen-foreman-feed.py` extracts slug from foreman report filenames like `wishdeal_com_factory_builds_contract-ai-20260510.md` but didn't normalize the prefix.

**Fixed** by adding `_normalize_slug()` helper in the generator that strips `wishdeal_com_factory_builds_` and `wishdeal_com_factory_` prefixes. Re-ran. Now links resolve to clean slugs like `/factory/builds/contract-ai/`.

#### Bug 2: /own/ pages link to non-existent /about/ sub-pages (59 pages affected)

`/own/<slug>/index.html` rendered two asset cards (Founder persona + buyer-skeptic memos) linking to `/factory/builds/<slug>/about/`. But promote-artifacts.py only generates /about/ when founder.json exists. Products with skeptic memos but no founder data still got the link card.

**Fixed at source** in `render-own-page.py`:
- Skeptic-memos card now links to `/skeptic-memos/` (which always exists when the card is rendered)
- Founder persona card now conditional on `/about/index.html` actually existing

**Fixed in-place** for the 59 already-rendered /own/ pages with broken links. Quick regex sweep that:
- Replaces the broken /about/ link in skeptic-memos cards with /skeptic-memos/
- Removes the founder persona card entirely when /about/ doesn't exist

#### Bug 3: skeptics page links to /factory/afterhours/skeptic-memos/ (1 link)

`/factory/skeptics/` (the skeptics feed) had a "Read full memo" link to `/factory/afterhours/skeptic-memos/` which doesn't exist - afterhours skeptic memos live at `/factory/builds/afterhours/skeptic-memos/`. Source: `regen-skeptics-feed.py` line 29 special-cased afterhours's `product_url` to `/factory/afterhours/` but the memo URL was built from `product_url` instead of `/builds/<slug>/`.

**Fixed at source** by introducing a separate `memo_base_url` variable that always uses `/builds/<slug>/`. afterhours product link still goes to the special promoted page; memo links resolve correctly.

### SESSION-MASTER v4

Replaced v3 (which covered iters 1-29) with v4 covering iters 1-32. ~24 hours of session work. Adds entries for iter 30 (4 new audience pages), iter 31 (/factory/adoptability/), iter 32 (/factory/graduated/). 0 em-dashes after sanitization.

### Em-dash discipline

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

## Files changed inventory

### Modified (durable, source-level)
- `/home/ubuntu/factory/director/regen-foreman-feed.py` (_normalize_slug helper)
- `/home/ubuntu/factory/director/render-own-page.py` (skeptic-memos card link + founder card conditional)
- `/home/ubuntu/factory/director/regen-skeptics-feed.py` (memo_base_url separated from product_url)

### Modified (in-place patch for already-rendered pages)
- 59 `/srv/sites/factory/own/<slug>/index.html` (broken /about/ links removed/redirected)

### Re-rendered
- `/srv/sites/factory/foreman-feed/index.html` (cleaner slugs)
- `/srv/sites/factory/skeptics/index.html` (correct memo URLs)
- `/srv/sites/factory/log/SESSION-MASTER.md` (v4)

All `.bak` backups preserved.

## Link audit state

| Iteration | Broken count | Notes |
|---|---|---|
| Iter 33 start | 95 | baseline |
| After foreman-feed fix | 75 | -20 |
| After /own/ /about/ fix | 16 | -59 |
| After skeptics afterhours fix | 15 | -1 |
| Final | **15** | 84% reduction |

Remaining 15 breakdown:
- **6 JavaScript template literals** (`${slug}`, `${p.slug}`): false positives, work at runtime
- **2 stale references** (`outbound-cadence-ai`, `sc-insights`): products that were removed/renamed; the references are in admin/log pages, not visitor-facing
- **5 missing product sub-pages** (afterhours/integrations, afterhours/security, handoff-ai/pricing, photo-ai/pricing, etc): products that don't have those particular sub-pages
- **2 missing /sales-kit/** (customer-data-platform, catering-ai)

All remaining are in admin/log pages or are false-positive JS template literals. None are in primary buyer-facing surface.

## Why this matters

A buyer browsing 192 ideas should never hit a dead-end click. Iter 26 fixed the missing top-nav class of issue (1500 pages). Iter 33 fixed the "links that exist but point to nothing" class (60+ links touched). Both are quality signals - a buyer looking around for a few minutes should not find a single broken link in primary surfaces.

## Status snapshot

- 192 products in catalog
- 62 buyer-facing pages
- 10 audience landing pages
- 59/59 health endpoints passing, avg 3ms
- Sitemap: 1328 URLs
- 0 em-dashes shipped across 33 iterations
- Link audit: 15 broken (all in admin/log/JS-templates, none in primary buyer surface)

## 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 landing pages.
2. **Suppress link-audit false positives** - update `link-audit.py` to skip URLs inside `<script>` tags (the JS template literals are noise).
3. **Operator inbox enhancement** - per-product CTR calculation when intent captures arrive.
4. **Surfacing the trust signal block on /unlock/ pages too** - currently only on /builds/, but unlock decision could also benefit.
5. **Per-product /how-it-works/ page** - lightweight new content surface; pulls implementation_plan + tech_stack.

## Cumulative iter 1-33

The factory's buyer-facing surface is now genuinely tight. 95 broken links discovered, 80 fixed (84% reduction), no em-dashes shipped, ~1500 sub-pages with consistent nav, 191 of 192 products with all 11 injection markers, 59 of 59 health endpoints green, 10 audience entry points, per-product previews + objection handlers + trust signals + graduated proof page. Remaining work is real customer feedback (requires Wes-side traffic push or Stripe).
