---
name: "evas-pdp-geo-kr"
description: "Korean EVAS PDP GEO/AEO pipeline: OpenSEO MCP KR demand, related-prompts, OCR, collapse-open HTML, Imweb KR deploy, FAQ/Product JSON-LD header inject. On success, hands off to evas-pdp-geo-en as a separate job. Use when user gives only product idx (e.g. idx=18), product code (e.g. FJCR002), product URL, or says PDP GEO / 상세 AI. Never deploy EN inside this skill."
---

# EVAS PDP GEO (KR)

## One-line run (user can send only this)

```text
idx={N} KR PDP GEO
```

or product code only:

```text
{PRODUCT_CODE} KR PDP GEO
```

Examples: `idx=18 KR PDP GEO` · `FJCR002 KR PDP GEO` · `idx=19 KR PDP GEO EN skip`

**Agent contract when user sends idx / product code / URL (minimal prompt):**

1. Resolve identity without asking if possible:
   - `idx=N` → `https://www.evasmall.co.kr/shop_view/?idx=N` and admin `…/product/detail?idx=N`
   - product code (e.g. `FJCR002`) → Imweb admin product search by 자체 상품 코드 / 상품명; get idx
   - URL with `idx=` → parse idx
   - else `artifacts/seo-aeo/priority-10-products.json` match
2. Run full KR loop (demand → convert via `pdp-ai-readable` → deploy KR only → live verify) without waiting for extra confirmation unless blocked (no MCP, no admin, claim uncertainty).
3. Default **EN skip** unless user says `EN` / `핸드오프` / `풀 파이프라인`.
4. If user says only a code/idx with no verbs, treat as **KR PDP GEO run** (this skill).

Stable, repeatable **Korean** pipeline for `evasmall.co.kr`.

**EN is not done here.** After KR verify, hand off to skill **`evas-pdp-geo-en`** only when user requested EN or `handoff_en: true` (separate OpenSEO market + separate Imweb language unit).

## End-to-end loop

```text
0) Prerequisites (once)
   OpenSEO MCP + KR projectId (market KR/ko)
   GSC optional but recommended
   Mistral OCR key
   Header inject REGISTRY pattern

1) Demand (OpenSEO KR)
   keyword-research on KR market
   related-prompts.json (source=openseo|gsc|hybrid)
   optional save_keywords after user confirm

2) Convert (pdp-ai-readable)
   OCR → layout v3 (images + details[open] text)
   FAQ from related-prompts; answers from OCR/disclosure only

3) Deploy Imweb KR unit ONLY
   detail HTML + SEO title/meta + header REGISTRY

4) Verify live KR
   details open, KR FAQ body, data-evas-pdp-ld Product+FAQPage

5) Handoff EN (separate skill)
   If gate ok → read/run evas-pdp-geo-en
   Else write EN_BLOCKED.md
```

## Prerequisites

- [ ] `list_projects` works; project market KR (e.g. 2410/ko)
- [ ] GSC connected OR accept third-party metrics only
- [ ] Mistral OCR available when converting new SKUs
- [ ] Imweb admin `evasmall.imweb.me`

If OpenSEO MCP missing: stop demand; use GSC CSV only. Never invent volumes.

## OpenSEO: what `save_keywords` is for

Saving keywords **does not change the mall**. It stores a tagged library on the OpenSEO project so later runs can:

| Use | How |
|---|---|
| Resume research | `list_saved_keywords` instead of full re-research |
| Segment by SKU/line | tags e.g. `sku:idx-19`, `line:약쑥`, `lang:ko`, `priority:P1` |
| Clustering / briefs | `keyword-clustering` and content workflows read saved sets |
| Avoid duplicate paid calls | reuse saved list + `get_keyword_metrics` only when stale |

**Always ask before `save_keywords`.**  
Suggested tags: `lang:ko`, `sku:idx-{n}`, `line:{line}`, `intent:{problem|brand|ingredient}`.

## Step 1 — Demand (KR)

Use `keyword-research` (and GSC if connected).

1. Seeds: product name + problem intents (예: `수부지 수분크림`, `속건조 수분크림`, brand)
2. GSC striking distance for product URL when available
3. `research_keywords` + `get_keyword_metrics` + small SERP sample
4. Write:

