# Wishdeal Factory buyer-path - iteration 139 ship log

**Date:** 2026-05-15 (push mode, 60 min cadence, heading-hierarchy + cadence-report iter)

## What shipped (3 substantive ships)

Built 39th audit class. Discovered + fixed 247-page systemic heading-skip issue via ARIA approach. Built the cadence-validate operational view.

## Ship 1: audit-heading-hierarchy.py - 39th audit class

Built audit-heading-hierarchy.py (~80 lines). For each /builds/<slug>/ page, walks the heading sequence in document order. Detects pairs where the effective level (respecting aria-level overrides) jumps by 2+. WCAG 1.3.1 + screen-reader best-practice.

**Initial result: 0/247 clean. ALL 247 build pages have heading-level skips.**

Skip pattern distribution:
- h2 -> h4: 304 first-occurrences (dominant)
- h1 -> h4: 67
- h1 -> h3: 18
- h2 -> h5: 1

Same dual-hero pattern from iter 137 is part of this - and now the h4s inside hero blocks skip from h2-section-header.

## Ship 2: heading-hierarchy-fix.py - 247-page ARIA fix

Built heading-hierarchy-fix.py (~75 lines). Walks each page's heading sequence forward, computing effective level. When a skip is detected, injects `aria-level=(prev+1)` into the offending tag so AT treats it as the proper level.

**Strategy**: same as iter 138 H1 fix. Avoid tag swap (would shrink h4 visually). Use aria-level to semantically downgrade for assistive tech while preserving visual rendering. Idempotent: skips tags that already have aria-level.

**Result: 247 pages modified.** Combined with the iter-138 audit update that respects aria-level, audit-heading-hierarchy: 0/247 FAIL -> 247/247 OK.

## Ship 3: cadence-validate report at /factory/log/cadence-validate/

Built regen-cadence-validate.py (~80 lines). Walks all SHIP-LOG-buyer-path-iter*.md files. Parses iter number, date, and ship count from "## What shipped (N substantive ships)" header. Renders an operational view at /factory/log/cadence-validate/:

- Total iters logged
- Total substantive ships across all iters
- Average ships per iter
- Last 20 iters detail table (iter, date, ships, log size)

This proves the 60-min cadence is producing throughput across 138+ iters - a useful retrospective view buyers and observers may want.

**Live at https://wishdeal.com/factory/log/cadence-validate/.**

## /quality-report/ wired - 1 new card + invariant #47

Patched regen-quality-report.py:
- New helper `latest_heading_hierarchy()`
- New card "Heading hierarchy 247/247 OK"
- New audit-table row + invariant #47

**Live-check card count: 40 -> 41.** Total content invariants: 46 -> 47.

## The 39 audit suites at iter 139

Class breakdown:
- Catalog-wide: 1 (fakeproof)
- Per-surface content: 17
- Cross-cutting: 20 (added heading-hierarchy as 20th)
- Lint: 1

## Health hygiene

- audit-heading-hierarchy: 0/247 FAIL -> 247/247 OK (247 pages got aria-level injections)
- New cadence-validate page: live at /factory/log/cadence-validate/

## Status snapshot

- 246 scored products + 2 partial builds
- 39 audit systems (17 per-surface + 20 cross-cutting + 1 catalog-wide + 1 lint)
- 0 fake-proof findings; 88 in warn (unchanged - 36 placeholder-CTA + 12 back-link + 19 emoji + 4 thin + 16 pricing + 8 case-studies + 1 fake-button)
- 247 brand briefs with valid archetype
- 47 content invariants defended
- /quality-report/ surfaces **41 live-check cards** (0 FAIL, 6 warn, 35 ok)
- 1,860 accessibility-quality modifications across iters 132-139 (added 247 heading-hierarchy + cadence-validate)
- 77/77 health endpoints, 171+ cron jobs
- 60 min cadence active

## Iter 139 throughput note

3 substantive ships at 60-min cadence. ARIA-as-fix pattern proven for the second time (after iter 138 H1 fix): "use ARIA semantic overrides instead of tag swap to avoid CSS regression". This is the right approach for accessibility drift where the visual layout is acceptable but the semantic markup is wrong.

## Running queue (top 5 for iter 140)

1. **Wes-task: 88 warn items** (36 placeholder-CTA residue, 12 back-link, 19 emoji, 4 thin descriptions, 16 pricing, 8 case-studies, 1 fake-button)
2. **audit-aria-hidden-decorative-icons** - decorative SVG/icons need aria-hidden=true
3. **audit-form-action-presence** - every form has an action= attribute?
4. **audit-cross-surface-utility-link-targets** - utility-bar links all resolve to existing pages?
5. **Pause new audits** - the audit perimeter at 39 systems is structurally comprehensive

## Cumulative iter 1-139

- **Catalog**: 246 scored + 2 partial, 246 with index.html
- **Content library**: 12 essays + Read-next + 273 OG PNGs + 139 styled ship-log pages
- **High-trust pages**: 8 foundational + 5 transparency surfaces + 1 split-brain detail + cadence-validate
- **Audit infrastructure**: **39 audit systems** organized into 4 classes (20 cross-cutting now)
- **Source durability**: 32+ generators + 11 read brand brief + 36 JSON snapshots + 171+ cron jobs
- **Content invariants**: **47 defended** at surface+source AND publicly surfaced
- **Accessibility milestone (cumulative iters 132-139)**: 1,860 page modifications - WCAG 2.4.1 + 3.1.1 + 3.3.2 + 1.3.1 + ARIA aria-level all uniform across 247 build pages

The ARIA-fix pattern is the most surprising win of the past 7 iters: 425 H1 + 247 heading-hierarchy = 672 pages received zero-visual-impact semantic upgrades. This is the right approach for accessibility audits where the visual is fine but the markup needs help.
