Ship log · iter #127

Iteration 127 ship log

2026-05-15 · push mode, 60 min cadence, meta-coverage + link-integrity iter

On this pageWhat shipped (4 substantive ships) Ship 1: audit-meta-tags-coverage.py - 20th audit class Ship 2: og-meta-injector.py patched + 246 pages refreshed Ship 3: meta-description-injector.py - new one-shot injector Ship 4: audit-internal-links.py - 21st audit class Audit improvement: description threshold relaxed /quality-report/ wired - 2 new cards + invariants #28-29 The 21 audit suites at iter 127 Health hygiene Status snapshot Iter 127 throughput note Running queue (top 5 for iter 128) Cumulative iter 1-127

Date: 2026-05-15 (push mode, 60 min cadence, meta-coverage + link-integrity iter)

What shipped (4 substantive ships)

Built 2 new audits, patched 1 generator, built 1 new injector. Brand-rename pipeline closure continues to ripple into adjacent surfaces (og:title, canonical links).

Ship 1: audit-meta-tags-coverage.py - 20th audit class

Built audit-meta-tags-coverage.py (~140 lines). For each /builds/<slug>/index.html, verifies presence of:

First run discovered MAJOR coverage gaps:

Ship 2: og-meta-injector.py patched + 246 pages refreshed

Patched /home/ubuntu/factory/director/og-meta-injector.py:

Re-ran the injector: 246 pages refreshed. Contract-ai og:title now says "Inkwell". audit-ai says "Ledgerline". Canonical tags now present on all 246.

Ship 3: meta-description-injector.py - new one-shot injector

Build pages were originally generated ad-hoc by Claude, so 118 of them lacked <meta name="description"> entirely. Built meta-description-injector.py to add them.

For each page missing a meta description, the injector pulls content (in priority order):

  1. JSON-LD description field (which all 246 pages have)
  2. adoptability.json tagline
  3. Generic fallback copy

Run: 115 descriptions added, 131 skipped (already had).

The injector inserts the tag after <meta name="viewport"> in the head, falling back to before </head> if no viewport is present. Idempotent.

Built audit-internal-links.py (~95 lines). Walks every /builds/<slug>/index.html, extracts hrefs starting with /factory/, and verifies each target maps to an existing file on disk. Avoids HTTP requests because Caddy's fall-through to homepage would hide broken links from curl-style checks.

First run result: 246 pages scanned, 3,626 internal /factory/ links, ZERO broken.

This is a strong signal that the catalog's cross-linking is durable. The result also stress-tests the iter-101 INDEX_HTML_GUARD_RESTORE and the iter-102 brand-brief archetype repair - because both would have left dangling references behind, and zero broken links means those repairs held.

Audit improvement: description threshold relaxed

Initial threshold was >=40 chars (matches Google snippet recommendation but too strict for punchy brand taglines like "Your books, done by morning." 28c). Relaxed to >=25 chars - catches genuinely thin/broken descriptions (12 remaining are 5-24 chars) while accepting short brand-style copy.

/quality-report/ wired - 2 new cards + invariants #28-29

Patched regen-quality-report.py:

Live-check card count: 21 -> 23. Total content invariants: 27 -> 29.

The 21 audit suites at iter 127

AuditCadenceStatus after iter 127
audit-fakeproof.pydailyok
audit-adoptability-drift.pyevery 15 minok
audit-page-identity.pyevery 30 minok
audit-hero-polish-drift.pyevery 30 minok
audit-og-coverage.pyevery 30 minok
audit-teaser-quality.pyevery 30 min247/247
audit-case-studies-quality.pyevery 30 min239/247
audit-faq-quality.pyevery 30 min247/247
audit-unlock-content.pyevery 30 min247/247
audit-adopt-content.pyevery 30 min247/247
audit-feedback-content.pyevery 30 min247/247
audit-pricing-content.pyevery 30 min232/248
audit-vs-content.pyevery 30 min246/246
audit-how-it-works-content.pyevery 30 min246/246
audit-sales-kit-content.pyevery 30 min246/246
audit-skeptic-memos-content.pyevery 30 min246/246
audit-cross-surface-name.pyevery 30 min29/29
audit-jsonld-coverage.pyevery 30 min246/246
audit-meta-tags-coverage.pyevery 30 min234/246 (NEW)
audit-internal-links.pyevery 30 min246/246, 3626 links (NEW)
em-dash-sweep.pyevery 15 minrunning

Health hygiene

Status snapshot

Iter 127 throughput note

4 substantive ships at 60-min cadence. The iter-124 cross-cutting audit pattern continues to pay dividends: each new cross-cutting audit (jsonld coverage, meta-tags coverage, internal-links integrity) catches a layer of drift that per-surface audits structurally cannot see. The brand-rename pipeline now flows through 10 generators + 1 injector.

Running queue (top 5 for iter 128)

  1. Wes-task: 12 thin meta descriptions (lengthen for SEO snippets)
  2. Wes-task: 16 pricing-page issues
  3. Wes-task: 8 case-studies fabrications + 4 hand-written body-content renames (Foreword/Riverine/Relay/Counsel body still says canonical)
  4. audit-image-alt-coverage - verify every <img> has alt text. 22nd audit + invariant #30.
  5. audit-cross-surface-tagline-consistency - similar to cross-surface-name but for taglines (do all surfaces use the same tagline?)

Cumulative iter 1-127

Internal link integrity at 246/246 + 3,626 links validated is one of the strongest "the catalog hangs together" signals the audit suite has surfaced. Combined with cross-surface-name 29/29 and jsonld-coverage 246/246, the buyer's structural experience is verifiably consistent.

← PreviousIter #126 Next →Iter #128