```text
artifacts/seo-aeo/keywords/{date}-kr-idx{n}.json
artifacts/pdp/{brand}/idx-{n}/related-prompts.json
```

`related-prompts.json` must include metrics when known:

```json
{
  "product_idx": "19",
  "source": "openseo",
  "prompts": [
    {
      "prompt": "...",
      "intent": "purchase_guidance",
      "entities": [],
      "volume": 170,
      "kd": 0,
      "seed_keyword": "수부지 수분크림",
      "priority": "P1"
    }
  ]
}
```

## Step 2 — Convert

Use `pdp-ai-readable` layout **v3-collapse-open**:

1. Images only (uninterrupted)
2. `<details open>` continuous text (tables, how-to, FAQ)
3. No JSON-LD in Froala body → header inject
4. OCR corrections (약육 → 약쑥)
5. FAQ Qs aligned to related-prompts; answers OCR/disclosure only

Outputs:

```text
artifacts/pdp/{brand}/idx-{n}/
  INDEX.json
  deployed-kr.html
  product-v3.jsonld.json
  faq-v3.jsonld.json
  header-inject-pdp-ld.html
  related-prompts.json
  ocr/
  meta.md / meta-v3.1.md
```

### FAQ refresh (existing SKU)

When only demand changed:

1. Rebuild FAQ section in `deployed-kr.html`
2. Sync `faq-v3.jsonld.json` + header REGISTRY entry
3. Redeploy KR detail + header; verify live


## Imweb flag tabs (do not touch US during KR)

Product editor shows **🇰🇷 / 🇺🇸** above Froala. Underline = active language unit.

- KR deploy: stay on **🇰🇷** only. Never click 🇺🇸 in the same edit session.
- Clicking 🇺🇸 loads EN field values; pasting KR HTML there overwrites EN (and the reverse destroys KR).
- EN work uses skill `evas-pdp-geo-en` after KR verify.

## Step 3 — Deploy (KR only)

Admin: `https://evasmall.imweb.me/admin/shopping/product/detail?idx={n}`

1. **KR language tab only** (do not open EN tab)
2. Product detail HTML ← `deployed-kr.html` (Froala code view or fr-element inject)
3. SEO title/meta from demand terms
4. Header: 설정 → SEO → 고급 → 공통 코드 → Header Code REGISTRY for idx  
   - Editors are **CodeMirror**; prefer full valid `<script>(function(){...})();</script>`  
   - After save, verify live `script[data-evas-pdp-ld]`
5. Save toast: `상품이 수정되었어요` / SEO `내용을 정상적으로 저장했어요`

## Step 4 — Verify live

Live URL patterns: `https://www.evasmall.co.kr/264/?idx={n}` or `/shop_view/?idx={n}`

- [ ] `.evas-pdp-ai` present, `details` **open**
- [ ] New FAQ questions visible in body
- [ ] `script[data-evas-pdp-ld="{n}"]` → Product + FAQPage (FAQ Q count matches)
- [ ] No EN overwrite of KR

## Step 5 — Handoff to EN skill

After KR verify succeeds:

```text
IF user said skip EN OR handoff_en === false:
  stop; report KR done
ELSE IF EN gate met OR user forces EN:
  Read skill evas-pdp-geo-en and run it as a NEW job
  Pass: idx, brand, folder path, kr_verified_live=true
ELSE:
  Write artifacts/pdp/{brand}/idx-{n}/EN_BLOCKED.md with missing gate items
```

### EN gate (for automatic handoff)

- KR live verified this session
- `related-prompts.json` source is `openseo` or `gsc` or `hybrid`
- Prefer ≥3 KR SKUs completed historically before batch EN; single-SKU OK if user asks

**Never** implement EN deploy steps inside this skill file’s deploy section.

## Batch mode

Priority list: `artifacts/seo-aeo/priority-10-products.json`

1. Demand by line when possible
2. One SKU full KR loop before next
3. EN handoff per SKU only if user wants parallel EN; default = finish KR batch first

## Failure modes

| Failure | Action |
|---|---|
| OpenSEO down | GSC CSV only or pause |
| OCR garbage | Re-OCR; do not publish |
| Froala strips script | Header inject only |
| EN tab opened mid-KR | Abort; re-verify KR |
| Header CM truncates | Re-paste full script; verify live LD before leaving |
| Save toast missing | Hard refresh live + admin |





