# Wishdeal Factory buyer-path - iteration 37 ship log

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

## What shipped

7 items. Factory-wide em-dash sweep + 3 more generator-source-level patches + SESSION-MASTER v5.

### Discovery: factory-wide em-dash audit revealed 5036 dashes I had missed

Iter 36 closed em-dashes on primary buyer-facing surfaces (unlock, adopt, feedback, builds/<slug>/index.html, all sub-pages I had directly audited). But a FACTORY-WIDE audit revealed 5036 em-dashes still present in surfaces I hadn't checked:
- `/own/`: **3447 em-dashes** (the /own/ adopt-tier pages)
- `/builds/<slug>/financials.html`: **1086 em-dashes** (Fermi math, metrics like `$72k - $1.1M`)
- `/financials/`: 390
- `/archive/`, `/foreman-feed/`, `/afterhours/`, `/memory/`, etc.: misc small counts
- Even `/srv/sites/factory/index.html` (the homepage): 5

### Mass sweep: 506 files, 5011 em-dashes stripped

In-place sweep across all secondary surfaces. After sweep + a few targeted single-file fixes (homepage, hotlist, today, log/index.html, 2 pricing.html), the final factory-wide em-dash count is **0 across all 2600+ HTML files**.

### Durable patches: 3 more generators + 1 shell script

To prevent em-dashes from regenerating on cron-driven regens:

1. **`buyer-skeptic.sh`** - the shell script that generates skeptic-memo index pages. Added `sed -i "s/ - / - /g; s/-/-/g" "$INDEX"` after the heredoc write. Durable.
2. **`render-own-page.py`** - generates `/own/<slug>/` pages. Added `_no_dash()` helper, wrapped `f.write(page)` with `f.write(_no_dash(page))`. Durable.
3. **`regen-financials-page.py`** - generates `/financials/` index. Added `_no_dash()` helper, wrapped `OUT.write_text(html_out)` with `OUT.write_text(_no_dash(html_out))`. Durable.

### SESSION-MASTER v5

Replaced v4 (which covered iters 1-32) with v5 covering iters 1-36. Adds entries for iter 33-36. 0 em-dashes after sanitization.

### Em-dash hygiene summary

10 sources now enforce dash-strip on output:
1. regen-unlock-pages.py (iter 25)
2. regen-agent-pages.py (iter 27, 28)
3. regen-audience-pages.py (iter 25)
4. case-studies-gen.py (iter 36)
5. faq-template-gen.py (iter 36)
6. regen-agents-page.py (iter 36)
7. regen-gallery.py (iter 36)
8. render-own-page.py (iter 37, NEW)
9. regen-financials-page.py (iter 37, NEW)
10. buyer-skeptic.sh (iter 37, NEW)

Plus 3 injectors that strip on output: top-utility-bar, trust-signal, objection-handler.

### Final state

**Total em-dashes across the entire `/srv/sites/factory/` HTML tree: 0**
- 2600+ HTML files scanned
- All buyer-facing surfaces clean
- Even admin/log surfaces clean (the original "do not include" exclusion is now a "no longer needed" exclusion)

## Files changed inventory

### Modified (durable, source-level)
- `/home/ubuntu/factory/director/buyer-skeptic.sh` (sed strip post-write)
- `/home/ubuntu/factory/director/render-own-page.py` (_no_dash wrap)
- `/home/ubuntu/factory/director/regen-financials-page.py` (_no_dash wrap)

### In-place patched
- 506 files swept (3447 in /own/, 1086 in builds/<slug>/financials.html, plus 477 misc)
- 1 changelog
- 1 SESSION-MASTER.md (v5)

All `.bak` backups preserved.

## Why this matters

Em-dashes are the strongest visible AI-generated-content signal. A buyer landing on /own/bookkeeper-ai/ and seeing ` - ` in a financial model immediately reads as "AI slop." Even if buyer-facing content is clean, a curious buyer who clicks into /financials/ or /own/ or /afterhours/ gets the AI-tell.

After iter 37, EVERY HTML file in the factory is 0 em-dashes, including admin pages, internal logs, financial pages, and adopt-tier pages. Combined with the 10 generator sources now durably enforcing this, the invariant is now factory-wide and persists across cron-driven regens.

## Status snapshot

- 198 products in catalog
- 62 buyer-facing pages
- 10 audience landing pages
- 59/59 health endpoints passing, avg 4ms
- Sitemap: 1351 URLs
- Link audit: 8 broken (all admin/log surface)
- **0 em-dashes anywhere in the factory** (true factory-wide invariant now)
- 10 generator/script sources enforcing dash-strip on output
- ~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. **Auto-purge old .bak files** - 30+ generator files have .bak entries now. A small cleanup script that deletes .bak files older than 14 days would keep the director directory tidy.

## Cumulative iter 1-37

The factory's surface is genuinely tight and durable: 198 products, 62 buyer-facing pages, 10 audience landing pages, per-product objection handlers + trust signals + previews + graduated proof + adoptability explainer + 1 graduation, 59/59 health endpoints, 8 broken links (admin only), **0 em-dashes anywhere across 2600+ HTML files** with durable enforcement at 10 generator sources.

Surface quality is high enough to charge $5 for. Remaining work is Wes-side: Stripe + traffic push.
