← back to Consulting Designerwallcoverings Com
docs/aeo-drafts/TK-20-VERIFY-FINDINGS.md
70 lines
# TK-20 — AEO Storefront Render Verification + Injection-Path Findings
**Engagement:** DW consulting · **Date:** 2026-07-26 · **Agent:** yolo-worker
**Scope:** READ-ONLY + DRAFT-ONLY. No theme writes, no Shopify writes were made.
**Method:** Playwright real Chromium (curl is 429-throttled from this IP; a real browser is not) + Shopify Theme Asset API GET (read-only, `SHOPIFY_THEME_TOKEN`) + Admin GraphQL reads.
---
## 1. Render verification — the 3 published AEO targets
Script: `scripts/aeo-render-verify.mjs` (real Chromium, storefront `https://www.designerwallcoverings.com`). All three returned **HTTP 200** and the injected markup **is present in the DOM**:
| URL | HTTP | `.dw-aeo-answer` in DOM | signature phrase | **Visible to users/CSS-crawlers?** |
|-----|------|--------------------------|------------------|------------------------------------|
| `/collections/versace-wallpaper` | 200 | ✅ ("Medusa head…" present) | "Medusa" ✅ | ❌ **HIDDEN** |
| `/collections/osborne-little` | 200 | ✅ | "Osborne & Little" ✅ | ❌ **HIDDEN** |
| `/pages/wall-coverings` (id 219525742643) | 200 | ✅ (`data-aeo="wall-coverings"`) | ✅ | ✅ **VISIBLE** |
### The critical finding (computed-style walk)
The two **collection** AEO blocks are in the DOM but render at **0×0 / `display:none`**. Walking the ancestor chain, the block sits inside `.boost-sd__collection-header`, and the **Boost AI Search & Discovery** app's header container is set to `display:none`.
**Root cause:** The theme section `sections/dw-collection-hero.liquid` (lines 79–88) *deliberately* does:
```css
.boost-sd__collection-header,
.boost-sd__collection-description { display:none !important; }
```
The collection **body_html / `collection.description`** — where today's Admin-API AEO block was appended — renders *inside that hidden Boost header*. So the block is invisible to shoppers **and** to CSS-rendering crawlers (Google, AI Overviews). **AEO value of the collection body_html blocks ≈ nil.**
The `/pages/wall-coverings` page is a **native page** (`sections/page.liquid` → `.page-content.rte` → `{{ page.content }}`), not Boost-controlled, so it renders the AEO content **fully visible**. ✅
---
## 2. Injection-path investigation (the July-21 machine)
The task referenced `snippets/dw-collection-hero.liquid`; the live asset is actually **`sections/dw-collection-hero.liquid`** (a *section*, not a snippet). `templates/collection.json` renders it **first** (`order: ["dw_collection_hero", <boost apps>, "main"]`), i.e. **above and outside** the hidden Boost header. It is the correct **visible** surface for collection AEO. It:
- reads **`collection.metafields.custom.faq.value`** — a `json` metafield holding `[{q,a},…]` — and renders a **visible FAQ `<details>`** + emits **FAQPage** JSON-LD;
- reads **`collection.metafields.custom.category`** (`single_line_text_field`) for the answer line (defaults to `wallcovering`);
- always emits **CollectionPage** + **BreadcrumbList** JSON-LD.
**Confirmed live:** 14 of 60 sampled collections already carry `custom.faq` (`json`) + `custom.category` (e.g. `cork`, `chinoiserie`, `madagascar-cloth`) — this is the same machine the July-21 rollout used. **versace-wallpaper / osborne-little / zuber-wallcoverings were simply never populated** (`custom.faq = null` today → they render zero visible AEO and zero FAQPage).
**Correct collection path:** *do not* rely on body_html. **Populate `custom.faq` + `custom.category` metafields** → the existing section renders them visibly and emits FAQPage automatically. No theme write needed for collections.
**Pages:** `sections/page.liquid` renders `page.content` visibly but emits **no** FAQPage/WebPage JSON-LD (site JSON-LD is inlined in `layout/theme.liquid`, pixelunion — pages get only BreadcrumbList). **Correct page path:** a handle-keyed JSON-LD snippet rendered from `sections/page.liquid`.
---
## 3. Drafted deliverables (all DRAFT-ONLY, gated for Steve's session)
| Path | What |
|------|------|
| `theme-snippets/dw-aeo-jsonld.liquid` | Handle-keyed JSON-LD snippet — WebPage+FAQPage for the 2 pages; FAQPage-only *fallback* for the 3 collections (guarded on `custom.faq == blank` so it never double-emits). Built from committed `.jsonld` by `scripts/aeo-build-jsonld-snippet.mjs`; all 5 embedded blocks JSON-valid, Liquid tags balance. |
| `theme-snippets/sections-page.liquid.PROPOSED` | The one-line render-hook edit to `sections/page.liquid`. |
| `theme-snippets/APPLY-page-jsonld.sh` | Exact GATED PUT commands (backs up live page.liquid first; strips the draft comment on ship). |
| `collection-metafields/*.metafieldsSet.json` | Ready-to-run GraphQL `metafieldsSet` bodies for versace/osborne/zuber (6 FAQ each + category). |
| `collection-metafields/APPLY-metafields.sh` | Exact GATED curl-per-collection to populate the metafields. |
| `render-proof/` | Playwright artifacts location (screenshots best-effort; the hidden collection blocks won't shoot — that *is* the finding). |
### Recommended publish order (all GATED)
1. **Collections (highest ROI):** run `collection-metafields/APPLY-metafields.sh` → versace/osborne/zuber get visible FAQ + FAQPage via the existing section. *(This is what actually fixes the two hidden collection blocks.)*
2. **Pages:** run `theme-snippets/APPLY-page-jsonld.sh` → FAQPage/WebPage JSON-LD on `/pages/wall-coverings` (+ `/pages/designer-wallpaper` when it exists).
3. **Nav:** add **Wall Coverings → `/pages/wall-coverings`** to the footer **`resources`** linklist (and/or `footer`) via Admin → Navigation (or `menuUpdate` GraphQL with `write_online_store_navigation` — the current admin token lacks that scope).
4. *(Optional cleanup)* the now-redundant hidden body_html AEO block on the 2 collections can be reverted from the repo rollback baselines; harmless if left.
**Note on the body_html publish done earlier today:** it is not harmful, but on the two collection pages it is **not doing anything** (hidden by Boost). The metafield path in step 1 is what makes that content actually surface.