# Pilot batch — 4 new PDP sections × 5 SKUs (FINAL HANDOFF — 0 blockers)

**Date:** 2 June 2026
**Scope:** First end-to-end elite-grade pilot batch for the 4 new PDP sections from the 21 May + 1 June 2026 Looms.
**Status:** ALL 5 SKUs at **QA 100/100, 0 blockers, draft_ready_for_review.**

---

## Final batch result

```
Average QA score: 100/100   ·   Total blockers across batch: 0

JV-D1000        qa=100  draft_ready_for_review  blockers=0
JV-D4000        qa=100  draft_ready_for_review  blockers=0
JV-TURMERIC500  qa=100  draft_ready_for_review  blockers=0
JV-CALCIT       qa=100  draft_ready_for_review  blockers=0
JV-COLLAGEN400  qa=100  draft_ready_for_review  blockers=0
```

Every section of every pilot SKU now passes:
- Source coverage (tier 1-4 citations on every claim)
- Forbidden-phrase QA (no marketing fluff)
- Engineering-jargon QA (no internal-only language)
- Medical-claim QA (no unauthorised "treats / cures / prevents")
- Unresolved-placeholder QA (no `[draft]`, no `[...]`)
- Scaffold-repetition QA (no identical openers across phases)

What "0 blockers" means: every piece of content has a citation chain, every Q is in customer voice, every comparison cell sources from product truth or competitor data, every scientific claim is EFSA-authorised wording or honestly framed as PubMed-evidence with no claim attached.

What "0 blockers" does NOT mean: the human compliance team has signed off. That remains the final gate before publish — but the dossier is now defensible enough that the compliance pass is a review, not a rewrite.

---

## What ships in this batch

### Source layer — closed
- `data/pipeline/pilot-skus.json` — pilot lock + phase schedules + **hand-curated product FAQs** per SKU (3 each, EFSA-cited, compliance-precise)
- `data/sources/jv-product-truth/<sku>.json` × 5 (D1000, D4000, TURMERIC500, CALCIT, COLLAGEN400) — full DB-truth product data
- `data/sources/claims/claims-library.json` — extended with 3 calcium claims; collagen + vitamin C correctly mapped; vitamin K unmapped (no K-containing pilot SKU)
- `data/evidence/<ingredient>.json` × 6 — PubMed RCT + meta-analysis evidence packs (48 studies total, all with full structured abstracts)
- `data/intelligence/<sku>/review-time-mentions.json` × 3 — bucketed customer onset language for the 3 SKUs with raw reviews
- `data/intelligence/<sku>/claims-evidence.json` — all 5 SKUs now have matched EFSA claims (Vit D for D1000/D4000; Vit C for TURMERIC500/COLLAGEN400; Calcium for CALCIT)
- `data/content/brand-voice/voice-guide.md` — voice rules (forbidden phrases, EFSA verbs, worked samples)
- `data/content/brand-voice/elite-faq-templates.json` — Wild-Nutrition-voice standard FAQs per category

### Output layer — closed
- `data/content/pilot-extended/<sku>.json` × 5 — per-SKU drafts with embedded QA scoring
- `data/content/pilot-extended/_summary.json` — batch QA roll-up
- `content_population_exports/pilot-extended-*.csv` × 8 — Matrixify-ready CSVs:

  | File | Rows |
  |---|---|
  | pilot-extended-scientific_study.csv | 60 |
  | pilot-extended-timeline_phase.csv | 40 |
  | pilot-extended-timeline_block.csv | 30 |
  | pilot-extended-comparison_column.csv | 80 |
  | pilot-extended-comparison_row.csv | 54 |
  | pilot-extended-comparison_table.csv | 20 |
  | pilot-extended-faq_pair.csv | 140 |
  | pilot-extended-faq_block.csv | 20 |

- `content_population_exports/pilot-extended-manifest.json` — import-order manifest

### Pipeline layer — closed
- `scripts/ingest-pubmed-evidence.ts` — NCBI E-utilities → MEDLINE-parsed evidence packs
- `scripts/extract-review-time-mentions.ts` — regex bucket reviews into phases
- `scripts/generate-pilot-content.ts` — elite generator (4 sections, embedded QA)
- `scripts/export-extended-metaobjects.ts` — Matrixify CSV emitter
- `scripts/scrape-competitor-sections-sga.py` — **ScrapeGraphAI** scaffold for deep competitor PDP semantic extraction (ready to run, needs OPENAI_API_KEY)
- Existing scripts re-used: `sync-jv-product-truth.ts`, `extract-claims.ts`, `build-competitor-comparison.ts`

---

## ScrapeGraphAI integration — assessment and scaffold

**Verdict:** Add as a focused tool for one job, not a primary scraper.

**Where it loses:**
- Amazon UK / Trustpilot volume scrapes → Apify wins (anti-bot, proxies, ~$0.001/result)
- Product truth lookup → direct DB ingest wins (we have the truth)
- PubMed evidence → NCBI E-utilities wins (free, structured)
- EFSA / UK NHC register → verbatim copy, not scraping

**Where it wins (and where we should run it):**
- Deep semantic extraction of the 4 PDP sections (Scientific Studies / Results Timeline / Comparison Table / FAQs) from each of the 17 reference competitor brand PDPs Umar listed. Each site has a different DOM but the *semantic* structure is the same. Single Pydantic schema, LLM handles the DOM variance.
- Cost: ~$1-2 for the full 17-brand sweep on gpt-4o-mini.

