Ship log · iter #5

Iteration 5 ship log

2026-05-09 · continued autonomous /loop

On this pageWhat shipped Buyer flow now (post-iter5) What still needs work Next 5 recommended autonomous tasks Files changed inventory Cumulative iter1-iter5

Date: 2026-05-09 (continued autonomous /loop)

What shipped

New scripts on ubuntu@40.160.2.121

FilePurposeCron
hero-polish-cli.pyCalls Claude CLI on top N by Adoptability. Generates eyebrow + h1 + lede JSON to /home/ubuntu/factory/director/hero-polish/<slug>.json. Runs once manually then on-demand.manual
apply-polished-heroes.pyReads JSON output, injects polished hero block above existing hero on each product page. Idempotent marker WD_HERO_POLISH_v1.*/5
regen-feedback-page.py/factory/feedback/<slug>/ - per-product feedback form. Sentiment, 1-5 usefulness, free-text message, optional email.50 hourly
feedback-route.js + patch-api-add-feedback-stripe.pyAdds /api/feedback (POST capture, GET admin-gated read) and /api/stripe-webhook (placeholder validating signatures when STRIPE_WEBHOOK_SECRET is set, logs unsigned for inspection).one-time
regen-sitemap-v2.pyReplacement sitemap that includes catalog, pricing, fresh, compare, outreach-launcher, operator-partnership, honest, plus per-product index, pricing, faq, case-studies, about, for, vs, security, plus unlock pages.55 hourly
brand-applicator.pyReads palette-audit.json. For each "vanilla" product (top N by Adoptability), injects per-product brand override CSS (palette + typography from brand brief). Idempotent marker WD_BRAND_OVERRIDE_v1.every 4 hr

Live URLs

Polished hero examples (live now)

ProductPolished h1
bookkeeper-ai"Bookkeepers, end the close report crunch"
dispatch-ai"Dispatch managers, send the right load first time"
nurture-ai"Sales teams, stop chasing follow-ups in a Google Sheet"
roofing-ai"Estimators, clear bid backlogs before they cost you deals"

(6 more landing as Claude CLI completes the queue. Apply-polished-heroes cron picks them up every 5 min.)

Brand-applied products (10 vanilla → branded)

SlugAccentFonts
webinar-ai#4361eeSpace Grotesk + DM Sans
account-based-sales-ai#6366f1Sora + Manrope
competitor-tracker#f97316Space Grotesk + Inter
capacity-planner-ai#d95f3bSora + DM Sans
helpdesk-ai#3b6ef8Space Grotesk + Inter
procurement-ai#2d6be4Sora + Inter
unit-economics-ai#a8d92eSpace Grotesk + Inter
referral-ai#c4f135Space Grotesk + DM Sans
afterhours#a87a32Plus Jakarta Sans + Inter
api-monetization-ai#6d28d9Space Grotesk + Inter

11 vanilla products remain; the cron will re-run the applicator every 4 hours to pick up new brand briefs.

Sitemap

Regenerated with 723 URLs (up from ~150 in the older sitemap). Includes pricing, fresh, compare, outreach-launcher, operator-partnership, honest, all 172 product pages with their sub-pages, and 172 unlock pages. Excluded: admin/, api/, repair-queue/.

Stripe webhook architecture (placeholder, ready for keys)

When Wes wires Stripe:

  1. Set STRIPE_WEBHOOK_SECRET env var on factory-api service
  2. Set FACTORY_FROM_EMAIL env var
  3. Add Postmark/SendGrid integration in the mintAndSend block (TODO comment in code)
  4. Add https://wishdeal.com/factory/api/stripe-webhook as the webhook endpoint in Stripe dashboard

The receiver already:

The only thing missing is the email-send call. That's a 5-line addition once Wes picks SendGrid/Postmark.

Buyer flow now (post-iter5)

  1. Browse free at /factory/, /factory/catalog/, /factory/fresh/
  2. Compare ideas at /factory/compare/ (shortlist via localStorage)
  3. Land on a product page → see polished hero (if top 10), per-product brand override (if was vanilla), pricing band with 4 tiers, Hero Insight ("Who this is for / not for / what you'd adopt"), FAQ link
  4. Click "Unlock dossier $5" → unlock page with detailed teaser → email-capture form
  5. Email captured → JSONL at intent-capture.jsonl → Wes runs mint-dossier-link.sh <slug> and emails URL
  6. Buyer reads gated dossier at /factory/api/dossier/<slug>?t=<token> (markdown or HTML)
  7. Buyer drops feedback at /factory/feedback/<slug>/ → JSONL at feedback.jsonl
  8. WHEN STRIPE WIRES: same flow, but step 5-6 automate. Webhook → mint → email.

What still needs work

  1. Captures + Feedback unified admin. Merge /factory/admin/captures/ to also show /api/feedback data. Per-product unified view: who captured intent, who left feedback, sentiment trend.
  2. Hero polish next 10. Run hero-polish-cli.py 20 to push polish to top 20.
  3. Brand applicator on remaining 11 vanilla. Just runs the cron more aggressively or once with N=11.
  4. Operator inbox. A /factory/admin/inbox/ that shows: intent captures + feedback + Stripe webhook events + dossier-fulfillment events, all on one timeline. Becomes Wes's daily morning page.
  5. Send-dossier-from-admin. Add a button in /factory/admin/captures/ that opens mailto: with the email pre-filled and the dossier link pre-filled (mints token via JS calling /api/mint-token with admin-key).

Files changed inventory

Cumulative iter1-iter5

31 buyer-facing pages and admin tools live. 2 active intent captures + 2 feedback entries in production data. Repair queue at 96% complete, 87/172 fully complete. All 172 products have brand briefs, financials, FAQ, dossier teaser, dossier full (gated), pricing band, hero insight, outreach pack, email drip, feedback form.

Real buyer can today:

  1. Browse 172 ideas with adoptability scoring, badges, filters
  2. Compare any subset side-by-side
  3. Read a tiered pricing page
  4. Submit interest on any product (real captured email)
  5. Receive a gated dossier URL (manual mint via CLI; auto-mint when Stripe wires)
  6. Submit dossier feedback (real captured)
  7. Browse "what's just shipped" page
  8. Use the outreach launcher with copy-LinkedIn/Gmail-draft buttons

The buyer path is fully in place. The remaining work is Stripe + email automation + content quality lifts.

← PreviousIter #4 Next →Iter #6