Date: 2026-05-15 (push mode, 60 min cadence, double-audit iter)
This iter built TWO new audit classes - vs-content and how-it-works - bringing the suite to 15 audits with 23 invariants. Both new audits 246/246 clean on first run.
Built audit-vs-content.py (~120 lines). For each /factory/builds/<slug>/vs/index.html, accepts EITHER pattern:
.inc-name or .vs-cell blocks.Plus universal checks: title-name match (with brand-rename + AI-suffix-stripped support), /factory/ CTA, substantial page size.
Why dual-pattern: gated honesty is a deliberate design choice - the highest-value section is gated behind $5 - and the audit shouldn't penalize honest gating. By accepting BOTH patterns, the audit catches drift (missing unlock CTA on gated pages, empty incumbent blocks on vs-template pages) without false-positives on intentional gating.
Result on first run: 246/246 clean, 0 issues.
Deeper LLM-quality audit class noticed (deferred): account-based-sales-ai's vs-template-v1 lists QuickBooks/Xero/FreshBooks as named competitors. Those are accounting tools - the product is account-based-sales-AI. The named competitors look auto-generated without domain specialization. An LLM-aware audit could catch this, but it's out of scope for a regex-based suite.
Cron: every 30 min at :11, :41
Built audit-how-it-works-content.py (~140 lines). For each /factory/builds/<slug>/how-it-works/index.html, verifies:
.section content blocksThe how-it-works page is the explainer buyers read to answer "what does this product actually do? what gets built?" - one of the most critical buyer-touching surfaces. All 246 pages share a consistent template (Implementation plan / Tech stack / MVP scope / First 7 build tasks).
Result on first run: 246/246 clean, 0 issues.
Cron: every 30 min at :13, :43
Patched regen-quality-report.py twice:
latest_vs_content_quality() + latest_how_it_works_quality()Live-check card count: 15 -> 17. Total content invariants: 21 -> 23.
| Audit | Cadence | Snapshot | Invariant # |
|---|---|---|---|
| audit-fakeproof.py | daily 4:30am | audit-fakeproof.json | 1-10 |
| audit-adoptability-drift.py | every 15 min | adoptability-drift.json | 11 |
| audit-page-identity.py | every 30 min | page-identity.json | 12 |
| audit-hero-polish-drift.py | every 30 min | hero-polish-drift.json | 13 |
| audit-og-coverage.py | every 30 min | og-coverage.json | 14 |
| audit-teaser-quality.py | every 30 min | teaser-quality.json | 15 |
| audit-case-studies-quality.py | every 30 min | case-studies-quality.json | 16 |
| audit-faq-quality.py | every 30 min | faq-quality.json | 17 |
| audit-unlock-content.py | every 30 min | unlock-content-quality.json | 18 |
| audit-adopt-content.py | every 30 min | adopt-content-quality.json | 19 |
| audit-feedback-content.py | every 30 min | feedback-content-quality.json | 20 |
| audit-pricing-content.py | every 30 min | pricing-content-quality.json | 21 |
| audit-vs-content.py | every 30 min | vs-content-quality.json | 22 |
| audit-how-it-works-content.py | every 30 min | how-it-works-quality.json | 23 |
| em-dash-sweep.py | every 15 min | (log only) | 1-2 |
2 substantive ships at 60-min cadence. The audit suite now covers every buyer-touching surface a buyer can land on from the catalog: build page, pricing, faq, vs, how-it-works, teaser, case-studies, unlock, adopt, feedback, /own, day-one, operator. The audit-coverage perimeter is essentially closed.
The audit-coverage perimeter is essentially closed. Remaining work shifts from "build new audit classes" to "reconcile warn-state products" (24) and "deepen audit quality" (e.g. LLM-aware competitor-domain matching).