Ship log · iter #96
Iteration 96 ship log
2026-05-14 · push mode, 50 min cadence, partial-build recovery iter
Date: 2026-05-14 (push mode, 50 min cadence, partial-build recovery iter)
What shipped (2 substantive ships + 1 audit-discovery)
This iter investigated the 3 partial-build cases from iter 95, restored brief-ai from a 4-day-old backup, and surfaced "Known issues" as a new section on /quality-report/ so partial-build state is publicly visible.
Audit-discovery: brief-ai has been serving the homepage for 4 days
The discovery: curl-ing https://wishdeal.com/factory/builds/brief-ai/ returned 200, but inspection showed Caddy was actually serving the /factory/ homepage as a fallback (try_files chain ends in /index.html = catalog homepage). The /builds/brief-ai/ directory has no current index.html, only index.html.bak.tick22 from May 10.
Director.log trace:
- tick 5 (May 13 15:06): foreman pass ran against brief-ai
- tick 15 (May 13 16:26): another foreman pass
- tick 18 (May 13 16:51): polish pass spawned
- tick 19 (May 13 16:56): another polish pass with foreman findings
- tick 22 (May 13 17:11): buyer-skeptic spawned, ERROR "homepage empty for brief-ai" - the polish pass had written 0 bytes
- tick 25 (May 13 17:31): write_email_drip wrote 0 bytes
So a polish-pass at tick 18 or 19 wrote an empty index.html (Foreman-finding apply failed silently) but the backup-then-write sequence saved the original at .bak.tick22. The product has been broken for ~4 days, falling back to the catalog homepage URL for SEO purposes.
Why nobody noticed until now:
- audit-fakeproof: no fabrication patterns, page was 0 bytes
- audit-adoptability-drift (iter 93): silently skipped (no index.html)
- adoptability.json: brief-ai not included (drift script saw no index, scoring script also saw no page)
- iter 95 drift-counting fix surfaced it via the new partial_builds field
This is a meaningful audit gap: a product can be DOWN (404 on its canonical URL, serving wrong content) without any audit catching it.
Ship 1: Restored brief-ai/index.html from .bak.tick22
Copied /srv/sites/factory/builds/brief-ai/index.html.bak.tick22 → index.html. File is 47766 bytes, dated May 10. The page now serves properly: title is "Foreword - Client-Approved Project Briefs in Minutes" (the rebranded display name; slug stays brief-ai).
Verification: curl returns 200, size 47766b, title shows the product name not the factory homepage.
Drift check after restore:
- total_builds: 247
- matched: 244
- no_index_count: 2 (was 3; brief-ai recovered)
- no_current_score_count: 1 (brief-ai needs the next adoptability-score.py run to pick it up)
- drift_count: 0
The product is back in business. Pending: next adoptability-score.py cron pass will add it to adoptability.json, then the next jsonld-injector pass will refresh its Product JSON-LD.
Ship 2: "Known issues" section on /quality-report/
Added a new section between "What we audit" and "Content invariants" that lists current partial builds (Director-WIP missing index.html). For each, displays slug + "Director-WIP, missing index.html" + an explanation:
Why this matters: Caddy fall-through serves /factory/ homepage for these paths, which is wrong for SEO and confusing for buyers. iter 96 documented the polish-pass-wrote-0-bytes failure mode (e.g., brief-ai before restore). The Director will pick up these slugs again on a future tick.
Source-fixed in regen-quality-report.py. The section appears only when drift.no_index_count > 0 (auto-hides when clean). After Ship 1, the section shows the remaining 2 (outreach-sequence-ai, referral-engine-ai).
Why this matters: Partial-build state was previously invisible. Now it surfaces on the public quality dashboard. Future drift events get the same visibility.
Larger insight: detection coverage has a hole at "wrong content"
The audit suite catches:
- Em-dashes anywhere
- Fake-proof claims (SOC 2, customer counts, etc.)
- Adoptability score drift between catalog and JSON-LD
- HTTP 200/404 health on monitored endpoints
It does NOT catch:
- Pages that return 200 but serve the WRONG content (the brief-ai case)
- Pages with empty/missing content but a 200 response from a fall-through
- Pages that lost important meta tags after a regen
Worth filing for iter 97: a "page-identity audit" that verifies, for every monitored endpoint, that the returned content matches the expected product (e.g., grep for slug in response). This would have caught the brief-ai case automatically.
Health hygiene (Op rule 5)
- Em-dash sweep: not yet run this iter
- audit-fakeproof: 0 hard / 0 soft (CLEAN)
- audit-adoptability-drift: 244 matched, 0 drift, 2 partial-build, 1 no-score (brief-ai pending scoring)
- Health-check: 77/77 passing
- All structured-data: maintained
Status snapshot
- 244 scored products + 2 partial builds (outreach-sequence-ai, referral-engine-ai)
- 1 product recovered iter 96 (brief-ai)
- 246 build pages with index.html, 0 broken
- 0 fake-proof findings, 0 Adoptability score drift
- 12 essays + Read-next + JSON-LD on each
- 8 high-trust pages with JSON-LD durable
- /factory/catalog/ with CollectionPage + 244-item ItemList
- 244 /builds/ pages with PNG OG images + Product schema
- 271 OG PNG images
- 5 transparency surfaces + 95 styled ship-log detail pages
- /quality-report/ now has "What we audit" + "Known issues" sections (iter 95, 96)
- 26 hand-polished products
- 11 content invariants defended
- 77/77 health endpoints, 2320 sitemap URLs
- 133+ cron jobs
- 50 min cadence active
Iter 96 throughput note
2 substantive ships + 1 audit-discovery save at 50-min cadence. The audit-discovery was significant: caught a product that had been serving wrong content for 4 days. Restored it via the same iter. Plus surfaced the partial-build category on /quality-report/.
Running queue (top 5 for iter 97)
- page-identity audit - new audit that verifies each /builds/<slug>/ page returns content matching the slug (not the fall-through homepage). Would have caught the brief-ai case automatically.
- Investigate the Director\'s polish-pass empty-write bug - the tick-18 or tick-19 polish wrote 0 bytes for brief-ai but reported success. Needs Wes-level review of polish-pass.py.
- Adoptability scoring catch-up - brief-ai needs to be picked up. Force a manual scoring run or wait for the next cron.
- outreach-sequence-ai + referral-engine-ai - decide whether to delete (early-stage stubs) or wait for Director.
- Cadence step to 60 min - iter 92-96 averaged 2.5 ships. Could step.
Cumulative iter 1-96
- Catalog: 244 scored + 2 partial, 246 with index.html, 26 hand-polished
- Content library: 12 essays + Read-next + 271 OG PNGs + 95 styled ship-log pages
- High-trust pages: 8 foundational + 5 transparency surfaces + JSON-LD + "What we audit" + "Known issues" sections
- Source durability: 22+ generators + 6 regen scripts auto-call injectors + 3 JSON snapshots + 133+ cron jobs
- Content invariants: 11 defended + audits-named-publicly + partial-build state visible
The catalog now surfaces ITS OWN BROKEN STATE publicly. A buyer landing on /quality-report/ sees that the studio knows about its partial builds and is working on them. This is meaningfully more honest than hiding the imperfections.