Date: 2026-05-15 (push mode, 60 min cadence, structural-fixes iter)
Fixed the code-review-ai HTML imbalance (iter 131's discovery). Built 2 more accessibility/quality audits. Built 1 one-shot injector that fixed 244 pages in one sweep.
Investigated iter-131's audit-html-validity-basic finding (79 open <div> vs 76 close). Traced to 3 <section> blocks each missing 1 </div> before their </section>:
Each section opens <div class="container"> after <section> but the close </div> was missing. Wrote a targeted fix that inserts the missing </div> immediately before each </section>, only for sections where open > close count.
Result: audit-html-validity-basic 246/247 (WARN) -> 247/247 (OK).
Built audit-html-lang-attr.py (~70 lines). For each /builds/<slug>/index.html, verifies the <html> tag has lang="en" (or en-US/en-GB/en-AU). WCAG 3.1.1 accessibility requirement + SEO signal.
Result: 247/247 clean. All build pages already declare lang correctly.
Cron: every hour at :43
Built audit-favicon-coverage.py (~60 lines). Verifies presence of <link rel="icon"> or <link rel="shortcut icon"> on every build page.
Initial result: 3/247 clean - 244 missing favicon declarations. Without an icon link, browsers default to fetching /favicon.ico which 404s, leaving an empty tab/bookmark display.
Built favicon-injector.py one-shot fix. Uses inline SVG data-URI (no extra HTTP fetch) with a generic Wishdeal Factory monogram (deep green square with white "W" in Georgia serif). Idempotent: skips pages with existing favicon links.
Result: 244 favicons injected, 3 pages with pre-existing inline SVGs preserved. audit-favicon-coverage 3/247 -> 247/247 clean.
Cron: audit at :45 every hour
Patched regen-quality-report.py:
latest_html_lang_attr() + latest_favicon_coverage()Live-check card count: 30 -> 32. Total content invariants: 36 -> 38.
| Class | Count | Audits |
|---|---|---|
| Catalog-wide | 1 | fakeproof |
| Per-surface content | 17 | adoptability-drift, page-identity, hero-polish-drift, og-coverage, teaser, case-studies, faq, unlock, adopt, feedback, pricing, vs, how-it-works, sales-kit, skeptic-memos, image-alt, image-src-exists |
| Cross-cutting | 11 | cross-surface-name, jsonld-coverage, meta-tags, internal-links, twitter-card, emoji-presence, cross-surface-tagline, page-load-size, html-validity-basic, html-lang-attr, favicon-coverage |
| Lint | 1 | em-dash-sweep |
3 substantive ships at 60-min cadence. Pattern: each iter completes one audit-class loop = (a) detect via new audit, (b) fix via one-shot script, (c) re-audit to confirm. The favicon work followed this loop in one iter (audit found 244, injector fixed all, re-audit confirms 247/247).
The audit-detect-then-fix loop is now demonstrably tight: iter 131 found code-review-ai's 3 missing divs; iter 132 fixed them and confirmed via re-audit. Same iter, favicon went from 3/247 to 247/247 via injector. The audit suite is paying for itself in caught defects.