Ship log · iter #94

Iteration 94 ship log

2026-05-14 · push mode, 50 min cadence, OG infrastructure iter

On this pageWhat shipped (3 substantive ships + 1 audit-discovery) Ship 1: Convert 249 OG SVGs to PNG (1200x630) Ship 2: Patch og-meta-injector to v2 + reference PNG Ship 3: Patch jsonld-injector to reference PNG Audit-discovery: buyer-audit essay was introducing 4 hard fake-proof findings Standard wirings Health hygiene (Op rule 5) Status snapshot Iter 94 throughput note Running queue (top 5 for iter 95) Cumulative iter 1-94

Date: 2026-05-14 (push mode, 50 min cadence, OG infrastructure iter)

What shipped (3 substantive ships + 1 audit-discovery)

This iter upgraded the OG image infrastructure for 244 product pages from .svg to .png (Twitter/LinkedIn render PNG far more reliably), patched both the og-meta-injector and jsonld-injector to reference the new PNGs, and caught a fake-proof regression introduced by iter 92's essay before it became publicly-visible.

Ship 1: Convert 249 OG SVGs to PNG (1200x630)

Built convert-og-svgs-to-png.py (~80 lines). For each /srv/sites/factory/og/*.svg:

Result: 249 SVGs converted to PNGs at 1200x630, ~135 KB each (total ~33 MB across 244 product cards + 5 misc OG cards). Conversion took ~2 minutes. All 249 PNGs are valid 16-bit/color RGBA, non-interlaced.

Cron: every 30 min at :19,:49. Future product additions get their PNG auto-generated.

Why .png over .svg: Twitter, LinkedIn, Slack, iMessage all render PNG og:image reliably. SVG support is inconsistent - some clients show a broken-image icon, others render at wrong dimensions, others render but with no compression-aware caching. PNG is the safe choice for social-card guarantees.

Ship 2: Patch og-meta-injector to v2 + reference PNG

og-meta-injector.py was injecting og:image meta blocks (WD_OG_META_v1 marker) with .svg URLs.

Patch:

Result: ran injector. 244 product pages refreshed. All now reference PNG for og:image and twitter:image. The img:type metadata is correct.

Ship 3: Patch jsonld-injector to reference PNG

The Product JSON-LD on each /builds/<slug>/ page (from iter 8) included an image property pointing at the .svg.

Patch: changed the source-line in jsonld-injector.py from og/{slug}.svg to og/{slug}.png. Re-ran the injector on all 244 product pages.

Result: all 244 product Product JSON-LD blocks now have image: https://wishdeal.com/factory/og/<slug>.png. The Adoptability drift check still reports 0 drift (the image URL change does not affect score values).

Verification: grep -l "og/.\.svg" /srv/sites/factory/builds//index.html | wc -l returns 0. All product-page og: and JSON-LD image refs use .png.

Audit-discovery: buyer-audit essay was introducing 4 hard fake-proof findings

The catch: running the audit-fakeproof cron after the OG conversion surfaced 4 hard findings (jumped from 0 to 4). All 4 were in /factory/playbooks/buyer-audit/index.html (iter 92).

Root cause: the essay literally lists red-flag phrases as examples ("Used by 500+ companies", "SOC 2 certified", "trained on real X data") in Check 9: "Search the catalog for the most common red-flag phrases." The audit pattern-matches these phrases regardless of context.

Fix: added "playbooks/buyer-audit" to SKIP_PATHS in audit-fakeproof.py. Same treatment as playbooks/seventy-fabrications and playbooks/skip-these-dossiers, which also discuss these phrases by name.

After fix: audit returns CLEAN again (0 hard, 0 soft). The fix was made in 90 seconds.

The miss is meaningful: iter 92 shipped an essay that would have triggered a public 4-finding regression on /quality-report/ if not caught. The lesson: when shipping any essay that names fake-proof phrases, add it to SKIP_PATHS preemptively. The audit-discovery happens via the next cron cycle (4:30am daily) but the cron runs after iter 94's catch.

Standard wirings

Health hygiene (Op rule 5)

Status snapshot

Iter 94 throughput note

3 substantive ships + 1 audit-discovery save. The SVG-to-PNG migration was a real infrastructure improvement (social-card reliability for the entire catalog). The audit-discovery save was meaningful: prevented a 4-finding regression from going public.

Running queue (top 5 for iter 95)

  1. Twitter card validator spot-check - hit a few product page URLs through https://cards-dev.twitter.com/validator (or equivalent) to verify the new PNG cards render. Spot-check, not full audit.
  2. Adoptability drift cron-status callout - mention the new audit-adoptability-drift cron in /factory/cron-status/ (will appear via regen but worth a callout in /quality-report/ "what we audit" list).
  3. Cadence step to 60 min - iter 92/93/94 each 2-3 ships. Marginal-value-per-iter holding. Could step.
  4. Newsletter CTA refinement on /factory/fresh/ (still pending)
  5. /factory/own/ pages JSON-LD coverage (currently /builds/ has Product schema but /own/ does not; not sure /own/ is even live in the buyer path)

Cumulative iter 1-94

The catalog\'s social-card reliability is now equivalent to mainstream essay sites. Every product page has a PNG OG card that Twitter, LinkedIn, Slack, iMessage all render consistently. The visual brand presence in shared links improves significantly.

← PreviousIter #93 Next →Iter #95