# Wishdeal Factory buyer-path - iteration 135 ship log

**Date:** 2026-05-15 (push mode, 60 min cadence, placeholder-CTA cleanup iter)

## What shipped (3 substantive ships)

Surveyed iter-134's 778 placeholder CTAs to find safe-match patterns. Built placeholder-cta-injector with high-confidence text-to-target mapping. Two injector runs fixed 447 of 778 CTAs (57% reduction). Plus built audit-published-date.py.

## Ship 1: Survey + placeholder-cta-injector.py - 447 CTAs fixed

Surveyed all 778 empty-hash CTAs by visible text. Top patterns formed clear intent groups:

| Intent group | Sample text | Target | Frequency |
|---|---|---|---|
| Trial / get-started | "Start free trial", "Get Started Free", "Read the dossier" | /factory/unlock/<slug>/ | ~210 |
| Demo / sales | "Book a demo", "Talk to sales", "Watch Demo" | /factory/operator-partnership/ | ~80 |
| Legal | "Terms", "Privacy Policy" | /factory/terms/ | ~50 |
| Pricing | "See pricing" | /factory/builds/<slug>/pricing/ | ~10 |
| FAQ | "FAQ" | /factory/builds/<slug>/faq/ | ~5 |
| How-it-works | "See How It Works" | /factory/builds/<slug>/how-it-works/ | ~5 |

Built placeholder-cta-injector.py (~110 lines) with a safe-match table. Only replaces href="#" where the visible link text matches a high-confidence pattern. Ambiguous nav-style placeholders ("Platform", "Solutions", "Resources", "Customers", "Sign in") left untouched (Wes-task).

**Run 1: 402 CTAs fixed across 161 pages.** Extended pattern table for "Begin Free Trial", "Start the pilot", "Generate sequence/roadmap", "Watch Demo", etc.

**Run 2: 45 more CTAs fixed across 25 pages.**

**Net result: 447 CTAs fixed. audit-anchor-jump-noise card: 52/247 -> 90/247.** Empty-hash links: 778 -> 331 (57% reduction).

**Remaining 331 are mostly hand-written nav stubs** ("Platform", "Solutions", "Resources" x10 each, "Sign in" x10) that came from B2B SaaS template starters. These should probably be removed entirely since the factory doesn't have a /platform/, /solutions/, or /resources/ page. Wes-task.

## Ship 2: audit-published-date.py - 35th audit class

Built audit-published-date.py (~95 lines). For each ship-log iter detail page (/factory/log/ship-logs/iter-N/) and each playbook essay (/factory/playbooks/<slug>/), verifies a published date is declared via:
- `<meta property="article:published_time">`
- `<time datetime="...">` element
- Visible "Date: YYYY-MM-DD" / "Published: YYYY-MM-DD" text

**Result: 139/146 clean.** All 134 ship-log details are dated (the regen-ship-log-details.py generator does this correctly). 7 of 12 playbook essays missing dates: 5k-budget, agency-productization, counsel-anatomy, distribution-channels-2026, five-patterns, operator-partnership-math, vertical-ai-2026.

**Cron:** every hour at :55

## Ship 3: /quality-report/ wired - 1 new card + invariant #43

Patched regen-quality-report.py:
- New helper `latest_published_date()`
- New card: "Published date coverage 139/146 WARN (7 missing dates)"
- Placeholder CTA card updated from "FAIL 52/247 (778 links)" to "FAIL 90/247 (331 links)"
- New audit-table row + invariant #43

**Live-check card count: 36 -> 37.** Total content invariants: 42 -> 43.

## The 35 audit suites at iter 135

Class breakdown:
- Catalog-wide: 1 (fakeproof)
- Per-surface content: 17
- Cross-cutting: 16 (added published-date - the 16th)
- Lint: 1

## Health hygiene

- audit-anchor-jump-noise: 52 -> 90 clean (157 pages still need editorial review)
- audit-published-date: NEW, 139/146 (7 playbooks Wes-task)
- Other audits unchanged

## Status snapshot

- 246 scored products + 2 partial builds
- 35 audit systems (17 per-surface + 16 cross-cutting + 1 catalog-wide + 1 lint)
- 0 fake-proof findings; 211 in warn/fail (157 placeholder-CTA + 12 back-link + 7 published-date + 19 emoji + 4 thin descriptions + 16 pricing + 8 case-studies)
- 247 brand briefs with valid archetype
- brand_name_helper.py honored by 10 generators + 1 injector
- 43 content invariants defended
- /quality-report/ surfaces **37 live-check cards** (1 FAIL, 6 warn, 30 ok)
- 77/77 health endpoints, 167+ cron jobs
- 60 min cadence active

## Iter 135 throughput note

3 substantive ships at 60-min cadence. Demonstrated the "audit finds drift -> survey -> safe-match table -> inject" loop on a real systemic issue (778 placeholder CTAs). 57% fix rate without editorial risk. Remaining 43% need human judgment (nav stubs, ambiguous CTAs).

## Running queue (top 5 for iter 136)

1. **Wes-task: 157 build pages with remaining placeholder CTAs (331 links, mostly nav stubs)**
2. **Wes-task: 7 playbook essays need published dates**
3. **Optional: extend safe-match table further; nav-stub removal is high-leverage if Wes can confirm**
4. **audit-script-coverage** - verify expected analytics scripts loaded
5. **audit-csp-headers** (server-level check)

## Cumulative iter 1-135

- **Catalog**: 246 scored + 2 partial, 246 with index.html
- **Content library**: 12 essays + Read-next + 273 OG PNGs + 135 styled ship-log pages
- **High-trust pages**: 8 foundational + 5 transparency surfaces + 1 split-brain detail
- **Audit infrastructure**: **35 audit systems**
- **Source durability**: 32+ generators + 11 read brand brief + 31 JSON snapshots + 167+ cron jobs
- **Content invariants**: **43 defended** at surface+source AND publicly surfaced

The audit-survey-inject loop works at any drift scale: 778 broken CTAs -> 447 fixed in one iter. The safe-match table is the leverage point - it turns "fix one by one" into "fix N matching pattern X". Future audit findings can use the same pattern.
