# OD Baseline · 89/100 · vicwest-roofing (2026-05-18)

**Live:** https://vicwest-roofing-od-dev.pages.dev · 10 pages · multi-page output via OD `web-prototype` skill

**Composite score:** 89/100
- Vision (claude-sonnet 10-dim): **90.3/100**
- Copy judge (codex 5-dim): **47/50**
- Image score (vision D6 hero + D9 image): **40.8/50**
- L1 locked-facts (customer pages): **PASS**
- L2 content quality: **PASS**
- L3 build sanity: 1 minor failure (non-blocking)

This is the **baseline reference** — what we know works for vicwest-level data depth.

---

## What we sent to Open Design

Seed directory: `clients/vicwest-roofing/concept/open-design-seed/`

| File | Size | Role |
|------|-----:|------|
| `prompt.txt` | 12 KB | **PRIMARY directive to codex** (sent via `--prompt`, not just as a seed file) |
| `brief-summary.md` | 11 KB | Compact customer brief · 19 sections distilled from the full 5500-word customer-brief.md |
| `DESIGN-HANDOFF.md` | 10 KB | Per-page block plan + header/footer contract + hard rules |
| `site-architecture.json` | 30 KB | Architect's per-page block plan · sanitized (meta-fields stripped) |
| `facts.json` | 6 KB | Locked verbatim facts · phone, email, ABN, address, hours, services, suburbs, testimonials |
| `assets/` (15 files) | 19 MB | 9 customer hero/service photos + 6 work-gallery photos (real GMB + owned-site) |
| `brand/` (18 files) | 244 KB | brand-spec.json + logo SVGs (light/dark/mark) + brand contract |
| `references/` (3 docs) | 52 KB | `family-DESIGN.md` (550 lines) + `BEST-PRACTICES.md` + `niche-spec.md` |

**Total seed size:** ~19.5 MB (mostly real photos), ~70 KB of text instructions to the agent.

## What the prompt told codex (the 12 KB primary directive)

The 200-line prompt that worked has these critical sections:

```
1. Skip questions · use OD web-prototype workflow
2. Files in seed (read in this order):
   1. brief-summary.md
   2. DESIGN-HANDOFF.md
   3. site-architecture.json
   4. facts.json
   5. references/family-DESIGN.md
   6. references/BEST-PRACTICES.md
   7. references/niche-spec.md
   8. brand/brand-spec.json
   9. assets/*.jpg

3. Output: 10 HTML files matching site-architecture.json

4. Hard rules · verbatim checks (audit will fail otherwise):
   - Phone `0403 554 592` AND `tel:0403554592` link in header AND hero AND footer AND mid-page CTA
   - Email `info@vicwestroofing.com.au` with `mailto:` link in footer AND contact page
   - Business name in header logo area AND footer AND `<title>` of every page
   - VBA · exact wording "Licensed by the VBA" in trust-bar AND footer
   - ABN `69 622 718 361` in footer legal sentence
   - Address `Shed 3/31 Icon Dr, Delacombe VIC 3356` in footer + contact page

5. Production-grade page standards:
   - Word count ≥ 600 per page · hero ≥ 80 words · each service block ≥ 100 words
   - Every page must have at least 1 working <form> for quote/contact
   - Phone appears in header + hero + every form + sticky mobile bar + footer (5×)
   - VBA wording in trust-bar AND every footer
   - ABN sentence in every footer
   - Address in every footer + contact page (Google Maps link)
   - Hours table (Mon-Fri 8-5, Sat by appt, Sun closed) in footer
   - Photos: every page ≥ 3 distinct images from assets/, home page ≥ 6
   - Testimonials: verbatim quotes with full author name + location
   - Suburb mentions: Wendouree, Creswick, Hamilton, Geelong, Bendigo across site
   - Owner mention: Hayden on about + reviews
   - 10-year workmanship warranty exact phrase: hero proof-chips + warranty section + footer
   - Multi-page: 10 HTML files, NOT collapsed into index.html
   - Shared header/footer byte-identical across all pages
   - LocalBusiness JSON-LD in every <head>

6. Hero variant per page (strict):
   - ONLY home uses fullbleed-with-form
   - All other pages use compact-banner (form is separate section below hero)

7. Google Fonts loading (required):
   - Inter Tight + Inter + JetBrains Mono via Google Fonts <link> tags

8. NO META-COPY (banned phrasings):
   - "This section keeps...", "kept visible so...", "The people visitors deal with..."
   - "deserves clear business details", "without adding names that were not supplied"
   - Any sentence describing WHY a section exists rather than the business itself

9. Output checklist (self-verify):
   - 10 HTML files written
   - Each ≥ 600 words customer-facing copy
   - Each has ≥ 1 form
   - Each has tel:0403554592 link
   - Footer of each has mailto:info@vicwestroofing.com.au
   - "VBA" in trust-bar AND footer of every page
   - Each page references ≥ 3 distinct images from assets/
   - Hayden mentioned on about + reviews
   - LocalBusiness JSON-LD in every <head>
```