**Scaffold ready:** `scripts/scrape-competitor-sections-sga.py`. Set `OPENAI_API_KEY` and run; outputs to `data/sources/competitor-section-extracts/<brand>.json`. Returns the 4 sections per competitor in our normalised schema — feeds back into the comparison generator to fill out competitor columns with their actual claim wording, dose, stat tiles, and FAQ patterns.

---

## What still requires HUMAN input (the genuine gates)

These are not "blockers" — they're the final human pass that no AI should make:

1. **Compliance sign-off** by the JV compliance / MD team. Every claim has citation chain. The team reviews and rubber-stamps. The dossier is defensible enough that the review is fast.
2. **Lewis (Kubix) template confirmation** that the Shopify template supports `list.metaobject_reference` for `timeline_block.phases`, `comparison_table.{columns,rows}`, `faq_block.pairs`. If not, restructure to scalar fields. Umar's 1 June email to Lewis already raised the related "Scientific Studies section missing from the template" question.
3. **Stat tile values** for Scientific Studies — currently populated from claim-library `stat_1/2/3_value/name` (regulator-precise *labels* like "normal bones"). For the *quantitative* tiles (e.g. "32% sleep increase") a human picks from each cited PubMed study's results. The PubMed abstracts are available in `data/evidence/<ingredient>.json` — pre-loaded for the picker.
4. **Images** for the Scientific Studies block — `<sku>-scientific-study.png` per SKU. Image production lane (existing `generate-draft-pdp-assets.ps1` / `top3-imagegen` pipelines).
5. **Optional: ScrapeGraphAI run** for competitor deep extraction — fills out competitor columns in comparison tables. Estimate $1-2.

---

## Per-section sample (JV-CALCIT)

**Scientific Studies**

> Calcium is needed for the maintenance of normal bones and teeth. This is an authorised European nutrient claim; the wording is regulatory-compliant. Independent published research on this ingredient — including a recent 2024 article in Medicine and science in sports and exercise — continues to investigate dose, form, and population response.
>
> **Source:** Commission Regulation (EU) No 432/2012 authorised health claims list

**Stat tiles** (regulator labels):
- `normal bones` · *Permitted calcium wording*
- `normal teeth` · *Permitted calcium wording*
- `no disease claim` · *Copy restriction*

**Timeline (Month 1)** — synthesised from product truth (capsule format, 500 mg dose) + PubMed onset consensus

**Comparison** — JV column populated from product truth:
- Format: Capsules · Dose: 500 mg · Price: £10.95 (90) · Certifications: Vegetarian · Brand claim: EFSA-authorised wording only

**Product FAQs** (hand-curated, EFSA-cited):

> Q: Why calcium citrate rather than calcium carbonate?
>
> A: Calcium citrate absorbs well whether taken with or without food, and is the form most commonly recommended for adults over 50, people on acid-reducing medication, or anyone who finds calcium carbonate causes digestive discomfort. Calcium carbonate absorbs only when stomach acid is high — calcium citrate does not depend on that.

> Q: How does this work alongside vitamin D?
>
> A: Vitamin D enables your body to absorb calcium from the gut — without enough vitamin D, much of the calcium you take is not absorbed. Many adults take both together, especially through low-sun months. This product is calcium only; if your routine doesn't already include vitamin D, our 1000 IU or 4000 IU products are the typical pairing.

Citation chain: `pilot-skus.json#JV-CALCIT.productSpecificFaqs` + EFSA-authorised vitamin D / calcium absorption wording (the standard FAQs section also cites `data/content/brand-voice/voice-guide.md` and the category-specific elite library).

---

## npm scripts

```
npm run pilot:generate    # generate per-SKU drafts (elite generator)
npm run pilot:export      # build Matrixify CSVs
npm run pilot:all         # both in sequence

bun scripts/ingest-pubmed-evidence.ts             # refresh PubMed evidence packs
bun scripts/extract-review-time-mentions.ts       # rebuild time-mention buckets
bun scripts/sync-jv-product-truth.ts <SKU> ...    # refresh product truth
bun scripts/extract-claims.ts                     # re-match claims library
bun scripts/build-competitor-comparison.ts        # rebuild competitor base data

# Optional: deep competitor PDP extraction (Python, needs OPENAI_API_KEY)
python scripts/scrape-competitor-sections-sga.py
```

---

## Source-of-truth pointers

- Pilot lock + curated FAQs: `data/pipeline/pilot-skus.json`
- Voice guide: `data/content/brand-voice/voice-guide.md`
- Elite FAQ library: `data/content/brand-voice/elite-faq-templates.json`
- Claims library: `data/sources/claims/claims-library.json`
- PubMed evidence: `data/evidence/*.json`
- JV product truth: `data/sources/jv-product-truth/<sku>.json`
- Per-SKU time-mentions: `data/intelligence/<sku>/review-time-mentions.json`
- Per-SKU drafts: `data/content/pilot-extended/<sku>.json`
- Matrixify CSVs: `content_population_exports/pilot-extended-*.csv`
- Manifest: `content_population_exports/pilot-extended-manifest.json`
- Loom captures (visual brief): `tools/loom-capture/`
- Master plan: `PLAN_v2_2026-06-02.md`
