# Wishdeal Factory buyer-path - iteration 96 ship log

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

1. **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.
2. **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.
3. **Adoptability scoring catch-up** - brief-ai needs to be picked up. Force a manual scoring run or wait for the next cron.
4. **outreach-sequence-ai + referral-engine-ai** - decide whether to delete (early-stage stubs) or wait for Director.
5. **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.
