Date: 2026-05-15 (push mode, 60 min cadence, accessibility + asset-integrity iter)
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.
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
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
Patched regen-quality-report.py:
latest_image_alt_quality() + latest_image_src_exists()Live-check card count: 23 -> 25. Total content invariants: 29 -> 31.
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.
| 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 |
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.
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.