Date: 2026-05-14 (push mode, 45 min cadence, catalog SEO + dwell-time iter)
This iter completed the structured-data foundation for the buyer-facing catalog and added Read-next sections to every playbook essay.
Discovery: While starting work on per-product Product JSON-LD, audit revealed that all 244 /factory/builds/<slug>/ pages ALREADY have valid Product JSON-LD from iter 8. Schema includes: name, description, url, image, category, brand, AggregateOffer ($5-$199), additionalProperty for Adoptability Score.
Coverage check: 244/244 product pages have JSON-LD. The existing jsonld-injector.py (cron at minutes 24,54) maintains this.
Saved time: ~30 minutes that would have gone into building a parallel inject-product-jsonld.py that duplicated existing infrastructure. This is the third audit-before-shipping save in the last 10 iters (iter 84 Stripe webhook, iter 89 JSON-LD presence check, iter 91 product schema).
Conclusion: the per-product Product schema is COVERED. iter 91 narrowed to catalog-level + Read-next.
Built inject-catalog-jsonld.py (~110 lines). Reads adoptability.json, builds a CollectionPage with mainEntity = ItemList of all 244 products. Each ListItem nests a Product schema with:
Page size impact: 498 KB -> 664 KB after JSON-LD inserted. ~166 KB added for 244 product entries (~680 bytes per product). Acceptable for a flagship catalog page.
Idempotent via WD_CATALOG_JSONLD_v1 marker. Validates via json.loads.
Durability: regen-catalog-v2.py (runs every 15 min) patched to call inject-catalog-jsonld.py at the end via subprocess. Tested: regenerating the catalog preserves the JSON-LD (marker count stays at 2 after regen). Plus the injector cron runs every 30 min at :12,:42 as belt-and-suspenders.
Why this matters: The catalog is the single highest-traffic SEO surface on the site. CollectionPage with ItemList is the canonical schema shape for product-listing pages. Google can now render the catalog as a single rich result with the 244-product breakdown.
Built inject-essay-readnext.py (~150 lines). Each essay gets a styled section before the footer with 2 related-essay cards. Related-essay mappings are operator-curated (not auto-generated):
| Essay | Related #1 | Related #2 |
|---|---|---|
| 5k-budget | operator-partnership-math | distribution-channels-2026 |
| vertical-ai-2026 | five-patterns | reading-adoptability |
| operator-partnership-math | 5k-budget | agency-productization |
| agency-productization | operator-partnership-math | distribution-channels-2026 |
| distribution-channels-2026 | 5k-budget | vertical-ai-2026 |
| counsel-anatomy | five-patterns | seventy-fabrications |
| five-patterns | vertical-ai-2026 | reading-adoptability |
| skip-these-dossiers | seventy-fabrications | reading-adoptability |
| seventy-fabrications | loop-lessons | skip-these-dossiers |
| reading-adoptability | five-patterns | skip-these-dossiers |
| loop-lessons | seventy-fabrications | reading-adoptability |
Each card has eyebrow tag (Tactical / Market thesis / Meta-honest / etc.) + title + 1-line blurb. Card style matches the essay design system (Fraunces serif heading, Inter body, gold accent eyebrow). All 11 essays now have valid Read-next sections.
Idempotent via WD_READ_NEXT_v1 marker. Cron at :11 hourly.
Why this matters: SEO loves internal-link depth and topic clusters. Adding 2 related-essay links at the end of each essay creates ~22 new high-quality internal links. Dwell time improves because readers have a clear next-step. The mappings are operator-thoughtful (not auto-similarity), so each suggestion is genuinely related.
2 substantive ships + 1 audit-save at 45-min cadence. The audit-save converted a planned 30-min sub-ship (per-product Product JSON-LD) into a 30-second discovery (already done). That bought the time for Ship 2 (Read-next sections).
This is the third iter in a row where audit-before-shipping has saved real work. The discipline is durable.
Total pages with structured-data treatment: 265+
| Surface | Schema type | Coverage |
|---|---|---|
| 11 playbook essays | Article | 11/11 |
| /factory/playbooks/ index | CollectionPage + ItemList | 1/1 |
| 8 high-trust pages | TechArticle / AboutPage / WebPage / CollectionPage / ProfilePage | 8/8 |
| 244 /builds/ product pages | Product + AggregateOffer + AdoptabilityScore | 244/244 |
| /factory/catalog/ index | CollectionPage + 244-item ItemList | 1/1 |
The SEO foundation is now complete. Every page that gets traffic has schema.org markup appropriate to its content type.
The SEO + dwell-time foundation is now coherent end-to-end. A search visitor lands on a rich-result, a click takes them to a structured page, the Read-next section keeps them inside the catalog.