Date: 2026-05-14 (push mode, 45 min cadence, structured-data extension iter)
This iter extended JSON-LD to all 8 high-trust pages with appropriate schema types, then made the injection durable through every regen cycle.
Built inject-high-trust-jsonld.py (~250 lines). Single injector with a config table mapping each high-trust page URL to a schema-type and builder function:
| URL | Schema type | Purpose |
|---|---|---|
| /factory/api-docs/ | TechArticle | API reference targeting developer audience |
| /factory/methodology/ | AboutPage | How the studio actually runs |
| /factory/honest/ | AboutPage | What to expect / not expect |
| /factory/quality-report/ | WebPage | Live audit dashboard |
| /factory/cron-status/ | WebPage | Live cron freshness |
| /factory/log/ship-logs/ | CollectionPage + ItemList | 89 ship logs |
| /factory/about-the-builder/ | ProfilePage (Person nested) | Wes Lemos profile |
| /factory/start-here/ | WebPage | New-visitor intro |
Each schema block includes name, description, url, primaryImageOfPage (the OG card), isPartOf (Wishdeal Factory WebSite), publisher (Wishdeal Studio Organization). The CollectionPage version dynamically enumerates all 89 ship-log iterations as Article items in an ItemList.
Idempotent via WD_HIGH_TRUST_JSONLD_v1 marker. All 8 pages validated via json.loads. The TechArticle for /api-docs/ also includes an "audience" property (Developers and technical operators) which Google uses for search-result targeting.
Why these specific types: schema.org\'s vocabulary distinguishes content categories. TechArticle outranks plain Article for developer-targeted searches. AboutPage signals "this is about the entity itself." ProfilePage with Person mainEntity is the right shape for a single-person about page. CollectionPage with ItemList is the canonical shape for an index page.
The problem: 5 of the 8 high-trust pages are regenerated by cron (quality-report every 30 min, cron-status every 15 min, ship-logs index every 30 min, honest hourly, start-here hourly). Each regen completely rewrites the HTML, wiping any injected JSON-LD. Confirmed via test: regenerating quality-report dropped the JSON-LD count from 2 to 0.
The fix: patched each of the 5 regen scripts to call inject-high-trust-jsonld.py at the end of their run via subprocess.run. The injector is fast (~50ms per page, idempotent), so the cost per regen is negligible. Now every regen automatically re-injects the JSON-LD before exiting.
Verified durability: ran regen-quality-report and regen-cron-status manually after the patch. JSON-LD count stayed at 2 (start marker + script tag count, expected). Both pages now have stable JSON-LD across regens.
Belt-and-suspenders: the injector cron is set to run every 5 minutes as a safety-net catch-up sweep. If any regen script ever bypasses the inject call, the 5-min sweep restores JSON-LD within minutes.
2 substantive ships at 45-min cadence. Ship 1 was the injector + 8-page schema-mapping. Ship 2 was the durability layer (5 regen scripts patched). The two ships together solve a complete SEO problem: structured data on every high-trust page, durable through every regen.
The catalog now has schema.org JSON-LD on:
Total: 20 pages with structured-data treatment. This is the right SEO foundation for an essay-and-transparency catalog. Google rich results, LinkedIn cards, semantic search discoverability all properly grounded.
What\'s NOT yet covered: the 244 product pages and the catalog index. Adding Product schema to product pages is a separate piece of work (heavier, would need per-product price + availability fields).
The SEO foundation is now coherent: every essay-and-high-trust surface has appropriate structured-data, and the data survives every regen.