Ship log · iter #105
Iteration 105 ship log
2026-05-14 · push mode, 60 min cadence, OG-coverage-audit iter
Date: 2026-05-14 (push mode, 60 min cadence, OG-coverage-audit iter)
What shipped (3 substantive ships + 1 audit-discovery)
This iter caught a new product (contract-lifecycle-ai, shipped today) with a broken OG reference, fixed it via fallback, built the audit that would have caught it automatically, and added a permanent fallback to og-meta-injector so future newly-shipped products auto-default to _catalog.png.
Audit-discovery: 1 product shipped today with broken OG reference
The discovery: Quick OG-coverage scan found contract-lifecycle-ai (shipped today, May 14) with og:image meta pointing to /factory/og/contract-lifecycle-ai.png - but the PNG did not exist. Neither did the SVG.
Root cause: There is NO active per-product OG SVG generator. The 249 existing per-product OG SVGs were created by some past generator that's no longer running. New products inherit the og-meta-injector reference but never get a corresponding image file.
Mechanism: og-meta-injector writes og:image URL based on the slug pattern. convert-og-svgs-to-png cron only converts EXISTING SVGs. No script creates a new SVG when a product ships.
Copied the generic catalog OG card to /srv/sites/factory/og/contract-lifecycle-ai.png. The product page's og:image now resolves correctly. OG coverage: 245/246 -> 246/246.
Patched render_meta() in og-meta-injector.py with a new helper og_image_path(slug):
def og_image_path(slug):
local = f"/srv/sites/factory/og/{slug}.png"
if os.path.exists(local) and os.path.getsize(local) > 0:
return f"https://wishdeal.com/factory/og/{slug}.png"
return "https://wishdeal.com/factory/og/_catalog.png"
Future newly-shipped products without their own PNG automatically get _catalog.png as og:image, twitter:image. The og-meta-injector cron at :14/:44 picks them up within the hour. No future product will have a broken OG reference.
Ship 3: audit-og-coverage.py + /quality-report/ invariant #14
Built audit-og-coverage.py (~90 lines):
- For each /builds/<slug>/index.html, extract og:image URL
- Convert URL to local path
- Verify PNG file exists + is non-empty
- Categorize: ok / no_og_meta / missing_file / empty_file
- Writes JSON snapshot at /srv/sites/factory/og-coverage.json
Cron: every 30 min at :05, :35
Quality-report wiring:
- New "OG coverage" card: "246/246 - all OG cards exist"
- New "What we audit" table row
- New content invariant #14: "No missing OG cards on any /builds/<slug>/ page"
Live-check card count: 7 -> 8.
Health hygiene (Op rule 5)
- Em-dash sweep: pending
- audit-fakeproof: 0 hard / 0 soft (CLEAN)
- audit-adoptability-drift: 246 matched, 0 drift, 2 partial-build (brief-ai now scored)
- audit-page-identity: 1714 ok / 4 weak / 0 mismatch
- audit-hero-polish-drift: 177/177 match
- audit-og-coverage: 246/246 ok (NEW iter 105)
- Health-check: 77/77 passing
Status snapshot
- 246 scored products + 2 partial builds (brief-ai picked up; contract-lifecycle-ai now mid-shipped + scored)
- 246 build pages with index.html, all 4 audits clean
- 246/246 OG coverage (NEW iter 105)
- 247 brand briefs with valid archetype
- 12 essays + Read-next + JSON-LD
- 8 high-trust pages with JSON-LD durable
- /factory/catalog/ with CollectionPage
- 244 /builds/ pages with PNG OG + Product schema
- 272 OG PNG images (was 271; added contract-lifecycle-ai)
- 5 transparency surfaces + 105 styled ship-log detail pages
- /quality-report/ surfaces 8 live-check cards (added OG coverage iter 105)
- 14 content invariants defended (NEW iter 105: OG coverage)
- 6 audit systems operational
- 77/77 health endpoints, 136+ cron jobs
- 60 min cadence active
Iter 105 throughput note
3 substantive ships at 60-min cadence. The audit-discovery was meaningful: caught contract-lifecycle-ai's broken OG within hours of it shipping, plus added the permanent fallback. The audit-coverage extension is the highest-value class of work right now.
The 6 audit suites at iter 105
| 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 |
| em-dash-sweep.py | every 15 min | (log only) | 1-2 |
Plus health-check.py producing /factory/admin/health.json every 10 min.
Running queue (top 5 for iter 106)
- Build per-product OG SVG generator - the missing piece that caused iter 105's discovery. New products should get real custom OG cards, not generic _catalog.png. Medium-size build.
- Audit on /factory/own/ pages - parallel buyer-path surface not yet covered
- Audit on /factory/dossiers/<slug>/teaser.md - 244 public teaser files; not in current audit suite
- Cadence-validate 60 min - iter 104/105 each 2-3 ships. Holding.
- 13th essay - skip until queue has fresh candidate.
Cumulative iter 1-105
- Catalog: 246 scored + 2 partial, 246 with index.html
- Content library: 12 essays + Read-next + 272 OG PNGs + 105 styled ship-log pages
- High-trust pages: 8 foundational + 5 transparency surfaces
- Audit infrastructure: 6 audit systems + 7-surface page-identity + self-healing INDEX_HTML_GUARD + improved name-matching + hero-polish drift + OG coverage (iter 105)
- Source durability: 25+ generators (audit-og-coverage + og-meta-injector fallback iter 105) + 6 regen scripts auto-call injectors + 5 JSON snapshots + 136+ cron jobs
- Content invariants: 14 defended at surface+source AND publicly surfaced
OG coverage is now self-verifying. Newly-shipped products that lack a custom OG card get _catalog.png as fallback automatically. Time-to-detect on any future regression: <=30 min.