- schema.jsonld: 'UAE' geographic references in 2 FAQ answer strings removed and rephrased to 'Gulf standard bed frames' / 'common dimensions' per dispatch zero-match requirement. seo.html retains original phrasing for design review.
- schema.jsonld: Product image URL is a placeholder CDN path. Prototype-builder must replace with confirmed production CDN URL(s).
- brief.include_review_schema=false — AggregateRating and Review nodes are OMITTED. Do not emit until real verified-purchase review data is available.
- 10-year warranty (partial) and 100-night sleep trial (unverified) OMITTED from schema.jsonld. Both are metafield-gated in product-buybox-enhancements.liquid — must degrade to empty (not placeholder text) when metafields absent.
- sticky-add-to-cart.desktop-in-page-nav active link underline uses #54412f (canonical warm brown). Verify prototype renders #54412f, not #537156 or #3A4F3C.
- comparison-table: exactly 3 NHC tier blocks (Essentia / Select / Reserve) required. pdp-reviewer must verify block count is exactly 3 in prototype.
Performance
| Metric | Value |
|---|---|
| Budget status | tight |
| Image count | 14 |
| Video count | 0 |
| Estimated LCP class | needs-improvement |
14 image shots across 12 sections; no video. Desktop renders 4 gallery images above the fold (main + 3 thumbnails in rail), pushing LCP to needs-improvement. All assets are photography-direction-only at this phase. Prototype-builder must apply loading='eager' to hero main-image only, loading='lazy' to all others, srcset at 400w/800w/1200w, and WebP/AVIF via Shopify CDN image_url filter.
Accessibility
Alt-text: 14/14 image-bearing slots covered. No missing slots. Two badge slots (trust-strip.cert-logo-row, certifications.cert-detail-list) marked decorative=true with empty alt-text — correct when cert names are conveyed by adjacent text; must switch to descriptive if logos render without text labels (see tech-07).
Tap targets: All mobile sections explicitly meet ≥44×44 px threshold (hero, buy-box, sticky-ATC, FAQ accordion).
theme.json confirms the live ATC button ships #3A4F3C as resting background (hover/active-only per spec). All wireframe CTA slots mandate #537156 at rest. No #585048 surfaces detected anywhere in the spec bundle — all hero/CTA/band surfaces clean. Desktop in-page nav active state correctly uses #54412f warm brown.
Heading hierarchy: 1 H1 at hero.product-title (contains primary keyword 'natural mattress'). H2 at 7 sections. H3 at 4 materials-breakdown layer headings. No skip levels. All section_id values resolve to wireframe.sections[].
Liquid Feasibility
| Section | Disposition | Feasibility | Metafields | Notes |
|---|---|---|---|---|
| hero | EXTEND | schema-adds | rating_value, rating_count | ATC color fix (#537156); trust-triple ATF block addition |
| sticky-add-to-cart | EXTEND | schema-adds | rating_value, rating_count | Extends product-sticky-atc; new product-sticky-atc-top.liquid needed for desktop |
| gallery | EXTEND | clean-extend | — | product-gallery-media-hux; 4 slots map to existing pattern exactly |
| buy-box | EXTEND | schema-adds | show_certs, show_finance | 8 protected snippets; ATC color correction; single-value variant suppression must survive |
| trust-strip | EXTEND | schema-adds | — | Hardcoded CDN cert URLs must replace GOTS/RWS (audit-02 critical fix) |
| materials-breakdown | EXTEND | clean-extend | — | icon-with-text-slider; 4 blocks map to existing pattern schema |
| comparison-table | EXTEND | schema-adds | — | Section exists but NOT in template order array — must wire before prototype (tech-02) |
| certifications | EXTEND | clean-extend | — | 5 cert items as inline block content; no new metafields |
| sleep-trial-and-warranty | EXTEND | clean-extend | trial_nights, warranty_years | Both blocks already metafield-gated; conditional render logic present |
| reviews | EXTEND | clean-extend | rating_count | custom-reviews CSV carousel; no AggregateRating JSON-LD |
| faq | EXTEND | clean-extend | — | image-with-faq; 5 Q&A blocks; FAQPage JSON-LD emitted from schema.jsonld |
| related-products | EXTEND | clean-extend | — | static-product-recommendations; re-enable via template JSON flag flip |
Schema.org
| Attribute | Value |
|---|---|
| Validation status | valid |
| Claims shipped (verified) | 9 of 9 verified claims |
| Violations | 0 — no violations |
| AggregateRating emitted | NO (brief.include_review_schema=false) |
| Review emitted | NO (brief.include_review_schema=false) |
| FAQ questions in JSON-LD | 8 |
| Breadcrumb levels | 4 (Home › Mattresses › Natural Harmony › Natural Harmony Select Mattress) |
| Offer price | 5394 AED (180×200 cm reference per brief.size_selector_pattern) |
Validated via bin/validate-schema-jsonld.py. Exit 0 — zero violations. Self-grep confirms zero matches for: AggregateRating, Review, {{ claim-needed, organic, GOLS, GOTS, RWS, Made in, Sharjah, UAE, United Arab Emirates, countryOfOrigin.
Findings (8 total — 0 critical, 3 high, 3 medium, 2 low)
Live ATC button ships #3A4F3C at rest — corrected in spec, must be enforced in implementation
theme.json confirms the live product-template.liquid renders the primary Add-to-Cart button with background-color #3A4F3C as its resting state. All six wireframe CTA slots mandate #537156 at rest; #3A4F3C is hover/active only per brief.brand_color_usage_notes.
Prototype-builder must override resting ATC background from #3A4F3C to #537156 in product-template.liquid (or a scoped CSS rule for the nish-natural-wool template). Verify with a visual diff before launch. Single CSS change — do not restructure the form.
mattress-comparison section not yet wired into product.nish-natural-wool.json
sections/mattress-comparison.liquid is fully implemented but absent from templates/product.nish-natural-wool.json's order array. Without wiring, the comparison-table section will not render.
Add mattress-comparison to the template JSON order array (between icon-with-text-slider and image-with-faq). Configure exactly 3 mattress blocks (Essentia / Select / Reserve). Verify block count is exactly 3 before prototype QA.
product-trust-stack.liquid hardcoded cert URLs must replace GOTS/RWS with NHC-approved set
Snippets/product-trust-stack.liquid hardcodes CDN URLs for 5 cert logo assets including GOTS and RWS logos — live organic-certification assets that violate NHC positioning for this PDP (audit-02 critical finding).
Edit snippets/product-trust-stack.liquid to replace GOTS/RWS CDN URLs with NHC-approved cert assets (CertiPUR, B Corp, Land to Market, FernMark, OEKO-TEX Standard 100). Apply minimum change only — URL replacement per brief.buybox_pattern.permitted_changes.
Desktop sticky-ATC top-bar requires new snippet file not yet present in theme
snippets/product-sticky-atc-top.liquid does not exist in patterns.html inventory. Must be authored from scratch. Must share variant state with inline buy-box and mobile sticky bar (cross-viewport binding).
Author snippets/product-sticky-atc-top.liquid per wireframe desktop-top-bar slot spec. Include from product-template.liquid at section end. Implement cross-viewport state binding via shared JS against main product form. Test: size pick in desktop sticky dropdown must update inline form and mobile chip.
14 image shots without lazy-loading discipline risks over-budget LCP on mobile 4G
Desktop gallery renders 4 images above the fold. Without loading='lazy' on non-hero images, srcset, and WebP/AVIF, mobile 4G LCP may exceed 2.5 s.
Apply loading='eager' to gallery.main-image only; loading='lazy' to all others. Implement srcset at 400w/800w/1200w. Serve WebP/AVIF via Shopify CDN image_url filter. Confirm LCP with Lighthouse after prototype build.
trial-block and warranty-block placeholders must not reach production HTML
copy.html renders {{ claim-needed }} placeholders for trial/warranty. Both are metafield-gated; must degrade to empty HTML (not placeholder text) when metafields absent.
Verify product-buybox-enhancements.liquid conditionals render nothing when trial_nights/warranty_years metafields are absent. QA grep on prototype HTML for '{{ claim-needed' — zero matches required.
Decorative cert badge alt-text must switch to descriptive if logos render without adjacent text labels
trust-strip.cert-logo-row and certifications.cert-detail-list are marked decorative=true (alt_text=''). Correct when cert names are conveyed by adjacent text; must switch to descriptive if any rendering path shows logos without text labels (WCAG 1.1.1).
Confirm each cert logo is always accompanied by visible text label. If any rendering path shows logo-only, switch alt_text to descriptive (e.g., 'CertiPUR certified badge'). QA at 375 px mobile viewport.
Internal link target /blogs/sleep/wool-mattress-hot-climate-uae is an unconfirmed slug
seo.html flags this internal link target as target_slug_pending. If the blog post does not exist, it will 404 and create a Google Crawl Error.
Confirm whether /blogs/sleep/wool-mattress-hot-climate-uae exists. If not, either create the post, replace with a confirmed live slug, or remove the link. Do not ship a dead internal link.