# Stage 5b — post-run FAQ reconciliation patch

**Authored:** 2026-05-12 during the post-run taste review.
**Status:** Bundle artifacts on disk have been updated. APPROVED verdict stands; this patch corrects a Google Rich Results policy risk that the original reviewer pass did not check for.

## The drift

During the taste review of the Stage 5b prototype, [open-item D4] surfaced that the rendered FAQ accordion and the FAQPage JSON-LD shipped **different question sets entirely**:

- `design/copy.html` FAQ accordion — 5 buyer-objection questions (climate, firmness difference, delivery, intra-range positioning, care)
- `design/schema.jsonld` FAQPage `mainEntity[]` — 8 different questions (climate, depth+frame fit, firmness choice, delivery, instalments, foam certs, wool certs, sizing)
- ~3 questions were semantically overlapping but worded differently; 7 were unique to one side or the other

Google's Rich Results policy for FAQPage schema requires `mainEntity[].name` to match the FAQ content visible on the page. As shipped, this bundle would have failed `rich-results` validation and was at risk of a manual action if indexed.

## Root cause

`copy-writer` and `seo-strategist` were dispatched in parallel during Phase 3 of the original run. Each authored an FAQ list in isolation — copy-writer from the wireframe's section-level hints, seo-strategist from PAA targeting + `jsonld_plan` seeds. `technical-reviewer` authored `design/schema.jsonld` from seo-strategist's `jsonld_plan` but had no obligation (and no mechanical gate) to reconcile the schema against the on-page accordion.

No earlier review caught this because:

- `bin/validate-schema-jsonld.py` only checks v1.4 claims-discipline (placeholders, unverified claims in JSON-LD) and structural schema.org rules. It does NOT cross-check FAQPage against copy.html.
- `pdp-reviewer`'s claims-check inspects `schema.jsonld` for placeholders + unverified-claim hits, but compares against `claims.html.manifest[]`, not against `copy.html`'s rendered slots.
- The visible 8-FAQ count from `seo.html` and the visible 5-entry count from the rendered prototype were both correct *to their own source* — neither artifact's reviewer pass had reason to suspect drift.

## What was patched

Three artifacts in this run directory now carry the **canonical 8-Q set** (union of the strongest entries from both sources, with rendered answers preserving the wiki-sourced 1.9/2.1mm body-wire detail and intra-range positioning):

| Artifact | Change |
|---|---|
| `design/copy.html` | FAQ accordion expanded 5→8. Visual `<details>` block + embedded slot manifest JSON both updated. Tagged "post-run patch · 2026-05-11" badge in the report header. |
| `design/schema.jsonld` | `FAQPage.mainEntity[]` rewritten — all 8 question names match `copy.html` 1:1. Answers preserved verbatim from the canonical set. Validates clean against `bin/validate-schema-jsonld.py`. |
| `prototype/index.html` | Inline JSON-LD `FAQPage` block + rendered `#sec-faq` accordion both expanded 5→8 with matching wording. |

Verified via:

```bash
python3 .claude/skills/design-shopify-page/bin/validate-faq-reconciliation.py \
  runs/2026-05-11-stage-5b-natural-harmony-pdp/design/schema.jsonld \
  runs/2026-05-11-stage-5b-natural-harmony-pdp/design/copy.html \
  runs/2026-05-11-stage-5b-natural-harmony-pdp/prototype/index.html
# → OK
```

DOM eval on the live-rendered prototype confirms exact parity: 8 rendered Qs, 8 schema Qs, zero set deltas, identical order.

## What the canonical 8-Q set covers

1. Is this mattress suitable for hot, humid Gulf climates? *[rendered]*
2. What is the depth, and will it fit standard bed frames? *[from schema — new to rendered]*
3. What is the difference between Firm and Extra Firm? *[rendered — preserves 1.9/2.1mm body-wire detail]*
4. Will this mattress sleep too soft or too firm for me? *[rendered — intra-range positioning]*
5. When will my mattress arrive? *[rendered]*
6. Can I pay in instalments using Tabby or Tamara? *[from schema — major regional CRO value]*
7. What certifications does the New Zealand wool supplier hold? *[from schema — Wisewool / B Corp / L2M / FernMark authority]*
8. How do I care for a Natural Harmony Select mattress? *[rendered — post-purchase]*

Dropped from the schema's original 8: foam-cert Q (CertiPUR-US already in the on-page certifications strip), Gulf-sizing Q (covered by the size selector dropdown). Manufacturing-location and organic-claim Qs remain explicitly forbidden under `forbidden_claim_patterns`.

## Process changes shipping with this patch

To prevent recurrence on future runs, the following PM playbook + agent + validator changes are in effect:

1. **`bin/validate-faq-reconciliation.py`** (new). Validator that cross-checks `schema.jsonld` FAQPage entries against `copy.html` FAQ slot 1:1, plus the rendered prototype accordion. Exit 1 on count mismatch, set deltas, order mismatch, or storewide forbidden-pattern hits in any Q or A.
2. **`technical-reviewer` agent** now runs the FAQ-reconciliation validator as step 3a (immediately after schema.jsonld validation) as a HARD-STOP gate. Mismatches block until copy or seo is corrected — schema is not silently rewritten to match a wrong rendered set.
3. **`pdp-reviewer` agent** now consumes `schema_org.faq_reconciliation` from `technical-notes.html` and treats unresolved mismatch kinds as a claims-check HARD-STOP.
4. **`technical-notes.schema.json`** extends `schema_org` with an optional `faq_reconciliation` object — backwards compatible with existing technical-notes that pre-date the gate.
5. **PM Phase 3 dispatch** is now two waves:
   - Wave 3a — `seo-strategist` alone, completes first.
   - Wave 3b — `copy-writer` + `graphics-director` + (optional) `video-director` in parallel. copy-writer reads `seo.html` for the canonical FAQ-question set.
6. **`copy-writer` agent** now declares `seo_path` as a first-class input and renders the FAQ accordion using `seo.html.faq.questions[].question` strings verbatim — authoring only the answers in its own voice.

## Why we didn't re-run

A clean Stage 5c re-run would regenerate the bundle from a corrected brief, costing ~$25 + ~2h for what is fundamentally a 3-file content patch with already-resolved canonical wording. The mechanical gate above ensures the next run cannot ship this drift. APPROVED verdict from the original Phase 6 review stands — the gate hardening, not the bundle itself, was missing.

## Sibling notes

- `POLICY-DRIFT-NOTE.md` (storewide sleep-trial policy supersedes two `{{ claim-needed }}` placeholders in the bundle).
- This note (`FAQ-PATCH-NOTE.md`) — FAQ-reconciliation patch + process hardening.
