Ship log · iter #62

Iteration 62 ship log

2026-05-13 · depth mode, durable source fixes

On this pageWhat shipped Ship 1: 12 generators cleaned of HTML-entity em-dashes Ship 2: Adoptability data hygiene (48 records cleaned + source fix) Files changed inventory Status snapshot Why two source-level fixes in one iter What still needs Wes Iter 63 candidates Cumulative iter 1-62

Date: 2026-05-13 (depth mode, durable source fixes)

What shipped

Two substantive source-level fixes that eliminate categories of bugs at their root, not just at their visible surface.

Ship 1: 12 generators cleaned of HTML-entity em-dashes

Audit finding: Iter 61's enhanced sweep caught 615 entity em-dashes catalog-wide. The sweep is durable, but if SOURCE generators keep emitting entities, the cron is in a constant pendulum between dirty and clean. Found 24 entity em-dash instances across 12 generator files in /home/ubuntu/factory/director/.

Two distinct patterns:

Pattern A: null/empty table placeholders (10 generators)

Pattern B: prose em-dashes (2 generators)

Verification: After deploying all 12 fixed generators and re-running them:

Ship 2: Adoptability data hygiene (48 records cleaned + source fix)

Audit finding: Iter 53's noted bug ("dispatch-ai tagline = name") had grown unchecked. Catalog-wide grep found:

These propagated to: catalog page, dossier teasers, social share text, sitemap meta, every product index page.

Step 1 - Immediate record patches (44 of 48 from existing data sources):

For broken names (16 records): pulled the proper title-case from extract_new_name(slug) (matches "## New name\nX" pattern in brand briefs that have rebrands) or fell back to title-case + AI/SaaS/MVP normalization. Examples:

For broken taglines (1 fixable from brand brief): rental-ai's brand brief had Tagline: Your rental portfolio runs on autopilot. - pulled and applied.

For broken taglines (27 fixable from dossier teasers): for each broken product, extracted the first sentence (20-160 chars) of the elevator pitch in /srv/sites/factory/dossiers/SLUG/teaser.md. The elevator pitch is already hand-written operator voice, so the resulting taglines are real (not synthesized).

For the final 4 stubborn ones (clinic-ai, cashflow-ai, pitch-ai, tenant-ai): widened the search to all paragraphs of the elevator pitch (was limited to first paragraph), allowed slightly longer sentences (160 chars), all 4 resolved.

Final immediate state: 0 broken taglines, 0 broken names.

Step 2 - Source fix in adoptability-score.py:

The bug was in two functions:

extract_tagline(brand_text, slug):

tagline_to_name(slug, brand_text):

Verification: After deploying the patched scorer and regenerating adoptability.json:

The fix is durable. Future regenerations of adoptability.json will produce clean records.

Dependent regenerations:

Files changed inventory

Source-level fixes (durable)

Data file (regenerated by patched scorer)

Pages regenerated as cascading effects

Status snapshot

Why two source-level fixes in one iter

Both bugs had the same shape: visible surface symptom + cron pendulum if not fixed at source. The em-dash entity fix and the adoptability tagline fix both required:

  1. Audit to find affected records
  2. Patch immediate records
  3. Patch the generator that produces them

The fixes are similar enough in shape that doing both in one iter is faster than doing them in two separate iters (less context-switching cost). Both are now durable.

What still needs Wes

  1. Stripe wiring (30 min)
  2. Email-send for auto-fulfill
  3. First real traffic push
  4. Decision on rebrand-name application: some brand briefs have "New name" rebrands (dispatch-ai -> Pylon, contract-ai -> Inkwell, clinic-ai -> Clearwater, cashflow-ai -> Riverine, pitch-ai -> Lectern, tenant-ai -> Doorman). The current fix uses the title-case fallback (Dispatch AI, etc.). Whether to apply the rebrand names catalog-wide is a Wes naming-decision, not auto-applicable.

Iter 63 candidates

  1. Rebrand audit + application: spec'd above as Wes decision. List the rebrand candidates, get a yes/no per product, apply.
  2. Hand-polish top bulk-generated products for conversion uplift (lead-scoring-ai 73, churn-ai 72, attribution-ai 72)
  3. /factory/methodology/ depth pass (the fourth high-trust page, completing the foundational-page set)
  4. /factory/adoptability/ depth pass (explains the 10-axis scoring rubric - high-trust technical page)
  5. Catalog-wide audit for · entity - same systemic issue as —, may be present in places that should render as a different separator

Recommended: option 4 (/factory/adoptability/ depth pass). It's the fifth credibility leg explaining HOW the scoring works. Buyers who care about quality will read it.

Cumulative iter 1-62

The Factory has shifted from "content fixed at the surface" to "source generators produce clean content by default". That's a structural shift, not a polish shift. Future iters can build new features knowing the foundations are stable.

← PreviousIter #61 Next →Iter #63