# Wishdeal Factory buyer-path - iteration 39 ship log

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

## What shipped

5 items. Em-dash hardening source #15 + visible money-back guarantee on every unlock page + durable .bak cleanup cron.

### Money-back guarantee on unlock pages (conversion UX)

A buyer about to spend $5 should see a refund guarantee at the exact moment of decision. Before today, the 30-day refund policy was only visible on `/factory/terms/`  -  buyers had to click away from the unlock page to discover it.

**Shipped**: small line directly below the unlock CTA buttons on all 202 `/unlock/<slug>/` pages: "30-day money-back guarantee. Terms." The Terms link goes to `/factory/terms/`. Muted JetBrains Mono font, low-key visual presence so it doesn't compete with the CTAs.

Patched at the generator source (`regen-unlock-pages.py`) so the line stays on every regen.

**Verified across 4 products:** all show the guarantee. End-to-end confirmed.

### Em-dash source #15: financial-analysis.sh

Iter 38 found em-dashes regenerating in `/builds/<slug>/financials.html` files. Investigation revealed those are written by `financial-analysis.sh` (shell script with inline Python heredoc), NOT by `regen-financials-page.py` (which writes the top-level `/financials/index.html`).

**Patched** the inline Python to strip dashes before writing:
```python
html_doc = (html_doc or "").replace(" - ", " - ").replace("-", "-")
with open(html_out, "w") as f:
    f.write(html_doc)
```

Total em-dash-safe sources now: **15** (10 Python + 2 shell scripts + 3 injectors).

### Mass em-dash sweep

59 em-dashes had re-accumulated in 15 files (new financials.html files + various index pages). Mass sweep + factory-wide audit shows 0 em-dashes across all 2600+ HTML files.

### Weekly .bak cleanup cron

Iter 38 was a one-time .bak purge. This iter makes it durable:
```cron
0 4 * * 0 find /home/ubuntu/factory/director -name "*.bak.*" -mtime +14 -delete && find /srv/sites/factory -name "*.bak.*" -mtime +14 -delete
```

Runs Sundays at 4am, deletes .bak files older than 14 days. .bak files less than 14 days old stay (recent backups, useful for rollback).

### End-to-end verification

- 4 sample unlock pages: 200 OK, money-back guarantee visible
- 0 em-dashes factory-wide (2600+ HTML files)
- Health check: 59/59 passing at 7ms avg
- Link audit: 11 broken (all admin/log surface, no buyer-facing impact)

## Files changed inventory

### Modified (durable, source-level)
- `/home/ubuntu/factory/director/regen-unlock-pages.py` (money-back guarantee + 30-day terms link)
- `/home/ubuntu/factory/director/financial-analysis.sh` (em-dash strip in inline Python)

### Re-rendered
- 202 `/srv/sites/factory/unlock/<slug>/index.html` (money-back guarantee + objection handler re-injected via post-regen hook)

### In-place patched
- 15 files (59 em-dashes stripped)

### New cron
- Weekly .bak cleanup (Sundays 4am, files >14 days old)

All `.bak` backups preserved.

## Why this matters

The money-back guarantee at the CTA moment is real conversion infrastructure. A $5 decision is small but still has friction. Visible 30-day refund reduces that friction.

The em-dash discipline now extends to 15 sources. The financial-analysis.sh patch closes another generator that was leaking dashes every time a new product was financially analyzed.

The .bak cleanup cron is preventive: rather than letting backup files accumulate indefinitely, they age out after 14 days.

## Status snapshot

- 200+ products in catalog (Director still ticking)
- 62 buyer-facing pages
- 10 audience landing pages
- 59/59 health endpoints passing, avg 7ms
- Sitemap: 1359+ URLs
- Link audit: 11 broken (admin/log only)
- **0 em-dashes across 2600+ HTML files**, durably enforced at 15 sources
- Weekly .bak cleanup automated

## 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. **Trust signal on unlock page hero** - currently only `/builds/<slug>/` has the rich trust block. Adding a condensed version to `/unlock/<slug>/` hero would reinforce decision-moment.
2. **Hero-polish second pass** - Claude CLI on bottom-50 Adoptability products.
3. **Per-product /how-it-works/ sub-page** - lightweight new content surface.
4. **Catalog card hover preview** - hover shows first line of dossier teaser.
5. **Audit and refresh /factory/today/, /factory/hotlist/, /factory/founders/** - low-trafficked pages that may have stale content.

## Cumulative iter 1-39

The factory's surface is genuinely tight, durable, and buyer-ready:
- 200+ products with full buyer-path artifacts
- 62 buyer-facing pages, 10 audience entry points
- Per-product objection handlers + trust signals + previews + graduated proof
- 59/59 health endpoints, 11 broken links (admin only)
- **0 em-dashes across all 2600+ HTML files, durably enforced at 15 generator+script sources**
- Money-back guarantee visible at every unlock decision moment
- Weekly .bak cleanup running automatically

Surface quality is genuinely strong. Remaining work is Wes-side: Stripe + traffic push.