## What the data inputs gave the agent

**`brief-summary.md` (11 KB)** — compact distillation containing:
- Executive summary (1 paragraph)
- Service scope (10 services with 1-sentence each)
- Service area (23 named suburbs)
- Customer voice (4 verbatim testimonials with author + location)
- Brand voice + visual (colors, taglines)
- Competitive positioning + visitor personas
- 3 hero copy candidates
- CTA strategy
- Trust signals catalog

**`facts.json` (6 KB)** — locked verbatim facts:
- Business name, phone, email, address, ABN, hours, owner, warranty
- Service list (10 items, name + brief)
- Suburbs served (23)
- Testimonials (4 verbatim with author + location)
- Must-not-invent list

**`site-architecture.json` (30 KB)** — sanitized per-page block plan:
- 10 pages: home / roof-replacements / new-roofs / gutters / builders-commercial / projects / about / service-areas / contact / careers
- Per-page block list with type + variant + key_facts_to_use
- Header (Services dropdown + Projects + Service Areas + About + Contact + CTAs)
- Footer (4 columns + SEO suburb list + trust strip + social + ABN legal sentence)
- Block ownership (which blocks live on which pages)

**`assets/` (15 photos)** — customer real photos:
- hero-roof.jpg (drone view of completed Colorbond roof)
- hero-aerial.jpg
- service-roof-replacement.jpg, service-new-roofs.jpg, service-gutters.jpg, service-storm-damage.jpg
- about-team.jpg, about-installation.jpg, about-completed.jpg
- work/project-01.jpg through work/project-06.jpg

## The pipeline that produced the seed

```
Raw data sources (GBP + tinyfish + owned-website crawl + reviews fixture + ABN)
       ↓ pl:llm-extract-core (codex ~4 min, ~$0.50)
core-extract.json (real_facts + 19 narrative sections)
       ↓ pl:render-customer-brief
customer-brief.md (5500 words, 19 sections, full narrative)
       ↓ pl:llm-site-architect (codex ~4 min, ~$0.30)
site-architecture.json (10 pages, header, footer, block ownership)
       ↓ pl:build-od-seed
clients/<slug>/concept/open-design-seed/ (the seed dir above)
       ↓ pl:od-overnight (or pl:od-run) calling OD via Mac app daemon
       ↓ codex agent reads prompt + seed, writes 10 HTML files (~8 min, ~$0.50)
clients/<slug>/v2/composed-output-od/*.html
       ↓ pl:publish-demo --variant od
https://<slug>-od-dev.pages.dev (live on CF Pages)
```

## What worked (in order of impact)

1. **Threading `prompt.txt` as `--prompt` to OD** (not just as a seed file) — this alone went from 1-page output to 10-page output
2. **Verbatim checklists in the prompt** ("Phone X must appear in 5 places") instead of aspirational language ("use real facts")
3. **Real customer photos** (I_real) — passed the no-stock-feel audit, vision D6+D9 at 8.7+7.7
4. **Compact brief** (10 KB) instead of full 5500-word brief — agent stays focused
5. **Sanitized architecture** (strip meta-fields like `purpose`, `differentiation_note`, `copy_brief`) — agent stops paraphrasing those as headings
6. **Hero variant per page rule** — only home uses fullbleed-with-form, others use compact-banner
7. **Google Fonts explicit `<link>` tags** in the prompt — fonts actually loaded, not just declared
8. **Anti-meta-copy ban list** — though agent still leaked some (residual issue)
9. **Hard `--prompt` timeout (5 min)** on copy-judge using codex (claude CLI hung at 26+ min)
10. **Mac OD app daemon URL via IPC discovery** — projects visible in Mac OD app GUI in real time

## What didn't work / known defects of the baseline

1. **Meta-vibe section headings** — agent still generated headings like "Roof geometry, daylight and actual completed work" (4 pages), "Roofing questions Ballarat VIC customers ask before quoting" (4 pages). These are repeating signature phrases the agent uses when it doesn't know what else to write
2. **Header dropdown has no visible caret** — Services dropdown markup exists but no ▾ icon, so users don't know to click
3. **Some inner pages still have form-in-hero** (careers) despite CSS override — form-card class not matching all variants
4. **Recipe didn't scale to vip-roofing-brisbane** — vision 30, composite 0 (data depth issue)
5. **L3 has 1 build sanity failure** — minor, non-blocking
6. **Service list inconsistency** — core-extract found 13 services but home only shows 4

## Snapshot files

This baseline is preserved at:
- `seed-snapshot/` — exact files sent to OD that produced the 89 score
- `output-snapshot/` — the 10 HTML pages OD produced (live at vicwest-roofing-od-dev.pages.dev)

Both are READ-ONLY references. Future experiments should:
- Vary ONE input axis at a time (input format / images / skill / prompt depth)
- Compare new score vs 89 baseline
- Lock improvements in `pl:build-od-seed.js` so they apply to all future customers