## v3.2 operational checklist (idx pilot lessons)

After demand + convert, **before** marking SKU done:

### HTML
- [ ] No `<style>` blocks in `deployed-kr.html` (inline styles only)
- [ ] Visible pure-text SEO lead at top: `<p class="evas-pdp-seo-lead">…</p>` (first scrapable text; do not rely on `clip`/off-screen hide — Imweb ignores those)
- [ ] Layout still images-first then `<details open>` text panel
- [ ] Write `clean-summary.txt` (same pure text as Product.description)

### JSON-LD inject
- [ ] Single script inject via **Header Code 상단** only (`data-evas-pdp-ld="{idx}"`)
- [ ] Body = one `@graph`: `[Product, FAQPage]` (not two separate Product scripts)
- [ ] Product has `@id` `…/shop_view/?idx={n}#product`, pure-text `description`, `additionalProperty` ≥5 cosmetics fields
- [ ] FAQPage `@id` `…#faq`, `about` → Product `@id`, questions from related-prompts
- [ ] brand/manufacturer use `https://www.evascosmetic.com/#…` ids
- [ ] Offer shipping/return only if live page states them
- [ ] Second Header Code field: leave empty or comment only — Imweb CM **truncates** long scripts there on save

### Deploy / verify
- [ ] KR language unit only
- [ ] Live: inject Product `description` has no CSS; `additionalProperty.length >= 5`
- [ ] Live: Imweb auto Product may still exist — must not contain CSS selectors
- [ ] Canonical for agents/search enrichment = inject Product `@id`, not platform Product without `@id`
- [ ] Save artifacts: `graph-v3.2.jsonld.json`, `header-inject-pdp-ld.html`, `meta-v3.2.md`

### Do not
- Invent extract counts (e.g. "17 extracts") not on OCR/disclosure
- Replace demand-aligned FAQ with generic shipping-only FAQ (shipping belongs on Offer when disclosed)
- Open EN tab during KR deploy

## Structured data guards (critical)

Confirmed failure modes on Imweb:

1. **CSS leak into platform Product.description**  
   If detail HTML contains a `<style>` block, Imweb may scrape it into auto Product JSON-LD.  
   **Rule:** no `<style>` tags in `deployed-*.html`. Use inline styles only. Imweb may still inject lazy-image styles (ignore those).

2. **Dual Product nodes**  
   Imweb always emits its own Product (no `@id`). We inject a canonical Product with `@id` …`#product`.  
   Do **not** invent a second custom Product. Prefer one inject `@graph` = `[Product, FAQPage]`.  
   Platform Product cannot be deleted; keep its description clean by (1) no style blocks (2) pure-text SEO lead paragraph at top of detail.

3. **description must be pure text**  
   Reject any description matching `/evas-pdp|summary::|\{display|font-family/`.  
   Prefer explicit `clean-summary.txt` / SEO meta over scraping Froala HTML.

4. **additionalProperty required for cosmetics GEO**  
   Include at least: key ingredient + concentration (if disclosed), skin concern, texture, volume, mildness positioning.  
   Do not invent ppm/counts not on artwork/disclosure (e.g. do not invent "17 extracts" if page says otherwise).

5. **@id policy**  
   - Product: `https://www.evasmall.co.kr/shop_view/?idx={n}#product`  
   - FAQPage: `…#faq` with `about` → Product `@id`  
   - brand/manufacturer: `https://www.evascosmetic.com/#brand-…` / `#organization` (site-wide graph)

6. **Shipping/return in Offer** only when live page states them (e.g. 2,500원 / 2만원 이상 무료 / 14일 반품).

7. **Verify live** after deploy:  
   - inject Product `descCss=false` and `additionalProperty.length >= 5`  
   - Imweb Product `descCss=false`  
   - FAQPage question count matches body

## Related skills

- `evas-pdp-geo-en` — **EN separate job** (call after Step 5)
- `pdp-ai-readable` — convert mechanics
- `keyword-research` — OpenSEO demand
- Pilot: `artifacts/pdp/fraijour/idx-19/`
