# Wishdeal Factory buyer-path - iteration 1 ship log

**Date:** 2026-05-09 (Wes's overnight session, dynamic /loop mode)

## What shipped

### New infrastructure (all on `ubuntu@40.160.2.121`)

| File | Purpose | Cron |
|---|---|---|
| `/home/ubuntu/factory/director/adoptability-score.py` | 10-axis heuristic scorer for all 170 products | `*/15` |
| `/home/ubuntu/factory/director/dossier-gen.py` | Composes per-product dossier (teaser + locked) from brand brief, financials, skeptic memos, elevator script, outreach pack | `*/30` |
| `/home/ubuntu/factory/director/regen-catalog-v2.py` | Replaces old catalog with sortable/filterable browser (170 products, badges, "Start here" + "Wes's picks") | `5,20,35,50` |
| `/home/ubuntu/factory/director/regen-unlock-pages.py` | Per-product `/factory/unlock/<slug>/` pages with Stripe placeholder + dossier teaser | `7,37` |
| `/home/ubuntu/factory/director/regen-pricing-block.py` | Idempotent injector that adds 4-tier pricing band (Browse / $5 unlock / $99 adopt / Operator partnership) to every product page | `17,47` |
| `/home/ubuntu/factory/director/regen-operator-partnership.py` | `/factory/operator-partnership/` - reframes higher-ticket as done-with-you tier, not default. Phase A/B/C scope, $2,500 - $45K range | `10,40` |
| `/home/ubuntu/factory/director/regen-honest-page.py` | `/factory/honest/` - "what you should expect" page, reduces refund risk and increases credibility | `15` (hourly) |
| `/home/ubuntu/factory/director/repair-queue.py` | Audits all 170 products on 13 buyer-path completeness checks, writes JSON + HTML dashboard for the Director to consume | `*/15` |
| `/home/ubuntu/factory/director/wes-picks.json` | Manual override for "Wes's Picks" section (slugs only, edit + cron picks up) | n/a |

### Live URLs

- https://wishdeal.com/factory/catalog/ - new buyer-facing catalog (170 ideas, filters, badges, sort by adoptability/take-home/ARR/alpha)
- https://wishdeal.com/factory/unlock/<slug>/ - 170 unlock pages, Stripe placeholder, dossier teaser
- https://wishdeal.com/factory/operator-partnership/ - done-with-you tier explainer with Phase A/B/C
- https://wishdeal.com/factory/honest/ - honest-expectations page, links from catalog footer
- https://wishdeal.com/factory/repair-queue/ - admin view of which products need what
- https://wishdeal.com/factory/dossiers/<slug>/teaser.md - public teaser markdown
- https://wishdeal.com/factory/dossiers/<slug>/full.md - locked full dossier (will need server-side gating before charging)

### Pricing block injected

The 4-tier pricing band lives at the bottom of every product page (just before `</body>`) wrapped in marker comments `WD_FACTORY_PRICING_BLOCK_v1`. Idempotent: re-running `regen-pricing-block.py` refreshes existing blocks without duplicating. 169/170 products got it on first run; the lone exception was the `AUTO/` directory which lacked a `</body>` tag (not a real product).

### Mission Control nav update

Patched `/home/ubuntu/factory/director/mission-control.py` to surface Catalog (gold-highlighted), Operator, and Honest in the top nav. Removed Financials/Agents/Today/Scorecard from the primary nav (they're still linked elsewhere).

## Adoptability snapshot

After first run:
- **170 products scored**
- **Top 5:** bookkeeper-ai (79), [next 4 ranked under it]
- Avg score not yet calculated; visible in the `/factory/catalog/` hero

10 axes weighted as follows (highest leverage first):

| Axis | Weight | Why |
|---|---|---|
| Distribution difficulty (easy = high) | 1.5 | Wes's bottleneck, not building |
| Pain intensity | 1.4 | If pain is weak, nothing else matters |
| Buyer clarity | 1.3 | Named ICP > generic "B2B" |
| Credibility | 1.2 | Pages with brand+audio+financials look adoptable |
| Financial upside | 1.1 | Yr1 ARR high, $300K = 1 unit |
| Speed to MVP | 1.0 | Archetype-derived |
| Implementation upsell | 1.0 | Operator-partnership signal |
| Landing page quality | 1.0 | composite_score from quality-summary.json |
| Uniqueness | 0.8 | Brand brief + "What This Brand IS NOT" presence |
| Market saturation (open = high) | 0.7 | Inverse of probability_of_meaningful_success |

## Repair queue snapshot

After first run, 170 products audited:
- avg completeness: **78%**
- fully complete: **1 product**
- biggest gaps:
  - has_outreach: 168 missing
  - has_email_drip: 128 missing
  - has_faq: 106 missing
  - has_skeptic_memo: 80 missing
  - has_brand_brief: 2 missing
  - has_landing: 1 missing
  - has_adopt_cta: 1 missing (the `AUTO` directory, not a real product)

## What's now better for buyers

1. **Catalog is browsable.** Was a static page advertising "47 products" (actually has 170). Now: real-time filterable browser, badges, sort, search, "Start here" section.
2. **The buyer journey has 4 named tiers** with clear price points and CTAs on every product page.
3. **The unlock proposition is concrete.** Every product has a `/factory/unlock/<slug>/` page that lists exactly what the $5 buys (16 dossier sections itemized).
4. **Honesty is a feature.** The `/factory/honest/` page sets expectations: distribution is the hard part, most ideas don't win, no live customer revenue claimed.
5. **Operator partnership is a tier, not the front-end offer.** Phased Phase A/B/C scope with explicit price ranges keeps the $5 unlock as the entry point.
6. **The Director can self-heal.** `repair-queue.json` is a queue the Director's loop-v2.sh can consume to prioritize "fix the biggest buyer-path gap" over "build another product."
7. **Adoptability separated from quality.** The catalog now ranks by "easiest to adopt and ship," not by "prettiest landing page."
8. **Stripe placeholders are env-gated.** When `FACTORY_STRIPE_UNLOCK_URL` and `FACTORY_STRIPE_ADOPT_URL` env vars are set, every unlock page becomes a live checkout. Until then, the "Coming soon" modal directs to email or operator partnership.

## What still needs work

- **Stripe wiring.** Two checkout URLs need creating in Wes's Stripe dashboard. Then export the env vars and the next cron tick swaps placeholders for live checkouts.
- **Magic-link delivery for the dossier.** Right now `full.md` is at a public URL. Before charging, that needs gating: a signed token or session cookie or just emailing the markdown post-payment.
- **Dossier content quality.** The generator composes from existing artifacts; if a product has no skeptic memo or no email drip, that section says "(not yet generated)." Director's repair queue can fill these systematically.
- **Top-product polish.** The top 10-20 by Adoptability need a manual copy pass: sharpen ICP, remove generic language, add who-this-is-for/not-for sections, improve hero claims.
- **Outreach launcher page.** The `/factory/outreach/` directory exists with a single index.html but no actionable launcher. Next iteration: read every `outreach-ready.md`, render copy-LinkedIn / copy-email / open-Gmail-draft buttons with prospect tracking.
- **Director loop hooks.** `loop-v2.sh` needs a new action type (e.g. P. consume_repair_queue) that reads `repair-queue.json` and queues the most-incomplete product for the next polish tick.

## Next 5 recommended autonomous tasks

1. **Outreach launcher.** Walk every `outreach-ready.md`, render a per-product launcher with copy-buttons, Gmail draft URLs, and "mark contacted/interested/not fit" buttons. No auto-send.
2. **Top-20 manual copy pass.** Take the 20 highest-adoptability products and run a Claude-CLI editor over their hero copy, ICP statement, and "who this is for" section. Replace generic language with the specific buyer named in the brand brief.
3. **Director repair-queue action.** Add action P (consume_repair_queue) to `loop-v2.sh` so the Director picks the most-incomplete product and either generates email-drip / outreach / faq for it, or queues a Foreman pass. Highest-impact: 168 products are missing outreach packs.
4. **Stripe checkout wiring.** Create the two products in Stripe ($5 dossier unlock, $99-199 adopt build). Export env vars. Add a webhook receiver at `/factory/api/stripe-webhook` that emails the dossier link after payment.
5. **Visual polish sweep on top 10.** Replace any product page that still uses studio-default Fraunces+Inter with its declared brand palette. Verify hero, screenshot, badge bar, and pricing block all use the per-product `--accent` variable correctly.

## Files changed inventory

- New: 8 Python generators + 1 JSON
- New: `/srv/sites/factory/catalog/index.html` (replaces old catalog, 213KB)
- New: `/srv/sites/factory/operator-partnership/index.html`
- New: `/srv/sites/factory/honest/index.html`
- New: `/srv/sites/factory/repair-queue/index.html`
- New: `/srv/sites/factory/repair-queue.json`
- New: `/srv/sites/factory/adoptability.json`
- New: `/srv/sites/factory/dossiers/<170 dirs>/teaser.md` and `full.md`
- New: `/srv/sites/factory/unlock/<170 dirs>/index.html`
- New: `/srv/sites/factory/unlock/index.html`
- Modified: 169 product `index.html` files (pricing block injection)
- Modified: `/home/ubuntu/factory/director/mission-control.py` (nav update + backup at `.bak.before-buyer-nav`)
- Modified: crontab (8 new entries)
