# Wishdeal Factory buyer-path - iteration 137 ship log

**Date:** 2026-05-15 (push mode, 60 min cadence, semantic-html audits iter)

## What shipped (2 substantive ships)

Built 2 audits checking semantic HTML correctness on build pages. One surfaced a major systemic finding (178 pages with multiple H1s). Audit count: 35 -> 37.

## Ship 1: audit-h1-uniqueness.py - 36th audit class

Built audit-h1-uniqueness.py (~75 lines). For each /builds/<slug>/index.html, verifies exactly 1 `<h1>` element. Multiple H1s break:
- SEO ranking signals (search engines expect 1 primary heading)
- Screen-reader navigation ("go to top heading" expects 1 destination)
- AT-friendly skip-to-content patterns

**Result: 69/247 clean. 178 pages with multiple H1s (most have 2, 4 have 3).**

The pattern: most build pages have a DUAL-HERO layout. First H1 is styled inline (font-size 4.6vw clamp, brand fonts) for visual prominence. Second H1 is bare `<h1>` that inherits from `h1 { font-size: 48px }` CSS rule. Both pretend to be "the main heading".

**Why not fixed in this iter**: a programmatic h1->h2 conversion would shrink the second hero visually (CSS rule `h1 { font-size: 48px }` doesn't apply to h2). Risk: 178 pages with broken visual hierarchy. Safer as a deliberate refactor pass (Wes-task) where the second hero either: (a) gets converted to h2 with explicit class to preserve visual size, OR (b) the layout is intentionally restructured to one-hero.

**Cron:** every hour at :57

## Ship 2: audit-button-anchor-consistency.py - 37th audit class

Built audit-button-anchor-consistency.py (~75 lines). For each build page, flags `<div>`/`<span>`/`<p>` elements with `class="btn|button|cta-button|primary-btn|secondary-btn"` - non-semantic fake buttons posing as CTAs. Accessibility-broken: keyboard users can't activate them, screen readers don't announce them as actionable.

**Result: 246/247 clean. 1 page with a fake-button element.**

A single warn-state hit. The catalog overwhelmingly uses `<a>` and `<button>` for CTAs correctly (the placeholder-CTA cleanup work iters 134-136 also helped here - those were all `<a href="#">` not div-as-button).

**Cron:** every hour at :59

## /quality-report/ wired - 2 new cards + invariants #44-45

Patched regen-quality-report.py:
- New helpers `latest_h1_uniqueness()` + `latest_button_anchor()`
- New cards: "H1 uniqueness 69/247 FAIL (178 pages with 0 or 2+ H1)" + "Semantic CTA tags 246/247 WARN (1 fake button)"
- 2 new audit-table rows + invariants #44-45

**Live-check card count: 37 -> 39.** Total content invariants: 43 -> 45.

**New FAIL card**: H1 uniqueness 69/247 - the first FAIL state since iter 136 closed the placeholder-CTA card. This is genuine structural drift that the audit caught and flagged for editorial review.

## The 37 audit suites at iter 137

Class breakdown:
- Catalog-wide: 1 (fakeproof)
- Per-surface content: 17 (unchanged)
- Cross-cutting: 18 (added h1-uniqueness, button-anchor as the 17th and 18th cross-cutting)
- Lint: 1 (em-dash-sweep)

## Health hygiene

- audit-h1-uniqueness: NEW, 69/247 - 178 in fail-state warn (Wes-task)
- audit-button-anchor-consistency: NEW, 246/247 (1 page Wes-task)
- Other audits unchanged

## Status snapshot

- 246 scored products + 2 partial builds
- 37 audit systems (17 per-surface + 18 cross-cutting + 1 catalog-wide + 1 lint)
- 0 fake-proof findings; 266 in warn/fail (178 H1 + 36 placeholder-CTA residue + 12 back-link + 19 emoji + 4 thin descriptions + 16 pricing + 8 case-studies + 1 fake-button)
- 247 brand briefs with valid archetype
- 45 content invariants defended
- /quality-report/ surfaces **39 live-check cards** (1 FAIL, 6 warn, 32 ok)
- 77/77 health endpoints, 169+ cron jobs
- 60 min cadence active

## Iter 137 throughput note

2 substantive ships at 60-min cadence. H1 audit caught the dual-hero pattern that's been present since the catalog was built but never audited. 178 pages affected = largest single-audit finding since iter 134's 778 placeholder CTAs. Unlike that case, this one needs visual-aware refactoring (not just URL replacement), so it stays Wes-task.

## Running queue (top 5 for iter 138)

1. **Wes-task: 178 dual-hero pages** - refactor approach decision (convert second h1 to h2 with preserve-styling, OR restructure to one-hero)
2. **audit-aria-hidden-icons** - icons should have aria-hidden="true" or descriptive label
3. **audit-skip-to-content-link** - keyboard-nav users need this
4. **Wes-task: other warn items**
5. **Pause new audits** - audit perimeter is now structurally complete past 37 systems

## Cumulative iter 1-137

- **Catalog**: 246 scored + 2 partial, 246 with index.html
- **Content library**: 12 essays + Read-next + 273 OG PNGs + 137 styled ship-log pages
- **High-trust pages**: 8 foundational + 5 transparency surfaces + 1 split-brain detail
- **Audit infrastructure**: **37 audit systems** organized into 4 classes (18 cross-cutting)
- **Source durability**: 32+ generators + 11 read brand brief + 34 JSON snapshots + 169+ cron jobs
- **Content invariants**: **45 defended** at surface+source AND publicly surfaced

The audit-cross-cutting count is now equal to per-surface count (17 vs 18). The buyer's structural experience is verified across 18 distinct dimensions (naming, structured data, SEO meta, social meta, navigation, images, voice, layout, accessibility, freshness, semantic HTML). Each new cross-cutting audit either confirms or surfaces drift; no audit class has been redundant.
