Ship log · iter #91

Iteration 91 ship log

2026-05-14 · push mode, 45 min cadence, catalog SEO + dwell-time iter

On this pageWhat shipped (2 substantive ships + 1 audit-discovery) Audit-discovery (audit-before-shipping save) Ship 1: CollectionPage JSON-LD on /factory/catalog/ Ship 2: "Read next" section on all 11 playbook essays Health hygiene (Op rule 5) Status snapshot Iter 91 throughput note The structured-data foundation at iter 91 Running queue (top 5 for iter 92) Cumulative iter 1-91

Date: 2026-05-14 (push mode, 45 min cadence, catalog SEO + dwell-time iter)

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

This iter completed the structured-data foundation for the buyer-facing catalog and added Read-next sections to every playbook essay.

Audit-discovery (audit-before-shipping save)

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.

Ship 1: CollectionPage JSON-LD on /factory/catalog/

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):

EssayRelated #1Related #2
5k-budgetoperator-partnership-mathdistribution-channels-2026
vertical-ai-2026five-patternsreading-adoptability
operator-partnership-math5k-budgetagency-productization
agency-productizationoperator-partnership-mathdistribution-channels-2026
distribution-channels-20265k-budgetvertical-ai-2026
counsel-anatomyfive-patternsseventy-fabrications
five-patternsvertical-ai-2026reading-adoptability
skip-these-dossiersseventy-fabricationsreading-adoptability
seventy-fabricationsloop-lessonsskip-these-dossiers
reading-adoptabilityfive-patternsskip-these-dossiers
loop-lessonsseventy-fabricationsreading-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.

Health hygiene (Op rule 5)

Status snapshot

Iter 91 throughput note

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.

The structured-data foundation at iter 91

Total pages with structured-data treatment: 265+

SurfaceSchema typeCoverage
11 playbook essaysArticle11/11
/factory/playbooks/ indexCollectionPage + ItemList1/1
8 high-trust pagesTechArticle / AboutPage / WebPage / CollectionPage / ProfilePage8/8
244 /builds/ product pagesProduct + AggregateOffer + AdoptabilityScore244/244
/factory/catalog/ indexCollectionPage + 244-item ItemList1/1

The SEO foundation is now complete. Every page that gets traffic has schema.org markup appropriate to its content type.

Running queue (top 5 for iter 92)

  1. 12th playbook essay - candidates: "What an audit-driven AI catalog looks like in practice" (technical-honest) OR "The 30-minute marketplace audit for buyers" (tactical) OR "What we cleared in iter 88: from 9 soft findings to 0" (audit-deep-dive).
  2. Add "Read next" to ship-log detail pages (link to most-related iter, not just adjacent) - currently prev/next is sequential.
  3. Cadence step to 60 min - iter 89/90/91 each 2 ships. Could compress.
  4. Validate Adoptability score in the Product JSON-LD matches the actual adoptability.json values (drift check on 244 product pages).
  5. OG image upgrade: product pages use .svg, could be .png for better Twitter/LinkedIn social-card rendering.

Cumulative iter 1-91

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.

← PreviousIter #90 Next →Iter #92