# Wishdeal Factory buyer-path - iteration 128 ship log

**Date:** 2026-05-15 (push mode, 60 min cadence, accessibility + asset-integrity iter)

## What shipped (2 substantive ships)

Two clean-result audits added: image alt-text coverage + image src target existence. Both 247/247 clean on first run, validating the catalog's image hygiene. Audit count: 21 -> 23.

## Ship 1: audit-image-alt.py - 22nd audit class

Built audit-image-alt.py (~95 lines). For each /builds/<slug>/index.html, finds every `<img>` tag and verifies an `alt` attribute is present.

**Result on first run: 247 pages, 389 `<img>` tags, ZERO missing-alt.**

This is a strong accessibility/SEO baseline. Even the ad-hoc Claude-generated build pages put alt text on every image. The OG generators, hero injectors, and dossier templates all include alt by default.

**Cron:** every hour at :29

## Ship 2: audit-image-src-exists.py - 23rd audit class

Built audit-image-src-exists.py (~110 lines). For each `<img src="...">` on every /builds/<slug>/index.html, verifies the src target maps to an existing file on disk (for local paths starting with `/factory/`, `/`, or relative). External http(s) URLs are skipped (would need HTTP).

**Result on first run: 247 pages, 75 local `<img src>` paths, ZERO broken.**

This pairs with the iter-127 internal-links audit: that one walks /factory/ hrefs; this one walks /factory/ image srcs. Together they verify the catalog's hyperlink graph is durable on both navigation and embedded-asset axes.

**Cron:** every hour at :31

## /quality-report/ wired - 2 new cards + invariants #30-31

Patched regen-quality-report.py:
- New helpers `latest_image_alt_quality()` + `latest_image_src_exists()`
- New cards: "Image alt coverage 247/247 (all 389 images have alt)" + "Image src existence 247/247 (75 local imgs all resolve)"
- 2 new audit-table rows + invariants #30-31

**Live-check card count: 23 -> 25.** Total content invariants: 29 -> 31.

## Pivot from initial plan

Initial ship 2 plan was audit-cross-surface-tagline-consistency.py. After surveying tagline patterns across surfaces, found most pages share the canonical tagline from adoptability.json - drift potential is low. Pivoted to image-src-exists which catches a real class of bugs (typo'd image paths, deleted OG references, moved hero images) that the navigation audit (internal-links) doesn't cover.

## The 23 audit suites at iter 128

| Audit | Cadence | Status |
|---|---|---|
| audit-fakeproof.py | daily | ok |
| audit-adoptability-drift.py | every 15 min | ok |
| audit-page-identity.py | every 30 min | ok |
| audit-hero-polish-drift.py | every 30 min | ok |
| audit-og-coverage.py | every 30 min | ok |
| audit-teaser-quality.py | every 30 min | 247/247 |
| audit-case-studies-quality.py | every 30 min | 239/247 |
| audit-faq-quality.py | every 30 min | 247/247 |
| audit-unlock-content.py | every 30 min | 247/247 |
| audit-adopt-content.py | every 30 min | 247/247 |
| audit-feedback-content.py | every 30 min | 247/247 |
| audit-pricing-content.py | every 30 min | 232/248 |
| audit-vs-content.py | every 30 min | 246/246 |
| audit-how-it-works-content.py | every 30 min | 246/246 |
| audit-sales-kit-content.py | every 30 min | 246/246 |
| audit-skeptic-memos-content.py | every 30 min | 246/246 |
| audit-cross-surface-name.py | every 30 min | 29/29 |
| audit-jsonld-coverage.py | every 30 min | 246/246 |
| audit-meta-tags-coverage.py | every 30 min | 234/246 |
| audit-internal-links.py | every 30 min | 246/246 (3626 links) |
| **audit-image-alt.py** | **every hour** | **247/247 (389 imgs) NEW** |
| **audit-image-src-exists.py** | **every hour** | **247/247 (75 local srcs) NEW** |
| em-dash-sweep.py | every 15 min | running |

## Health hygiene

- Image-alt + image-src clean on first run; no remediation needed
- Other audits unchanged

## Status snapshot

- 246 scored products + 2 partial builds
- 23 audit systems (4 cross-cutting + 1 catalog-wide + 17 per-surface + 1 markdown linter)
- 0 fake-proof findings; 36 in warn (12 thin meta descriptions + 16 pricing + 8 case-studies)
- 247 brand briefs with valid archetype
- brand_name_helper.py honored by 10 generators + 1 injector
- 31 content invariants defended
- /quality-report/ surfaces **25 live-check cards** (0 FAIL, 3 warn, 22 ok)
- 77/77 health endpoints, 155+ cron jobs
- 60 min cadence active

## Iter 128 throughput note

2 substantive ships at 60-min cadence. Both clean on first run - audit-coverage continues to expand without surfacing new drift. The catalog is genuinely in good structural shape (247 build pages, 389 imgs all with alt, 75 local img srcs all resolve, 3626 internal /factory/ links all resolve, 246 JSON-LD blocks valid, 246 og:image / og:title / og:description / og:url / og:type / canonical present, 234 meta descriptions, 246 viewport, 246 charset).

The audit suite is past the perimeter-close milestone and is now in "thin-margin" mode - each new audit class catches narrower drift than the previous. This is good - it means the per-product surface infrastructure has stabilized.

## Running queue (top 5 for iter 129)

1. **Wes-task: 12 thin meta descriptions** (Brand-strategy: 20c, content-calendar: 24c, etc - lengthen for SEO)
2. **Wes-task: 16 pricing-page issues**
3. **Wes-task: 8 case-studies fabrications + 4 hand-written body-content renames**
4. **audit-twitter-card-coverage** - verify twitter:card, twitter:title, etc on every /builds/<slug>/ (subset of og but treated separately by Twitter/X). 24th audit + invariant #32.
5. **audit-cross-surface-tagline-consistency** - now that the obvious work is done, double-check tagline drift across surfaces. 25th audit + invariant #33.

## Cumulative iter 1-128

- **Catalog**: 246 scored + 2 partial, 246 with index.html
- **Content library**: 12 essays + Read-next + 273 OG PNGs + 128 styled ship-log pages
- **High-trust pages**: 8 foundational + 5 transparency surfaces + 1 split-brain detail
- **Audit infrastructure**: **23 audit systems** (17 per-surface + 6 cross-cutting: cross-surface-name, jsonld, meta-tags, internal-links, image-alt, image-src)
- **Source durability**: 32+ generators + 10 honor brand brief via shared helper + 21 JSON snapshots + 155+ cron jobs
- **Content invariants**: **31 defended** at surface+source AND publicly surfaced

The catalog's structural integrity is now verified across 6 dimensions: per-page content (17 audits), naming consistency, structured-data, SEO/social meta, internal navigation, image embedding. Each new cross-cutting audit narrows to thinner drift, validating the prior work.
